gsl-doc-2.3/0000775000175000017500000000000013055413403010760 5ustar eddeddgsl-doc-2.3/mdate-sh0000664000175000017500000000500312616157443012416 0ustar eddedd#!/bin/sh # mdate-sh - get modification time of a file and pretty-print it # Copyright (C) 1995 Software Foundation, Inc. # Written by Ulrich Drepper , 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 gsl-doc-2.3/autogen.sh0000775000175000017500000000042212616157443012772 0ustar eddedd#! /bin/sh # Run this to generate all the auto-generated files needed by the GNU # configure program #libtoolize --automake #aclocal #autoheader #automake --add-missing --gnu --force-missing #autoconf autoreconf -i -f -v echo "Now use ./configure --enable-maintainer-mode" gsl-doc-2.3/combination/0000755000175000017500000000000013022553153013261 5ustar eddeddgsl-doc-2.3/combination/Makefile.am0000664000175000017500000000130012616157443015323 0ustar eddeddnoinst_LTLIBRARIES = libgslcombination.la pkginclude_HEADERS = gsl_combination.h AM_CPPFLAGS = -I$(top_srcdir) libgslcombination_la_SOURCES = init.c file.c combination.c inline.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 gsl-doc-2.3/combination/combination.c0000664000175000017500000000706112616157443015747 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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 ; } 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; } gsl-doc-2.3/combination/file.c0000664000175000017500000000464412616157443014370 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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; } gsl-doc-2.3/combination/TODO0000664000175000017500000000020712616157443013764 0ustar eddedd# -*- org -*- #+CATEGORY: combination * The module has a lot of overlap with multiset/ some of the functions could be abstracted out. gsl-doc-2.3/combination/init.c0000664000175000017500000000537312616157443014414 0ustar eddedd/* combination/init.c * based on permutation/init.c by Brian Gough * * Copyright (C) 2001 Szymon Jaroszewicz * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (c); if (c->k > 0) free (c->data); free (c); } gsl-doc-2.3/combination/inline.c0000664000175000017500000000162112616157443014717 0ustar eddedd/* combination/inline.c * * Copyright (C) 2008 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/combination/Makefile.in0000644000175000017500000010474113022372404015333 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcombination_la_LIBADD = am_libgslcombination_la_OBJECTS = init.lo file.lo combination.lo \ inline.lo libgslcombination_la_OBJECTS = $(am_libgslcombination_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcombination.la pkginclude_HEADERS = gsl_combination.h AM_CPPFLAGS = -I$(top_srcdir) libgslcombination_la_SOURCES = init.c file.c combination.c inline.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu combination/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcombination.la: $(libgslcombination_la_OBJECTS) $(libgslcombination_la_DEPENDENCIES) $(EXTRA_libgslcombination_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcombination_la_OBJECTS) $(libgslcombination_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combination.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/combination/ChangeLog0000664000175000017500000000261712616157443015055 0ustar eddedd2012-12-16 Rhys Ulerich * demo.c: remove NOP while statement per comment from Jorge Barros de Abreu . Add proper return statement to main(). 2009-07-09 Brian Gough * init.c (gsl_combination_free): handle NULL argument in free 2008-07-03 Brian Gough * gsl_combination.h: added gsl_inline.h, use INLINE_DECL and GSL_RANGE_COND for gsl_combination_get * combination.c: moved gsl_combination_get to inline.c * inline.c: separate file for inline function object code * Makefile.am (INCLUDES): use top_srcdir only, remove top_builddir 2003-07-30 Brian Gough * init.c (gsl_combination_alloc): set c->data to NULL when k=0 2003-04-12 Szymon Jaroszewicz * combination.c (gsl_combination_valid): fix a typo in error message 2003-03-22 Brian Gough * combination.c (gsl_combination_memcpy): added memcpy function 2003-03-21 Brian Gough * combination.c (gsl_combination_valid): fix bug in test for validity (cj * test.c: use unsigned loop variables Sat Dec 8 18:22:06 2001 Szymon Jaroszewicz * added combination support to GSL gsl-doc-2.3/combination/test.c0000664000175000017500000001460312616157443014424 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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) ; } gsl-doc-2.3/combination/gsl_combination.h0000664000175000017500000000546212616157443016624 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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); int gsl_combination_valid (gsl_combination * c); int gsl_combination_next (gsl_combination * c); int gsl_combination_prev (gsl_combination * c); INLINE_DECL size_t gsl_combination_get (const gsl_combination * c, const size_t i); #ifdef HAVE_INLINE INLINE_FUN size_t gsl_combination_get (const gsl_combination * c, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= c->k)) /* size_t is unsigned, can't be negative */ { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return c->data[i]; } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_COMBINATION_H__ */ gsl-doc-2.3/roots/0000755000175000017500000000000013022553154012126 5ustar eddeddgsl-doc-2.3/roots/secant.c0000664000175000017500000000560612616157443013571 0ustar eddedd/* roots/secant.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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(f == 0.0) { return GSL_SUCCESS; } if(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 = df * ((f - f_new) / f); *root = x_new ; state->f = f_new ; state->df = df_new ; if (!gsl_finite (f_new)) { GSL_ERROR ("function value is not finite", GSL_EBADFUNC); } if (!gsl_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; gsl-doc-2.3/roots/test.h0000664000175000017500000000620112616157443013270 0ustar eddedd/* roots/test.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); double func7(double x, void * p); double func7_df(double x, void * p); void func7_fdf(double x, void * p, double *y, double *yprime); gsl-doc-2.3/roots/bisection.c0000664000175000017500000000660112616157443014267 0ustar eddedd/* roots/bisection.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; gsl-doc-2.3/roots/Makefile.am0000664000175000017500000000077712616157443014210 0ustar eddedd# -*-makefile-*- noinst_LTLIBRARIES = libgslroots.la pkginclude_HEADERS = gsl_roots.h noinst_HEADERS = roots.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/roots/fdfsolver.c0000664000175000017500000000416412616157443014304 0ustar eddedd/* roots/fdfsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/roots/steffenson.c0000664000175000017500000000673012616157443014465 0ustar eddedd/* roots/steffenson.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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 (!gsl_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 (!gsl_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; gsl-doc-2.3/roots/newton.c0000664000175000017500000000505412616157443013623 0ustar eddedd/* roots/newton.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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 (!gsl_finite(f_new)) { GSL_ERROR ("function value is not finite", GSL_EBADFUNC); } if (!gsl_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; gsl-doc-2.3/roots/TODO0000664000175000017500000000064412616157443012635 0ustar eddedd# -*- org -*- #+CATEGORY: roots * 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.) gsl-doc-2.3/roots/brent.c0000664000175000017500000001146512616157443013426 0ustar eddedd/* roots/brent.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; gsl-doc-2.3/roots/roots.h0000664000175000017500000000240312616157443013457 0ustar eddedd/* roots/roots.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 (!gsl_finite(*yp)) \ GSL_ERROR("function value is not finite", GSL_EBADFUNC); \ } while (0) #endif /* __ROOTS_H__ */ gsl-doc-2.3/roots/Makefile.in0000644000175000017500000010524413022372406014200 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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-*- VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslroots.la pkginclude_HEADERS = gsl_roots.h noinst_HEADERS = roots.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu roots/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslroots.la: $(libgslroots_la_OBJECTS) $(libgslroots_la_DEPENDENCIES) $(EXTRA_libgslroots_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslroots_la_OBJECTS) $(libgslroots_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bisection.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/falsepos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffenson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/roots/ChangeLog0000664000175000017500000001335712616157443013724 0ustar eddedd2009-07-09 Brian Gough * fsolver.c (gsl_root_fsolver_free): handle NULL argument in free * fdfsolver.c (gsl_root_fdfsolver_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-07-30 Brian Gough * newton.c (newton_iterate): use gsl_finite instead of finite * roots.h (SAFE_FUNC_CALL): use gsl_finite instead of finite * secant.c (secant_iterate): use gsl_finite instead of finite * steffenson.c (steffenson_iterate): use gsl_finite instead of finite 2007-01-04 Brian Gough * convergence.c (gsl_root_test_delta): added termination alternative condition x1==x0 2005-03-02 Brian Gough * 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 * removed interval type Sun May 6 14:26:59 2001 Brian Gough * test.c: removed tests for macros, which are now in sys/. Mon Apr 16 20:17:04 2001 Brian Gough * fsolver.c (gsl_root_fsolver_alloc): removed unnecessary status variable Sun Feb 18 15:35:25 2001 Brian Gough * 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 * 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 * removed definition of isinf macro (no longer needed) * made all internal functions static Wed Nov 3 11:59:35 1999 Brian Gough * 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 * removed GSL_ROOT_EPSILON_BUFFER, not needed anymore Wed Jul 21 18:47:01 1999 Brian Gough * 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 * 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 * 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 * renamed f_solver to fsolver and fdf_solver to fdfsolver, since these look neater Sun Feb 28 21:11:21 1999 Brian Gough * rewrote the root finding functions in an iterative framework Tue Nov 17 16:47:09 1998 Brian Gough * 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 * 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 * 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 * 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 * 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 * test.c: clean up of tests to get rid of warnings Thu Aug 20 10:21:15 1998 Brian Gough * 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 * started to eliminate void * arguments for function types (they are not a good idea and can easily be specified) 1998-02-09 Mark Galassi * 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 * Makefile.am (TESTS): added $(srcdir) before these scripts, since the TESTS target picks things from the build directory. gsl-doc-2.3/roots/gsl_roots.h0000664000175000017500000000722012616157443014326 0ustar eddedd/* roots/gsl_roots.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/roots/fsolver.c0000664000175000017500000000512312616157443013766 0ustar eddedd/* roots/fsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/roots/convergence.c0000664000175000017500000000447012616157443014610 0ustar eddedd/* roots/convergence.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/roots/falsepos.c0000664000175000017500000001106112616157443014120 0ustar eddedd/* roots/falsepos.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; gsl-doc-2.3/roots/test_funcs.c0000664000175000017500000001044712616157443014470 0ustar eddedd/* roots/test_funcs.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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); } /* linear function to test that solvers exit correctly when entered with an exact root */ double func7(double x, void * p) { return -M_PI * x + M_E; } double func7_df(double x, void * p) { return -M_PI; } void func7_fdf(double x, void * p, double *f, double *df) { *f = func7(x, p); *df = func7_df(x, p); } gsl-doc-2.3/roots/test.c0000664000175000017500000002346512616157443013276 0ustar eddedd/* roots/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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, FDF_func7; 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) ; FDF_func7 = create_fdf(func7, func7_df, func7_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(*S, "-pi * x + e {1.5}", &FDF_func7, 1.5, M_E / M_PI); } 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); } gsl-doc-2.3/eigen/0000755000175000017500000000000013022553153012046 5ustar eddeddgsl-doc-2.3/eigen/genhermv.c0000664000175000017500000001252612616157443014047 0ustar eddedd/* eigen/genhermv.c * * Copyright (C) 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues and eigenvectors of a complex * generalized hermitian-definite eigensystem A x = \lambda B x, where * A and B are hermitian, and B is positive-definite. */ static void genhermv_normalize_eigenvectors(gsl_matrix_complex *evec); /* gsl_eigen_genhermv_alloc() Allocate a workspace for solving the generalized hermitian-definite eigenvalue problem. The size of this workspace is O(5n). Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_genhermv_workspace * gsl_eigen_genhermv_alloc(const size_t n) { gsl_eigen_genhermv_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_genhermv_workspace *) calloc (1, sizeof (gsl_eigen_genhermv_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->hermv_workspace_p = gsl_eigen_hermv_alloc(n); if (!w->hermv_workspace_p) { gsl_eigen_genhermv_free(w); GSL_ERROR_NULL("failed to allocate space for hermv workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_genhermv_alloc() */ /* gsl_eigen_genhermv_free() Free workspace w */ void gsl_eigen_genhermv_free (gsl_eigen_genhermv_workspace * w) { RETURN_IF_NULL (w); if (w->hermv_workspace_p) gsl_eigen_hermv_free(w->hermv_workspace_p); free(w); } /* gsl_eigen_genhermv_free() */ /* gsl_eigen_genhermv() Solve the generalized hermitian-definite eigenvalue problem A x = \lambda B x for the eigenvalues \lambda and eigenvectors x. Inputs: A - complex hermitian matrix B - complex hermitian and positive definite matrix eval - where to store eigenvalues evec - where to store eigenvectors w - workspace Return: success or error */ int gsl_eigen_genhermv (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * eval, gsl_matrix_complex * evec, gsl_eigen_genhermv_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } 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 if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } else { int s; /* compute Cholesky factorization of B */ s = gsl_linalg_complex_cholesky_decomp(B); if (s != GSL_SUCCESS) return s; /* B is not positive definite */ /* transform to standard hermitian eigenvalue problem */ gsl_eigen_genherm_standardize(A, B); /* compute eigenvalues and eigenvectors */ s = gsl_eigen_hermv(A, eval, evec, w->hermv_workspace_p); if (s != GSL_SUCCESS) return s; /* backtransform eigenvectors: evec -> L^{-H} evec */ gsl_blas_ztrsm(CblasLeft, CblasLower, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, B, evec); /* the blas call destroyed the normalization - renormalize */ genhermv_normalize_eigenvectors(evec); return GSL_SUCCESS; } } /* gsl_eigen_genhermv() */ /******************************************** * INTERNAL ROUTINES * ********************************************/ /* genhermv_normalize_eigenvectors() Normalize eigenvectors so that their Euclidean norm is 1 Inputs: evec - eigenvectors */ static void genhermv_normalize_eigenvectors(gsl_matrix_complex *evec) { const size_t N = evec->size1; size_t i; /* looping */ for (i = 0; i < N; ++i) { gsl_vector_complex_view vi = gsl_matrix_complex_column(evec, i); double scale = 1.0 / gsl_blas_dznrm2(&vi.vector); gsl_blas_zdscal(scale, &vi.vector); } } /* genhermv_normalize_eigenvectors() */ gsl-doc-2.3/eigen/jacobi.c0000664000175000017500000001412412616157443013457 0ustar eddedd/* eigen/jacobi.c * * Copyright (C) 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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); /* compute norm of off-diagonal elements as per algorithm 8.4.3 and definition at start of section 8.4.1 */ if (i == j) continue; 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 #include #include #include #include #include #include #include #include #include #include #include /* * 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 size_t francis_get_submatrix(gsl_matrix *A, gsl_matrix *B); static void francis_standard_form(gsl_matrix *A, double *cs, double *sn); /* 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 *) calloc (1, 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; return (w); } /* gsl_eigen_francis_alloc() */ /* gsl_eigen_francis_free() Free francis workspace w */ void gsl_eigen_francis_free (gsl_eigen_francis_workspace *w) { RETURN_IF_NULL (w); 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) { GSL_ERROR ("maximum iterations reached without finding all eigenvalues", 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; 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; } } /* handle special cases of N = 1 or 2 */ 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; size_t i; /* looping */ gsl_matrix_view m; double tau_i; /* householder coefficient */ double dat[3]; /* householder vector */ double scale; /* scale factor to avoid overflow */ gsl_vector_view v2, v3; size_t q, r; size_t top = 0; /* 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; v2 = gsl_vector_view_array(dat, 2); v3 = gsl_vector_view_array(dat, 3); if ((w->n_iter % 10) == 0) { /* * exceptional shifts: we have gone 10 iterations * without finding a new eigenvalue, try a new choice of shifts. * See 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 */ dat[0] = (h_tmp1*h_tmp2 - h_cross) / gsl_matrix_get(H, 1, 0) + gsl_matrix_get(H, 0, 1); dat[1] = gsl_matrix_get(H, 1, 1) - gsl_matrix_get(H, 0, 0) - h_tmp1 - h_tmp2; dat[2] = gsl_matrix_get(H, 2, 1); scale = fabs(dat[0]) + fabs(dat[1]) + fabs(dat[2]); if (scale != 0.0) { /* scale to prevent overflow or underflow */ dat[0] /= scale; dat[1] /= scale; dat[2] /= scale; } if (w->Z || w->compute_t) { /* * get absolute indices of this (sub)matrix relative to the * original Hessenberg matrix */ top = francis_get_submatrix(w->H, H); } for (i = 0; i < N - 2; ++i) { tau_i = gsl_linalg_householder_transform(&v3.vector); 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, &v3.vector, &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, &v3.vector, &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, &v3.vector, &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, &v3.vector, &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, &v3.vector, &m.matrix); } } /* if (tau_i != 0.0) */ dat[0] = gsl_matrix_get(H, i + 1, i); dat[1] = gsl_matrix_get(H, i + 2, i); if (i < (N - 3)) { dat[2] = gsl_matrix_get(H, i + 3, i); } scale = fabs(dat[0]) + fabs(dat[1]) + fabs(dat[2]); if (scale != 0.0) { /* scale to prevent overflow or underflow */ dat[0] /= scale; dat[1] /= scale; dat[2] /= scale; } } /* for (i = 0; i < N - 2; ++i) */ scale = fabs(dat[0]) + fabs(dat[1]); if (scale != 0.0) { /* scale to prevent overflow or underflow */ dat[0] /= scale; dat[1] /= scale; } tau_i = gsl_linalg_householder_transform(&v2.vector); 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, &v2.vector, &m.matrix); m = gsl_matrix_submatrix(w->H, 0, top + N - 2, top + N, 2); gsl_linalg_householder_mh(tau_i, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(H, N - 2, N - 3, 2, 3); gsl_linalg_householder_hm(tau_i, &v2.vector, &m.matrix); m = gsl_matrix_submatrix(H, 0, N - 2, N, 2); gsl_linalg_householder_mh(tau_i, &v2.vector, &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, &v2.vector, &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) { const size_t N = w->size; double cs, sn; size_t top; /* * figure out where the submatrix A resides in the * original matrix H */ top = francis_get_submatrix(w->H, A); /* convert 2-by-2 block to standard form */ francis_standard_form(A, &cs, &sn); /* set eigenvalues */ GSL_SET_REAL(eval1, gsl_matrix_get(A, 0, 0)); GSL_SET_REAL(eval2, gsl_matrix_get(A, 1, 1)); if (gsl_matrix_get(A, 1, 0) == 0.0) { GSL_SET_IMAG(eval1, 0.0); GSL_SET_IMAG(eval2, 0.0); } else { double tmp = sqrt(fabs(gsl_matrix_get(A, 0, 1)) * fabs(gsl_matrix_get(A, 1, 0))); GSL_SET_IMAG(eval1, tmp); GSL_SET_IMAG(eval2, -tmp); } if (w->compute_t) { gsl_vector_view xv, yv; /* * The above call to francis_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 francis_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 (top < (N - 2)) { /* transform the 2 rows of T_{23} */ xv = gsl_matrix_subrow(w->H, top, top + 2, N - top - 2); yv = gsl_matrix_subrow(w->H, top + 1, top + 2, N - top - 2); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } if (top > 0) { /* transform the 2 columns of T_{12} */ xv = gsl_matrix_subcolumn(w->H, top, 0, top); yv = gsl_matrix_subcolumn(w->H, top + 1, 0, top); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } /* if (w->compute_t) */ if (w->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 'top' */ xv = gsl_matrix_column(w->Z, top); yv = gsl_matrix_column(w->Z, top + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } /* if (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 size_t francis_get_submatrix(gsl_matrix *A, gsl_matrix *B) { size_t diff; double ratio; size_t top; diff = (size_t) (B->data - A->data); ratio = (double)diff / ((double) (A->tda + 1)); top = (size_t) floor(ratio); return top; } /* francis_get_submatrix() */ /* francis_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 cs - where to store cosine parameter of rotation matrix sn - where to store sine parameter of rotation matrix Notes: 1) based on LAPACK routine DLANV2 2) On output, A is modified to contain the matrix in standard form */ static void francis_standard_form(gsl_matrix *A, 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 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); } /* francis_standard_form() */ gsl-doc-2.3/eigen/gsl_eigen.h0000664000175000017500000003173212616157443014175 0ustar eddedd/* eigen/gsl_eigen.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 Gerard Jungman, Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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; 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 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 */ 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); void gsl_eigen_nonsymmv_params (const int balance, 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; /* size of matrices */ gsl_eigen_symm_workspace *symm_workspace_p; } gsl_eigen_gensymm_workspace; gsl_eigen_gensymm_workspace * gsl_eigen_gensymm_alloc (const size_t n); void gsl_eigen_gensymm_free (gsl_eigen_gensymm_workspace * w); int gsl_eigen_gensymm (gsl_matrix * A, gsl_matrix * B, gsl_vector * eval, gsl_eigen_gensymm_workspace * w); int gsl_eigen_gensymm_standardize (gsl_matrix * A, const gsl_matrix * B); typedef struct { size_t size; /* size of matrices */ gsl_eigen_symmv_workspace *symmv_workspace_p; } gsl_eigen_gensymmv_workspace; gsl_eigen_gensymmv_workspace * gsl_eigen_gensymmv_alloc (const size_t n); void gsl_eigen_gensymmv_free (gsl_eigen_gensymmv_workspace * w); int gsl_eigen_gensymmv (gsl_matrix * A, gsl_matrix * B, gsl_vector * eval, gsl_matrix * evec, gsl_eigen_gensymmv_workspace * w); typedef struct { size_t size; /* size of matrices */ gsl_eigen_herm_workspace *herm_workspace_p; } gsl_eigen_genherm_workspace; gsl_eigen_genherm_workspace * gsl_eigen_genherm_alloc (const size_t n); void gsl_eigen_genherm_free (gsl_eigen_genherm_workspace * w); int gsl_eigen_genherm (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * eval, gsl_eigen_genherm_workspace * w); int gsl_eigen_genherm_standardize (gsl_matrix_complex * A, const gsl_matrix_complex * B); typedef struct { size_t size; /* size of matrices */ gsl_eigen_hermv_workspace *hermv_workspace_p; } gsl_eigen_genhermv_workspace; gsl_eigen_genhermv_workspace * gsl_eigen_genhermv_alloc (const size_t n); void gsl_eigen_genhermv_free (gsl_eigen_genhermv_workspace * w); int gsl_eigen_genhermv (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * eval, gsl_matrix_complex * evec, gsl_eigen_genhermv_workspace * w); typedef struct { size_t size; /* size of matrices */ gsl_vector *work; /* scratch workspace */ size_t n_evals; /* number of eigenvalues found */ size_t max_iterations; /* maximum QZ iterations allowed */ size_t n_iter; /* number of iterations since last eigenvalue found */ double eshift; /* exceptional shift counter */ int needtop; /* need to compute top index? */ double atol; /* tolerance for splitting A matrix */ double btol; /* tolerance for splitting B matrix */ double ascale; /* scaling factor for shifts */ double bscale; /* scaling factor for shifts */ gsl_matrix *H; /* pointer to hessenberg matrix */ gsl_matrix *R; /* pointer to upper triangular matrix */ int compute_s; /* compute generalized Schur form S */ int compute_t; /* compute generalized Schur form T */ gsl_matrix *Q; /* pointer to left Schur vectors */ gsl_matrix *Z; /* pointer to right Schur vectors */ } gsl_eigen_gen_workspace; gsl_eigen_gen_workspace * gsl_eigen_gen_alloc (const size_t n); void gsl_eigen_gen_free (gsl_eigen_gen_workspace * w); void gsl_eigen_gen_params (const int compute_s, const int compute_t, const int balance, gsl_eigen_gen_workspace * w); int gsl_eigen_gen (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_eigen_gen_workspace * w); int gsl_eigen_gen_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_gen_workspace * w); typedef struct { size_t size; /* size of matrices */ gsl_vector *work1; /* 1-norm of columns of A */ gsl_vector *work2; /* 1-norm of columns of B */ gsl_vector *work3; /* real part of eigenvector */ gsl_vector *work4; /* imag part of eigenvector */ gsl_vector *work5; /* real part of back-transformed eigenvector */ gsl_vector *work6; /* imag part of back-transformed eigenvector */ gsl_matrix *Q; /* pointer to left Schur vectors */ gsl_matrix *Z; /* pointer to right Schur vectors */ gsl_eigen_gen_workspace *gen_workspace_p; } gsl_eigen_genv_workspace; gsl_eigen_genv_workspace * gsl_eigen_genv_alloc (const size_t n); void gsl_eigen_genv_free (gsl_eigen_genv_workspace * w); int gsl_eigen_genv (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix_complex * evec, gsl_eigen_genv_workspace * w); int gsl_eigen_genv_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix_complex * evec, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_genv_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); int gsl_eigen_gensymmv_sort (gsl_vector * eval, gsl_matrix * evec, gsl_eigen_sort_t sort_type); int gsl_eigen_genhermv_sort (gsl_vector * eval, gsl_matrix_complex * evec, gsl_eigen_sort_t sort_type); int gsl_eigen_genv_sort (gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix_complex * evec, gsl_eigen_sort_t sort_type); /* Prototypes for the schur module */ int gsl_schur_gen_eigvals(const gsl_matrix *A, const gsl_matrix *B, double *wr1, double *wr2, double *wi, double *scale1, double *scale2); int gsl_schur_solve_equation(double ca, const gsl_matrix *A, double z, double d1, double d2, const gsl_vector *b, gsl_vector *x, double *s, double *xnorm, double smin); int gsl_schur_solve_equation_z(double ca, const gsl_matrix *A, gsl_complex *z, double d1, double d2, const gsl_vector_complex *b, gsl_vector_complex *x, double *s, double *xnorm, double smin); /* 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__ */ gsl-doc-2.3/eigen/herm.c0000664000175000017500000001124012616157443013157 0ustar eddedd/* eigen/herm.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* 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) { RETURN_IF_NULL (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; } } gsl-doc-2.3/eigen/gen.c0000644000175000017500000016526412755623667013025 0ustar eddedd/* eigen/gen.c * * Copyright (C) 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues of a real generalized * eigensystem A x = \lambda B x. Left and right Schur vectors * are optionally computed as well. * * Based on the algorithm from Moler and Stewart * [1] C. Moler, G. Stewart, "An Algorithm for Generalized Matrix * Eigenvalue Problems", SIAM J. Numer. Anal., Vol 10, No 2, 1973. * * This algorithm is also described in the book * [2] Golub & Van Loan, "Matrix Computations" (3rd ed), algorithm 7.7.3 * * This file contains routines based on original code from LAPACK * which is distributed under the modified BSD license. */ #define GEN_ESHIFT_COEFF (1.736) static void gen_schur_decomp(gsl_matrix *H, gsl_matrix *R, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w); static inline int gen_qzstep(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w); static inline void gen_qzstep_d(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w); static void gen_tri_split_top(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w); static inline void gen_tri_chase_zero(gsl_matrix *H, gsl_matrix *R, size_t q, gsl_eigen_gen_workspace *w); static inline void gen_tri_zero_H(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w); static inline size_t gen_search_small_elements(gsl_matrix *H, gsl_matrix *R, int *flag, gsl_eigen_gen_workspace *w); static int gen_schur_standardize1(gsl_matrix *A, gsl_matrix *B, double *alphar, double *beta, gsl_eigen_gen_workspace *w); static int gen_schur_standardize2(gsl_matrix *A, gsl_matrix *B, gsl_complex *alpha1, gsl_complex *alpha2, double *beta1, double *beta2, gsl_eigen_gen_workspace *w); static int gen_compute_eigenvals(gsl_matrix *A, gsl_matrix *B, gsl_complex *alpha1, gsl_complex *alpha2, double *beta1, double *beta2); static void gen_store_eigval1(const gsl_matrix *H, const double a, const double b, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w); static void gen_store_eigval2(const gsl_matrix *H, const gsl_complex *alpha1, const double beta1, const gsl_complex *alpha2, const double beta2, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w); static inline size_t gen_get_submatrix(const gsl_matrix *A, const gsl_matrix *B); /*FIX**/ inline static double normF (gsl_matrix * A); /* gsl_eigen_gen_alloc() Allocate a workspace for solving the generalized eigenvalue problem. The size of this workspace is O(n) Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_gen_workspace * gsl_eigen_gen_alloc(const size_t n) { gsl_eigen_gen_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_gen_workspace *) calloc (1, sizeof (gsl_eigen_gen_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->max_iterations = 30 * n; w->n_evals = 0; w->n_iter = 0; w->needtop = 0; w->atol = 0.0; w->btol = 0.0; w->ascale = 0.0; w->bscale = 0.0; w->eshift = 0.0; w->H = NULL; w->R = NULL; w->compute_s = 0; w->compute_t = 0; w->Q = NULL; w->Z = NULL; w->work = gsl_vector_alloc(n); if (w->work == 0) { gsl_eigen_gen_free(w); GSL_ERROR_NULL ("failed to allocate space for additional workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_gen_alloc() */ /* gsl_eigen_gen_free() Free workspace w */ void gsl_eigen_gen_free (gsl_eigen_gen_workspace * w) { RETURN_IF_NULL (w); if (w->work) gsl_vector_free(w->work); free(w); } /* gsl_eigen_gen_free() */ /* gsl_eigen_gen_params() Set parameters which define how we solve the eigenvalue problem Inputs: compute_s - 1 if we want to compute S, 0 if not compute_t - 1 if we want to compute T, 0 if not balance - 1 if we want to balance matrices, 0 if not w - gen workspace Return: none */ void gsl_eigen_gen_params (const int compute_s, const int compute_t, const int balance, gsl_eigen_gen_workspace *w) { w->compute_s = compute_s; w->compute_t = compute_t; } /* gsl_eigen_gen_params() */ /* gsl_eigen_gen() Solve the generalized eigenvalue problem A x = \lambda B x for the eigenvalues \lambda. Inputs: A - general real matrix B - general real matrix alpha - where to store eigenvalue numerators beta - where to store eigenvalue denominators w - workspace Return: success or error */ int gsl_eigen_gen (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_eigen_gen_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } else if (alpha->size != N || beta->size != N) { GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN); } else if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } else { double anorm, bnorm; /* compute the Hessenberg-Triangular reduction of (A, B) */ gsl_linalg_hesstri_decomp(A, B, w->Q, w->Z, w->work); /* save pointers to original matrices */ w->H = A; w->R = B; w->n_evals = 0; w->n_iter = 0; w->eshift = 0.0; /* determine if we need to compute top indices in QZ step */ w->needtop = w->Q != 0 || w->Z != 0 || w->compute_t || w->compute_s; /* compute matrix norms */ anorm = normF(A); bnorm = normF(B); /* compute tolerances and scaling factors */ w->atol = GSL_MAX(GSL_DBL_MIN, GSL_DBL_EPSILON * anorm); w->btol = GSL_MAX(GSL_DBL_MIN, GSL_DBL_EPSILON * bnorm); w->ascale = 1.0 / GSL_MAX(GSL_DBL_MIN, anorm); w->bscale = 1.0 / GSL_MAX(GSL_DBL_MIN, bnorm); /* compute the generalized Schur decomposition and eigenvalues */ gen_schur_decomp(A, B, alpha, beta, w); if (w->n_evals != N) return GSL_EMAXITER; return GSL_SUCCESS; } } /* gsl_eigen_gen() */ /* gsl_eigen_gen_QZ() Solve the generalized eigenvalue problem A x = \lambda B x for the eigenvalues \lambda. Optionally compute left and/or right Schur vectors Q and Z which satisfy: A = Q S Z^t B = Q T Z^t where (S, T) is the generalized Schur form of (A, B) Inputs: A - general real matrix B - general real matrix alpha - where to store eigenvalue numerators beta - where to store eigenvalue denominators Q - if non-null, where to store left Schur vectors Z - if non-null, where to store right Schur vectors w - workspace Return: success or error */ int gsl_eigen_gen_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_gen_workspace * w) { if (Q && (A->size1 != Q->size1 || A->size1 != Q->size2)) { GSL_ERROR("Q matrix has wrong dimensions", GSL_EBADLEN); } else if (Z && (A->size1 != Z->size1 || A->size1 != Z->size2)) { GSL_ERROR("Z matrix has wrong dimensions", GSL_EBADLEN); } else { int s; w->Q = Q; w->Z = Z; s = gsl_eigen_gen(A, B, alpha, beta, w); w->Q = NULL; w->Z = NULL; return s; } } /* gsl_eigen_gen_QZ() */ /******************************************** * INTERNAL ROUTINES * ********************************************/ /* gen_schur_decomp() Compute the generalized Schur decomposition of the matrix pencil (H, R) which is in Hessenberg-Triangular form Inputs: H - upper hessenberg matrix R - upper triangular matrix alpha - (output) where to store eigenvalue numerators beta - (output) where to store eigenvalue denominators w - workspace Return: none Notes: 1) w->n_evals is updated to keep track of how many eigenvalues are found */ static void gen_schur_decomp(gsl_matrix *H, gsl_matrix *R, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w) { size_t N; gsl_matrix_view h, r; gsl_matrix_view vh, vr; size_t q; /* index of small subdiagonal element */ gsl_complex z1, z2; /* complex values */ double a, b; int s; int flag; N = H->size1; h = gsl_matrix_submatrix(H, 0, 0, N, N); r = gsl_matrix_submatrix(R, 0, 0, N, N); while ((N > 1) && (w->n_iter)++ < w->max_iterations) { q = gen_search_small_elements(&h.matrix, &r.matrix, &flag, w); if (flag == 0) { /* no small elements found - do a QZ sweep */ s = gen_qzstep(&h.matrix, &r.matrix, w); if (s == GSL_CONTINUE) { /* * (h, r) is a 2-by-2 block with complex eigenvalues - * standardize and read off eigenvalues */ s = gen_schur_standardize2(&h.matrix, &r.matrix, &z1, &z2, &a, &b, w); if (s != GSL_SUCCESS) { /* * if we get here, then the standardization process * perturbed the eigenvalues onto the real line - * continue QZ iteration to break them into 1-by-1 * blocks */ continue; } gen_store_eigval2(&h.matrix, &z1, a, &z2, b, alpha, beta, w); N = 0; } /* if (s) */ continue; } /* if (flag == 0) */ else if (flag == 2) { if (q == 0) { /* * the leading element of R is zero, split off a block * at the top */ gen_tri_split_top(&h.matrix, &r.matrix, w); } else { /* * we found a small element on the diagonal of R - chase the * zero to the bottom of the active block and then zero * H(n, n - 1) to split off a 1-by-1 block */ if (q != N - 1) gen_tri_chase_zero(&h.matrix, &r.matrix, q, w); /* now zero H(n, n - 1) */ gen_tri_zero_H(&h.matrix, &r.matrix, w); } /* continue so the next iteration detects the zero in H */ continue; } /* * a small subdiagonal element of H 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 hessenberg matrix is 0 - * H_{NN} / R_{NN} is a real eigenvalue - standardize so * R_{NN} > 0 */ vh = gsl_matrix_submatrix(&h.matrix, q, q, 1, 1); vr = gsl_matrix_submatrix(&r.matrix, q, q, 1, 1); gen_schur_standardize1(&vh.matrix, &vr.matrix, &a, &b, w); gen_store_eigval1(&vh.matrix, a, b, alpha, beta, w); --N; h = gsl_matrix_submatrix(&h.matrix, 0, 0, N, N); r = gsl_matrix_submatrix(&r.matrix, 0, 0, N, N); } else if (q == (N - 2)) { /* bottom right 2-by-2 block may have converged */ vh = gsl_matrix_submatrix(&h.matrix, q, q, 2, 2); vr = gsl_matrix_submatrix(&r.matrix, q, q, 2, 2); s = gen_schur_standardize2(&vh.matrix, &vr.matrix, &z1, &z2, &a, &b, w); if (s != GSL_SUCCESS) { /* * this 2-by-2 block contains real eigenvalues that * have not yet separated into 1-by-1 blocks - * recursively call gen_schur_decomp() to finish off * this block */ gen_schur_decomp(&vh.matrix, &vr.matrix, alpha, beta, w); } else { /* we got 2 complex eigenvalues */ gen_store_eigval2(&vh.matrix, &z1, a, &z2, b, alpha, beta, w); } N -= 2; h = gsl_matrix_submatrix(&h.matrix, 0, 0, N, N); r = gsl_matrix_submatrix(&r.matrix, 0, 0, N, N); } else if (q == 1) { /* H_{11} / R_{11} is an eigenvalue */ vh = gsl_matrix_submatrix(&h.matrix, 0, 0, 1, 1); vr = gsl_matrix_submatrix(&r.matrix, 0, 0, 1, 1); gen_schur_standardize1(&vh.matrix, &vr.matrix, &a, &b, w); gen_store_eigval1(&vh.matrix, a, b, alpha, beta, w); --N; h = gsl_matrix_submatrix(&h.matrix, 1, 1, N, N); r = gsl_matrix_submatrix(&r.matrix, 1, 1, N, N); } else if (q == 2) { /* upper left 2-by-2 block may have converged */ vh = gsl_matrix_submatrix(&h.matrix, 0, 0, 2, 2); vr = gsl_matrix_submatrix(&r.matrix, 0, 0, 2, 2); s = gen_schur_standardize2(&vh.matrix, &vr.matrix, &z1, &z2, &a, &b, w); if (s != GSL_SUCCESS) { /* * this 2-by-2 block contains real eigenvalues that * have not yet separated into 1-by-1 blocks - * recursively call gen_schur_decomp() to finish off * this block */ gen_schur_decomp(&vh.matrix, &vr.matrix, alpha, beta, w); } else { /* we got 2 complex eigenvalues */ gen_store_eigval2(&vh.matrix, &z1, a, &z2, b, alpha, beta, w); } N -= 2; h = gsl_matrix_submatrix(&h.matrix, 2, 2, N, N); r = gsl_matrix_submatrix(&r.matrix, 2, 2, N, N); } else { /* * 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 */ vh = gsl_matrix_submatrix(&h.matrix, q, q, N - q, N - q); vr = gsl_matrix_submatrix(&r.matrix, q, q, N - q, N - q); gen_schur_decomp(&vh.matrix, &vr.matrix, alpha, beta, w); /* operate on upper left q-by-q block */ vh = gsl_matrix_submatrix(&h.matrix, 0, 0, q, q); vr = gsl_matrix_submatrix(&r.matrix, 0, 0, q, q); gen_schur_decomp(&vh.matrix, &vr.matrix, alpha, beta, w); N = 0; } } /* while ((N > 1) && (w->n_iter)++ < w->max_iterations) */ /* handle special case of N = 1 */ if (N == 1) { gen_schur_standardize1(&h.matrix, &r.matrix, &a, &b, w); gen_store_eigval1(&h.matrix, a, b, alpha, beta, w); } } /* gen_schur_decomp() */ /* gen_qzstep() This routine determines what type of QZ step to perform on the generalized matrix pair (H, R). If the pair is 3-by-3 or bigger, we look at the bottom right 2-by-2 block. If this block has complex eigenvalues, we perform a Francis double shift QZ sweep. If it has real eigenvalues, we perform an implicit single shift QZ sweep. If the pair is 2-by-2 with real eigenvalues, we perform a single shift sweep. If it has complex eigenvalues, we return GSL_CONTINUE to notify the calling function that a 2-by-2 block with complex eigenvalues has converged, so that it may then call gen_schur_standardize2(). In the real eigenvalue case, we want to continue doing QZ sweeps to break it up into two 1-by-1 blocks. See LAPACK routine DHGEQZ and [1] for more information. Inputs: H - upper Hessenberg matrix (at least 2-by-2) R - upper triangular matrix (at least 2-by-2) w - workspace Return: GSL_SUCCESS on normal completion GSL_CONTINUE if we detect a 2-by-2 block with complex eigenvalues */ static inline int gen_qzstep(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; gsl_matrix_view vh, vr; /* views of bottom right 2-by-2 block */ double wr1, wr2, wi; double scale1, scale2, scale; double cs, sn; /* givens rotation */ double temp, /* temporary variables */ temp2; size_t j; /* looping */ gsl_vector_view xv, yv; /* temporary views */ size_t top = 0; size_t rows; if (w->n_iter % 10 == 0) { /* * Exceptional shift - we have gone 10 iterations without finding * a new eigenvalue, do a single shift sweep with an * exceptional shift */ if ((GSL_DBL_MIN * w->max_iterations) * fabs(gsl_matrix_get(H, N - 2, N - 1)) < fabs(gsl_matrix_get(R, N - 2, N - 2))) { w->eshift += gsl_matrix_get(H, N - 2, N - 1) / gsl_matrix_get(R, N - 2, N - 2); } else w->eshift += 1.0 / (GSL_DBL_MIN * w->max_iterations); if ((w->eshift < GSL_DBL_EPSILON) && (GSL_DBL_MIN * w->max_iterations) * fabs(gsl_matrix_get(H, N - 1, N - 2)) < fabs(gsl_matrix_get(R, N - 2, N - 2))) { w->eshift = GEN_ESHIFT_COEFF * (w->ascale * gsl_matrix_get(H, N - 1, N - 2)) / (w->bscale * gsl_matrix_get(R, N - 2, N - 2)); } scale1 = 1.0; wr1 = w->eshift; } else { /* * Compute generalized eigenvalues of bottom right 2-by-2 block * to be used as shifts - wr1 is the Wilkinson shift */ vh = gsl_matrix_submatrix(H, N - 2, N - 2, 2, 2); vr = gsl_matrix_submatrix(R, N - 2, N - 2, 2, 2); gsl_schur_gen_eigvals(&vh.matrix, &vr.matrix, &wr1, &wr2, &wi, &scale1, &scale2); if (wi != 0.0) { /* complex eigenvalues */ if (N == 2) { /* * its a 2-by-2 block with complex eigenvalues - notify * the calling function to deflate */ return (GSL_CONTINUE); } else { /* do a francis double shift sweep */ gen_qzstep_d(H, R, w); } return GSL_SUCCESS; } } /* real eigenvalues - perform single shift QZ step */ temp = GSL_MIN(w->ascale, 1.0) * (0.5 / GSL_DBL_MIN); if (scale1 > temp) scale = temp / scale1; else scale = 1.0; temp = GSL_MIN(w->bscale, 1.0) * (0.5 / GSL_DBL_MIN); if (fabs(wr1) > temp) scale = GSL_MIN(scale, temp / fabs(wr1)); scale1 *= scale; wr1 *= scale; if (w->needtop) { /* get absolute index of this matrix relative to original matrix */ top = gen_get_submatrix(w->H, H); } temp = scale1*gsl_matrix_get(H, 0, 0) - wr1*gsl_matrix_get(R, 0, 0); temp2 = scale1*gsl_matrix_get(H, 1, 0); gsl_linalg_givens(temp, temp2, &cs, &sn); sn = -sn; for (j = 0; j < N - 1; ++j) { if (j > 0) { temp = gsl_matrix_get(H, j, j - 1); temp2 = gsl_matrix_get(H, j + 1, j - 1); gsl_linalg_givens(temp, temp2, &cs, &sn); sn = -sn; /* apply to column (j - 1) */ temp = cs * gsl_matrix_get(H, j, j - 1) + sn * gsl_matrix_get(H, j + 1, j - 1); gsl_matrix_set(H, j, j - 1, temp); gsl_matrix_set(H, j + 1, j - 1, 0.0); } /* apply G to H(j:j+1,:) and T(j:j+1,:) */ if (w->compute_s) { xv = gsl_matrix_subrow(w->H, top + j, top + j, w->size - top - j); yv = gsl_matrix_subrow(w->H, top + j + 1, top + j, w->size - top - j); } else { xv = gsl_matrix_subrow(H, j, j, N - j); yv = gsl_matrix_subrow(H, j + 1, j, N - j); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->compute_t) { xv = gsl_matrix_subrow(w->R, top + j, top + j, w->size - top - j); yv = gsl_matrix_subrow(w->R, top + j + 1, top + j, w->size - top - j); } else { xv = gsl_matrix_subrow(R, j, j, N - j); yv = gsl_matrix_subrow(R, j + 1, j, N - j); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Q) { /* accumulate Q: Q -> QG */ xv = gsl_matrix_column(w->Q, top + j); yv = gsl_matrix_column(w->Q, top + j + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } temp = gsl_matrix_get(R, j + 1, j + 1); temp2 = gsl_matrix_get(R, j + 1, j); gsl_linalg_givens(temp, temp2, &cs, &sn); rows = GSL_MIN(j + 3, N); if (w->compute_s) { xv = gsl_matrix_subcolumn(w->H, top + j, 0, top + rows); yv = gsl_matrix_subcolumn(w->H, top + j + 1, 0, top + rows); } else { xv = gsl_matrix_subcolumn(H, j, 0, rows); yv = gsl_matrix_subcolumn(H, j + 1, 0, rows); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); rows = GSL_MIN(j + 2, N); if (w->compute_t) { xv = gsl_matrix_subcolumn(w->R, top + j, 0, top + rows); yv = gsl_matrix_subcolumn(w->R, top + j + 1, 0, top + rows); } else { xv = gsl_matrix_subcolumn(R, j, 0, rows); yv = gsl_matrix_subcolumn(R, j + 1, 0, rows); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Z) { /* accumulate Z: Z -> ZG */ xv = gsl_matrix_column(w->Z, top + j); yv = gsl_matrix_column(w->Z, top + j + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } /* for (j = 0; j < N - 1; ++j) */ return GSL_SUCCESS; } /* gen_qzstep() */ /* gen_qzstep_d() Perform an implicit double shift QZ step. See Golub & Van Loan, "Matrix Computations" (3rd ed), algorithm 7.7.2 Inputs: H - upper Hessenberg matrix (at least 3-by-3) R - upper triangular matrix (at least 3-by-3) w - workspace */ static inline void gen_qzstep_d(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; size_t j; /* looping */ double dat[3]; /* householder vector */ double tau; /* householder coefficient */ gsl_vector_view v2, v3; /* views into 'dat' */ gsl_matrix_view m; /* temporary view */ double tmp; size_t q, r; size_t top = 0; /* location of H in original matrix */ double scale; double AB11, /* various matrix element ratios */ AB22, ABNN, ABMM, AMNBNN, ANMBMM, A21B11, A12B22, A32B22, B12B22, BMNBNN; v2 = gsl_vector_view_array(dat, 2); v3 = gsl_vector_view_array(dat, 3); if (w->needtop) { /* get absolute index of this matrix relative to original matrix */ top = gen_get_submatrix(w->H, H); } /* * Similar to the QR method, we take the shifts to be the two * zeros of the problem * * det[H(n-1:n,n-1:n) - s*R(n-1:n,n-1:n)] = 0 * * The initial householder vector elements are then given by * Eq. 4.1 of [1], which are designed to reduce errors when * off diagonal elements are small. */ ABMM = (w->ascale * gsl_matrix_get(H, N - 2, N - 2)) / (w->bscale * gsl_matrix_get(R, N - 2, N - 2)); ABNN = (w->ascale * gsl_matrix_get(H, N - 1, N - 1)) / (w->bscale * gsl_matrix_get(R, N - 1, N - 1)); AB11 = (w->ascale * gsl_matrix_get(H, 0, 0)) / (w->bscale * gsl_matrix_get(R, 0, 0)); AB22 = (w->ascale * gsl_matrix_get(H, 1, 1)) / (w->bscale * gsl_matrix_get(R, 1, 1)); AMNBNN = (w->ascale * gsl_matrix_get(H, N - 2, N - 1)) / (w->bscale * gsl_matrix_get(R, N - 1, N - 1)); ANMBMM = (w->ascale * gsl_matrix_get(H, N - 1, N - 2)) / (w->bscale * gsl_matrix_get(R, N - 2, N - 2)); BMNBNN = gsl_matrix_get(R, N - 2, N - 1) / gsl_matrix_get(R, N - 1, N - 1); A21B11 = (w->ascale * gsl_matrix_get(H, 1, 0)) / (w->bscale * gsl_matrix_get(R, 0, 0)); A12B22 = (w->ascale * gsl_matrix_get(H, 0, 1)) / (w->bscale * gsl_matrix_get(R, 1, 1)); A32B22 = (w->ascale * gsl_matrix_get(H, 2, 1)) / (w->bscale * gsl_matrix_get(R, 1, 1)); B12B22 = gsl_matrix_get(R, 0, 1) / gsl_matrix_get(R, 1, 1); /* * These are the Eqs (4.1) of [1], just multiplied by the factor * (A_{21} / B_{11}) */ dat[0] = (ABMM - AB11) * (ABNN - AB11) - (AMNBNN * ANMBMM) + (ANMBMM * BMNBNN * AB11) + (A12B22 - (AB11 * B12B22)) * A21B11; dat[1] = ((AB22 - AB11) - (A21B11 * B12B22) - (ABMM - AB11) - (ABNN - AB11) + (ANMBMM * BMNBNN)) * A21B11; dat[2] = A32B22 * A21B11; scale = fabs(dat[0]) + fabs(dat[1]) + fabs(dat[2]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; dat[2] /= scale; } for (j = 0; j < N - 2; ++j) { r = GSL_MIN(j + 4, N); /* * Find householder Q so that * * Q [x y z]^t = [ * 0 0 ]^t */ tau = gsl_linalg_householder_transform(&v3.vector); if (tau != 0.0) { /* * q is the initial column to start applying the householder * transformation. The GSL_MAX() simply ensures we don't * try to apply it to column (-1), since we are zeroing out * column (j - 1) except for the first iteration which * introduces the bulge. */ q = (size_t) GSL_MAX(0, (int)j - 1); /* H -> QH, R -> QR */ if (w->compute_s) { /* * We are computing the Schur form S, so we need to * transform the whole matrix H */ m = gsl_matrix_submatrix(w->H, top + j, top + q, 3, w->size - top - q); gsl_linalg_householder_hm(tau, &v3.vector, &m.matrix); } else { /* just transform the active block */ m = gsl_matrix_submatrix(H, j, q, 3, N - q); gsl_linalg_householder_hm(tau, &v3.vector, &m.matrix); } if (w->compute_t) { /* * We are computing the Schur form T, so we need to * transform the whole matrix R */ m = gsl_matrix_submatrix(w->R, top + j, top + j, 3, w->size - top - j); gsl_linalg_householder_hm(tau, &v3.vector, &m.matrix); } else { /* just transform the active block */ m = gsl_matrix_submatrix(R, j, j, 3, N - j); gsl_linalg_householder_hm(tau, &v3.vector, &m.matrix); } if (w->Q) { /* accumulate the transformation into Q */ m = gsl_matrix_submatrix(w->Q, 0, top + j, w->size, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } } /* if (tau != 0.0) */ /* * Find householder Z so that * * [ r_{j+2,j} r_{j+2, j+1}, r_{j+2, j+2} ] Z = [ 0 0 * ] * * This isn't exactly what gsl_linalg_householder_transform * does, so we need to rotate the input vector so it preserves * the last element, and then rotate it back afterwards. * * So instead of transforming [x y z], we transform [z x y], * and the resulting HH vector [1 v2 v3] -> [v2 v3 1] but * then needs to be scaled to have the first element = 1, so * it becomes [1 v3/v2 1/v2] (tau must also be scaled accordingly). */ dat[0] = gsl_matrix_get(R, j + 2, j + 2); dat[1] = gsl_matrix_get(R, j + 2, j); dat[2] = gsl_matrix_get(R, j + 2, j + 1); scale = fabs(dat[0]) + fabs(dat[1]) + fabs(dat[2]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; dat[2] /= scale; } tau = gsl_linalg_householder_transform(&v3.vector); if (tau != 0.0) { /* rotate back */ tmp = gsl_vector_get(&v3.vector, 1); gsl_vector_set(&v3.vector, 1, gsl_vector_get(&v3.vector, 2)/tmp); gsl_vector_set(&v3.vector, 2, 1.0 / tmp); tau *= tmp * tmp; /* H -> HZ, R -> RZ */ if (w->compute_s) { m = gsl_matrix_submatrix(w->H, 0, top + j, top + r, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } else { m = gsl_matrix_submatrix(H, 0, j, r, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } if (w->compute_t) { m = gsl_matrix_submatrix(w->R, 0, top + j, top + j + 3, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } else { m = gsl_matrix_submatrix(R, 0, j, j + 3, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } if (w->Z) { /* accumulate transformation into Z */ m = gsl_matrix_submatrix(w->Z, 0, top + j, w->size, 3); gsl_linalg_householder_mh(tau, &v3.vector, &m.matrix); } } /* if (tau != 0.0) */ /* * Find householder Z so that * * [ r_{j+1,j} r_{j+1, j+1} ] Z = [ 0 * ] */ dat[0] = gsl_matrix_get(R, j + 1, j + 1); dat[1] = gsl_matrix_get(R, j + 1, j); scale = fabs(dat[0]) + fabs(dat[1]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; } tau = gsl_linalg_householder_transform(&v2.vector); if (tau != 0.0) { /* rotate back */ tmp = gsl_vector_get(&v2.vector, 1); gsl_vector_set(&v2.vector, 1, 1.0 / tmp); tau *= tmp * tmp; /* H -> HZ, R -> RZ */ if (w->compute_s) { m = gsl_matrix_submatrix(w->H, 0, top + j, top + r, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(H, 0, j, r, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } if (w->compute_t) { m = gsl_matrix_submatrix(w->R, 0, top + j, top + j + 3, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(R, 0, j, j + 3, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } if (w->Z) { /* accumulate transformation into Z */ m = gsl_matrix_submatrix(w->Z, 0, top + j, w->size, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } } /* if (tau != 0.0) */ dat[0] = gsl_matrix_get(H, j + 1, j); dat[1] = gsl_matrix_get(H, j + 2, j); if (j < N - 3) dat[2] = gsl_matrix_get(H, j + 3, j); scale = fabs(dat[0]) + fabs(dat[1]) + fabs(dat[2]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; dat[2] /= scale; } } /* for (j = 0; j < N - 2; ++j) */ /* * Find Householder Q so that * * Q [ x y ]^t = [ * 0 ]^t */ scale = fabs(dat[0]) + fabs(dat[1]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; } tau = gsl_linalg_householder_transform(&v2.vector); if (w->compute_s) { m = gsl_matrix_submatrix(w->H, top + N - 2, top + N - 3, 2, w->size - top - N + 3); gsl_linalg_householder_hm(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(H, N - 2, N - 3, 2, 3); gsl_linalg_householder_hm(tau, &v2.vector, &m.matrix); } if (w->compute_t) { m = gsl_matrix_submatrix(w->R, top + N - 2, top + N - 2, 2, w->size - top - N + 2); gsl_linalg_householder_hm(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(R, N - 2, N - 2, 2, 2); gsl_linalg_householder_hm(tau, &v2.vector, &m.matrix); } if (w->Q) { /* accumulate the transformation into Q */ m = gsl_matrix_submatrix(w->Q, 0, top + N - 2, w->size, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } /* * Find Householder Z so that * * [ b_{n,n-1} b_{nn} ] Z = [ 0 * ] */ dat[0] = gsl_matrix_get(R, N - 1, N - 1); dat[1] = gsl_matrix_get(R, N - 1, N - 2); scale = fabs(dat[0]) + fabs(dat[1]); if (scale != 0.0) { dat[0] /= scale; dat[1] /= scale; } tau = gsl_linalg_householder_transform(&v2.vector); /* rotate back */ tmp = gsl_vector_get(&v2.vector, 1); gsl_vector_set(&v2.vector, 1, 1.0 / tmp); tau *= tmp * tmp; if (w->compute_s) { m = gsl_matrix_submatrix(w->H, 0, top + N - 2, top + N, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(H, 0, N - 2, N, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } if (w->compute_t) { m = gsl_matrix_submatrix(w->R, 0, top + N - 2, top + N, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } else { m = gsl_matrix_submatrix(R, 0, N - 2, N, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } if (w->Z) { /* accumulate the transformation into Z */ m = gsl_matrix_submatrix(w->Z, 0, top + N - 2, w->size, 2); gsl_linalg_householder_mh(tau, &v2.vector, &m.matrix); } } /* gen_qzstep_d() */ /* gen_tri_split_top() This routine is called when the leading element on the diagonal of R has become negligible. Split off a 1-by-1 block at the top. Inputs: H - upper hessenberg matrix R - upper triangular matrix w - workspace */ static void gen_tri_split_top(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; size_t j, top = 0; double cs, sn; gsl_vector_view xv, yv; if (w->needtop) top = gen_get_submatrix(w->H, H); j = 0; gsl_linalg_givens(gsl_matrix_get(H, j, j), gsl_matrix_get(H, j + 1, j), &cs, &sn); sn = -sn; if (w->compute_s) { xv = gsl_matrix_subrow(w->H, top + j, top, w->size - top); yv = gsl_matrix_subrow(w->H, top + j + 1, top, w->size - top); } else { xv = gsl_matrix_row(H, j); yv = gsl_matrix_row(H, j + 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); gsl_matrix_set(H, j + 1, j, 0.0); if (w->compute_t) { xv = gsl_matrix_subrow(w->R, top + j, top + 1, w->size - top - 1); yv = gsl_matrix_subrow(w->R, top + j + 1, top + 1, w->size - top - 1); } else { xv = gsl_matrix_subrow(R, j, 1, N - 1); yv = gsl_matrix_subrow(R, j + 1, 1, N - 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Q) { xv = gsl_matrix_column(w->Q, top + j); yv = gsl_matrix_column(w->Q, top + j + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } /* gen_tri_split_top() */ /* gen_tri_chase_zero() This routine is called when an element on the diagonal of R has become negligible. Chase the zero to the bottom of the active block so we can split off a 1-by-1 block. Inputs: H - upper hessenberg matrix R - upper triangular matrix q - index such that R(q,q) = 0 (q must be > 0) w - workspace */ static inline void gen_tri_chase_zero(gsl_matrix *H, gsl_matrix *R, size_t q, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; size_t j, top = 0; double cs, sn; gsl_vector_view xv, yv; if (w->needtop) top = gen_get_submatrix(w->H, H); for (j = q; j < N - 1; ++j) { gsl_linalg_givens(gsl_matrix_get(R, j, j + 1), gsl_matrix_get(R, j + 1, j + 1), &cs, &sn); sn = -sn; if (w->compute_t) { xv = gsl_matrix_subrow(w->R, top + j, top + j + 1, w->size - top - j - 1); yv = gsl_matrix_subrow(w->R, top + j + 1, top + j + 1, w->size - top - j - 1); } else { xv = gsl_matrix_subrow(R, j, j + 1, N - j - 1); yv = gsl_matrix_subrow(R, j + 1, j + 1, N - j - 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); gsl_matrix_set(R, j + 1, j + 1, 0.0); if (w->compute_s) { xv = gsl_matrix_subrow(w->H, top + j, top + j - 1, w->size - top - j + 1); yv = gsl_matrix_subrow(w->H, top + j + 1, top + j - 1, w->size - top - j + 1); } else { xv = gsl_matrix_subrow(H, j, j - 1, N - j + 1); yv = gsl_matrix_subrow(H, j + 1, j - 1, N - j + 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Q) { /* accumulate Q */ xv = gsl_matrix_column(w->Q, top + j); yv = gsl_matrix_column(w->Q, top + j + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } gsl_linalg_givens(gsl_matrix_get(H, j + 1, j), gsl_matrix_get(H, j + 1, j - 1), &cs, &sn); sn = -sn; if (w->compute_s) { xv = gsl_matrix_subcolumn(w->H, top + j, 0, top + j + 2); yv = gsl_matrix_subcolumn(w->H, top + j - 1, 0, top + j + 2); } else { xv = gsl_matrix_subcolumn(H, j, 0, j + 2); yv = gsl_matrix_subcolumn(H, j - 1, 0, j + 2); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); gsl_matrix_set(H, j + 1, j - 1, 0.0); if (w->compute_t) { xv = gsl_matrix_subcolumn(w->R, top + j, 0, top + j + 1); yv = gsl_matrix_subcolumn(w->R, top + j - 1, 0, top + j + 1); } else { xv = gsl_matrix_subcolumn(R, j, 0, j + 1); yv = gsl_matrix_subcolumn(R, j - 1, 0, j + 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Z) { /* accumulate Z */ xv = gsl_matrix_column(w->Z, top + j); yv = gsl_matrix_column(w->Z, top + j - 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } } /* gen_tri_chase_zero() */ /* gen_tri_zero_H() Companion function to get_tri_chase_zero(). After the zero on the diagonal of R has been chased to the bottom, we zero the element H(n, n - 1) in order to split off a 1-by-1 block. */ static inline void gen_tri_zero_H(gsl_matrix *H, gsl_matrix *R, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; size_t top = 0; double cs, sn; gsl_vector_view xv, yv; if (w->needtop) top = gen_get_submatrix(w->H, H); gsl_linalg_givens(gsl_matrix_get(H, N - 1, N - 1), gsl_matrix_get(H, N - 1, N - 2), &cs, &sn); sn = -sn; if (w->compute_s) { xv = gsl_matrix_subcolumn(w->H, top + N - 1, 0, top + N); yv = gsl_matrix_subcolumn(w->H, top + N - 2, 0, top + N); } else { xv = gsl_matrix_column(H, N - 1); yv = gsl_matrix_column(H, N - 2); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); gsl_matrix_set(H, N - 1, N - 2, 0.0); if (w->compute_t) { xv = gsl_matrix_subcolumn(w->R, top + N - 1, 0, top + N - 1); yv = gsl_matrix_subcolumn(w->R, top + N - 2, 0, top + N - 1); } else { xv = gsl_matrix_subcolumn(R, N - 1, 0, N - 1); yv = gsl_matrix_subcolumn(R, N - 2, 0, N - 1); } gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (w->Z) { /* accumulate Z */ xv = gsl_matrix_column(w->Z, top + N - 1); yv = gsl_matrix_column(w->Z, top + N - 2); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } /* gen_tri_zero_H() */ /* gen_search_small_elements() This routine searches for small elements in the matrix pencil (H, R) to determine if any eigenvalues have converged. Tests: 1. Test if the Hessenberg matrix has a small subdiagonal element: H(i, i - 1) < tolerance 2. Test if the Triangular matrix has a small diagonal element: R(i, i) < tolerance Possible outcomes: (A) Neither test passed: in this case 'flag' is set to 0 and the function returns 0 (B) Test 1 passes and 2 does not: in this case 'flag' is set to 1 and we return the row index i such that H(i, i - 1) < tol (C) Test 2 passes and 1 does not: in this case 'flag' is set to 2 and we return the index i such that R(i, i) < tol (D) Tests 1 and 2 both pass: in this case 'flag' is set to 3 and we return the index i such that H(i, i - 1) < tol and R(i, i) < tol Inputs: H - upper Hessenberg matrix R - upper Triangular matrix flag - (output) flag set on output (see above) w - workspace Return: see above */ static inline size_t gen_search_small_elements(gsl_matrix *H, gsl_matrix *R, int *flag, gsl_eigen_gen_workspace *w) { const size_t N = H->size1; int k; size_t i; int pass1 = 0; int pass2 = 0; for (k = (int) N - 1; k >= 0; --k) { i = (size_t) k; if (i != 0 && fabs(gsl_matrix_get(H, i, i - 1)) <= w->atol) { gsl_matrix_set(H, i, i - 1, 0.0); pass1 = 1; } if (fabs(gsl_matrix_get(R, i, i)) < w->btol) { gsl_matrix_set(R, i, i, 0.0); pass2 = 1; } if (pass1 && !pass2) /* case B */ { *flag = 1; return (i); } else if (!pass1 && pass2) /* case C */ { *flag = 2; return (i); } else if (pass1 && pass2) /* case D */ { *flag = 3; return (i); } } /* neither test passed: case A */ *flag = 0; return (0); } /* gen_search_subdiag_small_elements() */ /* gen_schur_standardize1() This function is called when a 1-by-1 block has converged - convert the block to standard form and update the Schur forms and vectors if required. Standard form here means that the diagonal element of B is positive. Inputs: A - 1-by-1 matrix in Schur form S B - 1-by-1 matrix in Schur form T alphar - where to store real part of eigenvalue numerator beta - where to store eigenvalue denominator w - workspace Return: success */ static int gen_schur_standardize1(gsl_matrix *A, gsl_matrix *B, double *alphar, double *beta, gsl_eigen_gen_workspace *w) { size_t i; size_t top = 0; /* * it is a 1-by-1 block - the only requirement is that * B_{00} is > 0, so if it isn't apply a -I transformation */ if (gsl_matrix_get(B, 0, 0) < 0.0) { if (w->needtop) top = gen_get_submatrix(w->H, A); if (w->compute_t) { for (i = 0; i <= top; ++i) gsl_matrix_set(w->R, i, top, -gsl_matrix_get(w->R, i, top)); } else gsl_matrix_set(B, 0, 0, -gsl_matrix_get(B, 0, 0)); if (w->compute_s) { for (i = 0; i <= top; ++i) gsl_matrix_set(w->H, i, top, -gsl_matrix_get(w->H, i, top)); } else gsl_matrix_set(A, 0, 0, -gsl_matrix_get(A, 0, 0)); if (w->Z) { for (i = 0; i < w->size; ++i) gsl_matrix_set(w->Z, i, top, -gsl_matrix_get(w->Z, i, top)); } } *alphar = gsl_matrix_get(A, 0, 0); *beta = gsl_matrix_get(B, 0, 0); return GSL_SUCCESS; } /* gen_schur_standardize1() */ /* gen_schur_standardize2() This function is called when a 2-by-2 generalized block has converged. Convert the block to standard form, which means B is rotated so that B = [ B11 0 ] with B11, B22 non-negative [ 0 B22 ] If the resulting block (A, B) has complex eigenvalues, they are computed. Otherwise, the function will return GSL_CONTINUE to notify caller that we need to do more single shift sweeps to convert the 2-by-2 block into two 1-by-1 blocks. Inputs: A - 2-by-2 submatrix of schur form S B - 2-by-2 submatrix of schur form T alpha1 - (output) where to store eigenvalue 1 numerator alpha2 - (output) where to store eigenvalue 2 numerator beta1 - (output) where to store eigenvalue 1 denominator beta2 - (output) where to store eigenvalue 2 denominator w - workspace Return: GSL_SUCCESS if block has complex eigenvalues (they are computed) GSL_CONTINUE if block has real eigenvalues (they are not computed) */ static int gen_schur_standardize2(gsl_matrix *A, gsl_matrix *B, gsl_complex *alpha1, gsl_complex *alpha2, double *beta1, double *beta2, gsl_eigen_gen_workspace *w) { double datB[4], datV[4], datS[2], work[2]; gsl_matrix_view uv = gsl_matrix_view_array(datB, 2, 2); gsl_matrix_view vv = gsl_matrix_view_array(datV, 2, 2); gsl_vector_view sv = gsl_vector_view_array(datS, 2); gsl_vector_view wv = gsl_vector_view_array(work, 2); double B11, B22; size_t top = 0; double det; double cr, sr, cl, sl; gsl_vector_view xv, yv; int s; if (w->needtop) top = gen_get_submatrix(w->H, A); /* * Rotate B so that * * B = [ B11 0 ] * [ 0 B22 ] * * with B11 non-negative */ gsl_matrix_memcpy(&uv.matrix, B); gsl_linalg_SV_decomp(&uv.matrix, &vv.matrix, &sv.vector, &wv.vector); /* * Right now, B = U S V^t, where S = diag(s) * * The SVD routine may have computed reflection matrices U and V, * but it would be much nicer to have rotations since we won't have * to use BLAS mat-mat multiplications to update our matrices, * and can instead use drot. So convert them to rotations if * necessary */ det = gsl_matrix_get(&vv.matrix, 0, 0) * gsl_matrix_get(&vv.matrix, 1, 1) - gsl_matrix_get(&vv.matrix, 0, 1) * gsl_matrix_get(&vv.matrix, 1, 0); if (det < 0.0) { /* V is a reflection, convert it to a rotation by inserting * F = [1 0; 0 -1] so that: * * B = U S [1 0] [1 0] V^t * [0 -1] [0 -1] * * so S -> S F and V -> V F where F is the reflection matrix * We just need to invert S22 since the first column of V * will remain unchanged and we can just read off the CS and SN * parameters. */ datS[1] = -datS[1]; } cr = gsl_matrix_get(&vv.matrix, 0, 0); sr = gsl_matrix_get(&vv.matrix, 1, 0); /* same for U */ det = gsl_matrix_get(&uv.matrix, 0, 0) * gsl_matrix_get(&uv.matrix, 1, 1) - gsl_matrix_get(&uv.matrix, 0, 1) * gsl_matrix_get(&uv.matrix, 1, 0); if (det < 0.0) datS[1] = -datS[1]; cl = gsl_matrix_get(&uv.matrix, 0, 0); sl = gsl_matrix_get(&uv.matrix, 1, 0); B11 = gsl_vector_get(&sv.vector, 0); B22 = gsl_vector_get(&sv.vector, 1); /* make sure B11 is positive */ if (B11 < 0.0) { B11 = -B11; B22 = -B22; cr = -cr; sr = -sr; } /* * At this point, * * [ S11 0 ] = [ CSL SNL ] B [ CSR -SNR ] * [ 0 S22 ] [-SNL CSL ] [ SNR CSR ] * * apply rotations to H and rest of R */ if (w->compute_s) { xv = gsl_matrix_subrow(w->H, top, top, w->size - top); yv = gsl_matrix_subrow(w->H, top + 1, top, w->size - top); gsl_blas_drot(&xv.vector, &yv.vector, cl, sl); xv = gsl_matrix_subcolumn(w->H, top, 0, top + 2); yv = gsl_matrix_subcolumn(w->H, top + 1, 0, top + 2); gsl_blas_drot(&xv.vector, &yv.vector, cr, sr); } else { xv = gsl_matrix_row(A, 0); yv = gsl_matrix_row(A, 1); gsl_blas_drot(&xv.vector, &yv.vector, cl, sl); xv = gsl_matrix_column(A, 0); yv = gsl_matrix_column(A, 1); gsl_blas_drot(&xv.vector, &yv.vector, cr, sr); } if (w->compute_t) { if (top != (w->size - 2)) { xv = gsl_matrix_subrow(w->R, top, top + 2, w->size - top - 2); yv = gsl_matrix_subrow(w->R, top + 1, top + 2, w->size - top - 2); gsl_blas_drot(&xv.vector, &yv.vector, cl, sl); } if (top != 0) { xv = gsl_matrix_subcolumn(w->R, top, 0, top); yv = gsl_matrix_subcolumn(w->R, top + 1, 0, top); gsl_blas_drot(&xv.vector, &yv.vector, cr, sr); } } if (w->Q) { xv = gsl_matrix_column(w->Q, top); yv = gsl_matrix_column(w->Q, top + 1); gsl_blas_drot(&xv.vector, &yv.vector, cl, sl); } if (w->Z) { xv = gsl_matrix_column(w->Z, top); yv = gsl_matrix_column(w->Z, top + 1); gsl_blas_drot(&xv.vector, &yv.vector, cr, sr); } gsl_matrix_set(B, 0, 0, B11); gsl_matrix_set(B, 0, 1, 0.0); gsl_matrix_set(B, 1, 0, 0.0); gsl_matrix_set(B, 1, 1, B22); /* if B22 is < 0, make it positive by negating its column */ if (B22 < 0.0) { size_t i; if (w->compute_s) { for (i = 0; i < top + 2; ++i) gsl_matrix_set(w->H, i, top + 1, -gsl_matrix_get(w->H, i, top + 1)); } else { gsl_matrix_set(A, 0, 1, -gsl_matrix_get(A, 0, 1)); gsl_matrix_set(A, 1, 1, -gsl_matrix_get(A, 1, 1)); } if (w->compute_t) { for (i = 0; i < top + 2; ++i) gsl_matrix_set(w->R, i, top + 1, -gsl_matrix_get(w->R, i, top + 1)); } else { gsl_matrix_set(B, 0, 1, -gsl_matrix_get(B, 0, 1)); gsl_matrix_set(B, 1, 1, -gsl_matrix_get(B, 1, 1)); } if (w->Z) { xv = gsl_matrix_column(w->Z, top + 1); gsl_vector_scale(&xv.vector, -1.0); } } /* our block is now in standard form - compute eigenvalues */ s = gen_compute_eigenvals(A, B, alpha1, alpha2, beta1, beta2); return s; } /* gen_schur_standardize2() */ /* gen_compute_eigenvals() Compute the complex eigenvalues of a 2-by-2 block Return: GSL_CONTINUE if block contains real eigenvalues (they are not computed) GSL_SUCCESS on normal completion */ static int gen_compute_eigenvals(gsl_matrix *A, gsl_matrix *B, gsl_complex *alpha1, gsl_complex *alpha2, double *beta1, double *beta2) { double wr1, wr2, wi, scale1, scale2; double s1inv; double A11, A12, A21, A22; double B11, B22; double c11r, c11i, c12, c21, c22r, c22i; double cz, cq; double szr, szi, sqr, sqi; double a1r, a1i, a2r, a2i, b1r, b1i, b1a, b2r, b2i, b2a; double alphar, alphai; double t1, an, bn, tempr, tempi, wabs; /* * This function is called from gen_schur_standardize2() and * its possible the standardization has perturbed the eigenvalues * onto the real line - so check for this before computing them */ gsl_schur_gen_eigvals(A, B, &wr1, &wr2, &wi, &scale1, &scale2); if (wi == 0.0) return GSL_CONTINUE; /* real eigenvalues - continue QZ iteration */ /* complex eigenvalues - compute alpha and beta */ s1inv = 1.0 / scale1; A11 = gsl_matrix_get(A, 0, 0); A12 = gsl_matrix_get(A, 0, 1); A21 = gsl_matrix_get(A, 1, 0); A22 = gsl_matrix_get(A, 1, 1); B11 = gsl_matrix_get(B, 0, 0); B22 = gsl_matrix_get(B, 1, 1); c11r = scale1 * A11 - wr1 * B11; c11i = -wi * B11; c12 = scale1 * A12; c21 = scale1 * A21; c22r = scale1 * A22 - wr1 * B22; c22i = -wi * B22; if (fabs(c11r) + fabs(c11i) + fabs(c12) > fabs(c21) + fabs(c22r) + fabs(c22i)) { t1 = gsl_hypot3(c12, c11r, c11i); if (t1 != 0.0) { cz = c12 / t1; szr = -c11r / t1; szi = -c11i / t1; } else { cz = 0.0; szr = 1.0; szi = 0.0; } } else { cz = hypot(c22r, c22i); if (cz <= GSL_DBL_MIN) { cz = 0.0; szr = 1.0; szi = 0.0; } else { tempr = c22r / cz; tempi = c22i / cz; t1 = hypot(cz, c21); cz /= t1; szr = -c21*tempr / t1; szi = c21*tempi / t1; } } an = fabs(A11) + fabs(A12) + fabs(A21) + fabs(A22); bn = fabs(B11) + fabs(B22); wabs = fabs(wr1) + fabs(wi); if (scale1*an > wabs*bn) { cq = cz * B11; if (cq <= GSL_DBL_MIN) { cq = 0.0; sqr = 1.0; sqi = 0.0; } else { sqr = szr * B22; sqi = -szi * B22; } } else { a1r = cz * A11 + szr * A12; a1i = szi * A12; a2r = cz * A21 + szr * A22; a2i = szi * A22; cq = hypot(a1r, a1i); if (cq <= GSL_DBL_MIN) { cq = 0.0; sqr = 1.0; sqi = 0.0; } else { tempr = a1r / cq; tempi = a1i / cq; sqr = tempr * a2r + tempi * a2i; sqi = tempi * a2r - tempr * a2i; } } t1 = gsl_hypot3(cq, sqr, sqi); cq /= t1; sqr /= t1; sqi /= t1; tempr = sqr*szr - sqi*szi; tempi = sqr*szi + sqi*szr; b1r = cq*cz*B11 + tempr*B22; b1i = tempi*B22; b1a = hypot(b1r, b1i); b2r = cq*cz*B22 + tempr*B11; b2i = -tempi*B11; b2a = hypot(b2r, b2i); *beta1 = b1a; *beta2 = b2a; alphar = (wr1 * b1a) * s1inv; alphai = (wi * b1a) * s1inv; GSL_SET_COMPLEX(alpha1, alphar, alphai); alphar = (wr1 * b2a) * s1inv; alphai = -(wi * b2a) * s1inv; GSL_SET_COMPLEX(alpha2, alphar, alphai); return GSL_SUCCESS; } /* gen_compute_eigenvals() */ /* gen_store_eigval1() Store eigenvalue of a 1-by-1 block into the alpha and beta output vectors. This routine ensures that eigenvalues are stored in the same order as they appear in the Schur form and updates various internal workspace quantities. */ static void gen_store_eigval1(const gsl_matrix *H, const double a, const double b, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w) { size_t top = gen_get_submatrix(w->H, H); gsl_complex z; GSL_SET_COMPLEX(&z, a, 0.0); gsl_vector_complex_set(alpha, top, z); gsl_vector_set(beta, top, b); w->n_evals += 1; w->n_iter = 0; w->eshift = 0.0; } /* gen_store_eigval1() */ /* gen_store_eigval2() Store eigenvalues of a 2-by-2 block into the alpha and beta output vectors. This routine ensures that eigenvalues are stored in the same order as they appear in the Schur form and updates various internal workspace quantities. */ static void gen_store_eigval2(const gsl_matrix *H, const gsl_complex *alpha1, const double beta1, const gsl_complex *alpha2, const double beta2, gsl_vector_complex *alpha, gsl_vector *beta, gsl_eigen_gen_workspace *w) { size_t top = gen_get_submatrix(w->H, H); gsl_vector_complex_set(alpha, top, *alpha1); gsl_vector_set(beta, top, beta1); gsl_vector_complex_set(alpha, top + 1, *alpha2); gsl_vector_set(beta, top + 1, beta2); w->n_evals += 2; w->n_iter = 0; w->eshift = 0.0; } /* gen_store_eigval2() */ /* gen_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 size_t gen_get_submatrix(const gsl_matrix *A, const gsl_matrix *B) { size_t diff; double ratio; size_t top; diff = (size_t) (B->data - A->data); /* B is on the diagonal of A, so measure distance in units of tda+1 */ ratio = (double)diff / ((double) (A->tda + 1)); top = (size_t) floor(ratio); return top; } /* gen_get_submatrix() */ /* Frobenius norm */ inline static double normF (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; } gsl-doc-2.3/eigen/TODO0000664000175000017500000000115112616157443012550 0ustar eddedd# -*- org -*- #+CATEGORY: eigen * Merge improvements from SVD qrstep to eigen - these should be combined somehow as we only need one version of them. * dlae2.f has better handling of 2x2 eigenvalues than our qrstep.c * 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(...) gsl-doc-2.3/eigen/nonsymmv.c0000644000175000017500000007612412737536472014133 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include /* * 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 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 *) calloc (1, 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_eigen_nonsymmv_free(w); 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, 0, 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_eigen_nonsymmv_free(w); 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) { RETURN_IF_NULL (w); if (w->nonsymm_workspace_p) gsl_eigen_nonsymm_free(w->nonsymm_workspace_p); if (w->work) gsl_vector_free(w->work); if (w->work2) gsl_vector_free(w->work2); if (w->work3) gsl_vector_free(w->work3); free(w); } /* gsl_eigen_nonsymmv_free() */ /* gsl_eigen_nonsymmv_params() Set some parameters which define how we solve the eigenvalue problem. Inputs: balance - 1 if we want to balance the matrix, 0 if not w - nonsymmv workspace */ void gsl_eigen_nonsymmv_params (const int balance, gsl_eigen_nonsymmv_workspace *w) { gsl_eigen_nonsymm_params(1, balance, w->nonsymm_workspace_p); } /* gsl_eigen_nonsymm_params() */ /* 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); gsl_schur_solve_equation(1.0, &Tv.matrix, lambda_re, 1.0, 1.0, &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_subcolumn(T, lu, 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); gsl_schur_solve_equation(1.0, &Tv.matrix, lambda_re, 1.0, 1.0, &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_subcolumn(T, lu - 1, 0, lu - 1); v2 = gsl_vector_subvector(w->work, 0, lu - 1); gsl_blas_daxpy(-x11, &v1.vector, &v2.vector); v1 = gsl_matrix_subcolumn(T, lu, 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); gsl_schur_solve_equation_z(1.0, &Tv.matrix, &lambda, 1.0, 1.0, &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_subcolumn(T, lu, 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); gsl_schur_solve_equation_z(1.0, &Tv.matrix, &lambda, 1.0, 1.0, &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_subcolumn(T, lu - 1, 0, lu - 1); v4 = gsl_matrix_subcolumn(T, lu, 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_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() */ gsl-doc-2.3/eigen/genv.c0000664000175000017500000007013712616157443013175 0ustar eddedd/* eigen/genv.c * * Copyright (C) 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues and eigenvectors of a * real generalized eigensystem A x = \lambda B x. Left and right * Schur vectors are optionally computed as well. * * This file contains routines based on original code from LAPACK * which is distributed under the modified BSD license. */ static int genv_get_right_eigenvectors(const gsl_matrix *S, const gsl_matrix *T, gsl_matrix *Z, gsl_matrix_complex *evec, gsl_eigen_genv_workspace *w); static void genv_normalize_eigenvectors(gsl_vector_complex *alpha, gsl_matrix_complex *evec); /* gsl_eigen_genv_alloc() Allocate a workspace for solving the generalized eigenvalue problem. The size of this workspace is O(7n). Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_genv_workspace * gsl_eigen_genv_alloc(const size_t n) { gsl_eigen_genv_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_genv_workspace *) calloc (1, sizeof (gsl_eigen_genv_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->Q = NULL; w->Z = NULL; w->gen_workspace_p = gsl_eigen_gen_alloc(n); if (w->gen_workspace_p == 0) { gsl_eigen_genv_free(w); GSL_ERROR_NULL ("failed to allocate space for gen workspace", GSL_ENOMEM); } /* compute the full Schur forms */ gsl_eigen_gen_params(1, 1, 1, w->gen_workspace_p); w->work1 = gsl_vector_alloc(n); w->work2 = gsl_vector_alloc(n); w->work3 = gsl_vector_alloc(n); w->work4 = gsl_vector_alloc(n); w->work5 = gsl_vector_alloc(n); w->work6 = gsl_vector_alloc(n); if (w->work1 == 0 || w->work2 == 0 || w->work3 == 0 || w->work4 == 0 || w->work5 == 0 || w->work6 == 0) { gsl_eigen_genv_free(w); GSL_ERROR_NULL ("failed to allocate space for additional workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_genv_alloc() */ /* gsl_eigen_genv_free() Free workspace w */ void gsl_eigen_genv_free(gsl_eigen_genv_workspace *w) { RETURN_IF_NULL (w); if (w->gen_workspace_p) gsl_eigen_gen_free(w->gen_workspace_p); if (w->work1) gsl_vector_free(w->work1); if (w->work2) gsl_vector_free(w->work2); if (w->work3) gsl_vector_free(w->work3); if (w->work4) gsl_vector_free(w->work4); if (w->work5) gsl_vector_free(w->work5); if (w->work6) gsl_vector_free(w->work6); free(w); } /* gsl_eigen_genv_free() */ /* gsl_eigen_genv() Solve the generalized eigenvalue problem A x = \lambda B x for the eigenvalues \lambda and right eigenvectors x. Inputs: A - general real matrix B - general real matrix alpha - (output) where to store eigenvalue numerators beta - (output) where to store eigenvalue denominators evec - (output) where to store eigenvectors w - workspace Return: success or error */ int gsl_eigen_genv (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix_complex *evec, gsl_eigen_genv_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } else if (alpha->size != N || beta->size != N) { GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN); } else if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } 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 right 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; s = gsl_eigen_gen_QZ(A, B, alpha, beta, w->Q, &Z, w->gen_workspace_p); if (w->Z) { /* save right Schur vectors */ gsl_matrix_memcpy(w->Z, &Z); } /* only compute eigenvectors if we found all eigenvalues */ if (s == GSL_SUCCESS) { /* compute eigenvectors */ s = genv_get_right_eigenvectors(A, B, &Z, evec, w); if (s == GSL_SUCCESS) genv_normalize_eigenvectors(alpha, evec); } return s; } } /* gsl_eigen_genv() */ /* gsl_eigen_genv_QZ() Solve the generalized eigenvalue problem A x = \lambda B x for the eigenvalues \lambda and right eigenvectors x. Optionally compute left and/or right Schur vectors Q and Z which satisfy: A = Q S Z^t B = Q T Z^t where (S, T) is the generalized Schur form of (A, B) Inputs: A - general real matrix B - general real matrix alpha - (output) where to store eigenvalue numerators beta - (output) where to store eigenvalue denominators evec - (output) where to store eigenvectors Q - (output) if non-null, where to store left Schur vectors Z - (output) if non-null, where to store right Schur vectors w - workspace Return: success or error */ int gsl_eigen_genv_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * alpha, gsl_vector * beta, gsl_matrix_complex * evec, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_genv_workspace * w) { if (Q && (A->size1 != Q->size1 || A->size1 != Q->size2)) { GSL_ERROR("Q matrix has wrong dimensions", GSL_EBADLEN); } else if (Z && (A->size1 != Z->size1 || A->size1 != Z->size2)) { GSL_ERROR("Z matrix has wrong dimensions", GSL_EBADLEN); } else { int s; w->Q = Q; w->Z = Z; s = gsl_eigen_genv(A, B, alpha, beta, evec, w); w->Q = NULL; w->Z = NULL; return s; } } /* gsl_eigen_genv_QZ() */ /******************************************** * INTERNAL ROUTINES * ********************************************/ /* genv_get_right_eigenvectors() Compute right eigenvectors of the Schur form (S, T) and then backtransform them using the right Schur vectors to get right eigenvectors of the original system. Inputs: S - upper quasi-triangular Schur form of A T - upper triangular Schur form of B Z - right Schur vectors evec - (output) where to store eigenvectors w - workspace Return: success or error Notes: 1) based on LAPACK routine DTGEVC 2) eigenvectors are stored in the order that their eigenvalues appear in the Schur form */ static int genv_get_right_eigenvectors(const gsl_matrix *S, const gsl_matrix *T, gsl_matrix *Z, gsl_matrix_complex *evec, gsl_eigen_genv_workspace *w) { const size_t N = w->size; const double small = GSL_DBL_MIN * N / GSL_DBL_EPSILON; const double big = 1.0 / small; const double bignum = 1.0 / (GSL_DBL_MIN * N); size_t i, j, k, end; int is; double anorm, bnorm; double temp, temp2, temp2r, temp2i; double ascale, bscale; double salfar, sbeta; double acoef, bcoefr, bcoefi, acoefa, bcoefa; double creala, cimaga, crealb, cimagb, cre2a, cim2a, cre2b, cim2b; double dmin, xmax; double scale; size_t nw, na; int lsa, lsb; int complex_pair; gsl_complex z_zero, z_one; double bdiag[2] = { 0.0, 0.0 }; double sum[4]; int il2by2; size_t jr, jc, ja; double xscale; gsl_vector_complex_view ecol; gsl_vector_view re, im, re2, im2; GSL_SET_COMPLEX(&z_zero, 0.0, 0.0); GSL_SET_COMPLEX(&z_one, 1.0, 0.0); /* * Compute the 1-norm of each column of (S, T) excluding elements * belonging to the diagonal blocks to check for possible overflow * in the triangular solver */ anorm = fabs(gsl_matrix_get(S, 0, 0)); if (N > 1) anorm += fabs(gsl_matrix_get(S, 1, 0)); bnorm = fabs(gsl_matrix_get(T, 0, 0)); gsl_vector_set(w->work1, 0, 0.0); gsl_vector_set(w->work2, 0, 0.0); for (j = 1; j < N; ++j) { temp = temp2 = 0.0; if (gsl_matrix_get(S, j, j - 1) == 0.0) end = j; else end = j - 1; for (i = 0; i < end; ++i) { temp += fabs(gsl_matrix_get(S, i, j)); temp2 += fabs(gsl_matrix_get(T, i, j)); } gsl_vector_set(w->work1, j, temp); gsl_vector_set(w->work2, j, temp2); for (i = end; i < GSL_MIN(j + 2, N); ++i) { temp += fabs(gsl_matrix_get(S, i, j)); temp2 += fabs(gsl_matrix_get(T, i, j)); } anorm = GSL_MAX(anorm, temp); bnorm = GSL_MAX(bnorm, temp2); } ascale = 1.0 / GSL_MAX(anorm, GSL_DBL_MIN); bscale = 1.0 / GSL_MAX(bnorm, GSL_DBL_MIN); complex_pair = 0; for (k = 0; k < N; ++k) { size_t je = N - 1 - k; if (complex_pair) { complex_pair = 0; continue; } nw = 1; if (je > 0) { if (gsl_matrix_get(S, je, je - 1) != 0.0) { complex_pair = 1; nw = 2; } } if (!complex_pair) { if (fabs(gsl_matrix_get(S, je, je)) <= GSL_DBL_MIN && fabs(gsl_matrix_get(T, je, je)) <= GSL_DBL_MIN) { /* singular matrix pencil - unit eigenvector */ for (i = 0; i < N; ++i) gsl_matrix_complex_set(evec, i, je, z_zero); gsl_matrix_complex_set(evec, je, je, z_one); continue; } /* clear vector */ for (i = 0; i < N; ++i) gsl_vector_set(w->work3, i, 0.0); } else { /* clear vectors */ for (i = 0; i < N; ++i) { gsl_vector_set(w->work3, i, 0.0); gsl_vector_set(w->work4, i, 0.0); } } if (!complex_pair) { /* real eigenvalue */ temp = 1.0 / GSL_MAX(GSL_DBL_MIN, GSL_MAX(fabs(gsl_matrix_get(S, je, je)) * ascale, fabs(gsl_matrix_get(T, je, je)) * bscale)); salfar = (temp * gsl_matrix_get(S, je, je)) * ascale; sbeta = (temp * gsl_matrix_get(T, je, je)) * bscale; acoef = sbeta * ascale; bcoefr = salfar * bscale; bcoefi = 0.0; /* scale to avoid underflow */ scale = 1.0; lsa = fabs(sbeta) >= GSL_DBL_MIN && fabs(acoef) < small; lsb = fabs(salfar) >= GSL_DBL_MIN && fabs(bcoefr) < small; if (lsa) scale = (small / fabs(sbeta)) * GSL_MIN(anorm, big); if (lsb) scale = GSL_MAX(scale, (small / fabs(salfar)) * GSL_MIN(bnorm, big)); if (lsa || lsb) { scale = GSL_MIN(scale, 1.0 / (GSL_DBL_MIN * GSL_MAX(1.0, GSL_MAX(fabs(acoef), fabs(bcoefr))))); if (lsa) acoef = ascale * (scale * sbeta); else acoef *= scale; if (lsb) bcoefr = bscale * (scale * salfar); else bcoefr *= scale; } acoefa = fabs(acoef); bcoefa = fabs(bcoefr); /* first component is 1 */ gsl_vector_set(w->work3, je, 1.0); xmax = 1.0; /* compute contribution from column je of A and B to sum */ for (i = 0; i < je; ++i) { gsl_vector_set(w->work3, i, bcoefr*gsl_matrix_get(T, i, je) - acoef * gsl_matrix_get(S, i, je)); } } else { gsl_matrix_const_view vs = gsl_matrix_const_submatrix(S, je - 1, je - 1, 2, 2); gsl_matrix_const_view vt = gsl_matrix_const_submatrix(T, je - 1, je - 1, 2, 2); /* complex eigenvalue */ gsl_schur_gen_eigvals(&vs.matrix, &vt.matrix, &bcoefr, &temp2, &bcoefi, &acoef, &temp); if (bcoefi == 0.0) { GSL_ERROR("gsl_schur_gen_eigvals failed on complex block", GSL_FAILURE); } /* scale to avoid over/underflow */ acoefa = fabs(acoef); bcoefa = fabs(bcoefr) + fabs(bcoefi); scale = 1.0; if (acoefa*GSL_DBL_EPSILON < GSL_DBL_MIN && acoefa >= GSL_DBL_MIN) scale = (GSL_DBL_MIN / GSL_DBL_EPSILON) / acoefa; if (bcoefa*GSL_DBL_EPSILON < GSL_DBL_MIN && bcoefa >= GSL_DBL_MIN) scale = GSL_MAX(scale, (GSL_DBL_MIN/GSL_DBL_EPSILON) / bcoefa); if (GSL_DBL_MIN*acoefa > ascale) scale = ascale / (GSL_DBL_MIN * acoefa); if (GSL_DBL_MIN*bcoefa > bscale) scale = GSL_MIN(scale, bscale / (GSL_DBL_MIN*bcoefa)); if (scale != 1.0) { acoef *= scale; acoefa = fabs(acoef); bcoefr *= scale; bcoefi *= scale; bcoefa = fabs(bcoefr) + fabs(bcoefi); } /* compute first two components of eigenvector */ temp = acoef * gsl_matrix_get(S, je, je - 1); temp2r = acoef * gsl_matrix_get(S, je, je) - bcoefr * gsl_matrix_get(T, je, je); temp2i = -bcoefi * gsl_matrix_get(T, je, je); if (fabs(temp) >= fabs(temp2r) + fabs(temp2i)) { gsl_vector_set(w->work3, je, 1.0); gsl_vector_set(w->work4, je, 0.0); gsl_vector_set(w->work3, je - 1, -temp2r / temp); gsl_vector_set(w->work4, je - 1, -temp2i / temp); } else { gsl_vector_set(w->work3, je - 1, 1.0); gsl_vector_set(w->work4, je - 1, 0.0); temp = acoef * gsl_matrix_get(S, je - 1, je); gsl_vector_set(w->work3, je, (bcoefr*gsl_matrix_get(T, je - 1, je - 1) - acoef*gsl_matrix_get(S, je - 1, je - 1)) / temp); gsl_vector_set(w->work4, je, bcoefi*gsl_matrix_get(T, je - 1, je - 1) / temp); } xmax = GSL_MAX(fabs(gsl_vector_get(w->work3, je)) + fabs(gsl_vector_get(w->work4, je)), fabs(gsl_vector_get(w->work3, je - 1)) + fabs(gsl_vector_get(w->work4, je - 1))); /* compute contribution from column je and je - 1 */ creala = acoef * gsl_vector_get(w->work3, je - 1); cimaga = acoef * gsl_vector_get(w->work4, je - 1); crealb = bcoefr * gsl_vector_get(w->work3, je - 1) - bcoefi * gsl_vector_get(w->work4, je - 1); cimagb = bcoefi * gsl_vector_get(w->work3, je - 1) + bcoefr * gsl_vector_get(w->work4, je - 1); cre2a = acoef * gsl_vector_get(w->work3, je); cim2a = acoef * gsl_vector_get(w->work4, je); cre2b = bcoefr * gsl_vector_get(w->work3, je) - bcoefi * gsl_vector_get(w->work4, je); cim2b = bcoefi * gsl_vector_get(w->work3, je) + bcoefr * gsl_vector_get(w->work4, je); for (i = 0; i < je - 1; ++i) { gsl_vector_set(w->work3, i, -creala * gsl_matrix_get(S, i, je - 1) + crealb * gsl_matrix_get(T, i, je - 1) - cre2a * gsl_matrix_get(S, i, je) + cre2b * gsl_matrix_get(T, i, je)); gsl_vector_set(w->work4, i, -cimaga * gsl_matrix_get(S, i, je - 1) + cimagb * gsl_matrix_get(T, i, je - 1) - cim2a * gsl_matrix_get(S, i, je) + cim2b * gsl_matrix_get(T, i, je)); } } dmin = GSL_MAX(GSL_DBL_MIN, GSL_MAX(GSL_DBL_EPSILON*acoefa*anorm, GSL_DBL_EPSILON*bcoefa*bnorm)); /* triangular solve of (a A - b B) x = 0 */ il2by2 = 0; for (is = (int) je - (int) nw; is >= 0; --is) { j = (size_t) is; if (!il2by2 && j > 0) { if (gsl_matrix_get(S, j, j - 1) != 0.0) { il2by2 = 1; continue; } } bdiag[0] = gsl_matrix_get(T, j, j); if (il2by2) { na = 2; bdiag[1] = gsl_matrix_get(T, j + 1, j + 1); } else na = 1; if (nw == 1) { gsl_matrix_const_view sv = gsl_matrix_const_submatrix(S, j, j, na, na); gsl_vector_view xv, bv; bv = gsl_vector_subvector(w->work3, j, na); /* * the loop below expects the solution in the first column * of sum, so set stride to 2 */ xv = gsl_vector_view_array_with_stride(sum, 2, na); gsl_schur_solve_equation(acoef, &sv.matrix, bcoefr, bdiag[0], bdiag[1], &bv.vector, &xv.vector, &scale, &temp, dmin); } else { double bdat[4]; gsl_matrix_const_view sv = gsl_matrix_const_submatrix(S, j, j, na, na); gsl_vector_complex_view xv = gsl_vector_complex_view_array(sum, na); gsl_vector_complex_view bv = gsl_vector_complex_view_array(bdat, na); gsl_complex z; bdat[0] = gsl_vector_get(w->work3, j); bdat[1] = gsl_vector_get(w->work4, j); if (na == 2) { bdat[2] = gsl_vector_get(w->work3, j + 1); bdat[3] = gsl_vector_get(w->work4, j + 1); } GSL_SET_COMPLEX(&z, bcoefr, bcoefi); gsl_schur_solve_equation_z(acoef, &sv.matrix, &z, bdiag[0], bdiag[1], &bv.vector, &xv.vector, &scale, &temp, dmin); } if (scale < 1.0) { for (jr = 0; jr <= je; ++jr) { gsl_vector_set(w->work3, jr, scale * gsl_vector_get(w->work3, jr)); if (nw == 2) { gsl_vector_set(w->work4, jr, scale * gsl_vector_get(w->work4, jr)); } } } xmax = GSL_MAX(scale * xmax, temp); for (jr = 0; jr < na; ++jr) { gsl_vector_set(w->work3, j + jr, sum[jr*na]); if (nw == 2) gsl_vector_set(w->work4, j + jr, sum[jr*na + 1]); } if (j > 0) { xscale = 1.0 / GSL_MAX(1.0, xmax); temp = acoefa * gsl_vector_get(w->work1, j) + bcoefa * gsl_vector_get(w->work2, j); if (il2by2) { temp = GSL_MAX(temp, acoefa * gsl_vector_get(w->work1, j + 1) + bcoefa * gsl_vector_get(w->work2, j + 1)); } temp = GSL_MAX(temp, GSL_MAX(acoefa, bcoefa)); if (temp > bignum * xscale) { for (jr = 0; jr <= je; ++jr) { gsl_vector_set(w->work3, jr, xscale * gsl_vector_get(w->work3, jr)); if (nw == 2) { gsl_vector_set(w->work4, jr, xscale * gsl_vector_get(w->work4, jr)); } } xmax *= xscale; } for (ja = 0; ja < na; ++ja) { if (complex_pair) { creala = acoef * gsl_vector_get(w->work3, j + ja); cimaga = acoef * gsl_vector_get(w->work4, j + ja); crealb = bcoefr * gsl_vector_get(w->work3, j + ja) - bcoefi * gsl_vector_get(w->work4, j + ja); cimagb = bcoefi * gsl_vector_get(w->work3, j + ja) + bcoefr * gsl_vector_get(w->work4, j + ja); for (jr = 0; jr <= j - 1; ++jr) { gsl_vector_set(w->work3, jr, gsl_vector_get(w->work3, jr) - creala * gsl_matrix_get(S, jr, j + ja) + crealb * gsl_matrix_get(T, jr, j + ja)); gsl_vector_set(w->work4, jr, gsl_vector_get(w->work4, jr) - cimaga * gsl_matrix_get(S, jr, j + ja) + cimagb * gsl_matrix_get(T, jr, j + ja)); } } else { creala = acoef * gsl_vector_get(w->work3, j + ja); crealb = bcoefr * gsl_vector_get(w->work3, j + ja); for (jr = 0; jr <= j - 1; ++jr) { gsl_vector_set(w->work3, jr, gsl_vector_get(w->work3, jr) - creala * gsl_matrix_get(S, jr, j + ja) + crealb * gsl_matrix_get(T, jr, j + ja)); } } /* if (!complex_pair) */ } /* for (ja = 0; ja < na; ++ja) */ } /* if (j > 0) */ il2by2 = 0; } /* for (i = 0; i < je - nw; ++i) */ for (jr = 0; jr < N; ++jr) { gsl_vector_set(w->work5, jr, gsl_vector_get(w->work3, 0) * gsl_matrix_get(Z, jr, 0)); if (nw == 2) { gsl_vector_set(w->work6, jr, gsl_vector_get(w->work4, 0) * gsl_matrix_get(Z, jr, 0)); } } for (jc = 1; jc <= je; ++jc) { for (jr = 0; jr < N; ++jr) { gsl_vector_set(w->work5, jr, gsl_vector_get(w->work5, jr) + gsl_vector_get(w->work3, jc) * gsl_matrix_get(Z, jr, jc)); if (nw == 2) { gsl_vector_set(w->work6, jr, gsl_vector_get(w->work6, jr) + gsl_vector_get(w->work4, jc) * gsl_matrix_get(Z, jr, jc)); } } } /* store the eigenvector */ if (complex_pair) { ecol = gsl_matrix_complex_column(evec, je - 1); re = gsl_vector_complex_real(&ecol.vector); im = gsl_vector_complex_imag(&ecol.vector); ecol = gsl_matrix_complex_column(evec, je); re2 = gsl_vector_complex_real(&ecol.vector); im2 = gsl_vector_complex_imag(&ecol.vector); } else { ecol = gsl_matrix_complex_column(evec, je); re = gsl_vector_complex_real(&ecol.vector); im = gsl_vector_complex_imag(&ecol.vector); } for (jr = 0; jr < N; ++jr) { gsl_vector_set(&re.vector, jr, gsl_vector_get(w->work5, jr)); if (complex_pair) { gsl_vector_set(&im.vector, jr, gsl_vector_get(w->work6, jr)); gsl_vector_set(&re2.vector, jr, gsl_vector_get(w->work5, jr)); gsl_vector_set(&im2.vector, jr, -gsl_vector_get(w->work6, jr)); } else { gsl_vector_set(&im.vector, jr, 0.0); } } /* scale eigenvector */ xmax = 0.0; if (complex_pair) { for (j = 0; j < N; ++j) { xmax = GSL_MAX(xmax, fabs(gsl_vector_get(&re.vector, j)) + fabs(gsl_vector_get(&im.vector, j))); } } else { for (j = 0; j < N; ++j) { xmax = GSL_MAX(xmax, fabs(gsl_vector_get(&re.vector, j))); } } if (xmax > GSL_DBL_MIN) { xscale = 1.0 / xmax; for (j = 0; j < N; ++j) { gsl_vector_set(&re.vector, j, gsl_vector_get(&re.vector, j) * xscale); if (complex_pair) { gsl_vector_set(&im.vector, j, gsl_vector_get(&im.vector, j) * xscale); gsl_vector_set(&re2.vector, j, gsl_vector_get(&re2.vector, j) * xscale); gsl_vector_set(&im2.vector, j, gsl_vector_get(&im2.vector, j) * xscale); } } } } /* for (k = 0; k < N; ++k) */ return GSL_SUCCESS; } /* genv_get_right_eigenvectors() */ /* genv_normalize_eigenvectors() Normalize eigenvectors so that their Euclidean norm is 1 Inputs: alpha - eigenvalue numerators evec - eigenvectors */ static void genv_normalize_eigenvectors(gsl_vector_complex *alpha, gsl_matrix_complex *evec) { const size_t N = evec->size1; size_t i; /* looping */ gsl_complex ai; gsl_vector_complex_view vi; gsl_vector_view re, im; double scale; /* scaling factor */ for (i = 0; i < N; ++i) { ai = gsl_vector_complex_get(alpha, i); vi = gsl_matrix_complex_column(evec, i); re = gsl_vector_complex_real(&vi.vector); if (GSL_IMAG(ai) == 0.0) { scale = 1.0 / gsl_blas_dnrm2(&re.vector); gsl_blas_dscal(scale, &re.vector); } else if (GSL_IMAG(ai) > 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); } } } /* genv_normalize_eigenvectors() */ gsl-doc-2.3/eigen/symmv.c0000664000175000017500000001345112616157443013405 0ustar eddedd/* eigen/symmv.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* 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) { RETURN_IF_NULL (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; } } gsl-doc-2.3/eigen/gensymmv.c0000664000175000017500000001225112761321304014062 0ustar eddedd/* eigen/gensymmv.c * * Copyright (C) 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues and eigenvectors of a real * generalized symmetric-definite eigensystem A x = \lambda B x, where * A and B are symmetric, and B is positive-definite. */ static void gensymmv_normalize_eigenvectors(gsl_matrix *evec); /* gsl_eigen_gensymmv_alloc() Allocate a workspace for solving the generalized symmetric-definite eigenvalue problem. The size of this workspace is O(4n). Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_gensymmv_workspace * gsl_eigen_gensymmv_alloc(const size_t n) { gsl_eigen_gensymmv_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_gensymmv_workspace *) calloc (1, sizeof (gsl_eigen_gensymmv_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->symmv_workspace_p = gsl_eigen_symmv_alloc(n); if (!w->symmv_workspace_p) { gsl_eigen_gensymmv_free(w); GSL_ERROR_NULL("failed to allocate space for symmv workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_gensymmv_alloc() */ /* gsl_eigen_gensymmv_free() Free workspace w */ void gsl_eigen_gensymmv_free (gsl_eigen_gensymmv_workspace * w) { RETURN_IF_NULL (w); if (w->symmv_workspace_p) gsl_eigen_symmv_free(w->symmv_workspace_p); free(w); } /* gsl_eigen_gensymmv_free() */ /* gsl_eigen_gensymmv() Solve the generalized symmetric-definite eigenvalue problem A x = \lambda B x for the eigenvalues \lambda and eigenvectors x. Inputs: A - real symmetric matrix B - real symmetric and positive definite matrix eval - where to store eigenvalues evec - where to store eigenvectors w - workspace Return: success or error */ int gsl_eigen_gensymmv (gsl_matrix * A, gsl_matrix * B, gsl_vector * eval, gsl_matrix * evec, gsl_eigen_gensymmv_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } 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 if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } else { int s; /* compute Cholesky factorization of B */ s = gsl_linalg_cholesky_decomp1(B); if (s != GSL_SUCCESS) return s; /* B is not positive definite */ /* transform to standard symmetric eigenvalue problem */ gsl_eigen_gensymm_standardize(A, B); /* compute eigenvalues and eigenvectors */ s = gsl_eigen_symmv(A, eval, evec, w->symmv_workspace_p); if (s != GSL_SUCCESS) return s; /* backtransform eigenvectors: evec -> L^{-T} evec */ gsl_blas_dtrsm(CblasLeft, CblasLower, CblasTrans, CblasNonUnit, 1.0, B, evec); /* the blas call destroyed the normalization - renormalize */ gensymmv_normalize_eigenvectors(evec); return GSL_SUCCESS; } } /* gsl_eigen_gensymmv() */ /******************************************** * INTERNAL ROUTINES * ********************************************/ /* gensymmv_normalize_eigenvectors() Normalize eigenvectors so that their Euclidean norm is 1 Inputs: evec - eigenvectors */ static void gensymmv_normalize_eigenvectors(gsl_matrix *evec) { const size_t N = evec->size1; size_t i; /* looping */ for (i = 0; i < N; ++i) { gsl_vector_view vi = gsl_matrix_column(evec, i); double scale = 1.0 / gsl_blas_dnrm2(&vi.vector); gsl_blas_dscal(scale, &vi.vector); } } /* gensymmv_normalize_eigenvectors() */ gsl-doc-2.3/eigen/schur.c0000664000175000017500000005300412616157443013354 0ustar eddedd/* eigen/schur.c * * Copyright (C) 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * 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. */ #define GSL_SCHUR_SMLNUM (2.0 * GSL_DBL_MIN) #define GSL_SCHUR_BIGNUM ((1.0 - GSL_DBL_EPSILON) / GSL_SCHUR_SMLNUM) /* gsl_schur_gen_eigvals() Compute the eigenvalues of a 2-by-2 generalized block. Inputs: A - 2-by-2 matrix B - 2-by-2 upper triangular matrix wr1 - (output) see notes wr2 - (output) see notes wi - (output) see notes scale1 - (output) see notes scale2 - (output) see notes Return: success Notes: 1) If the block contains real eigenvalues, then wi is set to 0, and wr1, wr2, scale1, and scale2 are set such that: eval1 = wr1 * scale1 eval2 = wr2 * scale2 If the block contains complex eigenvalues, then wr1, wr2, scale1, scale2, and wi are set such that: wr1 = wr2 = scale1 * Re(eval) wi = scale1 * Im(eval) wi is always non-negative 2) This routine is based on LAPACK DLAG2 */ int gsl_schur_gen_eigvals(const gsl_matrix *A, const gsl_matrix *B, double *wr1, double *wr2, double *wi, double *scale1, double *scale2) { const double safemin = GSL_DBL_MIN * 1.0e2; const double safemax = 1.0 / safemin; const double rtmin = sqrt(safemin); const double rtmax = 1.0 / rtmin; double anorm, bnorm; double ascale, bscale, bsize; double s1, s2; double A11, A12, A21, A22; double B11, B12, B22; double binv11, binv22; double bmin; double as11, as12, as22, abi22; double pp, qq, shift, ss, discr, r; /* scale A */ anorm = GSL_MAX(GSL_MAX(fabs(gsl_matrix_get(A, 0, 0)) + fabs(gsl_matrix_get(A, 1, 0)), fabs(gsl_matrix_get(A, 0, 1)) + fabs(gsl_matrix_get(A, 1, 1))), safemin); ascale = 1.0 / anorm; A11 = ascale * gsl_matrix_get(A, 0, 0); A12 = ascale * gsl_matrix_get(A, 0, 1); A21 = ascale * gsl_matrix_get(A, 1, 0); A22 = ascale * gsl_matrix_get(A, 1, 1); /* perturb B if necessary to ensure non-singularity */ B11 = gsl_matrix_get(B, 0, 0); B12 = gsl_matrix_get(B, 0, 1); B22 = gsl_matrix_get(B, 1, 1); bmin = rtmin * GSL_MAX(fabs(B11), GSL_MAX(fabs(B12), GSL_MAX(fabs(B22), rtmin))); if (fabs(B11) < bmin) B11 = GSL_SIGN(B11) * bmin; if (fabs(B22) < bmin) B22 = GSL_SIGN(B22) * bmin; /* scale B */ bnorm = GSL_MAX(fabs(B11), GSL_MAX(fabs(B12) + fabs(B22), safemin)); bsize = GSL_MAX(fabs(B11), fabs(B22)); bscale = 1.0 / bsize; B11 *= bscale; B12 *= bscale; B22 *= bscale; /* compute larger eigenvalue */ binv11 = 1.0 / B11; binv22 = 1.0 / B22; s1 = A11 * binv11; s2 = A22 * binv22; if (fabs(s1) <= fabs(s2)) { as12 = A12 - s1 * B12; as22 = A22 - s1 * B22; ss = A21 * (binv11 * binv22); abi22 = as22 * binv22 - ss * B12; pp = 0.5 * abi22; shift = s1; } else { as12 = A12 - s2 * B12; as11 = A11 - s2 * B11; ss = A21 * (binv11 * binv22); abi22 = -ss * B12; pp = 0.5 * (as11 * binv11 + abi22); shift = s2; } qq = ss * as12; if (fabs(pp * rtmin) >= 1.0) { discr = (rtmin * pp) * (rtmin * pp) + qq * safemin; r = sqrt(fabs(discr)) * rtmax; } else if (pp * pp + fabs(qq) <= safemin) { discr = (rtmax * pp) * (rtmax * pp) + qq * safemax; r = sqrt(fabs(discr)) * rtmin; } else { discr = pp * pp + qq; r = sqrt(fabs(discr)); } if (discr >= 0.0 || r == 0.0) { double sum = pp + GSL_SIGN(pp) * r; double diff = pp - GSL_SIGN(pp) * r; double wbig = shift + sum; double wsmall = shift + diff; /* compute smaller eigenvalue */ if (0.5 * fabs(wbig) > GSL_MAX(fabs(wsmall), safemin)) { double wdet = (A11*A22 - A12*A21) * (binv11 * binv22); wsmall = wdet / wbig; } /* choose (real) eigenvalue closest to 2,2 element of AB^{-1} for wr1 */ if (pp > abi22) { *wr1 = GSL_MIN(wbig, wsmall); *wr2 = GSL_MAX(wbig, wsmall); } else { *wr1 = GSL_MAX(wbig, wsmall); *wr2 = GSL_MIN(wbig, wsmall); } *wi = 0.0; } else { /* complex eigenvalues */ *wr1 = shift + pp; *wr2 = *wr1; *wi = r; } /* compute scaling */ { const double fuzzy1 = 1.0 + 1.0e-5; double c1, c2, c3, c4, c5; double wabs, wsize, wscale; c1 = bsize * (safemin * GSL_MAX(1.0, ascale)); c2 = safemin * GSL_MAX(1.0, bnorm); c3 = bsize * safemin; if (ascale <= 1.0 && bsize <= 1.0) c4 = GSL_MIN(1.0, (ascale / safemin) * bsize); else c4 = 1.0; if (ascale <= 1.0 || bsize <= 1.0) c5 = GSL_MIN(1.0, ascale * bsize); else c5 = 1.0; /* scale first eigenvalue */ wabs = fabs(*wr1) + fabs(*wi); wsize = GSL_MAX(safemin, GSL_MAX(c1, GSL_MAX(fuzzy1 * (wabs*c2 + c3), GSL_MIN(c4, 0.5 * GSL_MAX(wabs, c5))))); if (wsize != 1.0) { wscale = 1.0 / wsize; if (wsize > 1.0) { *scale1 = (GSL_MAX(ascale, bsize) * wscale) * GSL_MIN(ascale, bsize); } else { *scale1 = (GSL_MIN(ascale, bsize) * wscale) * GSL_MAX(ascale, bsize); } *wr1 *= wscale; if (*wi != 0.0) { *wi *= wscale; *wr2 = *wr1; *scale2 = *scale1; } } else { *scale1 = ascale * bsize; *scale2 = *scale1; } /* scale second eigenvalue if real */ if (*wi == 0.0) { wsize = GSL_MAX(safemin, GSL_MAX(c1, GSL_MAX(fuzzy1 * (fabs(*wr2) * c2 + c3), GSL_MIN(c4, 0.5 * GSL_MAX(fabs(*wr2), c5))))); if (wsize != 1.0) { wscale = 1.0 / wsize; if (wsize > 1.0) { *scale2 = (GSL_MAX(ascale, bsize) * wscale) * GSL_MIN(ascale, bsize); } else { *scale2 = (GSL_MIN(ascale, bsize) * wscale) * GSL_MAX(ascale, bsize); } *wr2 *= wscale; } else { *scale2 = ascale * bsize; } } } return GSL_SUCCESS; } /* gsl_schur_gen_eigvals() */ /* gsl_schur_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: (ca*A - z*D)*x = s*b where A is n-by-n with n = 1 or 2 D is a n-by-n diagonal matrix b and x are n-by-1 real vectors s is a scaling factor set by this function to prevent overflow in x Inputs: ca - coefficient multiplying A A - square matrix (n-by-n) z - real scalar (eigenvalue) d1 - (1,1) element in diagonal matrix D d2 - (2,2) element in diagonal matrix D 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 ca*A - z*D is less than this value, we'll use smin*I instead. This value should be a safe distance above underflow. Return: success Notes: 1) A and b are not changed on output 2) Based on lapack routine DLALN2 */ int gsl_schur_solve_equation(double ca, const gsl_matrix *A, double z, double d1, double d2, const 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 */ c = ca * gsl_matrix_get(A, 0, 0) - z * d1; 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_SCHUR_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: * * ( ca * [ A11 A12 ] - z * [ D1 0 ] ) [ x1 ] = [ b1 ] * ( [ A21 A22 ] [ 0 D2 ] ) [ x2 ] [ b2 ] * * (z real) */ crv = (double *) cr; /* * compute the real part of C = ca*A - z*D - use column ordering * here since porting from lapack */ cr[0][0] = ca * gsl_matrix_get(A, 0, 0) - z * d1; cr[1][1] = ca * gsl_matrix_get(A, 1, 1) - z * d2; cr[0][1] = ca * gsl_matrix_get(A, 1, 0); cr[1][0] = ca * 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_SCHUR_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 GSL_SUCCESS; } /* 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_SCHUR_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_SCHUR_BIGNUM / cmax) { temp = cmax / GSL_SCHUR_BIGNUM; gsl_blas_dscal(temp, x); *xnorm *= temp; scale *= temp; } } } /* if (N == 2) */ *s = scale; return GSL_SUCCESS; } /* gsl_schur_solve_equation() */ /* gsl_schur_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: (ca*A - z*D)*x = s*b where A is n-by-n with n = 1 or 2 D is a n-by-n diagonal matrix b and x are n-by-1 complex vectors s is a scaling factor set by this function to prevent overflow in x Inputs: ca - coefficient multiplying A A - square matrix (n-by-n) z - complex scalar (eigenvalue) d1 - (1,1) element in diagonal matrix D d2 - (2,2) element in diagonal matrix D 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 ca*A - z*D 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 */ int gsl_schur_solve_equation_z(double ca, const gsl_matrix *A, gsl_complex *z, double d1, double d2, const 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 */ /* c = ca*a - z*d1 */ cr = ca * gsl_matrix_get(A, 0, 0) - GSL_REAL(*z) * d1; ci = -GSL_IMAG(*z) * d1; 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_SCHUR_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: * * ( ca * [ A11 A12 ] - z * [ D1 0 ] ) [ X1 ] = [ B1 ] * ( [ A21 A22 ] [ 0 D2] ) [ X2 ] [ B2 ] * * (z complex) * * where the X and B values are complex. */ civ = (double *) ci; crv = (double *) cr; /* * compute the real part of C = ca*A - z*D - use column ordering * here since porting from lapack */ cr[0][0] = ca*gsl_matrix_get(A, 0, 0) - GSL_REAL(*z)*d1; cr[1][1] = ca*gsl_matrix_get(A, 1, 1) - GSL_REAL(*z)*d2; cr[0][1] = ca*gsl_matrix_get(A, 1, 0); cr[1][0] = ca*gsl_matrix_get(A, 0, 1); /* compute the imaginary part */ ci[0][0] = -GSL_IMAG(*z) * d1; ci[0][1] = 0.0; ci[1][0] = 0.0; ci[1][1] = -GSL_IMAG(*z) * d2; 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_SCHUR_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 GSL_SUCCESS; } /* 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_SCHUR_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_SCHUR_BIGNUM / cmax) { temp = cmax / GSL_SCHUR_BIGNUM; gsl_blas_zdscal(temp, x); *xnorm *= temp; scale *= temp; } } } /* if (N == 2) */ *s = scale; return GSL_SUCCESS; } /* gsl_schur_solve_equation_z() */ gsl-doc-2.3/eigen/sort.c0000644000175000017500000002357012753360514013217 0ustar eddedd/* eigen/sort.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 Gerard Jungman, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include /* Compares real parts of a and b and, if they are not approximately equal, * returns Re(a) < Re(b); otherwise returns Im(a) < Im(b). */ static int complex_less(gsl_complex a, gsl_complex b) { return gsl_fcmp(GSL_REAL(a), GSL_REAL(b), GSL_DBL_EPSILON) == 0 ? GSL_IMAG(a) < GSL_IMAG(b) : GSL_REAL(a) < GSL_REAL(b); } /* 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 && (evec->size1 != evec->size2)) { GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR); } else if (evec && (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: test = complex_less(ej, ek); break; case GSL_EIGEN_SORT_VAL_DESC: test = complex_less(ek, ej); break; 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 */ if (evec) gsl_matrix_complex_swap_columns (evec, i, k); } } return GSL_SUCCESS; } } int gsl_eigen_gensymmv_sort (gsl_vector * eval, gsl_matrix * evec, gsl_eigen_sort_t sort_type) { int s; s = gsl_eigen_symmv_sort(eval, evec, sort_type); return s; } int gsl_eigen_genhermv_sort (gsl_vector * eval, gsl_matrix_complex * evec, gsl_eigen_sort_t sort_type) { int s; s = gsl_eigen_hermv_sort(eval, evec, sort_type); return s; } int gsl_eigen_genv_sort (gsl_vector_complex * alpha, gsl_vector * beta, 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 (alpha->size != evec->size1 || beta->size != evec->size1) { GSL_ERROR ("eigenvalues must match eigenvector matrix", GSL_EBADLEN); } else { const size_t N = alpha->size; size_t i; for (i = 0; i < N - 1; i++) { size_t j; size_t k = i; gsl_complex ak = gsl_vector_complex_get (alpha, i); double bk = gsl_vector_get(beta, i); gsl_complex ek; if (bk < GSL_DBL_EPSILON) { GSL_SET_COMPLEX(&ek, GSL_SIGN(GSL_REAL(ak)) ? GSL_POSINF : GSL_NEGINF, GSL_SIGN(GSL_IMAG(ak)) ? GSL_POSINF : GSL_NEGINF); } else ek = gsl_complex_div_real(ak, bk); /* search for something to swap */ for (j = i + 1; j < N; j++) { int test; const gsl_complex aj = gsl_vector_complex_get (alpha, j); double bj = gsl_vector_get(beta, j); gsl_complex ej; if (bj < GSL_DBL_EPSILON) { GSL_SET_COMPLEX(&ej, GSL_SIGN(GSL_REAL(aj)) ? GSL_POSINF : GSL_NEGINF, GSL_SIGN(GSL_IMAG(aj)) ? GSL_POSINF : GSL_NEGINF); } else ej = gsl_complex_div_real(aj, bj); 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 (alpha, i, k); gsl_vector_swap_elements (beta, i, k); /* swap eigenvectors */ gsl_matrix_complex_swap_columns (evec, i, k); } } return GSL_SUCCESS; } } gsl-doc-2.3/eigen/gensymm.c0000664000175000017500000001250212761321274013701 0ustar eddedd/* eigen/gensymm.c * * Copyright (C) 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues of a real generalized * symmetric-definite eigensystem A x = \lambda B x, where A and * B are symmetric, and B is positive-definite. */ /* gsl_eigen_gensymm_alloc() Allocate a workspace for solving the generalized symmetric-definite eigenvalue problem. The size of this workspace is O(2n). Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_gensymm_workspace * gsl_eigen_gensymm_alloc(const size_t n) { gsl_eigen_gensymm_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_gensymm_workspace *) calloc (1, sizeof (gsl_eigen_gensymm_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->symm_workspace_p = gsl_eigen_symm_alloc(n); if (!w->symm_workspace_p) { gsl_eigen_gensymm_free(w); GSL_ERROR_NULL("failed to allocate space for symm workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_gensymm_alloc() */ /* gsl_eigen_gensymm_free() Free workspace w */ void gsl_eigen_gensymm_free (gsl_eigen_gensymm_workspace * w) { RETURN_IF_NULL (w); if (w->symm_workspace_p) gsl_eigen_symm_free(w->symm_workspace_p); free(w); } /* gsl_eigen_gensymm_free() */ /* gsl_eigen_gensymm() Solve the generalized symmetric-definite eigenvalue problem A x = \lambda B x for the eigenvalues \lambda. Inputs: A - real symmetric matrix B - real symmetric and positive definite matrix eval - where to store eigenvalues w - workspace Return: success or error */ int gsl_eigen_gensymm (gsl_matrix * A, gsl_matrix * B, gsl_vector * eval, gsl_eigen_gensymm_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } else if (eval->size != N) { GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN); } else if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } else { int s; /* compute Cholesky factorization of B */ s = gsl_linalg_cholesky_decomp1(B); if (s != GSL_SUCCESS) return s; /* B is not positive definite */ /* transform to standard symmetric eigenvalue problem */ gsl_eigen_gensymm_standardize(A, B); s = gsl_eigen_symm(A, eval, w->symm_workspace_p); return s; } } /* gsl_eigen_gensymm() */ /* gsl_eigen_gensymm_standardize() Reduce the generalized symmetric-definite eigenproblem to the standard symmetric eigenproblem by computing C = L^{-1} A L^{-t} where L L^t is the Cholesky decomposition of B Inputs: A - (input/output) real symmetric matrix B - real symmetric, positive definite matrix in Cholesky form Return: success Notes: A is overwritten by L^{-1} A L^{-t} */ int gsl_eigen_gensymm_standardize(gsl_matrix *A, const gsl_matrix *B) { const size_t N = A->size1; size_t i; double a, b, c; for (i = 0; i < N; ++i) { /* update lower triangle of A(i:n, i:n) */ a = gsl_matrix_get(A, i, i); b = gsl_matrix_get(B, i, i); a /= b * b; gsl_matrix_set(A, i, i, a); if (i < N - 1) { gsl_vector_view ai = gsl_matrix_subcolumn(A, i, i + 1, N - i - 1); gsl_matrix_view ma = gsl_matrix_submatrix(A, i + 1, i + 1, N - i - 1, N - i - 1); gsl_vector_const_view bi = gsl_matrix_const_subcolumn(B, i, i + 1, N - i - 1); gsl_matrix_const_view mb = gsl_matrix_const_submatrix(B, i + 1, i + 1, N - i - 1, N - i - 1); gsl_blas_dscal(1.0 / b, &ai.vector); c = -0.5 * a; gsl_blas_daxpy(c, &bi.vector, &ai.vector); gsl_blas_dsyr2(CblasLower, -1.0, &ai.vector, &bi.vector, &ma.matrix); gsl_blas_daxpy(c, &bi.vector, &ai.vector); gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasNonUnit, &mb.matrix, &ai.vector); } } return GSL_SUCCESS; } /* gsl_eigen_gensymm_standardize() */ gsl-doc-2.3/eigen/Makefile.in0000644000175000017500000010714113022372405014116 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 gensymm.lo gensymmv.lo genherm.lo \ genhermv.lo gen.lo genv.lo sort.lo francis.lo schur.lo libgsleigen_la_OBJECTS = $(am_libgsleigen_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 ../rng/libgslrng.la \ ../sort/libgslsort.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 gensymm.c gensymmv.c genherm.c genhermv.c gen.c genv.c sort.c francis.c schur.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = qrstep.c 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 ../rng/libgslrng.la ../sort/libgslsort.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu eigen/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsleigen.la: $(libgsleigen_la_OBJECTS) $(libgsleigen_la_DEPENDENCIES) $(EXTRA_libgsleigen_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsleigen_la_OBJECTS) $(libgsleigen_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/francis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genherm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genhermv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/herm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jacobi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schur.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/eigen/ChangeLog0000664000175000017500000001055412616157443013641 0ustar eddedd2011-03-27 Brian Gough * jacobi.c (norm): compute norm of off-diagonal elements only as per algorithm 8.4.3 in Golub and van Loan 2009-11-26 Brian Gough * qrstep.c (qrstep): handle the case where |mu| >> |d0| + |sd0| to prevent infinite loop 2009-07-09 Brian Gough * symmv.c (gsl_eigen_symmv_free): handle NULL argument in free * symm.c (gsl_eigen_symm_free): handle NULL argument in free * nonsymmv.c (gsl_eigen_nonsymmv_free): handle NULL argument in free * nonsymm.c (gsl_eigen_nonsymm_free): handle NULL argument in free * hermv.c (gsl_eigen_hermv_free): handle NULL argument in free * herm.c (gsl_eigen_herm_free): handle NULL argument in free * genv.c (gsl_eigen_genv_free): handle NULL argument in free * gensymmv.c (gsl_eigen_gensymmv_free): handle NULL argument in free * gensymm.c (gsl_eigen_gensymm_free): handle NULL argument in free * genhermv.c (gsl_eigen_genhermv_free): handle NULL argument in free * genherm.c (gsl_eigen_genherm_free): handle NULL argument in free * gen.c (gsl_eigen_gen_free): handle NULL argument in free * francis.c (gsl_eigen_francis_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-08-30 Brian Gough * test.c (test_eigen_symm): added new test case for underflow * qrstep.c (trailing_eigenvalue): handle underflow for small tab, also handle dt==0 directly. 2007-07-30 Brian Gough * testgen.c (main): use gsl_finite instead of finite 2006-09-14 Brian Gough * 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 * unsymm.c (gsl_eigen_unsymm): support for unsymmetric matrices (P.Alken) 2006-04-18 Brian Gough * test.c (test_eigenvalues): increase error bound 2006-03-26 Brian Gough * jacobi.c (gsl_eigen_invert_jacobi): use unsigned int for nrot consistently 2005-08-22 Brian Gough * test.c (test_eigenvalues): increased test tolerance 2004-12-03 Brian Gough * jacobi.c (gsl_eigen_jacobi): use algorithm from Golub and Van Loan (gsl_eigen_invert_jacobi): new code 2003-01-02 Brian Gough * 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 * 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 * 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 * Makefile.am (test_LDADD): fix link order to have libgslsys near end Thu Aug 2 18:17:58 2001 Brian Gough * 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 * modified to use new-style vector views Wed Jun 20 12:30:38 2001 Brian Gough * hermv.c (gsl_eigen_hermv): additional workspace argument no longer required Mon Apr 23 10:31:01 2001 Brian Gough * 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 * eigen/test.c (test_invert_jacobi): removed matmult and replaced by gsl_blas_dgemm gsl-doc-2.3/eigen/genherm.c0000664000175000017500000001345612616157443013664 0ustar eddedd/* eigen/genherm.c * * Copyright (C) 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* * This module computes the eigenvalues of a complex generalized * hermitian-definite eigensystem A x = \lambda B x, where A and * B are hermitian, and B is positive-definite. */ /* gsl_eigen_genherm_alloc() Allocate a workspace for solving the generalized hermitian-definite eigenvalue problem. The size of this workspace is O(3n). Inputs: n - size of matrices Return: pointer to workspace */ gsl_eigen_genherm_workspace * gsl_eigen_genherm_alloc(const size_t n) { gsl_eigen_genherm_workspace *w; if (n == 0) { GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL); } w = (gsl_eigen_genherm_workspace *) calloc (1, sizeof (gsl_eigen_genherm_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->size = n; w->herm_workspace_p = gsl_eigen_herm_alloc(n); if (!w->herm_workspace_p) { gsl_eigen_genherm_free(w); GSL_ERROR_NULL("failed to allocate space for herm workspace", GSL_ENOMEM); } return (w); } /* gsl_eigen_genherm_alloc() */ /* gsl_eigen_genherm_free() Free workspace w */ void gsl_eigen_genherm_free (gsl_eigen_genherm_workspace * w) { RETURN_IF_NULL (w); if (w->herm_workspace_p) gsl_eigen_herm_free(w->herm_workspace_p); free(w); } /* gsl_eigen_genherm_free() */ /* gsl_eigen_genherm() Solve the generalized hermitian-definite eigenvalue problem A x = \lambda B x for the eigenvalues \lambda. Inputs: A - complex hermitian matrix B - complex hermitian and positive definite matrix eval - where to store eigenvalues w - workspace Return: success or error */ int gsl_eigen_genherm (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * eval, gsl_eigen_genherm_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 ((N != B->size1) || (N != B->size2)) { GSL_ERROR ("B matrix dimensions must match A", GSL_EBADLEN); } else if (eval->size != N) { GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN); } else if (w->size != N) { GSL_ERROR ("matrix size does not match workspace", GSL_EBADLEN); } else { int s; /* compute Cholesky factorization of B */ s = gsl_linalg_complex_cholesky_decomp(B); if (s != GSL_SUCCESS) return s; /* B is not positive definite */ /* transform to standard hermitian eigenvalue problem */ gsl_eigen_genherm_standardize(A, B); s = gsl_eigen_herm(A, eval, w->herm_workspace_p); return s; } } /* gsl_eigen_genherm() */ /* gsl_eigen_genherm_standardize() Reduce the generalized hermitian-definite eigenproblem to the standard hermitian eigenproblem by computing C = L^{-1} A L^{-H} where L L^H is the Cholesky decomposition of B Inputs: A - (input/output) complex hermitian matrix B - complex hermitian, positive definite matrix in Cholesky form Return: success Notes: A is overwritten by L^{-1} A L^{-H} */ int gsl_eigen_genherm_standardize(gsl_matrix_complex *A, const gsl_matrix_complex *B) { const size_t N = A->size1; size_t i; double a, b; gsl_complex y, z; GSL_SET_IMAG(&z, 0.0); for (i = 0; i < N; ++i) { /* update lower triangle of A(i:n, i:n) */ y = gsl_matrix_complex_get(A, i, i); a = GSL_REAL(y); y = gsl_matrix_complex_get(B, i, i); b = GSL_REAL(y); a /= b * b; GSL_SET_REAL(&z, a); gsl_matrix_complex_set(A, i, i, z); if (i < N - 1) { gsl_vector_complex_view ai = gsl_matrix_complex_subcolumn(A, i, i + 1, N - i - 1); gsl_matrix_complex_view ma = gsl_matrix_complex_submatrix(A, i + 1, i + 1, N - i - 1, N - i - 1); gsl_vector_complex_const_view bi = gsl_matrix_complex_const_subcolumn(B, i, i + 1, N - i - 1); gsl_matrix_complex_const_view mb = gsl_matrix_complex_const_submatrix(B, i + 1, i + 1, N - i - 1, N - i - 1); gsl_blas_zdscal(1.0 / b, &ai.vector); GSL_SET_REAL(&z, -0.5 * a); gsl_blas_zaxpy(z, &bi.vector, &ai.vector); gsl_blas_zher2(CblasLower, GSL_COMPLEX_NEGONE, &ai.vector, &bi.vector, &ma.matrix); gsl_blas_zaxpy(z, &bi.vector, &ai.vector); gsl_blas_ztrsv(CblasLower, CblasNoTrans, CblasNonUnit, &mb.matrix, &ai.vector); } } return GSL_SUCCESS; } /* gsl_eigen_genherm_standardize() */ gsl-doc-2.3/eigen/symm.c0000644000175000017500000001134512737536472013224 0ustar eddedd/* eigen/symm.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* 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) { RETURN_IF_NULL (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 if (A->size1 != w->size) { GSL_ERROR ("matrix does not match workspace", 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; } } gsl-doc-2.3/eigen/qrstep.c0000664000175000017500000001045512616157443013551 0ustar eddedd/* eigen/qrstep.c * * Copyright (C) 2007, 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* remove off-diagonal elements which are neglegible compared with the neighboring diagonal elements */ 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 if (dt == 0) { mu = tb - fabs(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); /* If mu is large relative to d_0 and sd_0 then the Givens rotation will have no effect, leading to an infinite loop. We set mu to zero in this case, which at least diagonalises the submatrix [d_0, sd_0 ; sd_0, d_0] and allows further progress. */ if (GSL_DBL_EPSILON * fabs(mu) > (fabs(d[0]) + fabs(sd[0]))) { mu = 0; } 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; } gsl-doc-2.3/eigen/nonsymm.c0000664000175000017500000001574112616157443013736 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* * 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 *) calloc (1, 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_eigen_nonsymm_free(w); GSL_ERROR_NULL ("failed to allocate space for balancing vector", GSL_ENOMEM); } w->tau = gsl_vector_alloc(n); if (w->tau == 0) { gsl_eigen_nonsymm_free(w); 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_eigen_nonsymm_free(w); 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) { RETURN_IF_NULL (w); if (w->tau) gsl_vector_free(w->tau); if (w->diag) gsl_vector_free(w->diag); if (w->francis_workspace_p) 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_decomp(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() */ gsl-doc-2.3/eigen/hermv.c0000664000175000017500000001571212616157443013355 0ustar eddedd/* eigen/hermv.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* 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) { RETURN_IF_NULL (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; } } gsl-doc-2.3/eigen/test.c0000644000175000017500000012112512753360375013207 0ustar eddedd/* eigen/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 Gerard Jungman, Patrick Alken, Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /****************************************** * common test code * ******************************************/ double chop_subnormals (double x) { /* Chop any subnormal values */ return fabs(x) < GSL_DBL_MIN ? 0 : x; } void create_random_symm_matrix(gsl_matrix *m, gsl_rng *r, int lower, int upper) { size_t i, j; for (i = 0; i < m->size1; ++i) { for (j = i; j < m->size2; ++j) { double x = gsl_rng_uniform(r) * (upper - lower) + lower; gsl_matrix_set(m, i, j, x); gsl_matrix_set(m, j, i, x); } } } /* create_random_symm_matrix() */ void create_random_herm_matrix(gsl_matrix_complex *m, gsl_rng *r, int lower, int upper) { size_t i, j; for (i = 0; i < m->size1; ++i) { for (j = i; j < m->size2; ++j) { gsl_complex z; GSL_REAL(z) = gsl_rng_uniform(r) * (upper - lower) + lower; if (i == j) GSL_IMAG(z) = 0.0; else GSL_IMAG(z) = gsl_rng_uniform(r) * (upper - lower) + lower; gsl_matrix_complex_set(m, i, j, z); gsl_matrix_complex_set(m, j, i, gsl_complex_conjugate(z)); } } } /* create_random_herm_matrix() */ /* with r \in (0,1) if m_{ij} = r^{|i - j|} then m is positive definite */ void create_random_posdef_matrix(gsl_matrix *m, gsl_rng *r) { size_t i, j; double x = gsl_rng_uniform(r); for (i = 0; i < m->size1; ++i) { for (j = i; j < m->size2; ++j) { double a = pow(x, (double) (j - i)); gsl_matrix_set(m, i, j, a); gsl_matrix_set(m, j, i, a); } } } /* create_random_posdef_matrix() */ void create_random_complex_posdef_matrix(gsl_matrix_complex *m, gsl_rng *r, gsl_vector_complex *work) { const size_t N = m->size1; size_t i, j; double x, y; gsl_complex z; gsl_complex tau; GSL_SET_IMAG(&z, 0.0); /* make a positive diagonal matrix */ gsl_matrix_complex_set_zero(m); for (i = 0; i < N; ++i) { x = gsl_rng_uniform(r); GSL_SET_REAL(&z, x); gsl_matrix_complex_set(m, i, i, z); } /* now generate random householder reflections and form P D P^H */ for (i = 0; i < N; ++i) { /* form complex vector */ for (j = 0; j < N; ++j) { x = 2.0 * gsl_rng_uniform(r) - 1.0; y = 2.0 * gsl_rng_uniform(r) - 1.0; GSL_SET_COMPLEX(&z, x, y); gsl_vector_complex_set(work, j, z); } tau = gsl_linalg_complex_householder_transform(work); gsl_linalg_complex_householder_hm(tau, work, m); gsl_linalg_complex_householder_mh(gsl_complex_conjugate(tau), work, m); } } /* create_random_complex_posdef_matrix() */ void create_random_nonsymm_matrix(gsl_matrix *m, gsl_rng *r, int lower, int upper) { size_t i, j; for (i = 0; i < m->size1; ++i) { for (j = 0; j < m->size2; ++j) { gsl_matrix_set(m, i, j, gsl_rng_uniform(r) * (upper - lower) + lower); } } } /* create_random_nonsymm_matrix() */ /* test if A Z = Q S */ void test_eigen_schur(const gsl_matrix * A, const gsl_matrix * S, const gsl_matrix * Q, const gsl_matrix * Z, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; size_t i, j; gsl_matrix * T1 = gsl_matrix_alloc(N, N); gsl_matrix * T2 = gsl_matrix_alloc(N, N); /* compute T1 = A Z */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, A, Z, 0.0, T1); /* compute T2 = Q S */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, Q, S, 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_abs(x, y, 1.0e8 * GSL_DBL_EPSILON, "%s(N=%u,cnt=%u), %s, schur(%d,%d)", desc, N, count, desc2, i, j); } } gsl_matrix_free (T1); gsl_matrix_free (T2); } /* test_eigen_schur() */ /* test if A is orthogonal */ int test_eigen_orthog(gsl_matrix *A, size_t count, const char *desc, const char *desc2) { size_t N = A->size1; gsl_matrix *M = gsl_matrix_alloc(A->size1, A->size2); size_t i, j; gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, A, A, 0.0, M); for (i = 0; i < A->size1; ++i) { for (j = 0; j < A->size2; ++j) { double val; double mij = gsl_matrix_get(M, i, j); if (i == j) val = 1.0; else val = 0.0; gsl_test_abs(mij, val, 1.0e8 * GSL_DBL_EPSILON, "%s(N=%u,cnt=%u), %s, orthog(%d,%d)", desc, N, count, desc2, i, j); } } gsl_matrix_free(M); return 1; } /* test_eigen_orthog() */ void test_eigenvalues_real (const gsl_vector *eval, const gsl_vector * eval2, const char * desc, const char * desc2) { const size_t N = eval->size; size_t i; double emax = 0; /* check eigenvalues */ for (i = 0; i < N; i++) { double ei = gsl_vector_get (eval, i); if (fabs(ei) > emax) emax = fabs(ei); } for (i = 0; i < N; i++) { double ei = gsl_vector_get (eval, i); double e2i = gsl_vector_get (eval2, i); e2i = chop_subnormals(e2i); gsl_test_abs(ei, e2i, emax * 1e8 * GSL_DBL_EPSILON, "%s, direct eigenvalue(%d), %s", desc, i, desc2); } } void test_eigenvalues_complex (const gsl_vector_complex * eval, const gsl_vector_complex * eval2, const char * desc, const char * desc2) { const size_t N = eval->size; 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); } } /****************************************** * symm test code * ******************************************/ void test_eigen_symm_results (const gsl_matrix * A, const gsl_vector * eval, const gsl_matrix * evec, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; size_t i, j; double emax = 0; 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); if (fabs(ei) > emax) emax = fabs(ei); } 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 = A x (should = lambda v) */ gsl_blas_dgemv (CblasNoTrans, 1.0, A, x, 0.0, y); for (j = 0; j < N; j++) { double xj = gsl_vector_get (x, j); double yj = gsl_vector_get (y, j); double eixj = chop_subnormals(ei * xj); gsl_test_abs(yj, eixj, emax * 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_eigen_symm_matrix(const gsl_matrix * m, size_t count, const char * desc) { const size_t N = m->size1; gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_vector * eval = gsl_vector_alloc(N); gsl_vector * evalv = gsl_vector_alloc(N); gsl_vector * x = gsl_vector_alloc(N); gsl_vector * y = gsl_vector_alloc(N); gsl_matrix * evec = gsl_matrix_alloc(N, N); gsl_eigen_symm_workspace * w = gsl_eigen_symm_alloc(N); gsl_eigen_symmv_workspace * wv = gsl_eigen_symmv_alloc(N); gsl_matrix_memcpy(A, m); gsl_eigen_symmv(A, evalv, evec, wv); test_eigen_symm_results(m, evalv, evec, count, desc, "unsorted"); gsl_matrix_memcpy(A, m); gsl_eigen_symm(A, eval, w); /* sort eval and evalv */ gsl_vector_memcpy(x, eval); gsl_vector_memcpy(y, evalv); gsl_sort_vector(x); gsl_sort_vector(y); test_eigenvalues_real(y, x, desc, "unsorted"); gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_ASC); test_eigen_symm_results(m, evalv, evec, count, desc, "val/asc"); gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_DESC); test_eigen_symm_results(m, evalv, evec, count, desc, "val/desc"); gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_symm_results(m, evalv, evec, count, desc, "abs/asc"); gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_symm_results(m, evalv, evec, count, desc, "abs/desc"); gsl_matrix_free(A); gsl_vector_free(eval); gsl_vector_free(evalv); gsl_vector_free(x); gsl_vector_free(y); gsl_matrix_free(evec); gsl_eigen_symm_free(w); gsl_eigen_symmv_free(wv); } /* test_eigen_symm_matrix() */ void test_eigen_symm(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix * A = gsl_matrix_alloc(n, n); for (i = 0; i < 5; ++i) { create_random_symm_matrix(A, r, -10, 10); test_eigen_symm_matrix(A, i, "symm random"); } gsl_matrix_free(A); } gsl_rng_free(r); { double dat1[] = { 0, 0, -1, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 1, 0, 0 }; double dat2[] = { 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4 }; gsl_matrix_view m; m = gsl_matrix_view_array (dat1, 4, 4); test_eigen_symm_matrix(&m.matrix, 0, "symm(4)"); m = gsl_matrix_view_array (dat2, 4, 4); test_eigen_symm_matrix(&m.matrix, 0, "symm(4) diag"); } { double dat[27*27] = { 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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, 0,0,1,0,1,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,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,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,1,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,1,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,1,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,1,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 }; gsl_matrix_view m; m = gsl_matrix_view_array (dat, 27, 27); test_eigen_symm_matrix(&m.matrix, 0, "symm(27)"); }; } /* test_eigen_symm() */ /****************************************** * herm test code * ******************************************/ void test_eigen_herm_results (const gsl_matrix_complex * A, const gsl_vector * eval, const gsl_matrix_complex * evec, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; 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, A, 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, 10.0 * N * GSL_DBL_EPSILON, "%s, orthogonal(%d,%d), %s", desc, i, j, desc2); } } gsl_vector_complex_free(x); gsl_vector_complex_free(y); } /* test_eigen_herm_results() */ void test_eigen_herm_matrix(const gsl_matrix_complex * m, size_t count, const char * desc) { const size_t N = m->size1; gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N); gsl_vector * eval = gsl_vector_alloc(N); gsl_vector * evalv = gsl_vector_alloc(N); gsl_vector * x = gsl_vector_alloc(N); gsl_vector * y = gsl_vector_alloc(N); gsl_matrix_complex * evec = gsl_matrix_complex_alloc(N, N); gsl_eigen_herm_workspace * w = gsl_eigen_herm_alloc(N); gsl_eigen_hermv_workspace * wv = gsl_eigen_hermv_alloc(N); gsl_matrix_complex_memcpy(A, m); gsl_eigen_hermv(A, evalv, evec, wv); test_eigen_herm_results(m, evalv, evec, count, desc, "unsorted"); gsl_matrix_complex_memcpy(A, m); gsl_eigen_herm(A, eval, w); /* sort eval and evalv */ gsl_vector_memcpy(x, eval); gsl_vector_memcpy(y, evalv); gsl_sort_vector(x); gsl_sort_vector(y); test_eigenvalues_real(y, x, desc, "unsorted"); gsl_eigen_hermv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_ASC); test_eigen_herm_results(m, evalv, evec, count, desc, "val/asc"); gsl_eigen_hermv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_DESC); test_eigen_herm_results(m, evalv, evec, count, desc, "val/desc"); gsl_eigen_hermv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_herm_results(m, evalv, evec, count, desc, "abs/asc"); gsl_eigen_hermv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_herm_results(m, evalv, evec, count, desc, "abs/desc"); gsl_matrix_complex_free(A); gsl_vector_free(eval); gsl_vector_free(evalv); gsl_vector_free(x); gsl_vector_free(y); gsl_matrix_complex_free(evec); gsl_eigen_herm_free(w); gsl_eigen_hermv_free(wv); } /* test_eigen_herm_matrix() */ void test_eigen_herm(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(n, n); for (i = 0; i < 5; ++i) { create_random_herm_matrix(A, r, -10, 10); test_eigen_herm_matrix(A, i, "herm random"); } gsl_matrix_complex_free(A); } gsl_rng_free(r); { double dat1[] = { 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 }; double dat2[] = { 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 m; m = gsl_matrix_complex_view_array (dat1, 4, 4); test_eigen_herm_matrix(&m.matrix, 0, "herm(4)"); m = gsl_matrix_complex_view_array (dat2, 4, 4); test_eigen_herm_matrix(&m.matrix, 1, "herm(4) diag"); } } /* test_eigen_herm() */ /****************************************** * nonsymm test code * ******************************************/ void test_eigen_nonsymm_results (const gsl_matrix * m, const gsl_vector_complex * eval, const gsl_matrix_complex * evec, size_t count, const char * desc, const char * desc2) { size_t i,j; size_t N = m->size1; 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, "nonsymm(N=%u,cnt=%u), %s, normalized(%d), %s", N, count, 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, "nonsymm(N=%u,cnt=%u), %s, eigenvalue(%d,%d), real, %s", N, count, desc, i, j, desc2); gsl_test_abs(GSL_IMAG(yj), GSL_IMAG(xj), 1e8*GSL_DBL_EPSILON, "nonsymm(N=%u,cnt=%u), %s, eigenvalue(%d,%d), imag, %s", N, count, desc, i, j, desc2); } } gsl_matrix_complex_free(A); gsl_vector_complex_free(x); gsl_vector_complex_free(y); } void test_eigen_nonsymm_matrix(const gsl_matrix * m, size_t count, const char * desc, gsl_eigen_nonsymmv_workspace *w) { const 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); /* * 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, w); test_eigen_nonsymm_results (m, eval, evec, count, desc, "unsorted"); /* test sort routines */ gsl_eigen_nonsymmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_nonsymm_results (m, eval, evec, count, desc, "abs/asc"); gsl_eigen_nonsymmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_nonsymm_results (m, eval, evec, count, desc, "abs/desc"); /* test Schur vectors */ gsl_matrix_memcpy(A, m); gsl_eigen_nonsymmv_Z(A, eval, evec, Z, w); gsl_linalg_hessenberg_set_zero(A); test_eigen_schur(m, A, Z, Z, count, "nonsymm", desc); /* test if Z is an orthogonal matrix */ if (w->nonsymm_workspace_p->do_balance == 0) test_eigen_orthog(Z, count, "nonsymm", desc); gsl_matrix_free(A); gsl_matrix_free(Z); gsl_matrix_complex_free(evec); gsl_vector_complex_free(eval); } void test_eigen_nonsymm(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix * m = gsl_matrix_alloc(n, n); gsl_eigen_nonsymmv_workspace * w = gsl_eigen_nonsymmv_alloc(n); for (i = 0; i < 5; ++i) { create_random_nonsymm_matrix(m, r, -10, 10); gsl_eigen_nonsymmv_params(0, w); test_eigen_nonsymm_matrix(m, i, "random, unbalanced", w); gsl_eigen_nonsymmv_params(1, w); test_eigen_nonsymm_matrix(m, i, "random, balanced", w); } gsl_matrix_free(m); gsl_eigen_nonsymmv_free(w); } gsl_rng_free(r); { double dat1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; double dat2[] = { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0 }; gsl_matrix_view v; gsl_eigen_nonsymmv_workspace * w = gsl_eigen_nonsymmv_alloc(4); v = gsl_matrix_view_array (dat1, 4, 4); test_eigen_nonsymm_matrix(&v.matrix, 0, "integer", w); v = gsl_matrix_view_array (dat2, 4, 4); test_eigen_nonsymm_matrix(&v.matrix, 1, "integer", w); gsl_eigen_nonsymmv_free(w); } } /* test_eigen_nonsymm() */ /****************************************** * gensymm test code * ******************************************/ void test_eigen_gensymm_results (const gsl_matrix * A, const gsl_matrix * B, const gsl_vector * eval, const gsl_matrix * evec, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; size_t i, j; gsl_vector * x = gsl_vector_alloc(N); gsl_vector * y = gsl_vector_alloc(N); gsl_vector * z = gsl_vector_alloc(N); /* check A v = lambda B v */ for (i = 0; i < N; i++) { double ei = gsl_vector_get (eval, i); gsl_vector_const_view vi = gsl_matrix_const_column(evec, i); double norm = gsl_blas_dnrm2(&vi.vector); /* check that eigenvector is normalized */ gsl_test_rel(norm, 1.0, N * GSL_DBL_EPSILON, "gensymm(N=%u,cnt=%u), %s, normalized(%d), %s", N, count, desc, i, desc2); gsl_vector_memcpy(z, &vi.vector); /* compute y = A z */ gsl_blas_dgemv (CblasNoTrans, 1.0, A, z, 0.0, y); /* compute x = B z */ gsl_blas_dgemv (CblasNoTrans, 1.0, B, z, 0.0, x); /* compute x = lambda B z */ gsl_blas_dscal(ei, x); /* now test if y = x */ for (j = 0; j < N; j++) { double xj = gsl_vector_get (x, j); double yj = gsl_vector_get (y, j); gsl_test_rel(yj, xj, 1e9 * GSL_DBL_EPSILON, "gensymm(N=%u,cnt=%u), %s, eigenvalue(%d,%d), real, %s", N, count, desc, i, j, desc2); } } gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } void test_eigen_gensymm(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix * A = gsl_matrix_alloc(n, n); gsl_matrix * B = gsl_matrix_alloc(n, n); gsl_matrix * ma = gsl_matrix_alloc(n, n); gsl_matrix * mb = gsl_matrix_alloc(n, n); gsl_vector * eval = gsl_vector_alloc(n); gsl_vector * evalv = gsl_vector_alloc(n); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_matrix * evec = gsl_matrix_alloc(n, n); gsl_eigen_gensymm_workspace * w = gsl_eigen_gensymm_alloc(n); gsl_eigen_gensymmv_workspace * wv = gsl_eigen_gensymmv_alloc(n); for (i = 0; i < 5; ++i) { create_random_symm_matrix(A, r, -10, 10); create_random_posdef_matrix(B, r); gsl_matrix_memcpy(ma, A); gsl_matrix_memcpy(mb, B); gsl_eigen_gensymmv(ma, mb, evalv, evec, wv); test_eigen_gensymm_results(A, B, evalv, evec, i, "random", "unsorted"); gsl_matrix_memcpy(ma, A); gsl_matrix_memcpy(mb, B); gsl_eigen_gensymm(ma, mb, eval, w); /* eval and evalv have to be sorted? not sure why */ gsl_vector_memcpy(x, eval); gsl_vector_memcpy(y, evalv); gsl_sort_vector(x); gsl_sort_vector(y); test_eigenvalues_real(y, x, "gensymm, random", "unsorted"); gsl_eigen_gensymmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_ASC); test_eigen_gensymm_results(A, B, evalv, evec, i, "random", "val/asc"); gsl_eigen_gensymmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_DESC); test_eigen_gensymm_results(A, B, evalv, evec, i, "random", "val/desc"); gsl_eigen_gensymmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_gensymm_results(A, B, evalv, evec, i, "random", "abs/asc"); gsl_eigen_gensymmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_gensymm_results(A, B, evalv, evec, i, "random", "abs/desc"); } gsl_matrix_free(A); gsl_matrix_free(B); gsl_matrix_free(ma); gsl_matrix_free(mb); gsl_vector_free(eval); gsl_vector_free(evalv); gsl_vector_free(x); gsl_vector_free(y); gsl_matrix_free(evec); gsl_eigen_gensymm_free(w); gsl_eigen_gensymmv_free(wv); } gsl_rng_free(r); } /* test_eigen_gensymm() */ /****************************************** * genherm test code * ******************************************/ void test_eigen_genherm_results (const gsl_matrix_complex * A, const gsl_matrix_complex * B, const gsl_vector * eval, const gsl_matrix_complex * evec, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; size_t i, j; gsl_vector_complex * x = gsl_vector_complex_alloc(N); gsl_vector_complex * y = gsl_vector_complex_alloc(N); /* check A v = lambda B v */ 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); double norm = gsl_blas_dznrm2(&vi.vector); /* check that eigenvector is normalized */ gsl_test_rel(norm, 1.0, N * GSL_DBL_EPSILON, "genherm(N=%u,cnt=%u), %s, normalized(%d), %s", N, count, desc, i, desc2); /* compute y = A z */ gsl_blas_zgemv (CblasNoTrans, GSL_COMPLEX_ONE, A, &vi.vector, GSL_COMPLEX_ZERO, y); /* compute x = B z */ gsl_blas_zgemv (CblasNoTrans, GSL_COMPLEX_ONE, B, &vi.vector, GSL_COMPLEX_ZERO, x); /* compute x = lambda B z */ gsl_blas_zdscal(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); gsl_test_rel(GSL_REAL(yj), GSL_REAL(xj), 1e9 * GSL_DBL_EPSILON, "genherm(N=%u,cnt=%u), %s, eigenvalue(%d,%d), real, %s", N, count, desc, i, j, desc2); gsl_test_abs(GSL_IMAG(yj), GSL_IMAG(xj), 1e9 * GSL_DBL_EPSILON, "genherm(N=%u,cnt=%u), %s, eigenvalue(%d,%d), imag, %s", N, count, desc, i, j, desc2); } } gsl_vector_complex_free(x); gsl_vector_complex_free(y); } void test_eigen_genherm(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(n, n); gsl_matrix_complex * B = gsl_matrix_complex_alloc(n, n); gsl_matrix_complex * ma = gsl_matrix_complex_alloc(n, n); gsl_matrix_complex * mb = gsl_matrix_complex_alloc(n, n); gsl_vector * eval = gsl_vector_alloc(n); gsl_vector * evalv = gsl_vector_alloc(n); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector_complex * work = gsl_vector_complex_alloc(n); gsl_matrix_complex * evec = gsl_matrix_complex_alloc(n, n); gsl_eigen_genherm_workspace * w = gsl_eigen_genherm_alloc(n); gsl_eigen_genhermv_workspace * wv = gsl_eigen_genhermv_alloc(n); for (i = 0; i < 5; ++i) { create_random_herm_matrix(A, r, -10, 10); create_random_complex_posdef_matrix(B, r, work); gsl_matrix_complex_memcpy(ma, A); gsl_matrix_complex_memcpy(mb, B); gsl_eigen_genhermv(ma, mb, evalv, evec, wv); test_eigen_genherm_results(A, B, evalv, evec, i, "random", "unsorted"); gsl_matrix_complex_memcpy(ma, A); gsl_matrix_complex_memcpy(mb, B); gsl_eigen_genherm(ma, mb, eval, w); /* eval and evalv have to be sorted? not sure why */ gsl_vector_memcpy(x, eval); gsl_vector_memcpy(y, evalv); gsl_sort_vector(x); gsl_sort_vector(y); test_eigenvalues_real(y, x, "genherm, random", "unsorted"); gsl_eigen_genhermv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_ASC); test_eigen_genherm_results(A, B, evalv, evec, i, "random", "val/asc"); gsl_eigen_genhermv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_DESC); test_eigen_genherm_results(A, B, evalv, evec, i, "random", "val/desc"); gsl_eigen_genhermv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_genherm_results(A, B, evalv, evec, i, "random", "abs/asc"); gsl_eigen_genhermv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_genherm_results(A, B, evalv, evec, i, "random", "abs/desc"); } gsl_matrix_complex_free(A); gsl_matrix_complex_free(B); gsl_matrix_complex_free(ma); gsl_matrix_complex_free(mb); gsl_vector_free(eval); gsl_vector_free(evalv); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_complex_free(work); gsl_matrix_complex_free(evec); gsl_eigen_genherm_free(w); gsl_eigen_genhermv_free(wv); } gsl_rng_free(r); } /* test_eigen_genherm() */ /****************************************** * gen test code * ******************************************/ typedef struct { gsl_matrix *A; gsl_matrix *B; gsl_vector_complex *alpha; gsl_vector *beta; gsl_vector_complex *alphav; gsl_vector *betav; gsl_vector_complex *eval; gsl_vector_complex *evalv; gsl_vector *x; gsl_vector *y; gsl_matrix *Q; gsl_matrix *Z; gsl_matrix_complex *evec; gsl_eigen_gen_workspace *gen_p; gsl_eigen_genv_workspace *genv_p; } test_eigen_gen_workspace; test_eigen_gen_workspace * test_eigen_gen_alloc(const size_t n) { test_eigen_gen_workspace *w; w = (test_eigen_gen_workspace *) calloc(1, sizeof(test_eigen_gen_workspace)); w->A = gsl_matrix_alloc(n, n); w->B = gsl_matrix_alloc(n, n); w->alpha = gsl_vector_complex_alloc(n); w->beta = gsl_vector_alloc(n); w->alphav = gsl_vector_complex_alloc(n); w->betav = gsl_vector_alloc(n); w->eval = gsl_vector_complex_alloc(n); w->evalv = gsl_vector_complex_alloc(n); w->x = gsl_vector_alloc(n); w->y = gsl_vector_alloc(n); w->Q = gsl_matrix_alloc(n, n); w->Z = gsl_matrix_alloc(n, n); w->evec = gsl_matrix_complex_alloc(n, n); w->gen_p = gsl_eigen_gen_alloc(n); w->genv_p = gsl_eigen_genv_alloc(n); return (w); } /* test_eigen_gen_alloc() */ void test_eigen_gen_free(test_eigen_gen_workspace *w) { gsl_matrix_free(w->A); gsl_matrix_free(w->B); gsl_vector_complex_free(w->alpha); gsl_vector_free(w->beta); gsl_vector_complex_free(w->alphav); gsl_vector_free(w->betav); gsl_vector_complex_free(w->eval); gsl_vector_complex_free(w->evalv); gsl_vector_free(w->x); gsl_vector_free(w->y); gsl_matrix_free(w->Q); gsl_matrix_free(w->Z); gsl_matrix_complex_free(w->evec); gsl_eigen_gen_free(w->gen_p); gsl_eigen_genv_free(w->genv_p); free(w); } /* test_eigen_gen_free() */ void test_eigen_gen_results (const gsl_matrix * A, const gsl_matrix * B, const gsl_vector_complex * alpha, const gsl_vector * beta, const gsl_matrix_complex * evec, size_t count, const char * desc, const char * desc2) { const size_t N = A->size1; size_t i, j; gsl_matrix_complex *ma, *mb; gsl_vector_complex *x, *y; gsl_complex z_one, z_zero; ma = gsl_matrix_complex_alloc(N, N); mb = gsl_matrix_complex_alloc(N, N); y = gsl_vector_complex_alloc(N); x = gsl_vector_complex_alloc(N); /* ma <- A, mb <- B */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { gsl_complex z; GSL_SET_COMPLEX(&z, gsl_matrix_get(A, i, j), 0.0); gsl_matrix_complex_set(ma, i, j, z); GSL_SET_COMPLEX(&z, gsl_matrix_get(B, i, j), 0.0); gsl_matrix_complex_set(mb, i, j, z); } } GSL_SET_COMPLEX(&z_one, 1.0, 0.0); GSL_SET_COMPLEX(&z_zero, 0.0, 0.0); /* check eigenvalues */ for (i = 0; i < N; ++i) { gsl_vector_complex_const_view vi = gsl_matrix_complex_const_column(evec, i); gsl_complex ai = gsl_vector_complex_get(alpha, i); double bi = gsl_vector_get(beta, i); /* compute x = alpha * B * v */ gsl_blas_zgemv(CblasNoTrans, z_one, mb, &vi.vector, z_zero, x); gsl_blas_zscal(ai, x); /* compute y = beta * A v */ gsl_blas_zgemv(CblasNoTrans, z_one, ma, &vi.vector, z_zero, y); gsl_blas_zdscal(bi, y); /* 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); gsl_test_abs(GSL_REAL(yj), GSL_REAL(xj), 1e8*GSL_DBL_EPSILON, "gen(N=%u,cnt=%u), %s, eigenvalue(%d,%d), real, %s", N, count, desc, i, j, desc2); gsl_test_abs(GSL_IMAG(yj), GSL_IMAG(xj), 1e8*GSL_DBL_EPSILON, "gen(N=%u,cnt=%u), %s, eigenvalue(%d,%d), real, %s", N, count, desc, i, j, desc2); } } gsl_matrix_complex_free(ma); gsl_matrix_complex_free(mb); gsl_vector_complex_free(y); gsl_vector_complex_free(x); } /* test_eigen_gen_results() */ void test_eigen_gen_pencil(const gsl_matrix * A, const gsl_matrix * B, size_t count, const char * desc, int test_schur, test_eigen_gen_workspace *w) { const size_t N = A->size1; size_t i; gsl_matrix_memcpy(w->A, A); gsl_matrix_memcpy(w->B, B); if (test_schur) { gsl_eigen_genv_QZ(w->A, w->B, w->alphav, w->betav, w->evec, w->Q, w->Z, w->genv_p); test_eigen_schur(A, w->A, w->Q, w->Z, count, "genv/A", desc); test_eigen_schur(B, w->B, w->Q, w->Z, count, "genv/B", desc); } else gsl_eigen_genv(w->A, w->B, w->alphav, w->betav, w->evec, w->genv_p); test_eigen_gen_results(A, B, w->alphav, w->betav, w->evec, count, desc, "unsorted"); gsl_matrix_memcpy(w->A, A); gsl_matrix_memcpy(w->B, B); if (test_schur) { gsl_eigen_gen_params(1, 1, 0, w->gen_p); gsl_eigen_gen_QZ(w->A, w->B, w->alpha, w->beta, w->Q, w->Z, w->gen_p); test_eigen_schur(A, w->A, w->Q, w->Z, count, "gen/A", desc); test_eigen_schur(B, w->B, w->Q, w->Z, count, "gen/B", desc); } else { gsl_eigen_gen_params(0, 0, 0, w->gen_p); gsl_eigen_gen(w->A, w->B, w->alpha, w->beta, w->gen_p); } /* compute eval = alpha / beta values */ for (i = 0; i < N; ++i) { gsl_complex z, ai; double bi; ai = gsl_vector_complex_get(w->alpha, i); bi = gsl_vector_get(w->beta, i); GSL_SET_COMPLEX(&z, GSL_REAL(ai) / bi, GSL_IMAG(ai) / bi); gsl_vector_complex_set(w->eval, i, z); ai = gsl_vector_complex_get(w->alphav, i); bi = gsl_vector_get(w->betav, i); GSL_SET_COMPLEX(&z, GSL_REAL(ai) / bi, GSL_IMAG(ai) / bi); gsl_vector_complex_set(w->evalv, i, z); } /* sort eval and evalv and test them */ gsl_eigen_nonsymmv_sort(w->eval, NULL, GSL_EIGEN_SORT_VAL_ASC); gsl_eigen_nonsymmv_sort(w->evalv, NULL, GSL_EIGEN_SORT_VAL_ASC); test_eigenvalues_complex(w->evalv, w->eval, "gen", desc); gsl_eigen_genv_sort(w->alphav, w->betav, w->evec, GSL_EIGEN_SORT_ABS_ASC); test_eigen_gen_results(A, B, w->alphav, w->betav, w->evec, count, desc, "abs/asc"); gsl_eigen_genv_sort(w->alphav, w->betav, w->evec, GSL_EIGEN_SORT_ABS_DESC); test_eigen_gen_results(A, B, w->alphav, w->betav, w->evec, count, desc, "abs/desc"); } /* test_eigen_gen_pencil() */ void test_eigen_gen(void) { size_t N_max = 20; size_t n, i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (n = 1; n <= N_max; ++n) { gsl_matrix * A = gsl_matrix_alloc(n, n); gsl_matrix * B = gsl_matrix_alloc(n, n); test_eigen_gen_workspace * w = test_eigen_gen_alloc(n); for (i = 0; i < 5; ++i) { create_random_nonsymm_matrix(A, r, -10, 10); create_random_nonsymm_matrix(B, r, -10, 10); test_eigen_gen_pencil(A, B, i, "random", 0, w); test_eigen_gen_pencil(A, B, i, "random", 1, w); } gsl_matrix_free(A); gsl_matrix_free(B); test_eigen_gen_free(w); } gsl_rng_free(r); /* this system will test the exceptional shift code */ { double datA[] = { 1, 1, 0, 0, 0, -1, 1, 0, 0 }; double datB[] = { -1, 0, -1, 0, -1, 0, 0, 0, -1 }; gsl_matrix_view va = gsl_matrix_view_array (datA, 3, 3); gsl_matrix_view vb = gsl_matrix_view_array (datB, 3, 3); test_eigen_gen_workspace * w = test_eigen_gen_alloc(3); test_eigen_gen_pencil(&va.matrix, &vb.matrix, 0, "integer", 0, w); test_eigen_gen_pencil(&va.matrix, &vb.matrix, 0, "integer", 1, w); test_eigen_gen_free(w); } } /* test_eigen_gen() */ int main() { gsl_ieee_env_setup (); gsl_rng_env_setup (); test_eigen_symm(); test_eigen_herm(); test_eigen_nonsymm(); test_eigen_gensymm(); test_eigen_genherm(); test_eigen_gen(); exit (gsl_test_summary()); } gsl-doc-2.3/gsl_machine.h0000664000175000017500000000733512616157443013425 0ustar eddedd/* Author: B. Gough and G. Jungman */ #ifndef __GSL_MACHINE_H__ #define __GSL_MACHINE_H__ #include #include /* 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__ */ gsl-doc-2.3/BUGS0000664000175000017500000000000012616157443011444 0ustar eddeddgsl-doc-2.3/cblas/0000755000175000017500000000000013022553153012043 5ustar eddeddgsl-doc-2.3/cblas/tests.c0000664000175000017500000000127412616157443013371 0ustar eddedd 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 (); gsl-doc-2.3/cblas/source_trmv_r.h0000664000175000017500000000702312616157443015123 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(TRMV,order,Uplo,TransA,Diag,N,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/source_gemm_c.h0000664000175000017500000001423712616157443015046 0ustar eddedd/* blas/source_gemm_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS14(GEMM,Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/source_iamax_r.h0000664000175000017500000000206512616157443015233 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/source_her2k.h0000664000175000017500000002542212616157443014630 0ustar eddedd/* blas/source_her2k.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(HER2K,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/daxpy.c0000664000175000017500000000040412616157443013346 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/ccopy.c0000664000175000017500000000035312616157443013341 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_tpmv_r.h0000664000175000017500000000637112616157443015126 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS8(TPMV,order,Uplo,TransA,Diag,N,Ap,X,incX); 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"); } } gsl-doc-2.3/cblas/error_cblas_l2.h0000664000175000017500000001562212616157443015130 0ustar eddedd/* cblas/error_cblas_l2.h * * Copyright (C) 2010 José Luis García Pallero * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 __ERROR_CBLAS_L2_H__ #define __ERROR_CBLAS_L2_H__ #include #include "error_cblas.h" /* * ============================================================================= * Prototypes for level 2 BLAS * ============================================================================= */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ /* cblas_xgemv() */ #define CBLAS_ERROR_GEMV(pos,order,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY) \ CHECK_ORDER(pos,1,order); \ CHECK_TRANSPOSE(pos,2,TransA); \ CHECK_DIM(pos,3,M); \ CHECK_DIM(pos,4,N); \ if((order)==CblasRowMajor) { \ if((lda) #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dsyr.c0000664000175000017500000000054012616157443013203 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/sasum.c0000664000175000017500000000030712616157443013353 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/ztpsv.c0000664000175000017500000000062312616157443013412 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/chpr.c0000664000175000017500000000051412616157443013157 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_tbsv_r.h0000664000175000017500000000755312616157443015121 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(TBSV,order,Uplo,TransA,Diag,N,K,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/sspr2.c0000664000175000017500000000056312616157443013300 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/scasum.c0000664000175000017500000000030712616157443013516 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/error_cblas_l3.h0000664000175000017500000001537012616157443015131 0ustar eddedd/* cblas/error_cblas_l3.h * * Copyright (C) 2010 José Luis García Pallero * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 __ERROR_CBLAS_L3_H__ #define __ERROR_CBLAS_L3_H__ #include #include "error_cblas.h" /* * ============================================================================= * Prototypes for level 3 BLAS * ============================================================================= */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ /* cblas_xgemm() */ #define CBLAS_ERROR_GEMM(pos,Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc) \ { \ enum CBLAS_TRANSPOSE __transF=CblasNoTrans,__transG=CblasNoTrans; \ if((Order)==CblasRowMajor) { \ __transF = ((TransA)!=CblasConjTrans) ? (TransA) : CblasTrans; \ __transG = ((TransB)!=CblasConjTrans) ? (TransB) : CblasTrans; \ } else { \ __transF = ((TransB)!=CblasConjTrans) ? (TransB) : CblasTrans; \ __transG = ((TransA)!=CblasConjTrans) ? (TransA) : CblasTrans; \ } \ CHECK_ORDER(pos,1,Order); \ CHECK_TRANSPOSE(pos,2,TransA); \ CHECK_TRANSPOSE(pos,3,TransB); \ CHECK_DIM(pos,4,M); \ CHECK_DIM(pos,5,N); \ CHECK_DIM(pos,6,K); \ if((Order)==CblasRowMajor) { \ if(__transF==CblasNoTrans) { \ if((lda) #include #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 } gsl-doc-2.3/cblas/source_geru.h0000664000175000017500000000470012616157443014553 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(CZ_GERU,order,M,N,alpha,X,incX,Y,incY,A,lda); { 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"); } } } gsl-doc-2.3/cblas/test_trsm.c0000664000175000017500000036547312616157443014271 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/dcopy.c0000664000175000017500000000036012616157443013340 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test_symm.c0000664000175000017500000005075412616157443014262 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/tests.h0000664000175000017500000000176012616157443013376 0ustar eddeddvoid 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); gsl-doc-2.3/cblas/source_syr2k_r.h0000664000175000017500000000652012616157443015206 0ustar eddedd/* blas/source_syr2k_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(SYR2K,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc); 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"); } } gsl-doc-2.3/cblas/csyr2k.c0000664000175000017500000000072012616157443013437 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/cgemv.c0000664000175000017500000000066212616157443013330 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dsbmv.c0000664000175000017500000000066212616157443013342 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ssyr.c0000664000175000017500000000053412616157443013225 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zhemm.c0000664000175000017500000000070412616157443013344 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_sbmv.h0000664000175000017500000000546712616157443014573 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(SD_SBMV,order,Uplo,N,K,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/source_trmm_c.h0000664000175000017500000003113212616157443015071 0ustar eddedd/* blas/source_trmm_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(TRMM,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb); { 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"); } } } gsl-doc-2.3/cblas/dtpsv.c0000664000175000017500000000060312616157443013362 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/cgerc.c0000664000175000017500000000055612616157443013314 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/srotg.c0000664000175000017500000000027712616157443013367 0ustar eddedd#include #include #include "cblas.h" void cblas_srotg (float *a, float *b, float *c, float *s) { #define BASE float #include "source_rotg.h" #undef BASE } gsl-doc-2.3/cblas/test_hpr.c0000664000175000017500000001141212616157443014052 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/chpmv.c0000664000175000017500000000060112616157443013335 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zgeru.c0000664000175000017500000000055712616157443013366 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_asum_r.h0000664000175000017500000000173212616157443015101 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/strmv.c0000664000175000017500000000063312616157443013400 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/cher2.c0000664000175000017500000000057512616157443013235 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/drotg.c0000664000175000017500000000030412616157443013337 0ustar eddedd#include #include #include "cblas.h" void cblas_drotg (double *a, double *b, double *c, double *s) { #define BASE double #include "source_rotg.h" #undef BASE } gsl-doc-2.3/cblas/sgemv.c0000664000175000017500000000066512616157443013353 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ctrsv.c0000664000175000017500000000065512616157443013372 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/Makefile.am0000664000175000017500000000626112616157443014120 0ustar eddeddlib_LTLIBRARIES = libgslcblas.la libgslcblas_la_LDFLAGS = $(GSLCBLAS_LDFLAGS) -version-info $(GSL_LT_CBLAS_VERSION) pkginclude_HEADERS = gsl_cblas.h AM_CPPFLAGS = -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 error_cblas.h error_cblas_l2.h error_cblas_l3.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 gsl-doc-2.3/cblas/zgerc.c0000664000175000017500000000055712616157443013344 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/idamax.c0000664000175000017500000000032112616157443013462 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/xerbla.c0000664000175000017500000000226612616157443013506 0ustar eddedd/* xerbla.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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 (); } gsl-doc-2.3/cblas/ztbmv.c0000664000175000017500000000064712616157443013374 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_gemm_r.h0000664000175000017500000000617012616157443015062 0ustar eddedd/* blas/source_gemm_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS14(GEMM,Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc); 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"); } } gsl-doc-2.3/cblas/ztrmm.c0000664000175000017500000000074212616157443013377 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/scnrm2.c0000664000175000017500000000030712616157443013427 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/zsyrk.c0000664000175000017500000000065612616157443013414 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_rotg.h0000664000175000017500000000246512616157443014572 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/source_gerc.h0000664000175000017500000000470212616157443014533 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(CZ_GERC,order,M,N,alpha,X,incX,Y,incY,A,lda); { 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"); } } } gsl-doc-2.3/cblas/test_rotmg.c0000664000175000017500000001430112616157443014411 0ustar eddedd#include #include #include #include #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)"); }; } gsl-doc-2.3/cblas/test_hemv.c0000664000175000017500000002375112616157443014231 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_trsv.c0000664000175000017500000011554112616157443014267 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/ctbsv.c0000664000175000017500000000067212616157443013351 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_tpsv.c0000664000175000017500000012343112616157443014262 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/srotm.c0000664000175000017500000000036512616157443013373 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/strmm.c0000664000175000017500000000074312616157443013371 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_gbmv_c.h0000664000175000017500000001353612616157443015055 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); CHECK_ARGS14(GBMV,order,TransA,M,N,KL,KU,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/drotmg.c0000664000175000017500000000033212616157443013515 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dspr.c0000664000175000017500000000052212616157443013172 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_herk.c0000664000175000017500000002621012616157443014214 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_symv.c0000664000175000017500000001740112616157443014263 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/source_spmv.h0000664000175000017500000000541112616157443014576 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(SD_SPMV,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/source_axpy_c.h0000664000175000017500000000247212616157443015100 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/test_ger.c0000664000175000017500000001476412616157443014053 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/chbmv.c0000664000175000017500000000065112616157443013324 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ztbsv.c0000664000175000017500000000067312616157443013401 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_trmm_r.h0000664000175000017500000001245512616157443015117 0ustar eddedd/* blas/source_trmm_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(TRMM,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb); 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"); } } gsl-doc-2.3/cblas/source_ger.h0000664000175000017500000000277512616157443014400 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(SD_GER,order,M,N,alpha,X,incX,Y,incY,A,lda); 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"); } } gsl-doc-2.3/cblas/zsymm.c0000664000175000017500000000070612616157443013405 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_nrm2_r.h0000664000175000017500000000243712616157443015015 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } gsl-doc-2.3/cblas/chpr2.c0000664000175000017500000000055712616157443013250 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ctrmm.c0000664000175000017500000000074112616157443013347 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/dzasum.c0000664000175000017500000000031112616157443013521 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/chemm.c0000664000175000017500000000070312616157443013314 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/zgemm.c0000664000175000017500000000075612616157443013352 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/strsv.c0000664000175000017500000000063312616157443013406 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/stpsv.c0000664000175000017500000000060012616157443013376 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/TODO0000664000175000017500000000063112616157443012547 0ustar eddedd# -*- org -*- #+CATEGORY: cblas 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 gsl-doc-2.3/cblas/source_tpsv_c.h0000664000175000017500000002017612616157443015114 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS8(TPSV,order,Uplo,TransA,Diag,N,Ap,X,incX); 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"); } } gsl-doc-2.3/cblas/source_gbmv_r.h0000664000175000017500000000537412616157443015075 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS14(GBMV,order,TransA,M,N,KL,KU,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/csymm.c0000664000175000017500000000070512616157443013355 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/dtpmv.c0000664000175000017500000000060312616157443013354 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_amax.c0000664000175000017500000000466112616157443014217 0ustar eddedd#include #include #include #include #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)"); }; } gsl-doc-2.3/cblas/test_copy.c0000664000175000017500000001103212616157443014231 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_hbmv.h0000664000175000017500000001246712616157443014556 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(CZ_HBMV,order,Uplo,N,K,alpha,A,lda,X,incX,beta,Y,incY); { 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"); } } } gsl-doc-2.3/cblas/test_syr2k.c0000664000175000017500000004715412616157443014347 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_swap_r.h0000664000175000017500000000177512616157443015115 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/ssyr2.c0000664000175000017500000000060012616157443013301 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_tbmv_r.h0000664000175000017500000000677312616157443015116 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10 (TBMV,order,Uplo,TransA,Diag,N,K,A,lda,X,incX); 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; } } } gsl-doc-2.3/cblas/source_rot.h0000664000175000017500000000204512616157443014415 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/dsyr2.c0000664000175000017500000000060512616157443013267 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_trsv_r.h0000664000175000017500000000735012616157443015134 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(TRSV,order,Uplo,TransA,Diag,N,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/sswap.c0000664000175000017500000000033212616157443013356 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_scal_r.h0000664000175000017500000000167212616157443015061 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 = 0; if (incX <= 0) { return; } for (i = 0; i < N; i++) { X[ix] *= alpha; ix += incX; } } gsl-doc-2.3/cblas/icamax.c0000664000175000017500000000031612616157443013465 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/cher.c0000664000175000017500000000053212616157443013144 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/drot.c0000664000175000017500000000040512616157443013172 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dscal.c0000664000175000017500000000032612616157443013312 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_rotmg.h0000664000175000017500000000552012616157443014742 0ustar eddedd/* blas/source_rotmg.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/test_rotm.c0000664000175000017500000010502512616157443014246 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/dasum.c0000664000175000017500000000031212616157443013330 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test_syr2.c0000664000175000017500000000735112616157443014167 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/ssyr2k.c0000664000175000017500000000074112616157443013462 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/zhbmv.c0000664000175000017500000000065212616157443013354 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dtbsv.c0000664000175000017500000000065312616157443013351 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_tbmv.c0000664000175000017500000015104112616157443014234 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_syr2k_c.h0000664000175000017500000001714112616157443015170 0ustar eddedd/* blas/source_syr2k_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(SYR2K,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/source_swap_c.h0000664000175000017500000000220212616157443015060 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/test_gemv.c0000664000175000017500000003054712616157443014231 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_her.h0000664000175000017500000000541712616157443014375 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS8(CZ_HER,order,Uplo,N,alpha,X,incX,A,lda); 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"); } } gsl-doc-2.3/cblas/ztrsv.c0000664000175000017500000000065612616157443013422 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_hpr.h0000664000175000017500000000544312616157443014407 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS7(CZ_HPR,order,Uplo,N,alpha,X,incX,A); 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"); } } gsl-doc-2.3/cblas/dger.c0000664000175000017500000000056212616157443013147 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/cgemm.c0000664000175000017500000000075512616157443013322 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_symv.h0000664000175000017500000000540612616157443014613 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS11(SD_SYMV,order,Uplo,N,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/hypot.c0000664000175000017500000000065612616157443013375 0ustar eddedd#include 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) ; } } gsl-doc-2.3/cblas/test_trmv.c0000664000175000017500000011525112616157443014257 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/ctrmv.c0000664000175000017500000000063112616157443013356 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_rotm.h0000664000175000017500000000270412616157443014574 0ustar eddedd/* blas/source_rotm.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/test_spmv.c0000664000175000017500000002021112616157443014243 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/source_trsm_r.h0000664000175000017500000001447612616157443015132 0ustar eddedd/* blas/source_trsm_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(TRSM,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb); 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"); } } gsl-doc-2.3/cblas/caxpy.c0000664000175000017500000000037612616157443013355 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dswap.c0000664000175000017500000000035212616157443013341 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/zgemv.c0000664000175000017500000000066312616157443013360 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_sbmv.c0000664000175000017500000002327512616157443014242 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/source_tbmv_c.h0000664000175000017500000001432112616157443015063 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(TBMV,order,Uplo,TransA,Diag,N,K,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/source_spr2.h0000664000175000017500000000401512616157443014476 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(SD_SPR2,order,Uplo,N,alpha,X,incX,Y,incY,A); 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"); } } gsl-doc-2.3/cblas/test_her2.c0000664000175000017500000001147512616157443014132 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_asum.c0000664000175000017500000000523512616157443014234 0ustar eddedd#include #include #include #include #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)"); }; } gsl-doc-2.3/cblas/zher2.c0000664000175000017500000000057612616157443013265 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zhpmv.c0000664000175000017500000000060212616157443013365 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zherk.c0000664000175000017500000000065612616157443013355 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/isamax.c0000664000175000017500000000031712616157443013506 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/cscal.c0000664000175000017500000000032212616157443013305 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/ztrsm.c0000664000175000017500000000076612616157443013413 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/dtrmv.c0000664000175000017500000000063612616157443013364 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_trmv_c.h0000664000175000017500000001356312616157443015112 0ustar eddedd/* blas/source_trmv_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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(TRMV,order,Uplo,TransA,Diag,N,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/test_hpr2.c0000664000175000017500000001131112616157443014132 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/dsdot.c0000664000175000017500000000050312616157443013336 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_syrk_c.h0000664000175000017500000001415512616157443015110 0ustar eddedd/* blas/source_syrk_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS11(SYRK,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/cswap.c0000664000175000017500000000033012616157443013334 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test_spr.c0000664000175000017500000000710412616157443014070 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/stpmv.c0000664000175000017500000000060012616157443013370 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/sger.c0000664000175000017500000000055512616157443013170 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_tpmv.c0000664000175000017500000012305112616157443014252 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_gemm.c0000664000175000017500000012251712616157443014217 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_tpsv_r.h0000664000175000017500000000745212616157443015135 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS8(TPSV,order,Uplo,TransA,Diag,N,Ap,X,incX); 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"); } } gsl-doc-2.3/cblas/source_scal_c_s.h0000664000175000017500000000173412616157443015363 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 = 0; if (incX <= 0) { return; } for (i = 0; i < N; i++) { REAL(X, ix) *= alpha; IMAG(X, ix) *= alpha; ix += incX; } } gsl-doc-2.3/cblas/dgemv.c0000664000175000017500000000067312616157443013333 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_syrk_r.h0000664000175000017500000000616212616157443015126 0ustar eddedd/* blas/source_syrk_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS11(SYRK,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc); 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"); } } gsl-doc-2.3/cblas/test_hpmv.c0000664000175000017500000002615112616157443014241 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_dot_c.h0000664000175000017500000000250012616157443014675 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/zaxpy.c0000664000175000017500000000037712616157443013405 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/Makefile.in0000644000175000017500000015207213022372404014115 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)" 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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgslcblas_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libgslcblas_la_LDFLAGS) $(LDFLAGS) -o \ $@ 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libgslcblas.la libgslcblas_la_LDFLAGS = $(GSLCBLAS_LDFLAGS) -version-info $(GSL_LT_CBLAS_VERSION) pkginclude_HEADERS = gsl_cblas.h AM_CPPFLAGS = -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 error_cblas.h error_cblas_l2.h \ error_cblas_l3.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cblas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcblas.la: $(libgslcblas_la_OBJECTS) $(libgslcblas_la_DEPENDENCIES) $(EXTRA_libgslcblas_la_DEPENDENCIES) $(AM_V_CCLD)$(libgslcblas_la_LINK) -rpath $(libdir) $(libgslcblas_la_OBJECTS) $(libgslcblas_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotc_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotu_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgerc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgeru.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cherk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotmg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dzasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dznrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/izamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scnrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdsdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotmg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_amax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_asum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_axpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_herk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotmg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_scal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_swap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xerbla.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotc_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotu_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgerc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgeru.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zherk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsv.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-libLTLIBRARIES uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-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: gsl-doc-2.3/cblas/test_axpy.c0000664000175000017500000001170112616157443014243 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/dtrsv.c0000664000175000017500000000063612616157443013372 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ChangeLog0000664000175000017500000000237012616157443013633 0ustar eddedd2010-10-12 Brian Gough * added error checking to selected cblas functions (José Luis García Pallero) 2009-06-24 Brian Gough * source_scal_c.h source_scal_r.h: remove needless use of OFFSET macro when incX is known to be positive 2003-01-21 Brian Gough * test.m: skip trans=113 for complex matrix on SYRK tests. Tue Feb 19 20:50:27 2002 Brian Gough * gsl_cblas.h: added extern "C" Mon Jul 2 22:21:00 2001 Brian Gough * test.c: added missing #include Fri Apr 27 19:53:10 2001 Brian Gough * 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 * 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 gsl-doc-2.3/cblas/sgemm.c0000664000175000017500000000076012616157443013336 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/sdot.c0000664000175000017500000000047712616157443013204 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_syr.h0000664000175000017500000000331712616157443014431 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS8(SD_SYR,order,Uplo,N,alpha,X,incX,A,lda); 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"); } } gsl-doc-2.3/cblas/test_scal.c0000664000175000017500000005076212616157443014216 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_hemm.h0000664000175000017500000002050012616157443014533 0ustar eddedd/* blas/source_hemm.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(HEMM,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/source_symm_r.h0000664000175000017500000000701212616157443015116 0ustar eddedd/* blas/source_symm_r.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(SYMM,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc); 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"); } } gsl-doc-2.3/cblas/zhemv.c0000664000175000017500000000063512616157443013360 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dnrm2.c0000664000175000017500000000031212616157443013241 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/cher2k.c0000664000175000017500000000071612616157443013405 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/csyrk.c0000664000175000017500000000065512616157443013364 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_syr2.h0000664000175000017500000000401412616157443014506 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(SD_SYR2,order,Uplo,N,alpha,X,incX,Y,incY,A,lda); 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"); } } gsl-doc-2.3/cblas/dsymv.c0000664000175000017500000000064512616157443013372 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_her2k.c0000664000175000017500000002570512616157443014306 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/ssyrk.c0000664000175000017500000000065712616157443013406 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/srot.c0000664000175000017500000000040012616157443013204 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dgbmv.c0000664000175000017500000000074412616157443013327 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zhpr.c0000664000175000017500000000051612616157443013210 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ctbmv.c0000664000175000017500000000064612616157443013344 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_tbsv_c.h0000664000175000017500000001514412616157443015075 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(TBSV,order,Uplo,TransA,Diag,N,K,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/sscal.c0000664000175000017500000000032312616157443013326 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dsymm.c0000664000175000017500000000073312616157443013357 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_iamax_c.h0000664000175000017500000000215012616157443015207 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/zher2k.c0000664000175000017500000000072012616157443013427 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/cherk.c0000664000175000017500000000065312616157443013323 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/error_cblas.h0000664000175000017500000000617012616157443014531 0ustar eddedd/* cblas/error_cblas.h * * Copyright (C) 2010 José Luis García Pallero * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 __ERROR_CBLAS_H__ #define __ERROR_CBLAS_H__ #define CHECK_ARGS_X(FUNCTION,VAR,ARGS) do { int VAR = 0 ; \ CBLAS_ERROR_##FUNCTION ARGS ; \ if (VAR) cblas_xerbla(pos,__FILE__,""); } while (0) #define CHECK_ARGS7(FUNCTION,A1,A2,A3,A4,A5,A6,A7) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7)) #define CHECK_ARGS8(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8)) #define CHECK_ARGS9(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9)) #define CHECK_ARGS10(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10)) #define CHECK_ARGS11(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11)) #define CHECK_ARGS12(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12)) #define CHECK_ARGS13(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13)) #define CHECK_ARGS14(FUNCTION,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14) \ CHECK_ARGS_X(FUNCTION,pos,(pos,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14)) /* check if CBLAS_ORDER is correct */ #define CHECK_ORDER(pos,posIfError,order) \ if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) \ pos = posIfError; /* check if CBLAS_TRANSPOSE is correct */ #define CHECK_TRANSPOSE(pos,posIfError,Trans) \ if(((Trans)!=CblasNoTrans)&&((Trans)!=CblasTrans)&&((Trans)!=CblasConjTrans)) \ pos = posIfError; /* check if CBLAS_UPLO is correct */ #define CHECK_UPLO(pos,posIfError,Uplo) \ if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) \ pos = posIfError; /* check if CBLAS_DIAG is correct */ #define CHECK_DIAG(pos,posIfError,Diag) \ if(((Diag)!=CblasNonUnit)&&((Diag)!=CblasUnit)) \ pos = posIfError; /* check if CBLAS_SIDE is correct */ #define CHECK_SIDE(pos,posIfError,Side) \ if(((Side)!=CblasLeft)&&((Side)!=CblasRight)) \ pos = posIfError; /* check if a dimension argument is correct */ #define CHECK_DIM(pos,posIfError,dim) \ if((dim)<0) \ pos = posIfError; /* check if a stride argument is correct */ #define CHECK_STRIDE(pos,posIfError,stride) \ if((stride)==0) \ pos = posIfError; #endif /* __ERROR_CBLAS_H__ */ gsl-doc-2.3/cblas/ssbmv.c0000664000175000017500000000065412616157443013362 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_syrk.c0000664000175000017500000004765612616157443014274 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_dot.c0000664000175000017500000002112212616157443014046 0ustar eddedd#include #include #include #include #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"); }; } gsl-doc-2.3/cblas/ztpmv.c0000664000175000017500000000057712616157443013414 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ddot.c0000664000175000017500000000050412616157443013154 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_hemv.h0000664000175000017500000001230012616157443014543 0ustar eddedd/* blas/source_hemv.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS11(CZ_HEMV,order,Uplo,N,alpha,A,lda,X,incX,beta,Y,incY); { 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"); } } } gsl-doc-2.3/cblas/test_hbmv.c0000664000175000017500000003372112616157443014224 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_her.c0000664000175000017500000001032412616157443014040 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_swap.c0000664000175000017500000001611712616157443014242 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/ctpsv.c0000664000175000017500000000062212616157443013362 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/ctrsm.c0000664000175000017500000000076512616157443013363 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_hpmv.h0000664000175000017500000001230112616157443014557 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(CZ_HPMV,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY); { 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"); } } } gsl-doc-2.3/cblas/zher.c0000664000175000017500000000053412616157443013175 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zhpr2.c0000664000175000017500000000056012616157443013271 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/sspr.c0000664000175000017500000000051612616157443013214 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_symm_c.h0000664000175000017500000002105512616157443015102 0ustar eddedd/* blas/source_symm_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS13(SYMM,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc); { 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"); } } } gsl-doc-2.3/cblas/saxpy.c0000664000175000017500000000040012616157443013361 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test_syr.c0000664000175000017500000000653012616157443014103 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/cdotc_sub.c0000664000175000017500000000045412616157443014173 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test_nrm2.c0000664000175000017500000000527212616157443014146 0ustar eddedd#include #include #include #include #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)"); }; } gsl-doc-2.3/cblas/ctpmv.c0000664000175000017500000000057612616157443013364 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/drotm.c0000664000175000017500000000037112616157443013351 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/stbsv.c0000664000175000017500000000065012616157443013365 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dznrm2.c0000664000175000017500000000031112616157443013432 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/zsyr2k.c0000664000175000017500000000072112616157443013467 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/snrm2.c0000664000175000017500000000030712616157443013264 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_herk.h0000664000175000017500000001215412616157443014544 0ustar eddedd/* blas/source_herk.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS11(HERK,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc); 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"); } } gsl-doc-2.3/cblas/source_hpr2.h0000664000175000017500000001070312616157443014464 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(CZ_HPR2,order,Uplo,N,alpha,X,incX,Y,incY,Ap); { 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"); } } } gsl-doc-2.3/cblas/gsl_cblas.h0000664000175000017500000010161512616157443014165 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/cblas/sdsdot.c0000664000175000017500000000053112616157443013522 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/ssymm.c0000664000175000017500000000071012616157443013371 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/test_hemm.c0000664000175000017500000002746412616157443014225 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_rot.c0000664000175000017500000003117212616157443014072 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/source_spr.h0000664000175000017500000000332212616157443014414 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS7(SD_SPR,order,Uplo,N,alpha,X,incX,Ap); 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"); } } gsl-doc-2.3/cblas/ssymv.c0000664000175000017500000000063712616157443013412 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zdotu_sub.c0000664000175000017500000000045212616157443014242 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dspr2.c0000664000175000017500000000056712616157443013265 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_asum_c.h0000664000175000017500000000200012616157443015047 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/zswap.c0000664000175000017500000000033112616157443013364 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/zdotc_sub.c0000664000175000017500000000045512616157443014223 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/source_copy_c.h0000664000175000017500000000201012616157443015055 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/dtbmv.c0000664000175000017500000000065312616157443013343 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/test_tbsv.c0000664000175000017500000015223412616157443014247 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_spr2.c0000664000175000017500000001001112616157443014141 0ustar eddedd#include #include #include #include #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)"); } }; }; } gsl-doc-2.3/cblas/dtrsm.c0000664000175000017500000000074712616157443013364 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_dot_r.h0000664000175000017500000000177312616157443014727 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/cblas/zdscal.c0000664000175000017500000000032712616157443013505 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/izamax.c0000664000175000017500000000031712616157443013515 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/cgbmv.c0000664000175000017500000000071612616157443013325 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dsyr2k.c0000664000175000017500000000074712616157443013451 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/ztrmv.c0000664000175000017500000000063212616157443013406 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/dsyrk.c0000664000175000017500000000066412616157443013365 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/zscal.c0000664000175000017500000000032312616157443013335 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/cdotu_sub.c0000664000175000017500000000045112616157443014212 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/zgbmv.c0000664000175000017500000000071712616157443013355 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_her2.h0000664000175000017500000001065112616157443014453 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS10(CZ_HER2,order,Uplo,N,alpha,X,incX,Y,incY,A,lda); { 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"); } } } gsl-doc-2.3/cblas/source_gemv_r.h0000664000175000017500000000467412616157443015102 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(GEMV,order,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/cblas.h0000664000175000017500000000170412616157443013316 0ustar eddedd#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)) gsl-doc-2.3/cblas/test_trmm.c0000664000175000017500000036501612616157443014254 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/test_rotg.c0000664000175000017500000013527712616157443014254 0ustar eddedd#include #include #include #include #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)"); }; } gsl-doc-2.3/cblas/source_tpmv_c.h0000664000175000017500000001367612616157443015115 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); CHECK_ARGS8(TPMV,order,Uplo,TransA,Diag,N,Ap,X,incX); 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"); } } gsl-doc-2.3/cblas/sgbmv.c0000664000175000017500000000072112616157443013341 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/zcopy.c0000664000175000017500000000035412616157443013371 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/dtrmm.c0000664000175000017500000000074712616157443013356 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_axpy_r.h0000664000175000017500000000251712616157443015117 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } } gsl-doc-2.3/cblas/dspmv.c0000664000175000017500000000062712616157443013361 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_nrm2_c.h0000664000175000017500000000300312616157443014764 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } gsl-doc-2.3/cblas/source_trsm_c.h0000664000175000017500000003622712616157443015111 0ustar eddedd/* blas/source_trsm_c.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS12(TRSM,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb); { 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"); } } } gsl-doc-2.3/cblas/source_gemv_c.h0000664000175000017500000001212412616157443015050 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); CHECK_ARGS12(GEMV,order,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY); 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"); } } gsl-doc-2.3/cblas/dgemm.c0000664000175000017500000000076612616157443013325 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/source_scal_c.h0000664000175000017500000000230612616157443015035 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 = 0; const BASE alpha_real = CONST_REAL0(alpha); const BASE alpha_imag = CONST_IMAG0(alpha); if (incX <= 0) { return; } 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; } } gsl-doc-2.3/cblas/sspmv.c0000664000175000017500000000060412616157443013373 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/cgeru.c0000664000175000017500000000055612616157443013336 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/srotmg.c0000664000175000017500000000032412616157443013535 0ustar eddedd#include #include #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 } gsl-doc-2.3/cblas/test.c0000664000175000017500000000204112616157443013177 0ustar eddedd/* blas/test.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "tests.h" int main (void) { gsl_ieee_env_setup (); #include "tests.c" exit (gsl_test_summary()); } gsl-doc-2.3/cblas/stbmv.c0000664000175000017500000000065012616157443013357 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l2.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 } gsl-doc-2.3/cblas/source_trsv_c.h0000664000175000017500000002003112616157443015104 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; CHECK_ARGS9(TRSV,order,Uplo,TransA,Diag,N,A,lda,X,incX); 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"); } } gsl-doc-2.3/cblas/strsm.c0000664000175000017500000000074312616157443013377 0ustar eddedd#include #include #include "cblas.h" #include "error_cblas_l3.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 } gsl-doc-2.3/cblas/test_gbmv.c0000664000175000017500000004602412616157443014223 0ustar eddedd#include #include #include #include #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"); }; }; }; } gsl-doc-2.3/cblas/source_copy_r.h0000664000175000017500000000172112616157443015104 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/cblas/csscal.c0000664000175000017500000000032512616157443013473 0ustar eddedd#include #include #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 } gsl-doc-2.3/block/0000755000175000017500000000000013022553152012050 5ustar eddeddgsl-doc-2.3/block/fwrite_source.c0000664000175000017500000000551312616157443015115 0ustar eddedd/* block/fwrite_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/block/gsl_block_short.h0000664000175000017500000000442512616157443015421 0ustar eddedd/* block/gsl_block_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/test_complex_io.c0000664000175000017500000000325612616157443015434 0ustar eddedd/* block/test_complex_io.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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"); } gsl-doc-2.3/block/gsl_block_complex_long_double.h0000664000175000017500000000531712616157443020303 0ustar eddedd/* block/gsl_block_complex_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/block_source.c0000664000175000017500000000175612616157443014714 0ustar eddedd/* block/block_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/block/Makefile.am0000664000175000017500000000152012616157443014117 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 gsl-doc-2.3/block/gsl_check_range.h0000664000175000017500000000305312616157443015335 0ustar eddedd/* vector/gsl_check_range.h * * Copyright (C) 2003, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_complex_float.h0000664000175000017500000000477512616157443017126 0ustar eddedd/* block/gsl_block_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block.h0000664000175000017500000000110412616157443014171 0ustar eddedd#ifndef __GSL_BLOCK_H__ #define __GSL_BLOCK_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_BLOCK_H__ */ gsl-doc-2.3/block/gsl_block_uchar.h0000664000175000017500000000450512616157443015363 0ustar eddedd/* block/gsl_block_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_long_double.h0000664000175000017500000000474712616157443016562 0ustar eddedd/* block/gsl_block_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/test_io.c0000664000175000017500000000311412616157443013676 0ustar eddedd/* block/test_io.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } } gsl-doc-2.3/block/file.c0000664000175000017500000000424712616157443013157 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/block/gsl_block_float.h0000664000175000017500000000442512616157443015367 0ustar eddedd/* block/gsl_block_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/test_source.c0000664000175000017500000000606112616157443014573 0ustar eddedd/* block/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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"); } gsl-doc-2.3/block/init_source.c0000664000175000017500000000403712616157443014560 0ustar eddedd/* block/init_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; the memset call takes care of padding bytes */ memset(b->data, 0, MULTIPLICITY * n * sizeof(ATOMIC)); for (i = 0; i < MULTIPLICITY * n; i++) { b->data[i] = 0; } return b; } void FUNCTION (gsl_block, free) (TYPE (gsl_block) * b) { RETURN_IF_NULL (b); free (b->data); free (b); } gsl-doc-2.3/block/gsl_block_complex_double.h0000664000175000017500000000456112616157443017264 0ustar eddedd/* block/gsl_block_complex_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/init.c0000664000175000017500000000337512616157443013204 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/block/gsl_block_char.h0000664000175000017500000000436212616157443015177 0ustar eddedd/* block/gsl_block_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/Makefile.in0000644000175000017500000010465113022372404014123 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu block/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslblock.la: $(libgslblock_la_OBJECTS) $(libgslblock_la_DEPENDENCIES) $(EXTRA_libgslblock_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslblock_la_OBJECTS) $(libgslblock_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/block/ChangeLog0000664000175000017500000000236412616157443013644 0ustar eddedd2009-07-09 Brian Gough * init_source.c (FUNCTION): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): remove top_builddir 2005-05-21 Brian Gough * Makefile.am (pkginclude_HEADERS): removed unused file gsl_block_complex.h 2004-06-03 Brian Gough * 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 * init_source.c (FUNCTION): changed GSL_EDOM to GSL_EINVAL for invalid size arguments Sun May 28 12:22:26 2000 Brian Gough * 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 * 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 * this directory handles the memory management for vectors and matrices gsl-doc-2.3/block/gsl_block_double.h0000664000175000017500000000421112616157443015525 0ustar eddedd/* block/gsl_block_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_long.h0000664000175000017500000000436212616157443015221 0ustar eddedd/* block/gsl_block_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_int.h0000664000175000017500000000431712616157443015054 0ustar eddedd/* block/gsl_block_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/block.c0000664000175000017500000000337612616157443013334 0ustar eddedd#include #include #include #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 gsl-doc-2.3/block/gsl_block_ushort.h0000664000175000017500000000455012616157443015605 0ustar eddedd/* block/gsl_block_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_ulong.h0000664000175000017500000000450512616157443015405 0ustar eddedd/* block/gsl_block_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/gsl_block_uint.h0000664000175000017500000000444212616157443015240 0ustar eddedd/* block/gsl_block_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/block/fprintf_source.c0000664000175000017500000000762612616157443015274 0ustar eddedd/* block/fprintf_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 gsl-doc-2.3/block/test_complex_source.c0000664000175000017500000000625012616157443016322 0ustar eddedd/* block/test_complex_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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"); } gsl-doc-2.3/block/test.c0000664000175000017500000001160112616157443013207 0ustar eddedd/* block/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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; } gsl-doc-2.3/wavelet/0000755000175000017500000000000013022553155012430 5ustar eddeddgsl-doc-2.3/wavelet/haar.c0000664000175000017500000000373012616157443013524 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; gsl-doc-2.3/wavelet/dwt.c0000664000175000017500000002512112616157443013405 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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 = ((size_t)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++) { double h = 0, g = 0; ni = i + nmod; for (k = 0; k < w->nc; k++) { jf = n1 & (ni + k); h += w->h1[k] * ELEMENT (a, stride, jf); g += w->g1[k] * ELEMENT (a, stride, jf); } work->scratch[ii] += h; work->scratch[ii + nh] += g; } } 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); } gsl-doc-2.3/wavelet/wavelet.c0000664000175000017500000000613312616157443014260 0ustar eddedd/* wavelet/wavelet.c * * Copyright (C) 2004, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (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) { RETURN_IF_NULL (work); /* release scratch space */ free (work->scratch); work->scratch = NULL; free (work); } gsl-doc-2.3/wavelet/Makefile.am0000664000175000017500000000103512616157443014475 0ustar eddeddnoinst_LTLIBRARIES = libgslwavelet.la pkginclude_HEADERS = gsl_wavelet.h gsl_wavelet2d.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/wavelet/TODO0000664000175000017500000000076212616157443013137 0ustar eddedd# -*- org -*- #+CATEGORY: wavelet * 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. gsl-doc-2.3/wavelet/gsl_wavelet2d.h0000664000175000017500000001012712616157443015356 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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__ */ gsl-doc-2.3/wavelet/gsl_wavelet.h0000664000175000017500000000574312616157443015140 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_wavelet_forward = 1, gsl_wavelet_backward = -1 } gsl_wavelet_direction; 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__ */ gsl-doc-2.3/wavelet/Makefile.in0000644000175000017500000010456413022372407014506 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslwavelet.la pkginclude_HEADERS = gsl_wavelet.h gsl_wavelet2d.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu wavelet/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslwavelet.la: $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_DEPENDENCIES) $(EXTRA_libgslwavelet_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daubechies.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavelet.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/wavelet/ChangeLog0000664000175000017500000000171012616157443014213 0ustar eddedd2009-07-09 Brian Gough * wavelet.c (gsl_wavelet_free): handle NULL argument in free (gsl_wavelet_workspace_free): handle NULL argument in free 2008-10-13 Brian Gough * test.c (test_2d): change typename variable to name to avoid conflict with C++ typename keyword 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-01-03 Brian Gough * dwt.c (dwt_step): move pointer dereference out of loop 2006-03-16 Brian Gough * changed to gsl_wavelet_forward and gsl_wavelet_backward enums throughout internally instead of forward and backward. 2004-12-29 Brian Gough * gsl_wavelet.h: added missing includes, use GSL_VAR instead of extern 2004-07-23 Brian Gough * added wavelet directory from Ivo Alxneit. gsl-doc-2.3/wavelet/daubechies.c0000664000175000017500000003000412616157443014677 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; gsl-doc-2.3/wavelet/bspline.c0000664000175000017500000003674612616157443014262 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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; gsl-doc-2.3/wavelet/test.c0000664000175000017500000001466512616157443013601 0ustar eddedd#include #include #include #include #include #include #include #include #include #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 = (double *)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 = (double *)malloc (N * tda * sizeof (double)); const char * name; name = (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, name, 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, name, N, tda); } free (data); gsl_wavelet_workspace_free (work); gsl_wavelet_free (w); gsl_matrix_free (m2); gsl_matrix_free (mdelta); } gsl-doc-2.3/gsl.m40000664000175000017500000001174312616157443012030 0ustar eddedd# Configure path for the GNU Scientific Library # Christopher R. Gabriel , April 2000 AC_DEFUN([AX_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 #include #include 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, µ) ; 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 { 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 ], [ 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 ]) AU_ALIAS([AM_PATH_GSL], [AX_PATH_GSL]) gsl-doc-2.3/permutation/0000755000175000017500000000000013022553153013326 5ustar eddeddgsl-doc-2.3/permutation/gsl_permute_vector_complex_double.h0000664000175000017500000000276712616157443022520 0ustar eddedd/* permutation/gsl_permute_vector_complex_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_int.h0000644000175000017500000000250012737536473020302 0ustar eddedd/* permutation/gsl_permute_matrix_int.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_INT_H__ #define __GSL_PERMUTE_MATRIX_INT_H__ #include #include #include #include #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_matrix_int (const gsl_permutation * p, gsl_matrix_int * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_INT_H__ */ gsl-doc-2.3/permutation/gsl_permute_complex_float.h0000664000175000017500000000275312616157443020764 0ustar eddedd/* permutation/gsl_permute_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_complex_long_double.h0000664000175000017500000000310012616157443023515 0ustar eddedd/* permutation/gsl_permute_vector_complex_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_complex_double.h0000664000175000017500000000274512616157443021132 0ustar eddedd/* permutation/gsl_permute_complex_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_uchar.h0000664000175000017500000000265612616157443017234 0ustar eddedd/* permutation/gsl_permute_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_char.h0000664000175000017500000000267112616157443020426 0ustar eddedd/* permutation/gsl_permute_vector_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_ushort.h0000664000175000017500000000271312616157443021032 0ustar eddedd/* permutation/gsl_permute_vector_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/Makefile.am0000644000175000017500000000331712737536473015410 0ustar eddeddnoinst_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 gsl_permute_matrix_char.h gsl_permute_matrix_complex_long_double.h gsl_permute_matrix.h gsl_permute_matrix_long.h gsl_permute_matrix_uint.h gsl_permute_matrix_complex_double.h gsl_permute_matrix_double.h gsl_permute_matrix_int.h gsl_permute_matrix_short.h gsl_permute_matrix_ulong.h gsl_permute_matrix_complex_float.h gsl_permute_matrix_float.h gsl_permute_matrix_long_double.h gsl_permute_matrix_uchar.h gsl_permute_matrix_ushort.h AM_CPPFLAGS = -I$(top_srcdir) libgslpermutation_la_SOURCES = init.c file.c permutation.c permute.c canonical.c inline.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 gsl-doc-2.3/permutation/gsl_permute_short.h0000664000175000017500000000263612616157443017267 0ustar eddedd/* permutation/gsl_permute_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_ushort.h0000644000175000017500000000252512737536473021043 0ustar eddedd/* permutation/gsl_permute_matrix_ushort.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_USHORT_H__ #define __GSL_PERMUTE_MATRIX_USHORT_H__ #include #include #include #include #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_matrix_ushort (const gsl_permutation * p, gsl_matrix_ushort * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_USHORT_H__ */ gsl-doc-2.3/permutation/gsl_permute_int.h0000664000175000017500000000261612616157443016720 0ustar eddedd/* permutation/gsl_permute_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_uchar.h0000644000175000017500000000251612737536473020621 0ustar eddedd/* permutation/gsl_permute_matrix_uchar.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_UCHAR_H__ #define __GSL_PERMUTE_MATRIX_UCHAR_H__ #include #include #include #include #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_matrix_uchar (const gsl_permutation * p, gsl_matrix_uchar * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_UCHAR_H__ */ gsl-doc-2.3/permutation/gsl_permute_vector_complex_float.h0000664000175000017500000000301212616157443022333 0ustar eddedd/* permutation/gsl_permute_vector_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_long.h0000664000175000017500000000267112616157443020450 0ustar eddedd/* permutation/gsl_permute_vector_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_ulong.h0000644000175000017500000000251612737536473020643 0ustar eddedd/* permutation/gsl_permute_matrix_ulong.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_ULONG_H__ #define __GSL_PERMUTE_MATRIX_ULONG_H__ #include #include #include #include #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_matrix_ulong (const gsl_permutation * p, gsl_matrix_ulong * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_ULONG_H__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_double.h0000644000175000017500000000250712737536473020771 0ustar eddedd/* permutation/gsl_permute_matrix_double.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_DOUBLE_H__ #define __GSL_PERMUTE_MATRIX_DOUBLE_H__ #include #include #include #include #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_matrix (const gsl_permutation * p, gsl_matrix * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_DOUBLE_H__ */ gsl-doc-2.3/permutation/gsl_permute_char.h0000664000175000017500000000262612616157443017044 0ustar eddedd/* permutation/gsl_permute_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_int.h0000664000175000017500000000266012616157443020301 0ustar eddedd/* permutation/gsl_permute_vector_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_short.h0000664000175000017500000000270212616157443020643 0ustar eddedd/* permutation/gsl_permute_vector_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/file.c0000664000175000017500000000463112616157443014431 0ustar eddedd/* permutation/file.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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; } gsl-doc-2.3/permutation/gsl_permute_float.h0000664000175000017500000000263612616157443017235 0ustar eddedd/* permutation/gsl_permute_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_float.h0000664000175000017500000000270212616157443020611 0ustar eddedd/* permutation/gsl_permute_vector_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_short.h0000644000175000017500000000251612737536473020656 0ustar eddedd/* permutation/gsl_permute_matrix_short.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_SHORT_H__ #define __GSL_PERMUTE_MATRIX_SHORT_H__ #include #include #include #include #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_matrix_short (const gsl_permutation * p, gsl_matrix_short * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_SHORT_H__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_long_double.h0000644000175000017500000000257012737536473022010 0ustar eddedd/* permutation/gsl_permute_matrix_long_double.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_LONG_DOUBLE_H__ #define __GSL_PERMUTE_MATRIX_LONG_DOUBLE_H__ #include #include #include #include #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_matrix_long_double (const gsl_permutation * p, gsl_matrix_long_double * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_LONG_DOUBLE_H__ */ gsl-doc-2.3/permutation/permute_source.c0000644000175000017500000001051112737536474016554 0ustar eddedd/* permutation/permute_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } int TYPE (gsl_permute_matrix) (const gsl_permutation * p, TYPE (gsl_matrix) * A) { if (A->size2 != p->size) { GSL_ERROR ("matrix columns and permutation must be the same length", GSL_EBADLEN); } else { size_t i; for (i = 0; i < A->size1; ++i) { QUALIFIED_VIEW (gsl_vector, view) r = FUNCTION (gsl_matrix, row) (A, i); TYPE (gsl_permute_vector) (p, &r.vector); } return GSL_SUCCESS; } } gsl-doc-2.3/permutation/gsl_permute_vector.h0000664000175000017500000000133512616157443017425 0ustar eddedd#ifndef __GSL_PERMUTE_VECTOR_H__ #define __GSL_PERMUTE_VECTOR_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_PERMUTE_VECTOR_H__ */ gsl-doc-2.3/permutation/gsl_permute_double.h0000664000175000017500000000263012616157443017374 0ustar eddedd/* permutation/gsl_permute_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_ulong.h0000664000175000017500000000270212616157443020630 0ustar eddedd/* permutation/gsl_permute_vector_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_long.h0000644000175000017500000000250712737536473020456 0ustar eddedd/* permutation/gsl_permute_matrix_long.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_LONG_H__ #define __GSL_PERMUTE_MATRIX_LONG_H__ #include #include #include #include #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_matrix_long (const gsl_permutation * p, gsl_matrix_long * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_LONG_H__ */ gsl-doc-2.3/permutation/canonical.c0000664000175000017500000000703012616157443015435 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; } gsl-doc-2.3/permutation/gsl_permute_ushort.h0000664000175000017500000000266612616157443017457 0ustar eddedd/* permutation/gsl_permute_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_ulong.h0000664000175000017500000000265612616157443017256 0ustar eddedd/* permutation/gsl_permute_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_long_double.h0000664000175000017500000000277012616157443022002 0ustar eddedd/* permutation/gsl_permute_vector_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/init.c0000664000175000017500000000425412616157443014456 0ustar eddedd/* permutation/init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (p); free (p->data); free (p); } gsl-doc-2.3/permutation/inline.c0000664000175000017500000000170112616157443014763 0ustar eddedd/* permutation/inline.c * * Copyright (C) 2008 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/permutation/gsl_permute_matrix_char.h0000644000175000017500000000250712737536473020434 0ustar eddedd/* permutation/gsl_permute_matrix_char.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_CHAR_H__ #define __GSL_PERMUTE_MATRIX_CHAR_H__ #include #include #include #include #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_matrix_char (const gsl_permutation * p, gsl_matrix_char * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_CHAR_H__ */ gsl-doc-2.3/permutation/gsl_permute.h0000664000175000017500000000114612616157443016043 0ustar eddedd#ifndef __GSL_PERMUTE_H__ #define __GSL_PERMUTE_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_PERMUTE_H__ */ gsl-doc-2.3/permutation/gsl_permute_matrix.h0000644000175000017500000000133512737536473017435 0ustar eddedd#ifndef __GSL_PERMUTE_MATRIX_H__ #define __GSL_PERMUTE_MATRIX_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_PERMUTE_MATRIX_H__ */ gsl-doc-2.3/permutation/gsl_permute_uint.h0000664000175000017500000000264612616157443017110 0ustar eddedd/* permutation/gsl_permute_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/permutation.c0000664000175000017500000001221112616157443016052 0ustar eddedd/* permutation/permutation.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include size_t gsl_permutation_size (const gsl_permutation * p) { return p->size ; } size_t * gsl_permutation_data (const gsl_permutation * p) { return p->data ; } 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 (const 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; } gsl-doc-2.3/permutation/gsl_permute_long_double.h0000664000175000017500000000271612616157443020420 0ustar eddedd/* permutation/gsl_permute_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/Makefile.in0000644000175000017500000010733213022372406015401 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslpermutation_la_LIBADD = am_libgslpermutation_la_OBJECTS = init.lo file.lo permutation.lo \ permute.lo canonical.lo inline.lo libgslpermutation_la_OBJECTS = $(am_libgslpermutation_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 \ gsl_permute_matrix_char.h \ gsl_permute_matrix_complex_long_double.h gsl_permute_matrix.h \ gsl_permute_matrix_long.h gsl_permute_matrix_uint.h \ gsl_permute_matrix_complex_double.h \ gsl_permute_matrix_double.h gsl_permute_matrix_int.h \ gsl_permute_matrix_short.h gsl_permute_matrix_ulong.h \ gsl_permute_matrix_complex_float.h gsl_permute_matrix_float.h \ gsl_permute_matrix_long_double.h gsl_permute_matrix_uchar.h \ gsl_permute_matrix_ushort.h AM_CPPFLAGS = -I$(top_srcdir) libgslpermutation_la_SOURCES = init.c file.c permutation.c permute.c canonical.c inline.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu permutation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslpermutation.la: $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_DEPENDENCIES) $(EXTRA_libgslpermutation_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canonical.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permutation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/permutation/ChangeLog0000664000175000017500000000432412616157443015117 0ustar eddedd2009-07-09 Brian Gough * init.c (gsl_permutation_free): handle NULL argument in free 2008-07-03 Brian Gough * permutation.c: move gsl_permutation_get to inline.c * gsl_permutation.h: use new inline declarations * inline.c: handle inline functions separately * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2003-02-17 Brian Gough * 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 * 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 * permutation.c (gsl_permutation_mul): added function for combining permutations (Nicolas Darnis) Sat Feb 9 18:17:53 2002 Brian Gough * permutation.c (gsl_permutation_memcpy): added memcpy function Tue Sep 4 17:22:06 2001 Brian Gough * 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 * 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 * gsl_permutation.h: renamed gsl_permutation_invert to gsl_permutation_inverse Mon Apr 10 14:31:01 2000 Brian Gough * added functions for permuting data and vectors Thu Feb 24 17:53:55 2000 Brian Gough * permutation.c (gsl_permutation_invert): add an inverse function for permutations Sat Feb 19 12:04:32 2000 Brian Gough * 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 * permutation.c: added valid and reverse methods (gsl_permutation_reverse): fixed bug in reverse gsl-doc-2.3/permutation/gsl_permute_matrix_complex_long_double.h0000644000175000017500000000266012737536473023537 0ustar eddedd/* permutation/gsl_permute_matrix_complex_long_double.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_COMPLEX_LONG_DOUBLE_H__ #define __GSL_PERMUTE_MATRIX_COMPLEX_LONG_DOUBLE_H__ #include #include #include #include #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_matrix_complex_long_double (const gsl_permutation * p, gsl_matrix_complex_long_double * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_COMPLEX_LONG_DOUBLE_H__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_complex_double.h0000644000175000017500000000257712737536473022527 0ustar eddedd/* permutation/gsl_permute_matrix_complex_double.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_COMPLEX_DOUBLE_H__ #define __GSL_PERMUTE_MATRIX_COMPLEX_DOUBLE_H__ #include #include #include #include #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_matrix_complex (const gsl_permutation * p, gsl_matrix_complex * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_COMPLEX_DOUBLE_H__ */ gsl-doc-2.3/permutation/gsl_permutation.h0000664000175000017500000000642212616157443016733 0ustar eddedd/* permutation/gsl_permutation.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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); int gsl_permutation_swap (gsl_permutation * p, const size_t i, const size_t j); int gsl_permutation_valid (const 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); INLINE_DECL size_t gsl_permutation_get (const gsl_permutation * p, const size_t i); #ifdef HAVE_INLINE INLINE_FUN size_t gsl_permutation_get (const gsl_permutation * p, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_uchar.h0000664000175000017500000000270212616157443020606 0ustar eddedd/* permutation/gsl_permute_vector_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_uint.h0000644000175000017500000000250712737536473020476 0ustar eddedd/* permutation/gsl_permute_matrix_uint.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_UINT_H__ #define __GSL_PERMUTE_MATRIX_UINT_H__ #include #include #include #include #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_matrix_uint (const gsl_permutation * p, gsl_matrix_uint * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_UINT_H__ */ gsl-doc-2.3/permutation/gsl_permute_matrix_float.h0000644000175000017500000000251612737536473020624 0ustar eddedd/* permutation/gsl_permute_matrix_float.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_FLOAT_H__ #define __GSL_PERMUTE_MATRIX_FLOAT_H__ #include #include #include #include #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_matrix_float (const gsl_permutation * p, gsl_matrix_float * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_FLOAT_H__ */ gsl-doc-2.3/permutation/gsl_permute_long.h0000664000175000017500000000262612616157443017066 0ustar eddedd/* permutation/gsl_permute_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_vector_uint.h0000664000175000017500000000267112616157443020470 0ustar eddedd/* permutation/gsl_permute_vector_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/gsl_permute_complex_long_double.h0000664000175000017500000000303312616157443022140 0ustar eddedd/* permutation/gsl_permute_complex_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/permute.c0000644000175000017500000000363412737536474015204 0ustar eddedd#include #include #include #include #include #include #include #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 gsl-doc-2.3/permutation/gsl_permute_matrix_complex_float.h0000644000175000017500000000260612737536473022353 0ustar eddedd/* permutation/gsl_permute_matrix_complex_float.h * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MATRIX_COMPLEX_FLOAT_H__ #define __GSL_PERMUTE_MATRIX_COMPLEX_FLOAT_H__ #include #include #include #include #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_matrix_complex_float (const gsl_permutation * p, gsl_matrix_complex_float * A); __END_DECLS #endif /* __GSL_PERMUTE_MATRIX_COMPLEX_FLOAT_H__ */ gsl-doc-2.3/permutation/gsl_permute_vector_double.h0000664000175000017500000000265712616157443020767 0ustar eddedd/* permutation/gsl_permute_vector_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/permutation/test.c0000664000175000017500000002340412616157443014470 0ustar eddedd/* permutation/test.c * * Copyright (C) 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include 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()); } gsl-doc-2.3/err/0000755000175000017500000000000013022553152011546 5ustar eddeddgsl-doc-2.3/err/error.c0000664000175000017500000000400612616157443013060 0ustar eddedd/* err/error.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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; } gsl-doc-2.3/err/gsl_errno.h0000664000175000017500000001351512616157443013733 0ustar eddedd/* err/gsl_errno.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/err/Makefile.am0000664000175000017500000000046212616157443013621 0ustar eddeddnoinst_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 gsl-doc-2.3/err/stream.c0000664000175000017500000000345712616157443013233 0ustar eddedd/* err/stream.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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; } gsl-doc-2.3/err/TODO0000664000175000017500000000017212616157443012253 0ustar eddedd# -*- org -*- #+CATEGORY: err * Add a GSL_ERROR_MODE environment variable for choosing error behavior at runtime (???). gsl-doc-2.3/err/message.c0000664000175000017500000000230712616157443013355 0ustar eddedd/* err/message.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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); } } gsl-doc-2.3/err/gsl_message.h0000664000175000017500000000456412616157443014236 0ustar eddedd/* err/gsl_message.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/err/Makefile.in0000644000175000017500000010350313022372405013615 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslerr.la ../test/libgsltest.la \ ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu err/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslerr.la: $(libgslerr_la_OBJECTS) $(libgslerr_la_DEPENDENCIES) $(EXTRA_libgslerr_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslerr_la_OBJECTS) $(libgslerr_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/err/ChangeLog0000664000175000017500000001251412616157443013340 0ustar eddedd2004-07-10 Brian Gough * error.c (gsl_error): flush stdout/stderr before aborting (needed to get a useful error message on some platforms) 2003-06-17 Brian Gough * warn.c: removed, the functions are not used Sat Apr 27 21:27:32 2002 Brian Gough * error.c (gsl_error): added an explanatory message in the default error handler before aborting Tue Jun 12 11:52:23 2001 Brian Gough * gsl_errno.h (GSL_STATUS_UPDATE): added macro for updating status value multiple times Fri Apr 27 18:18:59 2001 Brian Gough * 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 * gsl_errno.h: added EOF for end of file Sat Aug 26 19:26:59 2000 Brian Gough * 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 * split gsl_test code out into separate test/ directory Sun Nov 28 17:17:03 1999 Brian Gough * 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 * gsl_test.h: changed variable name in prototype for clarity Thu Oct 7 11:46:53 1999 Brian Gough * 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 * 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 * 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 * 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 * 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 * gsl_test.h: removed #include which should not be present in installed header files Tue Nov 10 15:55:56 1998 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * 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 * gsl_errno.h: added GSL_EROUND for roundoff errors Fri May 8 18:50:13 1998 Brian Gough * 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 * 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 * 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 * gsl_errno.h (GSL_ERROR_RETURN_NOTHING): added an error macro suitable for void functions Mon Apr 6 14:10:48 1998 Brian Gough * 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 * err/errno.c (gsl_error): now takes gsl_errno as an argument (this is useful for doing conditional breakpoints) gsl-doc-2.3/err/strerror.c0000664000175000017500000000651212616157443013615 0ustar eddedd/* err/strerror.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include 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" ; } } gsl-doc-2.3/err/test.c0000664000175000017500000000532012616157443012706 0ustar eddedd/* err/test_errnos.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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 ()); } gsl-doc-2.3/configure0000775000175000017500000157241313022372403012702 0ustar eddedd#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for gsl 2.3. # # # Copyright (C) 1992-1996, 1998-2012 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 more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 IFS=$as_save_IFS ;; 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # 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 sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # 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'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsl' PACKAGE_TARNAME='gsl' PACKAGE_VERSION='2.3' PACKAGE_STRING='gsl 2.3' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsl_math.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS HAVE_DARWIN86_IEEE_INTERFACE HAVE_DARWIN_IEEE_INTERFACE HAVE_OPENBSD_IEEE_INTERFACE HAVE_NETBSD_IEEE_INTERFACE HAVE_OS2EMX_IEEE_INTERFACE HAVE_FREEBSD_IEEE_INTERFACE HAVE_AIX_IEEE_INTERFACE HAVE_IRIX_IEEE_INTERFACE HAVE_TRU64_IEEE_INTERFACE HAVE_HPUX_IEEE_INTERFACE HAVE_HPUX11_IEEE_INTERFACE HAVE_SOLARIS_IEEE_INTERFACE HAVE_SUNOS4_IEEE_INTERFACE HAVE_GNUX86_IEEE_INTERFACE HAVE_GNUPPC_IEEE_INTERFACE HAVE_GNUM68K_IEEE_INTERFACE HAVE_GNUSPARC_IEEE_INTERFACE LIBOBJS GSL_LIBADD GSL_LDFLAGS GSLCBLAS_LDFLAGS GSL_LIBM GSL_LIBS GSL_CFLAGS LIBM OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP LIBTOOL OBJDUMP DLLTOOL AS LN_S CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build GSL_MINOR_VERSION GSL_MAJOR_VERSION SED GSL_LT_CBLAS_VERSION GSL_LT_VERSION MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= 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 case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_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'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" 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 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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # 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 2.3 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 \`..'] 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] --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] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gsl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _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 2.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --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-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested 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 else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsl configure 2.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 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 fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_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 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { 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` /usr/bin/hostinfo = `(/usr/bin/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=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&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_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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append 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 as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset 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: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_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 $ac_precious_vars; 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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.13' 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 as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&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_fn_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 rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file 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 $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi 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='2.3' 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"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$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_CURRENT=22 GSL_REVISION=0 GSL_AGE=3 CBLAS_CURRENT=0 CBLAS_REVISION=0 CBLAS_AGE=0 GSL_LT_VERSION="${GSL_CURRENT}:${GSL_REVISION}:${GSL_AGE}" GSL_LT_CBLAS_VERSION="${CBLAS_CURRENT}:${CBLAS_REVISION}:${CBLAS_AGE}" case "$VERSION" in *+) ;; *) $as_echo "#define RELEASED /**/" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST 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_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed GSL_MAJOR_VERSION=`echo "$VERSION" | $SED 's/\([^.][^.]*\).*/\1/'` GSL_MINOR_VERSION=`echo "$VERSION" | $SED 's/[^.][^.]*.\([^.][^.]*\).*/\1/'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_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" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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 -std 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 -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 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 for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&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 to if __STDC__ is defined, since # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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 to if __STDC__ is defined, since # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. 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 delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST 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_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&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 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&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 : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&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* | cegcc*) # 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; ;; mint*) # On MiNT this can take a long time and run out of memory. 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 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; 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 ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then 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` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # 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. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` 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` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # 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 lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$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 cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; 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 if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&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 aix[4-9]*) 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', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | 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 ;; haiku*) 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])(-bit)?( [LM]SB)? 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 ;; interix[3-9]*) # 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 glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) 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=pass_all ;; 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 ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) 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 ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi 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 test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 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 \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # 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 for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&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]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' 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 # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # 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 # Try without a prefix underscore, 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. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$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=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_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 -rf 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-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\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; 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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$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 ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #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)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h 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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-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 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 --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-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 # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF 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 # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&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 <<_LT_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 _LT_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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&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 <<_LT_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 _LT_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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script 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;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # 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 the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$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 echo "$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 -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$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:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$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= 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*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # 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' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries 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' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # 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 ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; 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 ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # 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' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) 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 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$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:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_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 # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$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:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$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:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # 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_|_GLOBAL__F[ID]_.*' # 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. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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 # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = 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>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [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 aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach 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* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' 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/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' 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 ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) 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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' 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; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # 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; func_echo_all \"$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' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac 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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $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 <<_LT_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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $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 ;; *) # 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. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' 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 ;; 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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $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 ;; aix[4-9]*) 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 # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". 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") || (\$ 2 == "W")) && (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].*|aix[5-9]*) 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_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' 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 : 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 export_dynamic_flag_spec='${wl}-bexpall' # 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. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ 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 func_echo_all "${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. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ 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' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi 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*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # 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 $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper 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 `func_echo_all "$deplibs" | $SED '\''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' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=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* | dragonfly*) archive_cmds='$CC -shared $pic_flag -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 $pic_flag ${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 && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${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 hardcode_direct_absolute=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 && test "$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 $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${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' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${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 ;; 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_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes 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 ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes 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 else ld_shlibs=no 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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' 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} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${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='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-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; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_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 archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${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 $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) 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' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $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 -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac 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 and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; 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* | sco3.2v5.0.[024]*) 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='${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,$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 ;; 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 if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 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\":${as_lineno-$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=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # 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. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi 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" 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 # correct to gnu/linux during the next big refactor 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' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor 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.so # instead of lib.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*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor 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* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc 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~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' 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="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; 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 dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. 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 # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # 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' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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}${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`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor 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 ;; 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[23].*) 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 ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor 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 ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" 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=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor 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 # correct to gnu/linux during the next big refactor 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 glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor 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 # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # 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>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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' ;; 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 # correct to gnu/linux during the next big refactor 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=qnx 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='ldqnx.so' ;; 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" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor 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 # correct to gnu/linux during the next big refactor 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 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 # correct to gnu/linux during the next big refactor 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 shlibpath_overrides_runpath=yes 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' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' 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' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$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 if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent 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_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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; 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 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* | cegcc*) 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; 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 ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$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\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$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 striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&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" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "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" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&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 ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } 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" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 $as_echo_n "checking whether char is unsigned... " >&6; } if ${ac_cv_c_char_unsigned+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((char) -1) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_char_unsigned=no else ac_cv_c_char_unsigned=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 $as_echo "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h fi GSL_CFLAGS="-I$includedir" GSL_LIBS="-L$libdir -lgsl" LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : LIBM="-lmw" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="-lm" fi ;; esac GSL_LIBM=$LIBM if test "$ac_cv_c_inline" != no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU-style extern inline" >&5 $as_echo_n "checking for GNU-style extern inline... " >&6; } if ${ac_cv_c_extern_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_extern_inline=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_extern_inline="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extern_inline" >&5 $as_echo "$ac_cv_c_extern_inline" >&6; } if test "$ac_cv_c_extern_inline" != no ; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99-style inline" >&5 $as_echo_n "checking for C99-style inline... " >&6; } if ${ac_cv_c_c99inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_c99inline=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern inline void* foo() { foo(); return &foo ; }; int main () { return foo() != 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_c99inline="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_cv_c_c99inline" != no ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ inline void* foo() { foo(); return &foo ; }; int main () { return foo() != 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_cv_c_c99inline="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_c99inline" >&5 $as_echo "$ac_cv_c_c99inline" >&6; } if test "$ac_cv_c_c99inline" != no ; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h $as_echo "#define HAVE_C99_INLINE 1" >>confdefs.h fi fi fi for ac_header in ieeefp.h do : ac_fn_c_check_header_mongrel "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default" if test "x$ac_cv_header_ieeefp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IEEEFP_H 1 _ACEOF fi done case $host in *-*-cygwin* | *-*-mingw* ) if test "$enable_shared" = yes; then GSLCBLAS_LDFLAGS="$GSLCBLAS_LDFLAGS -no-undefined" GSL_LDFLAGS="$GSL_LDFLAGS -no-undefined" GSL_LIBADD="cblas/libgslcblas.la" fi ;; esac for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" if test "x$ac_cv_func_memcpy" = xyes; then : $as_echo "#define HAVE_MEMCPY 1" >>confdefs.h else case " $LIBOBJS " in *" memcpy.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcpy.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" if test "x$ac_cv_func_memmove" = xyes; then : $as_echo "#define HAVE_MEMMOVE 1" >>confdefs.h else case " $LIBOBJS " in *" memmove.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memmove.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" if test "x$ac_cv_func_strdup" = xyes; then : $as_echo "#define HAVE_STRDUP 1" >>confdefs.h else case " $LIBOBJS " in *" strdup.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strdup.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" if test "x$ac_cv_func_strtol" = xyes; then : $as_echo "#define HAVE_STRTOL 1" >>confdefs.h else case " $LIBOBJS " in *" strtol.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtol.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtoul" "ac_cv_func_strtoul" if test "x$ac_cv_func_strtoul" = xyes; then : $as_echo "#define HAVE_STRTOUL 1" >>confdefs.h else case " $LIBOBJS " in *" strtoul.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoul.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXIT_SUCCESS and EXIT_FAILURE" >&5 $as_echo_n "checking for EXIT_SUCCESS and EXIT_FAILURE... " >&6; } if ${ac_cv_decl_exit_success_and_failure+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_exit_success_and_failure" >&5 $as_echo "$ac_cv_decl_exit_success_and_failure" >&6; } if test "$ac_cv_decl_exit_success_and_failure" = yes ; then $as_echo "#define HAVE_EXIT_SUCCESS_AND_FAILURE 1" >>confdefs.h fi ; if test "x$LIBS" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi fi ac_fn_c_check_decl "$LINENO" "feenableexcept" "ac_cv_have_decl_feenableexcept" "#define _GNU_SOURCE 1 #include " if test "x$ac_cv_have_decl_feenableexcept" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEENABLEEXCEPT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fesettrapenable" "ac_cv_have_decl_fesettrapenable" "#define _GNU_SOURCE 1 #include " if test "x$ac_cv_have_decl_fesettrapenable" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FESETTRAPENABLE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "hypot" "ac_cv_have_decl_hypot" "#include " if test "x$ac_cv_have_decl_hypot" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_HYPOT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "expm1" "ac_cv_have_decl_expm1" "#include " if test "x$ac_cv_have_decl_expm1" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_EXPM1 $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "acosh" "ac_cv_have_decl_acosh" "#include " if test "x$ac_cv_have_decl_acosh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACOSH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "asinh" "ac_cv_have_decl_asinh" "#include " if test "x$ac_cv_have_decl_asinh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ASINH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "atanh" "ac_cv_have_decl_atanh" "#include " if test "x$ac_cv_have_decl_atanh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ATANH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "ldexp" "ac_cv_have_decl_ldexp" "#include " if test "x$ac_cv_have_decl_ldexp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LDEXP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "frexp" "ac_cv_have_decl_frexp" "#include " if test "x$ac_cv_have_decl_frexp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREXP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fprnd_t" "ac_cv_have_decl_fprnd_t" "#include " if test "x$ac_cv_have_decl_fprnd_t" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPRND_T $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include " if test "x$ac_cv_have_decl_isinf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISINF $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " if test "x$ac_cv_have_decl_isfinite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISFINITE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "finite" "ac_cv_have_decl_finite" "#include #if HAVE_IEEEFP_H #include #endif " if test "x$ac_cv_have_decl_finite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FINITE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "#include " if test "x$ac_cv_have_decl_isnan" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISNAN $ac_have_decl _ACEOF case "$host" in *-*-*openbsd*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: avoiding OpenBSD system log1p - using gsl version" >&5 $as_echo "avoiding OpenBSD system log1p - using gsl version" >&6; } ;; *) ac_fn_c_check_decl "$LINENO" "log1p" "ac_cv_have_decl_log1p" "#include " if test "x$ac_cv_have_decl_log1p" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LOG1P $ac_have_decl _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double stdio" >&5 $as_echo_n "checking for long double stdio... " >&6; } if ${ac_cv_func_printf_longdouble+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_printf_longdouble="no" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { const char * s = "5678.25"; long double x = 1.234 ; fprintf(stderr,"%Lg\n",x) ; sscanf(s, "%Lg", &x); if (x == 5678.25) {exit (0);} else {exit(1); }; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_printf_longdouble="yes" else ac_cv_func_printf_longdouble="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_printf_longdouble" >&5 $as_echo "$ac_cv_func_printf_longdouble" >&6; } if test "$ac_cv_func_printf_longdouble" != no; then $as_echo "#define HAVE_PRINTF_LONGDOUBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extended floating point registers" >&5 $as_echo_n "checking for extended floating point registers... " >&6; } if ${ac_cv_c_extended_fp+:} false; then : $as_echo_n "(cached) " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extended_fp" >&5 $as_echo "$ac_cv_c_extended_fp" >&6; } if test $ac_cv_c_extended_fp != "no" ; then $as_echo "#define HAVE_EXTENDED_PRECISION_REGISTERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE arithmetic interface type" >&5 $as_echo_n "checking for IEEE arithmetic interface type... " >&6; } if ${ac_cv_c_ieee_interface+:} false; then : $as_echo_n "(cached) " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_interface" >&5 $as_echo "$ac_cv_c_ieee_interface" >&6; } if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPU_SETCW" >&5 $as_echo_n "checking for FPU_SETCW... " >&6; } if ${ac_cv_c_fpu_setcw+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_fpu_setcw=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef _FPU_SETCW #include #define _FPU_SETCW(cw) __setfpucw(cw) #endif int main () { unsigned short mode = 0 ; _FPU_SETCW(mode); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_fpu_setcw="yes" else ac_cv_c_ieee_interface=unknown fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_setcw" >&5 $as_echo "$ac_cv_c_fpu_setcw" >&6; } fi if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSE extensions" >&5 $as_echo_n "checking for SSE extensions... " >&6; } if ${ac_cv_c_fpu_sse+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_fpu_sse=no if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) int main () { unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_fpu_sse="yes" else ac_cv_c_fpu_sse="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) int main () { unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_fpu_sse="yes" else ac_cv_c_fpu_sse="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_sse" >&5 $as_echo "$ac_cv_c_fpu_sse" >&6; } if test $ac_cv_c_fpu_sse = yes; then $as_echo "#define HAVE_FPU_X86_SSE 1" >>confdefs.h fi 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE compiler flags" >&5 $as_echo_n "checking for IEEE compiler flags... " >&6; } if ${ac_cv_c_ieee_flags+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_ieee_flags="$ieee_flags" else ac_cv_c_ieee_flags="none" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else ac_cv_c_ieee_flags="none" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_flags" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE comparisons" >&5 $as_echo_n "checking for IEEE comparisons... " >&6; } if ${ac_cv_c_ieee_comparisons+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_ieee_comparisons="yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int status; double inf, nan; inf = exp(1.0e10); nan = inf / inf ; status = (nan == nan); exit (status); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_ieee_comparisons="yes" else ac_cv_c_ieee_comparisons="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_comparisons" >&5 $as_echo "$ac_cv_c_ieee_comparisons" >&6; } if test "$ac_cv_c_ieee_comparisons" != no ; then $as_echo "#define HAVE_IEEE_COMPARISONS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE denormalized values" >&5 $as_echo_n "checking for IEEE denormalized values... " >&6; } if ${ac_cv_c_ieee_denormals+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_ieee_denormals="yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include 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 if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_ieee_denormals="yes" else ac_cv_c_ieee_denormals="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_denormals" >&5 $as_echo "$ac_cv_c_ieee_denormals" >&6; } if test "$ac_cv_c_ieee_denormals" != no ; then $as_echo "#define HAVE_IEEE_DENORMALS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile gsl_version.h gsl.spec blas/Makefile block/Makefile bspline/Makefile cblas/Makefile cdf/Makefile cheb/Makefile combination/Makefile complex/Makefile const/Makefile deriv/Makefile dht/Makefile diff/Makefile doc/Makefile doc/examples/Makefile eigen/Makefile err/Makefile fit/Makefile fft/Makefile gsl/Makefile histogram/Makefile ieee-utils/Makefile integration/Makefile interpolation/Makefile linalg/Makefile matrix/Makefile min/Makefile monte/Makefile multifit/Makefile multifit_nlinear/Makefile multilarge/Makefile multilarge_nlinear/Makefile multimin/Makefile multiroots/Makefile multiset/Makefile ntuple/Makefile ode-initval/Makefile ode-initval2/Makefile permutation/Makefile poly/Makefile qrng/Makefile randist/Makefile rng/Makefile roots/Makefile rstat/Makefile siman/Makefile sort/Makefile spblas/Makefile splinalg/Makefile spmatrix/Makefile specfunc/Makefile statistics/Makefile sum/Makefile sys/Makefile test/Makefile utils/Makefile vector/Makefile wavelet/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, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} 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}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $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} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 IFS=$as_save_IFS ;; 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # 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'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsl $as_me 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent 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 Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsl config.status 2.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; 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 || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # 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 sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsl_version.h") CONFIG_FILES="$CONFIG_FILES gsl_version.h" ;; "gsl.spec") CONFIG_FILES="$CONFIG_FILES gsl.spec" ;; "blas/Makefile") CONFIG_FILES="$CONFIG_FILES blas/Makefile" ;; "block/Makefile") CONFIG_FILES="$CONFIG_FILES block/Makefile" ;; "bspline/Makefile") CONFIG_FILES="$CONFIG_FILES bspline/Makefile" ;; "cblas/Makefile") CONFIG_FILES="$CONFIG_FILES cblas/Makefile" ;; "cdf/Makefile") CONFIG_FILES="$CONFIG_FILES cdf/Makefile" ;; "cheb/Makefile") CONFIG_FILES="$CONFIG_FILES cheb/Makefile" ;; "combination/Makefile") CONFIG_FILES="$CONFIG_FILES combination/Makefile" ;; "complex/Makefile") CONFIG_FILES="$CONFIG_FILES complex/Makefile" ;; "const/Makefile") CONFIG_FILES="$CONFIG_FILES const/Makefile" ;; "deriv/Makefile") CONFIG_FILES="$CONFIG_FILES deriv/Makefile" ;; "dht/Makefile") CONFIG_FILES="$CONFIG_FILES dht/Makefile" ;; "diff/Makefile") CONFIG_FILES="$CONFIG_FILES diff/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/examples/Makefile") CONFIG_FILES="$CONFIG_FILES doc/examples/Makefile" ;; "eigen/Makefile") CONFIG_FILES="$CONFIG_FILES eigen/Makefile" ;; "err/Makefile") CONFIG_FILES="$CONFIG_FILES err/Makefile" ;; "fit/Makefile") CONFIG_FILES="$CONFIG_FILES fit/Makefile" ;; "fft/Makefile") CONFIG_FILES="$CONFIG_FILES fft/Makefile" ;; "gsl/Makefile") CONFIG_FILES="$CONFIG_FILES gsl/Makefile" ;; "histogram/Makefile") CONFIG_FILES="$CONFIG_FILES histogram/Makefile" ;; "ieee-utils/Makefile") CONFIG_FILES="$CONFIG_FILES ieee-utils/Makefile" ;; "integration/Makefile") CONFIG_FILES="$CONFIG_FILES integration/Makefile" ;; "interpolation/Makefile") CONFIG_FILES="$CONFIG_FILES interpolation/Makefile" ;; "linalg/Makefile") CONFIG_FILES="$CONFIG_FILES linalg/Makefile" ;; "matrix/Makefile") CONFIG_FILES="$CONFIG_FILES matrix/Makefile" ;; "min/Makefile") CONFIG_FILES="$CONFIG_FILES min/Makefile" ;; "monte/Makefile") CONFIG_FILES="$CONFIG_FILES monte/Makefile" ;; "multifit/Makefile") CONFIG_FILES="$CONFIG_FILES multifit/Makefile" ;; "multifit_nlinear/Makefile") CONFIG_FILES="$CONFIG_FILES multifit_nlinear/Makefile" ;; "multilarge/Makefile") CONFIG_FILES="$CONFIG_FILES multilarge/Makefile" ;; "multilarge_nlinear/Makefile") CONFIG_FILES="$CONFIG_FILES multilarge_nlinear/Makefile" ;; "multimin/Makefile") CONFIG_FILES="$CONFIG_FILES multimin/Makefile" ;; "multiroots/Makefile") CONFIG_FILES="$CONFIG_FILES multiroots/Makefile" ;; "multiset/Makefile") CONFIG_FILES="$CONFIG_FILES multiset/Makefile" ;; "ntuple/Makefile") CONFIG_FILES="$CONFIG_FILES ntuple/Makefile" ;; "ode-initval/Makefile") CONFIG_FILES="$CONFIG_FILES ode-initval/Makefile" ;; "ode-initval2/Makefile") CONFIG_FILES="$CONFIG_FILES ode-initval2/Makefile" ;; "permutation/Makefile") CONFIG_FILES="$CONFIG_FILES permutation/Makefile" ;; "poly/Makefile") CONFIG_FILES="$CONFIG_FILES poly/Makefile" ;; "qrng/Makefile") CONFIG_FILES="$CONFIG_FILES qrng/Makefile" ;; "randist/Makefile") CONFIG_FILES="$CONFIG_FILES randist/Makefile" ;; "rng/Makefile") CONFIG_FILES="$CONFIG_FILES rng/Makefile" ;; "roots/Makefile") CONFIG_FILES="$CONFIG_FILES roots/Makefile" ;; "rstat/Makefile") CONFIG_FILES="$CONFIG_FILES rstat/Makefile" ;; "siman/Makefile") CONFIG_FILES="$CONFIG_FILES siman/Makefile" ;; "sort/Makefile") CONFIG_FILES="$CONFIG_FILES sort/Makefile" ;; "spblas/Makefile") CONFIG_FILES="$CONFIG_FILES spblas/Makefile" ;; "splinalg/Makefile") CONFIG_FILES="$CONFIG_FILES splinalg/Makefile" ;; "spmatrix/Makefile") CONFIG_FILES="$CONFIG_FILES spmatrix/Makefile" ;; "specfunc/Makefile") CONFIG_FILES="$CONFIG_FILES specfunc/Makefile" ;; "statistics/Makefile") CONFIG_FILES="$CONFIG_FILES statistics/Makefile" ;; "sum/Makefile") CONFIG_FILES="$CONFIG_FILES sum/Makefile" ;; "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "vector/Makefile") CONFIG_FILES="$CONFIG_FILES vector/Makefile" ;; "wavelet/Makefile") CONFIG_FILES="$CONFIG_FILES wavelet/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #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. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # 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. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;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&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # 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 cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # 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 # 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//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # 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 # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # 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 # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # 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 # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # 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 # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # 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 # 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 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # 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 # 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 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # 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 a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # 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 # 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 DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # 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 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # 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 # 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 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_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 _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # 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) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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 || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsl-doc-2.3/sort/0000755000175000017500000000000013022553153011746 5ustar eddeddgsl-doc-2.3/sort/gsl_sort_double.h0000664000175000017500000000365712616157443015334 0ustar eddedd/* sort/gsl_sort_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2 (double * data1, const size_t stride1, double * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_char.h0000664000175000017500000000366612616157443014777 0ustar eddedd/* sort/gsl_sort_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_char (char * data1, const size_t stride1, char * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_vector_ushort.h0000664000175000017500000000362212616157443016760 0ustar eddedd/* sort/gsl_sort_vector_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_ushort (gsl_vector_ushort * v1, gsl_vector_ushort * v2); 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__ */ gsl-doc-2.3/sort/gsl_sort_uint.h0000664000175000017500000000400612616157443015026 0ustar eddedd/* sort/gsl_sort_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_uint (unsigned int * data1, const size_t stride1, unsigned int * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_int.h0000664000175000017500000000364112616157443014645 0ustar eddedd/* sort/gsl_sort_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_int (int * data1, const size_t stride1, int * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/Makefile.am0000664000175000017500000000206512616157443014021 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 gsl-doc-2.3/sort/gsl_sort_vector_char.h0000664000175000017500000000352612616157443016354 0ustar eddedd/* sort/gsl_sort_vector_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_char (gsl_vector_char * v1, gsl_vector_char * v2); 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__ */ gsl-doc-2.3/sort/gsl_heapsort.h0000664000175000017500000000265612616157443014636 0ustar eddedd/* sort/gsl_heapsort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/sort/sortvec.c0000664000175000017500000000415212616157443013615 0ustar eddedd/* * 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 3, 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 #include #include #include #include #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 gsl-doc-2.3/sort/gsl_sort_vector_uint.h0000664000175000017500000000354612616157443016420 0ustar eddedd/* sort/gsl_sort_vector_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_uint (gsl_vector_uint * v1, gsl_vector_uint * v2); 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__ */ gsl-doc-2.3/sort/gsl_sort_vector_uchar.h0000664000175000017500000000357412616157443016544 0ustar eddedd/* sort/gsl_sort_vector_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_uchar (gsl_vector_uchar * v1, gsl_vector_uchar * v2); 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__ */ gsl-doc-2.3/sort/sortvecind.c0000664000175000017500000000421312616157443014306 0ustar eddedd/* * 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 3, 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 #include #include #include #include #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 gsl-doc-2.3/sort/TODO0000664000175000017500000000225712616157443012460 0ustar eddedd# -*- org -*- #+CATEGORY: sort * 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. gsl-doc-2.3/sort/gsl_sort_uchar.h0000664000175000017500000000403312616157443015151 0ustar eddedd/* sort/gsl_sort_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_uchar (unsigned char * data1, const size_t stride1, unsigned char * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/sortvecind_source.c0000664000175000017500000000467712616157443015704 0ustar eddedd/* * 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 3, 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 ; } gsl-doc-2.3/sort/gsl_sort_vector_long.h0000664000175000017500000000352612616157443016376 0ustar eddedd/* sort/gsl_sort_vector_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_long (gsl_vector_long * v1, gsl_vector_long * v2); 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__ */ gsl-doc-2.3/sort/test_source.c0000664000175000017500000002454312616157443014475 0ustar eddedd/* sort/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 = (BASE *)malloc(k * sizeof(BASE)); BASE * large = (BASE *)malloc(k * sizeof(BASE)); size_t * index = (size_t *)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_vector, memcpy) (data2, data); TYPE (gsl_sort_vector2) (data, data2); status = FUNCTION (my, check) (data, orig); gsl_test (status, "sorting2, " NAME (gsl_vector) ", n = %u, stride = %u, reversed data", N, stride); status = FUNCTION (my, check) (data2, orig); gsl_test (status, "sorting2, " NAME (gsl_vector) ", n = %u, stride = %u, reversed data2", 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); TYPE (gsl_sort_vector2) (data, data2); status = FUNCTION (my, check) (data, orig); gsl_test (status, "sorting2, " NAME (gsl_vector) ", n = %u, stride = %u, randomized data", N, stride); status = FUNCTION (my, check) (data2, orig); gsl_test (status, "sorting2, " NAME (gsl_vector) ", n = %u, stride = %u, randomized data2", N, stride); 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; volatile ATOMIC kk; /* Must be sorted initially */ for (i = 0; i < v->size; i++) { kk = k; k++; /* Prevent overflow */ if (k < kk) 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)) { #if DUMP_ERROR size_t j; for (j = 0 ; j < data->size; j++) { printf("%u: " OUT_FORMAT " " OUT_FORMAT " %c\n", j, FUNCTION (gsl_vector, get) (data, j), FUNCTION (gsl_vector, get) (orig, j), (i == j) ? '*' : ' '); } #endif 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; } gsl-doc-2.3/sort/gsl_sort_vector_float.h0000664000175000017500000000355412616157443016545 0ustar eddedd/* sort/gsl_sort_vector_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_float (gsl_vector_float * v1, gsl_vector_float * v2); 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__ */ gsl-doc-2.3/sort/gsl_sort_long_double.h0000664000175000017500000000411112616157443016335 0ustar eddedd/* sort/gsl_sort_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_long_double (long double * data1, const size_t stride1, long double * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_long.h0000664000175000017500000000366612616157443015021 0ustar eddedd/* sort/gsl_sort_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_long (long * data1, const size_t stride1, long * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/subset_source.c0000664000175000017500000000563012616157443015017 0ustar eddedd/* 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 3, 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); } gsl-doc-2.3/sort/gsl_sort_vector_long_double.h0000664000175000017500000000376012616157443017730 0ustar eddedd/* sort/gsl_sort_vector_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_long_double (gsl_vector_long_double * v1, gsl_vector_long_double * v2); 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__ */ gsl-doc-2.3/sort/subsetind_source.c0000664000175000017500000000574112616157443015515 0ustar eddedd/* 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 3, 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); } gsl-doc-2.3/sort/sort.c0000664000175000017500000000523712616157443013124 0ustar eddedd/* * 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 3, 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 #include #include 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); } } gsl-doc-2.3/sort/gsl_sort_vector_double.h0000664000175000017500000000343112616157443016704 0ustar eddedd/* sort/gsl_sort_vector_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2 (gsl_vector * v1, gsl_vector * v2); 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__ */ gsl-doc-2.3/sort/sortind.c0000664000175000017500000000472512616157443013620 0ustar eddedd/* * 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 3, 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 #include #include 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; } gsl-doc-2.3/sort/Makefile.in0000644000175000017500000010564613022372406014027 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sort/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsort.la: $(libgslsort_la_OBJECTS) $(libgslsort_la_DEPENDENCIES) $(EXTRA_libgslsort_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsort_la_OBJECTS) $(libgslsort_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvecind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsetind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/sort/ChangeLog0000664000175000017500000000412612616157443013537 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-02-09 Brian Gough * test_source.c: prevent signed overflow in tests 2005-08-31 Brian Gough * test_source.c: free index memory as well 2005-04-08 Brian Gough * 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 * subset_source. subsetind_source.c: make prototypes match header file Sun Jan 21 18:36:04 2001 Brian Gough * subset.c, subsetind.c: added functions for selecting subsets (k-th smallest or largest values) Mon Mar 13 13:57:33 2000 Brian Gough * 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 * 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 * 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 * 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 * sortind_source.c: added indirect sorting Fri Feb 18 10:48:24 2000 Brian Gough * initial GPL sources from Thomas Walter gsl-doc-2.3/sort/gsl_sort_ulong.h0000664000175000017500000000403312616157443015173 0ustar eddedd/* sort/gsl_sort_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_ulong (unsigned long * data1, const size_t stride1, unsigned long * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort.h0000664000175000017500000000066312616157443013774 0ustar eddedd#ifndef __GSL_SORT_H__ #define __GSL_SORT_H__ #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_SORT_H__ */ gsl-doc-2.3/sort/sortvec_source.c0000664000175000017500000000777212616157443015210 0ustar eddedd/* * 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 3, 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, downheap2) (BASE * data1, const size_t stride1, BASE * data2, const size_t stride2, 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; } static inline void FUNCTION (my, downheap2) (BASE * data1, const size_t stride1, BASE * data2, const size_t stride2, const size_t N, size_t k) { BASE v1 = data1[k * stride1]; BASE v2 = data2[k * stride2]; while (k <= N / 2) { size_t j = 2 * k; if (j < N && data1[j * stride1] < data1[(j + 1) * stride1]) { j++; } if (!(v1 < data1[j * stride1])) /* avoid infinite loop if nan */ { break; } data1[k * stride1] = data1[j * stride1]; data2[k * stride2] = data2[j * stride2]; k = j; } data1[k * stride1] = v1; data2[k * stride2] = v2; } 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) ; } void TYPE (gsl_sort2) (BASE * data1, const size_t stride1, BASE * data2, const size_t stride2, 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, downheap2) (data1, stride1, data2, stride2, N, k); } while (k > 0); while (N > 0) { /* first swap the elements */ BASE tmp; tmp = data1[0 * stride1]; data1[0 * stride1] = data1[N * stride1]; data1[N * stride1] = tmp; tmp = data2[0 * stride2]; data2[0 * stride2] = data2[N * stride2]; data2[N * stride2] = tmp; /* then process the heap */ N--; FUNCTION (my, downheap2) (data1, stride1, data2, stride2, N, 0); } } void TYPE (gsl_sort_vector2) (TYPE (gsl_vector) * v1, TYPE (gsl_vector) * v2) { TYPE (gsl_sort2) (v1->data, v1->stride, v2->data, v2->stride, v1->size) ; } gsl-doc-2.3/sort/gsl_sort_vector_int.h0000664000175000017500000000350012616157443016221 0ustar eddedd/* sort/gsl_sort_vector_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_int (gsl_vector_int * v1, gsl_vector_int * v2); 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__ */ gsl-doc-2.3/sort/gsl_sort_short.h0000664000175000017500000000371312616157443015212 0ustar eddedd/* sort/gsl_sort_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_short (short * data1, const size_t stride1, short * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_vector_short.h0000664000175000017500000000355412616157443016577 0ustar eddedd/* sort/gsl_sort_vector_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_short (gsl_vector_short * v1, gsl_vector_short * v2); 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__ */ gsl-doc-2.3/sort/gsl_sort_vector.h0000664000175000017500000000102512616157443015347 0ustar eddedd#ifndef __GSL_SORT_VECTOR_H__ #define __GSL_SORT_VECTOR_H__ #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_SORT_VECTOR_H__ */ gsl-doc-2.3/sort/subsetind.c0000664000175000017500000000376012616157443014134 0ustar eddedd/* sort/subsetind.c * * Copyright (C) 2001, 2007 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 3, 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 #include #include #include #include #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 gsl-doc-2.3/sort/gsl_sort_float.h0000664000175000017500000000371312616157443015160 0ustar eddedd/* sort/gsl_sort_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_float (float * data1, const size_t stride1, float * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_ushort.h0000664000175000017500000000406012616157443015373 0ustar eddedd/* sort/gsl_sort_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_sort2_ushort (unsigned short * data1, const size_t stride1, unsigned short * data2, const size_t stride2, 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__ */ gsl-doc-2.3/sort/gsl_sort_vector_ulong.h0000664000175000017500000000357412616157443016566 0ustar eddedd/* sort/gsl_sort_vector_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); void gsl_sort_vector2_ulong (gsl_vector_ulong * v1, gsl_vector_ulong * v2); 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__ */ gsl-doc-2.3/sort/test_heapsort.c0000664000175000017500000000776312616157443015027 0ustar eddedd/* sort/test_heapsort.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/sort/test.c0000664000175000017500000000647312616157443013117 0ustar eddedd/* sort/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include 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); } gsl-doc-2.3/sort/subset.c0000664000175000017500000000371412616157443013440 0ustar eddedd/* sort/subset.c * * Copyright (C) 2001, 2007 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 3, 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 #include #include #include #include #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 gsl-doc-2.3/version.c0000664000175000017500000000217112616157443012625 0ustar eddedd/* version.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* This file needs to use the top-level 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; gsl-doc-2.3/install-sh0000755000175000017500000003325512630105471012773 0ustar eddedd#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # 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 $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/Makefile.am0000644000175000017500000000663612737536472013047 0ustar eddedd## 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 multiset sort ieee-utils cblas blas linalg eigen specfunc dht qrng rng randist fft poly fit multifit multifit_nlinear multilarge multilarge_nlinear rstat statistics siman sum integration interpolation histogram ode-initval ode-initval2 roots multiroots min multimin monte ntuple diff deriv cdf wavelet bspline spblas spmatrix splinalg 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 multifit_nlinear/libgslmultifit_nlinear.la multilarge/libgslmultilarge.la multilarge_nlinear/libgslmultilarge_nlinear.la multimin/libgslmultimin.la multiroots/libgslmultiroots.la ntuple/libgslntuple.la ode-initval/libgslodeiv.la ode-initval2/libgslodeiv2.la permutation/libgslpermutation.la combination/libgslcombination.la multiset/libgslmultiset.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 rstat/libgslrstat.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 spmatrix/libgslspmatrix.la spblas/libgslspblas.la splinalg/libgslsplinalg.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 gsl_minmax.h gsl_inline.h bin_SCRIPTS = gsl-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA= gsl.pc CLEANFILES = gsl.pc gsl-config EXTRA_DIST = autogen.sh gsl-config.in gsl.pc.in configure.ac THANKS BUGS gsl.spec.in gsl.m4 test_gsl_histogram.sh pkgconfig.test lib_LTLIBRARIES = libgsl.la libgsl_la_SOURCES = version.c libgsl_la_LIBADD = $(GSL_LIBADD) $(SUBLIBS) libgsl_la_LDFLAGS = $(GSL_LDFLAGS) -version-info $(GSL_LT_VERSION) noinst_HEADERS = templates_on.h templates_off.h build.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 pkgconfig.test TESTS = test_gsl_histogram.sh pkgconfig.test #bin_PROGRAMS = main dummy #dummy_SOURCES = version.c #dummy_LDADD = $(SUBLIBS) #main_SOURCES = version.c env.c #main_LDADD = libgsl.la edit = $(SED) \ -e 's|@prefix[@]|$(prefix)|g' \ -e 's|@exec_prefix[@]|$(exec_prefix)|g' \ -e 's|@libdir[@]|$(libdir)|g' \ -e 's|@includedir[@]|$(includedir)|g' \ -e 's|@GSL_CFLAGS[@]|$(GSL_CFLAGS)|g' \ -e 's|@GSL_LIBM[@]|$(GSL_LIBM)|g' \ -e 's|@GSL_LIBS[@]|$(GSL_LIBS)|g' \ -e 's|@LIBS[@]|$(LIBS)|g' \ -e 's|@VERSION[@]|$(VERSION)|g' gsl-config gsl.pc: Makefile @rm -f $@ $@.tmp @$(edit) '$(srcdir)/$@.in' >>$@.tmp @chmod a-w $@.tmp @mv $@.tmp $@ @echo creating $@ gsl-config: $(srcdir)/gsl-config.in gsl.pc: $(srcdir)/gsl.pc.in gsl-doc-2.3/cheb/0000755000175000017500000000000013022553152011657 5ustar eddeddgsl-doc-2.3/cheb/Makefile.am0000664000175000017500000000057412616157443013736 0ustar eddeddnoinst_LTLIBRARIES = libgslcheb.la pkginclude_HEADERS = gsl_chebyshev.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/cheb/integ.c0000664000175000017500000000346512616157443013156 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; } gsl-doc-2.3/cheb/TODO0000664000175000017500000000015312616157443012363 0ustar eddedd# -*- org -*- #+CATEGORY: cheb Provide a way to save/restore coefficients, or access the coefficient data.gsl-doc-2.3/cheb/gsl_chebyshev.h0000664000175000017500000001063512616157443014677 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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); /* Return the order, size of coefficient array and coefficient array ptr */ size_t gsl_cheb_order (const gsl_cheb_series * cs); size_t gsl_cheb_size (const gsl_cheb_series * cs); double *gsl_cheb_coeffs (const gsl_cheb_series * cs); /* 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__ */ gsl-doc-2.3/cheb/init.c0000664000175000017500000000540712616157443013011 0ustar eddedd/* cheb/init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /*-*-*-*-*-*-*-*-*-*-*-* 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) { RETURN_IF_NULL (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; } size_t gsl_cheb_order (const gsl_cheb_series * cs) { return cs->order; } size_t gsl_cheb_size (const gsl_cheb_series * cs) { return (cs->order + 1); } double * gsl_cheb_coeffs (const gsl_cheb_series * cs) { return cs->c; } gsl-doc-2.3/cheb/Makefile.in0000644000175000017500000010370013022372404013724 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcheb.la pkginclude_HEADERS = gsl_chebyshev.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cheb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcheb.la: $(libgslcheb_la_OBJECTS) $(libgslcheb_la_DEPENDENCIES) $(EXTRA_libgslcheb_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcheb_la_OBJECTS) $(libgslcheb_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/integ.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/cheb/ChangeLog0000664000175000017500000000415412616157443013452 0ustar eddedd2010-03-12 Brian Gough * deriv.c (gsl_cheb_calc_deriv): shift loop variable to avoid unsigned integer wraparound when n < 3 2009-07-09 Brian Gough * init.c (gsl_cheb_free): handle NULL argument in free 2008-11-18 Brian Gough * gsl_chebyshev.h: added auxiliary functions * init.c (gsl_cheb_order, gsl_cheb_size, gsl_cheb_coeffs): added auxiliary functions 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-01-29 Brian Gough * eval.c (gsl_cheb_eval_mode_e): compute error consistently with other routines 2004-12-29 Brian Gough * gsl_chebyshev.h: added const to declaration of gsl_cheb_eval_mode to match definition 2004-12-24 Brian Gough * eval.c (gsl_cheb_eval_n_err): use eval_order instead of cs->order for error estimate 2004-12-23 Brian Gough * eval.c (gsl_cheb_eval_mode): added missing function 2004-08-27 Brian Gough * test.c (main): make the hard-coded tolerances a variable, ftol 2003-06-09 Brian Gough * test.c (main): added some tests for the coefficients 2003-02-09 Brian Gough * 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 * init.c (gsl_cheb_free): added missing free() for cs->f Fri Aug 24 19:18:23 2001 Brian Gough * test.c (main): renamed fsin to f_sin to avoid conflicts with irix math libs. Sun May 6 09:49:28 2001 Brian Gough * 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 * made deriv/integ functions thread safe * split out from specfunc directory gsl-doc-2.3/cheb/deriv.c0000664000175000017500000000327412616157443013157 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; /* error in derivative is n^2 c_n */ /* deriv->err = n * n * f->c[n-1];*/ /* 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; i>=3; i--) deriv->c[i-3] = deriv->c[i-1] + 2.0 *(i-2.0) * f->c[i-2]; for(i = 0 ; ic[i] *= con; } return GSL_SUCCESS; } gsl-doc-2.3/cheb/eval.c0000664000175000017500000001070512616157443012772 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } gsl-doc-2.3/cheb/test.c0000664000175000017500000001744012616157443013025 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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); } double f_DP (double x, void * p) { p = 0; return 2.0; } double f_P (double x, void * p) { p = 0; return 2.0*x + 3.0; } double f_IP1 (double x, void * p) { p = 0; return 30*(x+5.0)/10.0; /* first order approximation to integral over -5,5 */ } double f_IP2 (double x, void * p) { p = 0; return x*x + 3*x - 10.0; } void test_dim (const size_t n, const double a, const double b, gsl_function * F, gsl_function * DF, gsl_function *IF) { double tol = 100.0 * GSL_DBL_EPSILON; double x; gsl_cheb_series * cs = gsl_cheb_alloc(n); gsl_cheb_series * csd = gsl_cheb_alloc(n); gsl_cheb_series * csi = gsl_cheb_alloc(n); gsl_cheb_init(cs, F, a, b); for(x=a; xc, "gsl_cheb_coeffs"); } for (i = 0; iorder; 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; iorder; 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; iorder; 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 #include #include #include #include #include "integ_eval.h" #include typedef struct { double * a; /* eqs 2-5 of paper */ double * b; double * c; double * d; double * y_prime; /* eq 11 of paper */ } steffen_state_t; static void steffen_free (void * vstate); static double steffen_copysign(const double x, const double y); static void * steffen_alloc (size_t size) { steffen_state_t *state; state = (steffen_state_t *) calloc (1, sizeof (steffen_state_t)); if (state == NULL) { GSL_ERROR_NULL("failed to allocate space for state", GSL_ENOMEM); } state->a = (double *) malloc (size * sizeof (double)); if (state->a == NULL) { steffen_free(state); GSL_ERROR_NULL("failed to allocate space for a", GSL_ENOMEM); } state->b = (double *) malloc (size * sizeof (double)); if (state->b == NULL) { steffen_free(state); GSL_ERROR_NULL("failed to allocate space for b", GSL_ENOMEM); } state->c = (double *) malloc (size * sizeof (double)); if (state->c == NULL) { steffen_free(state); GSL_ERROR_NULL("failed to allocate space for c", GSL_ENOMEM); } state->d = (double *) malloc (size * sizeof (double)); if (state->d == NULL) { steffen_free(state); GSL_ERROR_NULL("failed to allocate space for d", GSL_ENOMEM); } state->y_prime = (double *) malloc (size * sizeof (double)); if (state->y_prime == NULL) { steffen_free(state); GSL_ERROR_NULL("failed to allocate space for y_prime", GSL_ENOMEM); } return state; } static int steffen_init (void * vstate, const double x_array[], const double y_array[], size_t size) { steffen_state_t *state = (steffen_state_t *) vstate; size_t i; double *a = state->a; double *b = state->b; double *c = state->c; double *d = state->d; double *y_prime = state->y_prime; /* * first assign the interval and slopes for the left boundary. * We use the "simplest possibility" method described in the paper * in section 2.2 */ double h0 = (x_array[1] - x_array[0]); double s0 = (y_array[1] - y_array[0]) / h0; y_prime[0] = s0; /* Now we calculate all the necessary s, h, p, and y' variables from 1 to N-2 (0 to size - 2 inclusive) */ for (i = 1; i < (size - 1); i++) { double pi; /* equation 6 in the paper */ double hi = (x_array[i+1] - x_array[i]); double him1 = (x_array[i] - x_array[i - 1]); /* equation 7 in the paper */ double si = (y_array[i+1] - y_array[i]) / hi; double sim1 = (y_array[i] - y_array[i - 1]) / him1; /* equation 8 in the paper */ pi = (sim1*hi + si*him1) / (him1 + hi); /* This is a C equivalent of the FORTRAN statement below eqn 11 */ y_prime[i] = (steffen_copysign(1.0,sim1) + steffen_copysign(1.0,si)) * GSL_MIN(fabs(sim1), GSL_MIN(fabs(si), 0.5*fabs(pi))); } /* * we also need y' for the rightmost boundary; we use the * "simplest possibility" method described in the paper in * section 2.2 * * y' = s_{n-1} */ y_prime[size-1] = (y_array[size - 1] - y_array[size - 2]) / (x_array[size - 1] - x_array[size - 2]); /* Now we can calculate all the coefficients for the whole range. */ for (i = 0; i < (size - 1); i++) { double hi = (x_array[i+1] - x_array[i]); double si = (y_array[i+1] - y_array[i]) / hi; /* These are from equations 2-5 in the paper. */ a[i] = (y_prime[i] + y_prime[i+1] - 2*si) / hi / hi; b[i] = (3*si - 2*y_prime[i] - y_prime[i+1]) / hi; c[i] = y_prime[i]; d[i] = y_array[i]; } return GSL_SUCCESS; } static void steffen_free (void * vstate) { steffen_state_t *state = (steffen_state_t *) vstate; RETURN_IF_NULL(state); if (state->a) free (state->a); if (state->b) free (state->b); if (state->c) free (state->c); if (state->d) free (state->d); if (state->y_prime) free (state->y_prime); free (state); } static int steffen_eval (const void * vstate, const double x_array[], const double y_array[], size_t size, double x, gsl_interp_accel * a, double *y) { const steffen_state_t *state = (const steffen_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 a = state->a[index]; const double b = state->b[index]; const double c = state->c[index]; const double d = state->d[index]; /* Use Horner's scheme for efficient evaluation of polynomials. */ /* *y = a*delx*delx*delx + b*delx*delx + c*delx + d; */ *y = d + delx*(c + delx*(b + delx*a)); return GSL_SUCCESS; } } static int steffen_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 steffen_state_t *state = (const steffen_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 a = state->a[index]; double b = state->b[index]; double c = state->c[index]; /*double d = state->d[index];*/ /* *dydx = 3*a*delx*delx*delx + 2*b*delx + c; */ *dydx = c + delx*(2*b + delx*3*a); return GSL_SUCCESS; } } static int steffen_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 steffen_state_t *state = (const steffen_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 a = state->a[index]; const double b = state->b[index]; *y_pp = 6*a*delx + 2*b; return GSL_SUCCESS; } } static int steffen_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) { /* a and b are the boundaries of the integration. */ const steffen_state_t *state = (const steffen_state_t *) vstate; size_t i, index_a, index_b; /* Find the data points in the x_array that are nearest to the desired */ /* a and b integration boundaries. */ 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; /* Iterate over all the segments between data points and sum the */ /* contributions into result. */ 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 dx = x_hi - x_lo; if(dx != 0.0) { /* * check if we are at a boundary point, so take the * a and b parameters instead of the data points. */ double x1 = (i == index_a) ? a-x_lo : 0.0; double x2 = (i == index_b) ? b-x_lo : x_hi-x_lo; *result += (1.0/4.0)*state->a[i]*(x2*x2*x2*x2 - x1*x1*x1*x1) +(1.0/3.0)*state->b[i]*(x2*x2*x2 - x1*x1*x1) +(1.0/2.0)*state->c[i]*(x2*x2 - x1*x1) +state->d[i]*(x2-x1); } else /* if the interval was zero, i.e. consecutive x values in data. */ { *result = 0.0; return GSL_EINVAL; } } return GSL_SUCCESS; } static double steffen_copysign(const double x, const double y) { if ((x < 0 && y > 0) || (x > 0 && y < 0)) return -x; return x; } static const gsl_interp_type steffen_type = { "steffen", 3, &steffen_alloc, &steffen_init, &steffen_eval, &steffen_eval_deriv, &steffen_eval_deriv2, &steffen_eval_integ, &steffen_free }; const gsl_interp_type * gsl_interp_steffen = &steffen_type; gsl-doc-2.3/interpolation/interp2d.c0000664000175000017500000003157312616157443015566 0ustar eddedd/* interpolation/interp2d.c * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /** * Triggers a GSL error if the argument is not equal to GSL_SUCCESS. * If the argument is GSL_SUCCESS, this does nothing. */ #define DISCARD_STATUS(s) if ((s) != GSL_SUCCESS) { GSL_ERROR_VAL("interpolation error", (s), GSL_NAN); } #define IDX2D(i, j, w) ((j) * ((w)->xsize) + (i)) gsl_interp2d * gsl_interp2d_alloc(const gsl_interp2d_type * T, const size_t xsize, const size_t ysize) { gsl_interp2d * interp; if (xsize < T->min_size || ysize < T->min_size) { GSL_ERROR_NULL ("insufficient number of points for interpolation type", GSL_EINVAL); } interp = (gsl_interp2d *) calloc(1, sizeof(gsl_interp2d)); if (interp == NULL) { GSL_ERROR_NULL ("failed to allocate space for gsl_interp2d struct", GSL_ENOMEM); } interp->type = T; interp->xsize = xsize; interp->ysize = ysize; if (interp->type->alloc == NULL) { interp->state = NULL; return interp; } interp->state = interp->type->alloc(xsize, ysize); if (interp->state == NULL) { free(interp); GSL_ERROR_NULL ("failed to allocate space for gsl_interp2d state", GSL_ENOMEM); } return interp; } /* gsl_interp2d_alloc() */ void gsl_interp2d_free (gsl_interp2d * interp) { RETURN_IF_NULL(interp); if (interp->type->free) interp->type->free(interp->state); free(interp); } /* gsl_interp2d_free() */ int gsl_interp2d_init (gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const size_t xsize, const size_t ysize) { size_t i; if (xsize != interp->xsize || ysize != interp->ysize) { GSL_ERROR("data must match size of interpolation object", GSL_EINVAL); } for (i = 1; i < xsize; i++) { if (xarr[i-1] >= xarr[i]) { GSL_ERROR("x values must be strictly increasing", GSL_EINVAL); } } for (i = 1; i < ysize; i++) { if (yarr[i-1] >= yarr[i]) { GSL_ERROR("y values must be strictly increasing", GSL_EINVAL); } } interp->xmin = xarr[0]; interp->xmax = xarr[xsize - 1]; interp->ymin = yarr[0]; interp->ymax = yarr[ysize - 1]; { int status = interp->type->init(interp->state, xarr, yarr, zarr, xsize, ysize); return status; } } /* gsl_interp2d_init() */ /* * A wrapper function that checks boundary conditions, calls an evaluator * which implements the actual calculation of the function value or * derivative etc., and checks the return status. */ static int interp2d_eval(int (*evaluator)(const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel *, gsl_interp_accel *, double * z), const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * result) { if (x < interp->xmin || x > interp->xmax) { GSL_ERROR ("interpolation x value out of range", GSL_EDOM); } else if (y < interp->ymin || y > interp->ymax) { GSL_ERROR ("interpolation y value out of range", GSL_EDOM); } return evaluator(interp->state, xarr, yarr, zarr, interp->xsize, interp->ysize, x, y, xa, ya, result); } /* * Another wrapper function that serves as a drop-in replacement for * interp2d_eval but does not check the bounds. This can be used * for extrapolation. */ static int interp2d_eval_extrap(int (*evaluator)(const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel *, gsl_interp_accel *, double * z), const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * result) { return evaluator(interp->state, xarr, yarr, zarr, interp->xsize, interp->ysize, x, y, xa, ya, result); } double gsl_interp2d_eval (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } /* gsl_interp2d_eval() */ double gsl_interp2d_eval_extrap (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = interp2d_eval_extrap(interp->type->eval, interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval, interp, xarr, yarr, zarr, x, y, xa, ya, z); } /* gsl_interp2d_eval_e() */ int gsl_interp2d_eval_e_extrap (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval_extrap(interp->type->eval, interp, xarr, yarr, zarr, x, y, xa, ya, z); } double gsl_interp2d_eval_deriv_x (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_deriv_x_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_deriv_x_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval_deriv_x, interp, xarr, yarr, zarr, x, y, xa, ya, z); } double gsl_interp2d_eval_deriv_y (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_deriv_y_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_deriv_y_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval_deriv_y, interp, xarr, yarr, zarr, x, y, xa, ya, z); } double gsl_interp2d_eval_deriv_xx (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_deriv_xx_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_deriv_xx_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval_deriv_xx, interp, xarr, yarr, zarr, x, y, xa, ya, z); } double gsl_interp2d_eval_deriv_yy (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_deriv_yy_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_deriv_yy_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval_deriv_yy, interp, xarr, yarr, zarr, x, y, xa, ya, z); } double gsl_interp2d_eval_deriv_xy (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { double z; int status = gsl_interp2d_eval_deriv_xy_e(interp, xarr, yarr, zarr, x, y, xa, ya, &z); DISCARD_STATUS(status) return z; } int gsl_interp2d_eval_deriv_xy_e (const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return interp2d_eval(interp->type->eval_deriv_xy, interp, xarr, yarr, zarr, x, y, xa, ya, z); } size_t gsl_interp2d_type_min_size(const gsl_interp2d_type * T) { return T->min_size; } size_t gsl_interp2d_min_size(const gsl_interp2d * interp) { return interp->type->min_size; } const char * gsl_interp2d_name(const gsl_interp2d * interp) { return interp->type->name; } size_t gsl_interp2d_idx(const gsl_interp2d * interp, const size_t i, const size_t j) { if (i >= interp->xsize) { GSL_ERROR_VAL ("x index out of range", GSL_ERANGE, 0); } else if (j >= interp->ysize) { GSL_ERROR_VAL ("y index out of range", GSL_ERANGE, 0); } else { return IDX2D(i, j, interp); } } /* gsl_interp2d_idx() */ int gsl_interp2d_set(const gsl_interp2d * interp, double zarr[], const size_t i, const size_t j, const double z) { if (i >= interp->xsize) { GSL_ERROR ("x index out of range", GSL_ERANGE); } else if (j >= interp->ysize) { GSL_ERROR ("y index out of range", GSL_ERANGE); } else { zarr[IDX2D(i, j, interp)] = z; return GSL_SUCCESS; } } /* gsl_interp2d_set() */ double gsl_interp2d_get(const gsl_interp2d * interp, const double zarr[], const size_t i, const size_t j) { if (i >= interp->xsize) { GSL_ERROR_VAL ("x index out of range", GSL_ERANGE, 0); } else if (j >= interp->ysize) { GSL_ERROR_VAL ("y index out of range", GSL_ERANGE, 0); } else { return zarr[IDX2D(i, j, interp)]; } } /* gsl_interp2d_get() */ #undef IDX2D gsl-doc-2.3/interpolation/Makefile.am0000664000175000017500000000145412616157443015722 0ustar eddeddnoinst_LTLIBRARIES = libgslinterpolation.la check_PROGRAMS = test pkginclude_HEADERS = gsl_interp.h gsl_spline.h gsl_interp2d.h gsl_spline2d.h libgslinterpolation_la_SOURCES = accel.c akima.c cspline.c interp.c linear.c integ_eval.h spline.c poly.c steffen.c inline.c interp2d.c bilinear.c bicubic.c spline2d.c noinst_HEADERS = test2d.c AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/interpolation/test2d.c0000664000175000017500000003326712616157443015246 0ustar eddedd/* interpolation/test2d.c * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* tests a single evaluator function from the low-level interface */ static int test_single_low_level( double (*evaluator)(const gsl_interp2d *, const double[], const double[], const double[], const double, const double, gsl_interp_accel *, gsl_interp_accel *), int (*evaluator_e)(const gsl_interp2d *, const double[], const double[], const double[], const double, const double, gsl_interp_accel *, gsl_interp_accel *, double *), const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, const double expected_results[], size_t i) { if (expected_results != NULL) { int status; double result = evaluator(interp, xarr, yarr, zarr, x, y, xa, ya); gsl_test_rel(result, expected_results[i], 1e-10, "low level %s %d", gsl_interp2d_name(interp), i); status = evaluator_e(interp, xarr, yarr, zarr, x, y, xa, ya, &result); if (status == GSL_SUCCESS) { gsl_test_rel(result, expected_results[i], 1e-10, "low level _e %s %d", gsl_interp2d_name(interp), i); } } return 0; } /* tests a single evaluator function from the high-level interface */ static int test_single_high_level( double (*evaluator)(const gsl_spline2d *, const double, const double, gsl_interp_accel *, gsl_interp_accel *), int (*evaluator_e)(const gsl_spline2d *, const double, const double, gsl_interp_accel *, gsl_interp_accel *, double *), const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, const double expected_results[], size_t i) { if (expected_results != NULL) { int status; double result = evaluator(interp, x, y, xa, ya); gsl_test_rel(result, expected_results[i], 1e-10, "high level %s %d", gsl_spline2d_name(interp), i); status = evaluator_e(interp, x, y, xa, ya, &result); if (status == GSL_SUCCESS) { gsl_test_rel(result, expected_results[i], 1e-10, "high level _e %s %d", gsl_spline2d_name(interp), i); } } return 0; } /* * Tests that a given interpolation type reproduces the data points * it is given, and then tests that it correctly reproduces additional * values. */ static int test_interp2d( const double xarr[], const double yarr[], const double zarr[], /* data */ size_t xsize, size_t ysize, /* array sizes */ const double xval[], const double yval[], /* test points */ const double zval[], /* expected results */ const double zxval[], const double zyval[], const double zxxval[], const double zyyval[], const double zxyval[], size_t test_size, /* number of test points */ const gsl_interp2d_type * T) { gsl_interp_accel *xa = gsl_interp_accel_alloc(); gsl_interp_accel *ya = gsl_interp_accel_alloc(); int status = 0; size_t xi, yi, zi, i; gsl_interp2d * interp = gsl_interp2d_alloc(T, xsize, ysize); gsl_spline2d * interp_s = gsl_spline2d_alloc(T, xsize, ysize); unsigned int min_size = gsl_interp2d_type_min_size(T); gsl_test_int(min_size, T->min_size, "gsl_interp2d_type_min_size on %s", gsl_interp2d_name(interp)); gsl_interp2d_init(interp, xarr, yarr, zarr, xsize, ysize); gsl_spline2d_init(interp_s, xarr, yarr, zarr, xsize, ysize); /* First check that the interpolation reproduces the given points */ for (xi = 0; xi < xsize; xi++) { double x = xarr[xi]; for (yi = 0; yi < ysize; yi++) { double y = yarr[yi]; zi = gsl_interp2d_idx(interp, xi, yi); test_single_low_level(&gsl_interp2d_eval, &gsl_interp2d_eval_e, interp, xarr, yarr, zarr, x, y, xa, ya, zarr, zi); test_single_low_level(&gsl_interp2d_eval_extrap, &gsl_interp2d_eval_e_extrap, interp, xarr, yarr, zarr, x, y, xa, ya, zarr, zi); test_single_high_level(&gsl_spline2d_eval, &gsl_spline2d_eval_e, interp_s, x, y, xa, ya, zarr, zi); } } /* Then check additional points provided */ for (i = 0; i < test_size; i++) { double x = xval[i]; double y = yval[i]; test_single_low_level(&gsl_interp2d_eval, &gsl_interp2d_eval_e, interp, xarr, yarr, zarr, x, y, xa, ya, zval, i); test_single_low_level(&gsl_interp2d_eval_deriv_x, &gsl_interp2d_eval_deriv_x_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxval, i); test_single_low_level(&gsl_interp2d_eval_deriv_y, &gsl_interp2d_eval_deriv_y_e, interp, xarr, yarr, zarr, x, y, xa, ya, zyval, i); test_single_low_level(&gsl_interp2d_eval_deriv_xx,&gsl_interp2d_eval_deriv_xx_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxxval, i); test_single_low_level(&gsl_interp2d_eval_deriv_yy,&gsl_interp2d_eval_deriv_yy_e, interp, xarr, yarr, zarr, x, y, xa, ya, zyyval, i); test_single_low_level(&gsl_interp2d_eval_deriv_xy,&gsl_interp2d_eval_deriv_xy_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxyval, i); test_single_high_level(&gsl_spline2d_eval, &gsl_spline2d_eval_e, interp_s, x, y, xa, ya, zval, i); test_single_high_level(&gsl_spline2d_eval_deriv_x, &gsl_spline2d_eval_deriv_x_e, interp_s, x, y, xa, ya, zxval, i); test_single_high_level(&gsl_spline2d_eval_deriv_y, &gsl_spline2d_eval_deriv_y_e, interp_s, x, y, xa, ya, zyval, i); test_single_high_level(&gsl_spline2d_eval_deriv_xx,&gsl_spline2d_eval_deriv_xx_e, interp_s, x, y, xa, ya, zxxval, i); test_single_high_level(&gsl_spline2d_eval_deriv_yy,&gsl_spline2d_eval_deriv_yy_e, interp_s, x, y, xa, ya, zyyval, i); test_single_high_level(&gsl_spline2d_eval_deriv_xy,&gsl_spline2d_eval_deriv_xy_e, interp_s, x, y, xa, ya, zxyval, i); test_single_low_level(&gsl_interp2d_eval_extrap, &gsl_interp2d_eval_e_extrap, interp, xarr, yarr, zarr, x, y, xa, ya, zval, i); } gsl_interp_accel_free(xa); gsl_interp_accel_free(ya); gsl_interp2d_free(interp); gsl_spline2d_free(interp_s); return status; } /* * Tests bilinear interpolation using a symmetric function, f(x,y)==f(y,x), * and diagonal interpolation points (x,y) where x==y. If these tests don't * pass, something is seriously broken. */ static int test_bilinear_symmetric() { int status; double xarr[] = {0.0, 1.0, 2.0, 3.0}; double yarr[] = {0.0, 1.0, 2.0, 3.0}; double zarr[] = {1.0, 1.1, 1.2, 1.3, 1.1, 1.2, 1.3, 1.4, 1.2, 1.3, 1.4, 1.5, 1.3, 1.4, 1.5, 1.6}; double xval[] = {0.0, 0.5, 1.0, 1.5, 2.5, 3.0}; double yval[] = {0.0, 0.5, 1.0, 1.5, 2.5, 3.0}; double zval[] = {1.0, 1.1, 1.2, 1.3, 1.5, 1.6}; size_t xsize = sizeof(xarr) / sizeof(xarr[0]); size_t ysize = sizeof(yarr) / sizeof(yarr[0]); size_t test_size = sizeof(xval) / sizeof(xval[0]); status = test_interp2d(xarr, yarr, zarr, xsize, ysize, xval, yval, zval, NULL, NULL, NULL, NULL, NULL, test_size, gsl_interp2d_bilinear); gsl_test(status, "bilinear interpolation with symmetric values"); return status; } /* * Tests bilinear interpolation with an asymmetric function, f(x,y)!=f(y,x), * and off-diagonal interpolation points (x,y) where x and y may or may not * be equal. */ static int test_bilinear_asymmetric_z() { int status; double xarr[] = {0.0, 1.0, 2.0, 3.0}; double yarr[] = {0.0, 1.0, 2.0, 3.0}; double zarr[] = {1.0, 1.1, 1.2, 1.4, 1.3, 1.4, 1.5, 1.7, 1.5, 1.6, 1.7, 1.9, 1.6, 1.9, 2.2, 2.3}; double xval[] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0, 1.3954, 1.6476, 0.824957, 2.41108, 2.98619, 1.36485 }; double yval[] = {0.0, 0.5, 1.0, 1.5, 2.5, 3.0, 0.265371, 2.13849, 1.62114, 1.22198, 0.724681, 0.0596087 }; /* results computed using Mathematica 9.0.1.0 */ double zval[] = {1.0, 1.2, 1.4, 1.55, 2.025, 2.3, 1.2191513, 1.7242442248, 1.5067237, 1.626612, 1.6146423, 1.15436761}; size_t xsize = sizeof(xarr) / sizeof(xarr[0]); size_t ysize = sizeof(yarr) / sizeof(yarr[0]); size_t test_size = sizeof(xval) / sizeof(xval[0]); status = test_interp2d(xarr, yarr, zarr, xsize, ysize, xval, yval, zval, NULL, NULL, NULL, NULL, NULL, test_size, gsl_interp2d_bilinear); gsl_test(status, "bilinear interpolation with asymmetric z values"); return status; } static int test_bicubic() { int status; double xarr[] = {0.0, 1.0, 2.0, 3.0}; double yarr[] = {0.0, 1.0, 2.0, 3.0}; double zarr[] = {1.0, 1.1, 1.2, 1.3, 1.1, 1.2, 1.3, 1.4, 1.2, 1.3, 1.4, 1.5, 1.3, 1.4, 1.5, 1.6}; double xval[] = {1.0, 1.5, 2.0}; double yval[] = {1.0, 1.5, 2.0}; double zval[] = {1.2, 1.3, 1.4}; size_t xsize = sizeof(xarr) / sizeof(xarr[0]); size_t ysize = sizeof(yarr) / sizeof(yarr[0]); size_t test_size = sizeof(xval) / sizeof(xval[0]); status = test_interp2d(xarr, yarr, zarr, xsize, ysize, xval, yval, zval, NULL, NULL, NULL, NULL, NULL, test_size, gsl_interp2d_bicubic); gsl_test(status, "bicubic interpolation on linear function"); return status; } static int test_bicubic_nonlinear() { int status; double xarr[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0}; double yarr[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0}; /* least common multiple of x and y */ double zarr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 6, 4, 10, 6, 14, 8, 3, 6, 3, 12, 15, 6, 21, 24, 4, 4, 12, 4, 20, 12, 28, 8, 5, 10, 15, 20, 5, 30, 35, 40, 6, 6, 6, 12, 30, 6, 42, 24, 7, 14, 21, 28, 35, 42, 7, 56, 8, 8, 24, 8, 40, 24, 56, 8}; double xval[] = {1.4, 2.3, 4.7, 3.3, 7.5, 6.6, 5.1}; double yval[] = {1.0, 1.8, 1.9, 2.5, 2.7, 4.1, 3.3}; /* results computed using GSL 1D cubic interpolation twice */ double zval[] = { 1.4, 3.11183531264736, 8.27114315792559, 5.03218982537718, 22.13230634702637, 23.63206834997871, 17.28553080971182 }; size_t xsize = sizeof(xarr) / sizeof(xarr[0]); size_t ysize = sizeof(yarr) / sizeof(yarr[0]); size_t test_size = sizeof(xval) / sizeof(xval[0]); status = test_interp2d(xarr, yarr, zarr, xsize, ysize, xval, yval, zval, NULL, NULL, NULL, NULL, NULL, test_size, gsl_interp2d_bicubic); gsl_test(status, "bicubic interpolation on nonlinear symmetric function"); return status; } /* This function contributed by Andrew W. Steiner */ static int test_bicubic_nonlinear_nonsq() { int status; double xarr[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; double yarr[] = {1.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0}; double zarr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 6, 4, 10, 6, 14, 8, 11, 12, 3, 6, 3, 12, 15, 6, 21, 24, 13, 14, 4, 4, 12, 4, 20, 12, 28, 8, 15, 16, 5, 10, 15, 20, 5, 30, 35, 40, 17, 18, 6, 6, 6, 12, 30, 6, 42, 24, 19, 20, 7, 14, 21, 28, 35, 42, 7, 56, 21, 22, 8, 8, 24, 8, 40, 24, 56, 8, 23, 24}; double xval[] = {1.4, 2.3, 9.7, 3.3, 9.5, 6.6, 5.1}; double yval[] = {1.0, 1.8, 1.9, 2.5, 2.7, 4.1, 3.3}; /* results computed using GSL 1D cubic interpolation twice */ double zval[] = { 1.4, 2.46782030941187003, 10.7717721621846465, 4.80725067958096375, 11.6747032398627297, 11.2619968682970111, 9.00168877916872567}; size_t xsize = sizeof(xarr) / sizeof(xarr[0]); size_t ysize = sizeof(yarr) / sizeof(yarr[0]); size_t test_size = sizeof(xval) / sizeof(xval[0]); status = test_interp2d(xarr, yarr, zarr, xsize, ysize, xval, yval, zval, NULL, NULL, NULL, NULL, NULL, test_size, gsl_interp2d_bicubic); gsl_test(status, "bicubic interpolation on nonlinear symmetric function"); return status; } /* runs all the tests */ int test_interp2d_main(void) { int status = 0; status += test_bilinear_symmetric(); status += test_bilinear_asymmetric_z(); status += test_bicubic(); status += test_bicubic_nonlinear(); status += test_bicubic_nonlinear_nonsq(); return status; } gsl-doc-2.3/interpolation/gsl_interp2d.h0000664000175000017500000002113312616157443016427 0ustar eddedd/* interpolation/gsl_interp2d.h * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_INTERP2D_H__ #define __GSL_INTERP2D_H__ #include #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 int min_size; void * (*alloc)(size_t xsize, size_t ysize); int (*init)(void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize); int (*eval)(const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z); int (*eval_deriv_x) (const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z_p); int (*eval_deriv_y) (const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z_p); int (*eval_deriv_xx) (const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z_pp); int (*eval_deriv_xy) (const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z_pp); int (*eval_deriv_yy) (const void *, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel*, gsl_interp_accel*, double* z_pp); void (*free)(void *); } gsl_interp2d_type; typedef struct { const gsl_interp2d_type * type; /* interpolation type */ double xmin; /* minimum value of x for which data have been provided */ double xmax; /* maximum value of x for which data have been provided */ double ymin; /* minimum value of y for which data have been provided */ double ymax; /* maximum value of y for which data have been provided */ size_t xsize; /* number of x values provided */ size_t ysize; /* number of y values provided */ void * state; /* internal state object specific to the interpolation type */ } gsl_interp2d; /* available types */ GSL_VAR const gsl_interp2d_type * gsl_interp2d_bilinear; GSL_VAR const gsl_interp2d_type * gsl_interp2d_bicubic; gsl_interp2d * gsl_interp2d_alloc(const gsl_interp2d_type * T, const size_t xsize, const size_t ysize); const char * gsl_interp2d_name(const gsl_interp2d * interp); size_t gsl_interp2d_min_size(const gsl_interp2d * interp); size_t gsl_interp2d_type_min_size(const gsl_interp2d_type * T); int gsl_interp2d_set(const gsl_interp2d * interp, double zarr[], const size_t i, const size_t j, const double z); double gsl_interp2d_get(const gsl_interp2d * interp, const double zarr[], const size_t i, const size_t j); size_t gsl_interp2d_idx(const gsl_interp2d * interp, const size_t i, const size_t j); int gsl_interp2d_init(gsl_interp2d * interp, const double xa[], const double ya[], const double za[], const size_t xsize, const size_t ysize); void gsl_interp2d_free(gsl_interp2d * interp); double gsl_interp2d_eval(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); double gsl_interp2d_eval_extrap(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); int gsl_interp2d_eval_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); int gsl_interp2d_eval_e_extrap(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); double gsl_interp2d_eval_deriv_x(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); int gsl_interp2d_eval_deriv_x_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); double gsl_interp2d_eval_deriv_y(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_interp2d_eval_deriv_y_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); double gsl_interp2d_eval_deriv_xx(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); int gsl_interp2d_eval_deriv_xx_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); double gsl_interp2d_eval_deriv_yy(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); int gsl_interp2d_eval_deriv_yy_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); double gsl_interp2d_eval_deriv_xy(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya); int gsl_interp2d_eval_deriv_xy_e(const gsl_interp2d * interp, const double xarr[], const double yarr[], const double zarr[], const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z); __END_DECLS #endif /* __GSL_INTERP2D_H__ */ gsl-doc-2.3/interpolation/cspline.c0000664000175000017500000003046412616157443015472 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "integ_eval.h" #include 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_EINVAL; } } 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_EINVAL; } } 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_EINVAL; } } 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; gsl-doc-2.3/interpolation/spline2d.c0000664000175000017500000002031012616157443015542 0ustar eddedd/* interpolation/spline2d.c * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include gsl_spline2d * gsl_spline2d_alloc(const gsl_interp2d_type * T, size_t xsize, size_t ysize) { double * array_mem; gsl_spline2d * interp; if (xsize < T->min_size || ysize < T->min_size) { GSL_ERROR_NULL("insufficient number of points for interpolation type", GSL_EINVAL); } interp = calloc(1, sizeof(gsl_spline2d)); if (interp == NULL) { GSL_ERROR_NULL("failed to allocate space for gsl_spline2d struct", GSL_ENOMEM); } interp->interp_object.type = T; interp->interp_object.xsize = xsize; interp->interp_object.ysize = ysize; if (interp->interp_object.type->alloc == NULL) { interp->interp_object.state = NULL; } else { interp->interp_object.state = interp->interp_object.type->alloc(xsize, ysize); if (interp->interp_object.state == NULL) { gsl_spline2d_free(interp); GSL_ERROR_NULL("failed to allocate space for gsl_spline2d state", GSL_ENOMEM); } } /* * Use one contiguous block of memory for all three data arrays. * That way the code fails immediately if there isn't sufficient space for everything, * rather than allocating one or two and then having to free them. */ array_mem = (double *)calloc(xsize + ysize + xsize * ysize, sizeof(double)); if (array_mem == NULL) { gsl_spline2d_free(interp); GSL_ERROR_NULL("failed to allocate space for data arrays", GSL_ENOMEM); } interp->xarr = array_mem; interp->yarr = array_mem + xsize; interp->zarr = array_mem + xsize + ysize; return interp; } /* gsl_spline2d_alloc() */ int gsl_spline2d_init(gsl_spline2d * interp, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize) { int status = gsl_interp2d_init(&(interp->interp_object), xarr, yarr, zarr, xsize, ysize); memcpy(interp->xarr, xarr, xsize * sizeof(double)); memcpy(interp->yarr, yarr, ysize * sizeof(double)); memcpy(interp->zarr, zarr, xsize * ysize * sizeof(double)); return status; } /* gsl_spline2d_init() */ void gsl_spline2d_free(gsl_spline2d * interp) { RETURN_IF_NULL(interp); if (interp->interp_object.type->free) interp->interp_object.type->free(interp->interp_object.state); /* * interp->xarr points to the beginning of one contiguous block of memory * that holds interp->xarr, interp->yarr, and interp->zarr. So it all gets * freed with one call. cf. gsl_spline2d_alloc() implementation */ if (interp->xarr) free(interp->xarr); free(interp); } /* gsl_spline2d_free() */ double gsl_spline2d_eval(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } double gsl_spline2d_eval_deriv_x(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_deriv_x(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_deriv_x_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_deriv_x_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } double gsl_spline2d_eval_deriv_y(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_deriv_y(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_deriv_y_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_deriv_y_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } double gsl_spline2d_eval_deriv_xx(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_deriv_xx(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_deriv_xx_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_deriv_xx_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } double gsl_spline2d_eval_deriv_yy(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_deriv_yy(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_deriv_yy_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_deriv_yy_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } double gsl_spline2d_eval_deriv_xy(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_deriv_xy(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_deriv_xy_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { return gsl_interp2d_eval_deriv_xy_e(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya, z); } size_t gsl_spline2d_min_size(const gsl_spline2d * interp) { return gsl_interp2d_min_size(&(interp->interp_object)); } const char * gsl_spline2d_name(const gsl_spline2d * interp) { return gsl_interp2d_name(&(interp->interp_object)); } int gsl_spline2d_set(const gsl_spline2d * interp, double zarr[], const size_t i, const size_t j, const double z) { return gsl_interp2d_set(&(interp->interp_object), zarr, i, j, z); } /* gsl_spline2d_set() */ double gsl_spline2d_get(const gsl_spline2d * interp, const double zarr[], const size_t i, const size_t j) { return gsl_interp2d_get(&(interp->interp_object), zarr, i, j); } /* gsl_spline2d_get() */ gsl-doc-2.3/interpolation/linear.c0000664000175000017500000001071612616157443015305 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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; gsl-doc-2.3/interpolation/bilinear.c0000664000175000017500000001420612616157443015616 0ustar eddedd/* interpolation/bilinear.c * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #define IDX2D(i, j, xsize, ysize) ((j) * (xsize) + (i)) static int bilinear_init(void * state, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize) { return GSL_SUCCESS; } static int bilinear_eval(const void * state, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { double xmin, xmax, ymin, ymax, zminmin, zminmax, zmaxmin, zmaxmax; double dx, dy; double t, u; size_t xi, yi; if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, xsize, ysize)]; zminmax = zarr[IDX2D(xi, yi + 1, xsize, ysize)]; zmaxmin = zarr[IDX2D(xi + 1, yi, xsize, ysize)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, xsize, ysize)]; dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; *z = (1.-t)*(1.-u)*zminmin + t*(1.-u)*zmaxmin + (1.-t)*u*zminmax + t*u*zmaxmax; return GSL_SUCCESS; } static int bilinear_deriv_x(const void * state, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_p) { double xmin, xmax, ymin, ymax, zminmin, zminmax, zmaxmin, zmaxmax; double dx, dy; double dt, u; size_t xi, yi; if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, xsize, ysize)]; zminmax = zarr[IDX2D(xi, yi + 1, xsize, ysize)]; zmaxmin = zarr[IDX2D(xi + 1, yi, xsize, ysize)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, xsize, ysize)]; dx = xmax - xmin; dy = ymax - ymin; dt = 1./dx; /* partial t / partial x */ u = (y - ymin)/dy; *z_p = dt*(-(1.-u)*zminmin + (1.-u)*zmaxmin - u*zminmax + u*zmaxmax); return GSL_SUCCESS; } static int bilinear_deriv_y(const void * state, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_p) { double xmin, xmax, ymin, ymax, zminmin, zminmax, zmaxmin, zmaxmax; double dx, dy; double t, du; size_t xi, yi; if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, xsize, ysize)]; zminmax = zarr[IDX2D(xi, yi + 1, xsize, ysize)]; zmaxmin = zarr[IDX2D(xi + 1, yi, xsize, ysize)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, xsize, ysize)]; dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; du = 1./dy; /* partial u / partial y */ *z_p = du*(-(1.-t)*zminmin - t*zmaxmin + (1.-t)*zminmax + t*zmaxmax); return GSL_SUCCESS; } static int bilinear_deriv2(const void * state, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_pp) { *z_pp = 0.0; return GSL_SUCCESS; } static int bilinear_derivxy(const void * state, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_pp) { double xmin, xmax, ymin, ymax, zminmin, zminmax, zmaxmin, zmaxmax; double dx, dy; double dt, du; size_t xi, yi; if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, xsize, ysize)]; zminmax = zarr[IDX2D(xi, yi + 1, xsize, ysize)]; zmaxmin = zarr[IDX2D(xi + 1, yi, xsize, ysize)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, xsize, ysize)]; dx = xmax - xmin; dy = ymax - ymin; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ *z_pp = dt*du*(zminmin-zmaxmin-zminmax+zmaxmax); return GSL_SUCCESS; } static const gsl_interp2d_type bilinear_type = { "bilinear", 2, NULL, &bilinear_init, &bilinear_eval, &bilinear_deriv_x, &bilinear_deriv_y, &bilinear_deriv2, &bilinear_derivxy, &bilinear_deriv2, NULL }; const gsl_interp2d_type * gsl_interp2d_bilinear = &bilinear_type; #undef IDX2D gsl-doc-2.3/interpolation/TODO0000664000175000017500000000066412616157443014360 0ustar eddedd# -*- org -*- #+CATEGORY: interpolation 1. need to add a test for the akima splines 2. [DOCUMENTATION] From: Conrad Curry 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. gsl-doc-2.3/interpolation/poly.c0000664000175000017500000001035512616157443015015 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; gsl-doc-2.3/interpolation/accel.c0000664000175000017500000000271012616157443015075 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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; } void gsl_interp_accel_free (gsl_interp_accel * a) { RETURN_IF_NULL (a); free (a); } gsl-doc-2.3/interpolation/gsl_spline2d.h0000664000175000017500000001100612616157443016416 0ustar eddedd/* interpolation/gsl_spline2d.h * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_SPLINE2D_H__ #define __GSL_SPLINE2D_H__ #include #include #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 2D interpolation object which stores the arrays defining the function. * In all other respects, this is just like a gsl_interp2d object. */ typedef struct { gsl_interp2d interp_object; /* low-level interpolation object */ double * xarr; /* x data array */ double * yarr; /* y data array */ double * zarr; /* z data array */ } gsl_spline2d; gsl_spline2d * gsl_spline2d_alloc(const gsl_interp2d_type * T, size_t xsize, size_t ysize); int gsl_spline2d_init(gsl_spline2d * interp, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize); void gsl_spline2d_free(gsl_spline2d * interp); double gsl_spline2d_eval(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); double gsl_spline2d_eval_deriv_x(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_deriv_x_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); double gsl_spline2d_eval_deriv_y(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_deriv_y_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); double gsl_spline2d_eval_deriv_xx(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_deriv_xx_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); double gsl_spline2d_eval_deriv_yy(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_deriv_yy_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); double gsl_spline2d_eval_deriv_xy(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_deriv_xy_e(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double * z); size_t gsl_spline2d_min_size(const gsl_spline2d * interp); const char * gsl_spline2d_name(const gsl_spline2d * interp); int gsl_spline2d_set(const gsl_spline2d * interp, double zarr[], const size_t i, const size_t j, const double z); double gsl_spline2d_get(const gsl_spline2d * interp, const double zarr[], const size_t i, const size_t j); __END_DECLS #endif /* __GSL_SPLINE2D_H__ */ gsl-doc-2.3/interpolation/inline.c0000664000175000017500000000175712616157443015316 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/interpolation/spline.c0000664000175000017500000001205612616157443015324 0ustar eddedd/* interpolation/spline.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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); } gsl-doc-2.3/interpolation/Makefile.in0000644000175000017500000010702313022372405015715 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslinterpolation_la_LIBADD = am_libgslinterpolation_la_OBJECTS = accel.lo akima.lo cspline.lo \ interp.lo linear.lo spline.lo poly.lo steffen.lo inline.lo \ interp2d.lo bilinear.lo bicubic.lo spline2d.lo libgslinterpolation_la_OBJECTS = $(am_libgslinterpolation_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslinterpolation.la pkginclude_HEADERS = gsl_interp.h gsl_spline.h gsl_interp2d.h gsl_spline2d.h libgslinterpolation_la_SOURCES = accel.c akima.c cspline.c interp.c linear.c integ_eval.h spline.c poly.c steffen.c inline.c interp2d.c bilinear.c bicubic.c spline2d.c noinst_HEADERS = test2d.c AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu interpolation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslinterpolation.la: $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_DEPENDENCIES) $(EXTRA_libgslinterpolation_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/akima.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bicubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bilinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poly.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/interpolation/ChangeLog0000664000175000017500000001063512616157443015441 0ustar eddedd2011-01-15 Brian Gough * interp.c (gsl_interp_type_min_size): added function to get min_size from type instead of interp object 2010-12-09 Brian Gough * cspline.c (cspline_eval, cspline_eval_deriv) (cspline_eval_deriv2, cspline_eval_integ): return GSL_EINVAL for out of range values instead of GSL_FAILURE * akima.c (akima_eval_integ): return GSL_EINVAL for out of range values instead of GSL_FAILURE * interp.c (gsl_interp_eval_e, gsl_interp_eval) (gsl_interp_eval_deriv_e, gsl_interp_eval_deriv) (gsl_interp_eval_deriv2_e, gsl_interp_eval_deriv2) (gsl_interp_eval_integ_e, gsl_interp_eval_integ): return NaN and an error code of GSL_EDOM when x is out of range 2009-07-09 Brian Gough * spline.c (gsl_spline_free): handle NULL argument in free * interp.c (gsl_interp_free): handle NULL argument in free * accel.c (gsl_interp_accel_free): handle NULL argument in free 2008-09-05 Brian Gough * gsl_interp.h (gsl_interp_accel_find): corrected condition for x>=xa. 2008-07-03 Brian Gough * gsl_interp.h: added inline declarations * accel.c: moved gsl_interp_accel_find to inline.c * bsearch.h bsearch.c: removed, moved to inline.c * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-03-14 Brian Gough * interp.c (gsl_interp_init): added check for monotonically increasing x 2005-12-24 Brian Gough * cspline.c (cspline_init_periodic): fix invalid memory access of xa[3] for sys_size=2 2005-12-22 Brian Gough * test.c (test_cspline2): added extra test of cspline (test_cspline3): added extra test of cspline 2004-11-28 Brian Gough * 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 * cspline.c (cspline_init): handle the case N=1 specially 2003-07-24 Brian Gough * gsl_interp.h: removed duplicate declaration of gsl_interp_accel_find Sat Apr 27 20:57:22 2002 Brian Gough * cspline.c (cspline_init_periodic): handle boundary effects correctly Sun Dec 2 22:48:23 2001 Brian Gough * poly.c: added polynomial interpolation based on divided differences from Dan, Ho-Jin. Tue Jul 3 12:10:53 2001 Brian Gough * interp.c (DISCARD_STATUS): discard error status values using a macro for configurability Sun Jul 1 21:41:27 2001 Brian Gough * cspline.c: added const to state in appropriate places Tue Jun 26 11:57:55 2001 Brian Gough * spline.c: added missing #include for memcpy Mon Jun 25 19:58:45 2001 Brian Gough * standardized to gsl conventions, added high-level 'spline' interface Mon Apr 30 13:29:34 2001 Brian Gough * renamed gsl_interp_obj to gsl_interp Mon Apr 23 10:29:51 2001 Brian Gough * 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 * 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 * 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 * added #include 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 * clean up for make strict, use size_t instead of unsigned int 1998-11-06 * added const to several declarations where needed. gsl-doc-2.3/interpolation/gsl_spline.h0000664000175000017500000000533512616157443016200 0ustar eddedd/* interpolation/gsl_spline.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/interpolation/akima.c0000664000175000017500000002226212616157443015114 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "integ_eval.h" #include 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_EINVAL; } } 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; gsl-doc-2.3/interpolation/gsl_interp.h0000664000175000017500000001546112616157443016210 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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_VAR const gsl_interp_type * gsl_interp_steffen; gsl_interp_accel * gsl_interp_accel_alloc(void); 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); unsigned int gsl_interp_type_min_size(const gsl_interp_type * T); 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); INLINE_DECL size_t gsl_interp_bsearch(const double x_array[], double x, size_t index_lo, size_t index_hi); #ifdef HAVE_INLINE /* 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 */ INLINE_FUN 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 INLINE_DECL size_t gsl_interp_accel_find(gsl_interp_accel * a, const double x_array[], size_t size, double x); #ifdef HAVE_INLINE INLINE_FUN 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__ */ gsl-doc-2.3/interpolation/interp.c0000664000175000017500000001463012616157443015333 0ustar eddedd/* interpolation/interp.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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) { size_t i; if (size != interp->size) { GSL_ERROR ("data must match size of interpolation object", GSL_EINVAL); } for (i = 1; i < size; i++) { if (!(x_array[i-1] < x_array[i])) { GSL_ERROR ("x values must be strictly increasing", 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; } unsigned int gsl_interp_type_min_size(const gsl_interp_type * T) { return T->min_size; } void gsl_interp_free (gsl_interp * interp) { RETURN_IF_NULL (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 || x > interp->xmax) { *y = GSL_NAN; 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; if (x < interp->xmin || x > interp->xmax) { GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN); } 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 || x > interp->xmax) { *dydx = GSL_NAN; 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; if (x < interp->xmin || x > interp->xmax) { GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN); } 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 || x > interp->xmax) { *d2 = GSL_NAN; 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; if (x < interp->xmin || x > interp->xmax) { GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN); } 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 = GSL_NAN; 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; if (a > b || a < interp->xmin || b > interp->xmax) { GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN); } else if(a == b) { return 0.0; } status = interp->type->eval_integ (interp->state, xa, ya, interp->size, acc, a, b, &result); DISCARD_STATUS(status); return result; } gsl-doc-2.3/interpolation/integ_eval.h0000664000175000017500000000254312616157443016154 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } gsl-doc-2.3/interpolation/bicubic.c0000664000175000017500000006735712616157443015450 0ustar eddedd/* interpolation/bicubic.c * * Copyright 2012 David Zaslavsky * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #define IDX2D(i, j, w) ((j) * ((w)->xsize) + (i)) typedef struct { double * zx; double * zy; double * zxy; size_t xsize; size_t ysize; } bicubic_state_t; static void bicubic_free (void * vstate); static void * bicubic_alloc(size_t xsize, size_t ysize) { bicubic_state_t *state; state = calloc(1, sizeof (bicubic_state_t)); if (state == NULL) { GSL_ERROR_NULL("failed to allocate space for state", GSL_ENOMEM); } state->zx = (double *) malloc (xsize * ysize * sizeof (double)); if (state->zx == NULL) { bicubic_free(state); GSL_ERROR_NULL("failed to allocate space for zx", GSL_ENOMEM); } state->zy = (double *) malloc (xsize * ysize * sizeof (double)); if (state->zy == NULL) { bicubic_free(state); GSL_ERROR_NULL("failed to allocate space for zy", GSL_ENOMEM); } state->zxy = (double *) malloc (xsize * ysize * sizeof (double)); if (state->zxy == NULL) { bicubic_free(state); GSL_ERROR_NULL("failed to allocate space for zxy", GSL_ENOMEM); } state->xsize = xsize; state->ysize = ysize; return state; } /* bicubic_alloc() */ static void bicubic_free (void * vstate) { bicubic_state_t *state = (bicubic_state_t *) vstate; RETURN_IF_NULL(state); if (state->zx) free (state->zx); if (state->zy) free (state->zy); if (state->zxy) free (state->zxy); free (state); } /* bicubic_free() */ static int bicubic_init(void * vstate, const double xa[], const double ya[], const double za[], size_t xsize, size_t ysize) { bicubic_state_t *state = (bicubic_state_t *) vstate; gsl_interp_accel *acc = gsl_interp_accel_alloc(); gsl_spline *spline; gsl_vector *x; gsl_vector *y; size_t i, j; x = gsl_vector_alloc(xsize); y = gsl_vector_alloc(xsize); spline = gsl_spline_alloc(gsl_interp_cspline, xsize); for (j = 0; j <= ysize - 1; j++) { for (i = 0; i <= xsize - 1; i++) { gsl_vector_set(x, i, xa[i]); gsl_vector_set(y, i, za[IDX2D(i, j, state)]); } gsl_spline_init(spline, x->data, y->data, xsize); for (i = 0; i <= xsize - 1; i++) { state->zx[IDX2D(i, j, state)] = gsl_spline_eval_deriv(spline, xa[i], acc); } } gsl_vector_free(x); gsl_vector_free(y); gsl_spline_free(spline); gsl_interp_accel_reset(acc); x = gsl_vector_alloc(ysize); y = gsl_vector_alloc(ysize); spline = gsl_spline_alloc(gsl_interp_cspline, ysize); for (i = 0; i <= xsize - 1; i++) { for (j = 0; j <= ysize - 1; j++) { gsl_vector_set(x, j, ya[j]); gsl_vector_set(y, j, za[IDX2D(i, j, state)]); } gsl_spline_init(spline, x->data, y->data, ysize); for (j = 0; j <= ysize - 1; j++) { state->zy[IDX2D(i, j, state)] = gsl_spline_eval_deriv(spline, ya[j], acc); } } gsl_vector_free(x); gsl_vector_free(y); gsl_spline_free(spline); gsl_interp_accel_reset(acc); x = gsl_vector_alloc(xsize); y = gsl_vector_alloc(xsize); spline = gsl_spline_alloc(gsl_interp_cspline, xsize); for (j = 0; j <= ysize - 1; j++) { for (i = 0; i <= xsize - 1; i++) { gsl_vector_set(x, i, xa[i]); gsl_vector_set(y, i, state->zy[IDX2D(i, j, state)]); } gsl_spline_init(spline, x->data, y->data, xsize); for (i = 0; i <= xsize - 1; i++) { state->zxy[IDX2D(i, j, state)] = gsl_spline_eval_deriv(spline, xa[i], acc); } } gsl_vector_free(x); gsl_vector_free(y); gsl_spline_free(spline); gsl_interp_accel_free(acc); return GSL_SUCCESS; } /* bicubic_init() */ static int bicubic_eval(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; double dx, dy; /* size of the grid cell */ double dt, du; /* * t and u are the positions within the grid cell at which we are computing * the interpolation, in units of grid cell size */ double t, u; double t0, t1, t2, t3, u0, u1, u2, u3; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* Get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; t2 = t*t; t3 = t*t2; u0 = 1; u1 = u; u2 = u*u; u3 = u*u2; *z = 0; v = zminmin; *z += v*t0*u0; v = zyminmin; *z += v*t0*u1; v = -3*zminmin + 3*zminmax - 2*zyminmin - zyminmax; *z += v*t0*u2; v = 2*zminmin - 2*zminmax + zyminmin + zyminmax; *z += v*t0*u3; v = zxminmin; *z += v*t1*u0; v = zxyminmin; *z += v*t1*u1; v = -3*zxminmin + 3*zxminmax - 2*zxyminmin - zxyminmax; *z += v*t1*u2; v = 2*zxminmin - 2*zxminmax + zxyminmin + zxyminmax; *z += v*t1*u3; v = -3*zminmin + 3*zmaxmin - 2*zxminmin - zxmaxmin; *z += v*t2*u0; v = -3*zyminmin + 3*zymaxmin - 2*zxyminmin - zxymaxmin; *z += v*t2*u1; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z += v*t2*u2; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z += v*t2*u3; v = 2*zminmin - 2*zmaxmin + zxminmin + zxmaxmin; *z += v*t3*u0; v = 2*zyminmin - 2*zymaxmin + zxyminmin + zxymaxmin; *z += v*t3*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z += v*t3*u2; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z += v*t3*u3; return GSL_SUCCESS; } /* bicubic_eval() */ static int bicubic_deriv_x(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_p) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; double dx, dy; /* size of the grid cell */ double dt, du; /* * t and u are the positions within the grid cell at which we are computing * the interpolation, in units of grid cell size */ double t, u; double t0, t1, t2, u0, u1, u2, u3; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; t2 = t*t; u0 = 1; u1 = u; u2 = u*u; u3 = u*u2; *z_p = 0; v = zxminmin; *z_p += v*t0*u0; v = zxyminmin; *z_p += v*t0*u1; v = -3*zxminmin + 3*zxminmax - 2*zxyminmin - zxyminmax; *z_p += v*t0*u2; v = 2*zxminmin - 2*zxminmax + zxyminmin + zxyminmax; *z_p += v*t0*u3; v = -3*zminmin + 3*zmaxmin - 2*zxminmin - zxmaxmin; *z_p += 2*v*t1*u0; v = -3*zyminmin + 3*zymaxmin - 2*zxyminmin - zxymaxmin; *z_p += 2*v*t1*u1; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z_p += 2*v*t1*u2; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z_p += 2*v*t1*u3; v = 2*zminmin - 2*zmaxmin + zxminmin + zxmaxmin; *z_p += 3*v*t2*u0; v = 2*zyminmin - 2*zymaxmin + zxyminmin + zxymaxmin; *z_p += 3*v*t2*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z_p += 3*v*t2*u2; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z_p += 3*v*t2*u3; *z_p *= dt; return GSL_SUCCESS; } /* bicubic_deriv_x() */ static int bicubic_deriv_y(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_p) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; /* dx and dy are the size of the grid cell */ double dx, dy; double dt, du; /* t and u are the positions within the grid cell at which we are * computing the interpolation, in units of grid cell size */ double t, u; double t0, t1, t2, t3, u0, u1, u2; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; t2 = t*t; t3 = t*t2; u0 = 1; u1 = u; u2 = u*u; *z_p = 0; v = zyminmin; *z_p += v*t0*u0; v = -3*zminmin + 3*zminmax - 2*zyminmin - zyminmax; *z_p += 2*v*t0*u1; v = 2*zminmin-2*zminmax + zyminmin + zyminmax; *z_p += 3*v*t0*u2; v = zxyminmin; *z_p += v*t1*u0; v = -3*zxminmin + 3*zxminmax - 2*zxyminmin - zxyminmax; *z_p += 2*v*t1*u1; v = 2*zxminmin - 2*zxminmax + zxyminmin + zxyminmax; *z_p += 3*v*t1*u2; v = -3*zyminmin + 3*zymaxmin - 2*zxyminmin - zxymaxmin; *z_p += v*t2*u0; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z_p += 2*v*t2*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z_p += 3*v*t2*u2; v = 2*zyminmin - 2*zymaxmin + zxyminmin + zxymaxmin; *z_p += v*t3*u0; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z_p += 2*v*t3*u1; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z_p += 3*v*t3*u2; *z_p *= du; return GSL_SUCCESS; } static int bicubic_deriv_xx(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_pp) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; double dx, dy; /* size of the grid cell */ double dt, du; /* * t and u are the positions within the grid cell at which we are computing * the interpolation, in units of grid cell size */ double t, u; double t0, t1, u0, u1, u2, u3; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; u0 = 1; u1 = u; u2 = u*u; u3 = u*u2; *z_pp = 0; v = -3*zminmin + 3*zmaxmin - 2*zxminmin - zxmaxmin; *z_pp += 2*v*t0*u0; v = -3*zyminmin + 3*zymaxmin - 2*zxyminmin - zxymaxmin; *z_pp += 2*v*t0*u1; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z_pp += 2*v*t0*u2; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z_pp += 2*v*t0*u3; v = 2*zminmin - 2*zmaxmin + zxminmin + zxmaxmin; *z_pp += 6*v*t1*u0; v = 2*zyminmin - 2*zymaxmin + zxyminmin + zxymaxmin; *z_pp += 6*v*t1*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z_pp += 6*v*t1*u2; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z_pp += 6*v*t1*u3; *z_pp *= dt*dt; return GSL_SUCCESS; } static int bicubic_deriv_xy(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_pp) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; double dx, dy; /* size of the grid cell */ double dt, du; /* * t and u are the positions within the grid cell at which we are computing * the interpolation, in units of grid cell size */ double t, u; double t0, t1, t2, u0, u1, u2; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; t2 = t*t; u0 = 1; u1 = u; u2 = u*u; *z_pp = 0; v = zxyminmin; *z_pp += v*t0*u0; v = -3*zxminmin + 3*zxminmax - 2*zxyminmin - zxyminmax; *z_pp += 2*v*t0*u1; v = 2*zxminmin - 2*zxminmax + zxyminmin + zxyminmax; *z_pp += 3*v*t0*u2; v = -3*zyminmin + 3*zymaxmin - 2*zxyminmin - zxymaxmin; *z_pp += 2*v*t1*u0; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z_pp += 4*v*t1*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z_pp += 6*v*t1*u2; v = 2*zyminmin - 2*zymaxmin + zxyminmin + zxymaxmin; *z_pp += 3*v*t2*u0; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z_pp += 6*v*t2*u1; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z_pp += 9*v*t2*u2; *z_pp *= dt*du; return GSL_SUCCESS; } static int bicubic_deriv_yy(const void * vstate, const double xarr[], const double yarr[], const double zarr[], size_t xsize, size_t ysize, double x, double y, gsl_interp_accel * xa, gsl_interp_accel * ya, double * z_pp) { bicubic_state_t *state = (bicubic_state_t *) vstate; double xmin, xmax, ymin, ymax; double zminmin, zminmax, zmaxmin, zmaxmax; double zxminmin, zxminmax, zxmaxmin, zxmaxmax; double zyminmin, zyminmax, zymaxmin, zymaxmax; double zxyminmin, zxyminmax, zxymaxmin, zxymaxmax; double dx, dy; /* size of the grid cell */ double dt, du; /* * t and u are the positions within the grid cell at which we are computing * the interpolation, in units of grid cell size */ double t, u; double t0, t1, t2, t3, u0, u1; double v; size_t xi, yi; /* first compute the indices into the data arrays where we are interpolating */ if (xa != NULL) xi = gsl_interp_accel_find(xa, xarr, xsize, x); else xi = gsl_interp_bsearch(xarr, x, 0, xsize - 1); if (ya != NULL) yi = gsl_interp_accel_find(ya, yarr, ysize, y); else yi = gsl_interp_bsearch(yarr, y, 0, ysize - 1); /* find the minimum and maximum values on the grid cell in each dimension */ xmin = xarr[xi]; xmax = xarr[xi + 1]; ymin = yarr[yi]; ymax = yarr[yi + 1]; zminmin = zarr[IDX2D(xi, yi, state)]; zminmax = zarr[IDX2D(xi, yi + 1, state)]; zmaxmin = zarr[IDX2D(xi + 1, yi, state)]; zmaxmax = zarr[IDX2D(xi + 1, yi + 1, state)]; /* get the width and height of the grid cell */ dx = xmax - xmin; dy = ymax - ymin; t = (x - xmin)/dx; u = (y - ymin)/dy; dt = 1./dx; /* partial t / partial x */ du = 1./dy; /* partial u / partial y */ zxminmin = state->zx[IDX2D(xi, yi, state)]/dt; zxminmax = state->zx[IDX2D(xi, yi + 1, state)]/dt; zxmaxmin = state->zx[IDX2D(xi + 1, yi, state)]/dt; zxmaxmax = state->zx[IDX2D(xi + 1, yi + 1, state)]/dt; zyminmin = state->zy[IDX2D(xi, yi, state)]/du; zyminmax = state->zy[IDX2D(xi, yi + 1, state)]/du; zymaxmin = state->zy[IDX2D(xi + 1, yi, state)]/du; zymaxmax = state->zy[IDX2D(xi + 1, yi + 1, state)]/du; zxyminmin = state->zxy[IDX2D(xi, yi, state)]/(dt*du); zxyminmax = state->zxy[IDX2D(xi, yi + 1, state)]/(dt*du); zxymaxmin = state->zxy[IDX2D(xi + 1, yi, state)]/(dt*du); zxymaxmax = state->zxy[IDX2D(xi + 1, yi + 1, state)]/(dt*du); t0 = 1; t1 = t; t2 = t*t; t3 = t*t2; u0 = 1; u1 = u; *z_pp = 0; v = -3*zminmin + 3*zminmax - 2*zyminmin - zyminmax; *z_pp += 2*v*t0*u0; v = 2*zminmin-2*zminmax + zyminmin + zyminmax; *z_pp += 6*v*t0*u1; v = -3*zxminmin + 3*zxminmax - 2*zxyminmin - zxyminmax; *z_pp += 2*v*t1*u0; v = 2*zxminmin - 2*zxminmax + zxyminmin + zxyminmax; *z_pp += 6*v*t1*u1; v = 9*zminmin - 9*zmaxmin + 9*zmaxmax - 9*zminmax + 6*zxminmin + 3*zxmaxmin - 3*zxmaxmax - 6*zxminmax + 6*zyminmin - 6*zymaxmin - 3*zymaxmax + 3*zyminmax + 4*zxyminmin + 2*zxymaxmin + zxymaxmax + 2*zxyminmax; *z_pp += 2*v*t2*u0; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 4*zxminmin - 2*zxmaxmin + 2*zxmaxmax + 4*zxminmax - 3*zyminmin + 3*zymaxmin + 3*zymaxmax - 3*zyminmax - 2*zxyminmin - zxymaxmin - zxymaxmax - 2*zxyminmax; *z_pp += 6*v*t2*u1; v = -6*zminmin + 6*zmaxmin - 6*zmaxmax + 6*zminmax - 3*zxminmin - 3*zxmaxmin + 3*zxmaxmax + 3*zxminmax - 4*zyminmin + 4*zymaxmin + 2*zymaxmax - 2*zyminmax - 2*zxyminmin - 2*zxymaxmin - zxymaxmax - zxyminmax; *z_pp += 2*v*t3*u0; v = 4*zminmin - 4*zmaxmin + 4*zmaxmax - 4*zminmax + 2*zxminmin + 2*zxmaxmin - 2*zxmaxmax - 2*zxminmax + 2*zyminmin - 2*zymaxmin - 2*zymaxmax + 2*zyminmax + zxyminmin + zxymaxmin + zxymaxmax + zxyminmax; *z_pp += 6*v*t3*u1; *z_pp *= du*du; return GSL_SUCCESS; } static const gsl_interp2d_type bicubic_type = { "bicubic", 4, &bicubic_alloc, &bicubic_init, &bicubic_eval, &bicubic_deriv_x, &bicubic_deriv_y, &bicubic_deriv_xx, &bicubic_deriv_xy, &bicubic_deriv_yy, &bicubic_free }; const gsl_interp2d_type * gsl_interp2d_bicubic = &bicubic_type; #undef IDX2D gsl-doc-2.3/interpolation/test.c0000664000175000017500000011644712616157443015022 0ustar eddedd/* interpolation/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2014 Gerard Jungman * Copyright (C) 2014 Jean-François Caron * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include "test2d.c" 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 -"); /* Test the accelerator */ { size_t i, j, k1 = 0, k2 = 0; int t = 0; double x = 0; double r[16] = { -0.2, 0.0, 0.1, 0.7, 1.0, 1.3, 1.9, 2.0, 2.2, 2.7, 3.0, 3.1, 3.6, 4.0, 4.1, 4.9 }; gsl_interp_accel *a = gsl_interp_accel_alloc (); /* Run through all the pairs of points */ while (k1 < 16 && k2 < 16) { x = r[t ? k1 : k2]; t = !t; if (t == 0) { k1 = (k1 + 1) % 16; if (k1 == 0) k2++; }; i = gsl_interp_accel_find(a, x_array, 5, x); j = gsl_interp_bsearch(x_array, x, 0, 4); gsl_test(i != j, "(%u,%u) accelerated lookup vs bsearch (x = %g)", i, j, x); } gsl_interp_accel_free(a); } 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); unsigned int min_size = gsl_interp_type_min_size(T); gsl_test_int (min_size, T->min_size, "gsl_interp_type_min_size on %s", gsl_interp_name(interp)); 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; } static int test_steffen1 (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[6] = { 0.0, 0.5, 1.0, 2.0, 2.5, 3.95 }; double test_y[6] = { 0.0, 0.5, 1.0, 2.0, 2.5, 3.95 }; 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, 2.0, 3.125, 7.80125 }; 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_steffen, &test_table, &test_d_table, &test_i_table); gsl_test (s, "steffen interpolation test 1"); return s; } static int test_steffen2 (void) { int s; double data_x[30] = { 4.673405471947611, 4.851675778029557, 6.185473620119991, 7.066003430727031, 7.236222118389267, 7.82067161881444, 8.054504031621493, 8.615033792800752, 9.16666529764867, 9.442092828126395, 10.719577968900381, 11.741967577609238, 12.564881194673035, 12.938424721515084, 12.985892202096888, 13.995771653255744, 14.459157783380315, 15.834857667614848, 15.887779086499942, 18.64645279534696, 19.256361741244287, 19.85100457105047, 19.943627313550987, 20.5033910115468, 20.895380493234843, 21.759942483053962, 21.948984866760803, 22.2504057728461, 22.741860290952104, 23.088720630939164 }; double data_y[30] = { -6.131584089652438, 4.997132870704837, 9.50359639889188, -3.788474042493764, 1.98825324341826, -6.553460294945401, 8.44565760012345, -3.643687601520438, -4.720262269613782, -5.31956608504474, 4.7484698519996655, 1.8191111043001218, 2.7234424260251124, -7.282776099988966, -6.966038807035955, 2.6047260012112545, -3.6363485275348033, -4.124714595822157, -4.820986899771757, -2.8550035950284602, 6.017204757558943, 6.7275899382734075, -9.423359755713639, -0.3645325139870703, 6.925739188986089, -0.07843256857855074, 1.6744315603866244, -8.332083151442944, 6.059246349756446, -7.360159198725659 }; double test_x[129] = { 4.6734054719476106,4.8516757780295574,4.8575586235375265, 5.0417117751274407,5.2258649267173567,5.4100180783072727, 5.5941712298971886,5.7783243814871028,5.9624775330770188, 6.1466306846669347,6.1854736201199909,6.3307838362568507, 6.5149369878467667,6.6990901394366809,6.8832432910265968, 7.0660034307270312,7.0673964426165128,7.236222118389267, 7.2515495942064288,7.4357027457963438,7.6198558973862589, 7.8040090489761749,7.8206716188144396,7.9881622005660908, 8.0545040316214926,8.172315352156005,8.356468503745921, 8.5406216553358369,8.6150337928007517,8.7247748069257529, 8.9089279585156689,9.0930811101055831,9.1666652976486702, 9.277234261695499,9.4420928281263947,9.461387413285415, 9.645540564875331,9.8296937164652469,10.013846868055161, 10.198000019645077,10.382153171234993,10.566306322824907, 10.719577968900381,10.750459474414823,10.934612626004739, 11.118765777594655,11.302918929184571,11.487072080774485, 11.671225232364399,11.741967577609238,11.855378383954315, 12.039531535544231,12.223684687134147,12.407837838724063, 12.564881194673035,12.591990990313979,12.776144141903895, 12.938424721515084,12.960297293493811,12.985892202096888, 13.144450445083727,13.328603596673641,13.512756748263556, 13.696909899853472,13.881063051443387,13.995771653255744, 14.065216203033303,14.249369354623219,14.433522506213134, 14.459157783380315,14.617675657803051,14.801828809392966, 14.985981960982881,15.170135112572796,15.354288264162712, 15.538441415752628,15.722594567342544,15.834857667614848, 15.90674771893246,15.887779086499942,16.090900870522375, 16.27505402211229,16.459207173702204,16.643360325292122, 16.827513476882036,17.01166662847195,17.195819780061868, 17.379972931651782,17.5641260832417,17.748279234831614, 17.932432386421532,18.116585538011446,18.300738689601364, 18.484891841191278,18.64645279534696,18.669044992781188, 18.853198144371106,19.03735129596102,19.221504447550938, 19.256361741244287,19.405657599140852,19.58981075073077, 19.773963902320684,19.851004571050471,19.958117053910598, 19.943627313550987,20.142270205500516,20.32642335709043, 20.5033910115468,20.510576508680348,20.694729660270262, 20.87888281186018,20.895380493234843,21.063035963450094, 21.247189115040012,21.431342266629926,21.61549541821984, 21.759942483053962,21.799648569809754,21.948984866760803, 21.983801721399669,22.167954872989586,22.250405772846101, 22.352108024579501,22.536261176169418,22.720414327759332, 22.741860290952104,22.90456747934925,23.088720630939164 }; double test_y[129] = { -6.1315840896524376, 4.9971328707048368, 5.0367975988827167, 6.1897906340782765, 7.170975366812117, 7.9803517970842286, 8.6179199248946077, 9.083679750243256, 9.3776312731301772, 9.4997744935553676, 9.5035963988918795, 8.5371013292095554, 5.3135045284256019, 1.2120062346303317, -2.3083133782071208, -3.788474042493764, -3.7873197326712797, 1.98825324341826, 1.9709370138809248, -0.31768851396215103, -4.2211558425051745, -6.5330277558649303, -6.5534602949454008, 5.5087083141507147, 8.4456576001234502, 7.1443430435268214, 1.9932653799771245, -2.8426372908118083, -3.6436876015204378, -3.9926784426485034, -4.3315242293057175, -4.5849882013553547, -4.7202622696137819, -5.0157009305506106, -5.3195660850447402, -5.3127453670702938, -4.6348437675141847, -3.1014810884327102, -1.0745634258401102, 1.0840031242494419, 3.0123124658217071, 4.3484585028624627, 4.7484698519996655, 4.740613456600772, 4.4142234654988952, 3.7574719541934956, 2.9757785771330334, 2.274562988765974, 1.8592448435407634, 1.8191111043001218, 1.8659054809992697, 2.0883298868527498, 2.3859686670095699, 2.6372078307738107, 2.7234424260251124, 2.5729816013335247, -3.258105131647655, -7.2827760999889657, -7.179945071809863, -6.9660388070359547, -5.5662805880783406, -3.3905902235190721, -1.0497645733987406, 1.0095869363327665, 2.3408548797255095, 2.6047260012112545, 2.2325150500282476, -0.91241316251151927, -3.5649171021138555, -3.6363485275348033, -3.7309363021244821, -3.8038342533632736, -3.8503835649797429, -3.8846412514674595, -3.920664327319995, -3.9725098070309213, -4.0542347050938083, -4.1247145958221569, -4.8208939493861829, -4.8209868997717571, -4.8103284962540727, -4.7822416973267625, -4.7366335526042516, -4.6735040620865389, -4.5928532257736272, -4.4946810436655156, -4.3789875157622005, -4.2457726420636881, -4.0950364225699714, -3.9267788572810582, -3.7409999461969403, -3.537699689317626, -3.3168780866431069, -3.0785351381733914, -2.8550035950284602, -2.7914506045621672, -0.46968123806956008, 3.263658433044764, 5.8622198554846658, 6.0172047575589431, 6.3291356295622618, 6.5905310151592165, 6.7156659481449141, 6.7275899382734075, -9.4118959280855066, -9.4233597557136388, -7.6111870705157543, -3.9651685725226056, -0.36453251398707032, -0.23537781181431175, 4.0332797539781309, 6.899794364641159, 6.9257391889860891, 6.2377210430025594, 4.3902665602806792, 2.1878722453596344, 0.44278317319805183, -0.078432568578550743, 0.12107113682074738, 1.6744315603866244, 1.3047436323966959, -6.4955024539509765, -8.3320831514429443, -6.7382472104931805, 0.61052993339902706, 5.9794239504090552, 6.0592463497564459, 1.5387265272596853, -7.3601591987256612 }; double test_dy[129] = { 62.426083204466224, 6.757341159173202, 6.727537246743899, 5.7945730211610407, 4.8616087955781726, 3.9286445699953054, 2.9956803444124378, 2.0627161188295791, 1.1297518932467119, 0.1967876676638447, 0, -12.480296842307126, -21.209126982426163, -22.014768399615317, -14.897221093874615, 0, 1.65274069980919, 0, -2.2393981239975669, -19.714311699236049, -19.77742868994725, -2.4287490961310456, 0, 78.213312807624717, 0, -20.358420305108574, -31.350476855816961, -16.93545425712459, -3.9032385156832157, -2.5401833171916435, -1.3740294011308083, -1.6128919418291603, -2.1012124848241789, -2.8800570317456784, 0, 0.70341285683675259, 6.3314138906742139, 9.9941697310971538, 11.69168037810557, 11.42394583169949, 9.1909660918788916, 4.992741158643824, 0, -0.50358091648162351, -2.8552721239834269, -4.0914806331173992, -4.2122064438835425, -3.2174495562818706, -1.1072099703123885, 0, 0.78347408424733667, 1.5221058615312819, 1.6003417148468082, 1.018181644193916, 0, -10.817925943273289, -39.490030870551372, 0, 8.0126635338650072, 6.7986203849007927, 10.557804177353285, 12.667135433334296, 12.351260158262027, 9.6101783521364421, 4.44389001495753, 0, -10.1306309231183, -19.882866043398995, -4.7826445467139278, -0.70998925548225966, -0.49283947499262398, -0.31159279753453034, -0.20667940230488324, -0.17809928930368468, -0.22585245853093405, -0.3499389099866323, -0.55035864367077902, -0.70998925548225966, 0.0098004308855327432, 0, 0.10494594234665755, 0.20009145380778143, 0.2952369652689053, 0.39038247673003107, 0.48552798819115495, 0.58067349965227877, 0.67581901111340459, 0.77096452257452841, 0.86611003403565412, 0.96125554549677805, 1.0564010569579039, 1.1515465684190276, 1.2466920798801533, 1.3418375913412772, 1.4253105022449177, 4.1661049863071913, 18.74497348837053, 19.496500284294363, 6.4206853740787171, 2.3892836005304425, 1.7894106566060179, 1.0494805960296585, 0.30955053545331346, 0, 1.5724451183167569, 0, 16.386389851530527, 21.613477536080744, 17.603560096681914, 18.338573561497682, 23.697110333020628, 3.1105642331329868, 0, -7.5982202651552164, -11.73098890423519, -11.453053366134201, -6.7644136508523696, 0, 9.2309078320594402, 0, -20.350273706124355, -39.581660196515507, 0, 28.835095151183879, 42.753317235684989, 7.3325239511975031, 0, -47.053315974301256, -38.688209637869583 }; double test_iy[129] = { 0, 0.046311303303274043, 0.07582542065258166, 1.1121678097008914, 2.345017979757877, 3.7427368904558875, 5.2736855014272832, 6.9062247723044061, 8.6087156627196464, 10.349519132305348, 10.718617229125304, 12.051326255780914, 13.351310568583624, 13.954434023333466, 13.833375399536308, 13.23478503216295, 13.229508179502936, 13.081569421202504, 13.111955459764134, 13.313565584429645, 12.895822708651364, 11.856586384851303, 11.747502930901248, 11.477166081331394, 11.968731461589641, 12.910617813249443, 13.783041410703255, 13.664096839344904, 13.416752727534579, 12.996373500853053, 12.226613834386363, 11.406286934906419, 11.064147626707395, 10.526693424249395, 9.6682418398824055, 9.5656469982362644, 8.633802142647145, 7.911116775692733, 7.5218036771498298, 7.5234294786346014, 7.9069146636026106, 8.5965335673487839, 9.3034583640488648, 9.4500169740341917, 10.299608964240058, 11.055524261651918, 11.675840089542856, 12.156462347951148, 12.53112561368027, 12.660771626086403, 12.868892222896084, 13.230897278463143, 13.642654271367054, 14.106816365848598, 14.529836204259333, 14.602291235557717, 14.620235691106975, 13.678281413948246, 13.51979351456291, 13.338827208895861, 12.337400222501822, 11.506721190837634, 11.098761199438101, 11.102808164918775, 11.425905470576772, 11.714428553431798, 11.886459852625201, 12.035570442032403, 11.580639494361572, 11.488113239473538, 10.903735363611753, 10.209447282562856, 9.5043766268555689, 8.7920812597559994, 8.0735304010092825, 7.347104626839644, 6.6085958699503662, 6.1496664193039994, 5.821344166329677, 5.9127911070795323, 4.9342652985615576, 4.050745397809842, 3.1740110751228041, 2.3072889415487108, 1.4538056081358768, 0.61678768593257072, -0.20053821401294236, -0.99494548065234767, -1.7632075029373926, -2.5020976698197641, -3.2083893702512087, -3.8788559931834152, -4.5102709275681283, -5.0994075623570394, -5.5789032190742072, -5.6428026999265457, -5.9842769011998804, -5.729140886963938, -4.8519085924998322, -4.6444581063590329, -3.7217151397093993, -2.5300254086689806, -1.3027452894525609, -0.78475347239267057, -1.0460847630211827, -0.90959826921338605, -2.6553766359304607, -3.7360597404585745, -4.1087031972797643, -4.1108616867222691, -3.776307276733156, -2.7114490122334045, -2.5973338374383879, -1.4760729895576692, -0.48580494729501034, 0.11910209432525942, 0.34807359178739627, 0.36262668088219696, 0.3622604193055981, 0.51348240778475363, 0.56740090208414018, 0.14380211642697149, -0.48989527970345625, -1.2810928311228711, -1.8846453955503084, -1.1777647142370817, -1.0483932372566702, -0.32646483194908105, -0.88612247621927298 }; xy_table data_table = make_xy_table(data_x, data_y, 30); xy_table test_table = make_xy_table(test_x, test_y, 129); xy_table test_d_table = make_xy_table(test_x, test_dy, 129); xy_table test_i_table = make_xy_table(test_x, test_iy, 129); s = test_interp (&data_table, gsl_interp_steffen, &test_table, &test_d_table, &test_i_table); gsl_test (s, "steffen interpolation test 2"); 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(); status += test_steffen1(); status += test_steffen2(); status += test_interp2d_main(); exit (gsl_test_summary()); } gsl-doc-2.3/const/0000755000175000017500000000000013022553152012104 5ustar eddeddgsl-doc-2.3/const/gsl_const_num.h0000664000175000017500000000334112616157443015145 0ustar eddedd/* const/gsl_const_num.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006, 2007, 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/const/gsl_const_cgsm.h0000664000175000017500000001517312616157443015305 0ustar eddedd/* const/gsl_const_cgsm.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006, 2007, 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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.62606896e-27) /* g cm^2 / s */ #define GSL_CONST_CGSM_PLANCKS_CONSTANT_HBAR (1.05457162825e-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.602176487e-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.17987196968e-11) /* g cm^2 / s^2 */ #define GSL_CONST_CGSM_BOLTZMANN (1.3806504e-16) /* g cm^2 / K s^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.660538782e-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_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.67040047374e-5) /* g / K^4 s^3 */ #define GSL_CONST_CGSM_THOMSON_CROSS_SECTION (6.65245893699e-25) /* cm^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_FARADAY (9.64853429775e3) /* abamp s / mol */ #define GSL_CONST_CGSM_ELECTRON_CHARGE (1.602176487e-20) /* abamp s */ #endif /* __GSL_CONST_CGSM__ */ gsl-doc-2.3/const/gsl_const.h0000664000175000017500000000204012616157443014261 0ustar eddedd/* const/gsl_const.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #endif /* __GSL_CONST__ */ gsl-doc-2.3/const/Makefile.am0000664000175000017500000000054212616157443014156 0ustar eddeddpkginclude_HEADERS = gsl_const.h gsl_const_cgs.h gsl_const_mks.h gsl_const_cgsm.h gsl_const_mksa.h gsl_const_num.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/const/gsl_const_cgs.h0000664000175000017500000001413012616157443015120 0ustar eddedd/* const/gsl_const_cgs.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006, 2007, 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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.62606896e-27) /* g cm^2 / s */ #define GSL_CONST_CGS_PLANCKS_CONSTANT_HBAR (1.05457162825e-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.602176487e-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.17987196968e-11) /* g cm^2 / s^2 */ #define GSL_CONST_CGS_BOLTZMANN (1.3806504e-16) /* g cm^2 / K s^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.660538782e-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_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.67040047374e-5) /* g / K^4 s^3 */ #define GSL_CONST_CGS_THOMSON_CROSS_SECTION (6.65245893699e-25) /* cm^2 */ #endif /* __GSL_CONST_CGS__ */ gsl-doc-2.3/const/gsl_const_mksa.h0000664000175000017500000001557212616157443015312 0ustar eddedd/* const/gsl_const_mksa.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006, 2007, 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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.62606896e-34) /* kg m^2 / s */ #define GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR (1.05457162825e-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.602176487e-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.17987196968e-18) /* kg m^2 / s^2 */ #define GSL_CONST_MKSA_BOLTZMANN (1.3806504e-23) /* kg m^2 / K s^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.660538782e-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_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.67040047374e-8) /* kg / K^4 s^3 */ #define GSL_CONST_MKSA_THOMSON_CROSS_SECTION (6.65245893699e-29) /* m^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_FARADAY (9.64853429775e4) /* A s / mol */ #define GSL_CONST_MKSA_ELECTRON_CHARGE (1.602176487e-19) /* A s */ #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 */ #define GSL_CONST_MKSA_GAUSS (1e-4) /* kg / A s^2 */ #endif /* __GSL_CONST_MKSA__ */ gsl-doc-2.3/const/TODO0000664000175000017500000000014412616157443012610 0ustar eddedd# -*- org -*- #+CATEGORY: const could add RADIATION_DENSITY_CONSTANT (7.56591e-16) /* J m-3 K-4 */ gsl-doc-2.3/const/gsl_const_mks.h0000664000175000017500000001542112616157443015142 0ustar eddedd/* const/gsl_const_mks.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * 2006, 2007, 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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.62606896e-34) /* kg m^2 / s */ #define GSL_CONST_MKS_PLANCKS_CONSTANT_HBAR (1.05457162825e-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.602176487e-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.17987196968e-18) /* kg m^2 / s^2 */ #define GSL_CONST_MKS_BOLTZMANN (1.3806504e-23) /* kg m^2 / K s^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.660538782e-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_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.67040047374e-8) /* kg / K^4 s^3 */ #define GSL_CONST_MKS_THOMSON_CROSS_SECTION (6.65245893699e-29) /* m^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_FARADAY (9.64853429775e4) /* A s / mol */ #define GSL_CONST_MKS_ELECTRON_CHARGE (1.602176487e-19) /* A s */ #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 */ #define GSL_CONST_MKS_GAUSS (1e-4) /* kg / A s^2 */ #endif /* __GSL_CONST_MKS__ */ gsl-doc-2.3/const/Makefile.in0000644000175000017500000010153713022372405014160 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(test_SOURCES) DIST_SOURCES = $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu const/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-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: gsl-doc-2.3/const/ChangeLog0000664000175000017500000000511012616157443013670 0ustar eddedd2009-08-17 Brian Gough * const.el: removed electromagnetic constants from cgs, now only in CGSM 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2006-03-21 Brian Gough * test.c (main): added some extra tests 2006-03-17 Brian Gough * const.el (gsl-electrical-constants): added debye unit 2004-05-26 Brian Gough * test.c: added stdlib.h for exit() 2004-03-05 Brian Gough * const.el: added CGS and MKS systems back in, with CGSM electrical units excluded from CGS, for backwards compatibility 2003-11-27 Brian Gough * const.el (gsl-constants): added stefan-boltzmann constant and thomson cross section 2003-09-18 Brian Gough * test.c: added a test program * gsl_const.h: fixed to use new header files for MKSA and CGSM 2003-06-09 Brian Gough * 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 * 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 * 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 * 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 * 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 * const.el (gsl-constants): added bohr_radius and vacuum_permittivity Tue Sep 25 15:15:33 2001 Brian Gough * 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 * const.el (gsl-constants): fixed definition of POINT (from pt to point, was previously measuring 'pints') gsl-doc-2.3/const/test.c0000664000175000017500000000525512616157443013253 0ustar eddedd/* const/test.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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 ()); } gsl-doc-2.3/gsl_version.h0000644000175000017500000000071213022372422013460 0ustar eddedd#ifndef __GSL_VERSION_H__ #define __GSL_VERSION_H__ #include #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 "2.3" #define GSL_MAJOR_VERSION 2 #define GSL_MINOR_VERSION 3 GSL_VAR const char * gsl_version; __END_DECLS #endif /* __GSL_VERSION_H__ */ gsl-doc-2.3/diff/0000755000175000017500000000000013022553155011671 5ustar eddeddgsl-doc-2.3/diff/Makefile.am0000664000175000017500000000104712616157443013741 0ustar eddeddnoinst_LTLIBRARIES = libgsldiff.la AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/diff/Makefile.in0000644000175000017500000010362613022372405013743 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsldiff_la_LIBADD = am_libgsldiff_la_OBJECTS = diff.lo libgsldiff_la_OBJECTS = $(am_libgsldiff_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsldiff.la AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu diff/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsldiff.la: $(libgsldiff_la_OBJECTS) $(libgsldiff_la_DEPENDENCIES) $(EXTRA_libgsldiff_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsldiff_la_OBJECTS) $(libgsldiff_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/diff/ChangeLog0000664000175000017500000000126312616157443013457 0ustar eddedd2008-09-18 Brian Gough * diff.c test.c: temporarily enable deprecated functions for testing * gsl_diff.h: marked these functions deprecated, use gsl_deriv instead. 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir Mon Apr 23 13:26:21 2001 Brian Gough * Makefile.am: removed demo from Makefile * test.c (test): changed return type to void Mon Feb 5 13:42:54 2001 Brian Gough * diff.c: moved gradient calculating function into multimin since it depends on multimin functions * test.c (main): tidied up the tests gsl-doc-2.3/diff/gsl_diff.h0000664000175000017500000000302612616157443013632 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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 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); #endif __END_DECLS #endif /* __GSL_DIFF_H__ */ gsl-doc-2.3/diff/diff.c0000664000175000017500000001130112616157443012753 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #undef GSL_DISABLE_DEPRECATED #include 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; } gsl-doc-2.3/diff/test.c0000664000175000017500000001025512616157443013031 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #undef GSL_DISABLE_DEPRECATED #include 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 ()); } gsl-doc-2.3/gsl-histogram.c0000664000175000017500000000504512616157443013723 0ustar eddedd/* histogram/gsl-histogram.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include void print_help(void) { fprintf (stderr, "Usage: gsl-histogram [-u] xmin xmax [n]\n"); fprintf (stderr, "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" "If -u is given, histogram is normalized so that sum of all bins is unity.\n"); } int main (int argc, char **argv) { double a = 0.0, b = 1.0; size_t n = 10; int unit = 0; int c; while ((c = getopt(argc, argv, "u")) != (-1)) { switch (c) { case 'u': unit = 1; break; default: print_help(); exit(0); break; } } if (argc - optind < 2) { print_help(); exit(0); } a = atof (argv[optind++]); b = atof (argv[optind++]); if (argc - optind > 0) n = atoi (argv[optind++]); 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 /* normalize histogram if needed */ if (unit) { double sum = gsl_histogram_sum(h); if (sum > 0.0) gsl_histogram_scale(h, 1.0 / sum); } gsl_histogram_fprintf (stdout, h, "%g", "%g"); gsl_histogram_free (h); } return 0; } gsl-doc-2.3/integration/0000755000175000017500000000000013022553154013303 5ustar eddeddgsl-doc-2.3/integration/tests.c0000664000175000017500000002110312616157443014621 0ustar eddedd/* integration/tests.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #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) ; } /* f_monomial = constant * x^degree */ double f_monomial(double x, void * params) { struct monomial_params * p = (struct monomial_params *) params; return p->constant * gsl_pow_int(x, p->degree); } /* integ(f_monomial,x,a b)=constant*(b^(degree+1)-a^(degree+1))/(degree+1) */ double integ_f_monomial(double a, double b, struct monomial_params * p) { const int degreep1 = p->degree + 1; const double bnp1 = gsl_pow_int(b, degreep1); const double anp1 = gsl_pow_int(a, degreep1); return (p->constant / degreep1)*(bnp1 - anp1); } /* f(x) = sin(x) */ double f_sin(double x, void * params) { return sin(x); } /* integ(f_sin,x,a,b) */ double integ_f_sin(double a, double b) { return -cos(b) + cos(a); } /* The test functions. */ double cqf1 ( double x , void *params ) { return exp(x); } double cqf2 ( double x , void *params ) { return x >= 0.3; } double cqf3 ( double x , void *params ) { return sqrt(x); } double cqf4 ( double x , void *params ) { return (23.0/25) * cosh(x) - cos(x); } double cqf5 ( double x , void *params ) { double x2 = x*x; return 1.0 / ( x2 * (x2 + 1) + 0.9); } double cqf6 ( double x , void *params ) { return x * sqrt( x ); } double cqf7 ( double x , void *params ) { return 1.0 / sqrt(x); } double cqf8 ( double x , void *params ) { double x2 = x*x; return 1.0 / (1 + x2*x2); } double cqf9 ( double x , void *params ) { return 2.0 / (2 + sin(10*M_PI*x)); } double cqf10 ( double x , void *params ) { return 1.0 / (1 + x); } double cqf11 ( double x , void *params ) { return 1.0 / (1 + exp(x)); } double cqf12 ( double x , void *params ) { return x / (exp(x) - 1.0); } double cqf13 ( double x , void *params ) { return sin(100 * M_PI * x) / (M_PI * x); } double cqf14 ( double x , void *params ) { return sqrt(50.0) * exp(-50*M_PI*x*x); } double cqf15 ( double x , void *params ) { return 25.0 * exp(-25*x); } double cqf16 ( double x , void *params ) { return 50 / M_PI * (2500 * x*x + 1); } double cqf17 ( double x , void *params ) { double t1 = 50 * M_PI * x ,t2; t2 = sin(t1) / t1; return 50 * t2 * t2; } double cqf18 ( double x , void *params ) { return cos( cos(x) + 3*sin(x) + 2*cos(2*x) + 3*sin(2*x) + 3*cos(3*x) ); } double cqf19 ( double x , void *params ) { return log(x); } double cqf20 ( double x , void *params ) { return 1 / (x*x + 1.005); } double cqf21 ( double x , void *params ) { return 1 / cosh( 10 * (x - 0.2) * 2 ) + 1 / cosh( 100 * (x - 0.4) * 4 ) + 1 / cosh( 1000 * (x - 0.6) * 8 ); } double cqf22 ( double x , void *params ) { return 4 * M_PI*M_PI * x * sin(20*M_PI*x) * cos(2*M_PI*x); } double cqf23 ( double x , void *params ) { double t = 230*x - 30; return 1 / (1 + t*t); } double cqf24 ( double x , void *params ) { return floor(exp(x)); } double cqf25 ( double x , void *params ) { return (x < 1) * (x + 1) + (1 <= x && x <= 3) * (3 - x) + (x > 3) * 2; } gsl-doc-2.3/integration/qk15.c0000664000175000017500000000465012616157443014250 0ustar eddedd/* integration/qk15.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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); } gsl-doc-2.3/integration/qag.c0000664000175000017500000001541712616157443014242 0ustar eddedd/* integration/qag.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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 achieved 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); } } gsl-doc-2.3/integration/glfixed.c0000664000175000017500000032026112616157443015110 0ustar eddedd/* * Numerical Integration by Gauss-Legendre Quadrature Formulas of high orders. * High-precision abscissas and weights are used. * * Original project homepage: http://www.holoborodko.com/pavel/?page_id=679 * Original contact e-mail: pavel@holoborodko.com * * Copyright (c)2007-2008 Pavel Holoborodko * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contributors: * Konstantin Holoborodko - Optimization of Legendre polynomial computing. * Rhys Ulerich - Inclusion within GNU Scientific Library. * */ #include #include #include #include #include #include static void gauss_legendre_tbl(int n, double* x, double* w, double eps); /* n = 2 */ static double x2[1] = {0.5773502691896257645091488}; static double w2[1] = {1.0000000000000000000000000}; /* n = 4 */ static double x4[2] = {0.3399810435848562648026658, 0.8611363115940525752239465}; static double w4[2] = {0.6521451548625461426269361, 0.3478548451374538573730639}; /* n = 6 */ static double x6[3] = {0.2386191860831969086305017, 0.6612093864662645136613996, 0.9324695142031520278123016}; static double w6[3] = {0.4679139345726910473898703, 0.3607615730481386075698335, 0.1713244923791703450402961}; /* n = 8 */ static double x8[4] = {0.1834346424956498049394761, 0.5255324099163289858177390, 0.7966664774136267395915539, 0.9602898564975362316835609}; static double w8[4] = {0.3626837833783619829651504, 0.3137066458778872873379622, 0.2223810344533744705443560, 0.1012285362903762591525314}; /* n = 10 */ static double x10[5] = {0.1488743389816312108848260, 0.4333953941292471907992659, 0.6794095682990244062343274, 0.8650633666889845107320967, 0.9739065285171717200779640}; static double w10[5] = {0.2955242247147528701738930, 0.2692667193099963550912269, 0.2190863625159820439955349, 0.1494513491505805931457763, 0.0666713443086881375935688}; /* n = 12 */ static double x12[6] = {0.1252334085114689154724414, 0.3678314989981801937526915, 0.5873179542866174472967024, 0.7699026741943046870368938, 0.9041172563704748566784659, 0.9815606342467192506905491}; static double w12[6] = {0.2491470458134027850005624, 0.2334925365383548087608499, 0.2031674267230659217490645, 0.1600783285433462263346525, 0.1069393259953184309602547, 0.0471753363865118271946160}; /* n = 14 */ static double x14[7] = {0.1080549487073436620662447, 0.3191123689278897604356718, 0.5152486363581540919652907, 0.6872929048116854701480198, 0.8272013150697649931897947, 0.9284348836635735173363911, 0.9862838086968123388415973}; static double w14[7] = {0.2152638534631577901958764, 0.2051984637212956039659241, 0.1855383974779378137417166, 0.1572031671581935345696019, 0.1215185706879031846894148, 0.0801580871597602098056333, 0.0351194603317518630318329}; /* n = 16 */ static double x16[8] = {0.0950125098376374401853193, 0.2816035507792589132304605, 0.4580167776572273863424194, 0.6178762444026437484466718, 0.7554044083550030338951012, 0.8656312023878317438804679, 0.9445750230732325760779884, 0.9894009349916499325961542}; static double w16[8] = {0.1894506104550684962853967, 0.1826034150449235888667637, 0.1691565193950025381893121, 0.1495959888165767320815017, 0.1246289712555338720524763, 0.0951585116824927848099251, 0.0622535239386478928628438, 0.0271524594117540948517806}; /* n = 18 */ static double x18[9] = {0.0847750130417353012422619, 0.2518862256915055095889729, 0.4117511614628426460359318, 0.5597708310739475346078715, 0.6916870430603532078748911, 0.8037049589725231156824175, 0.8926024664975557392060606, 0.9558239495713977551811959, 0.9915651684209309467300160}; static double w18[9] = {0.1691423829631435918406565, 0.1642764837458327229860538, 0.1546846751262652449254180, 0.1406429146706506512047313, 0.1225552067114784601845191, 0.1009420441062871655628140, 0.0764257302548890565291297, 0.0497145488949697964533349, 0.0216160135264833103133427}; /* n = 20 */ static double x20[10] = {0.0765265211334973337546404, 0.2277858511416450780804962, 0.3737060887154195606725482, 0.5108670019508270980043641, 0.6360536807265150254528367, 0.7463319064601507926143051, 0.8391169718222188233945291, 0.9122344282513259058677524, 0.9639719272779137912676661, 0.9931285991850949247861224}; static double w20[10] = {0.1527533871307258506980843, 0.1491729864726037467878287, 0.1420961093183820513292983, 0.1316886384491766268984945, 0.1181945319615184173123774, 0.1019301198172404350367501, 0.0832767415767047487247581, 0.0626720483341090635695065, 0.0406014298003869413310400, 0.0176140071391521183118620}; /* n = 32 */ static double x32[16] = {0.0483076656877383162348126, 0.1444719615827964934851864, 0.2392873622521370745446032, 0.3318686022821276497799168, 0.4213512761306353453641194, 0.5068999089322293900237475, 0.5877157572407623290407455, 0.6630442669302152009751152, 0.7321821187402896803874267, 0.7944837959679424069630973, 0.8493676137325699701336930, 0.8963211557660521239653072, 0.9349060759377396891709191, 0.9647622555875064307738119, 0.9856115115452683354001750, 0.9972638618494815635449811}; static double w32[16] = {0.0965400885147278005667648, 0.0956387200792748594190820, 0.0938443990808045656391802, 0.0911738786957638847128686, 0.0876520930044038111427715, 0.0833119242269467552221991, 0.0781938957870703064717409, 0.0723457941088485062253994, 0.0658222227763618468376501, 0.0586840934785355471452836, 0.0509980592623761761961632, 0.0428358980222266806568786, 0.0342738629130214331026877, 0.0253920653092620594557526, 0.0162743947309056706051706, 0.0070186100094700966004071}; /* n = 64 */ static double x64[32] = {0.0243502926634244325089558, 0.0729931217877990394495429, 0.1214628192961205544703765, 0.1696444204239928180373136, 0.2174236437400070841496487, 0.2646871622087674163739642, 0.3113228719902109561575127, 0.3572201583376681159504426, 0.4022701579639916036957668, 0.4463660172534640879849477, 0.4894031457070529574785263, 0.5312794640198945456580139, 0.5718956462026340342838781, 0.6111553551723932502488530, 0.6489654712546573398577612, 0.6852363130542332425635584, 0.7198818501716108268489402, 0.7528199072605318966118638, 0.7839723589433414076102205, 0.8132653151227975597419233, 0.8406292962525803627516915, 0.8659993981540928197607834, 0.8893154459951141058534040, 0.9105221370785028057563807, 0.9295691721319395758214902, 0.9464113748584028160624815, 0.9610087996520537189186141, 0.9733268277899109637418535, 0.9833362538846259569312993, 0.9910133714767443207393824, 0.9963401167719552793469245, 0.9993050417357721394569056}; static double w64[32] = {0.0486909570091397203833654, 0.0485754674415034269347991, 0.0483447622348029571697695, 0.0479993885964583077281262, 0.0475401657148303086622822, 0.0469681828162100173253263, 0.0462847965813144172959532, 0.0454916279274181444797710, 0.0445905581637565630601347, 0.0435837245293234533768279, 0.0424735151236535890073398, 0.0412625632426235286101563, 0.0399537411327203413866569, 0.0385501531786156291289625, 0.0370551285402400460404151, 0.0354722132568823838106931, 0.0338051618371416093915655, 0.0320579283548515535854675, 0.0302346570724024788679741, 0.0283396726142594832275113, 0.0263774697150546586716918, 0.0243527025687108733381776, 0.0222701738083832541592983, 0.0201348231535302093723403, 0.0179517157756973430850453, 0.0157260304760247193219660, 0.0134630478967186425980608, 0.0111681394601311288185905, 0.0088467598263639477230309, 0.0065044579689783628561174, 0.0041470332605624676352875, 0.0017832807216964329472961}; /* n = 96 */ static double x96[48] = {0.0162767448496029695791346, 0.0488129851360497311119582, 0.0812974954644255589944713, 0.1136958501106659209112081, 0.1459737146548969419891073, 0.1780968823676186027594026, 0.2100313104605672036028472, 0.2417431561638400123279319, 0.2731988125910491414872722, 0.3043649443544963530239298, 0.3352085228926254226163256, 0.3656968614723136350308956, 0.3957976498289086032850002, 0.4254789884073005453648192, 0.4547094221677430086356761, 0.4834579739205963597684056, 0.5116941771546676735855097, 0.5393881083243574362268026, 0.5665104185613971684042502, 0.5930323647775720806835558, 0.6189258401254685703863693, 0.6441634037849671067984124, 0.6687183100439161539525572, 0.6925645366421715613442458, 0.7156768123489676262251441, 0.7380306437444001328511657, 0.7596023411766474987029704, 0.7803690438674332176036045, 0.8003087441391408172287961, 0.8194003107379316755389996, 0.8376235112281871214943028, 0.8549590334346014554627870, 0.8713885059092965028737748, 0.8868945174024204160568774, 0.9014606353158523413192327, 0.9150714231208980742058845, 0.9277124567223086909646905, 0.9393703397527552169318574, 0.9500327177844376357560989, 0.9596882914487425393000680, 0.9683268284632642121736594, 0.9759391745851364664526010, 0.9825172635630146774470458, 0.9880541263296237994807628, 0.9925439003237626245718923, 0.9959818429872092906503991, 0.9983643758631816777241494, 0.9996895038832307668276901}; static double w96[48] = {0.0325506144923631662419614, 0.0325161187138688359872055, 0.0324471637140642693640128, 0.0323438225685759284287748, 0.0322062047940302506686671, 0.0320344562319926632181390, 0.0318287588944110065347537, 0.0315893307707271685580207, 0.0313164255968613558127843, 0.0310103325863138374232498, 0.0306713761236691490142288, 0.0302999154208275937940888, 0.0298963441363283859843881, 0.0294610899581679059704363, 0.0289946141505552365426788, 0.0284974110650853856455995, 0.0279700076168483344398186, 0.0274129627260292428234211, 0.0268268667255917621980567, 0.0262123407356724139134580, 0.0255700360053493614987972, 0.0249006332224836102883822, 0.0242048417923646912822673, 0.0234833990859262198422359, 0.0227370696583293740013478, 0.0219666444387443491947564, 0.0211729398921912989876739, 0.0203567971543333245952452, 0.0195190811401450224100852, 0.0186606796274114673851568, 0.0177825023160452608376142, 0.0168854798642451724504775, 0.0159705629025622913806165, 0.0150387210269949380058763, 0.0140909417723148609158616, 0.0131282295669615726370637, 0.0121516046710883196351814, 0.0111621020998384985912133, 0.0101607705350084157575876, 0.0091486712307833866325846, 0.0081268769256987592173824, 0.0070964707911538652691442, 0.0060585455042359616833167, 0.0050142027429275176924702, 0.0039645543384446866737334, 0.0029107318179349464084106, 0.0018539607889469217323359, 0.0007967920655520124294381}; /* n = 100 */ static double x100[50] = {0.0156289844215430828722167, 0.0468716824215916316149239, 0.0780685828134366366948174, 0.1091892035800611150034260, 0.1402031372361139732075146, 0.1710800805386032748875324, 0.2017898640957359972360489, 0.2323024818449739696495100, 0.2625881203715034791689293, 0.2926171880384719647375559, 0.3223603439005291517224766, 0.3517885263724217209723438, 0.3808729816246299567633625, 0.4095852916783015425288684, 0.4378974021720315131089780, 0.4657816497733580422492166, 0.4932107892081909335693088, 0.5201580198817630566468157, 0.5465970120650941674679943, 0.5725019326213811913168704, 0.5978474702471787212648065, 0.6226088602037077716041908, 0.6467619085141292798326303, 0.6702830156031410158025870, 0.6931491993558019659486479, 0.7153381175730564464599671, 0.7368280898020207055124277, 0.7575981185197071760356680, 0.7776279096494954756275514, 0.7968978923903144763895729, 0.8153892383391762543939888, 0.8330838798884008235429158, 0.8499645278795912842933626, 0.8660146884971646234107400, 0.8812186793850184155733168, 0.8955616449707269866985210, 0.9090295709825296904671263, 0.9216092981453339526669513, 0.9332885350430795459243337, 0.9440558701362559779627747, 0.9539007829254917428493369, 0.9628136542558155272936593, 0.9707857757637063319308979, 0.9778093584869182885537811, 0.9838775407060570154961002, 0.9889843952429917480044187, 0.9931249370374434596520099, 0.9962951347331251491861317, 0.9984919506395958184001634, 0.9997137267734412336782285}; static double w100[50] = {0.0312554234538633569476425, 0.0312248842548493577323765, 0.0311638356962099067838183, 0.0310723374275665165878102, 0.0309504788504909882340635, 0.0307983790311525904277139, 0.0306161865839804484964594, 0.0304040795264548200165079, 0.0301622651051691449190687, 0.0298909795933328309168368, 0.0295904880599126425117545, 0.0292610841106382766201190, 0.0289030896011252031348762, 0.0285168543223950979909368, 0.0281027556591011733176483, 0.0276611982207923882942042, 0.0271926134465768801364916, 0.0266974591835709626603847, 0.0261762192395456763423087, 0.0256294029102081160756420, 0.0250575444815795897037642, 0.0244612027079570527199750, 0.0238409602659682059625604, 0.0231974231852541216224889, 0.0225312202563362727017970, 0.0218430024162473863139537, 0.0211334421125276415426723, 0.0204032326462094327668389, 0.0196530874944353058653815, 0.0188837396133749045529412, 0.0180959407221281166643908, 0.0172904605683235824393442, 0.0164680861761452126431050, 0.0156296210775460027239369, 0.0147758845274413017688800, 0.0139077107037187726879541, 0.0130259478929715422855586, 0.0121314576629794974077448, 0.0112251140231859771172216, 0.0103078025748689695857821, 0.0093804196536944579514182, 0.0084438714696689714026208, 0.0074990732554647115788287, 0.0065469484508453227641521, 0.0055884280038655151572119, 0.0046244500634221193510958, 0.0036559612013263751823425, 0.0026839253715534824194396, 0.0017093926535181052395294, 0.0007346344905056717304063}; /* n = 128 */ static double x128[64] = {0.0122236989606157641980521, 0.0366637909687334933302153, 0.0610819696041395681037870, 0.0854636405045154986364980, 0.1097942311276437466729747, 0.1340591994611877851175753, 0.1582440427142249339974755, 0.1823343059853371824103826, 0.2063155909020792171540580, 0.2301735642266599864109866, 0.2538939664226943208556180, 0.2774626201779044028062316, 0.3008654388776772026671541, 0.3240884350244133751832523, 0.3471177285976355084261628, 0.3699395553498590266165917, 0.3925402750332674427356482, 0.4149063795522750154922739, 0.4370245010371041629370429, 0.4588814198335521954490891, 0.4804640724041720258582757, 0.5017595591361444642896063, 0.5227551520511754784539479, 0.5434383024128103634441936, 0.5637966482266180839144308, 0.5838180216287630895500389, 0.6034904561585486242035732, 0.6228021939105849107615396, 0.6417416925623075571535249, 0.6602976322726460521059468, 0.6784589224477192593677557, 0.6962147083695143323850866, 0.7135543776835874133438599, 0.7304675667419088064717369, 0.7469441667970619811698824, 0.7629743300440947227797691, 0.7785484755064119668504941, 0.7936572947621932902433329, 0.8082917575079136601196422, 0.8224431169556438424645942, 0.8361029150609068471168753, 0.8492629875779689691636001, 0.8619154689395484605906323, 0.8740527969580317986954180, 0.8856677173453972174082924, 0.8967532880491581843864474, 0.9073028834017568139214859, 0.9173101980809605370364836, 0.9267692508789478433346245, 0.9356743882779163757831268, 0.9440202878302201821211114, 0.9518019613412643862177963, 0.9590147578536999280989185, 0.9656543664319652686458290, 0.9717168187471365809043384, 0.9771984914639073871653744, 0.9820961084357185360247656, 0.9864067427245862088712355, 0.9901278184917343833379303, 0.9932571129002129353034372, 0.9957927585349811868641612, 0.9977332486255140198821574, 0.9990774599773758950119878, 0.9998248879471319144736081}; static double w128[64] = {0.0244461801962625182113259, 0.0244315690978500450548486, 0.0244023556338495820932980, 0.0243585572646906258532685, 0.0243002001679718653234426, 0.0242273192228152481200933, 0.0241399579890192849977167, 0.0240381686810240526375873, 0.0239220121367034556724504, 0.0237915577810034006387807, 0.0236468835844476151436514, 0.0234880760165359131530253, 0.0233152299940627601224157, 0.0231284488243870278792979, 0.0229278441436868469204110, 0.0227135358502364613097126, 0.0224856520327449668718246, 0.0222443288937997651046291, 0.0219897106684604914341221, 0.0217219495380520753752610, 0.0214412055392084601371119, 0.0211476464682213485370195, 0.0208414477807511491135839, 0.0205227924869600694322850, 0.0201918710421300411806732, 0.0198488812328308622199444, 0.0194940280587066028230219, 0.0191275236099509454865185, 0.0187495869405447086509195, 0.0183604439373313432212893, 0.0179603271850086859401969, 0.0175494758271177046487069, 0.0171281354231113768306810, 0.0166965578015892045890915, 0.0162550009097851870516575, 0.0158037286593993468589656, 0.0153430107688651440859909, 0.0148731226021473142523855, 0.0143943450041668461768239, 0.0139069641329519852442880, 0.0134112712886163323144890, 0.0129075627392673472204428, 0.0123961395439509229688217, 0.0118773073727402795758911, 0.0113513763240804166932817, 0.0108186607395030762476596, 0.0102794790158321571332153, 0.0097341534150068058635483, 0.0091830098716608743344787, 0.0086263777986167497049788, 0.0080645898904860579729286, 0.0074979819256347286876720, 0.0069268925668988135634267, 0.0063516631617071887872143, 0.0057726375428656985893346, 0.0051901618326763302050708, 0.0046045842567029551182905, 0.0040162549837386423131943, 0.0034255260409102157743378, 0.0028327514714579910952857, 0.0022382884309626187436221, 0.0016425030186690295387909, 0.0010458126793403487793129, 0.0004493809602920903763943}; /* n = 256 */ static double x256[128] = {0.0061239123751895295011702, 0.0183708184788136651179263, 0.0306149687799790293662786, 0.0428545265363790983812423, 0.0550876556946339841045614, 0.0673125211657164002422903, 0.0795272891002329659032271, 0.0917301271635195520311456, 0.1039192048105094036391969, 0.1160926935603328049407349, 0.1282487672706070947420496, 0.1403856024113758859130249, 0.1525013783386563953746068, 0.1645942775675538498292845, 0.1766624860449019974037218, 0.1887041934213888264615036, 0.2007175933231266700680007, 0.2127008836226259579370402, 0.2246522667091319671478783, 0.2365699497582840184775084, 0.2484521450010566668332427, 0.2602970699919425419785609, 0.2721029478763366095052447, 0.2838680076570817417997658, 0.2955904844601356145637868, 0.3072686197993190762586103, 0.3189006618401062756316834, 0.3304848656624169762291870, 0.3420194935223716364807297, 0.3535028151129699895377902, 0.3649331078236540185334649, 0.3763086569987163902830557, 0.3876277561945155836379846, 0.3988887074354591277134632, 0.4100898214687165500064336, 0.4212294180176238249768124, 0.4323058260337413099534411, 0.4433173839475273572169258, 0.4542624399175899987744552, 0.4651393520784793136455705, 0.4759464887869833063907375, 0.4866822288668903501036214, 0.4973449618521814771195124, 0.5079330882286160362319249, 0.5184450196736744762216617, 0.5288791792948222619514764, 0.5392340018660591811279362, 0.5495079340627185570424269, 0.5596994346944811451369074, 0.5698069749365687590576675, 0.5798290385590829449218317, 0.5897641221544543007857861, 0.5996107353629683217303882, 0.6093674010963339395223108, 0.6190326557592612194309676, 0.6286050494690149754322099, 0.6380831462729113686686886, 0.6474655243637248626170162, 0.6567507762929732218875002, 0.6659375091820485599064084, 0.6750243449311627638559187, 0.6840099204260759531248771, 0.6928928877425769601053416, 0.7016719143486851594060835, 0.7103456833045433133945663, 0.7189128934599714483726399, 0.7273722596496521265868944, 0.7357225128859178346203729, 0.7439624005491115684556831, 0.7520906865754920595875297, 0.7601061516426554549419068, 0.7680075933524456359758906, 0.7757938264113257391320526, 0.7834636828081838207506702, 0.7910160119895459945467075, 0.7984496810321707587825429, 0.8057635748129986232573891, 0.8129565961764315431364104, 0.8200276660989170674034781, 0.8269757238508125142890929, 0.8337997271555048943484439, 0.8404986523457627138950680, 0.8470714945172962071870724, 0.8535172676795029650730355, 0.8598350049033763506961731, 0.8660237584665545192975154, 0.8720825999954882891300459, 0.8780106206047065439864349, 0.8838069310331582848598262, 0.8894706617776108888286766, 0.8950009632230845774412228, 0.9003970057703035447716200, 0.9056579799601446470826819, 0.9107830965950650118909072, 0.9157715868574903845266696, 0.9206227024251464955050471, 0.9253357155833162028727303, 0.9299099193340056411802456, 0.9343446275020030942924765, 0.9386391748378148049819261, 0.9427929171174624431830761, 0.9468052312391274813720517, 0.9506755153166282763638521, 0.9544031887697162417644479, 0.9579876924111781293657904, 0.9614284885307321440064075, 0.9647250609757064309326123, 0.9678769152284894549090038, 0.9708835784807430293209233, 0.9737445997043704052660786, 0.9764595497192341556210107, 0.9790280212576220388242380, 0.9814496290254644057693031, 0.9837240097603154961666861, 0.9858508222861259564792451, 0.9878297475648606089164877, 0.9896604887450652183192437, 0.9913427712075830869221885, 0.9928763426088221171435338, 0.9942609729224096649628775, 0.9954964544810963565926471, 0.9965826020233815404305044, 0.9975192527567208275634088, 0.9983062664730064440555005, 0.9989435258434088565550263, 0.9994309374662614082408542, 0.9997684374092631861048786, 0.9999560500189922307348012}; static double w256[128] = {0.0122476716402897559040703, 0.0122458343697479201424639, 0.0122421601042728007697281, 0.0122366493950401581092426, 0.0122293030687102789041463, 0.0122201222273039691917087, 0.0122091082480372404075141, 0.0121962627831147135181810, 0.0121815877594817721740476, 0.0121650853785355020613073, 0.0121467581157944598155598, 0.0121266087205273210347185, 0.0121046402153404630977578, 0.0120808558957245446559752, 0.0120552593295601498143471, 0.0120278543565825711612675, 0.0119986450878058119345367, 0.0119676359049058937290073, 0.0119348314595635622558732, 0.0119002366727664897542872, 0.0118638567340710787319046, 0.0118256971008239777711607, 0.0117857634973434261816901, 0.0117440619140605503053767, 0.0117005986066207402881898, 0.0116553800949452421212989, 0.0116084131622531057220847, 0.0115597048540436357726687, 0.0115092624770394979585864, 0.0114570935980906391523344, 0.0114032060430391859648471, 0.0113476078955454919416257, 0.0112903074958755095083676, 0.0112313134396496685726568, 0.0111706345765534494627109, 0.0111082800090098436304608, 0.0110442590908139012635176, 0.0109785814257295706379882, 0.0109112568660490397007968, 0.0108422955111147959952935, 0.0107717077058046266366536, 0.0106995040389797856030482, 0.0106256953418965611339617, 0.0105502926865814815175336, 0.0104733073841704030035696, 0.0103947509832117289971017, 0.0103146352679340150682607, 0.0102329722564782196569549, 0.0101497741990948656546341, 0.0100650535763063833094610, 0.0099788230970349101247339, 0.0098910956966958286026307, 0.0098018845352573278254988, 0.0097112029952662799642497, 0.0096190646798407278571622, 0.0095254834106292848118297, 0.0094304732257377527473528, 0.0093340483776232697124660, 0.0092362233309563026873787, 0.0091370127604508064020005, 0.0090364315486628736802278, 0.0089344947837582075484084, 0.0088312177572487500253183, 0.0087266159616988071403366, 0.0086207050884010143053688, 0.0085135010250224906938384, 0.0084050198532215357561803, 0.0082952778462352254251714, 0.0081842914664382699356198, 0.0080720773628734995009470, 0.0079586523687543483536132, 0.0078440334989397118668103, 0.0077282379473815556311102, 0.0076112830845456594616187, 0.0074931864548058833585998, 0.0073739657738123464375724, 0.0072536389258339137838291, 0.0071322239610753900716724, 0.0070097390929698226212344, 0.0068862026954463203467133, 0.0067616333001737987809279, 0.0066360495937810650445900, 0.0065094704150536602678099, 0.0063819147521078805703752, 0.0062534017395424012720636, 0.0061239506555679325423891, 0.0059935809191153382211277, 0.0058623120869226530606616, 0.0057301638506014371773844, 0.0055971560336829100775514, 0.0054633085886443102775705, 0.0053286415939159303170811, 0.0051931752508692809303288, 0.0050569298807868423875578, 0.0049199259218138656695588, 0.0047821839258926913729317, 0.0046437245556800603139791, 0.0045045685814478970686418, 0.0043647368779680566815684, 0.0042242504213815362723565, 0.0040831302860526684085998, 0.0039413976414088336277290, 0.0037990737487662579981170, 0.0036561799581425021693892, 0.0035127377050563073309711, 0.0033687685073155510120191, 0.0032242939617941981570107, 0.0030793357411993375832054, 0.0029339155908297166460123, 0.0027880553253277068805748, 0.0026417768254274905641208, 0.0024951020347037068508395, 0.0023480529563273120170065, 0.0022006516498399104996849, 0.0020529202279661431745488, 0.0019048808534997184044191, 0.0017565557363307299936069, 0.0016079671307493272424499, 0.0014591373333107332010884, 0.0013100886819025044578317, 0.0011608435575677247239706, 0.0010114243932084404526058, 0.0008618537014200890378141, 0.0007121541634733206669090, 0.0005623489540314098028152, 0.0004124632544261763284322, 0.0002625349442964459062875, 0.0001127890178222721755125}; /* n = 512 */ static double x512[256] = {0.0030649621851593961529232, 0.0091947713864329108047442, 0.0153242350848981855249677, 0.0214531229597748745137841, 0.0275812047119197840615246, 0.0337082500724805951232271, 0.0398340288115484476830396, 0.0459583107468090617788760, 0.0520808657521920701127271, 0.0582014637665182372392330, 0.0643198748021442404045319, 0.0704358689536046871990309, 0.0765492164062510452915674, 0.0826596874448871596284651, 0.0887670524624010326092165, 0.0948710819683925428909483, 0.1009715465977967786264323, 0.1070682171195026611052004, 0.1131608644449665349442888, 0.1192492596368204011642726, 0.1253331739174744696875513, 0.1314123786777137080093018, 0.1374866454852880630171099, 0.1435557460934960331730353, 0.1496194524497612685217272, 0.1556775367042018762501969, 0.1617297712181921097989489, 0.1677759285729161198103670, 0.1738157815779134454985394, 0.1798491032796159253350647, 0.1858756669698757062678115, 0.1918952461944840310240859, 0.1979076147616804833961808, 0.2039125467506523717658375, 0.2099098165200239314947094, 0.2158991987163350271904893, 0.2218804682825090362529109, 0.2278534004663095955103621, 0.2338177708287858931763260, 0.2397733552527061887852891, 0.2457199299509792442100997, 0.2516572714750633493170137, 0.2575851567233626262808095, 0.2635033629496102970603704, 0.2694116677712385990250046, 0.2753098491777350342234845, 0.2811976855389846383013106, 0.2870749556135979555970354, 0.2929414385572244074855835, 0.2987969139308507415853707, 0.3046411617090842500066247, 0.3104739622884204453906292, 0.3162950964954948840736281, 0.3221043455953188263048133, 0.3279014912994984240551598, 0.3336863157744371275728377, 0.3394586016495210024715049, 0.3452181320252866497799379, 0.3509646904815714220351686, 0.3566980610856456291665404, 0.3624180284003264285948478, 0.3681243774920730946589582, 0.3738168939390633631820054, 0.3794953638392505477003659, 0.3851595738184011246011504, 0.3908093110381124851478484, 0.3964443632038105531190080, 0.4020645185727269675414064, 0.4076695659618555307670286, 0.4132592947558876229222955, 0.4188334949151262845483445, 0.4243919569833786700527309, 0.4299344720958265754056529, 0.4354608319868747443376920, 0.4409708289979766581310498, 0.4464642560854375149423431, 0.4519409068281941054521446, 0.4574005754355712925046003, 0.4628430567550148032795831, 0.4682681462798000434299255, 0.4736756401567166435172692, 0.4790653351937284489919577, 0.4844370288676086658851277, 0.4897905193315498753147078, 0.4951256054227486308513615, 0.5004420866699643537454866, 0.5057397633010522419821678, 0.5110184362504699101074361, 0.5162779071667574777562819, 0.5215179784199908258105606, 0.5267384531092077401231844, 0.5319391350698066637637706, 0.5371198288809177797701793, 0.5422803398727461474300859, 0.5474204741338866161668468, 0.5525400385186102421644070, 0.5576388406541219339368088, 0.5627166889477890541289656, 0.5677733925943407059267120, 0.5728087615830374335557009, 0.5778226067048110674604360, 0.5828147395593744458765762, 0.5877849725623007456415722, 0.5927331189520721562306608, 0.5976589927970976321572046, 0.6025624090026994600382737, 0.6074431833180683777981926, 0.6123011323431869846644595, 0.6171360735357211818019505, 0.6219478252178793846326095, 0.6267362065832392490988318, 0.6315010377035416553494506, 0.6362421395354516935575740, 0.6409593339272863978194482, 0.6456524436257089753330001, 0.6503212922823892793136899, 0.6549657044606302753737317, 0.6595855056419602523685720, 0.6641805222326905300017078, 0.6687505815704384167754210, 0.6732955119306151731807642, 0.6778151425328787363350998, 0.6823093035475509635996236, 0.6867778261019991540425409, 0.6912205422869816079558685, 0.6956372851629569859851427, 0.7000278887663572307915895, 0.7043921881158238155354902, 0.7087300192184070848475163, 0.7130412190757284553416507, 0.7173256256901052441189100, 0.7215830780706378951153816, 0.7258134162392593745610389, 0.7300164812367465082373380, 0.7341921151286930346516885, 0.7383401610114441496854630, 0.7424604630179923197192207, 0.7465528663238341416942072, 0.7506172171527880300329109, 0.7546533627827725118134392, 0.7586611515515449130726824, 0.7626404328624002206015913, 0.7665910571898299050923647, 0.7705128760851404930018538, 0.7744057421820316760079998, 0.7782695092021337484565606, 0.7821040319605041647237048, 0.7859091663710830099561901, 0.7896847694521071791947507, 0.7934306993314830614379285, 0.7971468152521175267628422, 0.8008329775772070161862372, 0.8044890477954845355235412, 0.8081148885264243560855026, 0.8117103635254042266412553, 0.8152753376888249026732770, 0.8188096770591868005536242, 0.8223132488301235858819787, 0.8257859213513925068443721, 0.8292275641338212850768968, 0.8326380478542113781512150, 0.8360172443601974294381733, 0.8393650266750627227522641, 0.8426812690025104608329811, 0.8459658467313906883792422, 0.8492186364403826820199251, 0.8524395159026326312771384, 0.8556283640903464362590494, 0.8587850611793374495058711, 0.8619094885535289911058997, 0.8650015288094114678982387, 0.8680610657604539292849800, 0.8710879844414698938880857, 0.8740821711129372830049576, 0.8770435132652722985416439, 0.8799718996230570848337538, 0.8828672201492210155023745, 0.8857293660491754482355527, 0.8885582297749017921351663, 0.8913537050289927340242104, 0.8941156867686464718706125, 0.8968440712096138052506156, 0.8995387558300979345474886, 0.9021996393746068223597927, 0.9048266218577579723776075, 0.9074196045680354827749729, 0.9099784900714992329623006, 0.9125031822154460643436214, 0.9149935861320228175302595, 0.9174496082417910902748409, 0.9198711562572435822074657, 0.9222581391862718942794141, 0.9246104673355856526489486, 0.9269280523140828285786768, 0.9292108070361711277546193, 0.9314586457250403242837002, 0.9336714839158854164789745, 0.9358492384590804834007204, 0.9379918275233031229867813, 0.9400991705986093544775539, 0.9421711884994588697201555, 0.9442078033676905198230562, 0.9462089386754479255274304, 0.9481745192280551015654245, 0.9501044711668419871894147, 0.9519987219719197769813274, 0.9538572004649059479887372, 0.9556798368115988811866200, 0.9574665625246019772327448, 0.9592173104658971684737507, 0.9609320148493677311718534, 0.9626106112432703039637754, 0.9642530365726560206402068, 0.9658592291217406674540047, 0.9674291285362237773389233, 0.9689626758255565756615864, 0.9704598133651586944555050, 0.9719204848985835745206522, 0.9733446355396324773464471, 0.9747322117744170315712560, 0.9760831614633702416830300, 0.9773974338432058899681861, 0.9786749795288262664309572, 0.9799157505151781656726285, 0.9811197001790570947322311, 0.9822867832808596419166429, 0.9834169559662839640681455, 0.9845101757679783590716126, 0.9855664016071379024692622, 0.9865855937950491429603684, 0.9875677140345828729848910, 0.9885127254216350200148487, 0.9894205924465157453777048, 0.9902912809952868962106899, 0.9911247583510480415528399, 0.9919209931951714500244370, 0.9926799556084865573546763, 0.9934016170724147657859271, 0.9940859504700558793702825, 0.9947329300872282225027936, 0.9953425316134657151476031, 0.9959147321429772566997088, 0.9964495101755774022837600, 0.9969468456176038804367370, 0.9974067197828498321611183, 0.9978291153935628466036470, 0.9982140165816127953876923, 0.9985614088900397275573677, 0.9988712792754494246541769, 0.9991436161123782382453400, 0.9993784092025992514480161, 0.9995756497983108555936109, 0.9997353306710426625827368, 0.9998574463699794385446275, 0.9999419946068456536361287, 0.9999889909843818679872841}; static double w512[256] = {0.0061299051754057857591564, 0.0061296748380364986664278, 0.0061292141719530834395471, 0.0061285231944655327693402, 0.0061276019315380226384508, 0.0061264504177879366912426, 0.0061250686964845654506976, 0.0061234568195474804311878, 0.0061216148475445832082156, 0.0061195428496898295184288, 0.0061172409038406284754329, 0.0061147090964949169991245, 0.0061119475227879095684795, 0.0061089562864885234199252, 0.0061057354999954793256260, 0.0061022852843330780981965, 0.0060986057691466529805468, 0.0060946970926976980917399, 0.0060905594018586731119147, 0.0060861928521074844014940, 0.0060815976075216427620556, 0.0060767738407720980583934, 0.0060717217331167509334394, 0.0060664414743936418598512, 0.0060609332630138177841916, 0.0060551973059538766317450, 0.0060492338187481899521175, 0.0060430430254808039978627, 0.0060366251587770195404584, 0.0060299804597946507400317, 0.0060231091782149633972884, 0.0060160115722332929281516, 0.0060086879085493424136484, 0.0060011384623571610896056, 0.0059933635173348036527221, 0.0059853633656336707715812, 0.0059771383078675312031423, 0.0059686886531012259272183, 0.0059600147188390547233923, 0.0059511168310128456267588, 0.0059419953239697077107922, 0.0059326505404594676575446, 0.0059230828316217905872556, 0.0059132925569729856313229, 0.0059032800843924967444267, 0.0058930457901090792634301, 0.0058825900586866627324847, 0.0058719132830099005255609, 0.0058610158642694068093892, 0.0058498982119466814015496, 0.0058385607437987230901727, 0.0058270038858423319934219, 0.0058152280723381015486124, 0.0058032337457741007324836, 0.0057910213568492471257818, 0.0057785913644563714469284, 0.0057659442356649741911390, 0.0057530804457036750229319, 0.0057400004779423555815070, 0.0057267048238739963699973, 0.0057131939830962084110906, 0.0056994684632924603629882, 0.0056855287802130018011102, 0.0056713754576554833823756, 0.0056570090274452746202723, 0.0056424300294154800102991, 0.0056276390113866542566918, 0.0056126365291462173626557, 0.0055974231464275703576030, 0.0055819994348889124461425, 0.0055663659740917603747899, 0.0055505233514791708235538, 0.0055344721623536666407146, 0.0055182130098548677502395, 0.0055017465049368275723757, 0.0054850732663450758090285, 0.0054681939205933684565648, 0.0054511091019401459196852, 0.0054338194523647001109732, 0.0054163256215430514316688, 0.0053986282668235365401123, 0.0053807280532021078251738, 0.0053626256532973455128155, 0.0053443217473251833447318, 0.0053258170230733487787774, 0.0053071121758755186716175, 0.0052882079085851914147269, 0.0052691049315492765055207, 0.0052498039625814025460136, 0.0052303057269349446719890, 0.0052106109572757724261988, 0.0051907203936547190996206, 0.0051706347834797735752665, 0.0051503548814879957194620, 0.0051298814497171563759039, 0.0051092152574771030281542, 0.0050883570813208522065339, 0.0050673077050154097256505, 0.0050460679195123198490183, 0.0050246385229179444874178, 0.0050030203204634735477834, 0.0049812141244746675595135, 0.0049592207543413337151533, 0.0049370410364865364724225, 0.0049146758043355438745290, 0.0048921258982845107556462, 0.0048693921656689000083132, 0.0048464754607316430993636, 0.0048233766445910410307843, 0.0048000965852084069516609, 0.0047766361573554516370718, 0.0047529962425814130594576, 0.0047291777291799312876071, 0.0047051815121556699579709, 0.0046810084931906855725376, 0.0046566595806105458869828, 0.0046321356893501986622283, 0.0046074377409195920619320, 0.0045825666633690479877601, 0.0045575233912543896535753, 0.0045323088656018247089130, 0.0045069240338725852313010, 0.0044813698499273259161146, 0.0044556472739902818017469, 0.0044297572726131868769073, 0.0044037008186389549258496, 0.0043774788911651239762643, 0.0043510924755070657234522, 0.0043245425631609613132305, 0.0042978301517665448748000, 0.0042709562450696162035304, 0.0042439218528843240022977, 0.0042167279910552210986262, 0.0041893756814190930634598, 0.0041618659517665616659011, 0.0041341998358034646067195, 0.0041063783731120129818357, 0.0040784026091117279353449, 0.0040502735950201579699371, 0.0040219923878133783908191, 0.0039935600501862743674273, 0.0039649776505126091053562, 0.0039362462628048786290012, 0.0039073669666739546834366, 0.0038783408472885172720108, 0.0038491689953342783540510, 0.0038198525069729982349166, 0.0037903924838012961884344, 0.0037607900328092568594835, 0.0037310462663388340021755, 0.0037011623020420531166926, 0.0036711392628390145554094, 0.0036409782768756986764252, 0.0036106804774815746300758, 0.0035802470031270143713799, 0.0035496789973805134987000, 0.0035189776088657205261605, 0.0034881439912182762045767, 0.0034571793030424645127888, 0.0034260847078676769483860, 0.0033948613741046917538288, 0.0033635104750017697209450, 0.0033320331886005682236783, 0.0033004306976918751358177, 0.0032687041897711642972145, 0.0032368548569939741987234, 0.0032048838961311115627642, 0.0031727925085236815030060, 0.0031405819000379459532169, 0.0031082532810200120618074, 0.0030758078662503522550163, 0.0030432468748981576780527, 0.0030105715304755267298129, 0.0029777830607914904130339, 0.0029448826979058762279357, 0.0029118716780830123435331, 0.0028787512417452737868732, 0.0028455226334264723964728, 0.0028121871017250922921949, 0.0027787458992573726197173, 0.0027452002826102393336092, 0.0027115515122940877888456, 0.0026778008526954179163600, 0.0026439495720293237639656, 0.0026099989422918391896635, 0.0025759502392121415000167, 0.0025418047422046148318992, 0.0025075637343207750815413, 0.0024732285022010581903898, 0.0024388003360264736029032, 0.0024042805294701247170072, 0.0023696703796485981535706, 0.0023349711870732236769383, 0.0023001842556012066042973, 0.0022653108923866345474810, 0.0022303524078313603367724, 0.0021953101155357629823745, 0.0021601853322493885355395, 0.0021249793778214727179358, 0.0020896935751513471947536, 0.0020543292501387313744068, 0.0020188877316339116255770, 0.0019833703513878098109153, 0.0019477784440019430461334, 0.0019121133468782766036998, 0.0018763764001689718921795, 0.0018405689467260314557679, 0.0018046923320508429542037, 0.0017687479042436241015783, 0.0017327370139527705642995, 0.0016966610143241088445575, 0.0016605212609500562072903, 0.0016243191118186897474239, 0.0015880559272627267421479, 0.0015517330699084184928942, 0.0015153519046243599371387, 0.0014789137984702174059640, 0.0014424201206453770259886, 0.0014058722424375164225552, 0.0013692715371711025869345, 0.0013326193801558190401403, 0.0012959171486349257824991, 0.0012591662217335559930561, 0.0012223679804069540808915, 0.0011855238073886605549070, 0.0011486350871386503607080, 0.0011117032057914329649653, 0.0010747295511041247428251, 0.0010377155124045074300544, 0.0010006624805390909706032, 0.0009635718478212056798501, 0.0009264450079791582697455, 0.0008892833561045005372012, 0.0008520882886004809402792, 0.0008148612031307819965602, 0.0007776034985686972438014, 0.0007403165749469818962867, 0.0007030018334087411433900, 0.0006656606761599343409382, 0.0006282945064244358390880, 0.0005909047284032230162400, 0.0005534927472403894647847, 0.0005160599690007674370993, 0.0004786078006679509066920, 0.0004411376501795405636493, 0.0004036509265333198797447, 0.0003661490400356268530141, 0.0003286334028523334162522, 0.0002911054302514885125319, 0.0002535665435705865135866, 0.0002160181779769908583388, 0.0001784618055459532946077, 0.0001408990173881984930124, 0.0001033319034969132362968, 0.0000657657316592401958310, 0.0000282526373739346920387}; /* n = 1024 */ static double x1024[512] = {0.0015332313560626384065387, 0.0045996796509132604743248, 0.0076660846940754867627839, 0.0107324176515422803327458, 0.0137986496899844401539048, 0.0168647519770217265449962, 0.0199306956814939776907024, 0.0229964519737322146859283, 0.0260619920258297325581921, 0.0291272870119131747190088, 0.0321923081084135882953009, 0.0352570264943374577920498, 0.0383214133515377145376052, 0.0413854398649847193632977, 0.0444490772230372159692514, 0.0475122966177132524285687, 0.0505750692449610682823599, 0.0536373663049299446784129, 0.0566991590022410150066456, 0.0597604185462580334848567, 0.0628211161513580991486838, 0.0658812230372023327000985, 0.0689407104290065036692117, 0.0719995495578116053446277, 0.0750577116607543749280791, 0.0781151679813377563695878, 0.0811718897697013033399379, 0.0842278482828915197978074, 0.0872830147851321356094940, 0.0903373605480943146797811, 0.0933908568511667930531222, 0.0964434749817259444449839, 0.0994951862354057706638682, 0.1025459619163678143852404, 0.1055957733375709917393206, 0.1086445918210413421754502, 0.1116923886981416930665228, 0.1147391353098412365177689, 0.1177848030069850158450139, 0.1208293631505633191883714, 0.1238727871119809777282145, 0.1269150462733265659711591, 0.1299561120276415015747167, 0.1329959557791890421802183, 0.1360345489437231767245806, 0.1390718629487574087024745, 0.1421078692338334288514767, 0.1451425392507896747338214, 0.1481758444640297746894331, 0.1512077563507908736360111, 0.1542382464014118381930443, 0.1572672861196013386077717, 0.1602948470227058049622614, 0.1633209006419772551419632, 0.1663454185228409920472972, 0.1693683722251631675310675, 0.1723897333235182105457458, 0.1754094734074561169859457, 0.1784275640817695987127083, 0.1814439769667610892475458, 0.1844586836985096036255346, 0.1874716559291374498981239, 0.1904828653270767897777182, 0.1934922835773360459175133, 0.1964998823817661533215037, 0.1995056334593266523810493, 0.2025095085463516210358758, 0.2055114793968154435588961, 0.2085115177825984134657778, 0.2115095954937521680517391, 0.2145056843387649520596422, 0.2174997561448267079850562, 0.2204917827580939905255947, 0.2234817360439547026834844, 0.2264695878872926510320010, 0.2294553101927519176581055, 0.2324388748850010462953415, 0.2354202539089970401627982, 0.2383994192302491690277166, 0.2413763428350825830111093, 0.2443509967309017306575811, 0.2473233529464535787923793, 0.2502933835320906316905658, 0.2532610605600337470850902, 0.2562263561246347465424530, 0.2591892423426388177365829, 0.2621496913534467061535080, 0.2651076753193766937613805, 0.2680631664259263621824189, 0.2710161368820341379053566, 0.2739665589203406170790369, 0.2769144047974496674298651, 0.2798596467941893048479266, 0.2828022572158723421886958, 0.2857422083925568078394062, 0.2886794726793061316013119, 0.2916140224564490954412652, 0.2945458301298395466682397, 0.2974748681311158710926665, 0.3004011089179602237287060, 0.3033245249743575146018584, 0.3062450888108541472266190, 0.3091627729648165073212094, 0.3120775500006891993287636, 0.3149893925102530283167230, 0.3178982731128827248285835, 0.3208041644558044102645582, 0.3237070392143528003701590, 0.3266068700922281444141618, 0.3295036298217528976399056, 0.3323972911641281245763845, 0.3352878269096896307981228, 0.3381752098781638207253743, 0.3410594129189232790587667, 0.3439404089112420734451077, 0.3468181707645507759736923, 0.3496926714186912011050938, 0.3525638838441708576370887, 0.3554317810424171123150528, 0.3582963360460310626968790, 0.3611575219190411168852009, 0.3640153117571562777424605, 0.3668696786880191292071420, 0.3697205958714585223322883, 0.3725680364997419586702471, 0.3754119737978276686304337, 0.3782523810236163824397703, 0.3810892314682027913383487, 0.3839224984561266966457784, 0.3867521553456238443366159, 0.3895781755288764427662286, 0.3924005324322633611914264, 0.3952191995166100067331951, 0.3980341502774378774318886, 0.4008453582452137890482864, 0.4036527969855987732669841, 0.4064564400996966449616823, 0.4092562612243022361850445, 0.4120522340321492945489319, 0.4148443322321580436639788, 0.4176325295696824033106488, 0.4204167998267568670171117, 0.4231971168223430347225035, 0.4259734544125757982073747, 0.4287457864910091769763965, 0.4315140869888618022816824, 0.4342783298752620469783905, 0.4370384891574927989076034, 0.4397945388812358755048319, 0.4425464531308160773358662, 0.4452942060294448782650898, 0.4480377717394637499647905, 0.4507771244625871184774399, 0.4535122384401449505463744, 0.4562430879533249674337895, 0.4589696473234144839484647, 0.4616918909120418704091584, 0.4644097931214176352731591, 0.4671233283945751261630457, 0.4698324712156108470282980, 0.4725371961099243891820077, 0.4752374776444579739565725, 0.4779332904279356047259052, 0.4806246091111018260453658, 0.4833114083869600876643171, 0.4859936629910107111699206, 0.4886713477014884570245255, 0.4913444373395996897627612, 0.4940129067697591391182235, 0.4966767308998262548534419, 0.4993358846813411530706387, 0.5019903431097601517846292, 0.5046400812246908935430768, 0.5072850741101270528831987, 0.5099252968946826264179220, 0.5125607247518258033484145, 0.5151913329001124142038603, 0.5178170966034189556133159, 0.5204379911711751889184691, 0.5230539919585963104401304, 0.5256650743669146912153147, 0.5282712138436111840258187, 0.5308723858826459955432696, 0.5334685660246891214197081, 0.5360597298573503421568799, 0.5386458530154087775915395, 0.5412269111810419978382210, 0.5438028800840546885350993, 0.5463737355021068682427603, 0.5489394532609416558499039, 0.5515000092346125858442412, 0.5540553793457104693110943, 0.5566055395655897985264809, 0.5591504659145946930157566, 0.5616901344622843849532002, 0.5642245213276582417822586, 0.5667536026793803239405196, 0.5692773547360034755778519, 0.5717957537661929461605442, 0.5743087760889495408586850, 0.5768163980738322976184566, 0.5793185961411806888254667, 0.5818153467623363454697137, 0.5843066264598643017272666, 0.5867924118077737578782574, 0.5892726794317383594853053, 0.5917474060093159907610475, 0.5942165682701680800580147, 0.5966801429962784154186793, 0.5991381070221714681281111, 0.6015904372351302222163013, 0.6040371105754135078618616, 0.6064781040364728366534687, 0.6089133946651687366701116, 0.6113429595619865853458987, 0.6137667758812519380899084, 0.6161848208313453506363029, 0.6185970716749166931046915, 0.6210035057290989537555048, 0.6234041003657215304299416, 0.6257988330115230076688675, 0.6281876811483634175098794, 0.6305706223134359819666081, 0.6329476340994783351992008, 0.6353186941549832233898213, 0.6376837801844086803419153, 0.6400428699483876768269192, 0.6423959412639372417070377, 0.6447429720046670528676835, 0.6470839401009874959981582, 0.6494188235403171892641570, 0.6517476003672899719207013, 0.6540702486839613549191454, 0.6563867466500144315669620, 0.6586970724829652463040876, 0.6610012044583676196647058, 0.6632991209100174274984589, 0.6655908002301563325302097, 0.6678762208696749663426270, 0.6701553613383155598710345, 0.6724282002048740205051479, 0.6746947160974014538975312, 0.6769548877034051285838219, 0.6792086937700488815250166, 0.6814561131043529626873631, 0.6836971245733933167806834, 0.6859317071045003002812397, 0.6881598396854568318705713, 0.6903815013646959744270519, 0.6925966712514979467122689, 0.6948053285161865628996815, 0.6970074523903250980984011, 0.6992030221669115780303307, 0.7013920172005734910243170, 0.7035744169077619204963997, 0.7057502007669450960906928, 0.7079193483188013616608982, 0.7100818391664115582779368, 0.7122376529754508204546805, 0.7143867694743797837842896, 0.7165291684546352021941915, 0.7186648297708199730232898, 0.7207937333408925681355609, 0.7229158591463558692887801, 0.7250311872324454059827217, 0.7271396977083169940167956, 0.7292413707472337729927181, 0.7313361865867526410034676, 0.7334241255289100847554419, 0.7355051679404074033764222, 0.7375792942527953241676460, 0.7396464849626580085640129, 0.7417067206317964465721772, 0.7437599818874112379620360, 0.7458062494222847584928838, 0.7478455039949627094612890, 0.7498777264299350488635483, 0.7519028976178163024713854, 0.7539209985155252531253957, 0.7559320101464640065565832, 0.7579359136006964320521972, 0.7599326900351259762879594, 0.7619223206736728486546595, 0.7639047868074505764130149, 0.7658800697949419280166093, 0.7678481510621742029486694, 0.7698090121028938864243967, 0.7717626344787406673165402, 0.7737089998194208176678866, 0.7756480898228799321603470, 0.7775798862554750259163361, 0.7795043709521459890141759, 0.7814215258165863961053031, 0.7833313328214136695271245, 0.7852337740083385943114429, 0.7871288314883341834944720, 0.7890164874418038921405657, 0.7908967241187491784979139, 0.7927695238389364107105941, 0.7946348689920631175175217, 0.7964927420379235813750136, 0.7983431255065737724458586, 0.8001860019984956219039900, 0.8020213541847606330100649, 0.8038491648071928284194859, 0.8056694166785310321906380, 0.8074820926825904849673728, 0.8092871757744237908160400, 0.8110846489804811942036542, 0.8128744953987701856100790, 0.8146566981990144342734272, 0.8164312406228120465742028, 0.8181981059837931485700490, 0.8199572776677767911993239, 0.8217087391329271766780945, 0.8234524739099092046215225, 0.8251884656020433364270094, 0.8269166978854597764628854, 0.8286371545092519686128428, 0.8303498192956294067327593, 0.8320546761400697575830038, 0.8337517090114702948057846, 0.8354409019522986425235764, 0.8371222390787428271411563, 0.8387957045808606359402829, 0.8404612827227282810625704, 0.8421189578425883674826439, 0.8437687143529971635802028, 0.8454105367409711729261812, 0.8470444095681330059047621, 0.8486703174708565497995875, 0.8502882451604114359791023, 0.8518981774231068028225812, 0.8535000991204343530350070, 0.8550939951892107040056078, 0.8566798506417190298715048, 0.8582576505658499939545848, 0.8598273801252419702463831, 0.8613890245594205526224495, 0.8629425691839373504743648, 0.8644879993905080694542896, 0.8660253006471498760336444, 0.8675544584983180445842596, 0.8690754585650418856970762, 0.8705882865450599544602407, 0.8720929282129545374252050, 0.8735893694202854169962281, 0.8750775960957229119854680, 0.8765575942451801930826613, 0.8780293499519448719952049, 0.8794928493768098630212838, 0.8809480787582035158255322, 0.8823950244123190181935674, 0.8838336727332430675485994, 0.8852640101930838100201983, 0.8866860233420980458621863, 0.8880996988088177000235219, 0.8895050233001755566829532, 0.8909019836016302565651375, 0.8922905665772905558628607, 0.8936707591700388455969280, 0.8950425484016539302522575, 0.8964059213729330645356690, 0.8977608652638132471078410, 0.8991073673334917701488930, 0.9004454149205460236240486, 0.9017749954430525531228459, 0.9030960963987053701523781, 0.9044087053649335137720782, 0.9057128099990178624646022, 0.9070083980382071951444166, 0.9082954572998335002127549, 0.9095739756814265315746820, 0.9108439411608276105410847, 0.9121053417963026725455006, 0.9133581657266545576127977, 0.9146024011713345435238301, 0.9158380364305531206273175, 0.9170650598853900072573273, 0.9182834599979034047218800, 0.9194932253112384908353520, 0.9206943444497351509745089, 0.9218868061190349456451742, 0.9230705991061873135537215, 0.9242457122797550091847637, 0.9254121345899187738936182, 0.9265698550685812395293315, 0.9277188628294700636112689, 0.9288591470682402950895005, 0.9299906970625759697264543, 0.9311135021722909341445515, 0.9322275518394288975917975, 0.9333328355883627104845635, 0.9344293430258928687940732, 0.9355170638413452433503852, 0.9365959878066680331449597, 0.9376661047765279417201973, 0.9387274046884055757416456, 0.9397798775626900648558921, 0.9408235135027729019444869, 0.9418583026951410028915762, 0.9428842354094689849902736, 0.9439013019987106631201510, 0.9449094928991897628355911, 0.9459087986306898495121205, 0.9468992097965434727052183, 0.9478807170837205248834878, 0.9488533112629158137054760, 0.9498169831886358470168335, 0.9507717237992848297519245, 0.9517175241172498719314184, 0.9526543752489854069548347, 0.9535822683850968193944507, 0.9545011948004232815044368, 0.9554111458541197976665483, 0.9563121129897384560011695, 0.9572040877353088863799924, 0.9580870617034179240840996, 0.9589610265912884783587268, 0.9598259741808576051234879, 0.9606818963388537831043733, 0.9615287850168733926613630, 0.9623666322514563965930439, 0.9631954301641612222071790, 0.9640151709616388439537466, 0.9648258469357060659245549, 0.9656274504634180035311332, 0.9664199740071397636802195, 0.9672034101146173227737943, 0.9679777514190476018682591, 0.9687429906391477383350273, 0.9694991205792235533724866, 0.9702461341292372147270016, 0.9709840242648740939883669, 0.9717127840476088178328839, 0.9724324066247705125950353, 0.9731428852296072415565604, 0.9738442131813496343496072, 0.9745363838852737078785517, 0.9752193908327628781730396, 0.9758932276013691625928266, 0.9765578878548735718130775, 0.9772133653433456910269459, 0.9778596539032024498104955, 0.9784967474572660801033674, 0.9791246400148212617670490, 0.9797433256716714551911835, 0.9803527986101944204270933, 0.9809530530993969223366037, 0.9815440834949686212533729, 0.9821258842393351486632952, 0.9826984498617103674201996, 0.9832617749781478160230522, 0.9838158542915913364912672, 0.9843606825919248853856025, 0.9848962547560215275335618, 0.9854225657477916120303537, 0.9859396106182301300994116, 0.9864473845054632544104222, 0.9869458826347940594679517, 0.9874351003187474227003598, 0.9879150329571141058970610, 0.9883856760369940166627304, 0.9888470251328386495802522, 0.9892990759064927068006818, 0.9897418241072348978090276, 0.9901752655718179181502248, 0.9905993962245076069415402, 0.9910142120771212830473891, 0.9914197092290652598522332, 0.9918158838673715386394944, 0.9922027322667336806727008, 0.9925802507895418581838653, 0.9929484358859170846092543, 0.9933072840937446245820355, 0.9936567920387065844051246, 0.9939969564343136839997662, 0.9943277740819362116746914, 0.9946492418708341635125525, 0.9949613567781865697596566, 0.9952641158691200113800912, 0.9955575162967363309635588, 0.9958415553021395435525955, 0.9961162302144619548145649, 0.9963815384508894965215124, 0.9966374775166862927999356, 0.9968840450052184754903082, 0.9971212385979772738362093, 0.9973490560646014135491635, 0.9975674952628988745188845, 0.9977765541388680773265018, 0.9979762307267185998745420, 0.9981665231488915727109186, 0.9983474296160799746514418, 0.9985189484272491654281575, 0.9986810779696581776171579, 0.9988338167188825964389443, 0.9989771632388403756649803, 0.9991111161818228462260355, 0.9992356742885348165163858, 0.9993508363881507486653971, 0.9994566013984000492749057, 0.9995529683257070064969677, 0.9996399362654382464576482, 0.9997175044023747284307007, 0.9997856720116889628341744, 0.9998444384611711916084367, 0.9998938032169419878731474, 0.9999337658606177711221103, 0.9999643261538894550943330, 0.9999854843850284447675914, 0.9999972450545584403516182}; static double w1024[512] = {0.0030664603092439082115513, 0.0030664314747171934849726, 0.0030663738059349007324470, 0.0030662873034393008056861, 0.0030661719680437936084028, 0.0030660278008329004477528, 0.0030658548031622538363679, 0.0030656529766585847450783, 0.0030654223232197073064431, 0.0030651628450145009692318, 0.0030648745444828901040266, 0.0030645574243358210601357, 0.0030642114875552366740338, 0.0030638367373940482295700, 0.0030634331773761048702058, 0.0030630008112961604635720, 0.0030625396432198379186545, 0.0030620496774835909559465, 0.0030615309186946633309249, 0.0030609833717310455112352, 0.0030604070417414288079918, 0.0030598019341451569616257, 0.0030591680546321751827342, 0.0030585054091629766484119, 0.0030578140039685464545661, 0.0030570938455503030247440, 0.0030563449406800369760227, 0.0030555672963998474425352, 0.0030547609200220758572342, 0.0030539258191292371925135, 0.0030530620015739486603347, 0.0030521694754788558725307, 0.0030512482492365564619779, 0.0030502983315095211653578, 0.0030493197312300123682482, 0.0030483124576000001133114, 0.0030472765200910755723677, 0.0030462119284443619831693, 0.0030451186926704230517109, 0.0030439968230491688209395, 0.0030428463301297590067471, 0.0030416672247305038021562, 0.0030404595179387621506312, 0.0030392232211108374894710, 0.0030379583458718709642643, 0.0030366649041157321154111, 0.0030353429080049070377385, 0.0030339923699703840142628, 0.0030326133027115366251721, 0.0030312057191960043331307, 0.0030297696326595705460252, 0.0030283050566060381583022, 0.0030268120048071025720655, 0.0030252904913022221991274, 0.0030237405303984864452325, 0.0030221621366704811776946, 0.0030205553249601516777118, 0.0030189201103766630786495, 0.0030172565082962582916016, 0.0030155645343621134195681, 0.0030138442044841906616068, 0.0030120955348390887083441, 0.0030103185418698906302495, 0.0030085132422860092601062, 0.0030066796530630300711306, 0.0030048177914425515522176, 0.0030029276749320230818149, 0.0030010093213045803019478, 0.0029990627485988779939449, 0.0029970879751189204574353, 0.0029950850194338893942123, 0.0029930539003779692985814, 0.0029909946370501703558363, 0.0029889072488141488505262, 0.0029867917552980250862041, 0.0029846481763941988183689, 0.0029824765322591622023349, 0.0029802768433133102577897, 0.0029780491302407488518214, 0.0029757934139891002022209, 0.0029735097157693059028890, 0.0029711980570554274731990, 0.0029688584595844444331918, 0.0029664909453560499065010, 0.0029640955366324437529314, 0.0029616722559381232326340, 0.0029592211260596712038487, 0.0029567421700455418562030, 0.0029542354112058439815854, 0.0029517008731121217846274, 0.0029491385795971332348581, 0.0029465485547546259626151, 0.0029439308229391107008170, 0.0029412854087656322747309, 0.0029386123371095381418860, 0.0029359116331062444843108, 0.0029331833221509998552933, 0.0029304274298986463828860, 0.0029276439822633785324025, 0.0029248330054184994301727, 0.0029219945257961747508486, 0.0029191285700871841705750, 0.0029162351652406703883623, 0.0029133143384638857180205, 0.0029103661172219362530391, 0.0029073905292375236068160, 0.0029043876024906842306667, 0.0029013573652185263120627, 0.0028982998459149642555740, 0.0028952150733304507490135, 0.0028921030764717064173001, 0.0028889638846014470665859, 0.0028857975272381085212091, 0.0028826040341555690560623, 0.0028793834353828694269858, 0.0028761357612039305018167, 0.0028728610421572684947521, 0.0028695593090357078067012, 0.0028662305928860914743281, 0.0028628749250089892305081, 0.0028594923369584031789413, 0.0028560828605414710856927, 0.0028526465278181672904478, 0.0028491833711010012402964, 0.0028456934229547136488796, 0.0028421767161959702837564, 0.0028386332838930533848701, 0.0028350631593655507170153, 0.0028314663761840422592303, 0.0028278429681697845340603, 0.0028241929693943925796601, 0.0028205164141795195677262, 0.0028168133370965340702726, 0.0028130837729661949782821, 0.0028093277568583240752928, 0.0028055453240914762689974, 0.0028017365102326074839556, 0.0027979013510967402185435, 0.0027940398827466267692845, 0.0027901521414924101257281, 0.0027862381638912825390663, 0.0027822979867471417676962, 0.0027783316471102450029635, 0.0027743391822768604783394, 0.0027703206297889167653083, 0.0027662760274336497592617, 0.0027622054132432473587211, 0.0027581088254944918412282, 0.0027539863027083999392661, 0.0027498378836498606195970, 0.0027456636073272705694208, 0.0027414635129921673927833, 0.0027372376401388605206822, 0.0027329860285040598383428, 0.0027287087180665020331547, 0.0027244057490465746667821, 0.0027200771619059379749851, 0.0027157229973471443987056, 0.0027113432963132558499974, 0.0027069380999874587163979, 0.0027025074497926766073634, 0.0026980513873911808464073, 0.0026935699546841987126055, 0.0026890631938115194351518, 0.0026845311471510979446691, 0.0026799738573186563850015, 0.0026753913671672833892344, 0.0026707837197870311237119, 0.0026661509585045101038391, 0.0026614931268824817854798, 0.0026568102687194489357814, 0.0026521024280492437872770, 0.0026473696491406139791397, 0.0026426119764968062894804, 0.0026378294548551481626046, 0.0026330221291866270351630, 0.0026281900446954674651512, 0.0026233332468187060677353, 0.0026184517812257642618999, 0.0026135456938180188319369, 0.0026086150307283703078113, 0.0026036598383208091684657, 0.0025986801631899798721388, 0.0025936760521607427178014, 0.0025886475522877335418257, 0.0025835947108549212540321, 0.0025785175753751632172710, 0.0025734161935897584747222, 0.0025682906134679988291122, 0.0025631408832067177780710, 0.0025579670512298373098703, 0.0025527691661879125638030, 0.0025475472769576743594882, 0.0025423014326415695994010, 0.0025370316825672995489502, 0.0025317380762873559984451, 0.0025264206635785553113127, 0.0025210794944415703629476, 0.0025157146191004603745948, 0.0025103260880021986466869, 0.0025049139518161981960773, 0.0024994782614338353016280, 0.0024940190679679709626349, 0.0024885364227524702745874, 0.0024830303773417197267843, 0.0024775009835101424263432, 0.0024719482932517112531633, 0.0024663723587794599504176, 0.0024607732325249921551741, 0.0024551509671379883737605, 0.0024495056154857109065099, 0.0024438372306525067265426, 0.0024381458659393083172574, 0.0024324315748631324732279, 0.0024266944111565770692147, 0.0024209344287673158020275, 0.0024151516818575909099866, 0.0024093462248037038747545, 0.0024035181121955041103265, 0.0023976673988358756439882, 0.0023917941397402217940673, 0.0023858983901359478493246, 0.0023799802054619417548485, 0.0023740396413680528093376, 0.0023680767537145683786720, 0.0023620915985716886306938, 0.0023560842322189992961374, 0.0023500547111449424606655, 0.0023440030920462853929883, 0.0023379294318275874140606, 0.0023318337876006648123684, 0.0023257162166840538103394, 0.0023195767766024715869239, 0.0023134155250862753614165, 0.0023072325200709195436049, 0.0023010278196964109553481, 0.0022948014823067621287099, 0.0022885535664494426857857, 0.0022822841308748288053830, 0.0022759932345356507817318, 0.0022696809365864386804193, 0.0022633472963829660967620, 0.0022569923734816920218464, 0.0022506162276392008214839, 0.0022442189188116403333494, 0.0022378005071541580875846, 0.0022313610530203356561684, 0.0022249006169616211363732, 0.0022184192597267597736437, 0.0022119170422612227292520, 0.0022053940257066339981005, 0.0021988502714001954820607, 0.0021922858408741102242558, 0.0021857007958550038097087, 0.0021790951982633439377969, 0.0021724691102128581719720, 0.0021658225940099498722195, 0.0021591557121531123157498, 0.0021524685273323410114303, 0.0021457611024285442134846, 0.0021390335005129516400021, 0.0021322857848465214018174, 0.0021255180188793451473363, 0.0021187302662500514289029, 0.0021119225907852072963166, 0.0021050950564987181231273, 0.0020982477275912256713511, 0.0020913806684495044002679, 0.0020844939436458560249764, 0.0020775876179375023304007, 0.0020706617562659762464561, 0.0020637164237565111901030, 0.0020567516857174286800274, 0.0020497676076395242297101, 0.0020427642551954515246552, 0.0020357416942391048895728, 0.0020286999908050000513193, 0.0020216392111076532034194, 0.0020145594215409583780096, 0.0020074606886775631310555, 0.0020003430792682425467160, 0.0019932066602412715667394, 0.0019860514987017956507927, 0.0019788776619311997736447, 0.0019716852173864757651327, 0.0019644742326995879988655, 0.0019572447756768374356240, 0.0019499969142982240274419, 0.0019427307167168074883601, 0.0019354462512580664378677, 0.0019281435864192559230531, 0.0019208227908687633255086, 0.0019134839334454626590447, 0.0019061270831580672642844, 0.0018987523091844809062265, 0.0018913596808711472808775, 0.0018839492677323979370705, 0.0018765211394497986196010, 0.0018690753658714940398285, 0.0018616120170115510799024, 0.0018541311630493004367905, 0.0018466328743286767122991, 0.0018391172213575569552912, 0.0018315842748070976623218, 0.0018240341055110702429247, 0.0018164667844651949558009, 0.0018088823828264733221690, 0.0018012809719125190225581, 0.0017936626232008872833327, 0.0017860274083284027592567, 0.0017783753990904859184165, 0.0017707066674404779358362, 0.0017630212854889641021349, 0.0017553193255030957535871, 0.0017476008599059107299616, 0.0017398659612756523665312, 0.0017321147023450870266539, 0.0017243471560008201813452, 0.0017165633952826110422716, 0.0017087634933826857546100, 0.0017009475236450491562317, 0.0016931155595647951096823, 0.0016852676747874154134422, 0.0016774039431081072989678, 0.0016695244384710795200224, 0.0016616292349688570408253, 0.0016537184068415843295541, 0.0016457920284763272637533, 0.0016378501744063736542136, 0.0016298929193105323938983, 0.0016219203380124312385075, 0.0016139325054798132252838, 0.0016059294968238317366751, 0.0015979113872983442154825, 0.0015898782522992045381361, 0.0015818301673635540527516, 0.0015737672081691112886347, 0.0015656894505334603439125, 0.0015575969704133379579831, 0.0015494898439039192754876, 0.0015413681472381023085203, 0.0015332319567857911038062, 0.0015250813490531776215856, 0.0015169164006820223329593, 0.0015087371884489335424584, 0.0015005437892646454426166, 0.0014923362801732949073323, 0.0014841147383516970308228, 0.0014758792411086194189814, 0.0014676298658840552399621, 0.0014593666902484950408286, 0.0014510897919021973371136, 0.0014427992486744579821480, 0.0014344951385228783230315, 0.0014261775395326321501237, 0.0014178465299157314469528, 0.0014095021880102909474427, 0.0014011445922797915073771, 0.0013927738213123422970256, 0.0013843899538199418218713, 0.0013759930686377377783877, 0.0013675832447232857518263, 0.0013591605611558067629844, 0.0013507250971354436709363, 0.0013422769319825164387192, 0.0013338161451367762689788, 0.0013253428161566586165863, 0.0013168570247185350852537, 0.0013083588506159642151809, 0.0012998483737589411687807, 0.0012913256741731463215379, 0.0012827908319991927650686, 0.0012742439274918727294554, 0.0012656850410194029319476, 0.0012571142530626688591208, 0.0012485316442144679896043, 0.0012399372951787519644928, 0.0012313312867698677125706, 0.0012227136999117975374834, 0.0012140846156373981740056, 0.0012054441150876388205601, 0.0011967922795108381551550, 0.0011881291902619003419159, 0.0011794549288015500353964, 0.0011707695766955663898644, 0.0011620732156140160807669, 0.0011533659273304853455891, 0.0011446477937213110513287, 0.0011359188967648107958214, 0.0011271793185405120501566, 0.0011184291412283803494364, 0.0011096684471080465391373, 0.0011008973185580330843445, 0.0010921158380549794491381, 0.0010833240881728665534171, 0.0010745221515822403144596, 0.0010657101110494342805238, 0.0010568880494357913638046, 0.0010480560496968846800697, 0.0010392141948817375023057, 0.0010303625681320423357186, 0.0010215012526813791214350, 0.0010126303318544325762649, 0.0010037498890662086758941, 0.0009948600078212502888805, 0.0009859607717128519688418, 0.0009770522644222739122264, 0.0009681345697179550890732, 0.0009592077714547255541688, 0.0009502719535730179460261, 0.0009413272000980781811114, 0.0009323735951391753507612, 0.0009234112228888108282347, 0.0009144401676219265933610, 0.0009054605136951127822476, 0.0008964723455458144695262, 0.0008874757476915376906225, 0.0008784708047290547115472, 0.0008694576013336085537138, 0.0008604362222581167813022, 0.0008514067523323745586954, 0.0008423692764622569855308, 0.0008333238796289207169173, 0.0008242706468880048763834, 0.0008152096633688312691343, 0.0008061410142736039032099, 0.0007970647848766078261514, 0.0007879810605234072847989, 0.0007788899266300432158601, 0.0007697914686822300749096, 0.0007606857722345520114971, 0.0007515729229096583980656, 0.0007424530063974587204051, 0.0007333261084543168373926, 0.0007241923149022446178008, 0.0007150517116280949619884, 0.0007059043845827542163241, 0.0006967504197803339882351, 0.0006875899032973623698204, 0.0006784229212719745780188, 0.0006692495599031030193850, 0.0006600699054496667875923, 0.0006508840442297606018626, 0.0006416920626198431946113, 0.0006324940470539251567018, 0.0006232900840227562488244, 0.0006140802600730121876541, 0.0006048646618064809156059, 0.0005956433758792483631993, 0.0005864164890008837132649, 0.0005771840879336241764943, 0.0005679462594915592881427, 0.0005587030905398147360662, 0.0005494546679937357307118, 0.0005402010788180699282026, 0.0005309424100261499182844, 0.0005216787486790752896494, 0.0005124101818848942860548, 0.0005031367967977850677401, 0.0004938586806172365939677, 0.0004845759205872291441124, 0.0004752886039954144966810, 0.0004659968181722957880391, 0.0004567006504904070755681, 0.0004474001883634926336095, 0.0004380955192456860150653, 0.0004287867306306889171352, 0.0004194739100509498966958, 0.0004101571450768429896514, 0.0004008365233158462997325, 0.0003915121324117206363681, 0.0003821840600436882993131, 0.0003728523939256121308821, 0.0003635172218051749865499, 0.0003541786314630598135175, 0.0003448367107121305776064, 0.0003354915473966143456333, 0.0003261432293912849189248, 0.0003167918446006485317858, 0.0003074374809581322877037, 0.0002980802264252762217455, 0.0002887201689909301727620, 0.0002793573966704570567274, 0.0002699919975049447012834, 0.0002606240595604292032823, 0.0002512536709271339139118, 0.0002418809197187298044384, 0.0002325058940716253739001, 0.0002231286821442978268308, 0.0002137493721166826096154, 0.0002043680521896465790359, 0.0001949848105845827899210, 0.0001855997355431850062940, 0.0001762129153274925249194, 0.0001668244382203495280013, 0.0001574343925265138930609, 0.0001480428665748079976500, 0.0001386499487219861751244, 0.0001292557273595155266326, 0.0001198602909254695827354, 0.0001104637279257437565603, 0.0001010661269730276014588, 0.0000916675768613669107254, 0.0000822681667164572752810, 0.0000728679863190274661367, 0.0000634671268598044229933, 0.0000540656828939400071988, 0.0000446637581285753393838, 0.0000352614859871986975067, 0.0000258591246764618586716, 0.0000164577275798968681068, 0.0000070700764101825898713}; /* n = 3 */ static double x3[2] = {0.0000000000000000000000000, 0.7745966692414833770358531}; static double w3[2] = {0.8888888888888888888888889, 0.5555555555555555555555556}; /* n = 5 */ static double x5[3] = {0.0000000000000000000000000, 0.5384693101056830910363144, 0.9061798459386639927976269}; static double w5[3] = {0.5688888888888888888888889, 0.4786286704993664680412915, 0.2369268850561890875142640}; /* n = 7 */ static double x7[4] = {0.0000000000000000000000000, 0.4058451513773971669066064, 0.7415311855993944398638648, 0.9491079123427585245261897}; static double w7[4] = {0.4179591836734693877551020, 0.3818300505051189449503698, 0.2797053914892766679014678, 0.1294849661688696932706114}; /* n = 9 */ static double x9[5] = {0.0000000000000000000000000, 0.3242534234038089290385380, 0.6133714327005903973087020, 0.8360311073266357942994298, 0.9681602395076260898355762}; static double w9[5] = {0.3302393550012597631645251, 0.3123470770400028400686304, 0.2606106964029354623187429, 0.1806481606948574040584720, 0.0812743883615744119718922}; /* n = 11 */ static double x11[6] = {0.0000000000000000000000000, 0.2695431559523449723315320, 0.5190961292068118159257257, 0.7301520055740493240934163, 0.8870625997680952990751578, 0.9782286581460569928039380}; static double w11[6] = {0.2729250867779006307144835, 0.2628045445102466621806889, 0.2331937645919904799185237, 0.1862902109277342514260976, 0.1255803694649046246346943, 0.0556685671161736664827537}; /* n = 13 */ static double x13[7] = {0.0000000000000000000000000, 0.2304583159551347940655281, 0.4484927510364468528779129, 0.6423493394403402206439846, 0.8015780907333099127942065, 0.9175983992229779652065478, 0.9841830547185881494728294}; static double w13[7] = {0.2325515532308739101945895, 0.2262831802628972384120902, 0.2078160475368885023125232, 0.1781459807619457382800467, 0.1388735102197872384636018, 0.0921214998377284479144218, 0.0404840047653158795200216}; /* n = 15 */ static double x15[8] = {0.0000000000000000000000000, 0.2011940939974345223006283, 0.3941513470775633698972074, 0.5709721726085388475372267, 0.7244177313601700474161861, 0.8482065834104272162006483, 0.9372733924007059043077589, 0.9879925180204854284895657}; static double w15[8] = {0.2025782419255612728806202, 0.1984314853271115764561183, 0.1861610000155622110268006, 0.1662692058169939335532009, 0.1395706779261543144478048, 0.1071592204671719350118695, 0.0703660474881081247092674, 0.0307532419961172683546284}; /* n = 17 */ static double x17[9] = {0.0000000000000000000000000, 0.1784841814958478558506775, 0.3512317634538763152971855, 0.5126905370864769678862466, 0.6576711592166907658503022, 0.7815140038968014069252301, 0.8802391537269859021229557, 0.9506755217687677612227170, 0.9905754753144173356754340}; static double w17[9] = {0.1794464703562065254582656, 0.1765627053669926463252710, 0.1680041021564500445099707, 0.1540457610768102880814316, 0.1351363684685254732863200, 0.1118838471934039710947884, 0.0850361483171791808835354, 0.0554595293739872011294402, 0.0241483028685479319601100}; /* n = 19 */ static double x19[10] = {0.0000000000000000000000000, 0.1603586456402253758680961, 0.3165640999636298319901173, 0.4645707413759609457172671, 0.6005453046616810234696382, 0.7209661773352293786170959, 0.8227146565371428249789225, 0.9031559036148179016426609, 0.9602081521348300308527788, 0.9924068438435844031890177}; static double w19[10] = {0.1610544498487836959791636, 0.1589688433939543476499564, 0.1527660420658596667788554, 0.1426067021736066117757461, 0.1287539625393362276755158, 0.1115666455473339947160239, 0.0914900216224499994644621, 0.0690445427376412265807083, 0.0448142267656996003328382, 0.0194617882297264770363120}; /* Merge all together */ static gsl_integration_glfixed_table glaw[] = { { 2, x2, w2, 1 /* precomputed */ }, { 3, x3, w3, 1 }, { 4, x4, w4, 1 }, { 5, x5, w5, 1 }, { 6, x6, w6, 1 }, { 7, x7, w7, 1 }, { 8, x8, w8, 1 }, { 9, x9, w9, 1 }, { 10, x10, w10, 1 }, { 11, x11, w11, 1 }, { 12, x12, w12, 1 }, { 13, x13, w13, 1 }, { 14, x14, w14, 1 }, { 15, x15, w15, 1 }, { 16, x16, w16, 1 }, { 17, x17, w17, 1 }, { 18, x18, w18, 1 }, { 19, x19, w19, 1 }, { 20, x20, w20, 1 }, { 32, x32, w32, 1 }, { 64, x64, w64, 1 }, { 96, x96, w96, 1 }, { 100, x100, w100, 1 }, { 128, x128, w128, 1 }, { 256, x256, w256, 1 }, { 512, x512, w512, 1 }, { 1024, x1024, w1024, 1 } }; static const size_t GLAWSIZE = sizeof(glaw)/sizeof(glaw[0]); gsl_integration_glfixed_table * gsl_integration_glfixed_table_alloc (size_t n) { int i; double *x = 0; double *w = 0; gsl_integration_glfixed_table * retval = 0; /* Kludgy error check: indices in the original algorithm use ints but GSL * conventions are to take a size_t parameter for n */ if (n > INT_MAX) { GSL_ERROR_NULL ("Requested n is too large", GSL_EINVAL); } /* Use a predefined table of size n if possible */ for (i = 0; i < GLAWSIZE;i++) { if (n == glaw[i].n) { retval = &glaw[i]; break; } } /* No predefined table is available. Generate one on the fly. */ if (retval == 0) { const int m = (n + 1) >> 1; x = (double *) malloc(m * sizeof(double)); if (x == 0) { GSL_ERROR_NULL ("failed to allocate space for abscissae", GSL_ENOMEM); } w = (double *) malloc(m * sizeof(double)); if (w == 0) { free(x); GSL_ERROR_NULL ("failed to allocate space for weights", GSL_ENOMEM); } retval = (gsl_integration_glfixed_table *) malloc(sizeof(gsl_integration_glfixed_table)); if (retval == 0) { free(x); free(w); GSL_ERROR_NULL ("failed to allocate space for table struct", GSL_ENOMEM); } gauss_legendre_tbl(n, x, w, 1e-10 /* precision magic number */); retval->n = n; retval->x = x; retval->w = w; retval->precomputed = 0; } return retval; } void gsl_integration_glfixed_table_free (gsl_integration_glfixed_table * t) { /* We only free the table memory if we allocated it */ /* Leave precomputed, static tables alone */ if (! t->precomputed) { free(t->x); free(t->w); free(t); } } /* Gauss-Legendre n-points quadrature, exact for polynomial of degree <=2n-1 1. n - even: int(f(t),t=a..b) = A*sum(w[i]*f(A*x[i]+B),i=0..n-1) = A*sum(w[k]*[f(B+A*x[k])+f(B-A*x[k])],k=0..n/2-1) A = (b-a)/2, B = (a+b)/2 2. n - odd: int(f(t),t=a..b) = A*sum(w[i]*f(A*x[i]+B),i=0..n-1) = A*w[0]*f(B)+A*sum(w[k]*[f(B+A*x[k])+f(B-A*x[k])],k=1..(n-1)/2) A = (b-a)/2, B = (a+b)/2 */ double gsl_integration_glfixed (const gsl_function *f, double a, double b, const gsl_integration_glfixed_table * t) { const double * const x = t->x; const double * const w = t->w; const int n = t->n; double A, B, Ax, s; int i, m; m = (n + 1) >> 1; A = 0.5 * (b - a); B = 0.5 * (b + a); if (n&1) /* n - odd */ { s = w[0] * GSL_FN_EVAL(f,B); for (i = 1;i < m;i++) { Ax = A * x[i]; s += w[i] * (GSL_FN_EVAL(f,B+Ax) + GSL_FN_EVAL(f,B-Ax)); } } else /* n - even */ { s = 0.0; for (i = 0;i < m;i++) { Ax = A * x[i]; s += w[i] * (GSL_FN_EVAL(f,B+Ax) + GSL_FN_EVAL(f,B-Ax)); } } return A*s; } /* Routine to retrieve the i-th Gauss-Legendre point and weight from t. Useful when the caller wishes to access the information stored in the high-precision gsl_integration_glfixed_table struct. Points are indexed and presented in increasing order to the caller. */ int gsl_integration_glfixed_point (double a, double b, size_t i, double *xi, double *wi, const gsl_integration_glfixed_table * t) { const double A = (b - a) / 2; /* Length of [a,b] */ const double B = (a + b) / 2; /* Midpoint of [a,b] */ if (i >= t->n) { GSL_ERROR ("i must be less than t->n", GSL_EINVAL); } /* See comments above gsl_integration_glfixed for struct's x, w layout. */ /* Simply unpack that layout into a sorted set of points, weights. */ if (GSL_IS_ODD(t->n)) { const int k = ((int) i) - ((int) t->n) / 2; const int s = k < 0 ? -1 : 1; *xi = B + s*A*t->x[s*k]; *wi = A*t->w[s*k]; } else if (/* GSL_IS_EVEN(t->n) && */ i < t->n / 2) { i = (t->n / 2) - 1 - i; *xi = B - A*t->x[i]; *wi = A*t->w[i]; } else /* GSL_IS_EVEN(t->n) && i >= n / 2 */ { i -= t->n / 2; *xi = B + A*t->x[i]; *wi = A*t->w[i]; } return GSL_SUCCESS; } /* Computing of abscissas and weights for Gauss-Legendre quadrature for any(reasonable) order n [in] n - order of quadrature [in] eps - required precision (must be eps>=macheps(double), usually eps = 1e-10 is ok) [out]x - abscisass, size = (n+1)>>1 [out]w - weights, size = (n+1)>>1 */ /* Look up table for fast calculation of Legendre polynomial for n<1024 */ /* ltbl[k] = 1.0 - 1.0/(double)k; */ static double ltbl[1024] = {0.00000000000000000000, 0.00000000000000000000, 0.50000000000000000000, 0.66666666666666674000, 0.75000000000000000000, 0.80000000000000004000, 0.83333333333333337000, 0.85714285714285721000, 0.87500000000000000000, 0.88888888888888884000, 0.90000000000000002000, 0.90909090909090906000, 0.91666666666666663000, 0.92307692307692313000, 0.92857142857142860000, 0.93333333333333335000, 0.93750000000000000000, 0.94117647058823528000, 0.94444444444444442000, 0.94736842105263164000, 0.94999999999999996000, 0.95238095238095233000, 0.95454545454545459000, 0.95652173913043481000, 0.95833333333333337000, 0.95999999999999996000, 0.96153846153846156000, 0.96296296296296302000, 0.96428571428571430000, 0.96551724137931039000, 0.96666666666666667000, 0.96774193548387100000, 0.96875000000000000000, 0.96969696969696972000, 0.97058823529411764000, 0.97142857142857142000, 0.97222222222222221000, 0.97297297297297303000, 0.97368421052631582000, 0.97435897435897434000, 0.97499999999999998000, 0.97560975609756095000, 0.97619047619047616000, 0.97674418604651159000, 0.97727272727272729000, 0.97777777777777775000, 0.97826086956521741000, 0.97872340425531912000, 0.97916666666666663000, 0.97959183673469385000, 0.97999999999999998000, 0.98039215686274506000, 0.98076923076923073000, 0.98113207547169812000, 0.98148148148148151000, 0.98181818181818181000, 0.98214285714285710000, 0.98245614035087714000, 0.98275862068965514000, 0.98305084745762716000, 0.98333333333333328000, 0.98360655737704916000, 0.98387096774193550000, 0.98412698412698418000, 0.98437500000000000000, 0.98461538461538467000, 0.98484848484848486000, 0.98507462686567160000, 0.98529411764705888000, 0.98550724637681164000, 0.98571428571428577000, 0.98591549295774650000, 0.98611111111111116000, 0.98630136986301364000, 0.98648648648648651000, 0.98666666666666669000, 0.98684210526315785000, 0.98701298701298701000, 0.98717948717948723000, 0.98734177215189878000, 0.98750000000000004000, 0.98765432098765427000, 0.98780487804878048000, 0.98795180722891562000, 0.98809523809523814000, 0.98823529411764710000, 0.98837209302325579000, 0.98850574712643680000, 0.98863636363636365000, 0.98876404494382020000, 0.98888888888888893000, 0.98901098901098905000, 0.98913043478260865000, 0.98924731182795700000, 0.98936170212765961000, 0.98947368421052628000, 0.98958333333333337000, 0.98969072164948457000, 0.98979591836734693000, 0.98989898989898994000, 0.98999999999999999000, 0.99009900990099009000, 0.99019607843137258000, 0.99029126213592233000, 0.99038461538461542000, 0.99047619047619051000, 0.99056603773584906000, 0.99065420560747663000, 0.99074074074074070000, 0.99082568807339455000, 0.99090909090909096000, 0.99099099099099097000, 0.99107142857142860000, 0.99115044247787609000, 0.99122807017543857000, 0.99130434782608701000, 0.99137931034482762000, 0.99145299145299148000, 0.99152542372881358000, 0.99159663865546221000, 0.99166666666666670000, 0.99173553719008267000, 0.99180327868852458000, 0.99186991869918695000, 0.99193548387096775000, 0.99199999999999999000, 0.99206349206349209000, 0.99212598425196852000, 0.99218750000000000000, 0.99224806201550386000, 0.99230769230769234000, 0.99236641221374045000, 0.99242424242424243000, 0.99248120300751874000, 0.99253731343283580000, 0.99259259259259258000, 0.99264705882352944000, 0.99270072992700731000, 0.99275362318840576000, 0.99280575539568350000, 0.99285714285714288000, 0.99290780141843971000, 0.99295774647887325000, 0.99300699300699302000, 0.99305555555555558000, 0.99310344827586206000, 0.99315068493150682000, 0.99319727891156462000, 0.99324324324324320000, 0.99328859060402686000, 0.99333333333333329000, 0.99337748344370858000, 0.99342105263157898000, 0.99346405228758172000, 0.99350649350649356000, 0.99354838709677418000, 0.99358974358974361000, 0.99363057324840764000, 0.99367088607594933000, 0.99371069182389937000, 0.99375000000000002000, 0.99378881987577639000, 0.99382716049382713000, 0.99386503067484666000, 0.99390243902439024000, 0.99393939393939390000, 0.99397590361445787000, 0.99401197604790414000, 0.99404761904761907000, 0.99408284023668636000, 0.99411764705882355000, 0.99415204678362579000, 0.99418604651162790000, 0.99421965317919070000, 0.99425287356321834000, 0.99428571428571433000, 0.99431818181818177000, 0.99435028248587576000, 0.99438202247191010000, 0.99441340782122900000, 0.99444444444444446000, 0.99447513812154698000, 0.99450549450549453000, 0.99453551912568305000, 0.99456521739130432000, 0.99459459459459465000, 0.99462365591397850000, 0.99465240641711228000, 0.99468085106382975000, 0.99470899470899465000, 0.99473684210526314000, 0.99476439790575921000, 0.99479166666666663000, 0.99481865284974091000, 0.99484536082474229000, 0.99487179487179489000, 0.99489795918367352000, 0.99492385786802029000, 0.99494949494949492000, 0.99497487437185927000, 0.99500000000000000000, 0.99502487562189057000, 0.99504950495049505000, 0.99507389162561577000, 0.99509803921568629000, 0.99512195121951219000, 0.99514563106796117000, 0.99516908212560384000, 0.99519230769230771000, 0.99521531100478466000, 0.99523809523809526000, 0.99526066350710896000, 0.99528301886792447000, 0.99530516431924887000, 0.99532710280373837000, 0.99534883720930234000, 0.99537037037037035000, 0.99539170506912444000, 0.99541284403669728000, 0.99543378995433796000, 0.99545454545454548000, 0.99547511312217196000, 0.99549549549549554000, 0.99551569506726456000, 0.99553571428571430000, 0.99555555555555553000, 0.99557522123893805000, 0.99559471365638763000, 0.99561403508771928000, 0.99563318777292575000, 0.99565217391304350000, 0.99567099567099571000, 0.99568965517241381000, 0.99570815450643779000, 0.99572649572649574000, 0.99574468085106382000, 0.99576271186440679000, 0.99578059071729963000, 0.99579831932773111000, 0.99581589958159000000, 0.99583333333333335000, 0.99585062240663902000, 0.99586776859504134000, 0.99588477366255146000, 0.99590163934426235000, 0.99591836734693873000, 0.99593495934959353000, 0.99595141700404854000, 0.99596774193548387000, 0.99598393574297184000, 0.99600000000000000000, 0.99601593625498008000, 0.99603174603174605000, 0.99604743083003955000, 0.99606299212598426000, 0.99607843137254903000, 0.99609375000000000000, 0.99610894941634243000, 0.99612403100775193000, 0.99613899613899615000, 0.99615384615384617000, 0.99616858237547889000, 0.99618320610687028000, 0.99619771863117867000, 0.99621212121212122000, 0.99622641509433962000, 0.99624060150375937000, 0.99625468164794007000, 0.99626865671641796000, 0.99628252788104088000, 0.99629629629629635000, 0.99630996309963105000, 0.99632352941176472000, 0.99633699633699635000, 0.99635036496350360000, 0.99636363636363634000, 0.99637681159420288000, 0.99638989169675085000, 0.99640287769784175000, 0.99641577060931896000, 0.99642857142857144000, 0.99644128113879005000, 0.99645390070921991000, 0.99646643109540634000, 0.99647887323943662000, 0.99649122807017543000, 0.99650349650349646000, 0.99651567944250874000, 0.99652777777777779000, 0.99653979238754320000, 0.99655172413793103000, 0.99656357388316152000, 0.99657534246575341000, 0.99658703071672350000, 0.99659863945578231000, 0.99661016949152548000, 0.99662162162162160000, 0.99663299663299665000, 0.99664429530201337000, 0.99665551839464883000, 0.99666666666666670000, 0.99667774086378735000, 0.99668874172185429000, 0.99669966996699666000, 0.99671052631578949000, 0.99672131147540988000, 0.99673202614379086000, 0.99674267100977199000, 0.99675324675324672000, 0.99676375404530748000, 0.99677419354838714000, 0.99678456591639875000, 0.99679487179487181000, 0.99680511182108622000, 0.99681528662420382000, 0.99682539682539684000, 0.99683544303797467000, 0.99684542586750791000, 0.99685534591194969000, 0.99686520376175547000, 0.99687499999999996000, 0.99688473520249221000, 0.99689440993788825000, 0.99690402476780182000, 0.99691358024691357000, 0.99692307692307691000, 0.99693251533742333000, 0.99694189602446481000, 0.99695121951219512000, 0.99696048632218848000, 0.99696969696969695000, 0.99697885196374625000, 0.99698795180722888000, 0.99699699699699695000, 0.99700598802395213000, 0.99701492537313430000, 0.99702380952380953000, 0.99703264094955490000, 0.99704142011834318000, 0.99705014749262533000, 0.99705882352941178000, 0.99706744868035191000, 0.99707602339181289000, 0.99708454810495628000, 0.99709302325581395000, 0.99710144927536237000, 0.99710982658959535000, 0.99711815561959649000, 0.99712643678160917000, 0.99713467048710602000, 0.99714285714285711000, 0.99715099715099720000, 0.99715909090909094000, 0.99716713881019825000, 0.99717514124293782000, 0.99718309859154930000, 0.99719101123595510000, 0.99719887955182074000, 0.99720670391061450000, 0.99721448467966578000, 0.99722222222222223000, 0.99722991689750695000, 0.99723756906077343000, 0.99724517906336085000, 0.99725274725274726000, 0.99726027397260275000, 0.99726775956284153000, 0.99727520435967298000, 0.99728260869565222000, 0.99728997289972898000, 0.99729729729729732000, 0.99730458221024254000, 0.99731182795698925000, 0.99731903485254692000, 0.99732620320855614000, 0.99733333333333329000, 0.99734042553191493000, 0.99734748010610075000, 0.99735449735449733000, 0.99736147757255933000, 0.99736842105263157000, 0.99737532808398954000, 0.99738219895287961000, 0.99738903394255873000, 0.99739583333333337000, 0.99740259740259740000, 0.99740932642487046000, 0.99741602067183466000, 0.99742268041237114000, 0.99742930591259638000, 0.99743589743589745000, 0.99744245524296671000, 0.99744897959183676000, 0.99745547073791352000, 0.99746192893401020000, 0.99746835443037973000, 0.99747474747474751000, 0.99748110831234260000, 0.99748743718592969000, 0.99749373433583965000, 0.99750000000000005000, 0.99750623441396513000, 0.99751243781094523000, 0.99751861042183620000, 0.99752475247524752000, 0.99753086419753090000, 0.99753694581280783000, 0.99754299754299758000, 0.99754901960784315000, 0.99755501222493892000, 0.99756097560975610000, 0.99756690997566910000, 0.99757281553398058000, 0.99757869249394671000, 0.99758454106280192000, 0.99759036144578317000, 0.99759615384615385000, 0.99760191846522783000, 0.99760765550239239000, 0.99761336515513122000, 0.99761904761904763000, 0.99762470308788598000, 0.99763033175355453000, 0.99763593380614657000, 0.99764150943396224000, 0.99764705882352944000, 0.99765258215962438000, 0.99765807962529274000, 0.99766355140186913000, 0.99766899766899764000, 0.99767441860465111000, 0.99767981438515085000, 0.99768518518518523000, 0.99769053117782913000, 0.99769585253456217000, 0.99770114942528731000, 0.99770642201834858000, 0.99771167048054921000, 0.99771689497716898000, 0.99772209567198178000, 0.99772727272727268000, 0.99773242630385484000, 0.99773755656108598000, 0.99774266365688491000, 0.99774774774774777000, 0.99775280898876406000, 0.99775784753363228000, 0.99776286353467558000, 0.99776785714285710000, 0.99777282850779514000, 0.99777777777777776000, 0.99778270509977829000, 0.99778761061946908000, 0.99779249448123619000, 0.99779735682819382000, 0.99780219780219781000, 0.99780701754385970000, 0.99781181619256021000, 0.99781659388646293000, 0.99782135076252720000, 0.99782608695652175000, 0.99783080260303691000, 0.99783549783549785000, 0.99784017278617709000, 0.99784482758620685000, 0.99784946236559136000, 0.99785407725321884000, 0.99785867237687365000, 0.99786324786324787000, 0.99786780383795304000, 0.99787234042553197000, 0.99787685774946921000, 0.99788135593220340000, 0.99788583509513740000, 0.99789029535864981000, 0.99789473684210528000, 0.99789915966386555000, 0.99790356394129975000, 0.99790794979079500000, 0.99791231732776620000, 0.99791666666666667000, 0.99792099792099798000, 0.99792531120331951000, 0.99792960662525876000, 0.99793388429752061000, 0.99793814432989691000, 0.99794238683127567000, 0.99794661190965095000, 0.99795081967213117000, 0.99795501022494892000, 0.99795918367346936000, 0.99796334012219956000, 0.99796747967479671000, 0.99797160243407712000, 0.99797570850202433000, 0.99797979797979797000, 0.99798387096774188000, 0.99798792756539234000, 0.99799196787148592000, 0.99799599198396793000, 0.99800000000000000000, 0.99800399201596801000, 0.99800796812749004000, 0.99801192842942343000, 0.99801587301587302000, 0.99801980198019802000, 0.99802371541501977000, 0.99802761341222879000, 0.99803149606299213000, 0.99803536345776034000, 0.99803921568627452000, 0.99804305283757344000, 0.99804687500000000000, 0.99805068226120852000, 0.99805447470817121000, 0.99805825242718449000, 0.99806201550387597000, 0.99806576402321079000, 0.99806949806949807000, 0.99807321772639690000, 0.99807692307692308000, 0.99808061420345484000, 0.99808429118773945000, 0.99808795411089868000, 0.99809160305343514000, 0.99809523809523815000, 0.99809885931558939000, 0.99810246679316883000, 0.99810606060606055000, 0.99810964083175802000, 0.99811320754716981000, 0.99811676082862522000, 0.99812030075187974000, 0.99812382739212002000, 0.99812734082397003000, 0.99813084112149530000, 0.99813432835820892000, 0.99813780260707630000, 0.99814126394052050000, 0.99814471243042668000, 0.99814814814814812000, 0.99815157116451014000, 0.99815498154981552000, 0.99815837937384899000, 0.99816176470588236000, 0.99816513761467895000, 0.99816849816849818000, 0.99817184643510060000, 0.99817518248175185000, 0.99817850637522765000, 0.99818181818181817000, 0.99818511796733211000, 0.99818840579710144000, 0.99819168173598549000, 0.99819494584837543000, 0.99819819819819822000, 0.99820143884892087000, 0.99820466786355477000, 0.99820788530465954000, 0.99821109123434704000, 0.99821428571428572000, 0.99821746880570406000, 0.99822064056939497000, 0.99822380106571940000, 0.99822695035460995000, 0.99823008849557526000, 0.99823321554770317000, 0.99823633156966496000, 0.99823943661971826000, 0.99824253075571179000, 0.99824561403508771000, 0.99824868651488619000, 0.99825174825174823000, 0.99825479930191974000, 0.99825783972125437000, 0.99826086956521742000, 0.99826388888888884000, 0.99826689774696709000, 0.99826989619377160000, 0.99827288428324701000, 0.99827586206896557000, 0.99827882960413084000, 0.99828178694158076000, 0.99828473413379071000, 0.99828767123287676000, 0.99829059829059830000, 0.99829351535836175000, 0.99829642248722317000, 0.99829931972789121000, 0.99830220713073003000, 0.99830508474576274000, 0.99830795262267347000, 0.99831081081081086000, 0.99831365935919059000, 0.99831649831649827000, 0.99831932773109244000, 0.99832214765100669000, 0.99832495812395305000, 0.99832775919732442000, 0.99833055091819700000, 0.99833333333333329000, 0.99833610648918469000, 0.99833887043189373000, 0.99834162520729686000, 0.99834437086092720000, 0.99834710743801658000, 0.99834983498349839000, 0.99835255354200991000, 0.99835526315789469000, 0.99835796387520526000, 0.99836065573770494000, 0.99836333878887074000, 0.99836601307189543000, 0.99836867862969003000, 0.99837133550488599000, 0.99837398373983743000, 0.99837662337662336000, 0.99837925445705022000, 0.99838187702265369000, 0.99838449111470118000, 0.99838709677419357000, 0.99838969404186795000, 0.99839228295819937000, 0.99839486356340290000, 0.99839743589743590000, 0.99839999999999995000, 0.99840255591054317000, 0.99840510366826152000, 0.99840764331210186000, 0.99841017488076311000, 0.99841269841269842000, 0.99841521394611732000, 0.99841772151898733000, 0.99842022116903628000, 0.99842271293375395000, 0.99842519685039366000, 0.99842767295597479000, 0.99843014128728413000, 0.99843260188087779000, 0.99843505477308292000, 0.99843749999999998000, 0.99843993759750393000, 0.99844236760124616000, 0.99844479004665632000, 0.99844720496894412000, 0.99844961240310082000, 0.99845201238390091000, 0.99845440494590421000, 0.99845679012345678000, 0.99845916795069334000, 0.99846153846153851000, 0.99846390168970811000, 0.99846625766871167000, 0.99846860643185298000, 0.99847094801223246000, 0.99847328244274813000, 0.99847560975609762000, 0.99847792998477924000, 0.99848024316109418000, 0.99848254931714719000, 0.99848484848484853000, 0.99848714069591527000, 0.99848942598187307000, 0.99849170437405732000, 0.99849397590361444000, 0.99849624060150377000, 0.99849849849849848000, 0.99850074962518742000, 0.99850299401197606000, 0.99850523168908822000, 0.99850746268656720000, 0.99850968703427723000, 0.99851190476190477000, 0.99851411589895989000, 0.99851632047477745000, 0.99851851851851847000, 0.99852071005917165000, 0.99852289512555392000, 0.99852507374631272000, 0.99852724594992637000, 0.99852941176470589000, 0.99853157121879588000, 0.99853372434017595000, 0.99853587115666176000, 0.99853801169590639000, 0.99854014598540142000, 0.99854227405247808000, 0.99854439592430855000, 0.99854651162790697000, 0.99854862119013066000, 0.99855072463768113000, 0.99855282199710560000, 0.99855491329479773000, 0.99855699855699853000, 0.99855907780979825000, 0.99856115107913668000, 0.99856321839080464000, 0.99856527977044474000, 0.99856733524355301000, 0.99856938483547930000, 0.99857142857142855000, 0.99857346647646217000, 0.99857549857549854000, 0.99857752489331442000, 0.99857954545454541000, 0.99858156028368794000, 0.99858356940509918000, 0.99858557284299854000, 0.99858757062146897000, 0.99858956276445698000, 0.99859154929577465000, 0.99859353023909991000, 0.99859550561797750000, 0.99859747545582045000, 0.99859943977591037000, 0.99860139860139863000, 0.99860335195530725000, 0.99860529986053004000, 0.99860724233983289000, 0.99860917941585536000, 0.99861111111111112000, 0.99861303744798890000, 0.99861495844875348000, 0.99861687413554634000, 0.99861878453038677000, 0.99862068965517237000, 0.99862258953168048000, 0.99862448418156813000, 0.99862637362637363000, 0.99862825788751719000, 0.99863013698630132000, 0.99863201094391241000, 0.99863387978142082000, 0.99863574351978168000, 0.99863760217983655000, 0.99863945578231295000, 0.99864130434782605000, 0.99864314789687925000, 0.99864498644986455000, 0.99864682002706362000, 0.99864864864864866000, 0.99865047233468285000, 0.99865229110512133000, 0.99865410497981155000, 0.99865591397849462000, 0.99865771812080539000, 0.99865951742627346000, 0.99866131191432395000, 0.99866310160427807000, 0.99866488651535379000, 0.99866666666666670000, 0.99866844207723038000, 0.99867021276595747000, 0.99867197875166003000, 0.99867374005305043000, 0.99867549668874167000, 0.99867724867724872000, 0.99867899603698806000, 0.99868073878627972000, 0.99868247694334655000, 0.99868421052631584000, 0.99868593955321949000, 0.99868766404199472000, 0.99868938401048490000, 0.99869109947643975000, 0.99869281045751634000, 0.99869451697127942000, 0.99869621903520212000, 0.99869791666666663000, 0.99869960988296491000, 0.99870129870129876000, 0.99870298313878081000, 0.99870466321243523000, 0.99870633893919791000, 0.99870801033591727000, 0.99870967741935479000, 0.99871134020618557000, 0.99871299871299868000, 0.99871465295629824000, 0.99871630295250324000, 0.99871794871794872000, 0.99871959026888601000, 0.99872122762148341000, 0.99872286079182626000, 0.99872448979591832000, 0.99872611464968153000, 0.99872773536895676000, 0.99872935196950441000, 0.99873096446700504000, 0.99873257287705952000, 0.99873417721518987000, 0.99873577749683939000, 0.99873737373737370000, 0.99873896595208067000, 0.99874055415617125000, 0.99874213836477987000, 0.99874371859296485000, 0.99874529485570895000, 0.99874686716791983000, 0.99874843554443049000, 0.99875000000000003000, 0.99875156054931336000, 0.99875311720698257000, 0.99875466998754669000, 0.99875621890547261000, 0.99875776397515525000, 0.99875930521091816000, 0.99876084262701359000, 0.99876237623762376000, 0.99876390605686027000, 0.99876543209876545000, 0.99876695437731200000, 0.99876847290640391000, 0.99876998769987702000, 0.99877149877149873000, 0.99877300613496933000, 0.99877450980392157000, 0.99877600979192172000, 0.99877750611246940000, 0.99877899877899878000, 0.99878048780487805000, 0.99878197320341044000, 0.99878345498783450000, 0.99878493317132444000, 0.99878640776699024000, 0.99878787878787878000, 0.99878934624697335000, 0.99879081015719473000, 0.99879227053140096000, 0.99879372738238847000, 0.99879518072289153000, 0.99879663056558365000, 0.99879807692307687000, 0.99879951980792314000, 0.99880095923261392000, 0.99880239520958081000, 0.99880382775119614000, 0.99880525686977295000, 0.99880668257756566000, 0.99880810488676997000, 0.99880952380952381000, 0.99881093935790721000, 0.99881235154394299000, 0.99881376037959668000, 0.99881516587677721000, 0.99881656804733732000, 0.99881796690307334000, 0.99881936245572611000, 0.99882075471698117000, 0.99882214369846878000, 0.99882352941176467000, 0.99882491186839018000, 0.99882629107981225000, 0.99882766705744430000, 0.99882903981264637000, 0.99883040935672518000, 0.99883177570093462000, 0.99883313885647607000, 0.99883449883449882000, 0.99883585564610011000, 0.99883720930232556000, 0.99883855981416958000, 0.99883990719257543000, 0.99884125144843572000, 0.99884259259259256000, 0.99884393063583810000, 0.99884526558891451000, 0.99884659746251436000, 0.99884792626728114000, 0.99884925201380903000, 0.99885057471264371000, 0.99885189437428246000, 0.99885321100917435000, 0.99885452462772051000, 0.99885583524027455000, 0.99885714285714289000, 0.99885844748858443000, 0.99885974914481190000, 0.99886104783599083000, 0.99886234357224113000, 0.99886363636363640000, 0.99886492622020429000, 0.99886621315192747000, 0.99886749716874290000, 0.99886877828054299000, 0.99887005649717520000, 0.99887133182844245000, 0.99887260428410374000, 0.99887387387387383000, 0.99887514060742411000, 0.99887640449438198000, 0.99887766554433222000, 0.99887892376681620000, 0.99888017917133254000, 0.99888143176733779000, 0.99888268156424576000, 0.99888392857142860000, 0.99888517279821631000, 0.99888641425389757000, 0.99888765294771964000, 0.99888888888888894000, 0.99889012208657046000, 0.99889135254988914000, 0.99889258028792915000, 0.99889380530973448000, 0.99889502762430937000, 0.99889624724061810000, 0.99889746416758540000, 0.99889867841409696000, 0.99889988998899892000, 0.99890109890109891000, 0.99890230515916578000, 0.99890350877192979000, 0.99890470974808321000, 0.99890590809628010000, 0.99890710382513659000, 0.99890829694323147000, 0.99890948745910579000, 0.99891067538126366000, 0.99891186071817195000, 0.99891304347826082000, 0.99891422366992400000, 0.99891540130151846000, 0.99891657638136511000, 0.99891774891774887000, 0.99891891891891893000, 0.99892008639308860000, 0.99892125134843579000, 0.99892241379310343000, 0.99892357373519913000, 0.99892473118279568000, 0.99892588614393130000, 0.99892703862660948000, 0.99892818863879962000, 0.99892933618843682000, 0.99893048128342243000, 0.99893162393162394000, 0.99893276414087517000, 0.99893390191897657000, 0.99893503727369537000, 0.99893617021276593000, 0.99893730074388953000, 0.99893842887473461000, 0.99893955461293749000, 0.99894067796610164000, 0.99894179894179891000, 0.99894291754756870000, 0.99894403379091867000, 0.99894514767932485000, 0.99894625922023184000, 0.99894736842105258000, 0.99894847528916930000, 0.99894957983193278000, 0.99895068205666315000, 0.99895178197064993000, 0.99895287958115186000, 0.99895397489539750000, 0.99895506792058519000, 0.99895615866388310000, 0.99895724713242962000, 0.99895833333333328000, 0.99895941727367321000, 0.99896049896049899000, 0.99896157840083077000, 0.99896265560165975000, 0.99896373056994814000, 0.99896480331262938000, 0.99896587383660806000, 0.99896694214876036000, 0.99896800825593390000, 0.99896907216494846000, 0.99897013388259526000, 0.99897119341563789000, 0.99897225077081198000, 0.99897330595482547000, 0.99897435897435893000, 0.99897540983606559000, 0.99897645854657113000, 0.99897750511247441000, 0.99897854954034726000, 0.99897959183673468000, 0.99898063200815490000, 0.99898167006109984000, 0.99898270600203454000, 0.99898373983739841000, 0.99898477157360410000, 0.99898580121703850000, 0.99898682877406286000, 0.99898785425101211000, 0.99898887765419619000, 0.99898989898989898000, 0.99899091826437947000, 0.99899193548387100000, 0.99899295065458205000, 0.99899396378269623000, 0.99899497487437183000, 0.99899598393574296000, 0.99899699097291872000, 0.99899799599198402000, 0.99899899899899902000, 0.99900000000000000000, 0.99900099900099903000, 0.99900199600798401000, 0.99900299102691925000, 0.99900398406374502000, 0.99900497512437814000, 0.99900596421471177000, 0.99900695134061568000, 0.99900793650793651000, 0.99900891972249750000, 0.99900990099009901000, 0.99901088031651830000, 0.99901185770750989000, 0.99901283316880551000, 0.99901380670611439000, 0.99901477832512320000, 0.99901574803149606000, 0.99901671583087515000, 0.99901768172888017000, 0.99901864573110888000, 0.99901960784313726000, 0.99902056807051909000, 0.99902152641878672000, 0.99902248289345064000}; static void gauss_legendre_tbl(int n, double* x, double* w, double eps) { double x0, x1, dx; /* Abscissas */ double w0, w1, dw; /* Weights */ double P0, P_1, P_2; /* Legendre polynomial values */ double dpdx; /* Legendre polynomial derivative */ int i, j, k, m; /* Iterators */ double t0, t1, t2, t3; m = (n + 1) >> 1; t0 = (1.0 - (1.0 - 1.0 / (double)n) / (8.0 * (double)n * (double)n)); t1 = 1.0 / (4.0 * (double)n + 2.0); for (i = 1; i <= m; i++) { /* Find i-th root of Legendre polynomial */ /* Initial guess */ const double pi_to_many_places = 3.1415926535897932384626433832795028841971693993751; x0 = cos(pi_to_many_places * (double)((i << 2) - 1) * t1) * t0; /* Newton iterations, at least one */ j = 0; dx = dw = DBL_MAX; do { /* Compute Legendre polynomial value at x0 */ P_1 = 1.0; P0 = x0; /* Optimized version using lookup tables */ if (n < 1024) { /* Use fast algorithm for small n*/ for (k = 2; k <= n; k++) { P_2 = P_1; P_1 = P0; t2 = x0 * P_1; P0 = t2 + ltbl[k] * (t2 - P_2); } } else { /* Use general algorithm for other n */ for (k = 2; k < 1024; k++) { P_2 = P_1; P_1 = P0; t2 = x0 * P_1; P0 = t2 + ltbl[k] * (t2 - P_2); } for (k = 1024; k <= n; k++) { P_2 = P_1; P_1 = P0; t2 = x0 * P_1; t3 = (double)(k - 1) / (double)k; P0 = t2 + t3 * (t2 - P_2); } } /* Compute Legendre polynomial derivative at x0 */ dpdx = ((x0 * P0 - P_1) * (double)n) / (x0 * x0 - 1.0); /* Newton step */ x1 = x0 - P0 / dpdx; /* Weight computing */ w1 = 2.0 / ((1.0 - x1 * x1) * dpdx * dpdx); /* Compute weight w0 on first iteration, needed for dw */ if (j == 0) w0 = 2.0 / ((1.0 - x0 * x0) * dpdx * dpdx); dx = x0 - x1; dw = w0 - w1; x0 = x1; w0 = w1; j++; } while ((fabs(dx) > eps || fabs(dw) > eps) && j < 100); x[(m-1)-(i-1)] = x1; w[(m-1)-(i-1)] = w1; } return; } gsl-doc-2.3/integration/qng.h0000664000175000017500000001543512616157443014264 0ustar eddedd/* integration/qng.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 } ; gsl-doc-2.3/integration/qawc.c0000664000175000017500000001273112616157443014421 0ustar eddedd/* integration/qawc.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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 achieved 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); } } gsl-doc-2.3/integration/positivity.c0000664000175000017500000000054212616157443015706 0ustar eddedd/* 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; } gsl-doc-2.3/integration/tests.h0000664000175000017500000000601212616157443014630 0ustar eddedd/* integration/tests.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); struct monomial_params { int degree; double constant; } ; double f_monomial(double x, void * params); double integ_f_monomial(double a, double b, struct monomial_params * p); double f_sin(double x, void * params); double integ_f_sin(double a, double b); double cqf1 ( double x , void *params ); double cqf2 ( double x , void *params ); double cqf3 ( double x , void *params ); double cqf4 ( double x , void *params ); double cqf5 ( double x , void *params ); double cqf6 ( double x , void *params ); double cqf7 ( double x , void *params ); double cqf8 ( double x , void *params ); double cqf9 ( double x , void *params ); double cqf10 ( double x , void *params ); double cqf11 ( double x , void *params ); double cqf12 ( double x , void *params ); double cqf13 ( double x , void *params ); double cqf14 ( double x , void *params ); double cqf15 ( double x , void *params ); double cqf16 ( double x , void *params ); double cqf17 ( double x , void *params ); double cqf18 ( double x , void *params ); double cqf19 ( double x , void *params ); double cqf20 ( double x , void *params ); double cqf21 ( double x , void *params ); double cqf22 ( double x , void *params ); double cqf23 ( double x , void *params ); double cqf24 ( double x , void *params ); double cqf25 ( double x , void *params ); gsl-doc-2.3/integration/append.c0000664000175000017500000000233512616157443014734 0ustar eddedd/* integration/append.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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++; } gsl-doc-2.3/integration/qawo.c0000664000175000017500000002510612616157443014435 0ustar eddedd/* integration/qawo.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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 achieved 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); } } gsl-doc-2.3/integration/Makefile.am0000664000175000017500000000127712616157443015361 0ustar eddeddnoinst_LTLIBRARIES = libgslintegration.la AM_CPPFLAGS = -I$(top_srcdir) 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 glfixed.c cquad.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 cquad_const.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 gsl-doc-2.3/integration/qc25c.c0000664000175000017500000000606012616157443014401 0ustar eddedd/* integration/qc25c.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/integration/qk.c0000664000175000017500000000622412616157443014101 0ustar eddedd/* integration/qk.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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; /* in original fortran 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); } gsl-doc-2.3/integration/qcheb.c0000664000175000017500000001341312616157443014546 0ustar eddedd/* integration/qcheb.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } gsl-doc-2.3/integration/gsl_integration.h0000664000175000017500000002530012616157443016657 0ustar eddedd/* integration/gsl_integration.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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); /* Workspace for fixed-order Gauss-Legendre integration */ typedef struct { size_t n; /* number of points */ double *x; /* Gauss abscissae/points */ double *w; /* Gauss weights for each abscissae */ int precomputed; /* high precision abscissae/weights precomputed? */ } gsl_integration_glfixed_table; gsl_integration_glfixed_table * gsl_integration_glfixed_table_alloc (size_t n); void gsl_integration_glfixed_table_free (gsl_integration_glfixed_table * t); /* Routine for fixed-order Gauss-Legendre integration */ double gsl_integration_glfixed (const gsl_function *f, double a, double b, const gsl_integration_glfixed_table * t); /* Routine to retrieve the i-th Gauss-Legendre point and weight from t */ int gsl_integration_glfixed_point (double a, double b, size_t i, double *xi, double *wi, const gsl_integration_glfixed_table * t); /* Cquad integration - Pedro Gonnet */ /* Data of a single interval */ typedef struct { double a, b; double c[64]; double fx[33]; double igral, err; int depth, rdepth, ndiv; } gsl_integration_cquad_ival; /* The workspace is just a collection of intervals */ typedef struct { size_t size; gsl_integration_cquad_ival *ivals; size_t *heap; } gsl_integration_cquad_workspace; gsl_integration_cquad_workspace * gsl_integration_cquad_workspace_alloc (const size_t n); void gsl_integration_cquad_workspace_free (gsl_integration_cquad_workspace * w); int gsl_integration_cquad (const gsl_function * f, double a, double b, double epsabs, double epsrel, gsl_integration_cquad_workspace * ws, double *result, double *abserr, size_t * nevals); __END_DECLS #endif /* __GSL_INTEGRATION_H__ */ gsl-doc-2.3/integration/workspace.c0000664000175000017500000000744412616157443015471 0ustar eddedd/* integration/workspace.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (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 ; } */ gsl-doc-2.3/integration/qc25f.c0000664000175000017500000001035112616157443014402 0ustar eddedd/* integration/qc25f.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/integration/TODO0000664000175000017500000000217412616157443014012 0ustar eddedd# -*- org -*- #+CATEGORY: integration * 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. * ACM Transactions on Mathematical Software (TOMS) archive Volume 33 , Issue 3 (August 2007) Algorithm 867: QUADLOG---a package of routines for generating gauss-related quadrature for two classes of logarithmic weight functions Nelson H. F. Beebe, James S. Ball Article No. 20 Full text available: pdfPdf (209 KB) Additional Information: _full citation, abstract, references, index terms gsl-doc-2.3/integration/qagp.c0000664000175000017500000002706612616157443014425 0ustar eddedd/* integration/qagp.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 achieved 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); } } gsl-doc-2.3/integration/qk41.c0000664000175000017500000000725612616157443014254 0ustar eddedd/* integration/qk41.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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[10] = /* 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); } gsl-doc-2.3/integration/qawf.c0000664000175000017500000001423112616157443014421 0ustar eddedd/* integration/qawf.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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); } } gsl-doc-2.3/integration/initialise.c0000664000175000017500000000240312616157443015613 0ustar eddedd/* integration/initialise.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/integration/qmomo.c0000664000175000017500000001043312616157443014613 0ustar eddedd/* integration/qmomo.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (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; } } gsl-doc-2.3/integration/qk51.c0000664000175000017500000001034512616157443014246 0ustar eddedd/* integration/qk51.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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); } gsl-doc-2.3/integration/qk21.c0000664000175000017500000000533712616157443014250 0ustar eddedd/* integration/qk21.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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); } gsl-doc-2.3/integration/qk31.c0000664000175000017500000000627112616157443014247 0ustar eddedd/* integration/qk31.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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); } gsl-doc-2.3/integration/qng.c0000664000175000017500000001236512616157443014256 0ustar eddedd/* integration/qng.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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 achieved 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) ; } gsl-doc-2.3/integration/Makefile.in0000644000175000017500000010745013022372405015355 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 glfixed.lo cquad.lo libgslintegration_la_OBJECTS = $(am_libgslintegration_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslintegration.la AM_CPPFLAGS = -I$(top_srcdir) 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 glfixed.c cquad.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 cquad_const.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu integration/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslintegration.la: $(libgslintegration_la_OBJECTS) $(libgslintegration_la_DEPENDENCIES) $(EXTRA_libgslintegration_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslintegration_la_OBJECTS) $(libgslintegration_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cquad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glfixed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qagp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qaws.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qcheb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk15.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk21.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk31.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk41.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk51.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk61.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomof.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/workspace.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/integration/ChangeLog0000664000175000017500000001265312616157443015077 0ustar eddedd2012-09-23 Rhys Ulerich * cquad.c Fix NaN handling using patch from author Pedro Gonnet. Pedro reports bug found by Mick Pont at NAG. 2011-05-02 Brian Gough * cquad.c (gsl_integration_cquad): use finite instead of isfinite 2010-04-24 Brian Gough * cquad.c (gsl_integration_cquad): added CQUAD algorithm 2010-03-09 Brian Gough * glfixed.c (gauss_legendre_tbl): made this function static 2009-08-23 Brian Gough * test.c (main): increase tolerance for qawc(f459) elist test 2009-07-09 Brian Gough * workspace.c (gsl_integration_workspace_free): handle NULL argument in free * qmomof.c (gsl_integration_qawo_table_free): handle NULL argument in free * qmomo.c (gsl_integration_qaws_table_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2003-01-12 Brian Gough * qawc.c (gsl_integration_qawc): fixed bisection condition to prevent singularity falling on interval boundary Mon Apr 29 20:05:56 2002 Brian Gough * 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 * test.c (main): reduced tolerance on qagiu(f455) smooth elist test slightly Mon Jul 2 15:42:41 2001 Brian Gough * util.c: split out some static functions into separate files Tue Apr 17 22:11:28 2001 Brian Gough * qc25f.c (qc25f): need GSL_ERROR_VOID because function does not return value Mon Apr 16 20:09:09 2001 Brian Gough * 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 * 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 * reorganized, made internal functions static Thu Nov 16 19:45:19 2000 Brian Gough * 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 * 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 * test.c (main): increased one test limit slightly to allow for rounding errors Wed Feb 23 14:35:31 2000 Brian Gough * 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 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 * 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 * 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 * qelg.c (qelg): removed debugging code * qpsrt.c (qpsrt): removed debugging code Thu Mar 11 15:15:46 1999 Brian Gough * 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 * added integrators QAGI, QAGIU, QAGIL for infinite and semi-infinite ranges 1999-01-01 Mark Galassi * integration.c: replaced strings.h with string.h, which is the ISO library way. Sat Nov 21 12:43:03 1998 Brian Gough * 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 * added #include to all top-level source files Fri Jun 12 22:30:21 1998 Brian Gough * 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 * 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! gsl-doc-2.3/integration/qk61.c0000664000175000017500000001117412616157443014250 0ustar eddedd/* integration/qk61.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* 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); } gsl-doc-2.3/integration/qaws.c0000664000175000017500000001323712616157443014443 0ustar eddedd/* integration/qaws.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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 achieved 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); } } gsl-doc-2.3/integration/qpsrt.c0000664000175000017500000000545612616157443014645 0ustar eddedd/* integration/qpsrt.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/integration/qpsrt2.c0000664000175000017500000000371212616157443014720 0ustar eddedd/* integration/qpsrt2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } } gsl-doc-2.3/integration/qc25s.c0000664000175000017500000001332712616157443014425 0ustar eddedd/* integration/qc25s.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/integration/reset.c0000664000175000017500000000032312616157443014602 0ustar eddeddstatic 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] ; } gsl-doc-2.3/integration/qelg.c0000664000175000017500000001311612616157443014414 0ustar eddedd/* integration/qelg.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/integration/ptsort.c0000664000175000017500000000306212616157443015016 0ustar eddedd/* integration/ptsort.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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] ; } gsl-doc-2.3/integration/cquad_const.c0000664000175000017500000022571412616157443016000 0ustar eddedd/* Some constants and matrices that we'll need. */ static const double xi[33] = { -1., -0.99518472667219688624, -0.98078528040323044912, -0.95694033573220886493, -0.92387953251128675612, -0.88192126434835502970, -0.83146961230254523708, -0.77301045336273696082, -0.70710678118654752440, -0.63439328416364549822, -0.55557023301960222475, -0.47139673682599764857, -0.38268343236508977173, -0.29028467725446236764, -0.19509032201612826785, -0.098017140329560601995, 0., 0.098017140329560601995, 0.19509032201612826785, 0.29028467725446236764, 0.38268343236508977173, 0.47139673682599764857, 0.55557023301960222475, 0.63439328416364549822, 0.70710678118654752440, 0.77301045336273696082, 0.83146961230254523708, 0.88192126434835502970, 0.92387953251128675612, 0.95694033573220886493, 0.98078528040323044912, 0.99518472667219688624, 1. }; static const double bee[68] = { 0.00000000000000e+00, 2.28868854108532e-01, 0.00000000000000e+00, -8.15740215243451e-01, 0.00000000000000e+00, 5.31212715259731e-01, 0.00000000000000e+00, 1.38538036812454e-02, 0.00000000000000e+00, 3.74405228908818e-02, 0.00000000000000e+00, 2.12224115039342e-01, 0.00000000000000e+00, -8.16362644507898e-01, 0.00000000000000e+00, 5.35648426691481e-01, 0.00000000000000e+00, 1.52417902753662e-03, 0.00000000000000e+00, 2.63058840550873e-03, 0.00000000000000e+00, 4.15292106318904e-03, 0.00000000000000e+00, 6.97106011119775e-03, 0.00000000000000e+00, 1.35535708431058e-02, 0.00000000000000e+00, 3.52132898424856e-02, 0.00000000000000e+00, 2.06946714741884e-01, 0.00000000000000e+00, -8.15674251283876e-01, 0.00000000000000e+00, 5.38841175520580e-01, 0.00000000000000e+00, 1.84909689577590e-04, 0.00000000000000e+00, 2.90936325007499e-04, 0.00000000000000e+00, 3.84877750950089e-04, 0.00000000000000e+00, 4.86436656735046e-04, 0.00000000000000e+00, 6.08688640346879e-04, 0.00000000000000e+00, 7.66732830740331e-04, 0.00000000000000e+00, 9.82753336104205e-04, 0.00000000000000e+00, 1.29359957505615e-03, 0.00000000000000e+00, 1.76616363801885e-03, 0.00000000000000e+00, 2.53323433039089e-03, 0.00000000000000e+00, 3.88872172121956e-03, 0.00000000000000e+00, 6.58635106468291e-03, 0.00000000000000e+00, 1.30326736343254e-02, 0.00000000000000e+00, 3.44353850696714e-02, 0.00000000000000e+00, 2.05025409531915e-01, 0.00000000000000e+00, -8.14985893995401e-01, 0.00000000000000e+00, 5.40679930965238e-01 }; static const double Lalpha[33] = { 5.77350269189626e-01, 5.16397779494322e-01, 5.07092552837110e-01, 5.03952630678970e-01, 5.02518907629606e-01, 5.01745206004255e-01, 5.01280411827603e-01, 5.00979432868120e-01, 5.00773395667191e-01, 5.00626174321759e-01, 5.00517330712619e-01, 5.00434593736979e-01, 5.00370233297676e-01, 5.00319182924304e-01, 5.00278009473803e-01, 5.00244319584578e-01, 5.00216403386025e-01, 5.00193012939056e-01, 5.00173220168024e-01, 5.00156323280355e-01, 5.00141783641018e-01, 5.00129182278347e-01, 5.00118189340972e-01, 5.00108542278496e-01, 5.00100030010004e-01, 5.00092481273333e-01, 5.00085755939229e-01, 5.00079738458365e-01, 5.00074332862969e-01, 5.00069458915387e-01, 5.00065049112355e-01, 5.00061046334395e-01, 5.00057401986298e-01 }; static const double Lgamma[33] = { 0.0, 0.0, 5.16397779494322e-01, 5.07092552837110e-01, 5.03952630678970e-01, 5.02518907629606e-01, 5.01745206004255e-01, 5.01280411827603e-01, 5.00979432868120e-01, 5.00773395667191e-01, 5.00626174321759e-01, 5.00517330712619e-01, 5.00434593736979e-01, 5.00370233297676e-01, 5.00319182924304e-01, 5.00278009473803e-01, 5.00244319584578e-01, 5.00216403386025e-01, 5.00193012939056e-01, 5.00173220168024e-01, 5.00156323280355e-01, 5.00141783641018e-01, 5.00129182278347e-01, 5.00118189340972e-01, 5.00108542278496e-01, 5.00100030010003e-01, 5.00092481273333e-01, 5.00085755939229e-01, 5.00079738458365e-01, 5.00074332862969e-01, 5.00069458915387e-01, 5.00065049112355e-01, 5.00061046334395e-01 }; static const double V1inv[5 * 5] = { .47140452079103168293e-1, .37712361663282534635, .56568542494923801952, .37712361663282534635, .47140452079103168293e-1, -.81649658092772603273e-1, -.46188021535170061160, 0, .46188021535170061160, .81649658092772603273e-1, .15058465048420853962, .12046772038736683169, -.54210474174315074262, .12046772038736683169, .15058465048420853962, -.21380899352993950775, .30237157840738178177, -0., -.30237157840738178177, .21380899352993950775, .10774960475223581324, -.21549920950447162648, .21549920950447162648, -.21549920950447162648, .10774960475223581324 }; static const double V2inv[9 * 9] = { .11223917161691230546e-1, .10339219839658349826, .19754094204576565761, .25577315077753587922, .27835314560994251755, .25577315077753587922, .19754094204576565761, .10339219839658349826, .11223917161691230546e-1, -.19440394783993476970e-1, -.16544884625069155470, -.24193725566041460608, -.16953338808305493604, 0.0, .16953338808305493604, .24193725566041460608, .16544884625069155470, .19440394783993476970e-1, .26466393115406349388e-1, .17766815796285469394, .11316664642449611462, -.16306601003711325980, -.30847037493128779631, -.16306601003711325980, .11316664642449611462, .17766815796285469394, .26466393115406349388e-1, -.32395302049990834508e-1, -.15521142532414866547, .88573492664788602740e-1, .29570405784974857322, 0.0, -.29570405784974857322, -.88573492664788602740e-1, .15521142532414866547, .32395302049990834508e-1, .41442155673936851246e-1, .98186757907405608245e-1, -.23056908429499411784, -.68047008326360625520e-1, .31797435808002456774, -.68047008326360625520e-1, -.23056908429499411784, .98186757907405608245e-1, .41442155673936851246e-1, -.49981120317798783134e-1, -.24861810572835756217e-1, .23561326072010832539, -.24472785656448415351, 0.0, .24472785656448415351, -.23561326072010832539, .24861810572835756217e-1, .49981120317798783134e-1, .79691635865674781228e-1, -.95725617891693941833e-1, -.57957553356854386344e-1, .21164072460540271452, -.27529837844505833514, .21164072460540271452, -.57957553356854386344e-1, -.95725617891693941833e-1, .79691635865674781228e-1, -.10894869830716590913, .20131094491947531782, -.15407672674888869038, .83385723639789791384e-1, 0.0, -.83385723639789791384e-1, .15407672674888869038, -.20131094491947531782, .10894869830716590913, .54581057089643838221e-1, -.10916211417928767644, .10916211417928767644, -.10916211417928767644, .10916211417928767644, -.10916211417928767644, .10916211417928767644, -.10916211417928767644, .54581057089643838221e-1 }; static const double V3inv[17 * 17] = { .27729677693590098996e-2, .26423663180333065153e-1, .53374068493933898312e-1, .77007854739523195947e-1, .98257061072911596869e-1, .11538049741786835604, .12832134344120884559, .13612785914022865001, .13888293186236181317, .13612785914022865001, .12832134344120884559, .11538049741786835604, .98257061072911596869e-1, .77007854739523195947e-1, .53374068493933898312e-1, .26423663180333065153e-1, .27729677693590098996e-2, -.48029210642807413690e-2, -.44887724635478800254e-1, -.85409520147301089416e-1, -.11090267822061423050, -.12033983162705862441, -.11102786862182788886, -.85054870109799336515e-1, -.45998467987742225160e-1, 0.0, .45998467987742225160e-1, .85054870109799336515e-1, .11102786862182788886, .12033983162705862441, .11090267822061423050, .85409520147301089416e-1, .44887724635478800254e-1, .48029210642807413690e-2, .62758546879582030087e-2, .55561297093529155869e-1, .93281491021051539742e-1, .92320151237493695139e-1, .55077987469605684531e-1, -.96998141716497488255e-2, -.80285961895427405567e-1, -.13496839655913850224, -.15512521776684524331, -.13496839655913850224, -.80285961895427405567e-1, -.96998141716497488255e-2, .55077987469605684531e-1, .92320151237493695139e-1, .93281491021051539742e-1, .55561297093529155869e-1, .62758546879582030087e-2, -.74850969394858555939e-2, -.61751608943839234096e-1, -.82974150437304275958e-1, -.38437763431942633378e-1, .45745502025779701366e-1, .12369235652734542162, .14720439712852868239, .98768034347019704401e-1, 0.0, -.98768034347019704401e-1, -.14720439712852868239, -.12369235652734542162, -.45745502025779701366e-1, .38437763431942633378e-1, .82974150437304275958e-1, .61751608943839234096e-1, .74850969394858555939e-2, .86710099994384056338e-2, .64006230103659573344e-1, .58517426396091675690e-1, -.29743410528985802680e-1, -.11934127779157114754, -.12686773515361299409, -.30729137153877447035e-1, .97307836256600731568e-1, .15635811574451401023, .97307836256600731568e-1, -.30729137153877447035e-1, -.12686773515361299409, -.11934127779157114754, -.29743410528985802680e-1, .58517426396091675690e-1, .64006230103659573344e-1, .86710099994384056338e-2, -.97486395666294840165e-2, -.62995604908060224672e-1, -.24373234450275529219e-1, .87760984413626872730e-1, .12205204576993351394, .16216004196864002088e-1, -.12422320942156845775, -.13682714580929614678, 0.0, .13682714580929614678, .12422320942156845775, -.16216004196864002088e-1, -.12205204576993351394, -.87760984413626872730e-1, .24373234450275529219e-1, .62995604908060224672e-1, .97486395666294840165e-2, .10956271233750488468e-1, .58613204255294358939e-1, -.13306063940736618859e-1, -.11606666444978454399, -.52059598001115805639e-1, .10868540217796151849, .12594452879014618005, -.44678658254872910434e-1, -.15617684362128533405, -.44678658254872910434e-1, .12594452879014618005, .10868540217796151849, -.52059598001115805639e-1, -.11606666444978454399, -.13306063940736618859e-1, .58613204255294358939e-1, .10956271233750488468e-1, -.12098893000863087230e-1, -.51626244709126208453e-1, .48919433304746979330e-1, .10467644465949427090, -.48729879523084673782e-1, -.13668732103524749234, .28190838706814496438e-1, .15434223333238741600, 0.0, -.15434223333238741600, -.28190838706814496438e-1, .13668732103524749234, .48729879523084673782e-1, -.10467644465949427090, -.48919433304746979330e-1, .51626244709126208453e-1, .12098893000863087230e-1, .13542668300437944822e-1, .41712033418258689308e-1, -.76190463272803434388e-1, -.58303943170068132010e-1, .12158068748245606853, .42121099930651007882e-1, -.14684425840766337756, -.16108203535058647043e-1, .15698075850757976092, -.16108203535058647043e-1, -.14684425840766337756, .42121099930651007882e-1, .12158068748245606853, -.58303943170068132010e-1, -.76190463272803434388e-1, .41712033418258689308e-1, .13542668300437944822e-1, -.14939634995117694417e-1, -.30047246373341564039e-1, .91624635082546425678e-1, -.79133374319110026377e-2, -.12292558212072233355, .90013382617762643524e-1, .84013717196539593395e-1, -.14813033309980695856, 0.0, .14813033309980695856, -.84013717196539593395e-1, -.90013382617762643524e-1, .12292558212072233355, .79133374319110026377e-2, -.91624635082546425678e-1, .30047246373341564039e-1, .14939634995117694417e-1, .16986031342807474208e-1, .15760203882617033601e-1, -.91494054040950941996e-1, .70082459207876130806e-1, .53390713710144539104e-1, -.14340746778352039430, .84048122493418898508e-1, .72456667788091316868e-1, -.15564535320096811360, .72456667788091316868e-1, .84048122493418898508e-1, -.14340746778352039430, .53390713710144539104e-1, .70082459207876130806e-1, -.91494054040950941996e-1, .15760203882617033601e-1, .16986031342807474208e-1, -.18994065631858742028e-1, -.82901821370405592927e-3, .77239669773015192888e-1, -.10850735431039424680, .47524484622086496464e-1, .69148184871588737021e-1, -.14829314646228194928, .11992057742398672066, 0.0, -.11992057742398672066, .14829314646228194928, -.69148184871588737021e-1, -.47524484622086496464e-1, .10850735431039424680, -.77239669773015192888e-1, .82901821370405592927e-3, .18994065631858742028e-1, .22761703826371535132e-1, -.17728848711449643358e-1, -.47496371572480503788e-1, .10659958402328690063, -.11696013966166296514, .63073750910894244526e-1, .32928881123602721303e-1, -.12280950532497593683, .15926189077282729505, -.12280950532497593683, .32928881123602721303e-1, .63073750910894244526e-1, -.11696013966166296514, .10659958402328690063, -.47496371572480503788e-1, -.17728848711449643358e-1, .22761703826371535132e-1, -.26493215276042203434e-1, .35579780856128386192e-1, .10447309718398935122e-1, -.68616154085314996709e-1, .11775363082763954214, -.13918901977011837274, .12312819418827395690, -.72053565748259077905e-1, 0.0, .72053565748259077905e-1, -.12312819418827395690, .13918901977011837274, -.11775363082763954214, .68616154085314996709e-1, -.10447309718398935122e-1, -.35579780856128386192e-1, .26493215276042203434e-1, .40742523354399706918e-1, -.73124912999529117195e-1, .49317266444153837821e-1, -.13686605413876015320e-1, -.28342624942191100464e-1, .70371855298258216249e-1, -.10600251632853603875, .12981016288391131812, -.13817029659318161476, .12981016288391131812, -.10600251632853603875, .70371855298258216249e-1, -.28342624942191100464e-1, -.13686605413876015320e-1, .49317266444153837821e-1, -.73124912999529117195e-1, .40742523354399706918e-1, -.54944368958699908688e-1, .10777725663147408190, -.10152395581538265428, .91369146312596428468e-1, -.77703071757424700773e-1, .61050911730999815031e-1, -.42052599404498348871e-1, .21438229266251454773e-1, 0.0, -.21438229266251454773e-1, .42052599404498348871e-1, -.61050911730999815031e-1, .77703071757424700773e-1, -.91369146312596428468e-1, .10152395581538265428, -.10777725663147408190, .54944368958699908688e-1, .27485608464748840573e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .54971216929497681146e-1, -.54971216929497681146e-1, .27485608464748840573e-1 }; static const double V4inv[33 * 33] = { .69120897476690862600e-3, .66419939766331555194e-2, .13600665164323186111e-1, .20122785860913684493e-1, .26583214101668429944e-1, .32712713318999268739e-1, .38576221976287138036e-1, .44033030938268925133e-1, .49092709529622799673e-1, .53657949874312515646e-1, .57724533144734311859e-1, .61219564530655179096e-1, .64138907503837875026e-1, .66427905189318792009e-1, .68088956652280022887e-1, .69083051391555695878e-1, .69422738116739271449e-1, .69083051391555695878e-1, .68088956652280022887e-1, .66427905189318792009e-1, .64138907503837875026e-1, .61219564530655179096e-1, .57724533144734311859e-1, .53657949874312515646e-1, .49092709529622799673e-1, .44033030938268925133e-1, .38576221976287138036e-1, .32712713318999268739e-1, .26583214101668429944e-1, .20122785860913684493e-1, .13600665164323186111e-1, .66419939766331555194e-2, .69120897476690862600e-3, -.11972090629438798134e-2, -.11448874821643225573e-1, -.23104401104002905904e-1, -.33352899418646530133e-1, -.42538626424075425908e-1, -.49969730733911825941e-1, -.55555454015360728353e-1, -.58955533624852604918e-1, -.60126044219122513907e-1, -.58959430451175833624e-1, -.55546925396227130606e-1, -.49984739749347973762e-1, -.42513009141170294365e-1, -.33399140950669746346e-1, -.23007690803851790829e-1, -.11728275717520066169e-1, 0.0, .11728275717520066169e-1, .23007690803851790829e-1, .33399140950669746346e-1, .42513009141170294365e-1, .49984739749347973762e-1, .55546925396227130606e-1, .58959430451175833624e-1, .60126044219122513907e-1, .58955533624852604918e-1, .55555454015360728353e-1, .49969730733911825941e-1, .42538626424075425908e-1, .33352899418646530133e-1, .23104401104002905904e-1, .11448874821643225573e-1, .11972090629438798134e-2, .15501585012936019146e-2, .14628781502199620482e-1, .28684915921474815271e-1, .39299396074628048026e-1, .46393418975496284204e-1, .48756902531094699526e-1, .46331333488337494692e-1, .39012645376980228775e-1, .27452795421085791153e-1, .12430953621169863781e-1, -.47682978056024928800e-2, -.22825828045428973853e-1, -.40195512090720278312e-1, -.55503004262826221955e-1, -.67424537752827046308e-1, -.75020199300113606452e-1, -.77607844312483656131e-1, -.75020199300113606452e-1, -.67424537752827046308e-1, -.55503004262826221955e-1, -.40195512090720278312e-1, -.22825828045428973853e-1, -.47682978056024928800e-2, .12430953621169863781e-1, .27452795421085791153e-1, .39012645376980228775e-1, .46331333488337494692e-1, .48756902531094699526e-1, .46393418975496284204e-1, .39299396074628048026e-1, .28684915921474815271e-1, .14628781502199620482e-1, .15501585012936019146e-2, -.18377757558949194214e-2, -.17050470050949761565e-1, -.31952119564923250836e-1, -.40197423449026348155e-1, -.41205649520281371624e-1, -.33909965817492272248e-1, -.19393664422115332144e-1, .56661049630886784692e-3, .22948272173686561721e-1, .44489719570904738207e-1, .61790363672287920596e-1, .72121014727028013894e-1, .73627151185287858579e-1, .65784665375961398923e-1, .49369676372333667559e-1, .26444326317059715065e-1, 0.0, -.26444326317059715065e-1, -.49369676372333667559e-1, -.65784665375961398923e-1, -.73627151185287858579e-1, -.72121014727028013894e-1, -.61790363672287920596e-1, -.44489719570904738207e-1, -.22948272173686561721e-1, -.56661049630886784692e-3, .19393664422115332144e-1, .33909965817492272248e-1, .41205649520281371624e-1, .40197423449026348155e-1, .31952119564923250836e-1, .17050470050949761565e-1, .18377757558949194214e-2, .20942714740729767769e-2, .18935902405146518232e-1, .33335840852491735126e-1, .36770680999102286065e-1, .28873194534132768509e-1, .10267303017729535513e-1, -.14607738306201572890e-1, -.40139568545572305818e-1, -.59808326733858291561e-1, -.68528358823372627506e-1, -.63306535387619244879e-1, -.44508601817574921056e-1, -.15449116105605395357e-1, .17941083795006546367e-1, .48747356011657242123e-1, .70329553984201665523e-1, .78106117292526169663e-1, .70329553984201665523e-1, .48747356011657242123e-1, .17941083795006546367e-1, -.15449116105605395357e-1, -.44508601817574921056e-1, -.63306535387619244879e-1, -.68528358823372627506e-1, -.59808326733858291561e-1, -.40139568545572305818e-1, -.14607738306201572890e-1, .10267303017729535513e-1, .28873194534132768509e-1, .36770680999102286065e-1, .33335840852491735126e-1, .18935902405146518232e-1, .20942714740729767769e-2, -.23245285491878278419e-2, -.20401404737639389919e-1, -.33019548231022514097e-1, -.29709828426463720091e-1, -.11760070922697422156e-1, .15987584743850393793e-1, .43619012891472813485e-1, .61177322409671487721e-1, .61144030218486655594e-1, .41895377620089086167e-1, .80232011820644308033e-2, -.30574701186675900915e-1, -.62072243008844865848e-1, -.76336186183574765586e-1, -.68435466095345537115e-1, -.40237669208466966207e-1, 0.0, .40237669208466966207e-1, .68435466095345537115e-1, .76336186183574765586e-1, .62072243008844865848e-1, .30574701186675900915e-1, -.80232011820644308033e-2, -.41895377620089086167e-1, -.61144030218486655594e-1, -.61177322409671487721e-1, -.43619012891472813485e-1, -.15987584743850393793e-1, .11760070922697422156e-1, .29709828426463720091e-1, .33019548231022514097e-1, .20401404737639389919e-1, .23245285491878278419e-2, .25451717261579269307e-2, .21480418595666878775e-1, .31177212469293007998e-1, .19816333607013379373e-1, -.72439496274458793681e-2, -.38404203906598342397e-1, -.57633632255322221046e-1, -.54070547403585392952e-1, -.26249823354368866005e-1, .15643058212336881516e-1, .54539832735118677194e-1, .73283028002473989724e-1, .62835303524135936213e-1, .26175977027801048141e-1, -.22193636309998606610e-1, -.62597049956093311234e-1, -.78206986173170212505e-1, -.62597049956093311234e-1, -.22193636309998606610e-1, .26175977027801048141e-1, .62835303524135936213e-1, .73283028002473989724e-1, .54539832735118677194e-1, .15643058212336881516e-1, -.26249823354368866005e-1, -.54070547403585392952e-1, -.57633632255322221046e-1, -.38404203906598342397e-1, -.72439496274458793681e-2, .19816333607013379373e-1, .31177212469293007998e-1, .21480418595666878775e-1, .25451717261579269307e-2, -.27506573922483820005e-2, -.22224442095099251870e-1, -.27949927254215773020e-1, -.80918481053370034987e-2, .25121859354449306916e-1, .51563535009373061074e-1, .51936965107145960512e-1, .22146626648171527753e-1, -.24172689882103382748e-1, -.61731229104853568296e-1, -.68477262429344201201e-1, -.38311232728303704742e-1, .14160578713659552679e-1, .61248813427564184033e-1, .77136328841293031805e-1, .52514801765183697988e-1, 0.0, -.52514801765183697988e-1, -.77136328841293031805e-1, -.61248813427564184033e-1, -.14160578713659552679e-1, .38311232728303704742e-1, .68477262429344201201e-1, .61731229104853568296e-1, .24172689882103382748e-1, -.22146626648171527753e-1, -.51936965107145960512e-1, -.51563535009373061074e-1, -.25121859354449306916e-1, .80918481053370034987e-2, .27949927254215773020e-1, .22224442095099251870e-1, .27506573922483820005e-2, .29562461131654311467e-2, .22630271480554450613e-1, .23547399831373800971e-1, -.43964593440902476642e-2, -.39055315767504970597e-1, -.52369643937940066804e-1, -.28506131614971613422e-1, .19906048093338832322e-1, .60408880866392420279e-1, .62493397473656883090e-1, .21391278377641297859e-1, -.37302864786623254746e-1, -.73665127933539496872e-1, -.61706142476854010202e-1, -.78065168882546327888e-2, .52335307373945544428e-1, .78278746279419264777e-1, .52335307373945544428e-1, -.78065168882546327888e-2, -.61706142476854010202e-1, -.73665127933539496872e-1, -.37302864786623254746e-1, .21391278377641297859e-1, .62493397473656883090e-1, .60408880866392420279e-1, .19906048093338832322e-1, -.28506131614971613422e-1, -.52369643937940066804e-1, -.39055315767504970597e-1, -.43964593440902476642e-2, .23547399831373800971e-1, .22630271480554450613e-1, .29562461131654311467e-2, -.31515718415504761303e-2, -.22739451096655080673e-1, -.18157123602272119779e-1, .16496480897167303621e-1, .46921166788569301124e-1, .40644395739978416354e-1, -.46275803430732216900e-2, -.52883375891308909486e-1, -.61116483226324111734e-1, -.17411698764545629853e-1, .44773430013166822765e-1, .73441577962383869198e-1, .42127368371995472815e-1, -.25504645957196772465e-1, -.74126818045972742488e-1, -.62780077864719287317e-1, 0.0, .62780077864719287317e-1, .74126818045972742488e-1, .25504645957196772465e-1, -.42127368371995472815e-1, -.73441577962383869198e-1, -.44773430013166822765e-1, .17411698764545629853e-1, .61116483226324111734e-1, .52883375891308909486e-1, .46275803430732216900e-2, -.40644395739978416354e-1, -.46921166788569301124e-1, -.16496480897167303621e-1, .18157123602272119779e-1, .22739451096655080673e-1, .31515718415504761303e-2, .33536559294882188208e-2, .22535348942792006185e-1, .12048629300953560767e-1, -.27166076791299493403e-1, -.47492745604230978367e-1, -.19246623430993153174e-1, .36231297307556299322e-1, .61713617181636122004e-1, .25928029734266134490e-1, -.40478700752883602818e-1, -.71053889866326412049e-1, -.31870824482961751482e-1, .41515251100219081281e-1, .76481960760098381651e-1, .36726509155999912440e-1, -.40090067032627055969e-1, -.78270742903374539397e-1, -.40090067032627055969e-1, .36726509155999912440e-1, .76481960760098381651e-1, .41515251100219081281e-1, -.31870824482961751482e-1, -.71053889866326412049e-1, -.40478700752883602818e-1, .25928029734266134490e-1, .61713617181636122004e-1, .36231297307556299322e-1, -.19246623430993153174e-1, -.47492745604230978367e-1, -.27166076791299493403e-1, .12048629300953560767e-1, .22535348942792006185e-1, .33536559294882188208e-2, -.35481220456925318865e-2, -.22062913693073191150e-1, -.54487362861834144999e-2, .35438821865804087489e-1, .40733077820527411302e-1, -.67403098138950720914e-2, -.55559584405239171054e-1, -.42417050790865158745e-1, .24499901971884704925e-1, .68721232891705409302e-1, .34086082787461126592e-1, -.43441000373118474002e-1, -.73878085292669148950e-1, -.18846995664706657127e-1, .59827776178286834498e-1, .70644634584085901794e-1, 0.0, -.70644634584085901794e-1, -.59827776178286834498e-1, .18846995664706657127e-1, .73878085292669148950e-1, .43441000373118474002e-1, -.34086082787461126592e-1, -.68721232891705409302e-1, -.24499901971884704925e-1, .42417050790865158745e-1, .55559584405239171054e-1, .67403098138950720914e-2, -.40733077820527411302e-1, -.35438821865804087489e-1, .54487362861834144999e-2, .22062913693073191150e-1, .35481220456925318865e-2, .37554176816665075631e-2, .21297045781589919482e-1, -.13327293083183431816e-2, -.40635299172764596484e-1, -.27659860508374175359e-1, .31089232744083445986e-1, .56113781541334176109e-1, .37577840643257763400e-2, -.60511227350664590865e-1, -.46670556446129053853e-1, .33263195878575888247e-1, .72757324720645228775e-1, .15011712351692283635e-1, -.65601212994924119078e-1, -.60016855838843789772e-1, .26220858553188665966e-1, .78322776605833552980e-1, .26220858553188665966e-1, -.60016855838843789772e-1, -.65601212994924119078e-1, .15011712351692283635e-1, .72757324720645228775e-1, .33263195878575888247e-1, -.46670556446129053853e-1, -.60511227350664590865e-1, .37577840643257763400e-2, .56113781541334176109e-1, .31089232744083445986e-1, -.27659860508374175359e-1, -.40635299172764596484e-1, -.13327293083183431816e-2, .21297045781589919482e-1, .37554176816665075631e-2, -.39566995305720591229e-2, -.20291873414438919995e-1, .80617453830770930551e-2, .42270189157016547906e-1, .10332624526759093004e-1, -.48054759547616142024e-1, -.37678032941171643972e-1, .36617192625732482394e-1, .61009425973424865714e-1, -.95589113168026591466e-2, -.71023202645076922361e-1, -.25097788086808784456e-1, .62406621963267050244e-1, .56907293171100693511e-1, -.36435383083882206257e-1, -.75790105119208756348e-1, 0.0, .75790105119208756348e-1, .36435383083882206257e-1, -.56907293171100693511e-1, -.62406621963267050244e-1, .25097788086808784456e-1, .71023202645076922361e-1, .95589113168026591466e-2, -.61009425973424865714e-1, -.36617192625732482394e-1, .37678032941171643972e-1, .48054759547616142024e-1, -.10332624526759093004e-1, -.42270189157016547906e-1, -.80617453830770930551e-2, .20291873414438919995e-1, .39566995305720591229e-2, .41776092289182138591e-2, .19013221163904414395e-1, -.14420609729849899876e-1, -.40259160586844441220e-1, .86327811113710831649e-2, .53564430703021034399e-1, .65469185402150431933e-2, -.60383116311280629856e-1, -.25657793784058876939e-1, .58745680576829226900e-1, .45649937869034420296e-1, -.49167932056844167772e-1, -.62696614328552187977e-1, .32540234556426699997e-1, .74280410383464269758e-1, -.11425672633410999870e-1, -.78280649404686404903e-1, -.11425672633410999870e-1, .74280410383464269758e-1, .32540234556426699997e-1, -.62696614328552187977e-1, -.49167932056844167772e-1, .45649937869034420296e-1, .58745680576829226900e-1, -.25657793784058876939e-1, -.60383116311280629856e-1, .65469185402150431933e-2, .53564430703021034399e-1, .86327811113710831649e-2, -.40259160586844441220e-1, -.14420609729849899876e-1, .19013221163904414395e-1, .41776092289182138591e-2, -.43935502082478059199e-2, -.17528761237509401631e-1, .20208915249153872535e-1, .34734743119040669109e-1, -.26275910172353637955e-1, -.46368003346018878786e-1, .26800056330709381025e-1, .56681476464606609921e-1, -.24749011438127255898e-1, -.64934612189056658992e-1, .20333742247679279535e-1, .71429299070059318651e-1, -.14452513210428671266e-1, -.75793341281736586582e-1, .74717094137184935270e-2, .78034921554757317374e-1, 0.0, -.78034921554757317374e-1, -.74717094137184935270e-2, .75793341281736586582e-1, .14452513210428671266e-1, -.71429299070059318651e-1, -.20333742247679279535e-1, .64934612189056658992e-1, .24749011438127255898e-1, -.56681476464606609921e-1, -.26800056330709381025e-1, .46368003346018878786e-1, .26275910172353637955e-1, -.34734743119040669109e-1, -.20208915249153872535e-1, .17528761237509401631e-1, .43935502082478059199e-2, .46379089482818671473e-2, .15791188144791287229e-1, -.25134290048737455284e-1, -.26249795071946841205e-1, .39960457575789924651e-1, .28111892450146525404e-1, -.51026476400767918226e-1, -.27266747278681831364e-1, .60708796647861610865e-1, .23532306960642115854e-1, -.68169639871532441111e-1, -.18204924701958312032e-1, .73822890510656128485e-1, .11373392486424717019e-1, -.77133324017644609416e-1, -.39295877480342619961e-2, .78351902829418987960e-1, -.39295877480342619961e-2, -.77133324017644609416e-1, .11373392486424717019e-1, .73822890510656128485e-1, -.18204924701958312032e-1, -.68169639871532441111e-1, .23532306960642115854e-1, .60708796647861610865e-1, -.27266747278681831364e-1, -.51026476400767918226e-1, .28111892450146525404e-1, .39960457575789924651e-1, -.26249795071946841205e-1, -.25134290048737455284e-1, .15791188144791287229e-1, .46379089482818671473e-2, -.48780095920069827068e-2, -.13886961667516983541e-1, .29071311049368895844e-1, .15480559452075811600e-1, -.47527977686242313065e-1, -.31929089844361042178e-2, .58015667638415922967e-1, -.14547915466597622925e-1, -.61067668299848923244e-1, .35093678009090186851e-1, .55378399159800654657e-1, -.54277226474891610385e-1, -.42023830782434076509e-1, .69197384645944912066e-1, .22610783557709586445e-1, -.77269275900637030185e-1, 0.0, .77269275900637030185e-1, -.22610783557709586445e-1, -.69197384645944912066e-1, .42023830782434076509e-1, .54277226474891610385e-1, -.55378399159800654657e-1, -.35093678009090186851e-1, .61067668299848923244e-1, .14547915466597622925e-1, -.58015667638415922967e-1, .31929089844361042178e-2, .47527977686242313065e-1, -.15480559452075811600e-1, -.29071311049368895844e-1, .13886961667516983541e-1, .48780095920069827068e-2, .51591759101720291381e-2, .11747497650231330965e-1, -.31777863364694653331e-1, -.34555825499804605557e-2, .47914131921157015198e-1, -.22573685920142225247e-1, -.45320344390022666738e-1, .49660630547172186418e-1, .25707858143963615736e-1, -.68132707341917233933e-1, .67534860185243140399e-2, .69268150370037450063e-1, -.41585011920451477177e-1, -.51622397460510041271e-1, .68408139576363036148e-1, .18981259024768933323e-1, -.78265472429342305554e-1, .18981259024768933323e-1, .68408139576363036148e-1, -.51622397460510041271e-1, -.41585011920451477177e-1, .69268150370037450063e-1, .67534860185243140399e-2, -.68132707341917233933e-1, .25707858143963615736e-1, .49660630547172186418e-1, -.45320344390022666738e-1, -.22573685920142225247e-1, .47914131921157015198e-1, -.34555825499804605557e-2, -.31777863364694653331e-1, .11747497650231330965e-1, .51591759101720291381e-2, -.54365757412741340377e-2, -.94862516619529080191e-2, .33240472093448190877e-1, -.88698898099681552229e-2, -.40973252097216337576e-1, .42995673349795657065e-1, .17320914507876958783e-1, -.62201292691914856803e-1, .24726274174637346693e-1, .51320859246515407288e-1, -.62882063373810501763e-1, -.11003569131725622672e-1, .73842261324108943465e-1, -.39240120294802923208e-1, -.49293966443941122807e-1, .73552644778818223475e-1, 0.0, -.73552644778818223475e-1, .49293966443941122807e-1, .39240120294802923208e-1, -.73842261324108943465e-1, .11003569131725622672e-1, .62882063373810501763e-1, -.51320859246515407288e-1, -.24726274174637346693e-1, .62201292691914856803e-1, -.17320914507876958783e-1, -.42995673349795657065e-1, .40973252097216337576e-1, .88698898099681552229e-2, -.33240472093448190877e-1, .94862516619529080191e-2, .54365757412741340377e-2, .57750194549356126240e-2, .69981166020044116791e-2, -.33274982140403110792e-1, .20297071020698356116e-1, .27898517839646066582e-1, -.53368678853282030262e-1, .16656482990394548343e-1, .46342901447260614255e-1, -.60536796508149003365e-1, .29109107483842596340e-2, .63224486124385124504e-1, -.59028872851312033411e-1, -.14783105962696191734e-1, .74269399241069253865e-1, -.49053677339382384625e-1, -.33525466624811186739e-1, .78397349622515386647e-1, -.33525466624811186739e-1, -.49053677339382384625e-1, .74269399241069253865e-1, -.14783105962696191734e-1, -.59028872851312033411e-1, .63224486124385124504e-1, .29109107483842596340e-2, -.60536796508149003365e-1, .46342901447260614255e-1, .16656482990394548343e-1, -.53368678853282030262e-1, .27898517839646066582e-1, .20297071020698356116e-1, -.33274982140403110792e-1, .69981166020044116791e-2, .57750194549356126240e-2, -.61100308370519200637e-2, -.44383614355738148616e-2, .32011283412619094811e-1, -.29965011866372897633e-1, -.10560682331349193348e-1, .51110336443392506342e-1, -.45012284729681775492e-1, -.94236825555873320102e-2, .60860695783141264746e-1, -.55014628647083368926e-1, -.73474782382499482121e-2, .66640148475243034781e-1, -.62533116045749887988e-1, -.38650525912400102585e-2, .68429769005837003777e-1, -.66984505412544901945e-1, 0.0, .66984505412544901945e-1, -.68429769005837003777e-1, .38650525912400102585e-2, .62533116045749887988e-1, -.66640148475243034781e-1, .73474782382499482121e-2, .55014628647083368926e-1, -.60860695783141264746e-1, .94236825555873320102e-2, .45012284729681775492e-1, -.51110336443392506342e-1, .10560682331349193348e-1, .29965011866372897633e-1, -.32011283412619094811e-1, .44383614355738148616e-2, .61100308370519200637e-2, .65409373892036191538e-2, .16350101107071157065e-2, -.29301957285983144319e-1, .36838667173388832579e-1, -.81922703976491586393e-2, -.36955670021050133434e-1, .58374851095540469865e-1, -.31977016246946181856e-1, -.25311073698658094646e-1, .66674413950106952577e-1, -.54865713324521039571e-1, -.39797027891537985440e-2, .62830285264808449064e-1, -.72226313251296100676e-1, .22560232697133353980e-1, .46455784709904033738e-1, -.78200930751070349956e-1, .46455784709904033738e-1, .22560232697133353980e-1, -.72226313251296100676e-1, .62830285264808449064e-1, -.39797027891537985440e-2, -.54865713324521039571e-1, .66674413950106952577e-1, -.25311073698658094646e-1, -.31977016246946181856e-1, .58374851095540469865e-1, -.36955670021050133434e-1, -.81922703976491586393e-2, .36838667173388832579e-1, -.29301957285983144319e-1, .16350101107071157065e-2, .65409373892036191538e-2, -.69686180931868703196e-2, .11849538727632789870e-2, .25452286414610537766e-1, -.40522480651713943230e-1, .25694679053362813183e-1, .14057118113748390637e-1, -.52037614725803488893e-1, .58849342223684035589e-1, -.25075229077361409271e-1, -.29559771094034181083e-1, .68296746944165720199e-1, -.62890462146423984955e-1, .14457636466274596445e-1, .45787612031322361496e-1, -.77231759014655809742e-1, .57881203613910543657e-1, 0.0, -.57881203613910543657e-1, .77231759014655809742e-1, -.45787612031322361496e-1, -.14457636466274596445e-1, .62890462146423984955e-1, -.68296746944165720199e-1, .29559771094034181083e-1, .25075229077361409271e-1, -.58849342223684035589e-1, .52037614725803488893e-1, -.14057118113748390637e-1, -.25694679053362813183e-1, .40522480651713943230e-1, -.25452286414610537766e-1, -.11849538727632789870e-2, .69686180931868703196e-2, .75611653617520254845e-2, -.43290610418608409141e-2, -.20277062025115566914e-1, .40362947027704828926e-1, -.38938808024132120254e-1, .11831186195916702262e-1, .28476667401744525357e-1, -.59320969056617684621e-1, .61101629747436200186e-1, -.29514834848355389223e-1, -.20668001885001084821e-1, .62923592802445122793e-1, -.73558456263588833115e-1, .45314556330160999776e-1, .79031645918426015574e-2, -.58136953576334689357e-1, .78538474524006405758e-1, -.58136953576334689357e-1, .79031645918426015574e-2, .45314556330160999776e-1, -.73558456263588833115e-1, .62923592802445122793e-1, -.20668001885001084821e-1, -.29514834848355389223e-1, .61101629747436200186e-1, -.59320969056617684621e-1, .28476667401744525357e-1, .11831186195916702262e-1, -.38938808024132120254e-1, .40362947027704828926e-1, -.20277062025115566914e-1, -.43290610418608409141e-2, .75611653617520254845e-2, -.81505692478987769484e-2, .74297333588288568430e-2, .14314212513540223314e-1, -.36711242251332751607e-1, .46240027755503814626e-1, -.34921532671769023773e-1, .46930051972353714773e-2, .32842770336385381562e-1, -.61317813706529588466e-1, .67000809902468893103e-1, -.45337449655535622885e-1, .35794459576271920867e-2, .41830061526027213385e-1, -.72091371931944711708e-1, .74150028530317793195e-1, -.46487632538609942002e-1, 0.0, .46487632538609942002e-1, -.74150028530317793195e-1, .72091371931944711708e-1, -.41830061526027213385e-1, -.35794459576271920867e-2, .45337449655535622885e-1, -.67000809902468893103e-1, .61317813706529588466e-1, -.32842770336385381562e-1, -.46930051972353714773e-2, .34921532671769023773e-1, -.46240027755503814626e-1, .36711242251332751607e-1, -.14314212513540223314e-1, -.74297333588288568430e-2, .81505692478987769484e-2, .90693182942442189743e-2, -.11121000903959576737e-1, -.71308296141317458546e-2, .29219439765986671645e-1, -.45820286629778129593e-1, .49088381175879124421e-1, -.35614888785023038938e-1, .78906970900092777895e-2, .26262843038404929480e-1, -.56143674270125757857e-1, .71700220472378350694e-1, -.66963544500697307945e-1, .42215091779892228883e-1, -.41338867413966866997e-2, -.36164891772995367321e-1, .66584367783847858225e-1, -.77874712365070098328e-1, .66584367783847858225e-1, -.36164891772995367321e-1, -.41338867413966866997e-2, .42215091779892228883e-1, -.66963544500697307945e-1, .71700220472378350694e-1, -.56143674270125757857e-1, .26262843038404929480e-1, .78906970900092777895e-2, -.35614888785023038938e-1, .49088381175879124421e-1, -.45820286629778129593e-1, .29219439765986671645e-1, -.71308296141317458546e-2, -.11121000903959576737e-1, .90693182942442189743e-2, -.99848472706332791043e-2, .14701271465939718856e-1, -.32917820356048383366e-3, -.19201195309873585230e-1, .38409681836626963278e-1, -.51647324405878909521e-1, .54522171113149311354e-1, -.45040302741689006270e-1, .24183738595685990149e-1, .42204134165479735097e-2, -.34317295181348742251e-1, .59542472465494579941e-1, -.74135115907618101263e-1, .74491937840566532596e-1, -.60042604725161994304e-1, .33437677409000083169e-1, 0.0, -.33437677409000083169e-1, .60042604725161994304e-1, -.74491937840566532596e-1, .74135115907618101263e-1, -.59542472465494579941e-1, .34317295181348742251e-1, -.42204134165479735097e-2, -.24183738595685990149e-1, .45040302741689006270e-1, -.54522171113149311354e-1, .51647324405878909521e-1, -.38409681836626963278e-1, .19201195309873585230e-1, .32917820356048383366e-3, -.14701271465939718856e-1, .99848472706332791043e-2, .11775579274769383373e-1, -.19892153937316935880e-1, .95335114477449041055e-2, .57661528440359081617e-2, -.23382690532380910781e-1, .40237257037170725321e-1, -.53280289903551636474e-1, .59974361806023689068e-1, -.58701684061992853224e-1, .49033407111597129616e-1, -.31818835267847249219e-1, .90800541261162098886e-2, .16272906819312603838e-1, -.40863896581186229487e-1, .61346046297517367703e-1, -.74896047554167268919e-1, .79632642148310325817e-1, -.74896047554167268919e-1, .61346046297517367703e-1, -.40863896581186229487e-1, .16272906819312603838e-1, .90800541261162098886e-2, -.31818835267847249219e-1, .49033407111597129616e-1, -.58701684061992853224e-1, .59974361806023689068e-1, -.53280289903551636474e-1, .40237257037170725321e-1, -.23382690532380910781e-1, .57661528440359081617e-2, .95335114477449041055e-2, -.19892153937316935880e-1, .11775579274769383373e-1, -.13562702617218467450e-1, .24885419969649845849e-1, -.18368693901908875583e-1, .81673147806084084638e-2, .47890591326129587131e-2, -.19313752945227974024e-1, .34065953398362954708e-1, -.47667045133463415672e-1, .58820377816690514309e-1, -.66424139824618415970e-1, .69667606260856092515e-1, -.68102459384364543253e-1, .61683024923302547971e-1, -.50771943476441639136e-1, .36110771847327189215e-1, -.18758028464284563358e-1, 0.0, .18758028464284563358e-1, -.36110771847327189215e-1, .50771943476441639136e-1, -.61683024923302547971e-1, .68102459384364543253e-1, -.69667606260856092515e-1, .66424139824618415970e-1, -.58820377816690514309e-1, .47667045133463415672e-1, -.34065953398362954708e-1, .19313752945227974024e-1, -.47890591326129587131e-2, -.81673147806084084638e-2, .18368693901908875583e-1, -.24885419969649845849e-1, .13562702617218467450e-1, .20576545037980523979e-1, -.40093155172981004337e-1, .36954083167944054826e-1, -.31856506837591907746e-1, .24996323181546255126e-1, -.16637165210473614136e-1, .71002706773325085237e-2, .32478629093205201133e-2, -.14009562579050569518e-1, .24771262248780618922e-1, -.35119395835433647559e-1, .44656290368574753171e-1, -.53015448339647394161e-1, .59875631995693046782e-1, -.64973208326045193862e-1, .68112280331082143373e-1, -.69172215234062186994e-1, .68112280331082143373e-1, -.64973208326045193862e-1, .59875631995693046782e-1, -.53015448339647394161e-1, .44656290368574753171e-1, -.35119395835433647559e-1, .24771262248780618922e-1, -.14009562579050569518e-1, .32478629093205201133e-2, .71002706773325085237e-2, -.16637165210473614136e-1, .24996323181546255126e-1, -.31856506837591907746e-1, .36954083167944054826e-1, -.40093155172981004337e-1, .20576545037980523979e-1, -.27584914609096156163e-1, .54904171411058497973e-1, -.54109756419563083153e-1, .52794234894345577483e-1, -.50970276026831042415e-1, .48655445537990983379e-1, -.45872036510847994332e-1, .42646854695899611372e-1, -.39010960357087507670e-1, .34999369144476467749e-1, -.30650714874402762189e-1, .26006877464703437057e-1, -.21112579608213651273e-1, .16014956068786763273e-1, -.10763099747751940252e-1, .54075888924374485533e-2, 0.0, -.54075888924374485533e-2, .10763099747751940252e-1, -.16014956068786763273e-1, .21112579608213651273e-1, -.26006877464703437057e-1, .30650714874402762189e-1, -.34999369144476467749e-1, .39010960357087507670e-1, -.42646854695899611372e-1, .45872036510847994332e-1, -.48655445537990983379e-1, .50970276026831042415e-1, -.52794234894345577483e-1, .54109756419563083153e-1, -.54904171411058497973e-1, .27584914609096156163e-1, .13794141262469565740e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .27588282524939131481e-1, -.27588282524939131481e-1, .13794141262469565740e-1 }; static const double Tleft[33 * 33] = { 1., -.86602540378443864678, 0., .33071891388307382381, 0., -.20728904939721249057, 0., .15128841196122722208, 0., -.11918864298744029244, 0., .98352013661686631224e-1, 0., -.83727065404940845733e-1, 0., .72893399403505841203e-1, 0., -.64544632643375022436e-1, 0., .57913170372415565639e-1, 0., -.52518242575729562263e-1, 0., .48043311993977520457e-1, 0., -.44271433659733990243e-1, 0., .41048928022856771981e-1, 0., -.38263878662008271459e-1, 0., .35832844026365304501e-1, 0., 0., .50000000000000000000, -.96824583655185422130, .57282196186948000082, .21650635094610966169, -.35903516540862679125, -.97578093724974971969e-1, .26203921611325660506, .55792409597991015609e-1, -.20644078533943456204, -.36172381205961199479e-1, .17035068468874958194, .25371838001497225980e-1, -.14501953125000000000, -.18786835250972344757e-1, .12625507130328301066, .14473795929590520582e-1, -.11179458309419422675, -.11494434254897626155e-1, .10030855351241635862, .93498556820544479096e-2, -.90964264465390582629e-1, -.77546391824364392762e-2, .83213457337452292745e-1, .65358085945588638605e-2, -.76680372422574234569e-1, -.55835321940047427169e-2, .71098828931825789428e-1, .48253327982967591019e-2, -.66274981937248958553e-1, -.42118078245337801387e-2, .62064306433355646267e-1, .37083386598903548973e-2, 0., 0., .25000000000000000000, -.73950997288745200531, .83852549156242113615, -.23175620272173946716, -.37791833195149451496, .25710129174850522325, .21608307321780204633, -.22844049245646009157, -.14009503000335388415, .19897685605518413847, .98264706042471226893e-1, -.17445445004279014046, -.72761100054958328401e-1, .15463589893742108388, .56056770591708784481e-1, -.13855313872640495158, -.44517752443294564781e-1, .12534277657695128850, .36211835346039665762e-1, -.11434398255136139683, -.30033588409423828125e-1, .10506705408753910481, .25313077840725783008e-1, -.97149327637744872155e-1, -.21624927200393328444e-1, .90319582367202122625e-1, .18688433567711780666e-1, -.84372291635345108584e-1, -.16312261561845420752e-1, .79149526894804751586e-1, .14362333871852474757e-1, 0., 0., 0., .12500000000000000000, -.49607837082461073572, .82265291131801144317, -.59621200088559103072, -.80054302859059362371e-1, .42612156697795759420, -.90098145270865592887e-1, -.29769623255090078484, .13630307904779758221, .21638835185708931831, -.14600247270306082052, -.16348801804014290453, .14340708728599057249, .12755243353979286190, -.13661523715071346961, -.10215585947881057394, .12864248070157166547, .83592528025348693602e-1, -.12066728689302565222, -.69633728678718053052e-1, .11314245177331919532, .58882939251410088028e-1, -.10621835858758221487, -.50432266865187597572e-1, .99916834723527771581e-1, .43672094283057258509e-1, -.94206380251950852413e-1, -.38181356812697746418e-1, .89035739656537771225e-1, .33661934598216332678e-1, 0., 0., 0., 0., .62500000000000000000e-1, -.31093357409581873586, .67604086414949799246, -.75644205980613611039, .28990586430124175741, .30648508196770360914, -.35801372616842500052, -.91326869828709014708e-1, .31127929687500000000, -.90915752838698393094e-2, -.25637381283965534330, .57601077850322797594e-1, .21019685709225757945, -.81244992138514014256e-1, -.17375078516720988858, .92289437277967051125e-1, .14527351914265391374, -.96675340792832019889e-1, -.12289485697108543415, .97448175340011084006e-1, .10511755943298339844, -.96242247086378239657e-1, -.90822942272780513537e-1, .93966350452322132384e-1, .79189411876493712558e-1, -.91139307067989309325e-1, -.69613039934383197265e-1, .88062491671135767870e-1, .61646331729340817494e-1, 0., 0., 0., 0., 0., .31250000000000000000e-1, -.18684782411095934408, .50176689760410660236, -.74784031498626095398, .56472001151566251186, .14842464993721351203e-1, -.41162920273003120936, .20243071230196532282, .23772054897172750436, -.24963810923972235950, -.12116179938394678936, .24330535483519110663, .47903849781124471359e-1, -.22133299683101224293, -.20542915138527200983e-2, .19653465717678146728, -.26818172626509178444e-1, -.17319122357631210944, .45065391411065545445e-1, .15253391395444065941, -.56543897711725408302e-1, -.13469154928743585367, .63632471400208840155e-1, .11941684923913523817, -.67828850207933293098e-1, -.10636309084510652670, .70095786922999181504e-1, .95187373095150709082e-1, 0., 0., 0., 0., 0., 0., .15625000000000000000e-1, -.10909562534194485289, .34842348626527747318, -.64461114561628111443, .69382480527334683659, -.29551102358528827763, -.25527584713978439819, .38878771718544715394, -.82956185835347407489e-2, -.31183177761966943912, .12831420840372374767, .22067618205599434368, -.17569196937129496961, -.14598057000132284135, .18864406621763419484, .89921002550386645767e-1, -.18571835020187122114, -.48967672227195481777e-1, .17584685670380332798, .19267984545067426324e-1, -.16335437520503462738, .22598055455032407594e-2, .15032800884170631129, -.17883358353754640871e-1, -.13774837869432209951, .29227555960587143675e-1, .12604194747513151053, 0., 0., 0., 0., 0., 0., 0., .78125000000000000000e-2, -.62377810244809812496e-1, .23080781467370883845, -.50841310636012325368, .69834547012574056043, -.52572723156526459672, .11464215704954976471e-1, .38698869011491210342, -.26125646622255207507, -.16951698812361607510, .29773875898928782269, .20130501202570367491e-1, -.26332493149159310198, .67734613690401207009e-1, .21207315477103762715, -.11541543390889415193, -.16249634759782417533, .13885887405041735068, .11996491328010275427, -.14810432001630926895, -.85177658352556243411e-1, .14918860659904380587, .57317789510444151564e-1, -.14569827645586660151, -.35213090145965327390e-1, .13975998126844578198, 0., 0., 0., 0., 0., 0., 0., 0., .39062500000000000000e-2, -.35101954600803571207e-1, .14761284084133737720, -.37655033076080192966, .62410290231517322776, -.64335622317683389875, .28188168266139524244, .22488495672137010675, -.39393811089283576186, .75184777995770096714e-1, .28472023119398293003, -.20410910833705899572, -.15590046962908511750, .23814567544617953125, .54442805556829031204e-1, -.22855930338589720954, .16303223615756629897e-1, .20172722433875559213, -.62723406421217419404e-1, -.17012230831020922010, .91754642766136561612e-1, .13927644821381121197, -.10886600968068418181, -.11139075654373395292, .11797455976331702879, 0., 0., 0., 0., 0., 0., 0., 0., 0., .19531250000000000000e-2, -.19506820659607596598e-1, .91865676095362231937e-1, -.26604607809696493849, .51425874205091288223, -.66047561132505329292, .48660109511591303851, -.17575661168678285615e-1, -.36594333408055703366, .29088854695378694533, .11318677346656537927, -.31110645235730182168, .60733219161008787341e-1, .24333848233620420826, -.15254312332655419708, -.15995968483455388613, .19010344455215289289, .86040636766440260000e-1, -.19652589954665259945, -.27633388517205837713e-1, .18660848552712880387, -.15942583868416775867e-1, -.16902042462382064786, .47278526495327740646e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .97656250000000000000e-3, -.10731084460857378207e-1, .55939644713816406331e-1, -.18118487371914493668, .39914857299829864263, -.60812322949933902435, .60011887183061967583, -.26002695805835928795, -.20883922404786010096, .38988130966114638081, -.11797833550782589082, -.25231824756239520077, .24817859972953934712, .90516417677868996417e-1, -.26079073291293066798, .30259468817169480161e-1, .22178195264114178432, -.10569877864302048175, -.16679648389266977455, .14637718550245050850, .11219272032739559870, -.16359363640525750353, -.64358194509092101393e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .48828125000000000000e-3, -.58542865274813470967e-2, .33461741635290096452e-1, -.11979993155896201271, .29580223766987206958, -.51874761979436016742, .62861483498014306968, -.44868895761051453296, .12567502628371529386e-1, .35040366183235474275, -.30466868455569500886, -.70903913601490112666e-1, .30822791893032512740, -.11969443264190207736, -.20764760317621313946, .20629838355452128532, .95269702915334718507e-1, -.22432624768705133300, -.33103381593477797101e-2, .20570036048155716333, -.62208282720094518964e-1, -.17095309330441436348, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .24414062500000000000e-3, -.31714797501871532475e-2, .19721062526127334100e-1, -.77311181185536498246e-1, .21124871792841566575, -.41777980401893650886, .59401977834943551650, -.56132417807488349048, .23433675061367565951, .20222775295220942126, -.38280372496506190127, .14443804214023095767, .22268950939178466797, -.27211314150777981984, -.34184876506180717313e-1, .26006498895669734842, -.97650425186005090107e-1, -.19024527660129101293, .16789164198044635671, .10875811641651905252, -.19276785058805921298, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .12207031250000000000e-3, -.17078941137247586143e-2, .11477733754843910060e-1, -.48887017020924625462e-1, .14634927241421789683, -.32156282683019547854, .52165811920227223937, -.60001958466396926460, .41208501541480733755, -.11366945503190350975e-2, -.33968093962672089159, .30955190935923386766, .40657421856578262210e-1, -.29873400409871531764, .16094481791768257440, .16876122436206497694, -.23650217045022161255, -.33070260090574765012e-1, .22985258456375907796, -.68645651043827097771e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .61035156250000000000e-4, -.91501857608428649078e-3, .66085179496951987952e-2, -.30383171695850355404e-1, .98840838845366876117e-1, -.23855447246420318989, .43322017468145613917, -.58049033744876107191, .52533893203742699346, -.20681056202371946180, -.20180000924562504384, .37503922291962681797, -.15988102869837429062, -.19823558102762374094, .28393023878803799622, -.11188133439357510403e-1, -.24730368377168229255, .14731529061377942839, .14878558042884266021, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .30517578125000000000e-4, -.48804277318479845551e-3, .37696080990601968396e-2, -.18603912108994738255e-1, .65325006755649582964e-1, -.17162960707938819795, .34411527956476971322, -.52289350347082497959, .57319653625674910592, -.37662253421045430413, -.14099055105384663902e-1, .33265570610216904208, -.30921265572647566661, -.19911390594166455281e-1, .28738590811031797718, -.18912130469738472647, -.13235936203215819193, .25076406142356675279, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .15258789062500000000e-4, -.25928719280954633249e-3, .21327398937568540428e-2, -.11244626133630732010e-1, .42375605740664331966e-1, -.12031130345907846211, .26352562258934426830, -.44590628258512682078, .56682835613700749379, -.49116715128261660395, .17845943097110339078, .20541650677432497477, -.36739803642257458221, .16776034069210108273, .17920950989905112908, -.28867732805385066532, .46473465543376206337e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .76293945312500000000e-5, -.13727610943181290891e-3, .11979683091449349286e-2, -.67195313034570709806e-2, .27044920779931968175e-1, -.82472196498517457862e-1, .19570475044896150093, -.36391620788543817693, .52241392782736588032, -.54727504974907879912, .34211551468813581183, .31580472732719957762e-1, -.32830006549176759667, .30563797665254420769, .64905014620683140120e-2, -.27642986248995073032, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .38146972656250000000e-5, -.72454147007837596854e-4, .66859847582761390285e-3, -.39751311980366118437e-2, .17015198650201528366e-1, -.55443621868993855715e-1, .14157060481641692131, -.28641242619559616836, .45610665490966615415, -.55262786406029265394, .45818352706035500108, -.14984403004611673047, -.21163807462970713245, .36007252928843413718, -.17030961385712954159, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .19073486328125000000e-5, -.38135049864067468562e-4, .37101393638555730015e-3, -.23305339886279723213e-2, .10569913448297127219e-1, -.36640175162216897547e-1, .10010476414320235508, -.21860074212675559892, .38124757096345313719, -.52020999209879669177, .52172632730659212045, -.30841620620308814614, -.50322546186721500184e-1, .32577618885114899053, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .95367431640625000000e-6, -.20021483206955925244e-4, .20481807322420625431e-3, -.13553476938058909882e-2, .64919676350791905019e-2, -.23848725425069251903e-1, .69384632678886421292e-1, -.16249711393618776934, .30736618106830314788, -.46399909601971539157, .53765031034002467225, -.42598991476520183929, .12130445348350215652, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .47683715820312500000e-6, -.10487707828484902486e-4, .11254146162337528943e-3, -.78248929534271987118e-3, .39468337145306794566e-2, -.15313546659475671763e-1, .47249070825218564146e-1, -.11804374107101480543, .24031796927792491122, -.39629215049166341285, .51629108968402548545, -.49622372075429782915, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .23841857910156250000e-6, -.54823314130625337326e-5, .61575377321535518154e-4, -.44877834366497538134e-3, .23774612048621955857e-2, -.97136347645161687796e-2, .31671599547606636717e-1, -.84028665767000747480e-1, .18298487576742964949, -.32647878537696945218, .46970971486488895077, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .11920928955078125000e-6, -.28604020001177375838e-5, .33559227978295551013e-4, -.25583821662860610560e-3, .14201552747787302339e-2, -.60938046986874414969e-2, .20930869247951926793e-1, -.58745021125678072911e-1, .13613725780285953720, -.26083988356030237586, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .59604644775390625000e-7, -.14898180663526043291e-5, .18224991282807693921e-4, -.14504433444608833821e-3, .84184722720281809548e-3, -.37846965430000478789e-2, .13656355548211376864e-1, -.40409541997718853934e-1, .99226988101858325902e-1, 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., .29802322387695312500e-7, -.77471708843445529468e-6, .98649879372606876995e-5, -.81814934772838523887e-4, .49554483992403011328e-3, -.23290922072351413938e-2, .88068134250844034186e-2, -.27393666952485719070e-1, 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., .14901161193847656250e-7, -.40226235946098233685e-6, .53236418690561306700e-5, -.45933829691164002269e-4, .28982005232838857913e-3, -.14212974043211018374e-2, .56192363087488842264e-2, 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., .74505805969238281250e-8, -.20858299254133430408e-6, .28648457300134381744e-5, -.25677535898258910850e-4, .16849420429491355445e-3, -.86062824010315834002e-3, 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., .37252902984619140625e-8, -.10801736017613096861e-6, .15376606719887104015e-5, -.14296523739727437959e-4, .97419023656050887203e-4, 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., .18626451492309570312e-8, -.55871592916438890146e-7, .82331193828137454068e-6, -.79302250528382787666e-5, 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., .93132257461547851562e-9, -.28867244235852488244e-7, .43982811713864556957e-6, 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., .46566128730773925781e-9, -.14899342093408253335e-7, 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., .23283064365386962891e-9 }; static const double Tright[33 * 33] = { 1., .86602540378443864678, 0., -.33071891388307382381, 0., .20728904939721249057, 0., -.15128841196122722208, 0., .11918864298744029244, 0., -.98352013661686631224e-1, 0., .83727065404940845733e-1, 0., -.72893399403505841203e-1, 0., .64544632643375022436e-1, 0., -.57913170372415565639e-1, 0., .52518242575729562263e-1, 0., -.48043311993977520457e-1, 0., .44271433659733990243e-1, 0., -.41048928022856771981e-1, 0., .38263878662008271459e-1, 0., -.35832844026365304501e-1, 0., 0., .50000000000000000000, .96824583655185422130, .57282196186948000082, -.21650635094610966169, -.35903516540862679125, .97578093724974971969e-1, .26203921611325660506, -.55792409597991015609e-1, -.20644078533943456204, .36172381205961199479e-1, .17035068468874958194, -.25371838001497225980e-1, -.14501953125000000000, .18786835250972344757e-1, .12625507130328301066, -.14473795929590520582e-1, -.11179458309419422675, .11494434254897626155e-1, .10030855351241635862, -.93498556820544479096e-2, -.90964264465390582629e-1, .77546391824364392762e-2, .83213457337452292745e-1, -.65358085945588638605e-2, -.76680372422574234569e-1, .55835321940047427169e-2, .71098828931825789428e-1, -.48253327982967591019e-2, -.66274981937248958553e-1, .42118078245337801387e-2, .62064306433355646267e-1, -.37083386598903548973e-2, 0., 0., .25000000000000000000, .73950997288745200531, .83852549156242113615, .23175620272173946716, -.37791833195149451496, -.25710129174850522325, .21608307321780204633, .22844049245646009157, -.14009503000335388415, -.19897685605518413847, .98264706042471226893e-1, .17445445004279014046, -.72761100054958328401e-1, -.15463589893742108388, .56056770591708784481e-1, .13855313872640495158, -.44517752443294564781e-1, -.12534277657695128850, .36211835346039665762e-1, .11434398255136139683, -.30033588409423828125e-1, -.10506705408753910481, .25313077840725783008e-1, .97149327637744872155e-1, -.21624927200393328444e-1, -.90319582367202122625e-1, .18688433567711780666e-1, .84372291635345108584e-1, -.16312261561845420752e-1, -.79149526894804751586e-1, .14362333871852474757e-1, 0., 0., 0., .12500000000000000000, .49607837082461073572, .82265291131801144317, .59621200088559103072, -.80054302859059362371e-1, -.42612156697795759420, -.90098145270865592887e-1, .29769623255090078484, .13630307904779758221, -.21638835185708931831, -.14600247270306082052, .16348801804014290453, .14340708728599057249, -.12755243353979286190, -.13661523715071346961, .10215585947881057394, .12864248070157166547, -.83592528025348693602e-1, -.12066728689302565222, .69633728678718053052e-1, .11314245177331919532, -.58882939251410088028e-1, -.10621835858758221487, .50432266865187597572e-1, .99916834723527771581e-1, -.43672094283057258509e-1, -.94206380251950852413e-1, .38181356812697746418e-1, .89035739656537771225e-1, -.33661934598216332678e-1, 0., 0., 0., 0., .62500000000000000000e-1, .31093357409581873586, .67604086414949799246, .75644205980613611039, .28990586430124175741, -.30648508196770360914, -.35801372616842500052, .91326869828709014708e-1, .31127929687500000000, .90915752838698393094e-2, -.25637381283965534330, -.57601077850322797594e-1, .21019685709225757945, .81244992138514014256e-1, -.17375078516720988858, -.92289437277967051125e-1, .14527351914265391374, .96675340792832019889e-1, -.12289485697108543415, -.97448175340011084006e-1, .10511755943298339844, .96242247086378239657e-1, -.90822942272780513537e-1, -.93966350452322132384e-1, .79189411876493712558e-1, .91139307067989309325e-1, -.69613039934383197265e-1, -.88062491671135767870e-1, .61646331729340817494e-1, 0., 0., 0., 0., 0., .31250000000000000000e-1, .18684782411095934408, .50176689760410660236, .74784031498626095398, .56472001151566251186, -.14842464993721351203e-1, -.41162920273003120936, -.20243071230196532282, .23772054897172750436, .24963810923972235950, -.12116179938394678936, -.24330535483519110663, .47903849781124471359e-1, .22133299683101224293, -.20542915138527200983e-2, -.19653465717678146728, -.26818172626509178444e-1, .17319122357631210944, .45065391411065545445e-1, -.15253391395444065941, -.56543897711725408302e-1, .13469154928743585367, .63632471400208840155e-1, -.11941684923913523817, -.67828850207933293098e-1, .10636309084510652670, .70095786922999181504e-1, -.95187373095150709082e-1, 0., 0., 0., 0., 0., 0., .15625000000000000000e-1, .10909562534194485289, .34842348626527747318, .64461114561628111443, .69382480527334683659, .29551102358528827763, -.25527584713978439819, -.38878771718544715394, -.82956185835347407489e-2, .31183177761966943912, .12831420840372374767, -.22067618205599434368, -.17569196937129496961, .14598057000132284135, .18864406621763419484, -.89921002550386645767e-1, -.18571835020187122114, .48967672227195481777e-1, .17584685670380332798, -.19267984545067426324e-1, -.16335437520503462738, -.22598055455032407594e-2, .15032800884170631129, .17883358353754640871e-1, -.13774837869432209951, -.29227555960587143675e-1, .12604194747513151053, 0., 0., 0., 0., 0., 0., 0., .78125000000000000000e-2, .62377810244809812496e-1, .23080781467370883845, .50841310636012325368, .69834547012574056043, .52572723156526459672, .11464215704954976471e-1, -.38698869011491210342, -.26125646622255207507, .16951698812361607510, .29773875898928782269, -.20130501202570367491e-1, -.26332493149159310198, -.67734613690401207009e-1, .21207315477103762715, .11541543390889415193, -.16249634759782417533, -.13885887405041735068, .11996491328010275427, .14810432001630926895, -.85177658352556243411e-1, -.14918860659904380587, .57317789510444151564e-1, .14569827645586660151, -.35213090145965327390e-1, -.13975998126844578198, 0., 0., 0., 0., 0., 0., 0., 0., .39062500000000000000e-2, .35101954600803571207e-1, .14761284084133737720, .37655033076080192966, .62410290231517322776, .64335622317683389875, .28188168266139524244, -.22488495672137010675, -.39393811089283576186, -.75184777995770096714e-1, .28472023119398293003, .20410910833705899572, -.15590046962908511750, -.23814567544617953125, .54442805556829031204e-1, .22855930338589720954, .16303223615756629897e-1, -.20172722433875559213, -.62723406421217419404e-1, .17012230831020922010, .91754642766136561612e-1, -.13927644821381121197, -.10886600968068418181, .11139075654373395292, .11797455976331702879, 0., 0., 0., 0., 0., 0., 0., 0., 0., .19531250000000000000e-2, .19506820659607596598e-1, .91865676095362231937e-1, .26604607809696493849, .51425874205091288223, .66047561132505329292, .48660109511591303851, .17575661168678285615e-1, -.36594333408055703366, -.29088854695378694533, .11318677346656537927, .31110645235730182168, .60733219161008787341e-1, -.24333848233620420826, -.15254312332655419708, .15995968483455388613, .19010344455215289289, -.86040636766440260000e-1, -.19652589954665259945, .27633388517205837713e-1, .18660848552712880387, .15942583868416775867e-1, -.16902042462382064786, -.47278526495327740646e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .97656250000000000000e-3, .10731084460857378207e-1, .55939644713816406331e-1, .18118487371914493668, .39914857299829864263, .60812322949933902435, .60011887183061967583, .26002695805835928795, -.20883922404786010096, -.38988130966114638081, -.11797833550782589082, .25231824756239520077, .24817859972953934712, -.90516417677868996417e-1, -.26079073291293066798, -.30259468817169480161e-1, .22178195264114178432, .10569877864302048175, -.16679648389266977455, -.14637718550245050850, .11219272032739559870, .16359363640525750353, -.64358194509092101393e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .48828125000000000000e-3, .58542865274813470967e-2, .33461741635290096452e-1, .11979993155896201271, .29580223766987206958, .51874761979436016742, .62861483498014306968, .44868895761051453296, .12567502628371529386e-1, -.35040366183235474275, -.30466868455569500886, .70903913601490112666e-1, .30822791893032512740, .11969443264190207736, -.20764760317621313946, -.20629838355452128532, .95269702915334718507e-1, .22432624768705133300, -.33103381593477797101e-2, -.20570036048155716333, -.62208282720094518964e-1, .17095309330441436348, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .24414062500000000000e-3, .31714797501871532475e-2, .19721062526127334100e-1, .77311181185536498246e-1, .21124871792841566575, .41777980401893650886, .59401977834943551650, .56132417807488349048, .23433675061367565951, -.20222775295220942126, -.38280372496506190127, -.14443804214023095767, .22268950939178466797, .27211314150777981984, -.34184876506180717313e-1, -.26006498895669734842, -.97650425186005090107e-1, .19024527660129101293, .16789164198044635671, -.10875811641651905252, -.19276785058805921298, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .12207031250000000000e-3, .17078941137247586143e-2, .11477733754843910060e-1, .48887017020924625462e-1, .14634927241421789683, .32156282683019547854, .52165811920227223937, .60001958466396926460, .41208501541480733755, .11366945503190350975e-2, -.33968093962672089159, -.30955190935923386766, .40657421856578262210e-1, .29873400409871531764, .16094481791768257440, -.16876122436206497694, -.23650217045022161255, .33070260090574765012e-1, .22985258456375907796, .68645651043827097771e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .61035156250000000000e-4, .91501857608428649078e-3, .66085179496951987952e-2, .30383171695850355404e-1, .98840838845366876117e-1, .23855447246420318989, .43322017468145613917, .58049033744876107191, .52533893203742699346, .20681056202371946180, -.20180000924562504384, -.37503922291962681797, -.15988102869837429062, .19823558102762374094, .28393023878803799622, .11188133439357510403e-1, -.24730368377168229255, -.14731529061377942839, .14878558042884266021, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .30517578125000000000e-4, .48804277318479845551e-3, .37696080990601968396e-2, .18603912108994738255e-1, .65325006755649582964e-1, .17162960707938819795, .34411527956476971322, .52289350347082497959, .57319653625674910592, .37662253421045430413, -.14099055105384663902e-1, -.33265570610216904208, -.30921265572647566661, .19911390594166455281e-1, .28738590811031797718, .18912130469738472647, -.13235936203215819193, -.25076406142356675279, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .15258789062500000000e-4, .25928719280954633249e-3, .21327398937568540428e-2, .11244626133630732010e-1, .42375605740664331966e-1, .12031130345907846211, .26352562258934426830, .44590628258512682078, .56682835613700749379, .49116715128261660395, .17845943097110339078, -.20541650677432497477, -.36739803642257458221, -.16776034069210108273, .17920950989905112908, .28867732805385066532, .46473465543376206337e-1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .76293945312500000000e-5, .13727610943181290891e-3, .11979683091449349286e-2, .67195313034570709806e-2, .27044920779931968175e-1, .82472196498517457862e-1, .19570475044896150093, .36391620788543817693, .52241392782736588032, .54727504974907879912, .34211551468813581183, -.31580472732719957762e-1, -.32830006549176759667, -.30563797665254420769, .64905014620683140120e-2, .27642986248995073032, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .38146972656250000000e-5, .72454147007837596854e-4, .66859847582761390285e-3, .39751311980366118437e-2, .17015198650201528366e-1, .55443621868993855715e-1, .14157060481641692131, .28641242619559616836, .45610665490966615415, .55262786406029265394, .45818352706035500108, .14984403004611673047, -.21163807462970713245, -.36007252928843413718, -.17030961385712954159, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .19073486328125000000e-5, .38135049864067468562e-4, .37101393638555730015e-3, .23305339886279723213e-2, .10569913448297127219e-1, .36640175162216897547e-1, .10010476414320235508, .21860074212675559892, .38124757096345313719, .52020999209879669177, .52172632730659212045, .30841620620308814614, -.50322546186721500184e-1, -.32577618885114899053, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .95367431640625000000e-6, .20021483206955925244e-4, .20481807322420625431e-3, .13553476938058909882e-2, .64919676350791905019e-2, .23848725425069251903e-1, .69384632678886421292e-1, .16249711393618776934, .30736618106830314788, .46399909601971539157, .53765031034002467225, .42598991476520183929, .12130445348350215652, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .47683715820312500000e-6, .10487707828484902486e-4, .11254146162337528943e-3, .78248929534271987118e-3, .39468337145306794566e-2, .15313546659475671763e-1, .47249070825218564146e-1, .11804374107101480543, .24031796927792491122, .39629215049166341285, .51629108968402548545, .49622372075429782915, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .23841857910156250000e-6, .54823314130625337326e-5, .61575377321535518154e-4, .44877834366497538134e-3, .23774612048621955857e-2, .97136347645161687796e-2, .31671599547606636717e-1, .84028665767000747480e-1, .18298487576742964949, .32647878537696945218, .46970971486488895077, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .11920928955078125000e-6, .28604020001177375838e-5, .33559227978295551013e-4, .25583821662860610560e-3, .14201552747787302339e-2, .60938046986874414969e-2, .20930869247951926793e-1, .58745021125678072911e-1, .13613725780285953720, .26083988356030237586, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., .59604644775390625000e-7, .14898180663526043291e-5, .18224991282807693921e-4, .14504433444608833821e-3, .84184722720281809548e-3, .37846965430000478789e-2, .13656355548211376864e-1, .40409541997718853934e-1, .99226988101858325902e-1, 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., .29802322387695312500e-7, .77471708843445529468e-6, .98649879372606876995e-5, .81814934772838523887e-4, .49554483992403011328e-3, .23290922072351413938e-2, .88068134250844034186e-2, .27393666952485719070e-1, 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., .14901161193847656250e-7, .40226235946098233685e-6, .53236418690561306700e-5, .45933829691164002269e-4, .28982005232838857913e-3, .14212974043211018374e-2, .56192363087488842264e-2, 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., .74505805969238281250e-8, .20858299254133430408e-6, .28648457300134381744e-5, .25677535898258910850e-4, .16849420429491355445e-3, .86062824010315834002e-3, 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., .37252902984619140625e-8, .10801736017613096861e-6, .15376606719887104015e-5, .14296523739727437959e-4, .97419023656050887203e-4, 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., .18626451492309570312e-8, .55871592916438890146e-7, .82331193828137454068e-6, .79302250528382787666e-5, 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., .93132257461547851562e-9, .28867244235852488244e-7, .43982811713864556957e-6, 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., .46566128730773925781e-9, .14899342093408253335e-7, 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., .23283064365386962891e-9 }; gsl-doc-2.3/integration/util.c0000664000175000017500000000714012616157443014441 0ustar eddedd/* integration/util.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/integration/err.c0000664000175000017500000000315012616157443014251 0ustar eddedd/* integration/err.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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 ; } gsl-doc-2.3/integration/qmomof.c0000664000175000017500000002144112616157443014762 0ustar eddedd/* integration/qmomof.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/integration/set_initial.c0000664000175000017500000000054612616157443015773 0ustar eddeddstatic 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; } gsl-doc-2.3/integration/qags.c0000664000175000017500000003254012616157443014421 0ustar eddedd/* integration/qags.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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 achieved 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); } } gsl-doc-2.3/integration/cquad.c0000664000175000017500000003776312616157443014577 0ustar eddedd/* integration/cquad.c * * Copyright (C) 2010 Pedro Gonnet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "cquad_const.c" /* Allocates a workspace for the given maximum number of intervals. Note that if the workspace gets filled, the intervals with the lowest error estimates are dropped. The maximum number of intervals is therefore not the maximum number of intervals that will be computed, but merely the size of the buffer. */ gsl_integration_cquad_workspace * gsl_integration_cquad_workspace_alloc (const size_t n) { gsl_integration_cquad_workspace *w; /* Check inputs */ if (n < 3) GSL_ERROR_VAL ("workspace size n must be at least 3", GSL_EDOM, 0); /* Allocate first the workspace struct */ if ((w = (gsl_integration_cquad_workspace *) malloc (sizeof (gsl_integration_cquad_workspace))) == NULL) GSL_ERROR_VAL ("failed to allocate space for workspace struct", GSL_ENOMEM, 0); /* Allocate the intervals */ if ((w->ivals = (gsl_integration_cquad_ival *) malloc (sizeof (gsl_integration_cquad_ival) * n)) == NULL) { free (w); GSL_ERROR_VAL ("failed to allocate space for the intervals", GSL_ENOMEM, 0); } /* Allocate the max-heap indices */ if ((w->heap = (size_t *) malloc (sizeof (size_t) * n)) == NULL) { free (w->ivals); free (w); GSL_ERROR_VAL ("failed to allocate space for the heap", GSL_ENOMEM, 0); } /* Remember the size of the workspace */ w->size = n; /* Return the result */ return w; } /* Liberates the workspace memory. */ void gsl_integration_cquad_workspace_free (gsl_integration_cquad_workspace * w) { /* Nothing to be done? */ if (w == NULL) return; /* Free the intervals first */ if (w->ivals != NULL) free (w->ivals); /* Free the heap */ if (w->heap != NULL) free (w->heap); /* Free the structure */ free (w); } /* Compute the product of the fx with one of the inverse Vandermonde-like matrices. */ static void Vinvfx (const double *fx, double *c, const int d) { int i, j; switch (d) { case 0: for (i = 0; i <= 4; i++) { c[i] = 0.0; for (j = 0; j <= 4; j++) c[i] += V1inv[i * 5 + j] * fx[j * 8]; } break; case 1: for (i = 0; i <= 8; i++) { c[i] = 0.0; for (j = 0; j <= 8; j++) c[i] += V2inv[i * 9 + j] * fx[j * 4]; } break; case 2: for (i = 0; i <= 16; i++) { c[i] = 0.0; for (j = 0; j <= 16; j++) c[i] += V3inv[i * 17 + j] * fx[j * 2]; } break; case 3: for (i = 0; i <= 32; i++) { c[i] = 0.0; for (j = 0; j <= 32; j++) c[i] += V4inv[i * 33 + j] * fx[j]; } break; } } /* Downdate the interpolation given by the n coefficients c by removing the nodes with indices in nans. */ static void downdate (double *c, int n, int d, int *nans, int nnans) { static const int bidx[4] = { 0, 6, 16, 34 }; double b_new[34], alpha; int i, j; for (i = 0; i <= n + 1; i++) b_new[i] = bee[bidx[d] + i]; for (i = 0; i < nnans; i++) { b_new[n + 1] = b_new[n + 1] / Lalpha[n]; b_new[n] = (b_new[n] + xi[nans[i]] * b_new[n + 1]) / Lalpha[n - 1]; for (j = n - 1; j > 0; j--) b_new[j] = (b_new[j] + xi[nans[i]] * b_new[j + 1] - Lgamma[j + 1] * b_new[j + 2]) / Lalpha[j - 1]; for (j = 0; j <= n; j++) b_new[j] = b_new[j + 1]; alpha = c[n] / b_new[n]; for (j = 0; j < n; j++) c[j] -= alpha * b_new[j]; c[n] = 0; n--; } } /* The actual integration routine. */ int gsl_integration_cquad (const gsl_function * f, double a, double b, double epsabs, double epsrel, gsl_integration_cquad_workspace * ws, double *result, double *abserr, size_t * nevals) { /* Some constants that we will need. */ static const int n[4] = { 4, 8, 16, 32 }; static const int skip[4] = { 8, 4, 2, 1 }; static const int idx[4] = { 0, 5, 14, 31 }; static const double w = M_SQRT2 / 2; static const int ndiv_max = 20; /* Actual variables (as opposed to constants above). */ double m, h, temp; double igral, err, igral_final, err_final, err_excess; int nivals, neval = 0; int i, j, d, split, t; int nnans, nans[32]; gsl_integration_cquad_ival *iv, *ivl, *ivr; double nc, ncdiff; /* Check the input arguments. */ if (f == NULL) GSL_ERROR ("function pointer shouldn't be NULL", GSL_EINVAL); if (result == NULL) GSL_ERROR ("result pointer shouldn't be NULL", GSL_EINVAL); if (ws == NULL) GSL_ERROR ("workspace pointer shouldn't be NULL", GSL_EINVAL); /* Check for unreasonable accuracy demands */ if (epsabs < 0.0 || epsrel < 0.0) GSL_ERROR ("tolerances may not be negative", GSL_EBADTOL); if (epsabs <= 0 && epsrel < GSL_DBL_EPSILON) GSL_ERROR ("unreasonable accuracy requirement", GSL_EBADTOL); /* Create the first interval. */ iv = &(ws->ivals[0]); m = (a + b) / 2; h = (b - a) / 2; nnans = 0; for (i = 0; i <= n[3]; i++) { iv->fx[i] = GSL_FN_EVAL (f, m + xi[i] * h); neval++; if (!gsl_finite (iv->fx[i])) { nans[nnans++] = i; iv->fx[i] = 0.0; } } Vinvfx (iv->fx, &(iv->c[idx[0]]), 0); Vinvfx (iv->fx, &(iv->c[idx[3]]), 3); Vinvfx (iv->fx, &(iv->c[idx[2]]), 2); for (i = 0; i < nnans; i++) iv->fx[nans[i]] = GSL_NAN; iv->a = a; iv->b = b; iv->depth = 3; iv->rdepth = 1; iv->ndiv = 0; iv->igral = 2 * h * iv->c[idx[3]] * w; nc = 0.0; for (i = n[2] + 1; i <= n[3]; i++) { temp = iv->c[idx[3] + i]; nc += temp * temp; } ncdiff = nc; for (i = 0; i <= n[2]; i++) { temp = iv->c[idx[2] + i] - iv->c[idx[3] + i]; ncdiff += temp * temp; nc += iv->c[idx[3] + i] * iv->c[idx[3] + i]; } ncdiff = sqrt (ncdiff); nc = sqrt (nc); iv->err = ncdiff * 2 * h; if (ncdiff / nc > 0.1 && iv->err < 2 * h * nc) iv->err = 2 * h * nc; /* Initialize the heaps. */ for (i = 0; i < ws->size; i++) ws->heap[i] = i; /* Initialize some global values. */ igral = iv->igral; err = iv->err; nivals = 1; igral_final = 0.0; err_final = 0.0; err_excess = 0.0; /* Main loop. */ while (nivals > 0 && err > 0.0 && !(err <= fabs (igral) * epsrel || err <= epsabs) && !(err_final > fabs (igral) * epsrel && err - err_final < fabs (igral) * epsrel) && !(err_final > epsabs && err - err_final < epsabs)) { /* Put our finger on the interval with the largest error. */ iv = &(ws->ivals[ws->heap[0]]); m = (iv->a + iv->b) / 2; h = (iv->b - iv->a) / 2; /* printf ("cquad: processing ival %i (of %i) with [%e,%e] int=%e, err=%e, depth=%i\n", ws->heap[0], nivals, iv->a, iv->b, iv->igral, iv->err, iv->depth); */ /* Should we try to increase the degree? */ if (iv->depth < 3) { /* Keep tabs on some variables. */ d = ++iv->depth; /* Get the new (missing) function values */ for (i = skip[d]; i <= 32; i += 2 * skip[d]) { iv->fx[i] = GSL_FN_EVAL (f, m + xi[i] * h); neval++; } nnans = 0; for (i = 0; i <= 32; i += skip[d]) { if (!gsl_finite (iv->fx[i])) { nans[nnans++] = i; iv->fx[i] = 0.0; } } /* Compute the new coefficients. */ Vinvfx (iv->fx, &(iv->c[idx[d]]), d); /* Downdate any NaNs. */ if (nnans > 0) { downdate (&(iv->c[idx[d]]), n[d], d, nans, nnans); for (i = 0; i < nnans; i++) iv->fx[nans[i]] = GSL_NAN; } /* Compute the error estimate. */ nc = 0.0; for (i = n[d - 1] + 1; i <= n[d]; i++) { temp = iv->c[idx[d] + i]; nc += temp * temp; } ncdiff = nc; for (i = 0; i <= n[d - 1]; i++) { temp = iv->c[idx[d - 1] + i] - iv->c[idx[d] + i]; ncdiff += temp * temp; nc += iv->c[idx[d] + i] * iv->c[idx[d] + i]; } ncdiff = sqrt (ncdiff); nc = sqrt (nc); iv->err = ncdiff * 2 * h; /* Compute the local integral. */ iv->igral = 2 * h * w * iv->c[idx[d]]; /* Split the interval prematurely? */ split = (nc > 0 && ncdiff / nc > 0.1); } /* Maximum degree reached, just split. */ else { split = 1; } /* Should we drop this interval? */ if ((m + h * xi[0]) >= (m + h * xi[1]) || (m + h * xi[31]) >= (m + h * xi[32]) || iv->err < fabs (iv->igral) * GSL_DBL_EPSILON * 10) { /* printf ("cquad: dumping ival %i (of %i) with [%e,%e] int=%e, err=%e, depth=%i\n", ws->heap[0], nivals, iv->a, iv->b, iv->igral, iv->err, iv->depth); */ /* Keep this interval's contribution */ err_final += iv->err; igral_final += iv->igral; /* Swap with the last element on the heap */ t = ws->heap[nivals - 1]; ws->heap[nivals - 1] = ws->heap[0]; ws->heap[0] = t; nivals--; /* Fix up the heap */ i = 0; while (2 * i + 1 < nivals) { /* Get the kids */ j = 2 * i + 1; /* If the j+1st entry exists and is larger than the jth, use it instead. */ if (j + 1 < nivals && ws->ivals[ws->heap[j + 1]].err >= ws->ivals[ws->heap[j]].err) j++; /* Do we need to move the ith entry up? */ if (ws->ivals[ws->heap[j]].err <= ws->ivals[ws->heap[i]].err) break; else { t = ws->heap[j]; ws->heap[j] = ws->heap[i]; ws->heap[i] = t; i = j; } } } /* Do we need to split this interval? */ else if (split) { /* Some values we will need often... */ d = iv->depth; /* Generate the interval on the left */ ivl = &(ws->ivals[ws->heap[nivals++]]); ivl->a = iv->a; ivl->b = m; ivl->depth = 0; ivl->rdepth = iv->rdepth + 1; ivl->fx[0] = iv->fx[0]; ivl->fx[32] = iv->fx[16]; for (i = skip[0]; i < 32; i += skip[0]) { ivl->fx[i] = GSL_FN_EVAL (f, (ivl->a + ivl->b) / 2 + xi[i] * h / 2); neval++; } nnans = 0; for (i = 0; i <= 32; i += skip[0]) { if (!gsl_finite (ivl->fx[i])) { nans[nnans++] = i; ivl->fx[i] = 0.0; } } Vinvfx (ivl->fx, ivl->c, 0); if (nnans > 0) { downdate (ivl->c, n[0], 0, nans, nnans); for (i = 0; i < nnans; i++) ivl->fx[nans[i]] = GSL_NAN; } for (i = 0; i <= n[d]; i++) { ivl->c[idx[d] + i] = 0.0; for (j = i; j <= n[d]; j++) ivl->c[idx[d] + i] += Tleft[i * 33 + j] * iv->c[idx[d] + j]; } ncdiff = 0.0; for (i = 0; i <= n[0]; i++) { temp = ivl->c[i] - ivl->c[idx[d] + i]; ncdiff += temp * temp; } for (i = n[0] + 1; i <= n[d]; i++) { temp = ivl->c[idx[d] + i]; ncdiff += temp * temp; } ncdiff = sqrt (ncdiff); ivl->err = ncdiff * h; /* Check for divergence. */ ivl->ndiv = iv->ndiv + (fabs (iv->c[0]) > 0 && ivl->c[0] / iv->c[0] > 2); if (ivl->ndiv > ndiv_max && 2 * ivl->ndiv > ivl->rdepth) { /* need copysign(INFINITY, igral) */ *result = (igral >= 0) ? GSL_POSINF : GSL_NEGINF; if (nevals != NULL) *nevals = neval; return GSL_EDIVERGE; } /* Compute the local integral. */ ivl->igral = h * w * ivl->c[0]; /* Generate the interval on the right */ ivr = &(ws->ivals[ws->heap[nivals++]]); ivr->a = m; ivr->b = iv->b; ivr->depth = 0; ivr->rdepth = iv->rdepth + 1; ivr->fx[0] = iv->fx[16]; ivr->fx[32] = iv->fx[32]; for (i = skip[0]; i < 32; i += skip[0]) { ivr->fx[i] = GSL_FN_EVAL (f, (ivr->a + ivr->b) / 2 + xi[i] * h / 2); neval++; } nnans = 0; for (i = 0; i <= 32; i += skip[0]) { if (!gsl_finite (ivr->fx[i])) { nans[nnans++] = i; ivr->fx[i] = 0.0; } } Vinvfx (ivr->fx, ivr->c, 0); if (nnans > 0) { downdate (ivr->c, n[0], 0, nans, nnans); for (i = 0; i < nnans; i++) ivr->fx[nans[i]] = GSL_NAN; } for (i = 0; i <= n[d]; i++) { ivr->c[idx[d] + i] = 0.0; for (j = i; j <= n[d]; j++) ivr->c[idx[d] + i] += Tright[i * 33 + j] * iv->c[idx[d] + j]; } ncdiff = 0.0; for (i = 0; i <= n[0]; i++) { temp = ivr->c[i] - ivr->c[idx[d] + i]; ncdiff += temp * temp; } for (i = n[0] + 1; i <= n[d]; i++) { temp = ivr->c[idx[d] + i]; ncdiff += temp * temp; } ncdiff = sqrt (ncdiff); ivr->err = ncdiff * h; /* Check for divergence. */ ivr->ndiv = iv->ndiv + (fabs (iv->c[0]) > 0 && ivr->c[0] / iv->c[0] > 2); if (ivr->ndiv > ndiv_max && 2 * ivr->ndiv > ivr->rdepth) { /* need copysign(INFINITY, igral) */ *result = (igral >= 0) ? GSL_POSINF : GSL_NEGINF; if (nevals != NULL) *nevals = neval; return GSL_EDIVERGE; } /* Compute the local integral. */ ivr->igral = h * w * ivr->c[0]; /* Fix-up the heap: we now have one interval on top that we don't need any more and two new, unsorted ones at the bottom. */ /* Flip the last interval to the top of the heap and sift down. */ t = ws->heap[nivals - 1]; ws->heap[nivals - 1] = ws->heap[0]; ws->heap[0] = t; nivals--; /* Sift this interval back down the heap. */ i = 0; while (2 * i + 1 < nivals - 1) { j = 2 * i + 1; if (j + 1 < nivals - 1 && ws->ivals[ws->heap[j + 1]].err >= ws->ivals[ws->heap[j]].err) j++; if (ws->ivals[ws->heap[j]].err <= ws->ivals[ws->heap[i]].err) break; else { t = ws->heap[j]; ws->heap[j] = ws->heap[i]; ws->heap[i] = t; i = j; } } /* Now grab the last interval and sift it up the heap. */ i = nivals - 1; while (i > 0) { j = (i - 1) / 2; if (ws->ivals[ws->heap[j]].err < ws->ivals[ws->heap[i]].err) { t = ws->heap[j]; ws->heap[j] = ws->heap[i]; ws->heap[i] = t; i = j; } else break; } } /* Otherwise, just fix-up the heap. */ else { i = 0; while (2 * i + 1 < nivals) { j = 2 * i + 1; if (j + 1 < nivals && ws->ivals[ws->heap[j + 1]].err >= ws->ivals[ws->heap[j]].err) j++; if (ws->ivals[ws->heap[j]].err <= ws->ivals[ws->heap[i]].err) break; else { t = ws->heap[j]; ws->heap[j] = ws->heap[i]; ws->heap[i] = t; i = j; } } } /* If the heap is about to overflow, remove the last two intervals. */ while (nivals > ws->size - 2) { iv = &(ws->ivals[ws->heap[nivals - 1]]); /* printf ("cquad: dumping ival %i (of %i) with [%e,%e] int=%e, err=%e, depth=%i\n", ws->heap[0], nivals, iv->a, iv->b, iv->igral, iv->err, iv->depth); */ err_final += iv->err; igral_final += iv->igral; nivals--; } /* Collect the value of the integral and error. */ igral = igral_final; err = err_final; for (i = 0; i < nivals; i++) { igral += ws->ivals[ws->heap[i]].igral; err += ws->ivals[ws->heap[i]].err; } } /* Dump the contents of the heap. */ /* for (i = 0; i < nivals; i++) { iv = &(ws->ivals[ws->heap[i]]); printf ("cquad: ival %i (%i) with [%e,%e], int=%e, err=%e, depth=%i, rdepth=%i\n", i, ws->heap[i], iv->a, iv->b, iv->igral, iv->err, iv->depth, iv->rdepth); } */ /* Clean up and present the results. */ *result = igral; if (abserr != NULL) *abserr = err; if (nevals != NULL) *nevals = neval; /* All is well that ends well. */ return GSL_SUCCESS; } gsl-doc-2.3/integration/test.c0000664000175000017500000027013412616157443014450 0ustar eddedd/* integration/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #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-4,"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-2,"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) ; } /* Sanity check monomial test function for fixed Gauss-Legendre rules */ { struct monomial_params params; gsl_function f; f.function = &f_monomial; f.params = ¶ms; params.degree = 2; params.constant = 1.0; gsl_test_abs(GSL_FN_EVAL(&f, 2.0), 4.0, 8*GSL_DBL_EPSILON, "f_monomial sanity check 1"); params.degree = 1; params.constant = 2.0; gsl_test_abs(GSL_FN_EVAL(&f, 2.0), 4.0, 8*GSL_DBL_EPSILON, "f_monomial sanity check 2"); params.degree = 2; params.constant = 2.0; gsl_test_abs(integ_f_monomial(1.0, 2.0, ¶ms), (2.0/3.0)*(2.0*2.0*2.0 - 1.0*1.0*1.0), 8*GSL_DBL_EPSILON, "integ_f_monomial sanity check"); } /* Test the fixed-order Gauss-Legendre rules with a monomial. */ { int n; struct monomial_params params; gsl_function f; const double a = 0.0, b = 1.2; f.function = &f_monomial; f.params = ¶ms; params.constant = 1.0; for (n = 1; n < 1025; ++n) { double expected, result; gsl_integration_glfixed_table * tbl = gsl_integration_glfixed_table_alloc(n); params.degree = 2*n-1; /* n point rule exact for 2n-1 degree poly */ expected = integ_f_monomial(a, b, ¶ms); result = gsl_integration_glfixed(&f, a, b, tbl); if (tbl->precomputed) { gsl_test_rel(result, expected, 1.0e-12, "glfixed %d-point: Integrating (%g*x^%d) over [%g,%g]", n, params.constant, params.degree, a, b); } else { gsl_test_rel(result, expected, 1.0e-7, "glfixed %d-point: Integrating (%g*x^%d) over [%g,%g]", n, params.constant, params.degree, a, b); } gsl_integration_glfixed_table_free(tbl); } } /* Sanity check sin(x) test function for fixed Gauss-Legendre rules */ { gsl_function f = { f_sin, NULL }; gsl_test_abs(GSL_FN_EVAL(&f, 2.0), sin(2.0), 0.0, "f_sin sanity check 1"); gsl_test_abs(GSL_FN_EVAL(&f, 7.0), sin(7.0), 0.0, "f_sin sanity check 2"); gsl_test_abs(integ_f_sin(0.0, M_PI), 2.0, GSL_DBL_EPSILON, "integ_f_sin sanity check"); } /* Test the fixed-order Gauss-Legendre rules against sin(x) on [0, pi] */ { const int n_max = 1024; const gsl_function f = { f_sin, NULL }; const double a = 0.0, b = M_PI; const double expected = integ_f_sin(a, b); double result, abserr, prev_abserr = 0.0; int n; for (n = 1; n <= n_max; ++n) { gsl_integration_glfixed_table * const tbl = gsl_integration_glfixed_table_alloc(n); result = gsl_integration_glfixed(&f, a, b, tbl); abserr = fabs(expected - result); if (n == 1) { gsl_test_abs(result, GSL_FN_EVAL(&f,(b+a)/2)*(b-a), 0.0, "glfixed %d-point: behavior for n == 1", n); } else if (n < 9) { gsl_test(! (abserr < prev_abserr), "glfixed %d-point: observed drop in absolute error versus %d-points", n, n-1); } else if (tbl->precomputed) { gsl_test_abs(result, expected, 2.0 * n * GSL_DBL_EPSILON, "glfixed %d-point: very low absolute error for high precision coefficients", n); } else { gsl_test_abs(result, expected, 1.0e6 * GSL_DBL_EPSILON, "glfixed %d-point: acceptable absolute error for on-the-fly coefficients", n); } prev_abserr = abserr; gsl_integration_glfixed_table_free(tbl); } } /* Test some fixed-order Gauss-Legendre rule points and weights on [-1, 1] */ /* This verifies the (point, weight) retrieval API behaves sanely */ { const double eps = GSL_DBL_EPSILON; gsl_integration_glfixed_table *tbl; int n, i; double xi, wi; /* Analytical results for points and weights on [-1, 1] Pulled from http://en.wikipedia.org/wiki/Gaussian_quadrature Sorted in increasing order of Gauss points */ const double e1[1][2] = { {0, 2 } }; const double e2[2][2] = { {-1/sqrt(3), 1}, { 1/sqrt(3), 1} }; const double e3[3][2] = { {-sqrt(15)/5, 5./9}, { 0, 8./9}, { sqrt(15)/5, 5./9} }; const double e4[4][2] = { {-sqrt((3+2*sqrt(6./5))/7), (18-sqrt(30))/36}, {-sqrt((3-2*sqrt(6./5))/7), (18+sqrt(30))/36}, { sqrt((3-2*sqrt(6./5))/7), (18+sqrt(30))/36}, { sqrt((3+2*sqrt(6./5))/7), (18-sqrt(30))/36} }; const double e5[5][2] = { {-sqrt((5+2*sqrt(10./7)))/3, (322-13*sqrt(70))/900}, {-sqrt((5-2*sqrt(10./7)))/3, (322+13*sqrt(70))/900}, { 0, 128./225 }, { sqrt((5-2*sqrt(10./7)))/3, (322+13*sqrt(70))/900}, { sqrt((5+2*sqrt(10./7)))/3, (322-13*sqrt(70))/900} }; n = 1; tbl = gsl_integration_glfixed_table_alloc(n); for (i = 0; i < n; ++i) { gsl_integration_glfixed_point(-1, 1, i, &xi, &wi, tbl); gsl_test_abs(xi, e1[i][0], eps, "glfixed %d-point lookup: x(%d)", n, i); gsl_test_abs(wi, e1[i][1], eps, "glfixed %d-point lookup: w(%d)", n, i); } gsl_integration_glfixed_table_free(tbl); n = 2; tbl = gsl_integration_glfixed_table_alloc(n); for (i = 0; i < n; ++i) { gsl_integration_glfixed_point(-1, 1, i, &xi, &wi, tbl); gsl_test_abs(xi, e2[i][0], eps, "glfixed %d-point lookup: x(%d)", n, i); gsl_test_abs(wi, e2[i][1], eps, "glfixed %d-point lookup: w(%d)", n, i); } gsl_integration_glfixed_table_free(tbl); n = 3; tbl = gsl_integration_glfixed_table_alloc(n); for (i = 0; i < n; ++i) { gsl_integration_glfixed_point(-1, 1, i, &xi, &wi, tbl); gsl_test_abs(xi, e3[i][0], eps, "glfixed %d-point lookup: x(%d)", n, i); gsl_test_abs(wi, e3[i][1], eps, "glfixed %d-point lookup: w(%d)", n, i); } gsl_integration_glfixed_table_free(tbl); n = 4; tbl = gsl_integration_glfixed_table_alloc(n); for (i = 0; i < n; ++i) { gsl_integration_glfixed_point(-1, 1, i, &xi, &wi, tbl); gsl_test_abs(xi, e4[i][0], eps, "glfixed %d-point lookup: x(%d)", n, i); gsl_test_abs(wi, e4[i][1], eps, "glfixed %d-point lookup: w(%d)", n, i); } gsl_integration_glfixed_table_free(tbl); n = 5; tbl = gsl_integration_glfixed_table_alloc(n); for (i = 0; i < n; ++i) { gsl_integration_glfixed_point(-1, 1, i, &xi, &wi, tbl); gsl_test_abs(xi, e5[i][0], eps, "glfixed %d-point lookup: x(%d)", n, i); gsl_test_abs(wi, e5[i][1], eps, "glfixed %d-point lookup: w(%d)", n, i); } gsl_integration_glfixed_table_free(tbl); } /* Test some fixed-order Gauss-Legendre rule points and weights on [-2, 3] */ /* This verifies the (point, weight) retrieval API is okay on non-[-1,1] */ { gsl_integration_glfixed_table *tbl; double result, x, w; int i; /* Odd n = 3, f(x) = x**5 + x**4 + x**3 + x**2 + x**1 + 1 */ result = 0; tbl = gsl_integration_glfixed_table_alloc(3); for (i = 0; i < 3; ++i) { gsl_integration_glfixed_point(-2, 3, i, &x, &w, tbl); result += w * (1 + x*(1 + x*(1 + x*(1 + x*(1 + x))))); } gsl_test_rel(result, 805./4, 1e-8, "glfixed %d-point xi,wi eval", 3); gsl_integration_glfixed_table_free(tbl); /* Even n = 4, f(x) = x**7 + x**6 + x**5 + x**4 + x**3 + x**2 + x**1 + 1 */ result = 0; tbl = gsl_integration_glfixed_table_alloc(4); for (i = 0; i < 4; ++i) { gsl_integration_glfixed_point(-2, 3, i, &x, &w, tbl); result += w * (1 + x*(1 + x*(1 + x*(1 + x*(1 + x*(1 + x*(1 + x))))))); } gsl_test_rel(result, 73925./56, 1e-8, "glfixed %d-point xi,wi eval", 4); gsl_integration_glfixed_table_free(tbl); } { typedef double (*fptr) ( double , void * ); const static fptr funs[25] = { &cqf1 , &cqf2 , &cqf3 , &cqf4 , &cqf5 , &cqf6 , &cqf7 , &cqf8 , &cqf9 , &cqf10 , &cqf11 , &cqf12 , &cqf13 , &cqf14 , &cqf15 , &cqf16 , &cqf17 , &cqf18 , &cqf19 , &cqf20 , &cqf21 , &cqf22 , &cqf23 , &cqf24 , &cqf25 }; const static double ranges[50] = { 0, 1 , 0, 1 , 0, 1 , -1, 1 , -1, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 10 , 0, 10 , 0, 10 , 0, 1 , 0, M_PI , 0, 1 , -1, 1 , 0, 1 , 0, 1 , 0, 1 , 0, 3 , 0, 5 }; const static double f_exact[25] = { 1.7182818284590452354 , 0.7 , 2.0/3 , 0.4794282266888016674 , 1.5822329637296729331 , 0.4 , 2 , 0.86697298733991103757 , 1.1547005383792515290 , 0.69314718055994530942 , 0.3798854930417224753 , 0.77750463411224827640 , 0.49898680869304550249 , 0.5 , 1 , 0.13263071079267703209e+08 , 0.49898680869304550249 , 0.83867634269442961454 , -1 , 1.5643964440690497731 , 0.16349494301863722618 , -0.63466518254339257343 , 0.013492485649467772692 , 17.664383539246514971 , 7.5 }; double result, abserr; size_t neval; int fid; /* Loop over the functions... */ for ( fid = 0 ; fid < 25 ; fid++ ) { gsl_integration_cquad_workspace *ws = gsl_integration_cquad_workspace_alloc ( 200 ); gsl_function f = make_function(funs[fid], NULL); double exact = f_exact[fid]; /* Call our quadrature routine. */ int status = gsl_integration_cquad (&f, ranges[2*fid] , ranges[2*fid+1] , 0.0 , 1.0e-12 , ws , &result , &abserr , &neval); gsl_test_rel (result, exact, 1e-12, "cquad f%d", fid); gsl_test (fabs(result - exact) > 5.0 * abserr, "cquad f%d error (%g actual vs %g estimated)", fid, fabs(result-exact), abserr); gsl_test_int (status, GSL_SUCCESS, "cquad return code"); gsl_integration_cquad_workspace_free(ws); } } 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) ; } gsl-doc-2.3/multilarge_nlinear/0000755000175000017500000000000013022553154014635 5ustar eddeddgsl-doc-2.3/multilarge_nlinear/test_kowalik.c0000644000175000017500000001100012753424311017473 0ustar eddedd#define kowalik_N 11 #define kowalik_P 4 static double kowalik_x0[kowalik_P] = { 0.25, 0.39, 0.415, 0.39 }; static double kowalik_epsrel = 1.0e-7; static double kowalik_J[kowalik_N * kowalik_P]; static double kowalik_Y[kowalik_N] = { 0.1957, 0.1947, 0.1735, 0.1600, 0.0844, 0.0627, 0.0456, 0.0342, 0.0323, 0.0235, 0.0246 }; static double kowalik_U[kowalik_N] = { 4.0000, 2.0000, 1.0000, 0.5000, 0.2500, 0.1670, 0.1250, 0.1000, 0.0833, 0.0714, 0.0625 }; static void kowalik_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; gsl_vector_const_view v = gsl_vector_const_view_array(x, kowalik_P); const double norm = gsl_blas_dnrm2(&v.vector); const double sumsq_exact1 = 3.075056038492370e-04; const double kowalik_x1[kowalik_P] = { 1.928069345723978e-01, 1.912823290344599e-01, 1.230565070690708e-01, 1.360623308065148e-01 }; const double sumsq_exact2 = 0.00102734304869549252; const double kowalik_x2[kowalik_P] = { GSL_NAN, /* inf */ -14.0758834005984603, GSL_NAN, /* -inf */ GSL_NAN }; /* -inf */ const double *kowalik_x; double sumsq_exact; if (norm < 10.0) { kowalik_x = kowalik_x1; sumsq_exact = sumsq_exact1; } else { kowalik_x = kowalik_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kowalik_P; ++i) { if (!gsl_finite(kowalik_x[i])) continue; gsl_test_rel(x[i], kowalik_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kowalik_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double yi = kowalik_Y[i]; double ui = kowalik_U[i]; double fi = yi - (x1*ui*(ui+x2)) / (x4 + ui*(ui + x3)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kowalik_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(kowalik_J, kowalik_N, kowalik_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double ui = kowalik_U[i]; double term1 = ui*(ui + x2); double term2 = ui*(ui + x3) + x4; gsl_matrix_set(&J.matrix, i, 0, -term1 / term2); gsl_matrix_set(&J.matrix, i, 1, -ui*x1/term2); gsl_matrix_set(&J.matrix, i, 2, ui*term1*x1 / (term2*term2)); gsl_matrix_set(&J.matrix, i, 3, term1*x1 / (term2*term2)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kowalik_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double ui = kowalik_U[i]; double term2 = ui*(ui + x3) + x4; double term3 = ui*ui*v1 - ui*v3*x1 - v4*x1 + ui*v1*x3 + v1*x4; double term4 = ui*ui*(v3-v2) + v4*x2 + ui*(v4 + v3*x2 - v2*x3) - v2*x4; gsl_vector_set(fvv, i, 2.0*ui*term3*term4 / pow(term2, 3.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf kowalik_func = { kowalik_f, kowalik_df, kowalik_fvv, kowalik_N, kowalik_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem kowalik_problem = { "kowalik", kowalik_x0, NULL, &kowalik_epsrel, &kowalik_checksol, &kowalik_func }; gsl-doc-2.3/multilarge_nlinear/test_brown2.c0000644000175000017500000000727512753424243017272 0ustar eddedd#define brown2_N 5 #define brown2_P 5 static double brown2_x0[brown2_P] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; static double brown2_epsrel = 1.0e-12; static double brown2_J[brown2_N * brown2_P]; static void brown2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; double sumsq_exact; double alpha; const double p = (double) brown2_P; double alpha1mp, lhs, lastel; if (sumsq < 0.5) { /* sumsq = 0 case */ sumsq_exact = 0.0; alpha = x[0]; alpha1mp = pow(alpha, 1.0 - p); lhs = p*pow(alpha, p) - (p + 1)/alpha1mp; lastel = alpha1mp; gsl_test_rel(lhs, -1.0, epsrel, "%s/%s alpha lhs", sname, pname); } else { /* sumsq = 1 case */ sumsq_exact = 1.0; alpha = 0.0; lastel = p + 1.0; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < brown2_P - 1; ++i) { gsl_test_rel(x[i], alpha, epsrel, "%s/%s i=%zu", sname, pname, i); } gsl_test_rel(x[brown2_P - 1], lastel, epsrel, "%s/%s last element", sname, pname); } static int brown2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = -(brown2_N + 1.0); double prod = 1.0; for (i = 0; i < brown2_N; ++i) { double xi = gsl_vector_get(x, i); sum += xi; prod *= xi; } for (i = 0; i < brown2_N - 1; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi + sum); } gsl_vector_set(f, brown2_N - 1, prod - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown2_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(brown2_J, brown2_N, brown2_P); size_t i, j; for (j = 0; j < brown2_P; ++j) { double prod = 1.0; for (i = 0; i < brown2_N - 1; i++) { double Jij = (i == j) ? 2.0 : 1.0; gsl_matrix_set(&J.matrix, i, j, Jij); } for (i = 0; i < brown2_N; i++) { if (i != j) prod *= gsl_vector_get(x, i); } gsl_matrix_set(&J.matrix, brown2_N - 1, j, prod); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i, j, k; double sum = 0.0; gsl_vector_set_zero(fvv); for (k = 0; k < brown2_P; ++k) { double vk = gsl_vector_get(v, k); for (i = 0; i < brown2_P; ++i) { double vi = gsl_vector_get(v, i); double delta = (i == k) ? 1.0 : 0.0; double prod = 1.0; for (j = 0; j < brown2_N; ++j) { if (j != i && j != k) { double xj = gsl_vector_get(x, j); prod *= xj; } } sum += vk * vi * (1.0 - delta) * prod; } } gsl_vector_set(fvv, brown2_N - 1, sum); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf brown2_func = { brown2_f, brown2_df, brown2_fvv, brown2_N, brown2_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem brown2_problem = { "brown_almost_linear", brown2_x0, NULL, &brown2_epsrel, &brown2_checksol, &brown2_func }; gsl-doc-2.3/multilarge_nlinear/test_powell1.c0000644000175000017500000000650012753424345017435 0ustar eddedd#define powell1_N 4 #define powell1_P 4 static double powell1_x0[powell1_P] = { 3.0, -1.0, 0.0, 1.0 }; static double powell1_epsrel = 1.0e-4; static double powell1_J[powell1_N * powell1_P]; static void powell1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell1_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); gsl_vector_set(f, 0, x1 + 10.0*x2); gsl_vector_set(f, 1, sqrt(5.0) * (x3 - x4)); gsl_vector_set(f, 2, pow(x2 - 2.0*x3, 2.0)); gsl_vector_set(f, 3, sqrt(10.0) * pow((x1 - x4), 2.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(powell1_J, powell1_N, powell1_P); double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); double term1 = x2 - 2.0*x3; double term2 = x1 - x4; gsl_matrix_set(&J.matrix, 0, 0, 1.0); gsl_matrix_set(&J.matrix, 0, 1, 10.0); gsl_matrix_set(&J.matrix, 0, 2, 0.0); gsl_matrix_set(&J.matrix, 0, 3, 0.0); gsl_matrix_set(&J.matrix, 1, 0, 0.0); gsl_matrix_set(&J.matrix, 1, 1, 0.0); gsl_matrix_set(&J.matrix, 1, 2, sqrt(5.0)); gsl_matrix_set(&J.matrix, 1, 3, -sqrt(5.0)); gsl_matrix_set(&J.matrix, 2, 0, 0.0); gsl_matrix_set(&J.matrix, 2, 1, 2.0*term1); gsl_matrix_set(&J.matrix, 2, 2, -4.0*term1); gsl_matrix_set(&J.matrix, 2, 3, 0.0); gsl_matrix_set(&J.matrix, 3, 0, 2.0*sqrt(10.0)*term2); gsl_matrix_set(&J.matrix, 3, 1, 0.0); gsl_matrix_set(&J.matrix, 3, 2, 0.0); gsl_matrix_set(&J.matrix, 3, 3, -2.0*sqrt(10.0)*term2); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, 2.0 * pow(v2 - 2.0*v3, 2.0)); gsl_vector_set(fvv, 3, 2.0 * sqrt(10.0) * pow(v1 - v4, 2.0)); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf powell1_func = { powell1_f, powell1_df, powell1_fvv, powell1_N, powell1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem powell1_problem = { "powell_singular", powell1_x0, NULL, &powell1_epsrel, &powell1_checksol, &powell1_func }; gsl-doc-2.3/multilarge_nlinear/test_kirby2.c0000644000175000017500000001641612753424305017257 0ustar eddedd#define kirby2_N 151 #define kirby2_P 5 static double kirby2_x0a[kirby2_P] = { 2.0, -0.1, 0.003, -0.001, 0.00001 }; static double kirby2_x0b[kirby2_P] = { 1.5, -0.15, 0.0025, -0.0015, 0.00002 }; static double kirby2_x[kirby2_P] = { 1.6745063063E+00, -1.3927397867E-01, 2.5961181191E-03, -1.7241811870E-03, 2.1664802578E-05 }; static double kirby2_epsrel = 1.0e-5; static double kirby2_J[kirby2_N * kirby2_P]; static double kirby2_sigma[kirby2_P] = { 8.7989634338E-02, 4.1182041386E-03, 4.1856520458E-05, 5.8931897355E-05, 2.0129761919E-07 }; static double kirby2_F1[kirby2_N] = { 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 }; static double kirby2_F0[kirby2_N] = { 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 }; static void kirby2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 3.9050739624E+00; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kirby2_P; ++i) { gsl_test_rel(x[i], kirby2_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kirby2_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double y = ((b[0] + t* (b[1] + t * b[2])) / (1 + t*(b[3] + t *b[4]))); gsl_vector_set (f, i, kirby2_F1[i] - y); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kirby2_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(kirby2_J, kirby2_N, kirby2_P); double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double u = (b[0] + t*(b[1] + t*b[2])); double v = (1 + t*(b[3] + t*b[4])); gsl_matrix_set (&J.matrix, i, 0, -1/v); gsl_matrix_set (&J.matrix, i, 1, -t/v); gsl_matrix_set (&J.matrix, i, 2, -t*t/v); gsl_matrix_set (&J.matrix, i, 3, t*u/(v*v)); gsl_matrix_set (&J.matrix, i, 4, t*t*u/(v*v)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kirby2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); size_t i; for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double term1 = 1.0 + t*(x4 + t*x5); gsl_vector_set(fvv, i, -2*t/pow(term1, 3.0) * (v4 + t*v5) * (-t*(-v2 + v4*x1 + t*(-v3 + v5*x1 + v4*x2 + t*v5*x2 + t*(v4+t*v5)*x3)) + t*t*(v2 + t*v3)*(x4 + t*x5) + v1*(1.0 + t*(x4 + t*x5)))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf kirby2_func = { kirby2_f, kirby2_df, kirby2_fvv, kirby2_N, kirby2_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem kirby2a_problem = { "nist-kirby2a", kirby2_x0a, kirby2_sigma, &kirby2_epsrel, &kirby2_checksol, &kirby2_func }; static test_fdf_problem kirby2b_problem = { "nist-kirby2b", kirby2_x0b, kirby2_sigma, &kirby2_epsrel, &kirby2_checksol, &kirby2_func }; gsl-doc-2.3/multilarge_nlinear/subspace2D.c0000644000175000017500000005464612767073201017020 0ustar eddedd/* multilarge_nlinear/subspace2D.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module implements a 2D subspace trust region subproblem method, * as outlined in * * [1] G. A. Shultz, R. B. Schnabel, and R. H. Byrd * A Family of Trust-Region-Based Algorithms for Unconstrained * Minimization with Strong Global Convergence Properties, * SIAM Journal on Numerical Analysis 1985 22:1, 47-67 * * [2] R. H. Byrd, R. B. Schnabel, G. A. Shultz, * Approximate solution of the trust region problem by * minimization over two-dimensional subspaces, * Mathematical Programming, January 1988, Volume 40, * Issue 1, pp 247-263 * * The idea is to solve: * * min_{dx} g^T dx + 1/2 dx^T B dx * * with constraints: * * ||D dx|| <= delta * dx \in span{dx_sd, dx_gn} * * where B is the Hessian matrix, B = J^T J * * The steps are as follows: * * 1. preloop: * a. Compute Gauss-Newton and steepest descent vectors, * dx_gn, dx_sd * b. Compute an orthonormal basis for span(D dx_sd, D dx_gn) by * constructing W = [ D dx_sd, D dx_gn ] and performing a QR * decomposition of W. The 2 columns of the Q matrix * will then span the column space of W. W should have rank 2 * unless D*dx_sd and D*dx_gn are parallel, in which case it will * have rank 1. * c. Precompute various quantities needed for the step calculation * * 2. step: * a. If the Gauss-Newton step is inside the trust region, use it * b. if W has rank 1, we cannot form a 2D subspace, so in this case * follow the steepest descent direction to the trust region boundary * and use that as the step. * c. In the full rank 2 case, if the GN point is outside the trust region, * then the minimizer of the objective function lies on the trust * region boundary. Therefore the minimization problem becomes: * * min_{dx} g^T dx + 1/2 dx^T B dx, with ||dx|| = delta, dx = Q * x * * where x is a 2-vector to be determined and the columns of Q are * the orthonormal basis vectors of the subspace. Note the equality * constraint now instead of <=. In terms of the new variable x, * the minimization problem becomes: * * min_x subg^T x + 1/2 x^T subB x, with ||Q*x|| = ||x|| = delta * * where: * subg = Q^T g (2-by-1) * subB = Q^T B Q (2-by-2) * * This equality constrained 2D minimization problem can be solved * with a Lagrangian multiplier, which results in a 4th degree polynomial * equation to be solved. The equation is: * * lambda^4 1 * + lambda^3 2 tr(B) * + lambda^2 (tr(B)^2 + 2 det(B) - g^T g / delta^2) * + lambda^1 (2 det(B) tr(B) - 2 g^T adj(B)^T g / delta^2) * + lambda^0 (det(B)^2 - g^T adj(B)^T adj(B) g / delta^2) * * where adj(B) is the adjugate matrix of B. * * We then check each of the 4 solutions for lambda to determine which * lambda results in the smallest objective function value. This x * is then used to construct the final step: dx = Q*x */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *dx_gn; /* Gauss-Newton step, size p */ gsl_vector *dx_sd; /* steepest descent step, size p */ double norm_Dgn; /* || D dx_gn || */ double norm_Dsd; /* || D dx_sd || */ gsl_vector *workp1; /* workspace, length p */ gsl_vector *workp2; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ gsl_matrix *W; /* orthonormal basis for 2D subspace, p-by-2 */ gsl_matrix *work_JTJ; /* D^{-1} J^T J D^{-1}, p-by-p */ gsl_vector *tau; /* Householder scalars */ gsl_vector *subg; /* subspace gradient = W^T g, 2-by-1 */ gsl_matrix *subB; /* subspace Hessian = W^T B W, 2-by-2 */ gsl_permutation *perm; /* permutation matrix */ double trB; /* Tr(subB) */ double detB; /* det(subB) */ double normg; /* || subg || */ double term0; /* g^T adj(B)^T adj(B) g */ double term1; /* g^T adj(B)^T g */ size_t rank; /* rank of [ dx_sd, dx_gn ] matrix */ gsl_poly_complex_workspace *poly_p; /* tunable parameters */ gsl_multilarge_nlinear_parameters params; } subspace2D_state_t; #include "common.c" static void * subspace2D_alloc (const void * params, const size_t n, const size_t p); static void subspace2D_free(void *vstate); static int subspace2D_init(const void *vtrust_state, void *vstate); static int subspace2D_preloop(const void * vtrust_state, void * vstate); static int subspace2D_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int subspace2D_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static int subspace2D_solution(const double lambda, gsl_vector * x, subspace2D_state_t * state); static double subspace2D_objective(const gsl_vector * x, subspace2D_state_t * state); static int subspace2D_calc_gn(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx); static int subspace2D_calc_sd(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx, subspace2D_state_t * state); static void * subspace2D_alloc (const void * params, const size_t n, const size_t p) { const gsl_multilarge_nlinear_parameters *par = (const gsl_multilarge_nlinear_parameters *) params; subspace2D_state_t *state; state = calloc(1, sizeof(subspace2D_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate subspace2D state", GSL_ENOMEM); } state->dx_gn = gsl_vector_alloc(p); if (state->dx_gn == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_gn", GSL_ENOMEM); } state->dx_sd = gsl_vector_alloc(p); if (state->dx_sd == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_sd", GSL_ENOMEM); } state->workp1 = gsl_vector_alloc(p); if (state->workp1 == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp1", GSL_ENOMEM); } state->workp2 = gsl_vector_alloc(p); if (state->workp2 == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp2", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->W = gsl_matrix_alloc(p, 2); if (state->W == NULL) { GSL_ERROR_NULL ("failed to allocate space for W", GSL_ENOMEM); } state->work_JTJ = gsl_matrix_alloc(p, p); if (state->work_JTJ == NULL) { GSL_ERROR_NULL ("failed to allocate space for work_JTJ", GSL_ENOMEM); } state->tau = gsl_vector_alloc(2); if (state->tau == NULL) { GSL_ERROR_NULL ("failed to allocate space for tau", GSL_ENOMEM); } state->subg = gsl_vector_alloc(2); if (state->subg == NULL) { GSL_ERROR_NULL ("failed to allocate space for subg", GSL_ENOMEM); } state->subB = gsl_matrix_alloc(2, 2); if (state->subB == NULL) { GSL_ERROR_NULL ("failed to allocate space for subB", GSL_ENOMEM); } state->perm = gsl_permutation_alloc(2); if (state->perm == NULL) { GSL_ERROR_NULL ("failed to allocate space for perm", GSL_ENOMEM); } state->poly_p = gsl_poly_complex_workspace_alloc(5); if (state->poly_p == NULL) { GSL_ERROR_NULL ("failed to allocate space for poly workspace", GSL_ENOMEM); } state->n = n; state->p = p; state->rank = 0; state->params = *par; return state; } static void subspace2D_free(void *vstate) { subspace2D_state_t *state = (subspace2D_state_t *) vstate; if (state->dx_gn) gsl_vector_free(state->dx_gn); if (state->dx_sd) gsl_vector_free(state->dx_sd); if (state->workp1) gsl_vector_free(state->workp1); if (state->workp2) gsl_vector_free(state->workp2); if (state->workn) gsl_vector_free(state->workn); if (state->W) gsl_matrix_free(state->W); if (state->work_JTJ) gsl_matrix_free(state->work_JTJ); if (state->tau) gsl_vector_free(state->tau); if (state->subg) gsl_vector_free(state->subg); if (state->subB) gsl_matrix_free(state->subB); if (state->perm) gsl_permutation_free(state->perm); if (state->poly_p) gsl_poly_complex_workspace_free(state->poly_p); free(state); } /* subspace2D_init() Initialize subspace2D solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int subspace2D_init(const void *vtrust_state, void *vstate) { (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } /* subspace2D_preloop() Initialize subspace2D method prior to iteration loop. This involves computing the Gauss-Newton step and steepest descent step Notes: on output, 1) state->dx_gn contains Gauss-Newton step 2) state->dx_sd contains steepest descent step 3) state->rank contains the rank([dx_sd, dx_gn]) 4) if full rank subspace (rank = 2), then: state->trB = Tr(subB) state->detB = det(subB) state->normg = || subg || */ static int subspace2D_preloop(const void * vtrust_state, void * vstate) { int status; const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; gsl_vector_view v; double work_data[2]; gsl_vector_view work = gsl_vector_view_array(work_data, 2); int signum; /* calculate Gauss-Newton step */ status = subspace2D_calc_gn(trust_state, state->dx_gn); if (status) return status; /* now calculate the steepest descent step */ status = subspace2D_calc_sd(trust_state, state->dx_sd, state); if (status) return status; /* store norms */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); state->norm_Dsd = scaled_enorm(trust_state->diag, state->dx_sd); /* * now compute orthonormal basis for span(D dx_sd, D dx_gn) using * QR decomposition; set W = [ D dx_sd, D dx_gn ] and normalize each * column to unit magnitude. Then the Q matrix will form a basis for Col(W) */ v = gsl_matrix_column(state->W, 0); gsl_vector_memcpy(&v.vector, state->dx_sd); gsl_vector_mul(&v.vector, trust_state->diag); if (state->norm_Dsd != 0) gsl_vector_scale(&v.vector, 1.0 / state->norm_Dsd); v = gsl_matrix_column(state->W, 1); gsl_vector_memcpy(&v.vector, state->dx_gn); gsl_vector_mul(&v.vector, trust_state->diag); if (state->norm_Dgn != 0) gsl_vector_scale(&v.vector, 1.0 / state->norm_Dgn); /* use a rank revealing QR decomposition in case dx_sd and dx_gn * are parallel */ gsl_linalg_QRPT_decomp(state->W, state->tau, state->perm, &signum, &work.vector); /* check for parallel dx_sd, dx_gn, in which case rank will be 1 */ state->rank = gsl_linalg_QRPT_rank(state->W, -1.0); if (state->rank == 2) { /* * full rank subspace, compute: * subg = Q^T D^{-1} g * subB = Q^T D^{-1} B D^{-1} Q where B = J^T J */ const size_t p = state->p; size_t i, j; double B00, B10, B11, g0, g1; /* compute subg */ gsl_vector_memcpy(state->workp1, trust_state->g); gsl_vector_div(state->workp1, trust_state->diag); gsl_linalg_QR_QTvec(state->W, state->tau, state->workp1); g0 = gsl_vector_get(state->workp1, 0); g1 = gsl_vector_get(state->workp1, 1); gsl_vector_set(state->subg, 0, g0); gsl_vector_set(state->subg, 1, g1); /* compute subB */ /* compute work_JTJ = D^{-1} J^T J D^{-1} using lower triangle */ for (j = 0; j < p; ++j) { double dj = gsl_vector_get(trust_state->diag, j); for (i = j; i < p; ++i) { double di = gsl_vector_get(trust_state->diag, i); double Aij = gsl_matrix_get(trust_state->JTJ, i, j); gsl_matrix_set(state->work_JTJ, i, j, Aij / (di * dj)); } } gsl_matrix_transpose_tricpy('L', 0, state->work_JTJ, state->work_JTJ); /* compute work_JTJ = Q^T D^{-1} J^T J D^{-1} Q */ gsl_linalg_QR_matQ(state->W, state->tau, state->work_JTJ); gsl_linalg_QR_QTmat(state->W, state->tau, state->work_JTJ); #if 0 /* compute subB = Q^T D^{-1} J^T J D^{-1} Q */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &JQ.matrix, 0.0, state->subB); #endif B00 = gsl_matrix_get(state->work_JTJ, 0, 0); B10 = gsl_matrix_get(state->work_JTJ, 1, 0); B11 = gsl_matrix_get(state->work_JTJ, 1, 1); gsl_matrix_set(state->subB, 0, 0, B00); gsl_matrix_set(state->subB, 1, 0, B10); gsl_matrix_set(state->subB, 1, 1, B11); state->trB = B00 + B11; state->detB = B00*B11 - B10*B10; state->normg = gsl_blas_dnrm2(state->subg); /* g^T adj(B)^T adj(B) g */ state->term0 = (B10*B10 + B11*B11)*g0*g0 - 2*B10*(B00 + B11)*g0*g1 + (B00*B00 + B10*B10)*g1*g1; /* g^T adj(B)^T g */ state->term1 = B11 * g0 * g0 + g1 * (B00*g1 - 2*B10*g0); } return GSL_SUCCESS; } /* subspace2D_step() Calculate a new step with 2D subspace method. Based on [1]. We seek a vector dx in span{dx_gn, dx_sd} which minimizes the model function subject to ||dx|| <= delta */ static int subspace2D_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else if (state->rank < 2) { /* rank of [dx_sd, dx_gn] is 1, meaning dx_sd and dx_gn * are parallel so we can't form a 2D subspace. Follow the steepest * descent direction to the trust region boundary as our step */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { int status; const double delta_sq = delta * delta; double u = state->normg / delta; double a[5]; double z[8]; #if 1 a[0] = state->detB * state->detB - state->term0 / delta_sq; a[1] = 2 * state->detB * state->trB - 2 * state->term1 / delta_sq; a[2] = state->trB * state->trB + 2 * state->detB - u * u; a[3] = 2 * state->trB; a[4] = 1.0; #else double TrB_D = state->trB * delta; double detB_D = state->detB * delta; double normg_sq = state->normg * state->normg; a[0] = detB_D * detB_D - state->term0; a[1] = 2 * state->detB * state->trB * delta_sq - 2 * state->term1; a[2] = TrB_D * TrB_D + 2 * state->detB * delta_sq - normg_sq; a[3] = 2 * state->trB * delta_sq; a[4] = delta_sq; #endif status = gsl_poly_complex_solve(a, 5, state->poly_p, z); if (status == GSL_SUCCESS) { size_t i; double min = 0.0; int mini = -1; double x_data[2]; gsl_vector_view x = gsl_vector_view_array(x_data, 2); /* * loop through all four values of the Lagrange multiplier * lambda. For each lambda, evaluate the objective function * with Re(lambda) to determine which lambda minimizes the * function */ for (i = 0; i < 4; ++i) { double cost, normx; /*fprintf(stderr, "root: %.12e + %.12e i\n", z[2*i], z[2*i+1]);*/ status = subspace2D_solution(z[2*i], &x.vector, state); if (status != GSL_SUCCESS) continue; /* singular matrix system */ /* ensure ||x|| = delta */ normx = gsl_blas_dnrm2(&x.vector); if (normx == 0.0) continue; gsl_vector_scale(&x.vector, delta / normx); /* evaluate objective function to determine minimizer */ cost = subspace2D_objective(&x.vector, state); if (mini < 0 || cost < min) { mini = (int) i; min = cost; } } if (mini < 0) { /* did not find minimizer - should not get here */ return GSL_FAILURE; } else { /* compute x which minimizes objective function */ subspace2D_solution(z[2*mini], &x.vector, state); /* dx = Q * x */ gsl_vector_set_zero(dx); gsl_vector_set(dx, 0, gsl_vector_get(&x.vector, 0)); gsl_vector_set(dx, 1, gsl_vector_get(&x.vector, 1)); gsl_linalg_QR_Qvec(state->W, state->tau, dx); /* compute final dx by multiplying by D^{-1} */ gsl_vector_div(dx, trust_state->diag); } } else { GSL_ERROR ("gsl_poly_complex_solve failed", status); } } return GSL_SUCCESS; } static int subspace2D_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; *pred = quadratic_preduction(trust_state, dx, state->workn); return GSL_SUCCESS; } /* solve 2D subspace problem: (B + lambda*I) x = -g */ static int subspace2D_solution(const double lambda, gsl_vector * x, subspace2D_state_t * state) { int status = GSL_SUCCESS; double C_data[4]; gsl_matrix_view C = gsl_matrix_view_array(C_data, 2, 2); double B00 = gsl_matrix_get(state->subB, 0, 0); double B10 = gsl_matrix_get(state->subB, 1, 0); double B11 = gsl_matrix_get(state->subB, 1, 1); /* construct C = B + lambda*I */ gsl_matrix_set(&C.matrix, 0, 0, B00 + lambda); gsl_matrix_set(&C.matrix, 1, 0, B10); gsl_matrix_set(&C.matrix, 0, 1, B10); gsl_matrix_set(&C.matrix, 1, 1, B11 + lambda); /* use modified Cholesky in case C is not positive definite */ gsl_linalg_mcholesky_decomp(&C.matrix, state->perm, NULL); gsl_linalg_mcholesky_solve(&C.matrix, state->perm, state->subg, x); gsl_vector_scale(x, -1.0); return status; } /* evaluate 2D objective function: f(x) = g^T x + 1/2 x^T B x */ static double subspace2D_objective(const gsl_vector * x, subspace2D_state_t * state) { double f; double y_data[2]; gsl_vector_view y = gsl_vector_view_array(y_data, 2); /* compute: y = g + 1/2 B x */ gsl_vector_memcpy(&y.vector, state->subg); gsl_blas_dsymv(CblasLower, 0.5, state->subB, x, 1.0, &y.vector); /* compute: f = x^T ( g + 1/2 B x ) */ gsl_blas_ddot(x, &y.vector, &f); return f; } /* subspace2D_calc_gn() Calculate Gauss-Newton step by solving J^T J dx_gn = -J^T f Inputs: trust_state - trust state variables dx - (output) Gauss-Newton step vector Return: success/error */ static int subspace2D_calc_gn(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx) { int status; const gsl_multilarge_nlinear_parameters *params = trust_state->params; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; /* prepare the linear solver to compute Gauss-Newton step */ status = (params->solver->presolve)(0.0, trust_state, trust_state->solver_state); if (status) return status; /* solve: J dx_gn = -f for Gauss-Newton step */ status = (params->solver->solve)(trust_state->g, dx, trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* subspace2D_calc_sd() Calculate steepest descent step, dx_sd = - || D^{-1} g ||^2 / || J D^{-2} g ||^2 D^{-2} g Inputs: trust_state - trust state variables dx - (output) steepest descent vector state - workspace Return: success/error */ static int subspace2D_calc_sd(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx, subspace2D_state_t * state) { double norm_Dinvg; /* || D^{-1} g || */ double norm_JDinv2g; /* || J D^{-2} g || */ double alpha; /* || D^{-1} g ||^2 / || J D^{-2} g ||^2 */ double u; /* compute workp1 = D^{-1} g and its norm */ gsl_vector_memcpy(state->workp1, trust_state->g); gsl_vector_div(state->workp1, trust_state->diag); norm_Dinvg = gsl_blas_dnrm2(state->workp1); /* compute workp1 = D^{-2} g */ gsl_vector_div(state->workp1, trust_state->diag); /* compute workp2 = J^T J D^{-2} g */ gsl_blas_dsymv(CblasLower, 1.0, trust_state->JTJ, state->workp1, 0.0, state->workp2); /* compute norm_JDinv2g = || J D^{-2} g || */ gsl_blas_ddot(state->workp1, state->workp2, &u); norm_JDinv2g = sqrt(u); u = norm_Dinvg / norm_JDinv2g; alpha = u * u; /* dx_sd = -alpha D^{-2} g */ gsl_vector_memcpy(dx, state->workp1); gsl_vector_scale(dx, -alpha); return GSL_SUCCESS; } static const gsl_multilarge_nlinear_trs subspace2D_type = { "2D-subspace", subspace2D_alloc, subspace2D_init, subspace2D_preloop, subspace2D_step, subspace2D_preduction, subspace2D_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_subspace2D = &subspace2D_type; gsl-doc-2.3/multilarge_nlinear/test_rosenbrocke.c0000644000175000017500000000565312753424373020377 0ustar eddedd#define rosenbrocke_N 8 /* = p */ #define rosenbrocke_P 8 /* must be even */ static double rosenbrocke_x0[rosenbrocke_P] = { -1.2, 1.0, -1.2, 1.0, -1.2, 1.0, -1.2, 1.0 }; static double rosenbrocke_epsrel = 1.0e-12; static double rosenbrocke_J[rosenbrocke_N * rosenbrocke_P]; static void rosenbrocke_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double rosenbrocke_x[rosenbrocke_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrocke_P; ++i) { gsl_test_rel(x[i], rosenbrocke_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrocke_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2i = gsl_vector_get(x, 2*i + 1); double x2im1 = gsl_vector_get(x, 2*i); gsl_vector_set(f, 2*i, 10.0 * (x2i - x2im1*x2im1)); gsl_vector_set(f, 2*i + 1, 1.0 - x2im1); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrocke_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(rosenbrocke_J, rosenbrocke_N, rosenbrocke_P); size_t i; gsl_matrix_set_zero(&J.matrix); for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2im1 = gsl_vector_get(x, 2*i); gsl_matrix_set(&J.matrix, 2*i, 2*i, -20.0*x2im1); gsl_matrix_set(&J.matrix, 2*i, 2*i + 1, 10.0); gsl_matrix_set(&J.matrix, 2*i + 1, 2*i, -1.0); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrocke_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i; for (i = 0; i < rosenbrocke_N / 2; ++i) { double v2im1 = gsl_vector_get(v, 2*i); gsl_vector_set(fvv, 2*i, -20.0 * v2im1 * v2im1); gsl_vector_set(fvv, 2*i + 1, 0.0); } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf rosenbrocke_func = { rosenbrocke_f, rosenbrocke_df, rosenbrocke_fvv, rosenbrocke_N, rosenbrocke_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem rosenbrocke_problem = { "rosenbrock_extended", rosenbrocke_x0, NULL, &rosenbrocke_epsrel, &rosenbrocke_checksol, &rosenbrocke_func }; gsl-doc-2.3/multilarge_nlinear/test_boxbod.c0000644000175000017500000000636312753424231017330 0ustar eddedd#define boxbod_N 6 #define boxbod_P 2 static double boxbod_x0a[boxbod_P] = { 1.0, 1.0 }; static double boxbod_x0b[boxbod_P] = { 100.0, 0.75 }; static double boxbod_epsrel = 1.0e-7; static double boxbod_J[boxbod_N * boxbod_P]; static double boxbod_sigma[boxbod_P] = { 1.2354515176E+01, 1.0455993237E-01 }; static double boxbod_X[boxbod_N] = { 1.0, 2.0, 3.0, 5.0, 7.0, 10.0 }; static double boxbod_F[boxbod_N] = { 109.0, 149.0, 149.0, 191.0, 213.0, 224.0 }; static void boxbod_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.1680088766E+03; const double boxbod_x[boxbod_P] = { 2.1380940889E+02, 5.4723748542E-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < boxbod_P; ++i) { gsl_test_rel(x[i], boxbod_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int boxbod_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double yi; yi = b[0] * (1.0 - exp(-b[1] * xi)); gsl_vector_set (f, i, yi - boxbod_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int boxbod_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(boxbod_J, boxbod_N, boxbod_P); double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double term = exp(-b[1] * xi); gsl_matrix_set (&J.matrix, i, 0, 1.0 - term); gsl_matrix_set (&J.matrix, i, 1, b[0] * term * xi); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int boxbod_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < boxbod_N; i++) { double ti = boxbod_X[i]; double term = exp(-x2 * ti); gsl_vector_set(fvv, i, term * ti * v2 * (2*v1 - ti*v2*x1)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf boxbod_func = { boxbod_f, boxbod_df, boxbod_fvv, boxbod_N, boxbod_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem boxboda_problem = { "nist-boxboda", boxbod_x0a, boxbod_sigma, &boxbod_epsrel, &boxbod_checksol, &boxbod_func }; static test_fdf_problem boxbodb_problem = { "nist-boxbodb", boxbod_x0b, boxbod_sigma, &boxbod_epsrel, &boxbod_checksol, &boxbod_func }; gsl-doc-2.3/multilarge_nlinear/gsl_multilarge_nlinear.h0000644000175000017500000003127612755636333021556 0ustar eddedd/* multilarge_nlinear/gsl_multilarge_nlinear.h * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MULTILARGE_NLINEAR_H__ #define __GSL_MULTILARGE_NLINEAR_H__ #include #include #include #include #include #include #include #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_MULTILARGE_NLINEAR_FWDIFF, GSL_MULTILARGE_NLINEAR_CTRDIFF } gsl_multilarge_nlinear_fdtype; /* Definition of vector-valued functions and gradient with parameters based on gsl_vector */ typedef struct { int (* f) (const gsl_vector * x, void * params, gsl_vector * f); int (* df) (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ); int (* fvv) (const gsl_vector * x, const gsl_vector * v, void * params, gsl_vector * fvv); size_t n; /* number of functions */ size_t p; /* number of independent variables */ void * params; /* user parameters */ size_t nevalf; /* number of function evaluations */ size_t nevaldfu; /* number of Jacobian matrix-vector evaluations */ size_t nevaldf2; /* number of Jacobian J^T J evaluations */ size_t nevalfvv; /* number of fvv evaluations */ } gsl_multilarge_nlinear_fdf; /* trust region subproblem method */ typedef struct { const char *name; void * (*alloc) (const void * params, const size_t n, const size_t p); int (*init) (const void * vtrust_state, void * vstate); int (*preloop) (const void * vtrust_state, void * vstate); int (*step) (const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); int (*preduction) (const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); void (*free) (void * vstate); } gsl_multilarge_nlinear_trs; /* scaling matrix specification */ typedef struct { const char *name; int (*init) (const gsl_matrix * JTJ, gsl_vector * diag); int (*update) (const gsl_matrix * JTJ, gsl_vector * diag); } gsl_multilarge_nlinear_scale; /* * linear least squares solvers - there are three steps to * solving a least squares problem using a direct method: * * 1. init: called once per iteration when a new Jacobian matrix * is required; form normal equations matrix J^T J * 2. presolve: called each time a new LM parameter value mu is available; * used for cholesky method in order to factor * the (J^T J + mu D^T D) matrix * 3. solve: solve the least square system for a given rhs */ typedef struct { const char *name; void * (*alloc) (const size_t n, const size_t p); int (*init) (const void * vtrust_state, void * vstate); int (*presolve) (const double mu, const void * vtrust_state, void * vstate); int (*solve) (const gsl_vector * g, gsl_vector * x, const void * vtrust_state, void * vstate); int (*rcond) (double * rcond, const gsl_matrix * JTJ, void * vstate); int (*covar) (const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate); void (*free) (void * vstate); } gsl_multilarge_nlinear_solver; /* tunable parameters */ typedef struct { const gsl_multilarge_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multilarge_nlinear_scale *scale; /* scaling method */ const gsl_multilarge_nlinear_solver *solver; /* solver method */ gsl_multilarge_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ size_t max_iter; /* maximum iterations for trs method */ double tol; /* tolerance for solving trs */ } gsl_multilarge_nlinear_parameters; typedef struct { const char *name; void * (*alloc) (const gsl_multilarge_nlinear_parameters * params, const size_t n, const size_t p); int (*init) (void * state, const gsl_vector * wts, gsl_multilarge_nlinear_fdf * fdf, const gsl_vector * x, gsl_vector * f, gsl_vector * g, gsl_matrix * JTJ); int (*iterate) (void * state, const gsl_vector * wts, gsl_multilarge_nlinear_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * g, gsl_matrix * JTJ, gsl_vector * dx); int (*rcond) (double * rcond, const gsl_matrix * JTJ, void * state); int (*covar) (const gsl_matrix * JTJ, gsl_matrix * covar, void * state); double (*avratio) (void * state); void (*free) (void * state); } gsl_multilarge_nlinear_type; /* current state passed to low-level trust region algorithms */ typedef struct { const gsl_vector * x; /* parameter values x */ const gsl_vector * f; /* residual vector f(x) */ const gsl_vector * g; /* gradient J^T f */ const gsl_matrix * JTJ; /* matrix J^T J */ const gsl_vector * diag; /* scaling matrix D */ const gsl_vector * sqrt_wts; /* sqrt(diag(W)) or NULL for unweighted */ const double *mu; /* LM parameter */ const gsl_multilarge_nlinear_parameters * params; void *solver_state; /* workspace for direct least squares solver */ gsl_multilarge_nlinear_fdf * fdf; double *avratio; /* |a| / |v| */ } gsl_multilarge_nlinear_trust_state; typedef struct { const gsl_multilarge_nlinear_type * type; gsl_multilarge_nlinear_fdf * fdf ; gsl_vector * x; /* parameter values x */ gsl_vector * f; /* residual vector f(x) */ gsl_vector * dx; /* step dx */ gsl_vector * g; /* gradient J^T f */ gsl_matrix * JTJ; /* matrix J^T J */ gsl_vector * sqrt_wts_work; /* sqrt(W) */ gsl_vector * sqrt_wts; /* ptr to sqrt_wts_work, or NULL if not using weights */ size_t n; /* number of residuals */ size_t p; /* number of parameters */ size_t niter; /* number of iterations performed */ gsl_multilarge_nlinear_parameters params; void *state; } gsl_multilarge_nlinear_workspace; gsl_multilarge_nlinear_workspace * gsl_multilarge_nlinear_alloc (const gsl_multilarge_nlinear_type * T, const gsl_multilarge_nlinear_parameters * params, size_t n, size_t p); void gsl_multilarge_nlinear_free (gsl_multilarge_nlinear_workspace * w); gsl_multilarge_nlinear_parameters gsl_multilarge_nlinear_default_parameters(void); int gsl_multilarge_nlinear_init (const gsl_vector * x, gsl_multilarge_nlinear_fdf * fdf, gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_winit (const gsl_vector * x, const gsl_vector * wts, gsl_multilarge_nlinear_fdf * fdf, gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_iterate (gsl_multilarge_nlinear_workspace * w); double gsl_multilarge_nlinear_avratio (const gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_rcond (double * rcond, const gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_covar (gsl_matrix * covar, gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_driver (const size_t maxiter, const double xtol, const double gtol, const double ftol, void (*callback)(const size_t iter, void *params, const gsl_multilarge_nlinear_workspace *w), void *callback_params, int *info, gsl_multilarge_nlinear_workspace * w); const char * gsl_multilarge_nlinear_name (const gsl_multilarge_nlinear_workspace * w); gsl_vector * gsl_multilarge_nlinear_position (const gsl_multilarge_nlinear_workspace * w); gsl_vector * gsl_multilarge_nlinear_residual (const gsl_multilarge_nlinear_workspace * w); gsl_vector * gsl_multilarge_nlinear_step (const gsl_multilarge_nlinear_workspace * w); size_t gsl_multilarge_nlinear_niter (const gsl_multilarge_nlinear_workspace * w); const char * gsl_multilarge_nlinear_trs_name (const gsl_multilarge_nlinear_workspace * w); int gsl_multilarge_nlinear_eval_f(gsl_multilarge_nlinear_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_vector *y); int gsl_multilarge_nlinear_eval_df(const CBLAS_TRANSPOSE_t TransJ, const gsl_vector *x, const gsl_vector *f, const gsl_vector *u, const gsl_vector *swts, const double h, const gsl_multilarge_nlinear_fdtype fdtype, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *v, gsl_matrix *JTJ, gsl_vector *work); int gsl_multilarge_nlinear_eval_fvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *yvv, gsl_vector *work); /* convergence.c */ int gsl_multilarge_nlinear_test (const double xtol, const double gtol, const double ftol, int *info, const gsl_multilarge_nlinear_workspace * w); /* fdjac.c */ int gsl_multilarge_nlinear_df(const double h, const gsl_multilarge_nlinear_fdtype fdtype, const gsl_vector *x, const gsl_vector *wts, gsl_multilarge_nlinear_fdf *fdf, const gsl_vector *f, gsl_matrix *J, gsl_vector *work); /* fdfvv.c */ int gsl_multilarge_nlinear_fdfvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *fvv, gsl_vector *work); /* top-level algorithms */ GSL_VAR const gsl_multilarge_nlinear_type * gsl_multilarge_nlinear_trust; /* trust region subproblem methods */ GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_lm; GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_lmaccel; GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_dogleg; GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_ddogleg; GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_subspace2D; GSL_VAR const gsl_multilarge_nlinear_trs * gsl_multilarge_nlinear_trs_cgst; /* scaling matrix strategies */ GSL_VAR const gsl_multilarge_nlinear_scale * gsl_multilarge_nlinear_scale_levenberg; GSL_VAR const gsl_multilarge_nlinear_scale * gsl_multilarge_nlinear_scale_marquardt; GSL_VAR const gsl_multilarge_nlinear_scale * gsl_multilarge_nlinear_scale_more; /* linear solvers */ GSL_VAR const gsl_multilarge_nlinear_solver * gsl_multilarge_nlinear_solver_cholesky; GSL_VAR const gsl_multilarge_nlinear_solver * gsl_multilarge_nlinear_solver_none; __END_DECLS #endif /* __GSL_MULTILARGE_NLINEAR_H__ */ gsl-doc-2.3/multilarge_nlinear/test_wood.c0000644000175000017500000000602312753424416017021 0ustar eddedd#define wood_N 6 #define wood_P 4 static double wood_x0[wood_P] = { -3.0, -1.0, -3.0, -1.0 }; static double wood_epsrel = 1.0e-12; static double wood_J[wood_N * wood_P]; static void wood_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double wood_x[wood_P] = { 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wood_P; ++i) { gsl_test_rel(x[i], wood_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wood_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); gsl_vector_set(f, 0, 10.0*(x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); gsl_vector_set(f, 2, sqrt(90.0)*(x4 - x3*x3)); gsl_vector_set(f, 3, 1.0 - x3); gsl_vector_set(f, 4, sqrt(10.0)*(x2 + x4 - 2.0)); gsl_vector_set(f, 5, (x2 - x4) / sqrt(10.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int wood_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(wood_J, wood_N, wood_P); double x1 = gsl_vector_get(x, 0); double x3 = gsl_vector_get(x, 2); double s90 = sqrt(90.0); double s10 = sqrt(10.0); gsl_matrix_set_zero(&J.matrix); gsl_matrix_set(&J.matrix, 0, 0, -20.0*x1); gsl_matrix_set(&J.matrix, 0, 1, 10.0); gsl_matrix_set(&J.matrix, 1, 0, -1.0); gsl_matrix_set(&J.matrix, 2, 2, -2.0*s90*x3); gsl_matrix_set(&J.matrix, 2, 3, s90); gsl_matrix_set(&J.matrix, 3, 2, -1.0); gsl_matrix_set(&J.matrix, 4, 1, s10); gsl_matrix_set(&J.matrix, 4, 3, s10); gsl_matrix_set(&J.matrix, 5, 1, 1.0/s10); gsl_matrix_set(&J.matrix, 5, 3, -1.0/s10); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int wood_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const double s10 = sqrt(10.0); double v1 = gsl_vector_get(v, 0); double v3 = gsl_vector_get(v, 2); gsl_vector_set(fvv, 0, -20.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, -6.0 * s10 * v3 * v3); gsl_vector_set(fvv, 3, 0.0); gsl_vector_set(fvv, 4, 0.0); gsl_vector_set(fvv, 5, 0.0); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf wood_func = { wood_f, wood_df, wood_fvv, wood_N, wood_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem wood_problem = { "wood", wood_x0, NULL, &wood_epsrel, &wood_checksol, &wood_func }; gsl-doc-2.3/multilarge_nlinear/Makefile.am0000644000175000017500000000337412767003727016713 0ustar eddeddnoinst_LTLIBRARIES = libgslmultilarge_nlinear.la pkginclude_HEADERS = gsl_multilarge_nlinear.h libgslmultilarge_nlinear_la_SOURCES = cgst.c cholesky.c convergence.c dogleg.c dummy.c fdf.c lm.c scaling.c subspace2D.c trust.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = \ common.c \ nielsen.c \ test_fdf.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_exp1.c \ test_hahn1.c \ test_helical.c \ test_gaussian.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_meyer.c \ test_meyerscal.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wood.c \ test_wnlin.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultilarge_nlinear.la ../test/libgsltest.la ../multilarge/libgslmultilarge.la ../multifit/libgslmultifit.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../complex/libgslcomplex.la ../poly/libgslpoly.la gsl-doc-2.3/multilarge_nlinear/test_gaussian.c0000644000175000017500000000761112753424267017673 0ustar eddedd#define gaussian_N 15 #define gaussian_P 3 static double gaussian_x0[gaussian_P] = { 0.4, 1.0, 0.0 }; static double gaussian_epsrel = 1.0e-10; static double gaussian_J[gaussian_N * gaussian_P]; static double gaussian_Y[gaussian_N] = { 0.0009, 0.0044, 0.0175, 0.0540, 0.1295, 0.2420, 0.3521, 0.3989, 0.3521, 0.2420, 0.1295, 0.0540, 0.0175, 0.0044, 0.0009 }; static void gaussian_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.12793276961871985e-08; const double gaussian_x[gaussian_P] = { 0.398956137838762825, 1.00001908448786647, 0.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < gaussian_P; ++i) { gsl_test_rel(x[i], gaussian_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int gaussian_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double yi = gaussian_Y[i]; double term = ti - x3; double fi = x1 * exp(-x2*term*term/2.0) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int gaussian_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(gaussian_J, gaussian_N, gaussian_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double term1 = ti - x3; double term2 = exp(-x2*term1*term1/2.0); gsl_matrix_set(&J.matrix, i, 0, term2); gsl_matrix_set(&J.matrix, i, 1, -0.5*x1*term2*term1*term1); gsl_matrix_set(&J.matrix, i, 2, x1*x2*term1*term2); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int gaussian_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double term1 = ti - x3; double term2 = exp(-x2*term1*term1/2.0); gsl_vector_set(fvv, i, 0.25 * term2 * (ti*ti*ti*ti*v2*v2*x1 - 4*ti*ti*ti*v2*x1*(v3*x2 + v2*x3) + v2*x3*x3*(v2*x1*x3*x3 - 4*v1) + 4*v3*v3*x1*x2*(x2*x3*x3 - 1.0) + 4*v3*x3*(-2*v1*x2 + v2*x1*(x2*x3*x3 - 2.0)) + ti*ti*(4*v3*v3*x1*x2*x2 + 2*v2*(-2*v1 + 3*x1*x3*(2*v3*x2 + v2*x3))) - 4*ti*(v2*v2*x1*x3*x3*x3 + 2*v3*x2*(-v1 + v3*x1*x2*x3) + v2*(-2*v1*x3 + v3*x1*(-2.0 + 3*x2*x3*x3))))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf gaussian_func = { gaussian_f, gaussian_df, gaussian_fvv, gaussian_N, gaussian_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem gaussian_problem = { "gaussian", gaussian_x0, NULL, &gaussian_epsrel, &gaussian_checksol, &gaussian_func }; gsl-doc-2.3/multilarge_nlinear/test_meyerscal.c0000644000175000017500000000717412757605254020052 0ustar eddedd#define meyerscal_N 16 #define meyerscal_P 3 static double meyerscal_x0[meyerscal_P] = { 8.85, 4.0, 2.5 }; static double meyerscal_epsrel = 1.0e-6; static double meyerscal_J[meyerscal_N * meyerscal_P]; static double meyerscal_Y[meyerscal_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyerscal_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517003888e-05; const double meyerscal_x[meyerscal_P] = { 2.481778312286695e+00, 6.181346341853554e+00, 3.452236344749865e+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyerscal_P; ++i) { gsl_test_rel(x[i], meyerscal_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyerscal_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double yi = meyerscal_Y[i]; double fi = x1 * exp(10.0*x2 / (ti + x3) - 13.0) - 1.0e-3*yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyerscal_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(meyerscal_J, meyerscal_N, meyerscal_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double term1 = ti + x3; double term2 = exp(10.0*x2/term1 - 13.0); gsl_matrix_set(&J.matrix, i, 0, term2); gsl_matrix_set(&J.matrix, i, 1, 10.0*x1*term2/term1); gsl_matrix_set(&J.matrix, i, 2, -10.0*x1*x2*term2/(term1*term1)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyerscal_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double term1 = ti + x3; double term2 = exp(10.0*x2/term1 - 13.0); double term3 = v2*term1 - v3*x2; double term4 = ti*ti*v1 - v3*x1*(5*x2 + x3) + x3*(5*v2*x1 + v1*x3) + ti*(5*v2*x1 - v3*x1 + 2*v1*x3); gsl_vector_set(fvv, i, 20*term2*term3*term4 / pow(term1, 4.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf meyerscal_func = { meyerscal_f, meyerscal_df, meyerscal_fvv, meyerscal_N, meyerscal_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem meyerscal_problem = { "meyerscal", meyerscal_x0, NULL, &meyerscal_epsrel, &meyerscal_checksol, &meyerscal_func }; gsl-doc-2.3/multilarge_nlinear/common.c0000644000175000017500000001001112752713256016274 0ustar eddedd/* multilarge_nlinear/common.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 scaled_enorm (const gsl_vector * d, const gsl_vector * f); static void scaled_addition (const double alpha, const gsl_vector * x, const double beta, const gsl_vector * y, gsl_vector * z); static double quadratic_preduction(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * dx, gsl_vector * work); /* compute || diag(d) 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); } /* compute z = alpha*x + beta*y */ static void scaled_addition (const double alpha, const gsl_vector * x, const double beta, const gsl_vector * y, gsl_vector * z) { const size_t N = z->size; size_t i; for (i = 0; i < N; i++) { double xi = gsl_vector_get (x, i); double yi = gsl_vector_get (y, i); gsl_vector_set (z, i, alpha * xi + beta * yi); } } /* quadratic_preduction() Calculate predicted reduction based on standard quadratic model: m_k(dx) = Phi(x_k) + dx' g + 1/2 dx' B_k dx predicted_reduction = m_k(0) - m_k(dx) = -2 g^T dx / ||f||^2 - ( ||J*dx|| / ||f|| )^2 = -2 fhat . beta - ||beta||^2 where: beta = J*dx / ||f|| Inputs: trust_state - trust state dx - proposed step, size p work - workspace, size n Return: predicted reduction */ static double quadratic_preduction(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * dx, gsl_vector * work) { const gsl_vector * f = trust_state->f; const gsl_multilarge_nlinear_parameters * params = trust_state->params; const double normf = gsl_blas_dnrm2(f); double gTdx; /* g^T dx */ gsl_multilarge_nlinear_fdf * fdf = trust_state->fdf; double pred_reduction, u; /* compute g^T dx */ gsl_blas_ddot(trust_state->g, dx, &gTdx); /* first term: -2 g^T dx / ||f||^2 */ pred_reduction = -2.0 * gTdx / (normf * normf); if (params->solver == gsl_multilarge_nlinear_solver_cholesky) { const size_t p = fdf->p; gsl_vector_view workp = gsl_vector_subvector(work, 0, p); /* compute workp = J^T J dx */ gsl_blas_dsymv(CblasLower, 1.0, trust_state->JTJ, dx, 0.0, &workp.vector); /* compute u = dx^T J^T J dx = ||J dx||^2 */ gsl_blas_ddot(&workp.vector, dx, &u); pred_reduction -= u / (normf * normf); } else { int status; const gsl_vector * x = trust_state->x; const gsl_vector * swts = trust_state->sqrt_wts; /* compute work = J*dx */ status = gsl_multilarge_nlinear_eval_df(CblasNoTrans, x, f, dx, swts, params->h_df, params->fdtype, fdf, work, NULL, NULL); if (status) { GSL_ERROR_VAL("error computing preduction", status, 0.0); } /* compute u = ||J*dx|| / ||f|| */ u = gsl_blas_dnrm2(work) / normf; pred_reduction -= u * u; } return pred_reduction; } gsl-doc-2.3/multilarge_nlinear/test_penalty2.c0000644000175000017500000001111712753424342017605 0ustar eddedd#define penalty2_N 8 /* 2*p */ #define penalty2_P 4 static double penalty2_x0[penalty2_P] = { 0.5, 0.5, 0.5, 0.5 }; static double penalty2_epsrel = 1.0e-12; static double penalty2_J[penalty2_N * penalty2_P]; static void penalty2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 9.37629300735544219e-06; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); (void)x; /* avoid unused parameter warning */ } static int penalty2_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); double x1 = gsl_vector_get(x, 0); size_t i; double sum = penalty2_P * x1 * x1; gsl_vector_set(f, 0, x1 - 0.2); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double yi = exp(0.1*(i + 1.0)) + exp(0.1*i); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) + exp(0.1*xim1) - yi)); sum += (penalty2_P - i) * xi * xi; } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) - exp(-0.1))); } /* row 2p */ gsl_vector_set(f, penalty2_N - 1, sum - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty2_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(penalty2_J, penalty2_N, penalty2_P); const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i, j; for (j = 0; j < penalty2_P; ++j) { double xj = gsl_vector_get(x, j); double delta1j = (j == 0) ? 1.0 : 0.0; /* first and last rows */ gsl_matrix_set(&J.matrix, 0, j, delta1j); gsl_matrix_set(&J.matrix, penalty2_N - 1, j, 2.0 * (penalty2_P - j) * xj); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double Jij; if (i == j) Jij = exp(0.1 * xi); else if (i - 1 == j) Jij = exp(0.1 * xim1); else Jij = 0.0; Jij *= 0.1 * sqrt_alpha; gsl_matrix_set(&J.matrix, i, j, Jij); } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); if (i - penalty2_P + 1 == j) gsl_matrix_set(&J.matrix, i, j, 0.1 * sqrt_alpha * exp(0.1*xi)); else gsl_matrix_set(&J.matrix, i, j, 0.0); } } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); double v1 = gsl_vector_get(v, 0); double sum = penalty2_P * v1 * v1; size_t i; /* first row */ gsl_vector_set(fvv, 0, 0.0); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double vi = gsl_vector_get(v, i); double vim1 = gsl_vector_get(v, i - 1); double term1 = exp(xi / 10.0); double term2 = exp(xim1 / 10.0); gsl_vector_set(fvv, i, sqrt_alpha / 100.0 * (term1 * vi * vi + term2 * vim1 * vim1)); sum += (penalty2_P - i) * vi * vi; } /* last row */ gsl_vector_set(fvv, penalty2_N - 1, 2.0 * sum); /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); double vi = gsl_vector_get(v, i - penalty2_P + 1); gsl_vector_set(fvv, i, sqrt_alpha / 100.0 * exp(xi / 10.0) * vi * vi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf penalty2_func = { penalty2_f, penalty2_df, penalty2_fvv, penalty2_N, penalty2_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem penalty2_problem = { "penalty2", penalty2_x0, NULL, &penalty2_epsrel, &penalty2_checksol, &penalty2_func }; gsl-doc-2.3/multilarge_nlinear/lm.c0000644000175000017500000002434312752713256015431 0ustar eddedd/* multilarge_nlinear/lm.c * * Copyright (C) 2014, 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module contains an implementation of the Levenberg-Marquardt * algorithm for nonlinear optimization problems. This implementation * closely follows the following works: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * [2] J. J. More, The Levenberg-Marquardt Algorithm: Implementation * and Theory, Lecture Notes in Mathematics, v630, 1978. */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *fvv; /* D_v^2 f(x), size n */ gsl_vector *vel; /* geodesic velocity (standard LM step), size p */ gsl_vector *acc; /* geodesic acceleration, size p */ gsl_vector *JTfvv; /* J^T fvv, size p */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ int accel; /* use geodesic acceleration? */ /* tunable parameters */ gsl_multilarge_nlinear_parameters params; } lm_state_t; #include "common.c" static void *lm_alloc (const int accel, const void * params, const size_t n, const size_t p); static void *lm_alloc_noaccel (const void * params, const size_t n, const size_t p); static void *lm_alloc_accel (const void * params, const size_t n, const size_t p); static void lm_free(void *vstate); static int lm_init(const void *vtrust_state, void *vstate); static int lm_preloop(const void * vtrust_state, void * vstate); static int lm_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int lm_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static void * lm_alloc (const int accel, const void * params, const size_t n, const size_t p) { const gsl_multilarge_nlinear_parameters *mparams = (const gsl_multilarge_nlinear_parameters *) params; lm_state_t *state; state = calloc(1, sizeof(lm_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate lm state", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->fvv = gsl_vector_alloc(n); if (state->fvv == NULL) { GSL_ERROR_NULL ("failed to allocate space for fvv", GSL_ENOMEM); } state->vel = gsl_vector_alloc(p); if (state->vel == NULL) { GSL_ERROR_NULL ("failed to allocate space for vel", GSL_ENOMEM); } state->acc = gsl_vector_alloc(p); if (state->acc == NULL) { GSL_ERROR_NULL ("failed to allocate space for acc", GSL_ENOMEM); } state->JTfvv = gsl_vector_alloc(p); if (state->JTfvv == NULL) { GSL_ERROR_NULL ("failed to allocate space for JTfvv", GSL_ENOMEM); } state->n = n; state->p = p; state->params = *mparams; state->accel = accel; return state; } static void * lm_alloc_noaccel (const void * params, const size_t n, const size_t p) { return lm_alloc(0, params, n, p); } static void * lm_alloc_accel (const void * params, const size_t n, const size_t p) { return lm_alloc(1, params, n, p); } static void lm_free(void *vstate) { lm_state_t *state = (lm_state_t *) vstate; if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); if (state->fvv) gsl_vector_free(state->fvv); if (state->vel) gsl_vector_free(state->vel); if (state->acc) gsl_vector_free(state->acc); if (state->JTfvv) gsl_vector_free(state->JTfvv); free(state); } /* lm_init() Initialize LM solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int lm_init(const void *vtrust_state, void *vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; gsl_vector_set_zero(state->vel); gsl_vector_set_zero(state->acc); *(trust_state->avratio) = 0.0; return GSL_SUCCESS; } /* lm_preloop() Initialize LM method for new Jacobian matrix */ static int lm_preloop(const void * vtrust_state, void * vstate) { int status; const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; const gsl_multilarge_nlinear_parameters *params = trust_state->params; (void)vstate; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* lm_step() Calculate a new step vector by solving the linear least squares system: [ J ] v = - [ f ] [ sqrt(mu) D ] [ 0 ] */ static int lm_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { int status; const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = trust_state->params; const double mu = *(trust_state->mu); (void)delta; /* prepare the linear solver with current LM parameter mu */ status = (params->solver->presolve)(mu, trust_state, trust_state->solver_state); if (status) return status; /* solve: (J^T J + mu D^T D) v = - J^T f */ status = (params->solver->solve)(trust_state->g, state->vel, trust_state, trust_state->solver_state); if (status) return status; if (state->accel) { double anorm, vnorm; /* compute geodesic acceleration */ status = gsl_multilarge_nlinear_eval_fvv(params->h_fvv, trust_state->x, state->vel, trust_state->f, trust_state->sqrt_wts, trust_state->fdf, state->fvv, state->workp); if (status) return status; /* compute J^T fvv */ status = gsl_multilarge_nlinear_eval_df(CblasTrans, trust_state->x, trust_state->f, state->fvv, trust_state->sqrt_wts, params->h_df, params->fdtype, trust_state->fdf, state->JTfvv, NULL, state->workn); if (status) return status; /* solve: (J^T J + mu D^T D) a = - J^T fvv */ status = (params->solver->solve)(state->JTfvv, state->acc, trust_state, trust_state->solver_state); if (status) return status; anorm = gsl_blas_dnrm2(state->acc); vnorm = gsl_blas_dnrm2(state->vel); /* store |a| / |v| */ *(trust_state->avratio) = anorm / vnorm; } /* compute step dx = v + 1/2 a */ scaled_addition(1.0, state->vel, 0.5, state->acc, dx); return GSL_SUCCESS; } /* lm_preduction() Compute predicted reduction using Eq 4.4 of More 1978 */ static int lm_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; const gsl_vector *diag = trust_state->diag; const gsl_vector *p = state->vel; const double norm_Dp = scaled_enorm(diag, p); const double normf = gsl_blas_dnrm2(trust_state->f); const double mu = *(trust_state->mu); double u, v; (void)dx; /* compute workp = J^T J p */ gsl_blas_dsymv(CblasLower, 1.0, trust_state->JTJ, p, 0.0, state->workp); /* compute u = p^T J^T J p = ||J p||^2 */ gsl_blas_ddot(state->workp, p, &u); /* compute u = ||J p||^2 / ||f||^2 */ u /= normf * normf; /* v = ||D p|| / ||f|| */ v = norm_Dp / normf; *pred = u + 2.0 * mu * v * v; return GSL_SUCCESS; } static const gsl_multilarge_nlinear_trs lm_type = { "levenberg-marquardt", lm_alloc_noaccel, lm_init, lm_preloop, lm_step, lm_preduction, lm_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_lm = &lm_type; static const gsl_multilarge_nlinear_trs lmaccel_type = { "levenberg-marquardt+accel", lm_alloc_accel, lm_init, lm_preloop, lm_step, lm_preduction, lm_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_lmaccel = &lmaccel_type; gsl-doc-2.3/multilarge_nlinear/test_biggs.c0000644000175000017500000001054612757616366017164 0ustar eddedd#define biggs_N 6 /* >= p */ #define biggs_P 6 /* dogleg method has trouble converging from recommended starting point, * so we use an x0 which is a little closer to the true solution */ /*static double biggs_x0[biggs_P] = { 1.0, 2.0, 1.0, 1.0, 1.0, 1.0 };*/ static double biggs_x0[biggs_P] = { 1.0, 8.0, 1.0, 2.0, 3.0, 2.0 }; static double biggs_epsrel = 1.0e-9; static double biggs_J[biggs_N * biggs_P]; static void biggs_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { #if 0 const double sumsq_exact = 0.0; #endif const double biggs_x[biggs_P] = { 1.0, 10.0, 1.0, 5.0, 4.0, 3.0 }; const double norm_exact = 12.3288280059380; gsl_vector_const_view v = gsl_vector_const_view_array(biggs_x, biggs_P); double norm = gsl_blas_dnrm2(&v.vector); #if 0 /* some solvers have difficulty reaching sumsq = 0 to sufficient * decimal places */ gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); #endif /* * the solution vector is not unique due to permutations, so test * the norm instead of individual elements */ gsl_test_rel(norm, norm_exact, epsrel, "%s/%s norm", sname, pname); (void)x; /* avoid unused parameter warning */ (void)sumsq; /* avoid unused parameter warning */ } static int biggs_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); double yi = exp(-ti) - 5*exp(-10*ti) + 3*exp(-4*ti); double fi = x3*exp(-ti*x1) - x4*exp(-ti*x2) + x6*exp(-ti*x5) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int biggs_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(biggs_J, biggs_N, biggs_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); gsl_matrix_set(&J.matrix, i, 0, -ti*x3*exp(-ti*x1)); gsl_matrix_set(&J.matrix, i, 1, ti*x4*exp(-ti*x2)); gsl_matrix_set(&J.matrix, i, 2, exp(-ti*x1)); gsl_matrix_set(&J.matrix, i, 3, -exp(-ti*x2)); gsl_matrix_set(&J.matrix, i, 4, -ti*x6*exp(-ti*x5)); gsl_matrix_set(&J.matrix, i, 5, exp(-ti*x5)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int biggs_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); double v6 = gsl_vector_get(v, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); double term1 = exp(-ti * x1); double term2 = exp(-ti * x2); double term3 = exp(-ti * x5); gsl_vector_set(fvv, i, ti * term1 * term2 * term3 * (v1/(term2*term3)*(-2*v3 + ti*v1*x3) - v2/(term1*term3)*(-2*v4 + ti*v2*x4) + v5/(term1*term2)*(-2*v6 + ti*v5*x6))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf biggs_func = { biggs_f, biggs_df, biggs_fvv, biggs_N, biggs_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem biggs_problem = { "biggs", biggs_x0, NULL, &biggs_epsrel, &biggs_checksol, &biggs_func }; gsl-doc-2.3/multilarge_nlinear/test_powell2.c0000644000175000017500000000456112753424350017437 0ustar eddedd#define powell2_N 2 #define powell2_P 2 static double powell2_x0[powell2_P] = { 3.0, 1.0 }; static double powell2_epsrel = 1.0e-3; static double powell2_J[powell2_N * powell2_P]; static void powell2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell2_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell2_f (const gsl_vector * x, void *params, gsl_vector * f) { double x0 = gsl_vector_get (x, 0); double x1 = gsl_vector_get (x, 1); gsl_vector_set(f, 0, x0); gsl_vector_set(f, 1, 10.0*x0/(x0 + 0.1) + 2.0*x1*x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell2_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(powell2_J, powell2_N, powell2_P); double x0 = gsl_vector_get (x, 0); double x1 = gsl_vector_get (x, 1); double term = x0 + 0.1; gsl_matrix_set(&J.matrix, 0, 0, 1.0); gsl_matrix_set(&J.matrix, 0, 1, 0.0); gsl_matrix_set(&J.matrix, 1, 0, 1.0 / (term * term)); gsl_matrix_set(&J.matrix, 1, 1, 4.0 * x1); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x0 = gsl_vector_get (x, 0); double v0 = gsl_vector_get (v, 0); double v1 = gsl_vector_get (v, 1); double term = x0 + 0.1; gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 4*v1*v1 - (2*v0*v0)/pow(term, 3.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf powell2_func = { powell2_f, powell2_df, powell2_fvv, powell2_N, powell2_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem powell2_problem = { "powell2", powell2_x0, NULL, &powell2_epsrel, &powell2_checksol, &powell2_func }; gsl-doc-2.3/multilarge_nlinear/test_bard.c0000644000175000017500000000730412753424213016757 0ustar eddedd#define bard_N 15 #define bard_P 3 static double bard_x0[bard_P] = { 1.0, 1.0, 1.0 }; static double bard_epsrel = 1.0e-7; static double bard_J[bard_N * bard_P]; static double bard_Y[bard_N] = { 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, 0.96, 1.34, 2.10, 4.39 }; static void bard_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 8.214877306578963e-03; const double bard_x1[bard_P] = { 8.241055975623580e-02, 1.133036092245175, 2.343695178435405 }; const double sumsq_exact2 = 17.42869333333333; const double bard_x2[bard_P] = { 8.406666666666666e-01, GSL_NAN, /* -inf */ GSL_NAN }; /* -inf */ const double *bard_x; double sumsq_exact; if (fabs(x[1]) < 10.0 && fabs(x[2]) < 10.0) { bard_x = bard_x1; sumsq_exact = sumsq_exact1; } else { bard_x = bard_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < bard_P; ++i) { if (!gsl_finite(bard_x[i])) continue; gsl_test_rel(x[i], bard_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int bard_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double yi = bard_Y[i]; double fi = yi - (x1 + (ui / (x2*vi + x3*wi))); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int bard_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(bard_J, bard_N, bard_P); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double term = x2 * vi + x3 * wi; gsl_matrix_set(&J.matrix, i, 0, -1.0); gsl_matrix_set(&J.matrix, i, 1, ui * vi / (term * term)); gsl_matrix_set(&J.matrix, i, 2, ui * wi / (term * term)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int bard_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double term1 = x2 * vi + x3 * wi; double term2 = v2 * vi + v3 * wi; double ratio = term2 / term1; gsl_vector_set(fvv, i, -2.0 * ui * ratio * ratio / term1); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf bard_func = { bard_f, bard_df, bard_fvv, bard_N, bard_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem bard_problem = { "bard", bard_x0, NULL, &bard_epsrel, &bard_checksol, &bard_func }; gsl-doc-2.3/multilarge_nlinear/test_vardim.c0000644000175000017500000000527112753424404017334 0ustar eddedd#define vardim_N 7 /* p + 2 */ #define vardim_P 5 static double vardim_x0[vardim_P] = { 0.8, 0.6, 0.4, 0.2, 0.0 }; static double vardim_epsrel = 1.0e-12; static double vardim_J[vardim_N * vardim_P]; static void vardim_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < vardim_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int vardim_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = 0.0; for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi - 1.0); sum += (i + 1.0) * (xi - 1.0); } gsl_vector_set(f, vardim_P, sum); gsl_vector_set(f, vardim_P + 1, sum*sum); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int vardim_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(vardim_J, vardim_N, vardim_P); size_t i; double sum = 0.0; gsl_matrix_view m = gsl_matrix_submatrix(&J.matrix, 0, 0, vardim_P, vardim_P); gsl_matrix_set_identity(&m.matrix); for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); sum += (i + 1.0) * (xi - 1.0); } for (i = 0; i < vardim_P; ++i) { gsl_matrix_set(&J.matrix, vardim_P, i, i + 1.0); gsl_matrix_set(&J.matrix, vardim_P + 1, i, 2*(i + 1.0)*sum); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int vardim_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i; double sum = 0.0; gsl_vector_set_zero(fvv); for (i = 0; i < vardim_P; ++i) { double vi = gsl_vector_get(v, i); sum += (i + 1.0) * vi; } gsl_vector_set(fvv, vardim_N - 1, 2.0 * sum * sum); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf vardim_func = { vardim_f, vardim_df, vardim_fvv, vardim_N, vardim_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem vardim_problem = { "vardim", vardim_x0, NULL, &vardim_epsrel, &vardim_checksol, &vardim_func }; gsl-doc-2.3/multilarge_nlinear/TODO0000644000175000017500000000024713013076573015335 0ustar eddedd1. finite difference J and fvv for cholesky solver 2. Fix biggs test x0 and dogleg / ddogleg convergence issue 3. add subspaced2D to multilarge example output in docs gsl-doc-2.3/multilarge_nlinear/test_fdf.c0000644000175000017500000002636512767073275016633 0ustar eddedd/* multilarge_nlinear/test_fdf.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 struct { const char *name; double *x0; /* initial parameters (size p) */ double *sigma; double *epsrel; /* relative tolerance for solution checking */ void (*checksol) (const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname); gsl_multilarge_nlinear_fdf *fdf; } test_fdf_problem; #include "test_bard.c" #include "test_beale.c" #include "test_biggs.c" #include "test_box.c" #include "test_boxbod.c" #include "test_brown1.c" #include "test_brown2.c" #include "test_brown3.c" #include "test_eckerle.c" #include "test_enso.c" #include "test_exp1.c" #include "test_gaussian.c" #include "test_hahn1.c" #include "test_helical.c" #include "test_jennrich.c" #include "test_kirby2.c" #include "test_kowalik.c" #include "test_lin1.c" #include "test_lin2.c" #include "test_lin3.c" #include "test_meyer.c" #include "test_meyerscal.c" #include "test_osborne.c" #include "test_penalty1.c" #include "test_penalty2.c" #include "test_powell1.c" #include "test_powell2.c" #include "test_powell3.c" #include "test_rat42.c" #include "test_rat43.c" #include "test_rosenbrock.c" #include "test_rosenbrocke.c" #include "test_roth.c" #include "test_thurber.c" #include "test_vardim.c" #include "test_watson.c" #include "test_wood.c" #include "test_wnlin.c" static void test_fdf(const gsl_multilarge_nlinear_type * T, const gsl_multilarge_nlinear_parameters * params, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts); static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multilarge_nlinear_workspace *s, test_fdf_problem *problem); static void test_scale_x0(gsl_vector *x0, const double scale); /* * FIXME: some test problems are disabled since they fail on certain * solvers. Known failures are: * * Method test-problem * ====== ============ * dogleg thurbera * dogleg rat43a * cgst boxboda */ static test_fdf_problem *test_problems[] = { /* * These test problems are taken from * * H. B. Nielsen, UCTP test problems for unconstrained optimization, * IMM Department of Mathematical Modeling, Tech. Report * IMM-REP-2000-17, 2000. */ &lin1_problem, /* 1 */ &lin2_problem, /* 2 */ &lin3_problem, /* 3 */ &rosenbrock_problem, /* 4 */ &helical_problem, /* 5 */ &powell1_problem, /* 6 */ &roth_problem, /* 7 */ &bard_problem, /* 8 */ &kowalik_problem, /* 9 */ &meyer_problem, /* 10 */ &watson_problem, /* 11 */ &box_problem, /* 12 */ &jennrich_problem, /* 13 */ &brown1_problem, /* 14 */ &brown2_problem, /* 16 */ &osborne_problem, /* 17 */ &exp1_problem, /* 18 */ &meyerscal_problem, /* 20 */ &powell2_problem, /* * These tests are from * * J. J. More, B. S. Garbow and K. E. Hillstrom, Testing * Unconstrained Optimization Software, ACM Trans. Math. Soft. * Vol 7, No 1, 1981. * * Many of these overlap with the Nielsen tests */ &rosenbrock_problem, /* 1 */ &roth_problem, /* 2 */ &powell3_problem, /* 3 */ &brown3_problem, /* 4 */ &beale_problem, /* 5 */ &jennrich_problem, /* 6 */ &helical_problem, /* 7 */ &bard_problem, /* 8 */ &gaussian_problem, /* 9 */ &meyer_problem, /* 10 */ &box_problem, /* 12 */ &powell1_problem, /* 13 */ &wood_problem, /* 14 */ &kowalik_problem, /* 15 */ &brown1_problem, /* 16 */ &osborne_problem, /* 17 */ &biggs_problem, /* 18 */ &watson_problem, /* 20 */ &rosenbrocke_problem, /* 21 */ &penalty1_problem, /* 23 */ &penalty2_problem, /* 24 */ &vardim_problem, /* 25 */ &brown2_problem, /* 27 */ &lin1_problem, /* 32 */ &lin2_problem, /* 33 */ &lin3_problem, /* 34 */ /* NIST test cases */ &kirby2a_problem, &kirby2b_problem, &hahn1a_problem, &hahn1b_problem, &ensoa_problem, &ensob_problem, /*&thurbera_problem,*/ &thurberb_problem, /*&boxboda_problem,*/ &boxbodb_problem, &rat42a_problem, &rat42b_problem, &eckerlea_problem, &eckerleb_problem, /*&rat43a_problem,*/ &rat43b_problem, NULL }; static void test_fdf_main(const gsl_multilarge_nlinear_parameters * params) { const double xtol = pow(GSL_DBL_EPSILON, 0.9); const double gtol = pow(GSL_DBL_EPSILON, 0.9); const double ftol = 0.0; size_t i; for (i = 0; test_problems[i] != NULL; ++i) { test_fdf_problem *problem = test_problems[i]; double epsrel = *(problem->epsrel); gsl_multilarge_nlinear_fdf fdf; /*XXX: finite difference fvv not working yet */ if (problem->fdf->fvv == NULL) continue; test_fdf(gsl_multilarge_nlinear_trust, params, xtol, gtol, ftol, epsrel, 1.0, problem, NULL); #if 0 /* XXX */ /* test finite difference Jacobian */ fdf.df = problem->fdf->df; problem->fdf->df = NULL; test_fdf(gsl_multilarge_nlinear_trust, params, xtol, gtol, ftol, 1.0e3 * epsrel, 1.0, problem, NULL); problem->fdf->df = fdf.df; #endif #if 0 if (params->trs == gsl_multilarge_nlinear_trs_lmaccel && problem->fdf->fvv != NULL) { /* test finite difference second directional derivative */ fdf.fvv = problem->fdf->fvv; problem->fdf->fvv = NULL; test_fdf(gsl_multilarge_nlinear_trust, params, xtol, gtol, ftol, epsrel / params->h_fvv, 1.0, problem, NULL); problem->fdf->fvv = fdf.fvv; } #endif } /* test weighted nonlinear least squares */ /* internal weighting in _f and _df functions */ test_fdf(gsl_multilarge_nlinear_trust, params, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem1, NULL); } /* test_fdf() Test a weighted nonlinear least squares problem Inputs: T - solver to use params - solver parameters xtol - tolerance in x gtol - tolerance in gradient ftol - tolerance in residual vector epsrel - relative error tolerance in solution x0_scale - to test robustness against starting points, the standard starting point in 'problem' is multiplied by this scale factor: x0 <- x0 * x0_scale If x0 = 0, then all components of x0 are set to x0_scale problem - contains the nonlinear problem and solution point wts - weight vector (NULL for unweighted) */ static void test_fdf(const gsl_multilarge_nlinear_type * T, const gsl_multilarge_nlinear_parameters * params, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts) { gsl_multilarge_nlinear_fdf *fdf = problem->fdf; const size_t n = fdf->n; const size_t p = fdf->p; const size_t max_iter = 2500; gsl_vector *x0 = gsl_vector_alloc(p); gsl_vector_view x0v = gsl_vector_view_array(problem->x0, p); gsl_multilarge_nlinear_workspace *w = gsl_multilarge_nlinear_alloc (T, params, n, p); const char *pname = problem->name; char buf[2048]; char sname[2048]; int status, info; sprintf(buf, "%s/%s/solver=%s/scale=%s%s%s", gsl_multilarge_nlinear_name(w), params->trs->name, params->solver->name, params->scale->name, problem->fdf->df ? "" : "/fdjac", problem->fdf->fvv ? "" : "/fdfvv"); strcpy(sname, buf); /* scale starting point x0 */ gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); if (wts) { gsl_vector_const_view wv = gsl_vector_const_view_array(wts, n); gsl_multilarge_nlinear_winit(x0, &wv.vector, fdf, w); } else gsl_multilarge_nlinear_init(x0, fdf, w); status = gsl_multilarge_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, w); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* check solution */ test_fdf_checksol(sname, pname, epsrel, w, problem); if (wts == NULL) { /* test again with weighting matrix W = I */ gsl_vector *wv = gsl_vector_alloc(n); sprintf(sname, "%s/weighted", buf); gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); gsl_vector_set_all(wv, 1.0); gsl_multilarge_nlinear_winit(x0, wv, fdf, w); status = gsl_multilarge_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, w); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); test_fdf_checksol(sname, pname, epsrel, w, problem); gsl_vector_free(wv); } gsl_multilarge_nlinear_free(w); gsl_vector_free(x0); } static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multilarge_nlinear_workspace *w, test_fdf_problem *problem) { gsl_multilarge_nlinear_fdf *fdf = problem->fdf; const double *sigma = problem->sigma; gsl_vector *f = gsl_multilarge_nlinear_residual(w); gsl_vector *x = gsl_multilarge_nlinear_position(w); double sumsq; /* check solution vector x and sumsq = ||f||^2 */ gsl_blas_ddot(f, f, &sumsq); (problem->checksol)(x->data, sumsq, epsrel, sname, pname); /* XXX: covariance not implemented for cgst method */ if (w->params.trs == gsl_multilarge_nlinear_trs_cgst) return; /* check variances */ if (sigma) { const size_t n = fdf->n; const size_t p = fdf->p; size_t i; gsl_matrix * covar = gsl_matrix_alloc (p, p); gsl_multilarge_nlinear_covar (covar, w); for (i = 0; i < p; i++) { double ei = sqrt(sumsq/(n-p))*sqrt(gsl_matrix_get(covar,i,i)); gsl_test_rel (ei, sigma[i], epsrel, "%s/%s, sigma(%d)", sname, pname, i) ; } gsl_matrix_free (covar); } } static void test_scale_x0(gsl_vector *x0, const double scale) { double nx = gsl_blas_dnrm2(x0); if (nx == 0.0) gsl_vector_set_all(x0, scale); else gsl_vector_scale(x0, scale); } /* test_scale_x0() */ gsl-doc-2.3/multilarge_nlinear/test_jennrich.c0000644000175000017500000000543012753424302017644 0ustar eddedd#define jennrich_N 10 #define jennrich_P 2 static double jennrich_x0[jennrich_P] = { 0.3, 0.4 }; static double jennrich_epsrel = 1.0e-7; static double jennrich_J[jennrich_N * jennrich_P]; static void jennrich_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.243621823556148e+02; const double jennrich_x[jennrich_P] = { 2.578252139935855e-01, 2.578252133471426e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < jennrich_P; ++i) { gsl_test_rel(x[i], jennrich_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int jennrich_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; double fi = 2.0*(i + 2.0) - (exp(x1*ip1) + exp(x2*ip1)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int jennrich_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(jennrich_J, jennrich_N, jennrich_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; gsl_matrix_set(&J.matrix, i, 0, -ip1*exp(ip1*x1)); gsl_matrix_set(&J.matrix, i, 1, -ip1*exp(ip1*x2)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int jennrich_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; double term1 = exp(ip1*x1); double term2 = exp(ip1*x2); gsl_vector_set(fvv, i, -ip1*ip1*(v1*v1*term1 + v2*v2*term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf jennrich_func = { jennrich_f, jennrich_df, jennrich_fvv, jennrich_N, jennrich_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem jennrich_problem = { "jennrich", jennrich_x0, NULL, &jennrich_epsrel, &jennrich_checksol, &jennrich_func }; gsl-doc-2.3/multilarge_nlinear/test_rat43.c0000644000175000017500000000631112753424364017010 0ustar eddedd#define rat43_N 15 #define rat43_P 4 static double rat43_x0a[rat43_P] = { 100.0, 10.0, 1.0, 1.0 }; static double rat43_x0b[rat43_P] = { 700.0, 5.0, 0.75, 1.3 }; static double rat43_epsrel = 1.0e-6; static double rat43_J[rat43_N * rat43_P]; static double rat43_sigma[rat43_P] = { 1.6302297817E+01, 2.0828735829E+00, 1.9566123451E-01, 6.8761936385E-01 }; static double rat43_F[rat43_N] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 }; static void rat43_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.7864049080E+03; const double rat43_x[rat43_P] = { 6.9964151270E+02, 5.2771253025E+00, 7.5962938329E-01, 1.2792483859E+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat43_P; ++i) { gsl_test_rel(x[i], rat43_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat43_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double yi = b[0] / pow(1.0 + e, 1.0 / b[3]); gsl_vector_set (f, i, yi - rat43_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat43_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(rat43_J, rat43_N, rat43_P); double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double term1 = 1.0 + e; double term2 = pow(term1, -1.0 / b[3]); gsl_matrix_set (&J.matrix, i, 0, term2); gsl_matrix_set (&J.matrix, i, 1, -b[0] / b[3] * e * term2 / term1); gsl_matrix_set (&J.matrix, i, 2, b[0] / b[3] * xi * e * term2 / term1); gsl_matrix_set (&J.matrix, i, 3, b[0] / b[3] / b[3] * log(term1) * term2); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf rat43_func = { rat43_f, rat43_df, NULL, /* analytic expression too complex */ rat43_N, rat43_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem rat43a_problem = { "nist-rat43a", rat43_x0a, rat43_sigma, &rat43_epsrel, &rat43_checksol, &rat43_func }; static test_fdf_problem rat43b_problem = { "nist-rat43b", rat43_x0b, rat43_sigma, &rat43_epsrel, &rat43_checksol, &rat43_func }; gsl-doc-2.3/multilarge_nlinear/test_roth.c0000644000175000017500000000516312753424376017036 0ustar eddedd#define roth_N 2 #define roth_P 2 static double roth_x0[roth_P] = { 0.5, -2.0 }; static double roth_epsrel = 1.0e-7; static double roth_J[roth_N * roth_P]; static void roth_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 0.0; const double roth_x1[roth_P] = { 5.0, 4.0 }; const double sumsq_exact2 = 48.9842536792400; const double roth_x2[roth_P] = { 11.4127789869021, -0.896805253274477 }; const double *roth_x; double sumsq_exact; if (fabs(sumsq) < 0.1) { sumsq_exact = sumsq_exact1; roth_x = roth_x1; } else { sumsq_exact = sumsq_exact2; roth_x = roth_x2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < roth_P; ++i) { gsl_test_rel(x[i], roth_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int roth_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - x2*(2.0 - x2*(5.0 - x2)) - 13.0); gsl_vector_set(f, 1, x1 - x2*(14.0 - x2*(1.0 + x2)) - 29.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int roth_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(roth_J, roth_N, roth_P); double x2 = gsl_vector_get(x, 1); gsl_matrix_set(&J.matrix, 0, 0, 1.0); gsl_matrix_set(&J.matrix, 0, 1, -2.0 + x2*(10.0 - 3.0*x2)); gsl_matrix_set(&J.matrix, 1, 0, 1.0); gsl_matrix_set(&J.matrix, 1, 1, -14.0 + x2*(2.0 + 3.0*x2)); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int roth_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, (10.0 - 6.0*x2) * v2 * v2); gsl_vector_set(fvv, 1, (2.0 + 6.0*x2) * v2 * v2); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf roth_func = { roth_f, roth_df, roth_fvv, roth_N, roth_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem roth_problem = { "roth_freudenstein", roth_x0, NULL, &roth_epsrel, &roth_checksol, &roth_func }; gsl-doc-2.3/multilarge_nlinear/test_penalty1.c0000644000175000017500000000527112753440716017613 0ustar eddedd#define penalty1_P 10 #define penalty1_N (penalty1_P + 1) static double penalty1_x0[penalty1_P] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 }; static double penalty1_epsrel = 1.0e-12; static double penalty1_J[penalty1_N * penalty1_P]; static void penalty1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 7.08765146709037993e-05; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); (void)x; /* avoid unused parameter warning */ } static int penalty1_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; double sum = 0.0; for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, sqrt_alpha*(xi - 1.0)); sum += xi * xi; } gsl_vector_set(f, penalty1_N - 1, sum - 0.25); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(penalty1_J, penalty1_N, penalty1_P); const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; gsl_matrix_view m = gsl_matrix_submatrix(&J.matrix, 0, 0, penalty1_P, penalty1_P); gsl_vector_view diag = gsl_matrix_diagonal(&m.matrix); gsl_matrix_set_zero(&m.matrix); gsl_vector_set_all(&diag.vector, sqrt_alpha); for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_matrix_set(&J.matrix, penalty1_N - 1, i, 2.0 * xi); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double u; gsl_vector_set_zero(fvv); gsl_blas_ddot(v, v, &u); gsl_vector_set(fvv, penalty1_N - 1, 2.0 * u); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf penalty1_func = { penalty1_f, penalty1_df, penalty1_fvv, penalty1_N, penalty1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem penalty1_problem = { "penalty1", penalty1_x0, NULL, &penalty1_epsrel, &penalty1_checksol, &penalty1_func }; gsl-doc-2.3/multilarge_nlinear/dummy.c0000644000175000017500000000543712755636450016162 0ustar eddedd/* multilarge_nlinear/dummy.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* dummy linear solver */ #include #include #include #include #include #include #include #include #include static void *dummy_alloc (const size_t n, const size_t p); static int dummy_init(const void * vtrust_state, void * vstate); static int dummy_presolve(const double mu, const void * vtrust_state, void * vstate); static int dummy_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate); static int dummy_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate); static int dummy_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate); static void * dummy_alloc (const size_t n, const size_t p) { (void) n; (void) p; return NULL; } static void dummy_free(void *vstate) { (void) vstate; } static int dummy_init(const void * vtrust_state, void * vstate) { (void) vtrust_state; (void) vstate; return GSL_SUCCESS; } static int dummy_presolve(const double mu, const void * vtrust_state, void * vstate) { (void) mu; (void) vtrust_state; (void) vstate; return GSL_SUCCESS; } static int dummy_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate) { (void) g; (void) x; (void) vtrust_state; (void) vstate; return GSL_SUCCESS; } static int dummy_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate) { (void) vstate; (void) rcond; (void) JTJ; *rcond = 0.0; return GSL_SUCCESS; } static int dummy_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate) { (void) vstate; (void) JTJ; gsl_matrix_set_zero(covar); return GSL_SUCCESS; } static const gsl_multilarge_nlinear_solver dummy_type = { "dummy", dummy_alloc, dummy_init, dummy_presolve, dummy_solve, dummy_rcond, dummy_covar, dummy_free }; const gsl_multilarge_nlinear_solver *gsl_multilarge_nlinear_solver_none = &dummy_type; gsl-doc-2.3/multilarge_nlinear/test_rosenbrock.c0000644000175000017500000000450012753424370020215 0ustar eddedd#define rosenbrock_N 2 #define rosenbrock_P 2 static double rosenbrock_x0[rosenbrock_P] = { -1.2, 1.0 }; static double rosenbrock_epsrel = 1.0e-12; static double rosenbrock_J[rosenbrock_N * rosenbrock_P]; static void rosenbrock_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrock_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 10.0 * (x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrock_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(rosenbrock_J, rosenbrock_N, rosenbrock_P); double x1 = gsl_vector_get(x, 0); gsl_matrix_set(&J.matrix, 0, 0, -20.0*x1); gsl_matrix_set(&J.matrix, 0, 1, 10.0); gsl_matrix_set(&J.matrix, 1, 0, -1.0); gsl_matrix_set(&J.matrix, 1, 1, 0.0); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrock_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); gsl_vector_set(fvv, 0, -20.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf rosenbrock_func = { rosenbrock_f, rosenbrock_df, rosenbrock_fvv, rosenbrock_N, rosenbrock_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem rosenbrock_problem = { "rosenbrock", rosenbrock_x0, NULL, &rosenbrock_epsrel, &rosenbrock_checksol, &rosenbrock_func }; gsl-doc-2.3/multilarge_nlinear/test_box.c0000644000175000017500000000724112753424235016643 0ustar eddedd#define box_N 10 /* can be >= p */ #define box_P 3 /* dogleg method fails with recommended starting point, so use * a slightly easier x0 */ /*static double box_x0[box_P] = { 0.0, 10.0, 20.0 };*/ static double box_x0[box_P] = { 5.0, 10.0, 2.0 }; static double box_epsrel = 1.0e-12; static double box_J[box_N * box_P]; static void box_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 0.0; const double eps = 1.0e-6; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* there are 3 possible solution vectors */ if (fabs(x[2] - 1.0) < eps) { /* case 1: x* = [ 1; 10; 1 ] */ gsl_test_rel(x[0], 1.0, epsrel, "%s/%s i=0", sname, pname); gsl_test_rel(x[1], 10.0, epsrel, "%s/%s i=1", sname, pname); gsl_test_rel(x[2], 1.0, epsrel, "%s/%s i=2", sname, pname); } else if (fabs(x[2] + 1.0) < eps) { /* case 2: x* = [ 10; 1; -1 ] */ gsl_test_rel(x[0], 10.0, epsrel, "%s/%s i=0", sname, pname); gsl_test_rel(x[1], 1.0, epsrel, "%s/%s i=1", sname, pname); gsl_test_rel(x[2], -1.0, epsrel, "%s/%s i=2", sname, pname); } else { /* case 3: x* = [ a; a; 0 ] for any a */ gsl_test_rel(x[0], x[1], epsrel, "%s/%s i=0,1", sname, pname); gsl_test_rel(x[2], 0.0, epsrel, "%s/%s i=2", sname, pname); } } static int box_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double fi = exp(-x1*ti) - exp(-x2*ti) - x3*(exp(-ti) - exp(-10.0*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int box_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(box_J, box_N, box_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double term1 = exp(-x1*ti); double term2 = exp(-x2*ti); double term3 = exp(-10.0*ti) - exp(-ti); gsl_matrix_set(&J.matrix, i, 0, -ti*term1); gsl_matrix_set(&J.matrix, i, 1, ti*term2); gsl_matrix_set(&J.matrix, i, 2, term3); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int box_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double term1 = exp(-x1*ti); double term2 = exp(-x2*ti); gsl_vector_set(fvv, i, ti * ti * (v1*v1*term1 - v2*v2*term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf box_func = { box_f, box_df, box_fvv, box_N, box_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem box_problem = { "box3d", box_x0, NULL, &box_epsrel, &box_checksol, &box_func }; gsl-doc-2.3/multilarge_nlinear/test_lin2.c0000644000175000017500000000455412753424317016724 0ustar eddedd#define lin2_N 20 /* can be anything >= p */ #define lin2_P 5 static double lin2_x0[lin2_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin2_epsrel = 1.0e-8; static double lin2_J[lin2_N * lin2_P]; static void lin2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin2_N; const double sumsq_exact = 0.5 * (n*(n - 1.0)) / (2.0*n + 1.0); const double sum_exact = 3.0 / (2.0*n + 1.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin2_P; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); } static int lin2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin2_N; ++i) { double fi = 0.0; for (j = 0; j < lin2_P; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = (i + 1) * fi - 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin2_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(lin2_J, lin2_N, lin2_P); size_t i, j; for (i = 0; i < lin2_N; ++i) { for (j = 0; j < lin2_P; ++j) { gsl_matrix_set(&J.matrix, i, j, (i + 1.0) * (j + 1.0)); } } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf lin2_func = { lin2_f, lin2_df, lin2_fvv, lin2_N, lin2_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem lin2_problem = { "linear_rank1", lin2_x0, NULL, &lin2_epsrel, &lin2_checksol, &lin2_func }; gsl-doc-2.3/multilarge_nlinear/test_beale.c0000644000175000017500000000522712753424220017117 0ustar eddedd#define beale_N 3 #define beale_P 2 static double beale_x0[beale_P] = { 1.0, 1.0 }; static double beale_epsrel = 1.0e-12; static double beale_J[beale_N * beale_P]; static double beale_Y[beale_N] = { 1.5, 2.25, 2.625 }; static void beale_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double beale_x[beale_P] = { 3.0, 0.5 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < beale_P; ++i) { gsl_test_rel(x[i], beale_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int beale_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double yi = beale_Y[i]; double term = pow(x2, i + 1.0); double fi = yi - x1*(1.0 - term); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int beale_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(beale_J, beale_N, beale_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double term = pow(x2, (double) i); gsl_matrix_set(&J.matrix, i, 0, term*x2 - 1.0); gsl_matrix_set(&J.matrix, i, 1, (i + 1.0) * x1 * term); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int beale_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < beale_N; ++i) { double term = pow(x2, (double)i - 1.0); gsl_vector_set(fvv, i, (i + 1.0) * v2 * term * (i * v2 * x1 + 2.0 * v1 * x2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf beale_func = { beale_f, beale_df, beale_fvv, beale_N, beale_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem beale_problem = { "beale", beale_x0, NULL, &beale_epsrel, &beale_checksol, &beale_func }; gsl-doc-2.3/multilarge_nlinear/test_lin3.c0000644000175000017500000000507112753424322016714 0ustar eddedd#define lin3_N 50 /* can be anything >= p */ #define lin3_P 10 /* >= 3 */ static double lin3_x0[lin3_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin3_epsrel = 1.0e-8; static double lin3_J[lin3_N * lin3_P]; static void lin3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin3_N; const double sumsq_exact = 0.5 * (n*n + 3*n - 6.0) / (2*n - 3.0); const double sum_exact = 3.0 / (2.0*n - 3.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < lin3_P - 1; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); (void)x; /* avoid unused parameter warning */ } static int lin3_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; gsl_vector_set(f, 0, -1.0); gsl_vector_set(f, lin3_N - 1, -1.0); for (i = 1; i < lin3_N - 1; ++i) { double fi = 0.0; for (j = 1; j < lin3_P - 1; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = i * fi - 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin3_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(lin3_J, lin3_N, lin3_P); size_t i, j; gsl_matrix_set_zero(&J.matrix); for (i = 1; i < lin3_N - 1; ++i) { for (j = 1; j < lin3_P - 1; ++j) { gsl_matrix_set(&J.matrix, i, j, i * (j + 1.0)); } } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf lin3_func = { lin3_f, lin3_df, lin3_fvv, lin3_N, lin3_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem lin3_problem = { "linear_rank1zeros", lin3_x0, NULL, &lin3_epsrel, &lin3_checksol, &lin3_func }; gsl-doc-2.3/multilarge_nlinear/test_helical.c0000644000175000017500000000610612753424276017460 0ustar eddedd#define helical_N 3 #define helical_P 3 static double helical_x0[helical_P] = { -1.0, 0.0, 0.0 }; static double helical_x[helical_P] = { 1.0, 0.0, 0.0 }; static double helical_epsrel = 1.0e-12; static double helical_J[helical_N * helical_P]; static void helical_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < helical_P; ++i) { gsl_test_rel(x[i], helical_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int helical_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double theta = (x1 >= 0.0) ? 0.0 : 5.0; double nx = gsl_hypot(x1, x2); gsl_vector_set(f, 0, 10.0 * (x3 - 5.0/M_PI*atan(x2 / x1) - theta)); gsl_vector_set(f, 1, 10.0*(nx - 1.0)); gsl_vector_set(f, 2, x3); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int helical_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(helical_J, helical_N, helical_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double nx = gsl_hypot(x1, x2); double nx_sq = nx * nx; double term1 = 50.0 / (M_PI * nx_sq); double term2 = 10.0 / nx; gsl_matrix_set(&J.matrix, 0, 0, term1*x2); gsl_matrix_set(&J.matrix, 0, 1, -term1*x1); gsl_matrix_set(&J.matrix, 0, 2, 10.0); gsl_matrix_set(&J.matrix, 1, 0, term2*x1); gsl_matrix_set(&J.matrix, 1, 1, term2*x2); gsl_matrix_set(&J.matrix, 1, 2, 0.0); gsl_matrix_set(&J.matrix, 2, 0, 0.0); gsl_matrix_set(&J.matrix, 2, 1, 0.0); gsl_matrix_set(&J.matrix, 2, 2, 1.0); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int helical_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double term1 = v2*x1 - v1*x2; double term2 = v1*x1 + v2*x2; double term3 = x1*x1 + x2*x2; gsl_vector_set(fvv, 0, 100.0 / M_PI * (term1 / term3) * (term2 / term3)); gsl_vector_set(fvv, 1, 10.0 * (term1 * term1) / pow(term3, 1.5)); gsl_vector_set(fvv, 2, 0.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf helical_func = { helical_f, helical_df, helical_fvv, helical_N, helical_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem helical_problem = { "helical", helical_x0, NULL, &helical_epsrel, &helical_checksol, &helical_func }; gsl-doc-2.3/multilarge_nlinear/trust.c0000644000175000017500000004224012755635660016203 0ustar eddedd/* multilarge_nlinear/trust.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "common.c" #include "nielsen.c" /* * This module contains a high level driver for a general trust * region nonlinear least squares solver. This container handles * the computation of all of the quantities relevant to all trust * region methods, including: * * residual vector: f_k = f(x_k) * Jacobian matrix: J_k = J(x_k) * gradient vector: g_k = J_k^T f_k * scaling matrix: D_k */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ double delta; /* trust region radius */ double mu; /* LM parameter */ long nu; /* for updating LM parameter */ gsl_vector *diag; /* D = diag(J^T J) */ gsl_vector *x_trial; /* trial parameter vector */ gsl_vector *f_trial; /* trial function vector */ gsl_vector *workn; /* workspace, length n */ void *trs_state; /* workspace for trust region subproblem */ void *solver_state; /* workspace for linear least squares solver */ double avratio; /* current |a| / |v| */ /* tunable parameters */ gsl_multilarge_nlinear_parameters params; } trust_state_t; static void * trust_alloc (const gsl_multilarge_nlinear_parameters * params, const size_t n, const size_t p); static void trust_free(void *vstate); static int trust_init(void *vstate, const gsl_vector * swts, gsl_multilarge_nlinear_fdf *fdf, const gsl_vector *x, gsl_vector *f, gsl_vector *g, gsl_matrix *JTJ); static int trust_iterate(void *vstate, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *g, gsl_matrix *JTJ, gsl_vector *dx); static int trust_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate); static int trust_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate); static double trust_avratio(void *vstate); static void trust_trial_step(const gsl_vector * x, const gsl_vector * dx, gsl_vector * x_trial); static double trust_calc_rho(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * f_trial, const gsl_vector * dx, trust_state_t * state); static int trust_eval_step(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * f_trial, const gsl_vector * dx, double * rho, trust_state_t * state); static double trust_scaled_norm(const gsl_vector *D, const gsl_vector *a); static void * trust_alloc (const gsl_multilarge_nlinear_parameters * params, const size_t n, const size_t p) { trust_state_t *state; state = calloc(1, sizeof(trust_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate lm state", GSL_ENOMEM); } state->diag = gsl_vector_alloc(p); if (state->diag == NULL) { GSL_ERROR_NULL ("failed to allocate space for diag", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->x_trial = gsl_vector_alloc(p); if (state->x_trial == NULL) { GSL_ERROR_NULL ("failed to allocate space for x_trial", GSL_ENOMEM); } state->f_trial = gsl_vector_alloc(n); if (state->f_trial == NULL) { GSL_ERROR_NULL ("failed to allocate space for f_trial", GSL_ENOMEM); } state->trs_state = (params->trs->alloc)(params, n, p); if (state->trs_state == NULL) { GSL_ERROR_NULL ("failed to allocate space for trs state", GSL_ENOMEM); } if (params->solver != gsl_multilarge_nlinear_solver_none) { state->solver_state = (params->solver->alloc)(n, p); if (state->solver_state == NULL) { GSL_ERROR_NULL ("failed to allocate space for solver state", GSL_ENOMEM); } } state->n = n; state->p = p; state->delta = 0.0; state->params = *params; return state; } static void trust_free(void *vstate) { trust_state_t *state = (trust_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = &(state->params); if (state->diag) gsl_vector_free(state->diag); if (state->workn) gsl_vector_free(state->workn); if (state->x_trial) gsl_vector_free(state->x_trial); if (state->f_trial) gsl_vector_free(state->f_trial); if (state->trs_state) (params->trs->free)(state->trs_state); if (state->solver_state) (params->solver->free)(state->solver_state); free(state); } /* trust_init() Initialize trust region solver Inputs: vstate - workspace swts - sqrt(W) vector fdf - user callback functions x - initial parameter values f - (output) f(x) vector g - (output) J(x)' f(x) vector Return: success/error */ static int trust_init(void *vstate, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, const gsl_vector *x, gsl_vector *f, gsl_vector *g, gsl_matrix *JTJ) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = &(state->params); double Dx; /* evaluate function and Jacobian at x and apply weight transform */ status = gsl_multilarge_nlinear_eval_f(fdf, x, swts, f); if (status) return status; /* compute g = J^T f and J^T J */ status = gsl_multilarge_nlinear_eval_df(CblasTrans, x, f, f, swts, params->h_df, params->fdtype, fdf, g, JTJ, state->workn); if (status) return status; /* initialize diagonal scaling matrix D */ if (JTJ != NULL) (params->scale->init)(JTJ, state->diag); else gsl_vector_set_all(state->diag, 1.0); /* compute initial trust region radius */ Dx = trust_scaled_norm(state->diag, x); state->delta = 0.3 * GSL_MAX(1.0, Dx); /* initialize LM parameter */ nielsen_init(JTJ, state->diag, &(state->mu), &(state->nu)); /* initialize trust region method solver */ { const gsl_multilarge_nlinear_trust_state trust_state = { x, f, g, JTJ, state->diag, swts, &(state->mu), params, state->solver_state, fdf, &(state->avratio) }; status = (params->trs->init)(&trust_state, state->trs_state); if (status) return status; } /* set default parameters */ state->avratio = 0.0; return GSL_SUCCESS; } /* trust_iterate() This function performs 1 iteration of the trust region algorithm. It calls a user-specified method for computing the next step (LM or dogleg), then tests if the computed step is acceptable. Args: vstate - trust workspace swts - data weights (NULL if unweighted) fdf - function and Jacobian pointers x - on input, current parameter vector on output, new parameter vector x + dx f - on input, f(x) on output, f(x + dx) g - on input, g(x) = J(x)' f(x) on output, g(x + dx) = J(x + dx)' f(x + dx) JTJ - on input, J(x)^T J(x) on output, J(x + dx)^T J(x + dx) dx - (output only) parameter step vector Return: 1) GSL_SUCCESS if we found a step which reduces the cost function 2) GSL_ENOPROG if 15 successive attempts were to made to find a good step without success 3) If a scaling matrix D is used, inputs and outputs are set to the unscaled quantities (ie: J and g) */ static int trust_iterate(void *vstate, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *g, gsl_matrix *JTJ, gsl_vector *dx) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = &(state->params); const gsl_multilarge_nlinear_trs *trs = params->trs; /* collect all state parameters needed by low level methods */ const gsl_multilarge_nlinear_trust_state trust_state = { x, f, g, JTJ, state->diag, swts, &(state->mu), params, state->solver_state, fdf, &(state->avratio) }; gsl_vector *x_trial = state->x_trial; /* trial x + dx */ gsl_vector *f_trial = state->f_trial; /* trial f(x + dx) */ double rho; /* ratio actual_reduction/predicted_reduction */ int foundstep = 0; /* found step dx */ int bad_steps = 0; /* consecutive rejected steps */ /* initialize trust region subproblem with this Jacobian */ status = (trs->preloop)(&trust_state, state->trs_state); if (status) return status; /* loop until we find an acceptable step dx */ while (!foundstep) { /* calculate new step */ status = (trs->step)(&trust_state, state->delta, dx, state->trs_state); /* occasionally the iterative methods (ie: CG Steihaug) can fail to find a step, * so in this case skip rho calculation and count it as a rejected step */ if (status == GSL_SUCCESS) { /* compute x_trial = x + dx */ trust_trial_step(x, dx, x_trial); /* compute f_trial = f(x + dx) */ status = gsl_multilarge_nlinear_eval_f(fdf, x_trial, swts, f_trial); if (status) return status; /* check if step should be accepted or rejected */ status = trust_eval_step(&trust_state, f_trial, dx, &rho, state); if (status == GSL_SUCCESS) foundstep = 1; #if 0 /*XXX*/ fprintf(stdout, "delta = %.12e |D dx| = %.12e |dx| = %.12e, dx0 = %.12e dx1 = %.12e |x_trial| = %.12e |f_trial| = %.12e rho = %.12e\n", state->delta, scaled_enorm(state->diag, dx), gsl_blas_dnrm2(dx), gsl_vector_get(dx, 0), gsl_vector_get(dx, 1), gsl_blas_dnrm2(x_trial), gsl_blas_dnrm2(f_trial), rho); #endif } else { /* an iterative TRS method failed to find a step vector */ rho = -1.0; } /* * update trust region radius: if rho is large, * then the quadratic model is a good approximation * to the objective function, enlarge trust region. * If rho is small (or negative), the model function * is a poor approximation so decrease trust region. This * can happen even if the step is accepted. */ if (rho > 0.75) state->delta *= params->factor_up; else if (rho < 0.25) state->delta /= params->factor_down; if (foundstep) { /* step was accepted */ /* update x <- x + dx */ gsl_vector_memcpy(x, x_trial); /* update f <- f(x + dx) */ gsl_vector_memcpy(f, f_trial); /* compute new g = J^T f and J^T J */ status = gsl_multilarge_nlinear_eval_df(CblasTrans, x, f, f, swts, params->h_df, params->fdtype, fdf, g, JTJ, state->workn); if (status) return status; /* update scaling matrix D */ if (JTJ != NULL) (params->scale->update)(JTJ, state->diag); /* step accepted, decrease LM parameter */ nielsen_accept(rho, &(state->mu), &(state->nu)); bad_steps = 0; } else { /* step rejected, increase LM parameter */ nielsen_reject(&(state->mu), &(state->nu)); /* if more than 15 consecutive rejected steps, report no progress */ if (++bad_steps > 15) { return GSL_ENOPROG; } } } return GSL_SUCCESS; } /* trust_iterate() */ static int trust_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = &(state->params); status = (params->solver->rcond)(rcond, JTJ, state->solver_state); return status; } static int trust_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multilarge_nlinear_parameters *params = &(state->params); status = (params->solver->covar)(JTJ, covar, state->solver_state); return status; } static double trust_avratio(void *vstate) { trust_state_t *state = (trust_state_t *) vstate; return state->avratio; } /* compute x_trial = x + dx */ static void trust_trial_step(const gsl_vector * x, const gsl_vector * dx, gsl_vector * x_trial) { size_t i, N = x->size; for (i = 0; i < N; i++) { double dxi = gsl_vector_get (dx, i); double xi = gsl_vector_get (x, i); gsl_vector_set (x_trial, i, xi + dxi); } } /* trust_calc_rho() Calculate ratio of actual reduction to predicted reduction. rho = actual_reduction / predicted_reduction actual_reduction = 1 - ( ||f+|| / ||f|| )^2 predicted_reduction = -2 g^T dx / ||f||^2 - ( ||J*dx|| / ||f|| )^2 = -2 fhat . beta - ||beta||^2 where: beta = J*dx / ||f|| Inputs: trust_state - trust state f_trial - f(x + dx) dx - proposed step, size p state - workspace Return: rho = actual_reduction / predicted_reduction If actual_reduction is < 0, return rho = -1 */ static double trust_calc_rho(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * f_trial, const gsl_vector * dx, trust_state_t * state) { int status; const gsl_multilarge_nlinear_parameters *params = &(state->params); const gsl_multilarge_nlinear_trs *trs = params->trs; const gsl_vector * f = trust_state->f; const double normf = gsl_blas_dnrm2(f); const double normf_trial = gsl_blas_dnrm2(f_trial); double rho; double actual_reduction; double pred_reduction; double u; /* if ||f(x+dx)|| > ||f(x)|| reject step immediately */ if (normf_trial >= normf) return -1.0; /* compute numerator of rho (actual reduction) */ u = normf_trial / normf; actual_reduction = 1.0 - u*u; /* * compute denominator of rho (predicted reduction); this is calculated * inside each trust region subproblem, since it depends on the local * model used, which can vary according to each TRS */ status = (trs->preduction)(trust_state, dx, &pred_reduction, state->trs_state); if (status) return -1.0; if (pred_reduction > 0.0) rho = actual_reduction / pred_reduction; else rho = -1.0; return rho; } /* trust_eval_step() Evaluate proposed step to determine if it should be accepted or rejected */ static int trust_eval_step(const gsl_multilarge_nlinear_trust_state * trust_state, const gsl_vector * f_trial, const gsl_vector * dx, double * rho, trust_state_t * state) { int status = GSL_SUCCESS; const gsl_multilarge_nlinear_parameters *params = &(state->params); if (params->trs == gsl_multilarge_nlinear_trs_lmaccel) { /* reject step if acceleration is too large compared to velocity */ if (state->avratio > params->avmax) status = GSL_FAILURE; } /* compute rho */ *rho = trust_calc_rho(trust_state, f_trial, dx, state); if (*rho <= 0.0) status = GSL_FAILURE; return status; } /* compute || diag(D) a || */ static double trust_scaled_norm(const gsl_vector *D, const gsl_vector *a) { const size_t n = a->size; double e2 = 0.0; size_t i; for (i = 0; i < n; ++i) { double Di = gsl_vector_get(D, i); double ai = gsl_vector_get(a, i); double u = Di * ai; e2 += u * u; } return sqrt (e2); } static const gsl_multilarge_nlinear_type trust_type = { "trust-region", trust_alloc, trust_init, trust_iterate, trust_rcond, trust_covar, trust_avratio, trust_free }; const gsl_multilarge_nlinear_type *gsl_multilarge_nlinear_trust = &trust_type; gsl-doc-2.3/multilarge_nlinear/test_eckerle.c0000644000175000017500000001020512753424252017456 0ustar eddedd#define eckerle_N 35 #define eckerle_P 3 static double eckerle_x0a[eckerle_P] = { 1.0, 10.0, 500.0 }; static double eckerle_x0b[eckerle_P] = { 1.5, 5.0, 450.0 }; static double eckerle_epsrel = 1.0e-7; static double eckerle_J[eckerle_N * eckerle_P]; static double eckerle_sigma[eckerle_P] = { 1.5408051163E-02, 4.6803020753E-02, 4.6800518816E-02 }; static double eckerle_X[eckerle_N] = { 400.000000, 405.000000, 410.000000, 415.000000, 420.000000, 425.000000, 430.000000, 435.000000, 436.500000, 438.000000, 439.500000, 441.000000, 442.500000, 444.000000, 445.500000, 447.000000, 448.500000, 450.000000, 451.500000, 453.000000, 454.500000, 456.000000, 457.500000, 459.000000, 460.500000, 462.000000, 463.500000, 465.000000, 470.000000, 475.000000, 480.000000, 485.000000, 490.000000, 495.000000, 500.000000 }; static double eckerle_F[eckerle_N] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 }; static void eckerle_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.4635887487E-03; const double eckerle_x[eckerle_P] = { 1.5543827178E+00, 4.0888321754E+00, 4.5154121844E+02 }; double new_x[3]; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* x1 and x2 are unique up to a sign, but they must be * the same sign */ if (x[0] < 0.0 && x[1] < 0.0) { new_x[0] = -x[0]; new_x[1] = -x[1]; } else { new_x[0] = x[0]; new_x[1] = x[1]; } new_x[2] = x[2]; for (i = 0; i < eckerle_P; ++i) { gsl_test_rel(new_x[i], eckerle_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int eckerle_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term = xi - b[2]; double yi; yi = b[0] / b[1] * exp(-0.5 * term * term / b[1] / b[1]); gsl_vector_set (f, i, yi - eckerle_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int eckerle_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(eckerle_J, eckerle_N, eckerle_P); double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term1 = xi - b[2]; double term2 = exp(-0.5 * term1 * term1 / (b[1] * b[1])); gsl_matrix_set (&J.matrix, i, 0, term2 / b[1]); gsl_matrix_set (&J.matrix, i, 1, -b[0] * term2 / (b[1] * b[1]) + b[0] / pow(b[1], 4.0) * term2 * term1 * term1); gsl_matrix_set (&J.matrix, i, 2, b[0] / pow(b[1], 3.0) * term1 * term2); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf eckerle_func = { eckerle_f, eckerle_df, NULL, /* analytic expression too complex */ eckerle_N, eckerle_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem eckerlea_problem = { "nist-eckerlea", eckerle_x0a, eckerle_sigma, &eckerle_epsrel, &eckerle_checksol, &eckerle_func }; static test_fdf_problem eckerleb_problem = { "nist-eckerleb", eckerle_x0b, eckerle_sigma, &eckerle_epsrel, &eckerle_checksol, &eckerle_func }; gsl-doc-2.3/multilarge_nlinear/nielsen.c0000644000175000017500000000537312757327710016461 0ustar eddedd/* multilarge_nlinear/nielsen.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module contains routines for updating the Levenberg-Marquardt * damping parameter on each iteration using Nielsen's method: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * 3 routines are needed to implement the update procedure: * * 1. init - initialize parameter prior to iteration * 2. accept - update parameter after a step has been accepted * 3. reject - update parameter after a step has been rejected */ #include #include #include #include #include #include #include #define LM_ONE_THIRD (0.333333333333333) static int nielsen_init(const gsl_matrix * JTJ, const gsl_vector * diag, double * mu, long * nu); static int nielsen_accept(const double rho, double * mu, long * nu); static int nielsen_reject(double * mu, long * nu); static int nielsen_init(const gsl_matrix * JTJ, const gsl_vector * diag, double * mu, long * nu) { const double mu0 = 1.0e-3; size_t i; double max = -1.0; *nu = 2; if (JTJ == NULL) { /* not using cholesky solver */ *mu = mu0; return GSL_SUCCESS; } /* set mu = mu0 * max(diag(J~^T J~)), with J~ = J D^{-1} */ for (i = 0; i < JTJ->size1; ++i) { double JTJi = gsl_matrix_get(JTJ, i, i); double di = gsl_vector_get(diag, i); double val = JTJi / (di * di); max = GSL_MAX(max, val); } *mu = mu0 * max; return GSL_SUCCESS; } static int nielsen_accept(const double rho, double * mu, long * nu) { double b; /* reset nu */ *nu = 2; b = 2.0 * rho - 1.0; b = 1.0 - b*b*b; *mu *= GSL_MAX(LM_ONE_THIRD, b); return GSL_SUCCESS; } static int nielsen_reject(double * mu, long * nu) { *mu *= (double) *nu; /* nu := 2*nu */ *nu <<= 1; return GSL_SUCCESS; } gsl-doc-2.3/multilarge_nlinear/test_watson.c0000644000175000017500000000752612753424410017367 0ustar eddedd#define watson_N 31 #define watson_P 6 static double watson_x0[watson_P] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; static double watson_epsrel = 1.0e-6; static double watson_J[watson_N * watson_P]; static void watson_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 2.287670053552372e-03; const double watson_x[watson_P] = { -1.572508640629858e-02, 1.012434869366059e+00, -2.329916259263380e-01, 1.260430087686035e+00, -1.513728922580576e+00, 9.929964323646112e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < watson_P; ++i) { gsl_test_rel(x[i], watson_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int watson_f (const gsl_vector * x, void *params, gsl_vector * f) { const double x1 = gsl_vector_get(x, 0); const double x2 = gsl_vector_get(x, 1); size_t i, j; for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0, sum2 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; if (j > 0) { sum2 += j * xj * tjm2; tjm2 *= ti; } } gsl_vector_set (f, i, sum2 - sum1*sum1 - 1.0); } gsl_vector_set(f, watson_N - 2, x1); gsl_vector_set(f, watson_N - 1, x2 - x1*x1 - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int watson_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(watson_J, watson_N, watson_P); double x1 = gsl_vector_get (x, 0); size_t i, j; gsl_matrix_set_zero(&J.matrix); for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; } tjm1 = 1.0; tjm2 = 1.0; for (j = 0; j < watson_P; ++j) { gsl_matrix_set(&J.matrix, i, j, j * tjm2 - 2.0*sum1*tjm1); tjm1 *= ti; if (j > 0) tjm2 *= ti; } } gsl_matrix_set(&J.matrix, watson_N - 2, 0, 1.0); gsl_matrix_set(&J.matrix, watson_N - 1, 0, -2.0*x1); gsl_matrix_set(&J.matrix, watson_N - 1, 1, 1.0); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int watson_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get (v, 0); size_t i, j; for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double sum = 0.0; double tjm1 = 1.0; for (j = 0; j < watson_P; ++j) { double vj = gsl_vector_get(v, j); sum += vj * tjm1; tjm1 *= ti; } gsl_vector_set(fvv, i, -2.0*sum*sum); } gsl_vector_set(fvv, watson_N - 2, 0.0); gsl_vector_set(fvv, watson_N - 1, -2.0*v1*v1); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf watson_func = { watson_f, watson_df, watson_fvv, watson_N, watson_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem watson_problem = { "watson", watson_x0, NULL, &watson_epsrel, &watson_checksol, &watson_func }; gsl-doc-2.3/multilarge_nlinear/Makefile.in0000644000175000017500000011064613022372406016711 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = multilarge_nlinear DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultilarge_nlinear_la_LIBADD = am_libgslmultilarge_nlinear_la_OBJECTS = cgst.lo cholesky.lo \ convergence.lo dogleg.lo dummy.lo fdf.lo lm.lo scaling.lo \ subspace2D.lo trust.lo libgslmultilarge_nlinear_la_OBJECTS = \ $(am_libgslmultilarge_nlinear_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultilarge_nlinear.la ../test/libgsltest.la \ ../multilarge/libgslmultilarge.la \ ../multifit/libgslmultifit.la ../eigen/libgsleigen.la \ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la ../sys/libgslsys.la \ ../utils/libutils.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../complex/libgslcomplex.la ../poly/libgslpoly.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultilarge_nlinear_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultilarge_nlinear_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultilarge_nlinear.la pkginclude_HEADERS = gsl_multilarge_nlinear.h libgslmultilarge_nlinear_la_SOURCES = cgst.c cholesky.c convergence.c dogleg.c dummy.c fdf.c lm.c scaling.c subspace2D.c trust.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = \ common.c \ nielsen.c \ test_fdf.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_exp1.c \ test_hahn1.c \ test_helical.c \ test_gaussian.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_meyer.c \ test_meyerscal.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wood.c \ test_wnlin.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultilarge_nlinear.la ../test/libgsltest.la ../multilarge/libgslmultilarge.la ../multifit/libgslmultifit.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../complex/libgslcomplex.la ../poly/libgslpoly.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multilarge_nlinear/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multilarge_nlinear/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultilarge_nlinear.la: $(libgslmultilarge_nlinear_la_OBJECTS) $(libgslmultilarge_nlinear_la_DEPENDENCIES) $(EXTRA_libgslmultilarge_nlinear_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultilarge_nlinear_la_OBJECTS) $(libgslmultilarge_nlinear_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multilarge_nlinear/test_powell3.c0000644000175000017500000000501212753424353017433 0ustar eddedd#define powell3_N 2 #define powell3_P 2 static double powell3_x0[powell3_P] = { 0.0, 1.0 }; static double powell3_epsrel = 1.0e-10; static double powell3_J[powell3_N * powell3_P]; static void powell3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double powell3_x[powell3_P] = { 1.09815932969975976e-05, 9.10614673986700218 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell3_P; ++i) { gsl_test_rel(x[i], powell3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 1.0e4*x1*x2 - 1.0); gsl_vector_set(f, 1, exp(-x1) + exp(-x2) - 1.0001); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell3_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(powell3_J, powell3_N, powell3_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set(&J.matrix, 0, 0, 1.0e4*x2); gsl_matrix_set(&J.matrix, 0, 1, 1.0e4*x1); gsl_matrix_set(&J.matrix, 1, 0, -exp(-x1)); gsl_matrix_set(&J.matrix, 1, 1, -exp(-x2)); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, 2.0e4 * v1 * v2); gsl_vector_set(fvv, 1, v1*v1*exp(-x1) + v2*v2*exp(-x2)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf powell3_func = { powell3_f, powell3_df, powell3_fvv, powell3_N, powell3_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem powell3_problem = { "powell_badly_scaled", powell3_x0, NULL, &powell3_epsrel, &powell3_checksol, &powell3_func }; gsl-doc-2.3/multilarge_nlinear/test_hahn1.c0000644000175000017500000002021412753424273017047 0ustar eddedd#define hahn1_N 236 #define hahn1_P 7 static double hahn1_x0a[hahn1_P] = { 10, -1, 0.05, -0.00001, -0.05, 0.001, -0.000001 }; static double hahn1_x0b[hahn1_P] = { 1, -0.1, 0.005, -0.000001, -0.005, 0.0001, -0.0000001}; static double hahn1_epsrel = 1.0e-5; static double hahn1_J[hahn1_N * hahn1_P]; static double hahn1_sigma[hahn1_P] = { 1.7070154742E-01, 1.2000289189E-02, 2.2508314937E-04, 2.7578037666E-07, 2.4712888219E-04, 1.0449373768E-05, 1.3027335327E-08 }; static double hahn1_F1[hahn1_N] = { .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 }; static double hahn1_F0[hahn1_N] = { 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 }; static void hahn1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.5324382854E+00; const double hahn1_x[hahn1_P] = { 1.0776351733E+00, -1.2269296921E-01, 4.0863750610E-03, -1.4262662514E-06, -5.7609940901E-03, 2.4053735503E-04, -1.2314450199E-07 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < hahn1_P; ++i) { gsl_test_rel(x[i], hahn1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int hahn1_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; i++) { double t = hahn1_F0[i]; double y = ((b[0] + t* (b[1] + t * (b[2] + t * b[3]))) / (1 + t*(b[4] + t *(b[5] + t*b[6])))); gsl_vector_set (f, i, hahn1_F1[i] - y); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int hahn1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(hahn1_J, hahn1_N, hahn1_P); double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; i++) { double t = hahn1_F0[i]; double u = (b[0] + t*(b[1] + t*(b[2] + t * b[3]))); double v = (1 + t*(b[4] + t*(b[5] + t*b[6]))); gsl_matrix_set (&J.matrix, i, 0, -1/v); gsl_matrix_set (&J.matrix, i, 1, -t/v); gsl_matrix_set (&J.matrix, i, 2, -t*t/v); gsl_matrix_set (&J.matrix, i, 3, -t*t*t/v); gsl_matrix_set (&J.matrix, i, 4, t*u/(v*v)); gsl_matrix_set (&J.matrix, i, 5, t*t*u/(v*v)); gsl_matrix_set (&J.matrix, i, 6, t*t*t*u/(v*v)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf hahn1_func = { hahn1_f, hahn1_df, NULL, /* analytic expression too complex */ hahn1_N, hahn1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem hahn1a_problem = { "nist-hahn1a", hahn1_x0a, hahn1_sigma, &hahn1_epsrel, &hahn1_checksol, &hahn1_func }; static test_fdf_problem hahn1b_problem = { "nist-hahn1b", hahn1_x0b, hahn1_sigma, &hahn1_epsrel, &hahn1_checksol, &hahn1_func }; gsl-doc-2.3/multilarge_nlinear/test_lin1.c0000644000175000017500000000454012753424314016713 0ustar eddedd#define lin1_N 11 /* can be anything >= p */ #define lin1_P 5 static double lin1_x0[lin1_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin1_epsrel = 1.0e-10; static double lin1_J[lin1_N * lin1_P]; static void lin1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = (double) (lin1_N - lin1_P); gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin1_P; ++i) { gsl_test_rel(x[i], -1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int lin1_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin1_N; ++i) { double fi = 0.0; for (j = 0; j < lin1_P; ++j) { double xj = gsl_vector_get(x, j); double Aij = (i == j) ? 1.0 : 0.0; Aij -= 2.0 / lin1_N; fi += Aij * xj; } fi -= 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(lin1_J, lin1_N, lin1_P); size_t i, j; for (i = 0; i < lin1_N; ++i) { for (j = 0; j < lin1_P; ++j) { double Jij = (i == j) ? 1.0 : 0.0; Jij -= 2.0 / lin1_N; gsl_matrix_set(&J.matrix, i, j, Jij); } } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf lin1_func = { lin1_f, lin1_df, lin1_fvv, lin1_N, lin1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem lin1_problem = { "linear_full", lin1_x0, NULL, &lin1_epsrel, &lin1_checksol, &lin1_func }; gsl-doc-2.3/multilarge_nlinear/cgst.c0000644000175000017500000002411212752713256015753 0ustar eddedd/* multilarge_nlinear/cgst.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module contains an implementation of the Steihaug-Toint * conjugate gradient algorithm for nonlinear optimization problems. * This implementation closely follows the following works: * * [1] T. Steihaug, The conjugate gradient method and trust regions * in large scale optimization, SIAM J. Num. Anal., 20(3) 1983. * * In the below algorithm, the Jacobian and gradient are scaled * according to: * * J~ = J D^{-1} * g~ = D^{-1} * * prior to any calculations which results in better numerical * stability when solving for the Gauss-Newton step. The resulting * step vector is then backtransformed as: * * dx = D^{-1} dx~ */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *z; /* Gauss-Newton step, size p */ gsl_vector *r; /* steepest descent step, size p */ gsl_vector *d; /* steepest descent step, size p */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ double norm_g; /* || g~ || */ double cgtol; /* tolerance for CG solution */ size_t cgmaxit; /* maximum CG iterations */ } cgst_state_t; #include "common.c" static void * cgst_alloc (const void * params, const size_t n, const size_t p); static void cgst_free(void *vstate); static int cgst_init(const void *vtrust_state, void *vstate); static int cgst_preloop(const void * vtrust_state, void * vstate); static int cgst_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int cgst_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static double cgst_calc_tau(const gsl_vector * p, const gsl_vector * d, const double delta); static void * cgst_alloc (const void * params, const size_t n, const size_t p) { const gsl_multilarge_nlinear_parameters *par = (const gsl_multilarge_nlinear_parameters *) params; cgst_state_t *state; state = calloc(1, sizeof(cgst_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate st state", GSL_ENOMEM); } state->z = gsl_vector_alloc(p); if (state->z == NULL) { GSL_ERROR_NULL ("failed to allocate space for z", GSL_ENOMEM); } state->r = gsl_vector_alloc(p); if (state->r == NULL) { GSL_ERROR_NULL ("failed to allocate space for r", GSL_ENOMEM); } state->d = gsl_vector_alloc(p); if (state->d == NULL) { GSL_ERROR_NULL ("failed to allocate space for d", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->n = n; state->p = p; state->cgmaxit = par->max_iter; if (state->cgmaxit == 0) state->cgmaxit = n; state->cgtol = par->tol; return state; } static void cgst_free(void *vstate) { cgst_state_t *state = (cgst_state_t *) vstate; if (state->z) gsl_vector_free(state->z); if (state->r) gsl_vector_free(state->r); if (state->d) gsl_vector_free(state->d); if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); free(state); } /* cgst_init() Initialize cgst solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int cgst_init(const void *vtrust_state, void *vstate) { /* nothing to do */ (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } static int cgst_preloop(const void * vtrust_state, void * vstate) { /* nothing to do */ (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } /* cgst_step() Calculate a new step vector Return: GSL_SUCCESS if CG solution found GSL_EMAXITER if no solution found */ static int cgst_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { int status; const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; cgst_state_t *state = (cgst_state_t *) vstate; const gsl_vector * x = trust_state->x; const gsl_vector * f = trust_state->f; const gsl_vector * swts = trust_state->sqrt_wts; const gsl_vector * diag = trust_state->diag; const gsl_multilarge_nlinear_parameters * params = trust_state->params; gsl_multilarge_nlinear_fdf * fdf = trust_state->fdf; double alpha, beta, u; double norm_Jd; /* || J D^{-1} d_i || */ double norm_r; /* || r_i || */ double norm_rp1; /* || r_{i+1} || */ size_t i; /* Step 1 of [1], section 2; scale gradient as * * g~ = D^{-1} g * * for better numerical stability */ for (i = 0; i < state->p; ++i) { double gi = gsl_vector_get(trust_state->g, i); double di = gsl_vector_get(trust_state->diag, i); gsl_vector_set(state->z, i, 0.0); gsl_vector_set(state->r, i, -gi / di); gsl_vector_set(state->d, i, -gi / di); gsl_vector_set(state->workp, i, gi / di); } /* compute || g~ || */ state->norm_g = gsl_blas_dnrm2(state->workp); for (i = 0; i < state->cgmaxit; ++i) { /* workp := D^{-1} d_i */ gsl_vector_memcpy(state->workp, state->d); gsl_vector_div(state->workp, trust_state->diag); /* workn := J D^{-1} d_i */ status = gsl_multilarge_nlinear_eval_df(CblasNoTrans, x, f, state->workp, swts, params->h_df, params->fdtype, fdf, state->workn, NULL, NULL); if (status) return status; /* compute || J D^{-1} d_i || */ norm_Jd = gsl_blas_dnrm2(state->workn); /* Step 2 of [1], section 2 */ if (norm_Jd == 0.0) { double tau = cgst_calc_tau(state->z, state->d, delta); /* dx = z_i + tau*d_i */ scaled_addition(1.0, state->z, tau, state->d, dx); gsl_vector_div(dx, diag); return GSL_SUCCESS; } /* Step 3 of [1], section 2 */ norm_r = gsl_blas_dnrm2(state->r); u = norm_r / norm_Jd; alpha = u * u; /* workp <= z_{i+1} = z_i + alpha_i*d_i */ scaled_addition(1.0, state->z, alpha, state->d, state->workp); u = gsl_blas_dnrm2(state->workp); if (u >= delta) { double tau = cgst_calc_tau(state->z, state->d, delta); /* dx = z_i + tau*d_i */ scaled_addition(1.0, state->z, tau, state->d, dx); gsl_vector_div(dx, diag); return GSL_SUCCESS; } /* store z_{i+1} */ gsl_vector_memcpy(state->z, state->workp); /* Step 4 of [1], section 2 */ /* compute: workp := alpha B d_i = alpha D^{-1} J^T J D^{-1} d_i, * where J D^{-1} d_i is already stored in workn */ status = gsl_multilarge_nlinear_eval_df(CblasTrans, x, f, state->workn, swts, params->h_df, params->fdtype, fdf, state->workp, NULL, NULL); if (status) return status; gsl_vector_div(state->workp, trust_state->diag); gsl_vector_scale(state->workp, alpha); /* r_{i+1} = r_i - alpha*B*d_i */ gsl_vector_sub(state->r, state->workp); norm_rp1 = gsl_blas_dnrm2(state->r); u = norm_rp1 / state->norm_g; if (u < state->cgtol) { gsl_vector_memcpy(dx, state->z); gsl_vector_div(dx, diag); return GSL_SUCCESS; } /* Step 5 of [1], section 2 */ /* compute u = ||r_{i+1}|| / || r_i|| */ u = norm_rp1 / norm_r; beta = u * u; /* compute: d_{i+1} = rt_{i+1} + beta*d_i */ scaled_addition(1.0, state->r, beta, state->d, state->d); } /* failed to converge, return current estimate */ gsl_vector_memcpy(dx, state->z); gsl_vector_div(dx, diag); return GSL_EMAXITER; } static int cgst_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; cgst_state_t *state = (cgst_state_t *) vstate; *pred = quadratic_preduction(trust_state, dx, state->workn); return GSL_SUCCESS; } /* cgst_calc_tau() Compute tau > 0 such that: || p + tau*d || = delta */ static double cgst_calc_tau(const gsl_vector * p, const gsl_vector * d, const double delta) { double norm_p, norm_d, u; double t1, t2, tau; norm_p = gsl_blas_dnrm2(p); norm_d = gsl_blas_dnrm2(d); /* compute (p, d) */ gsl_blas_ddot(p, d, &u); t1 = u / (norm_d * norm_d); t2 = t1*u + (delta + norm_p) * (delta - norm_p); tau = -t1 + sqrt(t2) / norm_d; return tau; } static const gsl_multilarge_nlinear_trs cgst_type = { "steihaug-toint", cgst_alloc, cgst_init, cgst_preloop, cgst_step, cgst_preduction, cgst_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_cgst = &cgst_type; gsl-doc-2.3/multilarge_nlinear/test_brown3.c0000644000175000017500000000464412753424246017273 0ustar eddedd#define brown3_N 3 #define brown3_P 2 static double brown3_x0[brown3_P] = { 1.0, 1.0 }; static double brown3_epsrel = 1.0e-12; static double brown3_J[brown3_N * brown3_P]; static void brown3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double brown3_x[brown3_P] = { 1.0e6, 2.0e-6 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown3_P; ++i) { gsl_test_rel(x[i], brown3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - 1.0e6); gsl_vector_set(f, 1, x2 - 2.0e-6); gsl_vector_set(f, 2, x1*x2 - 2.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown3_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(brown3_J, brown3_N, brown3_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set_zero(&J.matrix); gsl_matrix_set(&J.matrix, 0, 0, 1.0); gsl_matrix_set(&J.matrix, 1, 1, 1.0); gsl_matrix_set(&J.matrix, 2, 0, x2); gsl_matrix_set(&J.matrix, 2, 1, x1); if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, 2.0 * v1 * v2); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf brown3_func = { brown3_f, brown3_df, brown3_fvv, brown3_N, brown3_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem brown3_problem = { "brown_badly_scaled", brown3_x0, NULL, &brown3_epsrel, &brown3_checksol, &brown3_func }; gsl-doc-2.3/multilarge_nlinear/dogleg.c0000644000175000017500000003415212763323477016265 0ustar eddedd/* multilarge_nlinear/dogleg.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module contains an implementation of the Powell dogleg * algorithm for nonlinear optimization problems. This implementation * closely follows the following works: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * [2] J. E. Dennis and H. H. W. Mei, Two new unconstrained optimization * algorithms which use function and gradient values, J. Opt. Theory and * Appl., 28(4), 1979. */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *dx_gn; /* Gauss-Newton step, size p */ gsl_vector *dx_sd; /* steepest descent step, size p */ double norm_Dgn; /* || D dx_gn || */ double norm_Dsd; /* || D dx_sd || */ double norm_Dinvg; /* || D^{-1} g || */ double norm_JDinv2g; /* || J D^{-2} g || */ gsl_vector *workp1; /* workspace, length p */ gsl_vector *workp2; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ /* tunable parameters */ gsl_multilarge_nlinear_parameters params; } dogleg_state_t; #include "common.c" static void * dogleg_alloc (const void * params, const size_t n, const size_t p); static void dogleg_free(void *vstate); static int dogleg_init(const void *vtrust_state, void *vstate); static int dogleg_preloop(const void * vtrust_state, void * vstate); static int dogleg_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int dogleg_double_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int dogleg_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static int dogleg_calc_gn(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx); static double dogleg_beta(const double t, const double delta, const gsl_vector * diag, dogleg_state_t * state); static void * dogleg_alloc (const void * params, const size_t n, const size_t p) { dogleg_state_t *state; state = calloc(1, sizeof(dogleg_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate dogleg state", GSL_ENOMEM); } state->dx_gn = gsl_vector_alloc(p); if (state->dx_gn == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_gn", GSL_ENOMEM); } state->dx_sd = gsl_vector_alloc(p); if (state->dx_sd == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_sd", GSL_ENOMEM); } state->workp1 = gsl_vector_alloc(p); if (state->workp1 == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp1", GSL_ENOMEM); } state->workp2 = gsl_vector_alloc(p); if (state->workp2 == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp2", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->n = n; state->p = p; state->params = *(const gsl_multilarge_nlinear_parameters *) params; return state; } static void dogleg_free(void *vstate) { dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->dx_gn) gsl_vector_free(state->dx_gn); if (state->dx_sd) gsl_vector_free(state->dx_sd); if (state->workp1) gsl_vector_free(state->workp1); if (state->workp2) gsl_vector_free(state->workp2); if (state->workn) gsl_vector_free(state->workn); free(state); } /* dogleg_init() Initialize dogleg solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int dogleg_init(const void *vtrust_state, void *vstate) { (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } /* dogleg_preloop() Initialize dogleg method prior to iteration loop. This involves computing the steepest descent step. The Gauss-Newton step is computed later in the _step() functions if required. Notes: on output, 1) state->dx_sd contains steepest descent step 2) state->norm_Dinvg contains || D^{-1} g || 3) state->norm_JDinv2g contains || J D^{-2} g || */ static int dogleg_preloop(const void * vtrust_state, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; double u; double alpha; /* ||g||^2 / ||Jg||^2 */ /* calculate the steepest descent step */ /* compute workp1 = D^{-1} g and its norm */ gsl_vector_memcpy(state->workp1, trust_state->g); gsl_vector_div(state->workp1, trust_state->diag); state->norm_Dinvg = gsl_blas_dnrm2(state->workp1); /* compute workp1 = D^{-2} g */ gsl_vector_div(state->workp1, trust_state->diag); /* compute workp2 = J^T J D^{-2} g */ gsl_blas_dsymv(CblasLower, 1.0, trust_state->JTJ, state->workp1, 0.0, state->workp2); /* compute norm_JDinv2g = || J D^{-2} g || */ gsl_blas_ddot(state->workp1, state->workp2, &u); state->norm_JDinv2g = sqrt(u); u = state->norm_Dinvg / state->norm_JDinv2g; alpha = u * u; /* dx_sd = -alpha D^{-2} g */ gsl_vector_memcpy(state->dx_sd, state->workp1); gsl_vector_scale(state->dx_sd, -alpha); state->norm_Dsd = scaled_enorm(trust_state->diag, state->dx_sd); state->norm_Dgn = -1.0; /* computed later if needed */ return GSL_SUCCESS; } /* dogleg_step() Calculate a new step vector */ static int dogleg_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->norm_Dsd >= delta) { /* steepest descent step is outside trust region; * truncate steepest descent step to trust region boundary */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { /* compute Gauss-Newton step if needed */ if (state->norm_Dgn < 0.0) { int status = dogleg_calc_gn(trust_state, state->dx_gn); if (status) return status; /* compute || D dx_gn || */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); } if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else { /* Gauss-Newton step is outside trust region, but steepest * descent is inside; use dogleg step */ double beta = dogleg_beta(1.0, delta, trust_state->diag, state); /* compute: workp1 = dx_gn - dx_sd */ scaled_addition(1.0, state->dx_gn, -1.0, state->dx_sd, state->workp1); /* dx = dx_sd + beta*(dx_gn - dx_sd) */ scaled_addition(beta, state->workp1, 1.0, state->dx_sd, dx); } } return GSL_SUCCESS; } /* dogleg_double_step() Calculate a new step with double dogleg method. Based on section 3 of [2] */ static int dogleg_double_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const double alpha_fac = 0.8; /* recommended value from Dennis and Mei */ const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->norm_Dsd >= delta) { /* steepest descent step is outside trust region; * truncate steepest descent step to trust region boundary */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { /* compute Gauss-Newton step if needed */ if (state->norm_Dgn < 0.0) { int status = dogleg_calc_gn(trust_state, state->dx_gn); if (status) return status; /* compute || D dx_gn || */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); } if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else { double t, u, v, c; /* compute: u = ||D^{-1} g||^2 / ||J D^{-2} g||^2 */ v = state->norm_Dinvg / state->norm_JDinv2g; u = v * v; /* compute: v = g^T dx_gn */ gsl_blas_ddot(trust_state->g, state->dx_gn, &v); /* compute: c = ||D^{-1} g||^4 / (||J D^{-2} g||^2 * |g^T dx_gn|) */ c = u * (state->norm_Dinvg / fabs(v)) * state->norm_Dinvg; /* compute: t = 1 - alpha_fac*(1-c) */ t = 1.0 - alpha_fac*(1.0 - c); if (t * state->norm_Dgn <= delta) { /* set dx = (delta / ||D dx_gn||) dx_gn */ gsl_vector_memcpy(dx, state->dx_gn); gsl_vector_scale(dx, delta / state->norm_Dgn); } else { /* Cauchy point is inside, Gauss-Newton is outside trust region; * use double dogleg step */ double beta = dogleg_beta(t, delta, trust_state->diag, state); /* compute: workp1 = t*dx_gn - dx_sd */ scaled_addition(t, state->dx_gn, -1.0, state->dx_sd, state->workp1); /* dx = dx_sd + beta*(t*dx_gn - dx_sd) */ scaled_addition(beta, state->workp1, 1.0, state->dx_sd, dx); } } } return GSL_SUCCESS; } static int dogleg_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; *pred = quadratic_preduction(trust_state, dx, state->workn); return GSL_SUCCESS; } /* dogleg_calc_gn() Calculate Gauss-Newton step by solving J^T J dx_gn = -J^T f Inputs: trust_state - trust state variables dx - (output) Gauss-Newton step vector Return: success/error */ static int dogleg_calc_gn(const gsl_multilarge_nlinear_trust_state * trust_state, gsl_vector * dx) { int status; const gsl_multilarge_nlinear_parameters *params = trust_state->params; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; /* prepare the linear solver to compute Gauss-Newton step */ status = (params->solver->presolve)(0.0, trust_state, trust_state->solver_state); if (status) return status; /* solve: J dx_gn = -f for Gauss-Newton step */ status = (params->solver->solve)(trust_state->g, dx, trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* dogleg_beta() This function finds beta in [0,1] such that the step dx = dx_sd + beta*(t*dx_gn - dx_sd) has norm ||D dx|| = delta beta is the positive root of the quadratic: a beta^2 + b beta + c = 0 with a = ||D(t*dx_gn - dx_sd)||^2 b = 2 dx_sd^T D^T D (t*dx_gn - dx_sd) c = ||D dx_sd||^2 - delta^2 Inputs: t - amount of Gauss-Newton step to use for dogleg (= 1 for classical dogleg, <= 1 for double dogleg) delta - trust region radius diag - diag(D) scaling matrix state - workspace */ static double dogleg_beta(const double t, const double delta, const gsl_vector * diag, dogleg_state_t * state) { double beta; double a, b, c; /* compute: workp1 = t*dx_gn - dx_sd */ scaled_addition(t, state->dx_gn, -1.0, state->dx_sd, state->workp1); /* a = || D (t*dx_gn - dx_sd) ||^2 */ a = scaled_enorm(diag, state->workp1); a *= a; /* workp1 = D^T D (t*dx_gn - dx_sd) */ gsl_vector_mul(state->workp1, diag); gsl_vector_mul(state->workp1, diag); /* b = 2 dx_sd^T D^T D (t*dx_gn - dx-sd) */ gsl_blas_ddot(state->dx_sd, state->workp1, &b); b *= 2.0; /* c = || D dx_sd ||^2 - delta^2 = (||D dx_sd|| + delta) (||D dx_sd|| - delta) */ c = (state->norm_Dsd + delta) * (state->norm_Dsd - delta); if (b > 0.0) { beta = (-2.0 * c) / (b + sqrt(b*b - 4.0*a*c)); } else { beta = (-b + sqrt(b*b - 4.0*a*c)) / (2.0 * a); } return beta; } static const gsl_multilarge_nlinear_trs dogleg_type = { "dogleg", dogleg_alloc, dogleg_init, dogleg_preloop, dogleg_step, dogleg_preduction, dogleg_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_dogleg = &dogleg_type; static const gsl_multilarge_nlinear_trs ddogleg_type = { "double-dogleg", dogleg_alloc, dogleg_init, dogleg_preloop, dogleg_double_step, dogleg_preduction, dogleg_free }; const gsl_multilarge_nlinear_trs *gsl_multilarge_nlinear_trs_ddogleg = &ddogleg_type; gsl-doc-2.3/multilarge_nlinear/convergence.c0000644000175000017500000000557012737536473017327 0ustar eddedd/* multilargenlin/convergence.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g); /* gsl_multilarge_nlinear_test() Convergence tests for nonlinear least squares minimization (1) |dx_i| <= xtol * (1 + |x_i|) for all i (2) || g .* x ||_inf <= gtol ||f||^2 (3) ||f(x+dx) - f(x)|| <= ftol * max(||f(x)||, 1) Inputs: xtol - tolerance for step size gtol - tolerance for gradient vector ftol - tolerance for residual vector info - (output) 1 - stopped by small x step 2 - stopped by small gradient 3 - stopped by small residual vector change w - workspace */ int gsl_multilarge_nlinear_test (const double xtol, const double gtol, const double ftol, int *info, const gsl_multilarge_nlinear_workspace * w) { int status; double gnorm, fnorm, phi; *info = 0; status = gsl_multifit_test_delta(w->dx, w->x, xtol*xtol, xtol); if (status == GSL_SUCCESS) { *info = 1; return GSL_SUCCESS; } /* compute gnorm = max_i( g_i * max(x_i, 1) ) */ gnorm = scaled_infnorm(w->x, w->g); /* compute fnorm = ||f|| */ fnorm = gsl_blas_dnrm2(w->f); phi = 0.5 * fnorm * fnorm; #if 0 fprintf(stderr, "gnorm = %.12e fnorm = %.12e gnorm/phi = %.12e\n", gnorm, fnorm, gnorm / phi); #endif if (gnorm <= gtol * GSL_MAX(phi, 1.0)) { *info = 2; return GSL_SUCCESS; } #if 0 if (dfnorm <= ftol * GSL_MAX(fnorm, 1.0)) { *info = 3; return GSL_SUCCESS; } #endif return GSL_CONTINUE; } static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g) { const size_t n = x->size; size_t i; double norm = 0.0; for (i = 0; i < n; ++i) { double xi = GSL_MAX(gsl_vector_get(x, i), 1.0); double gi = gsl_vector_get(g, i); double tmp = fabs(xi * gi); if (tmp > norm) norm = tmp; } return norm; } gsl-doc-2.3/multilarge_nlinear/test_exp1.c0000644000175000017500000000713212753424261016726 0ustar eddedd#define exp1_N 45 #define exp1_P 4 static double exp1_x0[exp1_P] = { -1.0, -2.0, 1.0, -1.0 }; static double exp1_epsrel = 1.0e-4; static double exp1_J[exp1_N * exp1_P]; static double exp1_Y[exp1_N] = { 0.090542, 0.124569, 0.179367, 0.195654, 0.269707, 0.286027, 0.289892, 0.317475, 0.308191, 0.336995, 0.348371, 0.321337, 0.299423, 0.338972, 0.304763, 0.288903, 0.300820, 0.303974, 0.283987, 0.262078, 0.281593, 0.267531, 0.218926, 0.225572, 0.200594, 0.197375, 0.182440, 0.183892, 0.152285, 0.174028, 0.150874, 0.126220, 0.126266, 0.106384, 0.118923, 0.091868, 0.128926, 0.119273, 0.115997, 0.105831, 0.075261, 0.068387, 0.090823, 0.085205, 0.067203 }; static void exp1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.0e-2; const double exp1_x[exp1_P] = { -4.0, -5.0, 4.0, -4.0 }; /* approx */ gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < exp1_P; ++i) { gsl_test_rel(x[i], exp1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int exp1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double yi = exp1_Y[i]; double fi = yi - (x3*exp(x1*ti) + x4*exp(x2*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int exp1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(exp1_J, exp1_N, exp1_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double term1 = exp(x1*ti); double term2 = exp(x2*ti); gsl_matrix_set(&J.matrix, i, 0, -x3*ti*term1); gsl_matrix_set(&J.matrix, i, 1, -x4*ti*term2); gsl_matrix_set(&J.matrix, i, 2, -term1); gsl_matrix_set(&J.matrix, i, 3, -term2); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int exp1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double term1 = exp(x1*ti); double term2 = exp(x2*ti); double term3 = 2*v3 + ti*v1*x3; double term4 = 2*v4 + ti*v2*x4; gsl_vector_set(fvv, i, -ti*(v1*term1*term3 + v2*term2*term4)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf exp1_func = { exp1_f, exp1_df, exp1_fvv, exp1_N, exp1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem exp1_problem = { "expfit1", exp1_x0, NULL, &exp1_epsrel, &exp1_checksol, &exp1_func }; gsl-doc-2.3/multilarge_nlinear/test_brown1.c0000644000175000017500000000634012753424240017256 0ustar eddedd#define brown1_N 20 #define brown1_P 4 static double brown1_x0[brown1_P] = { 25, 5, -5, -1 }; static double brown1_epsrel = 1.0e-5; static double brown1_J[brown1_N * brown1_P]; static void brown1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.582220162635628e+04; const double brown1_x[brown1_P] = { -1.159443990239263e+01, 1.320363005221244e+01, -4.034395456782477e-01, 2.367789088597534e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown1_P; ++i) { gsl_test_rel(x[i], brown1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown1_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 < brown1_N; 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); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(brown1_J, brown1_N, brown1_P); 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 < brown1_N; 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 (&J.matrix, i, 0, 2 * ui); gsl_matrix_set (&J.matrix, i, 1, 2 * ui * ti); gsl_matrix_set (&J.matrix, i, 2, 2 * vi); gsl_matrix_set (&J.matrix, i, 3, 2 * vi * sin (ti)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v0 = gsl_vector_get (v, 0); double v1 = gsl_vector_get (v, 1); double v2 = gsl_vector_get (v, 2); double v3 = gsl_vector_get (v, 3); size_t i; for (i = 0; i < brown1_N; i++) { double ti = 0.2 * (i + 1); double term1 = v0 + ti*v1; double term2 = v3*sin(ti); gsl_vector_set (fvv, i, 2.0 * (term1*term1 + v2*v2 + term2 * (2*v2 + term2))); } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf brown1_func = { brown1_f, brown1_df, brown1_fvv, brown1_N, brown1_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem brown1_problem = { "brown_dennis", brown1_x0, NULL, &brown1_epsrel, &brown1_checksol, &brown1_func }; gsl-doc-2.3/multilarge_nlinear/test_osborne.c0000644000175000017500000000723412753424334017524 0ustar eddedd#define osborne_N 33 #define osborne_P 5 static double osborne_x0[osborne_P] = { 0.5, 1.5, -1.0, 0.01, 0.02 }; static double osborne_epsrel = 1.0e-8; static double osborne_J[osborne_N * osborne_P]; static double osborne_Y[osborne_N] = { 0.844, 0.908, 0.932, 0.936, 0.925, 0.908, 0.881, 0.850, 0.818, 0.784, 0.751, 0.718, 0.685, 0.658, 0.628, 0.603, 0.580, 0.558, 0.538, 0.522, 0.506, 0.490, 0.478, 0.467, 0.457, 0.448, 0.438, 0.431, 0.424, 0.420, 0.414, 0.411, 0.406 }; static void osborne_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 5.464894697482687e-05; const double osborne_x[osborne_P] = { 3.754100521058740e-01, GSL_NAN, GSL_NAN, GSL_NAN, GSL_NAN }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* only the first model parameter is uniquely constrained */ gsl_test_rel(x[0], osborne_x[0], epsrel, "%s/%s i=0", sname, pname); } static int osborne_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double yi = osborne_Y[i]; double fi = yi - (x1 + x2*exp(-x4*ti) + x3*exp(-x5*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int osborne_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(osborne_J, osborne_N, osborne_P); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double term1 = exp(-x4*ti); double term2 = exp(-x5*ti); gsl_matrix_set(&J.matrix, i, 0, -1.0); gsl_matrix_set(&J.matrix, i, 1, -term1); gsl_matrix_set(&J.matrix, i, 2, -term2); gsl_matrix_set(&J.matrix, i, 3, ti*x2*term1); gsl_matrix_set(&J.matrix, i, 4, ti*x3*term2); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int osborne_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double term1 = exp(-x4*ti); double term2 = exp(-x5*ti); double term3 = -2*v2 + ti*v4*x2; double term4 = -2*v3 + ti*v5*x3; gsl_vector_set(fvv, i, -term1 * term2 * ti * (v4 / term2 * term3 + v5 / term1 * term4)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf osborne_func = { osborne_f, osborne_df, osborne_fvv, osborne_N, osborne_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem osborne_problem = { "osborne", osborne_x0, NULL, &osborne_epsrel, &osborne_checksol, &osborne_func }; gsl-doc-2.3/multilarge_nlinear/test_thurber.c0000644000175000017500000001014312753424401017514 0ustar eddedd#define thurber_N 37 #define thurber_P 7 static double thurber_x0a[thurber_P] = { 1000.0, 1000.0, 400.0, 40.0, 0.7, 0.3, 0.03 }; static double thurber_x0b[thurber_P] = { 1300.0, 1500.0, 500.0, 75.0, 1.0, 0.4, 0.05 }; static double thurber_epsrel = 1.0e-6; static double thurber_J[thurber_N * thurber_P]; static double thurber_sigma[thurber_P] = { 4.6647963344E+00, 3.9571156086E+01, 2.8698696102E+01, 5.5675370270E+00, 3.1333340687E-02, 1.4984928198E-02, 6.5842344623E-03 }; static double thurber_X[thurber_N] = { -3.067, -2.981, -2.921, -2.912, -2.840, -2.797, -2.702, -2.699, -2.633, -2.481, -2.363, -2.322, -1.501, -1.460, -1.274, -1.212, -1.100, -1.046, -0.915, -0.714, -0.566, -0.545, -0.400, -0.309, -0.109, -0.103, 0.010, 0.119, 0.377, 0.790, 0.963, 1.006, 1.115, 1.572, 1.841, 2.047, 2.200 }; static double thurber_F[thurber_N] = { 80.574, 84.248, 87.264, 87.195, 89.076, 89.608, 89.868, 90.101, 92.405, 95.854, 100.696, 101.060, 401.672, 390.724, 567.534, 635.316, 733.054, 759.087, 894.206, 990.785, 1090.109, 1080.914, 1122.643, 1178.351, 1260.531, 1273.514, 1288.339, 1327.543, 1353.863, 1414.509, 1425.208, 1421.384, 1442.962, 1464.350, 1468.705, 1447.894, 1457.628 }; static void thurber_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 5.6427082397E+03; const double thurber_x[thurber_P] = { 1.2881396800E+03, 1.4910792535E+03, 5.8323836877E+02, 7.5416644291E+01, 9.6629502864E-01, 3.9797285797E-01, 4.9727297349E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < thurber_P; ++i) { gsl_test_rel(x[i], thurber_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int thurber_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double yi; yi = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; yi /= 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; gsl_vector_set (f, i, yi - thurber_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int thurber_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(thurber_J, thurber_N, thurber_P); double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double d, n, d_sq; n = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; d = 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; d_sq = d * d; gsl_matrix_set (&J.matrix, i, 0, 1.0 / d); gsl_matrix_set (&J.matrix, i, 1, xi / d); gsl_matrix_set (&J.matrix, i, 2, (xi * xi) / d); gsl_matrix_set (&J.matrix, i, 3, (xi * xi * xi) / d); gsl_matrix_set (&J.matrix, i, 4, -xi * n / d_sq); gsl_matrix_set (&J.matrix, i, 5, -xi * xi * n / d_sq); gsl_matrix_set (&J.matrix, i, 6, -xi * xi * xi * n / d_sq); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf thurber_func = { thurber_f, thurber_df, NULL, /* analytic expression too complex */ thurber_N, thurber_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem thurbera_problem = { "nist-thurbera", thurber_x0a, thurber_sigma, &thurber_epsrel, &thurber_checksol, &thurber_func }; static test_fdf_problem thurberb_problem = { "nist-thurberb", thurber_x0b, thurber_sigma, &thurber_epsrel, &thurber_checksol, &thurber_func }; gsl-doc-2.3/multilarge_nlinear/cholesky.c0000644000175000017500000002111512755641720016633 0ustar eddedd/* multilarge_nlinear/cholesky.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module calculates the solution of the normal equations least squares * system: * * [ J^T J + mu D^T D ] p = -J^T f * * using the modified Cholesky decomposition. */ #include #include #include #include #include #include #include #include #include #include "common.c" typedef struct { gsl_matrix *JTJ; /* J^T J */ gsl_matrix *work_JTJ; /* copy of J^T J */ gsl_vector *rhs; /* -J^T f, size p */ gsl_permutation *perm; /* permutation matrix for modified Cholesky */ gsl_vector *work3p; /* workspace, size 3*p */ gsl_vector *workn; /* workspace, size n */ double mu; /* current regularization parameter */ } cholesky_state_t; static void *cholesky_alloc (const size_t n, const size_t p); static int cholesky_init(const void * vtrust_state, void * vstate); static int cholesky_presolve(const double mu, const void * vtrust_state, void * vstate); static int cholesky_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate); static int cholesky_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate); static int cholesky_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate); static int cholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, cholesky_state_t *state); static int cholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, cholesky_state_t * state); static void * cholesky_alloc (const size_t n, const size_t p) { cholesky_state_t *state; state = calloc(1, sizeof(cholesky_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate cholesky state", GSL_ENOMEM); } state->JTJ = gsl_matrix_alloc(p, p); if (state->JTJ == NULL) { GSL_ERROR_NULL ("failed to allocate space for JTJ", GSL_ENOMEM); } state->work_JTJ = gsl_matrix_alloc(p, p); if (state->work_JTJ == NULL) { GSL_ERROR_NULL ("failed to allocate space for JTJ workspace", GSL_ENOMEM); } state->rhs = gsl_vector_alloc(p); if (state->rhs == NULL) { GSL_ERROR_NULL ("failed to allocate space for rhs", GSL_ENOMEM); } state->perm = gsl_permutation_alloc(p); if (state->perm == NULL) { GSL_ERROR_NULL ("failed to allocate space for perm", GSL_ENOMEM); } state->work3p = gsl_vector_alloc(3 * p); if (state->work3p == NULL) { GSL_ERROR_NULL ("failed to allocate space for work3p", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->mu = -1.0; return state; } static void cholesky_free(void *vstate) { cholesky_state_t *state = (cholesky_state_t *) vstate; if (state->JTJ) gsl_matrix_free(state->JTJ); if (state->work_JTJ) gsl_matrix_free(state->work_JTJ); if (state->rhs) gsl_vector_free(state->rhs); if (state->perm) gsl_permutation_free(state->perm); if (state->work3p) gsl_vector_free(state->work3p); if (state->workn) gsl_vector_free(state->workn); free(state); } static int cholesky_init(const void * vtrust_state, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; cholesky_state_t *state = (cholesky_state_t *) vstate; /* store J^T J normal equations matrix */ gsl_matrix_tricpy('L', 1, state->JTJ, trust_state->JTJ); return GSL_SUCCESS; } /* cholesky_presolve() Compute the modified Cholesky decomposition of J^T J + mu D^T D. Modified Cholesky is used in case mu = 0 and there are rounding errors in forming J^T J which could lead to an indefinite matrix. Inputs: mu - LM parameter vstate - workspace Notes: 1) On output, state->work_JTJ contains the Cholesky decomposition of J^T J + mu D^T D */ static int cholesky_presolve(const double mu, const void * vtrust_state, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; cholesky_state_t *state = (cholesky_state_t *) vstate; gsl_matrix *JTJ = state->work_JTJ; const gsl_vector *diag = trust_state->diag; int status; /* copy lower triangle of A to workspace */ gsl_matrix_tricpy('L', 1, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = cholesky_regularize(mu, diag, JTJ, state); if (status) return status; /* compute modified Cholesky decomposition */ status = gsl_linalg_mcholesky_decomp(JTJ, state->perm, NULL); if (status) return status; state->mu = mu; return GSL_SUCCESS; } /* cholesky_solve() Compute (J^T J + mu D^T D) x = -g where g = J^T f Inputs: g - right hand side vector g, size p x - (output) solution vector vstate - cholesky workspace */ static int cholesky_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate) { cholesky_state_t *state = (cholesky_state_t *) vstate; int status; status = cholesky_solve_rhs(g, x, state); if (status) return status; /* reverse direction to go downhill */ gsl_vector_scale(x, -1.0); (void) vtrust_state; return GSL_SUCCESS; } static int cholesky_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate) { int status; cholesky_state_t *state = (cholesky_state_t *) vstate; double rcond_JTJ; /* its possible the current Cholesky decomposition is from the previous * iteration so do a new one to be sure we use the right Jacobian */ /* copy lower triangle of JTJ to workspace */ gsl_matrix_tricpy('L', 1, state->work_JTJ, JTJ); /* compute modified Cholesky decomposition */ status = gsl_linalg_mcholesky_decomp(state->work_JTJ, state->perm, NULL); if (status) return status; status = gsl_linalg_mcholesky_rcond(state->work_JTJ, state->perm, &rcond_JTJ, state->work3p); if (status == GSL_SUCCESS) *rcond = sqrt(rcond_JTJ); return status; } static int cholesky_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate) { int status; cholesky_state_t *state = (cholesky_state_t *) vstate; /* its possible the current Cholesky decomposition is from the previous * iteration so do a new one to be sure we use the right Jacobian */ /* copy lower triangle of JTJ to workspace */ gsl_matrix_tricpy('L', 1, state->work_JTJ, JTJ); /* compute modified Cholesky decomposition */ status = gsl_linalg_mcholesky_decomp(state->work_JTJ, state->perm, NULL); if (status) return status; status = gsl_linalg_mcholesky_invert(state->work_JTJ, state->perm, covar); if (status) return status; return GSL_SUCCESS; } /* solve: (J^T J + mu D^T D) x = b */ static int cholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, cholesky_state_t *state) { int status; gsl_matrix *JTJ = state->work_JTJ; status = gsl_linalg_mcholesky_solve(JTJ, state->perm, b, x); if (status) return status; return GSL_SUCCESS; } /* A <- A + mu D^T D */ static int cholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, cholesky_state_t * state) { (void) state; if (mu != 0.0) { size_t i; for (i = 0; i < diag->size; ++i) { double di = gsl_vector_get(diag, i); double *Aii = gsl_matrix_ptr(A, i, i); *Aii += mu * di * di; } } return GSL_SUCCESS; } static const gsl_multilarge_nlinear_solver cholesky_type = { "cholesky", cholesky_alloc, cholesky_init, cholesky_presolve, cholesky_solve, cholesky_rcond, cholesky_covar, cholesky_free }; const gsl_multilarge_nlinear_solver *gsl_multilarge_nlinear_solver_cholesky = &cholesky_type; gsl-doc-2.3/multilarge_nlinear/test_enso.c0000644000175000017500000001265212753424255017023 0ustar eddedd#define enso_N 168 #define enso_P 9 static double enso_x0a[enso_P] = { 11.0, 3.0, 0.5, 40.0, -0.7, -1.3, 25.0, -0.3, 1.4 }; static double enso_x0b[enso_P] = { 10.0, 3.0, 0.5, 44.0, -1.5, 0.5, 26.0, -0.1, 1.5 }; static double enso_epsrel = 1.0e-3; static double enso_J[enso_N * enso_P]; static double enso_sigma[enso_P] = { 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 }; static double enso_F[enso_N] = { 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 }; static void enso_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 7.8853978668E+02; const double enso_x[enso_P] = { 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 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < enso_P; ++i) { gsl_test_rel(x[i], enso_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int enso_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; 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); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int enso_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(enso_J, enso_N, enso_P); double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; i++) { double t = (i + 1.0); gsl_matrix_set (&J.matrix, i, 0, -1.0); gsl_matrix_set (&J.matrix, i, 1, -cos(2*M_PI*t/12)); gsl_matrix_set (&J.matrix, i, 2, -sin(2*M_PI*t/12)); gsl_matrix_set (&J.matrix, 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 (&J.matrix, i, 4, -cos(2*M_PI*t/b[3])); gsl_matrix_set (&J.matrix, i, 5, -sin(2*M_PI*t/b[3])); gsl_matrix_set (&J.matrix, 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 (&J.matrix, i, 7, -cos(2*M_PI*t/b[6])); gsl_matrix_set (&J.matrix, i, 8, -sin(2*M_PI*t/b[6])); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf enso_func = { enso_f, enso_df, NULL, /* analytic expression too complex */ enso_N, enso_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem ensoa_problem = { "nist-ENSOa", enso_x0a, enso_sigma, &enso_epsrel, &enso_checksol, &enso_func }; static test_fdf_problem ensob_problem = { "nist-ENSOb", enso_x0b, enso_sigma, &enso_epsrel, &enso_checksol, &enso_func }; gsl-doc-2.3/multilarge_nlinear/scaling.c0000644000175000017500000001026212753423512016426 0ustar eddedd/* multilarge_nlinear/scaling.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module handles the updating of the scaling matrix D_k in the * trust region subproblem: * * min m_k (dx), || D_k dx || <= Delta_k * * where m_k(dx) is a model which approximates the cost function * F(x_k + dx) near the current iteration point x_k * * D_k can be updated according to several different strategies. */ #include #include #include #include #include #include #include #include static int init_diag_levenberg(const gsl_matrix * JTJ, gsl_vector * diag); static int update_diag_levenberg(const gsl_matrix * JTJ, gsl_vector * diag); static int init_diag_marquardt(const gsl_matrix * JTJ, gsl_vector * diag); static int update_diag_marquardt (const gsl_matrix * JTJ, gsl_vector * diag); static int init_diag_more(const gsl_matrix * JTJ, gsl_vector * diag); static int update_diag_more(const gsl_matrix * JTJ, gsl_vector * diag); /* Levenberg scaling, D = I */ static int init_diag_levenberg(const gsl_matrix * JTJ, gsl_vector * diag) { (void)JTJ; /* avoid unused parameter warning */ gsl_vector_set_all(diag, 1.0); return GSL_SUCCESS; } static int update_diag_levenberg(const gsl_matrix * JTJ, gsl_vector * diag) { (void)JTJ; /* avoid unused parameter warning */ (void)diag; /* avoid unused parameter warning */ /* nothing to do */ return GSL_SUCCESS; } /* initialize diagonal scaling matrix D according to Marquardt method */ static int init_diag_marquardt(const gsl_matrix * JTJ, gsl_vector * diag) { return update_diag_marquardt(JTJ, diag); } /* update diagonal scaling matrix D according to Marquardt method */ static int update_diag_marquardt (const gsl_matrix * JTJ, gsl_vector * diag) { const size_t p = JTJ->size2; size_t j; for (j = 0; j < p; j++) { double Jjj = gsl_matrix_get(JTJ, j, j); double norm; if (Jjj <= 0.0) norm = 1.0; else norm = sqrt(Jjj); gsl_vector_set(diag, j, norm); } return GSL_SUCCESS; } /* initialize diagonal scaling matrix D according to Eq 6.3 of * More, 1978 */ static int init_diag_more(const gsl_matrix * JTJ, gsl_vector * diag) { int status; gsl_vector_set_zero(diag); status = update_diag_more(JTJ, diag); return status; } /* update diagonal scaling matrix D according to Eq. 6.3 of * More, 1978 */ static int update_diag_more (const gsl_matrix * JTJ, gsl_vector * diag) { const size_t p = JTJ->size2; size_t j; for (j = 0; j < p; j++) { double Jjj = gsl_matrix_get(JTJ, j, j); double *diagj = gsl_vector_ptr(diag, j); double norm; if (Jjj <= 0.0) norm = 1.0; else norm = sqrt(Jjj); *diagj = GSL_MAX(*diagj, norm); } return GSL_SUCCESS; } static const gsl_multilarge_nlinear_scale levenberg_type = { "levenberg", init_diag_levenberg, update_diag_levenberg }; static const gsl_multilarge_nlinear_scale marquardt_type = { "marquardt", init_diag_marquardt, update_diag_marquardt }; static const gsl_multilarge_nlinear_scale more_type = { "more", init_diag_more, update_diag_more }; const gsl_multilarge_nlinear_scale *gsl_multilarge_nlinear_scale_levenberg = &levenberg_type; const gsl_multilarge_nlinear_scale *gsl_multilarge_nlinear_scale_marquardt = &marquardt_type; const gsl_multilarge_nlinear_scale *gsl_multilarge_nlinear_scale_more = &more_type; gsl-doc-2.3/multilarge_nlinear/test_meyer.c0000644000175000017500000000660312757130627017200 0ustar eddedd#define meyer_N 16 #define meyer_P 3 static double meyer_x0[meyer_P] = { 0.02, 4000.0, 250.0 }; static double meyer_epsrel = 1.0e-7; static double meyer_J[meyer_N * meyer_P]; static double meyer_Y[meyer_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyer_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517053883e+01; const double meyer_x[meyer_P] = { 5.609636471049458e-03, 6.181346346283188e+03, 3.452236346240292e+02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyer_P; ++i) { gsl_test_rel(x[i], meyer_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyer_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double yi = meyer_Y[i]; double fi = x1 * exp(x2 / (ti + x3)) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyer_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(meyer_J, meyer_N, meyer_P); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double term1 = ti + x3; double term2 = exp(x2 / term1); gsl_matrix_set(&J.matrix, i, 0, term2); gsl_matrix_set(&J.matrix, i, 1, x1*term2/term1); gsl_matrix_set(&J.matrix, i, 2, -x1*x2*term2/(term1*term1)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyer_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double term1 = ti + x3; double term2 = exp(x2 / term1); double term3 = v2*term1 - v3*x2; double term4 = 2*ti*ti*v1 - v3*x1*(x2 + 2*x3) + x3*(v2*x1 + 2*v1*x3) + ti*(v2*x1 - 2*v3*x1 + 4*v1*x3); gsl_vector_set(fvv, i, term2 * term3 * term4 / pow(term1, 4.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf meyer_func = { meyer_f, meyer_df, meyer_fvv, meyer_N, meyer_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem meyer_problem = { "meyer", meyer_x0, NULL, &meyer_epsrel, &meyer_checksol, &meyer_func }; gsl-doc-2.3/multilarge_nlinear/test_rat42.c0000644000175000017500000000734612753424356017021 0ustar eddedd#define rat42_N 9 #define rat42_P 3 static double rat42_x0a[rat42_P] = { 100.0, 1.0, 0.1 }; static double rat42_x0b[rat42_P] = { 75.0, 2.5, 0.07 }; static double rat42_epsrel = 1.0e-7; static double rat42_J[rat42_N * rat42_P]; static double rat42_sigma[rat42_P] = { 1.7340283401E+00, 8.8295217536E-02, 3.4465663377E-03 }; static double rat42_X[rat42_N] = { 9.0, 14.0, 21.0, 28.0, 42.0, 57.0, 63.0, 70.0, 79.0 }; static double rat42_F[rat42_N] = { 8.930, 10.800, 18.590, 22.330, 39.350, 56.110, 61.730, 64.620, 67.080 }; static void rat42_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.0565229338E+00; const double rat42_x[rat42_P] = { 7.2462237576E+01, 2.6180768402E+00, 6.7359200066E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat42_P; ++i) { gsl_test_rel(x[i], rat42_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat42_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double yi = b[0] / (1.0 + exp(b[1] - b[2]*xi)); gsl_vector_set (f, i, yi - rat42_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat42_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(rat42_J, rat42_N, rat42_P); double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double term1 = exp(b[1] - b[2]*xi); double term2 = 1.0 + term1; gsl_matrix_set (&J.matrix, i, 0, 1.0 / term2); gsl_matrix_set (&J.matrix, i, 1, -b[0] * term1 / (term2 * term2)); gsl_matrix_set (&J.matrix, i, 2, b[0] * term1 * xi / (term2 * term2)); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat42_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < rat42_N; i++) { double ti = rat42_X[i]; double term1 = exp(x2); double term2 = exp(ti * x3); gsl_vector_set(fvv, i, -pow(term1 + term2, -3.0) * term1 * term2 * (v2 - ti*v3) * (term1*(2*v1 - v2*x1 + ti*v3*x1) + term2*(2*v1 + x1*(v2 - ti*v3)))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf rat42_func = { rat42_f, rat42_df, rat42_fvv, rat42_N, rat42_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem rat42a_problem = { "nist-rat42a", rat42_x0a, rat42_sigma, &rat42_epsrel, &rat42_checksol, &rat42_func }; static test_fdf_problem rat42b_problem = { "nist-rat42b", rat42_x0b, rat42_sigma, &rat42_epsrel, &rat42_checksol, &rat42_func }; gsl-doc-2.3/multilarge_nlinear/fdf.c0000644000175000017500000003612413004361416015544 0ustar eddedd/* multilarge_nlinear/fdf.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include gsl_multilarge_nlinear_workspace * gsl_multilarge_nlinear_alloc (const gsl_multilarge_nlinear_type * T, const gsl_multilarge_nlinear_parameters * params, const size_t n, const size_t p) { gsl_multilarge_nlinear_workspace * w; if (n < p) { GSL_ERROR_VAL ("insufficient data points, n < p", GSL_EINVAL, 0); } w = calloc (1, sizeof (gsl_multilarge_nlinear_workspace)); if (w == 0) { GSL_ERROR_VAL ("failed to allocate space for workspace", GSL_ENOMEM, 0); } w->n = n; w->p = p; w->type = T; w->fdf = NULL; w->niter = 0; w->params = *params; /* the cgst method uses its own built-in linear solver */ if (w->params.trs == gsl_multilarge_nlinear_trs_cgst) { w->params.solver = gsl_multilarge_nlinear_solver_none; } w->x = gsl_vector_calloc (p); if (w->x == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0); } w->f = gsl_vector_calloc (n); if (w->f == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0); } w->dx = gsl_vector_calloc (p); if (w->dx == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0); } w->g = gsl_vector_alloc (p); if (w->g == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for g", GSL_ENOMEM, 0); } if (w->params.solver == gsl_multilarge_nlinear_solver_cholesky) { w->JTJ = gsl_matrix_alloc (p, p); if (w->JTJ == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for JTJ", GSL_ENOMEM, 0); } } w->sqrt_wts_work = gsl_vector_calloc (n); if (w->sqrt_wts_work == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for weights", GSL_ENOMEM, 0); } w->state = (T->alloc)(&(w->params), n, p); if (w->state == 0) { gsl_multilarge_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for state", GSL_ENOMEM, 0); } return w; } void gsl_multilarge_nlinear_free (gsl_multilarge_nlinear_workspace * w) { RETURN_IF_NULL (w); if (w->state) (w->type->free) (w->state); if (w->dx) gsl_vector_free (w->dx); if (w->x) gsl_vector_free (w->x); if (w->f) gsl_vector_free (w->f); if (w->sqrt_wts_work) gsl_vector_free (w->sqrt_wts_work); if (w->g) gsl_vector_free (w->g); if (w->JTJ) gsl_matrix_free (w->JTJ); free (w); } gsl_multilarge_nlinear_parameters gsl_multilarge_nlinear_default_parameters(void) { gsl_multilarge_nlinear_parameters params; params.trs = gsl_multilarge_nlinear_trs_lm; params.scale = gsl_multilarge_nlinear_scale_more; params.solver = gsl_multilarge_nlinear_solver_cholesky; params.fdtype = GSL_MULTILARGE_NLINEAR_FWDIFF; params.factor_up = 3.0; params.factor_down = 2.0; params.avmax = 0.75; params.h_df = GSL_SQRT_DBL_EPSILON; params.h_fvv = 0.01; params.max_iter = 0; params.tol = 1.0e-6; return params; } int gsl_multilarge_nlinear_init (const gsl_vector * x, gsl_multilarge_nlinear_fdf * fdf, gsl_multilarge_nlinear_workspace * w) { return gsl_multilarge_nlinear_winit(x, NULL, fdf, w); } int gsl_multilarge_nlinear_winit (const gsl_vector * x, const gsl_vector * wts, gsl_multilarge_nlinear_fdf * fdf, gsl_multilarge_nlinear_workspace * w) { const size_t n = w->f->size; if (n != fdf->n) { GSL_ERROR ("function size does not match workspace", GSL_EBADLEN); } else if (w->x->size != x->size) { GSL_ERROR ("vector length does not match workspace", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match workspace", GSL_EBADLEN); } else { size_t i; /* initialize counters for function and Jacobian evaluations */ fdf->nevalf = 0; fdf->nevaldfu = 0; fdf->nevaldf2 = 0; fdf->nevalfvv = 0; w->fdf = fdf; gsl_vector_memcpy(w->x, x); w->niter = 0; if (wts) { w->sqrt_wts = w->sqrt_wts_work; for (i = 0; i < n; ++i) { double wi = gsl_vector_get(wts, i); gsl_vector_set(w->sqrt_wts, i, sqrt(wi)); } } else { w->sqrt_wts = NULL; } return (w->type->init) (w->state, w->sqrt_wts, w->fdf, w->x, w->f, w->g, w->JTJ); } } int gsl_multilarge_nlinear_iterate (gsl_multilarge_nlinear_workspace * w) { int status = (w->type->iterate) (w->state, w->sqrt_wts, w->fdf, w->x, w->f, w->g, w->JTJ, w->dx); w->niter++; return status; } double gsl_multilarge_nlinear_avratio (const gsl_multilarge_nlinear_workspace * w) { return (w->type->avratio) (w->state); } int gsl_multilarge_nlinear_rcond (double * rcond, const gsl_multilarge_nlinear_workspace * w) { int status = (w->type->rcond) (rcond, w->JTJ, w->state); return status; } int gsl_multilarge_nlinear_covar (gsl_matrix * covar, gsl_multilarge_nlinear_workspace * w) { if (covar->size1 != covar->size2) { GSL_ERROR ("covariance matrix must be square", GSL_ENOTSQR); } else if (covar->size1 != w->p) { GSL_ERROR ("covariance matrix does not match workspace", GSL_EBADLEN); } else { int status = (w->type->covar) (w->JTJ, covar, w->state); return status; } } /* gsl_multilarge_nlinear_driver() Iterate the nonlinear least squares solver until completion Inputs: maxiter - maximum iterations to allow xtol - tolerance in step x gtol - tolerance in gradient ftol - tolerance in ||f|| callback - callback function to call each iteration callback_params - parameters to pass to callback function info - (output) info flag on why iteration terminated 1 = stopped due to small step size ||dx| 2 = stopped due to small gradient 3 = stopped due to small change in f GSL_ETOLX = ||dx|| has converged to within machine precision (and xtol is too small) GSL_ETOLG = ||g||_inf is smaller than machine precision (gtol is too small) GSL_ETOLF = change in ||f|| is smaller than machine precision (ftol is too small) w - workspace Return: GSL_SUCCESS if converged GSL_MAXITER if maxiter exceeded without converging GSL_ENOPROG if no accepted step found on first iteration */ int gsl_multilarge_nlinear_driver (const size_t maxiter, const double xtol, const double gtol, const double ftol, void (*callback)(const size_t iter, void *params, const gsl_multilarge_nlinear_workspace *w), void *callback_params, int *info, gsl_multilarge_nlinear_workspace * w) { int status; size_t iter = 0; /* call user callback function prior to any iterations * with initial system state */ if (callback) callback(iter, callback_params, w); do { status = gsl_multilarge_nlinear_iterate (w); /* * If the solver reports no progress on the first iteration, * then it didn't find a single step to reduce the * cost function and more iterations won't help so return. * * If we get a no progress flag on subsequent iterations, * it means we did find a good step in a previous iteration, * so continue iterating since the solver has now reset * mu to its initial value. */ if (status == GSL_ENOPROG && iter == 0) { *info = status; return GSL_EMAXITER; } ++iter; if (callback) callback(iter, callback_params, w); /* test for convergence */ status = gsl_multilarge_nlinear_test(xtol, gtol, ftol, info, w); } while (status == GSL_CONTINUE && iter < maxiter); /* * the following error codes mean that the solution has converged * to within machine precision, so record the error code in info * and return success */ if (status == GSL_ETOLF || status == GSL_ETOLX || status == GSL_ETOLG) { *info = status; status = GSL_SUCCESS; } /* check if max iterations reached */ if (iter >= maxiter && status != GSL_SUCCESS) status = GSL_EMAXITER; return status; } /* gsl_multilarge_nlinear_driver() */ const char * gsl_multilarge_nlinear_name (const gsl_multilarge_nlinear_workspace * w) { return w->type->name; } gsl_vector * gsl_multilarge_nlinear_position (const gsl_multilarge_nlinear_workspace * w) { return w->x; } gsl_vector * gsl_multilarge_nlinear_residual (const gsl_multilarge_nlinear_workspace * w) { return w->f; } gsl_vector * gsl_multilarge_nlinear_step (const gsl_multilarge_nlinear_workspace * w) { return w->dx; } size_t gsl_multilarge_nlinear_niter (const gsl_multilarge_nlinear_workspace * w) { return w->niter; } const char * gsl_multilarge_nlinear_trs_name (const gsl_multilarge_nlinear_workspace * w) { return w->params.trs->name; } /* gsl_multilarge_nlinear_eval_f() Compute residual vector y with user callback function, and apply weighting transform if given: y~ = sqrt(W) y Inputs: fdf - callback function x - model parameters swts - weight matrix sqrt(W) = sqrt(diag(w1,w2,...,wn)) set to NULL for unweighted fit y - (output) (weighted) residual vector y_i = sqrt(w_i) f_i where f_i is unweighted residual */ int gsl_multilarge_nlinear_eval_f(gsl_multilarge_nlinear_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_vector *y) { int s = ((*((fdf)->f)) (x, fdf->params, y)); ++(fdf->nevalf); /* y <- sqrt(W) y */ if (swts) gsl_vector_mul(y, swts); return s; } /* gsl_multilarge_nlinear_eval_df() Compute Jacobian matrix-vector product: v = J * u or v = J^T u Inputs: TransJ - use J or J^T x - model parameters f - residual vector f(x) u - input vector u swts - weight matrix W = diag(w1,w2,...,wn) set to NULL for unweighted fit h - finite difference step size fdtype - finite difference method fdf - callback function v - (output) vector v JTJ - (output) matrix J^T J work - workspace for finite difference, size n */ int gsl_multilarge_nlinear_eval_df(const CBLAS_TRANSPOSE_t TransJ, const gsl_vector *x, const gsl_vector *f, const gsl_vector *u, const gsl_vector *swts, const double h, const gsl_multilarge_nlinear_fdtype fdtype, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *v, gsl_matrix *JTJ, gsl_vector *work) { const size_t n = fdf->n; const size_t p = fdf->p; if (u != NULL && ((TransJ == CblasNoTrans && u->size != p) || (TransJ == CblasTrans && u->size != n))) { GSL_ERROR("u vector has wrong size", GSL_EBADLEN); } else if (v != NULL && ((TransJ == CblasNoTrans && v->size != n) || (TransJ == CblasTrans && v->size != p))) { GSL_ERROR("v vector has wrong size", GSL_EBADLEN); } else if (JTJ != NULL && ((JTJ->size1 != p) || (JTJ->size2 != p))) { GSL_ERROR("JTJ matrix has wrong size", GSL_EBADLEN); } else { int status; if (fdf->df) { /* call user-supplied function */ status = ((*((fdf)->df)) (TransJ, x, u, fdf->params, v, JTJ)); if (v) ++(fdf->nevaldfu); if (JTJ) ++(fdf->nevaldf2); } else { #if 0 /* use finite difference Jacobian approximation */ status = gsl_multilarge_nlinear_df(h, fdtype, x, swts, fdf, f, df, work); #endif } return status; } } /* gsl_multilarge_nlinear_eval_fvv() Compute second direction derivative vector yvv with user callback function, and apply weighting transform if given: yvv~ = sqrt(W) yvv Inputs: h - step size for finite difference, if needed x - model parameters, size p v - unscaled geodesic velocity vector, size p f - residual vector f(x), size n swts - weight matrix sqrt(W) = sqrt(diag(w1,w2,...,wn)) set to NULL for unweighted fit fdf - callback function yvv - (output) (weighted) second directional derivative vector yvv_i = sqrt(w_i) fvv_i where f_i is unweighted work - workspace, size p */ int gsl_multilarge_nlinear_eval_fvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_vector *swts, gsl_multilarge_nlinear_fdf *fdf, gsl_vector *yvv, gsl_vector *work) { int status; if (fdf->fvv != NULL) { /* call user-supplied function */ status = ((*((fdf)->fvv)) (x, v, fdf->params, yvv)); ++(fdf->nevalfvv); } else { #if 0 /* use finite difference approximation */ status = gsl_multilarge_nlinear_fdfvv(h, x, v, f, J, swts, fdf, yvv, work); #endif } /* yvv <- sqrt(W) yvv */ if (swts) gsl_vector_mul(yvv, swts); return status; } gsl-doc-2.3/multilarge_nlinear/test.c0000644000175000017500000000551412767073636016006 0ustar eddedd/* multilarge_nlinear/test.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include "test_fdf.c" static void test_proc(const gsl_multilarge_nlinear_trs *trs, const gsl_multilarge_nlinear_scale *scale, const int fdtype) { gsl_multilarge_nlinear_parameters fdf_params = gsl_multilarge_nlinear_default_parameters(); fdf_params.trs = trs; fdf_params.scale = scale; fdf_params.fdtype = fdtype; test_fdf_main(&fdf_params); } int main (void) { const gsl_multilarge_nlinear_trs **nlinear_trs[7]; const gsl_multilarge_nlinear_scale **nlinear_scales[3]; const gsl_multilarge_nlinear_trs **trs; const gsl_multilarge_nlinear_scale **scale; int fdtype; size_t i = 0; gsl_ieee_env_setup(); /* initialize arrays */ nlinear_trs[0] = &gsl_multilarge_nlinear_trs_lm; nlinear_trs[1] = &gsl_multilarge_nlinear_trs_lmaccel; nlinear_trs[2] = &gsl_multilarge_nlinear_trs_dogleg; nlinear_trs[3] = &gsl_multilarge_nlinear_trs_ddogleg; nlinear_trs[4] = &gsl_multilarge_nlinear_trs_subspace2D; nlinear_trs[5] = &gsl_multilarge_nlinear_trs_cgst; nlinear_trs[6] = NULL; nlinear_scales[0] = &gsl_multilarge_nlinear_scale_levenberg; nlinear_scales[1] = &gsl_multilarge_nlinear_scale_more; nlinear_scales[2] = NULL; /* run testsuite over all parameter combinations */ for (trs = nlinear_trs[i]; trs != NULL; trs = nlinear_trs[++i]) { size_t j = 0; fprintf(stderr, "trs = %s\n", (*trs)->name); for (scale = nlinear_scales[j]; scale != NULL; scale = nlinear_scales[++j]) { for (fdtype = GSL_MULTILARGE_NLINEAR_FWDIFF; fdtype <= GSL_MULTILARGE_NLINEAR_CTRDIFF; ++fdtype) { test_proc(*trs, *scale, fdtype); } } } exit (gsl_test_summary ()); } gsl-doc-2.3/multilarge_nlinear/test_wnlin.c0000644000175000017500000001006212755642622017201 0ustar eddedd#define wnlin_N 40 #define wnlin_P 3 static double wnlin_x0[wnlin_P] = { 1.0, 0.9, 0.0 }; static double wnlin_epsrel = 1.0e-8; static double wnlin_J[wnlin_N * wnlin_P]; /* data */ static double wnlin_Y[wnlin_N] = { 6.08035e+00, 5.47552e+00, 5.94654e+00, 5.04920e+00, 4.78568e+00, 3.51748e+00, 2.84671e+00, 3.24634e+00, 3.23395e+00, 3.30385e+00, 2.83439e+00, 2.31891e+00, 2.33858e+00, 2.40559e+00, 2.41856e+00, 1.99966e+00, 1.88127e+00, 1.91477e+00, 1.70415e+00, 1.60316e+00, 1.77937e+00, 1.55302e+00, 1.50903e+00, 1.36364e+00, 1.36873e+00, 1.41954e+00, 1.37778e+00, 1.23573e+00, 1.28524e+00, 1.46327e+00, 1.22315e+00, 1.19330e+00, 1.18717e+00, 8.83172e-01, 1.23424e+00, 1.14683e+00, 1.11091e+00, 1.20396e+00, 1.28722e+00, 1.05801e+00 }; /* weights */ static double wnlin_W[wnlin_N] = { 2.77778e+00, 3.27690e+00, 3.85426e+00, 4.51906e+00, 5.28083e+00, 6.14919e+00, 7.13370e+00, 8.24349e+00, 9.48703e+00, 1.08717e+01, 1.24036e+01, 1.40869e+01, 1.59238e+01, 1.79142e+01, 2.00553e+01, 2.23415e+01, 2.47646e+01, 2.73137e+01, 2.99753e+01, 3.27337e+01, 3.55714e+01, 3.84696e+01, 4.14085e+01, 4.43678e+01, 4.73278e+01, 5.02690e+01, 5.31731e+01, 5.60234e+01, 5.88046e+01, 6.15036e+01, 6.41092e+01, 6.66121e+01, 6.90054e+01, 7.12839e+01, 7.34442e+01, 7.54848e+01, 7.74053e+01, 7.92069e+01, 8.08918e+01, 8.24632e+01 }; static void wnlin_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 29.7481259665713758; const double wnlin_x[wnlin_P] = { 5.17378551196259195, 0.111041758006851149, 1.05282724070446099 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wnlin_P; ++i) { gsl_test_rel(x[i], wnlin_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wnlin_f (const gsl_vector *x, void *params, gsl_vector *f) { double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); double b = gsl_vector_get (x, 2); size_t i; /* model Yi = A * exp(-lambda * i) + b */ for (i = 0; i < wnlin_N; i++) { double ti = i; double yi = wnlin_Y[i]; double swi = sqrt(wnlin_W[i]); double Mi = A * exp (-lambda * ti) + b; gsl_vector_set (f, i, swi * (Mi - yi)); } return GSL_SUCCESS; } static int wnlin_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { gsl_matrix_view J = gsl_matrix_view_array(wnlin_J, wnlin_N, wnlin_P); double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); size_t i; for (i = 0; i < wnlin_N; i++) { gsl_vector_view v = gsl_matrix_row(&J.matrix, i); double ti = i; double swi = sqrt(wnlin_W[i]); double e = exp(-lambda * ti); gsl_vector_set(&v.vector, 0, e); gsl_vector_set(&v.vector, 1, -ti * A * e); gsl_vector_set(&v.vector, 2, 1.0); gsl_vector_scale(&v.vector, swi); } if (v) gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v); if (JTJ) gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ); return GSL_SUCCESS; } static int wnlin_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < wnlin_N; i++) { double ti = i; double swi = sqrt(wnlin_W[i]); double fvvi; fvvi = exp(-ti*lambda)*ti*v2 * (-2*v1 + ti*v2*A); gsl_vector_set(fvv, i, swi * fvvi); } return GSL_SUCCESS; } static gsl_multilarge_nlinear_fdf wnlin_func1 = { wnlin_f, wnlin_df, wnlin_fvv, wnlin_N, wnlin_P, NULL, 0, 0, 0, 0 }; static test_fdf_problem wnlin_problem1 = { "wnlin_internal_weights", wnlin_x0, NULL, &wnlin_epsrel, &wnlin_checksol, &wnlin_func1 }; gsl-doc-2.3/poly/0000755000175000017500000000000013022553154011743 5ustar eddeddgsl-doc-2.3/poly/companion.c0000664000175000017500000000226412616157443014111 0ustar eddedd/* poly/companion.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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]; } gsl-doc-2.3/poly/dd.c0000664000175000017500000000636612616157443012524 0ustar eddedd/* interpolation/interp_poly.c * * Copyright (C) 2001 DAN, HO-JIN * Copyright (C) 2013 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; } 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;) { 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; } /* gsl_poly_dd_hermite_init() Compute divided difference representation of data for Hermite polynomial interpolation Inputs: dd - (output) array of size 2*size containing divided differences, dd[k] = f[z_0,z_1,...,z_k] za - (output) array of size 2*size containing z values xa - x data ya - y data dya - dy/dx data size - size of xa,ya,dya arrays Return: success */ int gsl_poly_dd_hermite_init (double dd[], double za[], const double xa[], const double ya[], const double dya[], const size_t size) { const size_t N = 2 * size; size_t i, j; /* Hermite divided differences */ dd[0] = ya[0]; /* compute: dd[j] = f[z_{j-1},z_j] for j \in [1,N-1] */ for (j = 0; j < size; ++j) { za[2*j] = xa[j]; za[2*j + 1] = xa[j]; if (j != 0) { dd[2*j] = (ya[j] - ya[j - 1]) / (xa[j] - xa[j - 1]); dd[2*j - 1] = dya[j - 1]; } } dd[N - 1] = dya[size - 1]; for (i = 2; i < N; i++) { for (j = N - 1; j >= i; j--) { dd[j] = (dd[j] - dd[j - 1]) / (za[j] - za[j - i]); } } return GSL_SUCCESS; } /* gsl_poly_dd_hermite_init() */ gsl-doc-2.3/poly/Makefile.am0000664000175000017500000000100612616157443014007 0ustar eddeddnoinst_LTLIBRARIES = libgslpoly.la pkginclude_HEADERS = gsl_poly.h AM_CPPFLAGS = -I$(top_srcdir) libgslpoly_la_SOURCES = dd.c eval.c solve_quadratic.c solve_cubic.c zsolve_quadratic.c zsolve_cubic.c zsolve.c zsolve_init.c deriv.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 ../sort/libgslsort.la gsl-doc-2.3/poly/TODO0000664000175000017500000001333212616157443012450 0ustar eddedd# -*- org -*- #+CATEGORY: poly * 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 > 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 . > 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" 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 gsl-doc-2.3/poly/zsolve_init.c0000664000175000017500000000346712616157443014501 0ustar eddedd/* poly/zsolve_init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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) { RETURN_IF_NULL (w); free(w->matrix) ; free(w); } gsl-doc-2.3/poly/solve_cubic.c0000664000175000017500000000565512616157443014432 0ustar eddedd/* poly/solve_cubic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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 (R2 < Q3) { double sgnR = (R >= 0 ? 1 : -1); double ratio = sgnR * sqrt (R2 / Q3); double theta = acos (ratio); double norm = -2 * sqrt (Q); *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; } } gsl-doc-2.3/poly/zsolve.c0000664000175000017500000000412212616157443013443 0ustar eddedd/* poly/zsolve.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include /* 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; } gsl-doc-2.3/poly/Makefile.in0000644000175000017500000010515013022372406014011 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 deriv.lo libgslpoly_la_OBJECTS = $(am_libgslpoly_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 ../sort/libgslsort.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslpoly.la pkginclude_HEADERS = gsl_poly.h AM_CPPFLAGS = -I$(top_srcdir) libgslpoly_la_SOURCES = dd.c eval.c solve_quadratic.c solve_cubic.c zsolve_quadratic.c zsolve_cubic.c zsolve.c zsolve_init.c deriv.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 ../sort/libgslsort.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu poly/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslpoly.la: $(libgslpoly_la_OBJECTS) $(libgslpoly_la_DEPENDENCIES) $(EXTRA_libgslpoly_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslpoly_la_OBJECTS) $(libgslpoly_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_cubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_quadratic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_cubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_quadratic.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/poly/ChangeLog0000664000175000017500000000720612616157443013535 0ustar eddedd2013-10-13 Rhys Ulerich * test.c Update stale names from "gsl_poly_eval_dp" to "gsl_poly_eval_derivs" in the test log. Thanks to Mark Jourdain for pointing out the inconsistency. 2011-04-13 Brian Gough * solve_quadratic.c (gsl_poly_solve_quadratic): simplify the case where b==0 and disc>0 (gsl_poly_solve_quadratic): delay the evaluation of the discriminant until it is needed 2009-07-09 Brian Gough * zsolve_init.c (gsl_poly_complex_workspace_free): handle NULL argument in free 2009-05-09 Brian Gough * zsolve_cubic.c (gsl_poly_complex_solve_cubic): test R2 < Q3 directly, to avoid argument of acos exceeding 1 due to extended precision. * solve_cubic.c (gsl_poly_solve_cubic): ditto 2008-07-03 Brian Gough * gsl_poly.h: use new inline declarations * inline.c: handle inline functions in separate file * dd.c: move gsl_poly_dd_eval to inline.c * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-04-28 Brian Gough * dd.c (gsl_poly_dd_taylor): use new descending loop convention 2007-12-17 Brian Gough * eval.c: added functions for complex polynomials 2005-07-03 Brian Gough * 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 * Makefile.am (noinst_HEADERS): removed norm.c (unused) Sun Dec 2 22:02:31 2001 Brian Gough * dd.c: added divided differences code from Dan, Ho-Jin Wed Oct 31 18:42:10 2001 Brian Gough * qr.c (qr_companion): increased maximum number of iterations from 30 to 60 Thu Jun 28 11:24:51 2001 Brian Gough * 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 * eval.c (gsl_poly_eval): added eval function from specfunc Tue Aug 24 12:02:47 1999 Brian Gough * zsolve.c: added general solver using QR method 1999-08-22 Mark Galassi * 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 * 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 * 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 * split out polynomial root finding algorithms into a new poly/ directory gsl-doc-2.3/poly/zsolve_cubic.c0000664000175000017500000001017412616157443014614 0ustar eddedd/* poly/zsolve_cubic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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 (R2 < Q3) { double sgnR = (R >= 0 ? 1 : -1); double ratio = sgnR * sqrt (R2 / Q3); double theta = acos (ratio); double norm = -2 * sqrt (Q); 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; } } gsl-doc-2.3/poly/deriv.c0000664000175000017500000000304312616157443013233 0ustar eddedd/* poly/eval.c * * Copyright (C) 2009 Marc JOURDAIN * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include int gsl_poly_eval_derivs (const double c[], const size_t lenc, const double x, double res[], const size_t lenres) { size_t i, n, nmax; size_t k, l, lmax; for (i = 0, n = 0, nmax = 0; i < lenres; i++) { if (n < lenc) { res[i] = c[lenc - 1]; nmax = n; n++; } else res[i] = 0.0; } for (i = 0; i < lenc - 1; i++) { k = (lenc - 1) - i; res[0] = ((x * res[0]) + c[k - 1]); lmax = (nmax < k) ? nmax : k - 1; for (l = 1; l <= lmax; l++) { res[l] = ((x * res[l]) + res[l - 1]); } } { double f = 1.0; for (i = 2; i <= nmax; i++) { f *= i; res[i] *= f; } } return GSL_SUCCESS; } gsl-doc-2.3/poly/eval.c0000664000175000017500000000175312616157443013057 0ustar eddedd/* poly/eval.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Complex functions Copyright (C) 2007 Frank Reininghaus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/poly/zsolve_quadratic.c0000664000175000017500000000505712616157443015510 0ustar eddedd/* poly/zsolve_quadratic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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; } } gsl-doc-2.3/poly/solve_quadratic.c0000664000175000017500000000405612616157443015314 0ustar eddedd/* poly/solve_quadratic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include int gsl_poly_solve_quadratic (double a, double b, double c, double *x0, double *x1) { if (a == 0) /* Handle linear case */ { if (b == 0) { return 0; } else { *x0 = -c / b; return 1; }; } { double disc = b * b - 4 * a * c; if (disc > 0) { if (b == 0) { double r = sqrt (-c / 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; } } } gsl-doc-2.3/poly/gsl_poly.h0000664000175000017500000001244012616157443013760 0ustar eddedd/* poly/gsl_poly.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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 */ /* real polynomial, real x */ INLINE_DECL double gsl_poly_eval(const double c[], const int len, const double x); /* real polynomial, complex x */ INLINE_DECL gsl_complex gsl_poly_complex_eval (const double c [], const int len, const gsl_complex z); /* complex polynomial, complex x */ INLINE_DECL gsl_complex gsl_complex_poly_complex_eval (const gsl_complex c [], const int len, const gsl_complex z); int gsl_poly_eval_derivs(const double c[], const size_t lenc, const double x, double res[], const size_t lenres); #ifdef HAVE_INLINE INLINE_FUN 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; } INLINE_FUN gsl_complex gsl_poly_complex_eval(const double c[], const int len, const gsl_complex z) { int i; gsl_complex ans; GSL_SET_COMPLEX (&ans, c[len-1], 0.0); for(i=len-1; i>0; i--) { /* The following three lines are equivalent to ans = gsl_complex_add_real (gsl_complex_mul (z, ans), c[i-1]); but faster */ double tmp = c[i-1] + GSL_REAL (z) * GSL_REAL (ans) - GSL_IMAG (z) * GSL_IMAG (ans); GSL_SET_IMAG (&ans, GSL_IMAG (z) * GSL_REAL (ans) + GSL_REAL (z) * GSL_IMAG (ans)); GSL_SET_REAL (&ans, tmp); } return ans; } INLINE_FUN gsl_complex gsl_complex_poly_complex_eval(const gsl_complex c[], const int len, const gsl_complex z) { int i; gsl_complex ans = c[len-1]; for(i=len-1; i>0; i--) { /* The following three lines are equivalent to ans = gsl_complex_add (c[i-1], gsl_complex_mul (x, ans)); but faster */ double tmp = GSL_REAL (c[i-1]) + GSL_REAL (z) * GSL_REAL (ans) - GSL_IMAG (z) * GSL_IMAG (ans); GSL_SET_IMAG (&ans, GSL_IMAG (c[i-1]) + GSL_IMAG (z) * GSL_REAL (ans) + GSL_REAL (z) * GSL_IMAG (ans)); GSL_SET_REAL (&ans, tmp); } 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); INLINE_DECL double gsl_poly_dd_eval (const double dd[], const double xa[], const size_t size, const double x); #ifdef HAVE_INLINE INLINE_FUN 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[]); int gsl_poly_dd_hermite_init (double dd[], double z[], const double xa[], const double ya[], const double dya[], const size_t size); /* 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__ */ gsl-doc-2.3/poly/balance.c0000664000175000017500000000615112616157443013512 0ustar eddedd/* poly/balance.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } } } } gsl-doc-2.3/poly/qr.c0000664000175000017500000001253612616157443012553 0ustar eddedd/* poly/qr.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 == 120) /* increased from 30 to 120 */ { /* 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; } gsl-doc-2.3/poly/test.c0000664000175000017500000005543112616157443013111 0ustar eddedd/* poly/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* sort by Re(z) then by Im(z) */ static int cmp_cplx(const double *a, const double *b) { double r = a[0] - b[0]; if (r == 0.0) { double t = a[1] - b[1]; return t < 0.0 ? -1 : t > 0.0 ? 1 : 0; } else if (r < 0.0) return -1; else return 1; } int main (void) { const double eps = 100.0 * GSL_DBL_EPSILON; gsl_ieee_env_setup (); /* Polynomial evaluation */ { 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)"); } { gsl_complex x, y; double c[1] = {0.3}; GSL_SET_REAL (&x, 0.75); GSL_SET_IMAG (&x, 1.2); y = gsl_poly_complex_eval (c, 1, x); gsl_test_rel (GSL_REAL (y), 0.3, eps, "y.real, gsl_poly_complex_eval ({0.3}, 0.75 + 1.2i)"); gsl_test_rel (GSL_IMAG (y), 0.0, eps, "y.imag, gsl_poly_complex_eval ({0.3}, 0.75 + 1.2i)"); } { gsl_complex x, y; double c[4] = {2.1, -1.34, 0.76, 0.45}; GSL_SET_REAL (&x, 0.49); GSL_SET_IMAG (&x, 0.95); y = gsl_poly_complex_eval (c, 4, x); gsl_test_rel (GSL_REAL (y), 0.3959143, eps, "y.real, gsl_poly_complex_eval ({2.1, -1.34, 0.76, 0.45}, 0.49 + 0.95i)"); gsl_test_rel (GSL_IMAG (y), -0.6433305, eps, "y.imag, gsl_poly_complex_eval ({2.1, -1.34, 0.76, 0.45}, 0.49 + 0.95i)"); } { gsl_complex x, y; gsl_complex c[1]; GSL_SET_REAL (&c[0], 0.674); GSL_SET_IMAG (&c[0], -1.423); GSL_SET_REAL (&x, -1.44); GSL_SET_IMAG (&x, 9.55); y = gsl_complex_poly_complex_eval (c, 1, x); gsl_test_rel (GSL_REAL (y), 0.674, eps, "y.real, gsl_complex_poly_complex_eval ({0.674 - 1.423i}, -1.44 + 9.55i)"); gsl_test_rel (GSL_IMAG (y), -1.423, eps, "y.imag, gsl_complex_poly_complex_eval ({0.674 - 1.423i}, -1.44 + 9.55i)"); } { gsl_complex x, y; gsl_complex c[4]; GSL_SET_REAL (&c[0], -2.31); GSL_SET_IMAG (&c[0], 0.44); GSL_SET_REAL (&c[1], 4.21); GSL_SET_IMAG (&c[1], -3.19); GSL_SET_REAL (&c[2], 0.93); GSL_SET_IMAG (&c[2], 1.04); GSL_SET_REAL (&c[3], -0.42); GSL_SET_IMAG (&c[3], 0.68); GSL_SET_REAL (&x, 0.49); GSL_SET_IMAG (&x, 0.95); y = gsl_complex_poly_complex_eval (c, 4, x); gsl_test_rel (GSL_REAL (y), 1.82462012, eps, "y.real, gsl_complex_poly_complex_eval ({-2.31 + 0.44i, 4.21 - 3.19i, 0.93 + 1.04i, -0.42 + 0.68i}, 0.49 + 0.95i)"); gsl_test_rel (GSL_IMAG (y), 2.30389412, eps, "y.imag, gsl_complex_poly_complex_eval ({-2.31 + 0.44i, 4.21 - 3.19i, 0.93 + 1.04i, -0.42 + 0.68i}, 0.49 + 0.95i)"); } /* 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"); } { /* 15-th order polynomial y = (x + 1) * (x^10 + x^9 + 2 * x^7 + 4 * x^2 + 4 * x + 8) * (x - 1)^2 * (x - 2)^2 Problem reported by Munagala Ramanath (bug #39055) */ double a[16] = { 32, -48, -8, 28, -8, 16, -16, 12, -16, 6, 10, -17, 10, 2, -4, 1 }; double z[16*2]; double expected[16*2] = { -1.6078107423472359, 0.00000000000000000, -1.3066982484920768, 0.00000000000000000, -1.0000000000000000, 0.00000000000000000, -0.65893856175240950, -0.83459757287426684, -0.65893856175240950, 0.83459757287426684, -0.070891117403341281, -1.1359249087587791, -0.070891117403341281, 1.1359249087587791, 0.57284747839410854, -1.1987808988289705, 0.57284747839410854, 1.1987808988289705, 1.0000000000000000, 0.00000000000000000, 1.0000000000000000, 0.00000000000000000, 1.1142366961812986, -0.48083981203389980, 1.1142366961812986, 0.48083981203389980, 2.0000000000000000, 0.00000000000000000, 2.0000000000000000, 0.00000000000000000 }; int i; gsl_poly_complex_workspace *w = gsl_poly_complex_workspace_alloc (16); int status = gsl_poly_complex_solve (a, 16, w, z); gsl_poly_complex_workspace_free (w); gsl_test (status, "gsl_poly_complex_solve, 15th-order polynomial"); gsl_heapsort(z, 15, 2 * sizeof(double), (gsl_comparison_fn_t) &cmp_cplx); for (i = 0; i<15; i++) { gsl_test_rel (z[2*i], expected[2*i], 1e-7, "z%d.real, 15th-order polynomial", i); gsl_test_rel (z[2*i+1], expected[2*i+1], 1e-7, "z%d.imag, 15th-order polynomial", i); } } { 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); } } { size_t i; double xa[3] = { 1.3, 1.6, 1.9 }; double ya[3] = { 0.6200860, 0.4554022, 0.2818186 }; double dya[3] = { -0.5220232, -0.5698959, -0.5811571 }; double dd_expected[6] = { 6.200860000000e-01, -5.220232000000e-01, -8.974266666667e-02, 6.636555555556e-02, 2.666666666662e-03, -2.774691357989e-03 }; double dd[6], za[6], coeff[6], work[6]; gsl_poly_dd_hermite_init(dd, za, xa, ya, dya, 3); for (i = 0; i < 6; i++) { gsl_test_rel (dd[i], dd_expected[i], 1e-10, "hermite divided difference dd[%d]", i); } for (i = 0; i < 3; i++) { double y = gsl_poly_dd_eval(dd, za, 6, xa[i]); gsl_test_rel (y, ya[i], 1e-10, "hermite divided difference y[%d]", i); } for (i = 0; i < 3; i++) { gsl_poly_dd_taylor(coeff, xa[i], dd, za, 6, work); gsl_test_rel (coeff[1], dya[i], 1e-10, "hermite divided difference dy/dx[%d]", i); } } { double c[6] = { +1.0, -2.0, +3.0, -4.0, +5.0, -6.0 }; double dc[6]; double x; x = -0.5; gsl_poly_eval_derivs(c, 6, x, dc, 6); gsl_test_rel (dc[0], c[0] + c[1]*x + c[2]*x*x + c[3]*x*x*x + c[4]*x*x*x*x + c[5]*x*x*x*x*x , eps, "gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6}, 3.75)"); gsl_test_rel (dc[1], c[1] + 2.0*c[2]*x + 3.0*c[3]*x*x + 4.0*c[4]*x*x*x + 5.0*c[5]*x*x*x*x , eps, "gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6} deriv 1, -12.375)"); gsl_test_rel (dc[2], 2.0*c[2] + 3.0*2.0*c[3]*x + 4.0*3.0*c[4]*x*x + 5.0*4.0*c[5]*x*x*x , eps, "gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6} deriv 2, +48.0)"); gsl_test_rel (dc[3], 3.0*2.0*c[3] + 4.0*3.0*2.0*c[4]*x + 5.0*4.0*3.0*c[5]*x*x , eps,"gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6} deriv 3, -174.0)"); gsl_test_rel (dc[4], 4.0*3.0*2.0*c[4] + 5.0*4.0*3.0*2.0*c[5]*x, eps, "gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6} deriv 4, +480.0)"); gsl_test_rel (dc[5], 5.0*4.0*3.0*2.0*c[5] , eps, "gsl_poly_eval_derivs({+1, -2, +3, -4, +5, -6} deriv 5, -720.0)"); } /* now summarize the results */ exit (gsl_test_summary ()); } gsl-doc-2.3/splinalg/0000755000175000017500000000000013022553155012572 5ustar eddeddgsl-doc-2.3/splinalg/itersolve.c0000664000175000017500000000447012616157443014771 0ustar eddedd/* itersolve.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include gsl_splinalg_itersolve * gsl_splinalg_itersolve_alloc(const gsl_splinalg_itersolve_type *T, const size_t n, const size_t m) { gsl_splinalg_itersolve *w; w = calloc(1, sizeof(gsl_splinalg_itersolve)); if (w == NULL) { GSL_ERROR_NULL("failed to allocate space for itersolve struct", GSL_ENOMEM); } w->type = T; w->normr = 0.0; w->state = w->type->alloc(n, m); if (w->state == NULL) { gsl_splinalg_itersolve_free(w); GSL_ERROR_NULL("failed to allocate space for itersolve state", GSL_ENOMEM); } return w; } /* gsl_splinalg_itersolve_alloc() */ void gsl_splinalg_itersolve_free(gsl_splinalg_itersolve *w) { RETURN_IF_NULL(w); if (w->state) w->type->free(w->state); free(w); } const char * gsl_splinalg_itersolve_name(const gsl_splinalg_itersolve *w) { return w->type->name; } int gsl_splinalg_itersolve_iterate(const gsl_spmatrix *A, const gsl_vector *b, const double tol, gsl_vector *x, gsl_splinalg_itersolve *w) { int status = w->type->iterate(A, b, tol, x, w->state); /* store current residual */ w->normr = w->type->normr(w->state); return status; } double gsl_splinalg_itersolve_normr(const gsl_splinalg_itersolve *w) { return w->normr; } gsl-doc-2.3/splinalg/Makefile.am0000664000175000017500000000107212616157443014640 0ustar eddeddnoinst_LTLIBRARIES = libgslsplinalg.la check_PROGRAMS = test pkginclude_HEADERS = gsl_splinalg.h libgslsplinalg_la_SOURCES = itersolve.c gmres.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslsplinalg.la ../spmatrix/libgslspmatrix.la ../spblas/libgslspblas.la ../test/libgsltest.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../err/libgslerr.la test_SOURCES = test.c gsl-doc-2.3/splinalg/gsl_splinalg.h0000664000175000017500000000467112616157443015443 0ustar eddedd/* gsl_splinalg.h * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_SPLINALG_H__ #define __GSL_SPLINALG_H__ #include #include #include #include #include #include #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 /* iteration solver type */ typedef struct { const char *name; void * (*alloc) (const size_t n, const size_t m); int (*iterate) (const gsl_spmatrix *A, const gsl_vector *b, const double tol, gsl_vector *x, void *); double (*normr)(const void *); void (*free) (void *); } gsl_splinalg_itersolve_type; typedef struct { const gsl_splinalg_itersolve_type * type; double normr; /* current residual norm || b - A x || */ void * state; } gsl_splinalg_itersolve; /* available types */ GSL_VAR const gsl_splinalg_itersolve_type * gsl_splinalg_itersolve_gmres; /* * Prototypes */ gsl_splinalg_itersolve * gsl_splinalg_itersolve_alloc(const gsl_splinalg_itersolve_type *T, const size_t n, const size_t m); void gsl_splinalg_itersolve_free(gsl_splinalg_itersolve *w); const char *gsl_splinalg_itersolve_name(const gsl_splinalg_itersolve *w); int gsl_splinalg_itersolve_iterate(const gsl_spmatrix *A, const gsl_vector *b, const double tol, gsl_vector *x, gsl_splinalg_itersolve *w); double gsl_splinalg_itersolve_normr(const gsl_splinalg_itersolve *w); __END_DECLS #endif /* __GSL_SPLINALG_H__ */ gsl-doc-2.3/splinalg/Makefile.in0000644000175000017500000010435313022372407014644 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = splinalg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsplinalg_la_LIBADD = am_libgslsplinalg_la_OBJECTS = itersolve.lo gmres.lo libgslsplinalg_la_OBJECTS = $(am_libgslsplinalg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsplinalg.la ../spmatrix/libgslspmatrix.la \ ../spblas/libgslspblas.la ../test/libgsltest.la \ ../linalg/libgsllinalg.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la \ ../err/libgslerr.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsplinalg_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsplinalg_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsplinalg.la pkginclude_HEADERS = gsl_splinalg.h libgslsplinalg_la_SOURCES = itersolve.c gmres.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslsplinalg.la ../spmatrix/libgslspmatrix.la ../spblas/libgslspblas.la ../test/libgsltest.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../err/libgslerr.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu splinalg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu splinalg/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsplinalg.la: $(libgslsplinalg_la_OBJECTS) $(libgslsplinalg_la_DEPENDENCIES) $(EXTRA_libgslsplinalg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsplinalg_la_OBJECTS) $(libgslsplinalg_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmres.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itersolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/splinalg/gmres.c0000664000175000017500000003123212616157443014066 0ustar eddedd/* gmres.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* * The code in this module is based on the Householder GMRES * algorithm described in * * [1] H. F. Walker, Implementation of the GMRES method using * Householder transformations, SIAM J. Sci. Stat. Comput. * 9(1), 1988. * * [2] Y. Saad, Iterative methods for sparse linear systems, * 2nd edition, SIAM, 2003. */ typedef struct { size_t n; /* size of linear system */ size_t m; /* dimension of Krylov subspace K_m */ gsl_vector *r; /* residual vector r = b - A*x */ gsl_matrix *H; /* Hessenberg matrix n-by-(m+1) */ gsl_vector *tau; /* householder scalars */ gsl_vector *y; /* least squares rhs and solution vector */ double *c; /* Givens rotations */ double *s; double normr; /* residual norm ||r|| */ } gmres_state_t; static void gmres_free(void *vstate); static int gmres_iterate(const gsl_spmatrix *A, const gsl_vector *b, const double tol, gsl_vector *x, void *vstate); /* gmres_alloc() Allocate a GMRES workspace for solving an n-by-n system A x = b Inputs: n - size of system krylov_m - size of Krylov subspace (ie: number of inner iterations) if this parameter is 0, the value GSL_MIN(n,10) is used Return: pointer to workspace */ static void * gmres_alloc(const size_t n, const size_t m) { gmres_state_t *state; if (n == 0) { GSL_ERROR_NULL("matrix dimension n must be a positive integer", GSL_EINVAL); } state = calloc(1, sizeof(gmres_state_t)); if (!state) { GSL_ERROR_NULL("failed to allocate gmres state", GSL_ENOMEM); } state->n = n; /* compute size of Krylov subspace */ if (m == 0) state->m = GSL_MIN(n, 10); else state->m = GSL_MIN(n, m); state->r = gsl_vector_alloc(n); if (!state->r) { gmres_free(state); GSL_ERROR_NULL("failed to allocate r vector", GSL_ENOMEM); } state->H = gsl_matrix_alloc(n, state->m + 1); if (!state->H) { gmres_free(state); GSL_ERROR_NULL("failed to allocate H matrix", GSL_ENOMEM); } state->tau = gsl_vector_alloc(state->m + 1); if (!state->tau) { gmres_free(state); GSL_ERROR_NULL("failed to allocate tau vector", GSL_ENOMEM); } state->y = gsl_vector_alloc(state->m + 1); if (!state->y) { gmres_free(state); GSL_ERROR_NULL("failed to allocate y vector", GSL_ENOMEM); } state->c = malloc(state->m * sizeof(double)); state->s = malloc(state->m * sizeof(double)); if (!state->c || !state->s) { gmres_free(state); GSL_ERROR_NULL("failed to allocate Givens vectors", GSL_ENOMEM); } state->normr = 0.0; return state; } /* gmres_alloc() */ static void gmres_free(void *vstate) { gmres_state_t *state = (gmres_state_t *) vstate; if (state->r) gsl_vector_free(state->r); if (state->H) gsl_matrix_free(state->H); if (state->tau) gsl_vector_free(state->tau); if (state->y) gsl_vector_free(state->y); if (state->c) free(state->c); if (state->s) free(state->s); free(state); } /* gmres_free() */ /* gmres_iterate() Solve A*x = b using GMRES algorithm Inputs: A - sparse square matrix b - right hand side vector tol - stopping tolerance (see below) x - (input/output) on input, initial estimate x_0; on output, solution vector work - workspace Return: GSL_SUCCESS if converged to solution (solution stored in x). In this case the following will be true: ||b - A*x|| <= tol * ||b|| GSL_CONTINUE if not yet converged; in this case x contains the most recent solution vector and calling this function more times with the input x could result in convergence (ie: restarted GMRES) Notes: 1) Based on algorithm 2.2 of (Walker, 1998 [1]) and algorithm 6.10 of (Saad, 2003 [2]) 2) On output, work->normr contains ||b - A*x|| */ static int gmres_iterate(const gsl_spmatrix *A, const gsl_vector *b, const double tol, gsl_vector *x, void *vstate) { const size_t N = A->size1; gmres_state_t *state = (gmres_state_t *) vstate; if (N != A->size2) { GSL_ERROR("matrix must be square", GSL_ENOTSQR); } else if (N != b->size) { GSL_ERROR("matrix does not match right hand side", GSL_EBADLEN); } else if (N != x->size) { GSL_ERROR("matrix does not match solution vector", GSL_EBADLEN); } else if (N != state->n) { GSL_ERROR("matrix does not match workspace", GSL_EBADLEN); } else { int status = GSL_SUCCESS; const size_t maxit = state->m; const double normb = gsl_blas_dnrm2(b); /* ||b|| */ const double reltol = tol * normb; /* tol*||b|| */ double normr; /* ||r|| */ size_t m, k; double tau; /* householder scalar */ gsl_matrix *H = state->H; /* Hessenberg matrix */ gsl_vector *r = state->r; /* residual vector */ gsl_vector *w = state->y; /* least squares RHS */ gsl_matrix_view Rm; /* R_m = H(1:m,2:m+1) */ gsl_vector_view ym; /* y(1:m) */ gsl_vector_view h0 = gsl_matrix_column(H, 0); /* * The Hessenberg matrix will have the following structure: * * H = [ ||r_0|| | v_1 v_2 ... v_m ] * [ u_1 | u_2 u_3 ... u_{m+1} ] * * where v_j are the orthonormal vectors spanning the Krylov * subpsace of length j + 1 and u_{j+1} are the householder * vectors of length n - j - 1. * In fact, u_{j+1} has length n - j since u_{j+1}[0] = 1, * but this 1 is not stored. */ gsl_matrix_set_zero(H); /* Step 1a: compute r = b - A*x_0 */ gsl_vector_memcpy(r, b); gsl_spblas_dgemv(CblasNoTrans, -1.0, A, x, 1.0, r); /* Step 1b */ gsl_vector_memcpy(&h0.vector, r); tau = gsl_linalg_householder_transform(&h0.vector); /* store tau_1 */ gsl_vector_set(state->tau, 0, tau); /* initialize w (stored in state->y) */ gsl_vector_set_zero(w); gsl_vector_set(w, 0, gsl_vector_get(&h0.vector, 0)); for (m = 1; m <= maxit; ++m) { size_t j = m - 1; /* C indexing */ double c, s; /* Givens rotation */ /* v_m */ gsl_vector_view vm = gsl_matrix_column(H, m); /* v_m(m:end) */ gsl_vector_view vv = gsl_vector_subvector(&vm.vector, j, N - j); /* householder vector u_m for projection P_m */ gsl_vector_view um = gsl_matrix_subcolumn(H, j, j, N - j); /* Step 2a: form v_m = P_m e_m = e_m - tau_m w_m */ gsl_vector_set_zero(&vm.vector); gsl_vector_memcpy(&vv.vector, &um.vector); tau = gsl_vector_get(state->tau, j); /* tau_m */ gsl_vector_scale(&vv.vector, -tau); gsl_vector_set(&vv.vector, 0, 1.0 - tau); /* Step 2a: v_m <- P_1 P_2 ... P_{m-1} v_m */ for (k = j; k > 0 && k--; ) { gsl_vector_view uk = gsl_matrix_subcolumn(H, k, k, N - k); gsl_vector_view vk = gsl_vector_subvector(&vm.vector, k, N - k); tau = gsl_vector_get(state->tau, k); gsl_linalg_householder_hv(tau, &uk.vector, &vk.vector); } /* Step 2a: v_m <- A*v_m */ gsl_spblas_dgemv(CblasNoTrans, 1.0, A, &vm.vector, 0.0, r); gsl_vector_memcpy(&vm.vector, r); /* Step 2a: v_m <- P_m ... P_1 v_m */ for (k = 0; k <= j; ++k) { gsl_vector_view uk = gsl_matrix_subcolumn(H, k, k, N - k); gsl_vector_view vk = gsl_vector_subvector(&vm.vector, k, N - k); tau = gsl_vector_get(state->tau, k); gsl_linalg_householder_hv(tau, &uk.vector, &vk.vector); } /* Steps 2c,2d: find P_{m+1} and set v_m <- P_{m+1} v_m */ if (m < N) { /* householder vector u_{m+1} for projection P_{m+1} */ gsl_vector_view ump1 = gsl_matrix_subcolumn(H, m, m, N - m); tau = gsl_linalg_householder_transform(&ump1.vector); gsl_vector_set(state->tau, j + 1, tau); } /* Step 2e: v_m <- J_{m-1} ... J_1 v_m */ for (k = 0; k < j; ++k) { gsl_linalg_givens_gv(&vm.vector, k, k + 1, state->c[k], state->s[k]); } if (m < N) { /* Step 2g: find givens rotation J_m for v_m(m:m+1) */ gsl_linalg_givens(gsl_vector_get(&vm.vector, j), gsl_vector_get(&vm.vector, j + 1), &c, &s); /* store givens rotation for later use */ state->c[j] = c; state->s[j] = s; /* Step 2h: v_m <- J_m v_m */ gsl_linalg_givens_gv(&vm.vector, j, j + 1, c, s); /* Step 2h: w <- J_m w */ gsl_linalg_givens_gv(w, j, j + 1, c, s); } /* * Step 2i: R_m = [ R_{m-1}, v_m ] - already taken care * of due to our memory storage scheme */ /* Step 2j: check residual w_{m+1} for convergence */ normr = fabs(gsl_vector_get(w, j + 1)); if (normr <= reltol) { /* * method has converged, break out of loop to compute * update to solution vector x */ break; } } /* * At this point, we have either converged to a solution or * completed all maxit iterations. In either case, compute * an update to the solution vector x and test again for * convergence. */ /* rewind m if we exceeded maxit iterations */ if (m > maxit) m--; /* Step 3a: solve triangular system R_m y_m = w, in place */ Rm = gsl_matrix_submatrix(H, 0, 1, m, m); ym = gsl_vector_subvector(w, 0, m); gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &Rm.matrix, &ym.vector); /* * Step 3b: update solution vector x; the loop below * uses a different but equivalent formulation from * Saad, algorithm 6.10, step 14; store Krylov projection * V_m y_m in 'r' */ gsl_vector_set_zero(r); for (k = m; k > 0 && k--; ) { double ymk = gsl_vector_get(&ym.vector, k); gsl_vector_view uk = gsl_matrix_subcolumn(H, k, k, N - k); gsl_vector_view rk = gsl_vector_subvector(r, k, N - k); /* r <- n_k e_k + r */ gsl_vector_set(r, k, gsl_vector_get(r, k) + ymk); /* r <- P_k r */ tau = gsl_vector_get(state->tau, k); gsl_linalg_householder_hv(tau, &uk.vector, &rk.vector); } /* x <- x + V_m y_m */ gsl_vector_add(x, r); /* compute new residual r = b - A*x */ gsl_vector_memcpy(r, b); gsl_spblas_dgemv(CblasNoTrans, -1.0, A, x, 1.0, r); normr = gsl_blas_dnrm2(r); if (normr <= reltol) status = GSL_SUCCESS; /* converged */ else status = GSL_CONTINUE; /* not yet converged */ /* store residual norm */ state->normr = normr; return status; } } /* gmres_iterate() */ static double gmres_normr(const void *vstate) { const gmres_state_t *state = (const gmres_state_t *) vstate; return state->normr; } /* gmres_normr() */ static const gsl_splinalg_itersolve_type gmres_type = { "gmres", &gmres_alloc, &gmres_iterate, &gmres_normr, &gmres_free }; const gsl_splinalg_itersolve_type * gsl_splinalg_itersolve_gmres = &gmres_type; gsl-doc-2.3/splinalg/test.c0000664000175000017500000002300212616157443013724 0ustar eddedd/* test.c * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* create_random_sparse() Create a random sparse matrix with approximately M*N*density non-zero entries Inputs: M - number of rows N - number of columns density - sparse density \in [0,1] 0 = no non-zero entries 1 = all m*n entries are filled r - random number generator Return: pointer to sparse matrix in triplet format (must be freed by caller) Notes: 1) non-zero matrix entries are uniformly distributed in [0,1] */ static gsl_spmatrix * create_random_sparse(const size_t M, const size_t N, const double density, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); gsl_spmatrix *m = gsl_spmatrix_alloc_nzmax(M, N, nnzwanted, GSL_SPMATRIX_TRIPLET); size_t i; /* set diagonal entries to try to ensure non-singularity */ for (i = 0; i < GSL_MIN(M, N); ++i) { double x = gsl_rng_uniform(r); gsl_spmatrix_set(m, i, i, x); } while (gsl_spmatrix_nnz(m) < nnzwanted) { /* generate a random row and column */ size_t i = gsl_rng_uniform(r) * M; size_t j = gsl_rng_uniform(r) * N; /* generate random m_{ij} and add it */ double x = gsl_rng_uniform(r); gsl_spmatrix_set(m, i, j, x); } return m; } /* create_random_sparse() */ static void create_random_vector(gsl_vector *v, const gsl_rng *r) { size_t i; for (i = 0; i < v->size; ++i) { double x = gsl_rng_uniform(r); gsl_vector_set(v, i, x); } } /* create_random_vector() */ /* test_poisson() Solve u''(x) = -pi^2 sin(pi*x), u(x) = sin(pi*x) epsrel is the relative error threshold with the exact solution */ static void test_poisson(const size_t N, const double epsrel, const int compress) { const gsl_splinalg_itersolve_type *T = gsl_splinalg_itersolve_gmres; const size_t n = N - 2; /* subtract 2 to exclude boundaries */ const double h = 1.0 / (N - 1.0); /* grid spacing */ const double tol = 1.0e-9; const size_t max_iter = 10; size_t iter = 0; gsl_spmatrix *A = gsl_spmatrix_alloc(n ,n); /* triplet format */ gsl_spmatrix *B; gsl_vector *b = gsl_vector_alloc(n); /* right hand side vector */ gsl_vector *u = gsl_vector_calloc(n); /* solution vector, u0 = 0 */ gsl_splinalg_itersolve *w = gsl_splinalg_itersolve_alloc(T, n, 0); const char *desc = gsl_splinalg_itersolve_name(w); size_t i; int status; /* construct the sparse matrix for the finite difference equation */ /* first row of matrix */ gsl_spmatrix_set(A, 0, 0, -2.0); gsl_spmatrix_set(A, 0, 1, 1.0); /* loop over interior grid points */ for (i = 1; i < n - 1; ++i) { gsl_spmatrix_set(A, i, i + 1, 1.0); gsl_spmatrix_set(A, i, i, -2.0); gsl_spmatrix_set(A, i, i - 1, 1.0); } /* last row of matrix */ gsl_spmatrix_set(A, n - 1, n - 1, -2.0); gsl_spmatrix_set(A, n - 1, n - 2, 1.0); /* scale by h^2 */ gsl_spmatrix_scale(A, 1.0 / (h * h)); /* construct right hand side vector */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double bi = -M_PI * M_PI * sin(M_PI * xi); gsl_vector_set(b, i, bi); } if (compress) B = gsl_spmatrix_compcol(A); else B = A; /* solve the system */ do { status = gsl_splinalg_itersolve_iterate(B, b, tol, u, w); } while (status == GSL_CONTINUE && ++iter < max_iter); gsl_test(status, "%s poisson status s=%d N=%zu", desc, status, N); /* check solution against analytic */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double u_gsl = gsl_vector_get(u, i); double u_exact = sin(M_PI * xi); gsl_test_rel(u_gsl, u_exact, epsrel, "%s poisson N=%zu i=%zu", desc, N, i); } /* check that the residual satisfies ||r|| <= tol*||b|| */ { gsl_vector *r = gsl_vector_alloc(n); double normr, normb; gsl_vector_memcpy(r, b); gsl_spblas_dgemv(CblasNoTrans, -1.0, A, u, 1.0, r); normr = gsl_blas_dnrm2(r); normb = gsl_blas_dnrm2(b); status = (normr <= tol*normb) != 1; gsl_test(status, "%s poisson residual N=%zu normr=%.12e normb=%.12e", desc, N, normr, normb); gsl_vector_free(r); } gsl_splinalg_itersolve_free(w); gsl_spmatrix_free(A); gsl_vector_free(b); gsl_vector_free(u); if (compress) gsl_spmatrix_free(B); } /* test_poisson() */ /* test_toeplitz() Test Toeplitz matrix T = A + B + C where: A = diag(a,-1) B = diag(b) C = diag(c,1) rhs = ones(n,1) */ static void test_toeplitz(const size_t N, const double a, const double b, const double c) { int status; const double tol = 1.0e-10; const size_t max_iter = 10; const gsl_splinalg_itersolve_type *T = gsl_splinalg_itersolve_gmres; const char *desc; gsl_spmatrix *A; gsl_vector *rhs, *x; gsl_splinalg_itersolve *w; size_t i, iter = 0; if (N <= 1) return; A = gsl_spmatrix_alloc(N ,N); rhs = gsl_vector_alloc(N); x = gsl_vector_calloc(N); w = gsl_splinalg_itersolve_alloc(T, N, 0); desc = gsl_splinalg_itersolve_name(w); /* first row */ gsl_spmatrix_set(A, 0, 0, b); gsl_spmatrix_set(A, 0, 1, c); /* interior rows */ for (i = 1; i < N - 1; ++i) { gsl_spmatrix_set(A, i, i - 1, a); gsl_spmatrix_set(A, i, i, b); gsl_spmatrix_set(A, i, i + 1, c); } /* last row */ gsl_spmatrix_set(A, N - 1, N - 2, a); gsl_spmatrix_set(A, N - 1, N - 1, b); /* set rhs vector */ gsl_vector_set_all(rhs, 1.0); /* solve the system */ do { status = gsl_splinalg_itersolve_iterate(A, rhs, tol, x, w); } while (status == GSL_CONTINUE && ++iter < max_iter); gsl_test(status, "%s toeplitz status s=%d N=%zu a=%f b=%f c=%f", desc, status, N, a, b, c); /* check that the residual satisfies ||r|| <= tol*||b|| */ { gsl_vector *r = gsl_vector_alloc(N); double normr, normb; gsl_vector_memcpy(r, rhs); gsl_spblas_dgemv(CblasNoTrans, -1.0, A, x, 1.0, r); normr = gsl_blas_dnrm2(r); normb = gsl_blas_dnrm2(rhs); status = (normr <= tol*normb) != 1; gsl_test(status, "%s toeplitz residual N=%zu a=%f b=%f c=%f normr=%.12e normb=%.12e", desc, N, a, b, c, normr, normb); gsl_vector_free(r); } gsl_vector_free(x); gsl_vector_free(rhs); gsl_spmatrix_free(A); gsl_splinalg_itersolve_free(w); } /* test_toeplitz() */ static void test_random(const size_t N, const gsl_rng *r, const int compress) { const gsl_splinalg_itersolve_type *T = gsl_splinalg_itersolve_gmres; const double tol = 1.0e-8; int status; gsl_spmatrix *A = create_random_sparse(N, N, 0.3, r); gsl_spmatrix *B; gsl_vector *b = gsl_vector_alloc(N); gsl_vector *x = gsl_vector_calloc(N); /* these random matrices require all N iterations to converge */ gsl_splinalg_itersolve *w = gsl_splinalg_itersolve_alloc(T, N, N); const char *desc = gsl_splinalg_itersolve_name(w); create_random_vector(b, r); if (compress) B = gsl_spmatrix_compcol(A); else B = A; status = gsl_splinalg_itersolve_iterate(B, b, tol, x, w); gsl_test(status, "%s random status s=%d N=%zu", desc, status, N); /* check that the residual satisfies ||r|| <= tol*||b|| */ { gsl_vector *res = gsl_vector_alloc(N); double normr, normb; gsl_vector_memcpy(res, b); gsl_spblas_dgemv(CblasNoTrans, -1.0, A, x, 1.0, res); normr = gsl_blas_dnrm2(res); normb = gsl_blas_dnrm2(b); status = (normr <= tol*normb) != 1; gsl_test(status, "%s random residual N=%zu normr=%.12e normb=%.12e", desc, N, normr, normb); gsl_vector_free(res); } gsl_spmatrix_free(A); gsl_vector_free(b); gsl_vector_free(x); gsl_splinalg_itersolve_free(w); if (compress) gsl_spmatrix_free(B); } /* test_random() */ int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); size_t n; test_poisson(7, 1.0e-1, 0); test_poisson(7, 1.0e-1, 1); test_poisson(543, 1.0e-5, 0); test_poisson(543, 1.0e-5, 1); test_poisson(1000, 1.0e-6, 0); test_poisson(1000, 1.0e-6, 1); test_poisson(5000, 1.0e-7, 0); test_poisson(5000, 1.0e-7, 1); test_toeplitz(15, 0.01, 1.0, 0.01); test_toeplitz(15, 1.0, 1.0, 0.01); test_toeplitz(50, 1.0, 2.0, 0.01); test_toeplitz(1000, 0.5, 1.0, 0.01); for (n = 1; n <= 100; ++n) { test_random(n, r, 0); test_random(n, r, 1); } gsl_rng_free(r); exit (gsl_test_summary()); } /* main() */ gsl-doc-2.3/linalg/0000755000175000017500000000000013022553153012225 5ustar eddeddgsl-doc-2.3/linalg/condest.c0000644000175000017500000002017712757057335014056 0ustar eddedd/* linalg/condest.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module contains routines for estimating the condition number * of matrices in the 1-norm. The algorithm is based on the paper, * * [1] N. J. Higham, "FORTRAN codes for estimating the one-norm of * a real or complex matrix, with applications to condition estimation", * ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ static double condest_tri_norm1(CBLAS_UPLO_t Uplo, const gsl_matrix * A); static int condest_tri_rcond(CBLAS_UPLO_t Uplo, const gsl_matrix * A, double * rcond, gsl_vector * work); static int condest_same_sign(const gsl_vector * x, const gsl_vector * y); static int condest_invtriu(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); static int condest_invtril(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); /* gsl_linalg_tri_upper_rcond() Estimate reciprocal condition number of upper triangular matrix Inputs: A - upper triangular matrix, N-by-N rcond - (output) reciprocal condition number estimate work - workspace, length 3*N Return: success/error */ int gsl_linalg_tri_upper_rcond(const gsl_matrix * A, double * rcond, gsl_vector * work) { int status = condest_tri_rcond(CblasUpper, A, rcond, work); return status; } /* gsl_linalg_tri_lower_rcond() Estimate reciprocal condition number of lower triangular matrix Inputs: A - lower triangular matrix, N-by-N rcond - (output) reciprocal condition number estimate work - workspace, length 3*N Return: success/error */ int gsl_linalg_tri_lower_rcond(const gsl_matrix * A, double * rcond, gsl_vector * work) { int status = condest_tri_rcond(CblasLower, A, rcond, work); return status; } /* gsl_linalg_invnorm1() Estimate the 1-norm of ||A^{-1}||, where A is a square N-by-N matrix Inputs: N - size of matrix Ainvx - pointer to function which calculates: x := A^{-1} x or x := A^{-t} x params - parameters to pass to Ainvx Ainvnorm - (output) estimate of ||A^{-1}||_1 work - workspace, length 3*N */ int gsl_linalg_invnorm1(const size_t N, int (* Ainvx)(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params), void * params, double * Ainvnorm, gsl_vector * work) { if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { const size_t maxit = 5; gsl_vector_view x = gsl_vector_subvector(work, 0, N); gsl_vector_view v = gsl_vector_subvector(work, N, N); gsl_vector_view xi = gsl_vector_subvector(work, 2*N, N); double gamma, gamma_old, temp; size_t i, k; for (i = 0; i < N; ++i) gsl_vector_set(&x.vector, i, 1.0 / (double) N); /* compute v = A^{-1} x */ gsl_vector_memcpy(&v.vector, &x.vector); (*Ainvx)(CblasNoTrans, &v.vector, params); /* gamma = ||v||_1 */ gamma = gsl_blas_dasum(&v.vector); /* xi = sign(v) */ for (i = 0; i < N; ++i) { double vi = gsl_vector_get(&v.vector, i); gsl_vector_set(&xi.vector, i, GSL_SIGN(vi)); } /* x = A^{-t} xi */ gsl_vector_memcpy(&x.vector, &xi.vector); (*Ainvx)(CblasTrans, &x.vector, params); for (k = 0; k < maxit; ++k) { size_t j = (size_t) gsl_blas_idamax(&x.vector); /* v := A^{-1} e_j */ gsl_vector_set_zero(&v.vector); gsl_vector_set(&v.vector, j, 1.0); (*Ainvx)(CblasNoTrans, &v.vector, params); gamma_old = gamma; gamma = gsl_blas_dasum(&v.vector); /* check for repeated sign vector (algorithm has converged) */ if (condest_same_sign(&v.vector, &xi.vector) || (gamma < gamma_old)) break; /* xi = sign(v) */ for (i = 0; i < N; ++i) { double vi = gsl_vector_get(&v.vector, i); gsl_vector_set(&xi.vector, i, GSL_SIGN(vi)); } /* x = A^{-t} sign(v) */ gsl_vector_memcpy(&x.vector, &xi.vector); (*Ainvx)(CblasTrans, &x.vector, params); } temp = 1.0; /* (-1)^i */ for (i = 0; i < N; ++i) { double term = 1.0 + (double) i / (N - 1.0); gsl_vector_set(&x.vector, i, temp * term); temp = -temp; } /* x := A^{-1} x */ (*Ainvx)(CblasNoTrans, &x.vector, params); temp = 2.0 * gsl_blas_dasum(&x.vector) / (3.0 * N); if (temp > gamma) { gsl_vector_memcpy(&v.vector, &x.vector); gamma = temp; } *Ainvnorm = gamma; return GSL_SUCCESS; } } static int condest_tri_rcond(CBLAS_UPLO_t Uplo, const gsl_matrix * A, double * rcond, gsl_vector * work) { 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 (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; double Anorm = condest_tri_norm1(Uplo, A); /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ *rcond = 0.0; /* don't continue if matrix is singular */ if (Anorm == 0.0) return GSL_SUCCESS; /* estimate ||A^{-1}||_1 */ if (Uplo == CblasUpper) status = gsl_linalg_invnorm1(N, condest_invtriu, (void *) A, &Ainvnorm, work); else status = gsl_linalg_invnorm1(N, condest_invtril, (void *) A, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* calculate 1 norm of triangular matrix */ static double condest_tri_norm1(CBLAS_UPLO_t Uplo, const gsl_matrix * A) { const size_t N = A->size2; double max = 0.0; size_t i, j; if (Uplo == CblasUpper) { for (j = 0; j < N; ++j) { double sum = 0.0; for (i = 0; i <= j; ++i) { double Aij = gsl_matrix_get(A, i, j); sum += fabs(Aij); } max = GSL_MAX(max, sum); } } else { for (j = 0; j < N; ++j) { double sum = 0.0; for (i = j; i < N; ++i) { double Aij = gsl_matrix_get(A, i, j); sum += fabs(Aij); } max = GSL_MAX(max, sum); } } return max; } /* return 1 if sign(x) = sign(y), 0 otherwise */ static int condest_same_sign(const gsl_vector * x, const gsl_vector * y) { const size_t n = x->size; size_t i; for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(y, i); if (GSL_SIGN(xi) != GSL_SIGN(yi)) return 0; } return 1; } /* x := A^{-1} x, A upper triangular */ static int condest_invtriu(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { gsl_matrix * A = (gsl_matrix *) params; return gsl_blas_dtrsv(CblasUpper, TransA, CblasNonUnit, A, x); } /* x := A^{-1} x, A lower triangular */ static int condest_invtril(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { gsl_matrix * A = (gsl_matrix *) params; return gsl_blas_dtrsv(CblasLower, TransA, CblasNonUnit, A, x); } gsl-doc-2.3/linalg/apply_givens.c0000664000175000017500000000675512616157443015122 0ustar eddedd/* linalg/apply_givens.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 } gsl-doc-2.3/linalg/cholesky_common.c0000644000175000017500000000451412752713256015601 0ustar eddedd/* linalg/cholesky_common.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 SWAP(a,b) do { double tmp = b ; b = a ; a = tmp ; } while(0) /* cholesky_swap_rowcol() Swap rows and columns i and j of symmetric matrix A, updating only the lower triangle Inputs: A - symmetric matrix A, stored in lower triangle i - index i j - index j Return: success/error */ static int cholesky_swap_rowcol(gsl_matrix * A, const size_t i, const size_t j) { if (i != j) { const size_t N = A->size1; double *Aii, *Ajj; size_t ii, jj, k; /* organize so that ii < jj */ if (i < j) { ii = i; jj = j; } else { ii = j; jj = i; } /* swap subrows A(i,1:i-1) with A(j,1:i-1) */ for (k = 0; k < ii; ++k) { double *Aik = gsl_matrix_ptr(A, ii, k); double *Ajk = gsl_matrix_ptr(A, jj, k); SWAP(*Aik, *Ajk); } /* swap subrow A(j,i+1:j-1) with subcolumn A(i+1:j-1,i) */ for (k = ii + 1; k < jj; ++k) { double *Ajk = gsl_matrix_ptr(A, jj, k); double *Aki = gsl_matrix_ptr(A, k, ii); SWAP(*Ajk, *Aki); } /* swap subcolumns A(j+1:N,i) with A(j+1:N,j) */ for (k = jj + 1; k < N; ++k) { double *Aki = gsl_matrix_ptr(A, k, ii); double *Akj = gsl_matrix_ptr(A, k, jj); SWAP(*Aki, *Akj); } /* now swap diagonal elements A(i,i) and A(j,j) */ Aii = gsl_matrix_ptr(A, ii, ii); Ajj = gsl_matrix_ptr(A, jj, jj); SWAP(*Aii, *Ajj); } return GSL_SUCCESS; } gsl-doc-2.3/linalg/balancemat.c0000664000175000017500000001157212616157443014502 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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() */ gsl-doc-2.3/linalg/mcholesky.c0000644000175000017500000001546412755634037014416 0ustar eddedd/* Modified Cholesky Decomposition * * Copyright (C) 2016 Patrick Alken * * 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 3, 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 #include #include #include #include #include #include #include #include #include "cholesky_common.c" /* * This module contains routines related to the Modified Cholesky * Decomposition, which factors a symmetric indefinite matrix A as * * P (A + E) P^T = L D L^T * * where: * P: permutation matrix * E: small, non-negative diagonal matrix * L: unit lower triangular matrix * D: strictly positive diagonal matrix * * These routines follow these works closely: * * [1] P. E. Gill, W. Murray, M. H. Wright, Practical Optimization, * Academic Press, 1981. * * [2] Dennis and Schnabel, Numerical Methods for Unconstrained Optimization * and Nonlinear Equations, SIAM, 1996 */ static size_t mcholesky_maxabs(const gsl_vector * v, double *maxabs); /* gsl_linalg_mcholesky_decomp() Perform Pivoted Modified Cholesky LDLT decomposition of a symmetric positive indefinite matrix: P (A + E) P^T = L D L^T Inputs: A - (input) symmetric, positive indefinite matrix, stored in lower triangle (output) lower triangle contains L; diagonal contains D p - (output) permutation matrix P E - (output) perturbation matrix E Return: success/error Notes: 1) Based on algorithm 4.2.2 (Outer Product LDLT with Pivoting) of Golub and Van Loan, Matrix Computations (4th ed), with modifications described in [1] and [2] 2) E can be set to NULL if not required */ int gsl_linalg_mcholesky_decomp (gsl_matrix * A, gsl_permutation * p, gsl_vector * E) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("LDLT decomposition requires square matrix", GSL_ENOTSQR); } else if (p->size != N) { GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN); } else { const double delta = GSL_DBL_EPSILON; double beta; double gamma = 0.0; double xi = 0.0; gsl_vector_view diag = gsl_matrix_diagonal(A); size_t i, j; /* save a copy of A in upper triangle (for later rcond calculation) */ gsl_matrix_transpose_tricpy('L', 0, A, A); gsl_permutation_init(p); /* compute: * gamma = max | A_{ii} | * xi = max_{i \ne j} | A_{ij} | */ for (i = 0; i < N; ++i) { double aii = gsl_matrix_get(A, i, i); gamma = GSL_MAX(gamma, fabs(aii)); for (j = 0; j < i; ++j) { double aij = gsl_matrix_get(A, i, j); xi = GSL_MAX(xi, fabs(aij)); } } /* compute: * beta = sqrt[ max { gamma, xi/nu, eps } ] * with: nu = max{ sqrt(N^2 - 1), 1 } */ if (N == 1) { beta = GSL_MAX(GSL_MAX(gamma, xi), GSL_DBL_EPSILON); } else { double nu = sqrt(N*N - 1.0); beta = GSL_MAX(GSL_MAX(gamma, xi / nu), GSL_DBL_EPSILON); } beta = sqrt(beta); for (j = 0; j < N; ++j) { double ajj, thetaj, u, alpha, alphainv; gsl_vector_view w; size_t q; /* compute q = max_idx { A_jj, ..., A_nn } */ w = gsl_vector_subvector(&diag.vector, j, N - j); q = mcholesky_maxabs(&w.vector, NULL) + j; gsl_permutation_swap(p, q, j); cholesky_swap_rowcol(A, q, j); /* theta_j = max_{j+1 <= i <= n} |A_{ij}| */ if (j < N - 1) { w = gsl_matrix_subcolumn(A, j, j + 1, N - j - 1); mcholesky_maxabs(&w.vector, &thetaj); } else { thetaj = 0.0; } u = thetaj / beta; /* compute alpha = d_j */ ajj = gsl_matrix_get(A, j, j); alpha = GSL_MAX(GSL_MAX(delta, fabs(ajj)), u * u); alphainv = 1.0 / alpha; if (j < N - 1) { /* v = A(j+1:n, j) */ gsl_vector_view v = gsl_matrix_subcolumn(A, j, j + 1, N - j - 1); /* m = A(j+1:n, j+1:n) */ gsl_matrix_view m = gsl_matrix_submatrix(A, j + 1, j + 1, N - j - 1, N - j - 1); /* m = m - v v^T / alpha */ gsl_blas_dsyr(CblasLower, -alphainv, &v.vector, &m.matrix); /* v = v / alpha */ gsl_vector_scale(&v.vector, alphainv); } if (E) gsl_vector_set(E, j, alpha - ajj); gsl_matrix_set(A, j, j, alpha); } if (E) { /* we currently have: P A P^T + E = L D L^T, permute E * so that we have: P (A + E) P^T = L D L^T */ gsl_permute_vector_inverse(p, E); } return GSL_SUCCESS; } } int gsl_linalg_mcholesky_solve(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x) { int status = gsl_linalg_pcholesky_solve(LDLT, p, b, x); return status; } int gsl_linalg_mcholesky_svx(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * x) { int status = gsl_linalg_pcholesky_svx(LDLT, p, x); return status; } int gsl_linalg_mcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * p, double * rcond, gsl_vector * work) { int status = gsl_linalg_pcholesky_rcond(LDLT, p, rcond, work); return status; } int gsl_linalg_mcholesky_invert(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_matrix * Ainv) { int status = gsl_linalg_pcholesky_invert(LDLT, p, Ainv); return status; } /* mcholesky_maxabs() Compute: val = max_i |v_i| Inputs: v - vector maxabs - (output) max abs value Return: index corresponding to max_i |v_i| */ static size_t mcholesky_maxabs(const gsl_vector * v, double *maxabs) { const size_t n = v->size; size_t i; size_t idx = 0; double max = gsl_vector_get(v, idx); for (i = 1; i < n; ++i) { double vi = gsl_vector_get(v, i); double absvi = fabs(vi); if (absvi > max) { max = absvi; idx = i; } } if (maxabs) *maxabs = max; return idx; } gsl-doc-2.3/linalg/test_cholesky.c0000644000175000017500000006077313022044642015264 0ustar eddedd/* linalg/test_cholesky.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include static int create_random_vector(gsl_vector * v, gsl_rng * r); static int create_posdef_matrix(gsl_matrix * m, gsl_rng * r); static int create_hilbert_matrix2(gsl_matrix * m); static int test_cholesky_decomp_eps(const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc); static int test_cholesky_decomp(gsl_rng * r); int test_cholesky_invert_eps(const gsl_matrix * m, const double eps, const char *desc); int test_cholesky_invert(gsl_rng * r); static int test_pcholesky_decomp_eps(const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc); static int test_pcholesky_decomp(gsl_rng * r); int test_pcholesky_solve_eps(const int scale, const gsl_matrix * m, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc); static int test_pcholesky_solve(gsl_rng * r); int test_pcholesky_invert_eps(const gsl_matrix * m, const double eps, const char *desc); int test_pcholesky_invert(gsl_rng * r); static int test_mcholesky_decomp_eps(const int posdef, const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc); /* Hilbert matrix condition numbers, as calculated by LAPACK DPOSVX */ double hilb_rcond[] = { 1.000000000000e+00, 3.703703703704e-02, 1.336898395722e-03, 3.524229074890e-05, 1.059708198754e-06, 3.439939465186e-08, 1.015027593823e-09, 2.952221630602e-11, 9.093751565191e-13, 2.828277420229e-14, 8.110242564869e-16, 2.409320075800e-17 }; static int create_random_vector(gsl_vector * v, gsl_rng * r) { const size_t N = v->size; size_t i; for (i = 0; i < N; ++i) { double vi = gsl_rng_uniform(r); gsl_vector_set(v, i, vi); } return GSL_SUCCESS; } static int create_symm_matrix(gsl_matrix * m, gsl_rng * r) { const size_t N = m->size1; size_t i, j; for (i = 0; i < N; ++i) { for (j = 0; j <= i; ++j) { double mij = gsl_rng_uniform(r); gsl_matrix_set(m, i, j, mij); } } /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy('L', 0, m, m); return GSL_SUCCESS; } static int create_posdef_matrix(gsl_matrix * m, gsl_rng * r) { const size_t N = m->size1; const double alpha = 10.0 * N; size_t i; /* The idea is to make a symmetric diagonally dominant * matrix. Make a symmetric matrix and add alpha*I to * its diagonal */ create_symm_matrix(m, r); for (i = 0; i < N; ++i) { double mii = gsl_matrix_get(m, i, i); gsl_matrix_set(m, i, i, mii + alpha); } return GSL_SUCCESS; } static int create_hilbert_matrix2(gsl_matrix * m) { const size_t N = m->size1; size_t i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { gsl_matrix_set(m, i, j, 1.0/(i+j+1.0)); } } return GSL_SUCCESS; } static int test_cholesky_decomp_eps(const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc) { int s = 0; size_t i, j, N = m->size2; gsl_matrix * V = gsl_matrix_alloc(N, N); gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_matrix * L = gsl_matrix_calloc(N, N); gsl_matrix * LT = gsl_matrix_calloc(N, N); gsl_vector * S = gsl_vector_alloc(N); gsl_matrix_memcpy(V, m); if (scale) s += gsl_linalg_cholesky_decomp2(V, S); else s += gsl_linalg_cholesky_decomp1(V); /* compute L and LT */ gsl_matrix_tricpy('L', 1, L, V); gsl_matrix_transpose_tricpy('L', 1, LT, L); if (scale) { /* L <- S^{-1} L, LT <- LT S^{-1} */ for (i = 0; i < N; ++i) { double Si = gsl_vector_get(S, i); gsl_vector_view v = gsl_matrix_row(L, i); gsl_vector_view w = gsl_matrix_column(LT, i); gsl_vector_scale(&v.vector, 1.0 / Si); gsl_vector_scale(&w.vector, 1.0 / Si); } } /* compute A = L LT */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, L, LT, 0.0, A); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { double Aij = gsl_matrix_get(A, i, j); double mij = gsl_matrix_get(m, i, j); gsl_test_rel(Aij, mij, eps, "%s: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, Aij, mij); } } if (expected_rcond > 0 && !scale) { gsl_vector *work = gsl_vector_alloc(3 * N); double rcond; gsl_linalg_cholesky_rcond(V, &rcond, work); gsl_test_rel(rcond, expected_rcond, 1.0e-6, "%s rcond: (%3lu,%3lu): %22.18g %22.18g\n", desc, N, N, rcond, expected_rcond); gsl_vector_free(work); } gsl_matrix_free(V); gsl_matrix_free(A); gsl_matrix_free(L); gsl_matrix_free(LT); gsl_vector_free(S); return s; } static int test_cholesky_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_cholesky_decomp_eps(0, m, -1.0, 10.0 * N * GSL_DBL_EPSILON, "cholesky_decomp unscaled random"); test_cholesky_decomp_eps(1, m, -1.0, 20.0 * N * GSL_DBL_EPSILON, "cholesky_decomp scaled random"); if (N <= 12) { double expected_rcond = -1.0; if (hilb_rcond[N - 1] > 1.0e-12) expected_rcond = hilb_rcond[N - 1]; create_hilbert_matrix2(m); test_cholesky_decomp_eps(0, m, expected_rcond, GSL_DBL_EPSILON, "cholesky_decomp unscaled hilbert"); test_cholesky_decomp_eps(1, m, expected_rcond, N * GSL_DBL_EPSILON, "cholesky_decomp scaled hilbert"); } gsl_matrix_free(m); } return s; } int test_cholesky_invert_eps(const gsl_matrix * m, const double eps, const char *desc) { int s = 0; size_t i, j, N = m->size1; gsl_matrix * v = gsl_matrix_alloc(N, N); gsl_matrix * c = gsl_matrix_alloc(N, N); gsl_matrix_memcpy(v, m); s += gsl_linalg_cholesky_decomp1(v); s += gsl_linalg_cholesky_invert(v); /* c = m m^{-1} */ gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, m, v, 0.0, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { double cij = gsl_matrix_get(c, i, j); double expected = (i == j) ? 1.0 : 0.0; gsl_test_rel(cij, expected, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, cij, expected); } } gsl_matrix_free(v); gsl_matrix_free(c); return s; } int test_cholesky_invert(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_cholesky_invert_eps(m, N * GSL_DBL_EPSILON, "cholesky_invert unscaled random"); if (N <= 4) { create_hilbert_matrix2(m); test_cholesky_invert_eps(m, N * 256.0 * GSL_DBL_EPSILON, "cholesky_invert unscaled hilbert"); } gsl_matrix_free(m); } return s; } static int test_mcholesky_decomp_eps(const int posdef, const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc) { int s = 0; size_t i, j, N = m->size2; gsl_matrix * LDLT = gsl_matrix_alloc(N, N); gsl_matrix * V = gsl_matrix_alloc(N, N); gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_matrix * L = gsl_matrix_alloc(N, N); gsl_matrix * LT = gsl_matrix_alloc(N, N); gsl_vector * S = gsl_vector_alloc(N); gsl_vector * E = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_vector_view D = gsl_matrix_diagonal(LDLT); gsl_matrix_memcpy(LDLT, m); s += gsl_linalg_mcholesky_decomp(LDLT, perm, E); /* check that the upper triangle of LDLT equals original matrix */ for (i = 0; i < N; ++i) { for (j = i + 1; j < N; ++j) { double mij = gsl_matrix_get(m, i, j); double aij = gsl_matrix_get(LDLT, i, j); gsl_test_rel(aij, mij, 1.0e-12, "%s upper triangle: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, aij, mij); } } if (posdef) { /* ||E|| should be 0 */ double norm = gsl_blas_dnrm2(E); s = norm != 0.0; gsl_test(s, "%s: (%zu,%zu): ||E|| = %.12e", desc, N, N, norm); /* check that D is decreasing */ s = 0; for (i = 1; i < N; ++i) { double dprev = gsl_vector_get(&D.vector, i - 1); double di = gsl_vector_get(&D.vector, i); if (di > dprev) s = 1; } gsl_test(s, "%s: (%zu,%zu): D is not decreasing", desc, N, N); } /* compute L and LT */ gsl_matrix_set_identity(L); gsl_matrix_set_identity(LT); gsl_matrix_tricpy('L', 0, L, LDLT); gsl_matrix_transpose_tricpy('L', 0, LT, L); /* compute (L sqrt(D)) and (sqrt(D) LT) */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_column(L, i); gsl_vector_view w = gsl_matrix_row(LT, i); double di = gsl_vector_get(&D.vector, i); gsl_vector_scale(&v.vector, sqrt(di)); gsl_vector_scale(&w.vector, sqrt(di)); } /* compute A = L D LT */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, L, LT, 0.0, A); /* compute V = P (S M S + E) P^T */ gsl_matrix_memcpy(V, m); D = gsl_matrix_diagonal(V); /* compute S M S */ if (scale) { gsl_linalg_cholesky_scale_apply(V, S); gsl_matrix_transpose_tricpy('L', 0, V, V); } /* compute S M S + E */ gsl_vector_add(&D.vector, E); /* compute M P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_row(V, i); gsl_permute_vector(perm, &v.vector); } /* compute P M P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_column(V, i); gsl_permute_vector(perm, &v.vector); } for (i = 0; i < N; i++) { double Ei = gsl_vector_get(E, i); for (j = 0; j < N; j++) { double Aij = gsl_matrix_get(A, i, j); /* L D L^T */ double Bij = gsl_matrix_get(V, i, j); /* P M P^T */ double Cij; /* P M P^T + E */ if (i == j) Cij = Bij + Ei*0; else Cij = Bij; gsl_test_rel(Aij, Cij, eps, "%s: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, Aij, Cij); } } if (expected_rcond > 0 && !scale) { gsl_vector *work = gsl_vector_alloc(3 * N); double rcond; gsl_linalg_mcholesky_rcond(LDLT, perm, &rcond, work); gsl_test_rel(rcond, expected_rcond, 1.0e-6, "%s rcond: (%3lu,%3lu): %22.18g %22.18g\n", desc, N, N, rcond, expected_rcond); gsl_vector_free(work); } gsl_matrix_free(LDLT); gsl_matrix_free(V); gsl_matrix_free(A); gsl_matrix_free(L); gsl_matrix_free(LT); gsl_vector_free(S); gsl_vector_free(E); gsl_permutation_free(perm); return s; } static int test_mcholesky_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_mcholesky_decomp_eps(1, 0, m, -1.0, 128.0 * N * GSL_DBL_EPSILON, "mcholesky_decomp unscaled random posdef"); create_symm_matrix(m, r); test_mcholesky_decomp_eps(0, 0, m, -1.0, 8192.0 * N * GSL_DBL_EPSILON, "mcholesky_decomp unscaled random symm"); if (N <= 8) { double expected_rcond = -1.0; if (hilb_rcond[N - 1] > 1.0e-12) expected_rcond = hilb_rcond[N - 1]; create_hilbert_matrix2(m); test_mcholesky_decomp_eps(1, 0, m, expected_rcond, N * GSL_DBL_EPSILON, "mcholesky_decomp unscaled hilbert"); } gsl_matrix_free(m); } return s; } int test_mcholesky_solve_eps(const gsl_matrix * m, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int s = 0; size_t i, N = m->size1; gsl_matrix * u = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_calloc(N); gsl_vector * S = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(u, m); s += gsl_linalg_mcholesky_decomp(u, perm, NULL); s += gsl_linalg_mcholesky_solve(u, perm, rhs, x); for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(sol, i); gsl_test_rel(xi, yi, eps, "%s: %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, xi, yi); } gsl_vector_free(x); gsl_vector_free(S); gsl_matrix_free(u); gsl_permutation_free(perm); return s; } static int test_mcholesky_solve(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); gsl_vector * rhs = gsl_vector_alloc(N); gsl_vector * sol = gsl_vector_alloc(N); create_posdef_matrix(m, r); create_random_vector(sol, r); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_mcholesky_solve_eps(m, rhs, sol, 64.0 * N * GSL_DBL_EPSILON, "mcholesky_solve random"); if (N <= 3) { create_hilbert_matrix2(m); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_mcholesky_solve_eps(m, rhs, sol, 512.0 * N * GSL_DBL_EPSILON, "mcholesky_solve hilbert"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } int test_mcholesky_invert_eps(const gsl_matrix * m, const double eps, const char *desc) { int s = 0; size_t i, j, N = m->size1; gsl_matrix * v = gsl_matrix_alloc(N, N); gsl_matrix * c = gsl_matrix_alloc(N, N); gsl_matrix * minv = gsl_matrix_alloc(N, N); gsl_vector * E = gsl_vector_alloc(N); gsl_permutation * p = gsl_permutation_alloc(N); gsl_matrix_memcpy(v, m); s += gsl_linalg_mcholesky_decomp(v, p, E); s += gsl_linalg_mcholesky_invert(v, p, minv); /* c = m m^{-1} */ gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, m, minv, 0.0, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { double cij = gsl_matrix_get(c, i, j); double expected = (i == j) ? 1.0 : 0.0; gsl_test_rel(cij, expected, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, cij, expected); } } gsl_matrix_free(v); gsl_matrix_free(c); gsl_matrix_free(minv); gsl_vector_free(E); gsl_permutation_free(p); return s; } int test_mcholesky_invert(gsl_rng * r) { int s = 0; const size_t N_max = 30; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_mcholesky_invert_eps(m, N * GSL_DBL_EPSILON, "mcholesky_invert unscaled random"); if (N <= 4) { create_hilbert_matrix2(m); test_mcholesky_invert_eps(m, 256.0 * N * GSL_DBL_EPSILON, "mcholesky_invert unscaled hilbert"); } gsl_matrix_free(m); } return s; } static int test_pcholesky_decomp_eps(const int scale, const gsl_matrix * m, const double expected_rcond, const double eps, const char * desc) { int s = 0; size_t i, j, N = m->size2; gsl_matrix * LDLT = gsl_matrix_alloc(N, N); gsl_matrix * V = gsl_matrix_alloc(N, N); gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_matrix * L = gsl_matrix_alloc(N, N); gsl_matrix * LT = gsl_matrix_alloc(N, N); gsl_vector * S = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_vector_view D = gsl_matrix_diagonal(LDLT); gsl_matrix_memcpy(LDLT, m); if (scale) s += gsl_linalg_pcholesky_decomp2(LDLT, perm, S); else s += gsl_linalg_pcholesky_decomp(LDLT, perm); /* check that the upper triangle of LDLT equals original matrix */ for (i = 0; i < N; ++i) { for (j = i + 1; j < N; ++j) { double mij = gsl_matrix_get(m, i, j); double aij = gsl_matrix_get(LDLT, i, j); gsl_test_rel(aij, mij, 1.0e-12, "%s upper triangle: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, aij, mij); } } /* check that D is decreasing */ s = 0; for (i = 1; i < N; ++i) { double dprev = gsl_vector_get(&D.vector, i - 1); double di = gsl_vector_get(&D.vector, i); if (di > dprev) s = 1; } gsl_test(s, "%s: (%zu,%zu): D is not decreasing", desc, N, N); /* compute L and LT */ gsl_matrix_set_identity(L); gsl_matrix_set_identity(LT); gsl_matrix_tricpy('L', 0, L, LDLT); gsl_matrix_transpose_tricpy('L', 0, LT, L); /* compute (L sqrt(D)) and (sqrt(D) LT) */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_column(L, i); gsl_vector_view w = gsl_matrix_row(LT, i); double di = gsl_vector_get(&D.vector, i); gsl_vector_scale(&v.vector, sqrt(di)); gsl_vector_scale(&w.vector, sqrt(di)); } /* compute A = L D LT */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, L, LT, 0.0, A); /* compute V = P S M S P^T */ gsl_matrix_memcpy(V, m); /* compute S M S */ if (scale) { gsl_linalg_cholesky_scale_apply(V, S); gsl_matrix_transpose_tricpy('L', 0, V, V); } /* compute M P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_row(V, i); gsl_permute_vector(perm, &v.vector); } /* compute P M P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_column(V, i); gsl_permute_vector(perm, &v.vector); } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { double Aij = gsl_matrix_get(A, i, j); /* L D L^T */ double Bij = gsl_matrix_get(V, i, j); /* P M P^T */ gsl_test_rel(Aij, Bij, eps, "%s: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, Aij, Bij); } } if (expected_rcond > 0 && !scale) { gsl_vector *work = gsl_vector_alloc(3 * N); double rcond; gsl_linalg_pcholesky_rcond(LDLT, perm, &rcond, work); gsl_test_rel(rcond, expected_rcond, 1.0e-6, "%s rcond: (%3lu,%3lu): %22.18g %22.18g\n", desc, N, N, rcond, expected_rcond); gsl_vector_free(work); } gsl_matrix_free(LDLT); gsl_matrix_free(V); gsl_matrix_free(A); gsl_matrix_free(L); gsl_matrix_free(LT); gsl_vector_free(S); gsl_permutation_free(perm); return s; } static int test_pcholesky_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_pcholesky_decomp_eps(0, m, -1.0, 1024.0 * N * GSL_DBL_EPSILON, "pcholesky_decomp unscaled random"); test_pcholesky_decomp_eps(1, m, -1.0, 1024.0 * N * GSL_DBL_EPSILON, "pcholesky_decomp scaled random"); if (N <= 12) { double expected_rcond = -1.0; if (hilb_rcond[N - 1] > 1.0e-12) expected_rcond = hilb_rcond[N - 1]; create_hilbert_matrix2(m); test_pcholesky_decomp_eps(0, m, expected_rcond, N * GSL_DBL_EPSILON, "pcholesky_decomp unscaled hilbert"); test_pcholesky_decomp_eps(1, m, expected_rcond, N * GSL_DBL_EPSILON, "pcholesky_decomp scaled hilbert"); } gsl_matrix_free(m); } return s; } int test_pcholesky_solve_eps(const int scale, const gsl_matrix * m, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int s = 0; size_t i, N = m->size1; gsl_matrix * u = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_calloc(N); gsl_vector * S = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(u, m); if (scale) { s += gsl_linalg_pcholesky_decomp2(u, perm, S); s += gsl_linalg_pcholesky_solve2(u, perm, S, rhs, x); } else { s += gsl_linalg_pcholesky_decomp(u, perm); s += gsl_linalg_pcholesky_solve(u, perm, rhs, x); } for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(sol, i); gsl_test_rel(xi, yi, eps, "%s: %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, xi, yi); } gsl_vector_free(x); gsl_vector_free(S); gsl_matrix_free(u); gsl_permutation_free(perm); return s; } static int test_pcholesky_solve(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); gsl_vector * rhs = gsl_vector_alloc(N); gsl_vector * sol = gsl_vector_alloc(N); create_posdef_matrix(m, r); create_random_vector(sol, r); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_pcholesky_solve_eps(0, m, rhs, sol, 64.0 * N * GSL_DBL_EPSILON, "pcholesky_solve unscaled random"); test_pcholesky_solve_eps(1, m, rhs, sol, 64.0 * N * GSL_DBL_EPSILON, "pcholesky_solve scaled random"); if (N <= 4) { create_hilbert_matrix2(m); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_pcholesky_solve_eps(0, m, rhs, sol, 1024.0 * N * GSL_DBL_EPSILON, "pcholesky_solve unscaled hilbert"); test_pcholesky_solve_eps(1, m, rhs, sol, 2048.0 * N * GSL_DBL_EPSILON, "pcholesky_solve scaled hilbert"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } int test_pcholesky_invert_eps(const gsl_matrix * m, const double eps, const char *desc) { int s = 0; size_t i, j, N = m->size1; gsl_matrix * v = gsl_matrix_alloc(N, N); gsl_matrix * c = gsl_matrix_alloc(N, N); gsl_matrix * minv = gsl_matrix_alloc(N, N); gsl_permutation * p = gsl_permutation_alloc(N); gsl_matrix_memcpy(v, m); s += gsl_linalg_pcholesky_decomp(v, p); s += gsl_linalg_pcholesky_invert(v, p, minv); /* c = m m^{-1} */ gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, m, minv, 0.0, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { double cij = gsl_matrix_get(c, i, j); double expected = (i == j) ? 1.0 : 0.0; gsl_test_rel(cij, expected, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, cij, expected); } } gsl_matrix_free(v); gsl_matrix_free(c); gsl_matrix_free(minv); gsl_permutation_free(p); return s; } int test_pcholesky_invert(gsl_rng * r) { int s = 0; const size_t N_max = 30; size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); create_posdef_matrix(m, r); test_pcholesky_invert_eps(m, N * GSL_DBL_EPSILON, "pcholesky_invert unscaled random"); if (N <= 4) { create_hilbert_matrix2(m); test_pcholesky_invert_eps(m, 256.0 * N * GSL_DBL_EPSILON, "pcholesky_invert unscaled hilbert"); } gsl_matrix_free(m); } return s; } gsl-doc-2.3/linalg/Makefile.am0000644000175000017500000000163212754372314014274 0ustar eddeddnoinst_LTLIBRARIES = libgsllinalg.la pkginclude_HEADERS = gsl_linalg.h AM_CPPFLAGS = -I$(top_srcdir) libgsllinalg_la_SOURCES = cod.c condest.c invtri.c 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 hesstri.c cholesky.c choleskyc.c mcholesky.c pcholesky.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c inline.c noinst_HEADERS = apply_givens.c cholesky_common.c svdstep.c tridiag.h test_cholesky.c TESTS = $(check_PROGRAMS) check_PROGRAMS = test test_SOURCES = test.c 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 ../rng/libgslrng.la gsl-doc-2.3/linalg/hessenberg.c0000664000175000017500000003124612616157443014540 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* gsl_linalg_hessenberg_decomp() 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_decomp(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_subcolumn(A, i, 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_decomp() */ /* 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. */ int gsl_linalg_hessenberg_set_zero(gsl_matrix * H) { const size_t N = H->size1; size_t i, j; if (N < 3) return GSL_SUCCESS; for (j = 0; j < N - 2; ++j) { for (i = j + 2; i < N; ++i) { gsl_matrix_set(H, i, j, 0.0); } } return GSL_SUCCESS; } /* 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_subcolumn(A, i, 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() */ /* To support gsl-1.9 interface: DEPRECATED */ int gsl_linalg_hessenberg(gsl_matrix *A, gsl_vector *tau) { return gsl_linalg_hessenberg_decomp(A, tau); } gsl-doc-2.3/linalg/hh.c0000664000175000017500000001105412616157443013005 0ustar eddedd/* linalg/hh.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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;) { 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; } } gsl-doc-2.3/linalg/TODO0000644000175000017500000000040612752713256012730 0ustar eddedd# -*- org -*- #+CATEGORY: linalg * Support M #include #include #include #include #include #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; } } gsl-doc-2.3/linalg/gsl_linalg.h0000644000175000017500000006663013017374337014535 0ustar eddedd/* linalg/gsl_linalg.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 Gerard Jungman, Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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_mh (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_decomp(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); int 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); /* To support gsl-1.9 interface: DEPRECATED */ int gsl_linalg_hessenberg(gsl_matrix *A, gsl_vector *tau); /* Hessenberg-Triangular reduction */ int gsl_linalg_hesstri_decomp(gsl_matrix * A, gsl_matrix * B, gsl_matrix * U, gsl_matrix * V, gsl_vector * work); /* 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); int gsl_linalg_SV_leverage(const gsl_matrix *U, gsl_vector *h); /* 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 * work); 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 * work); 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_QTmat (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A); int gsl_linalg_QR_matQ (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A); 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_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x, gsl_vector * residual); int gsl_linalg_QRPT_lssolve2 (const gsl_matrix * QR, const gsl_vector * tau, const gsl_permutation * p, const gsl_vector * b, const size_t rank, gsl_vector * x, gsl_vector * residual); 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); size_t gsl_linalg_QRPT_rank (const gsl_matrix * QR, const double tol); int gsl_linalg_QRPT_rcond(const gsl_matrix * QR, double * rcond, gsl_vector * work); /* COD decomposition */ int gsl_linalg_COD_decomp(gsl_matrix * A, gsl_vector * tau_Q, gsl_vector * tau_Z, gsl_permutation * p, size_t * rank, gsl_vector * work); int gsl_linalg_COD_decomp_e(gsl_matrix * A, gsl_vector * tau_Q, gsl_vector * tau_Z, gsl_permutation * p, double tol, size_t * rank, gsl_vector * work); int gsl_linalg_COD_lssolve (const gsl_matrix * QRZ, const gsl_vector * tau_Q, const gsl_vector * tau_Z, const gsl_permutation * perm, const size_t rank, const gsl_vector * b, gsl_vector * x, gsl_vector * residual); int gsl_linalg_COD_unpack(const gsl_matrix * QRZ, const gsl_vector * tau_Q, const gsl_vector * tau_Z, const size_t rank, gsl_matrix * Q, gsl_matrix * R, gsl_matrix * Z); int gsl_linalg_COD_matZ(const gsl_matrix * QRZ, const gsl_vector * tau_Z, const size_t rank, gsl_matrix * A, gsl_vector * work); /* 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_decomp1 (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); int gsl_linalg_cholesky_invert(gsl_matrix * cholesky); /* 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); int gsl_linalg_cholesky_scale(const gsl_matrix * A, gsl_vector * S); int gsl_linalg_cholesky_scale_apply(gsl_matrix * A, const gsl_vector * S); int gsl_linalg_cholesky_decomp2(gsl_matrix * A, gsl_vector * S); int gsl_linalg_cholesky_svx2 (const gsl_matrix * LLT, const gsl_vector * S, gsl_vector * x); int gsl_linalg_cholesky_solve2 (const gsl_matrix * LLT, const gsl_vector * S, const gsl_vector * b, gsl_vector * x); int gsl_linalg_cholesky_rcond (const gsl_matrix * LLT, double * rcond, gsl_vector * work); /* Complex Cholesky Decomposition */ int gsl_linalg_complex_cholesky_decomp (gsl_matrix_complex * A); int gsl_linalg_complex_cholesky_solve (const gsl_matrix_complex * cholesky, const gsl_vector_complex * b, gsl_vector_complex * x); int gsl_linalg_complex_cholesky_svx (const gsl_matrix_complex * cholesky, gsl_vector_complex * x); int gsl_linalg_complex_cholesky_invert(gsl_matrix_complex * cholesky); /* Pivoted Cholesky LDLT decomposition */ int gsl_linalg_pcholesky_decomp (gsl_matrix * A, gsl_permutation * p); int gsl_linalg_pcholesky_solve(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x); int gsl_linalg_pcholesky_svx(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * x); int gsl_linalg_pcholesky_decomp2(gsl_matrix * A, gsl_permutation * p, gsl_vector * S); int gsl_linalg_pcholesky_solve2(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * S, const gsl_vector * b, gsl_vector * x); int gsl_linalg_pcholesky_svx2(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * S, gsl_vector * x); int gsl_linalg_pcholesky_invert(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_matrix * Ainv); int gsl_linalg_pcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * p, double * rcond, gsl_vector * work); /* Modified Cholesky decomposition */ int gsl_linalg_mcholesky_decomp (gsl_matrix * A, gsl_permutation * p, gsl_vector * E); int gsl_linalg_mcholesky_solve(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x); int gsl_linalg_mcholesky_svx(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * x); int gsl_linalg_mcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * p, double * rcond, gsl_vector * work); int gsl_linalg_mcholesky_invert(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_matrix * Ainv); /* 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 * U, 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); /* condition estimation */ int gsl_linalg_tri_upper_rcond(const gsl_matrix * A, double * rcond, gsl_vector * work); int gsl_linalg_tri_lower_rcond(const gsl_matrix * A, double * rcond, gsl_vector * work); int gsl_linalg_invnorm1(const size_t N, int (* Ainvx)(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params), void * params, double * Ainvnorm, gsl_vector * work); /* triangular matrices */ int gsl_linalg_tri_upper_invert(gsl_matrix * T); int gsl_linalg_tri_lower_invert(gsl_matrix * T); int gsl_linalg_tri_upper_unit_invert(gsl_matrix * T); int gsl_linalg_tri_lower_unit_invert(gsl_matrix * T); INLINE_DECL void gsl_linalg_givens (const double a, const double b, double *c, double *s); INLINE_DECL void gsl_linalg_givens_gv (gsl_vector * v, const size_t i, const size_t j, const double c, const double s); #ifdef HAVE_INLINE /* 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_FUN void gsl_linalg_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; } } /* gsl_linalg_givens() */ INLINE_FUN void gsl_linalg_givens_gv (gsl_vector * v, const size_t i, const size_t j, const double c, const 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); } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_LINALG_H__ */ gsl-doc-2.3/linalg/cod.c0000644000175000017500000003644512757056776013201 0ustar eddedd/* linalg/cod.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module contains routines for factoring an M-by-N matrix A as: * * A P = Q R Z * * known as the Complete Orthogonal Decomposition, where: * * P is a N-by-N permutation matrix * Q is M-by-M orthogonal * R has an r-by-r upper triangular block * Z is N-by-N orthogonal * * When A is full rank, Z = I and this becomes the QR decomposition * with column pivoting. When A is rank deficient, then * * R = [ R11 0 ] where R11 is r-by-r and r = rank(A) * [ 0 0 ] */ static int cod_RZ(gsl_matrix * A, gsl_vector * tau); static double cod_householder_transform(double *alpha, gsl_vector * v); static int cod_householder_mh(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work); static int cod_householder_hv(const double tau, const gsl_vector * v, gsl_vector * w); static int cod_householder_ZTvec(const gsl_matrix * QRZ, const gsl_vector * tau_Z, const size_t rank, gsl_vector * v); int gsl_linalg_COD_decomp_e(gsl_matrix * A, gsl_vector * tau_Q, gsl_vector * tau_Z, gsl_permutation * p, double tol, size_t * rank, gsl_vector * work) { const size_t M = A->size1; const size_t N = A->size2; if (tau_Q->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau_Q must be MIN(M,N)", GSL_EBADLEN); } else if (tau_Z->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau_Z must be MIN(M,N)", GSL_EBADLEN); } else if (p->size != N) { GSL_ERROR ("permutation size must be N", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("work size must be N", GSL_EBADLEN); } else { int status, signum; size_t r; /* decompose: A P = Q R */ status = gsl_linalg_QRPT_decomp(A, tau_Q, p, &signum, work); if (status) return status; /* estimate rank of A */ r = gsl_linalg_QRPT_rank(A, tol); if (r < N) { /* * matrix is rank-deficient, so that the R factor is * * R = [ R11 R12 ] =~ [ R11 R12 ] * [ 0 R22 ] [ 0 0 ] * * compute RZ decomposition of upper trapezoidal matrix * [ R11 R12 ] = [ R11~ 0 ] Z */ gsl_matrix_view R_upper = gsl_matrix_submatrix(A, 0, 0, r, N); gsl_vector_view t = gsl_vector_subvector(tau_Z, 0, r); cod_RZ(&R_upper.matrix, &t.vector); } *rank = r; return GSL_SUCCESS; } } int gsl_linalg_COD_decomp(gsl_matrix * A, gsl_vector * tau_Q, gsl_vector * tau_Z, gsl_permutation * p, size_t * rank, gsl_vector * work) { return gsl_linalg_COD_decomp_e(A, tau_Q, tau_Z, p, -1.0, rank, work); } /* gsl_linalg_COD_lssolve() Find the least squares solution to the overdetermined system A x = b for M >= N using the COD factorization A P = Q R Z Inputs: QRZ - matrix A, in COD compressed format, M-by-N tau_Q - Householder scalars for Q, length min(M,N) tau_Z - Householder scalars for Z, length min(M,N) perm - permutation matrix rank - rank of A b - rhs vector, length M x - (output) solution vector, length N residual - (output) residual vector, b - A x, length M */ int gsl_linalg_COD_lssolve (const gsl_matrix * QRZ, const gsl_vector * tau_Q, const gsl_vector * tau_Z, const gsl_permutation * perm, const size_t rank, const gsl_vector * b, gsl_vector * x, gsl_vector * residual) { const size_t M = QRZ->size1; const size_t N = QRZ->size2; if (M < N) { GSL_ERROR ("QRZ matrix must have M>=N", GSL_EBADLEN); } else if (M != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (rank > GSL_MIN (M, N)) { GSL_ERROR ("rank must be <= MIN(M,N)", 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 R11 = gsl_matrix_const_submatrix (QRZ, 0, 0, rank, rank); gsl_vector_view QTb1 = gsl_vector_subvector(residual, 0, rank); gsl_vector_view x1 = gsl_vector_subvector(x, 0, rank); gsl_vector_set_zero(x); /* compute residual = Q^T b */ gsl_vector_memcpy(residual, b); gsl_linalg_QR_QTvec (QRZ, tau_Q, residual); /* solve x1 := R11^{-1} (Q^T b)(1:r) */ gsl_vector_memcpy(&(x1.vector), &(QTb1.vector)); gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &(R11.matrix), &(x1.vector)); /* compute Z^T ( R11^{-1} x1; 0 ) */ cod_householder_ZTvec(QRZ, tau_Z, rank, x); /* compute x = P Z^T ( R11^{-1} x1; 0 ) */ gsl_permute_vector_inverse(perm, x); /* compute residual = b - A x = Q (Q^T b - R [ R11^{-1} x1; 0 ]) */ gsl_vector_set_zero(&(QTb1.vector)); gsl_linalg_QR_Qvec(QRZ, tau_Q, residual); return GSL_SUCCESS; } } /* gsl_linalg_COD_unpack() Unpack encoded COD decomposition into the matrices Q,R,Z,P Inputs: QRZ - encoded COD decomposition tau_Q - Householder scalars for Q tau_Z - Householder scalars for Z rank - rank of matrix (as determined from gsl_linalg_COD_decomp) Q - (output) M-by-M matrix Q R - (output) M-by-N matrix R Z - (output) N-by-N matrix Z */ int gsl_linalg_COD_unpack(const gsl_matrix * QRZ, const gsl_vector * tau_Q, const gsl_vector * tau_Z, const size_t rank, gsl_matrix * Q, gsl_matrix * R, gsl_matrix * Z) { const size_t M = QRZ->size1; const size_t N = QRZ->size2; if (tau_Q->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau_Q must be MIN(M,N)", GSL_EBADLEN); } else if (tau_Z->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau_Z must be MIN(M,N)", GSL_EBADLEN); } else if (rank > GSL_MIN (M, N)) { GSL_ERROR ("rank must be <= MIN(M,N)", GSL_EBADLEN); } else if (Q->size1 != M || Q->size2 != M) { GSL_ERROR ("Q must by M-by-M", GSL_EBADLEN); } else if (R->size1 != M || R->size2 != N) { GSL_ERROR ("R must by M-by-N", GSL_EBADLEN); } else if (Z->size1 != N || Z->size2 != N) { GSL_ERROR ("Z must by N-by-N", GSL_EBADLEN); } else { size_t i; gsl_matrix_view R11 = gsl_matrix_submatrix(R, 0, 0, rank, rank); gsl_matrix_const_view QRZ11 = gsl_matrix_const_submatrix(QRZ, 0, 0, rank, rank); /* form Q matrix */ gsl_matrix_set_identity(Q); for (i = GSL_MIN (M, N); i-- > 0;) { gsl_vector_const_view h = gsl_matrix_const_subcolumn (QRZ, i, i, M - i); gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, M - i, M - i); double ti = gsl_vector_get (tau_Q, i); gsl_linalg_householder_hm (ti, &h.vector, &m.matrix); } /* form Z matrix */ gsl_matrix_set_identity(Z); if (rank < N) { gsl_vector_view work = gsl_matrix_row(R, 0); /* temporary workspace, size N */ /* multiply I by Z from the right */ gsl_linalg_COD_matZ(QRZ, tau_Z, rank, Z, &work.vector); } /* copy rank-by-rank upper triangle of QRZ into R and zero the rest */ gsl_matrix_set_zero(R); gsl_matrix_tricpy('U', 1, &R11.matrix, &QRZ11.matrix); return GSL_SUCCESS; } } /* gsl_linalg_COD_matZ Multiply an M-by-N matrix A on the right by Z (N-by-N) Inputs: QRZ - encoded COD matrix tau_Z - Householder scalars for Z rank - matrix rank A - on input, M-by-N matrix on output, A * Z work - workspace of length M */ int gsl_linalg_COD_matZ(const gsl_matrix * QRZ, const gsl_vector * tau_Z, const size_t rank, gsl_matrix * A, gsl_vector * work) { const size_t M = A->size1; const size_t N = A->size2; if (tau_Z->size != GSL_MIN (QRZ->size1, QRZ->size2)) { GSL_ERROR("tau_Z must be GSL_MIN(M,N)", GSL_EBADLEN); } else if (QRZ->size2 != N) { GSL_ERROR("QRZ must have N columns", GSL_EBADLEN); } else if (work->size != M) { GSL_ERROR("workspace must be length M", GSL_EBADLEN); } else { /* if rank == N, then Z = I and there is nothing to do */ if (rank < N) { size_t i; for (i = 0; i < rank; ++i) { gsl_vector_const_view h = gsl_matrix_const_subrow (QRZ, i, rank, N - rank); gsl_matrix_view m = gsl_matrix_submatrix (A, 0, i, M, N - i); double ti = gsl_vector_get (tau_Z, i); cod_householder_mh (ti, &h.vector, &m.matrix, work); } } return GSL_SUCCESS; } } /********************************************* * INTERNAL ROUTINES * *********************************************/ /* cod_RZ() Perform RZ decomposition of an upper trapezoidal matrix, A = [ A11 A12 ] = [ R 0 ] Z where A is M-by-N with N >= M, A11 is M-by-M upper triangular, and A12 is M-by-(N-M). On output, Z is stored as Householder reflectors in the A12 portion of A, Z = Z(1) Z(2) ... Z(M) Inputs: A - M-by-N matrix with N >= M On input, upper trapezoidal matrix [ A11 A12 ] On output, A11 is overwritten by R (subdiagonal elements are not touched), and A12 is overwritten by Z in packed storage tau - (output) Householder scalars, size M */ static int cod_RZ(gsl_matrix * A, gsl_vector * tau) { const size_t M = A->size1; const size_t N = A->size2; if (tau->size != M) { GSL_ERROR("tau has wrong size", GSL_EBADLEN); } else if (N < M) { GSL_ERROR("N must be >= M", GSL_EINVAL); } else if (M == N) { /* quick return */ gsl_vector_set_all(tau, 0.0); return GSL_SUCCESS; } else { size_t k; for (k = M; k > 0 && k--; ) { double *alpha = gsl_matrix_ptr(A, k, k); gsl_vector_view z = gsl_matrix_subrow(A, k, M, N - M); double tauk; /* compute Householder reflection to zero [ A(k,k) A(k,M+1:N) ] */ tauk = cod_householder_transform(alpha, &z.vector); gsl_vector_set(tau, k, tauk); if ((tauk != 0) && (k > 0)) { gsl_vector_view w = gsl_vector_subvector(tau, 0, k); gsl_matrix_view B = gsl_matrix_submatrix(A, 0, k, k, N - k); cod_householder_mh(tauk, &z.vector, &B.matrix, &w.vector); } } return GSL_SUCCESS; } } static double cod_householder_transform(double *alpha, gsl_vector * v) { double beta, tau; double xnorm = gsl_blas_dnrm2(v); if (xnorm == 0) { return 0.0; /* tau = 0 */ } beta = - (*alpha >= 0.0 ? +1.0 : -1.0) * gsl_hypot(*alpha, xnorm); tau = (beta - *alpha) / beta; { double s = (*alpha - beta); if (fabs(s) > GSL_DBL_MIN) { gsl_blas_dscal (1.0 / s, v); } else { gsl_blas_dscal (GSL_DBL_EPSILON / s, v); gsl_blas_dscal (1.0 / GSL_DBL_EPSILON, v); } *alpha = beta; } return tau; } /* cod_householder_hv Apply Householder reflection H = (I - tau*v*v') to vector v from the left, w' = H * w Inputs: tau - Householder scalar v - Householder vector, size M w - on input, w vector, size M on output, H * w Notes: 1) Based on LAPACK routine DLARZ */ static int cod_householder_hv(const double tau, const gsl_vector * v, gsl_vector * w) { if (tau == 0) { return GSL_SUCCESS; /* H = I */ } else { const size_t M = w->size; const size_t L = v->size; double w0 = gsl_vector_get(w, 0); gsl_vector_view w1 = gsl_vector_subvector(w, M - L, L); double d1, d; /* d1 := v . w(M-L:M) */ gsl_blas_ddot(v, &w1.vector, &d1); /* d := w(1) + v . w(M-L:M) */ d = w0 + d1; /* w(1) = w(1) - tau * d */ gsl_vector_set(w, 0, w0 - tau * d); /* w(M-L:M) = w(M-L:M) - tau * d * v */ gsl_blas_daxpy(-tau * d, v, &w1.vector); return GSL_SUCCESS; } } /* cod_householder_mh Apply Householder reflection H = (I - tau*v*v') to matrix A from the right Inputs: tau - Householder scalar v - Householder vector, size N-M A - matrix, size M-by-N work - workspace, size M Notes: 1) Based on LAPACK routine DLARZ */ static int cod_householder_mh(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work) { if (tau == 0) { return GSL_SUCCESS; /* H = I */ } else { const size_t M = A->size1; const size_t N = A->size2; const size_t L = v->size; gsl_vector_view A1 = gsl_matrix_subcolumn(A, 0, 0, M); gsl_matrix_view C = gsl_matrix_submatrix(A, 0, N - L, M, L); /* work(1:M) = A(1:M,1) */ gsl_vector_memcpy(work, &A1.vector); /* work(1:M) = work(1:M) + A(1:M,M+1:N) * v(1:N-M) */ gsl_blas_dgemv(CblasNoTrans, 1.0, &C.matrix, v, 1.0, work); /* A(1:M,1) = A(1:M,1) - tau * work(1:M) */ gsl_blas_daxpy(-tau, work, &A1.vector); /* A(1:M,M+1:N) = A(1:M,M+1:N) - tau * work(1:M) * v(1:N-M)' */ gsl_blas_dger(-tau, work, v, &C.matrix); return GSL_SUCCESS; } } /* cod_householder_ZTvec Multiply a vector by Z^T Inputs: QRZ - encoded COD matrix tau_Z - Householder scalars for Z rank - matrix rank v - on input, vector of length N on output, Z^T * v */ static int cod_householder_ZTvec(const gsl_matrix * QRZ, const gsl_vector * tau_Z, const size_t rank, gsl_vector * v) { const size_t M = QRZ->size1; const size_t N = QRZ->size2; if (tau_Z->size != GSL_MIN (M, N)) { GSL_ERROR("tau_Z must be GSL_MIN(M,N)", GSL_EBADLEN); } else if (v->size != N) { GSL_ERROR("v must be length N", GSL_EBADLEN); } else { if (rank < N) { size_t i; for (i = 0; i < rank; ++i) { gsl_vector_const_view h = gsl_matrix_const_subrow (QRZ, i, rank, N - rank); gsl_vector_view w = gsl_vector_subvector (v, i, N - i); double ti = gsl_vector_get (tau_Z, i); cod_householder_hv(ti, &h.vector, &w.vector); } } return GSL_SUCCESS; } } gsl-doc-2.3/linalg/inline.c0000664000175000017500000000205412616157443013664 0ustar eddedd/* linalg/inline.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/linalg/ptlq.c0000664000175000017500000003207712616157443013376 0ustar eddedd/* linalg/ptlq.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #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); gsl_linalg_givens (wkm1, wk, &c, &s); gsl_linalg_givens_gv (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 ); gsl_linalg_givens (diag, offdiag, &c, &s); apply_givens_lq (M, N, Q, L, k - 1, k, c, s); } return GSL_SUCCESS; } } gsl-doc-2.3/linalg/multiply.c0000664000175000017500000001000412616157443014257 0ustar eddedd/* linalg/multiply.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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; } } } gsl-doc-2.3/linalg/Makefile.in0000644000175000017500000011133113022372405014271 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsllinalg_la_LIBADD = am_libgsllinalg_la_OBJECTS = cod.lo condest.lo invtri.lo 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 hesstri.lo cholesky.lo choleskyc.lo mcholesky.lo \ pcholesky.lo symmtd.lo hermtd.lo bidiag.lo balance.lo \ balancemat.lo inline.lo libgsllinalg_la_OBJECTS = $(am_libgsllinalg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 \ ../rng/libgslrng.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsllinalg.la pkginclude_HEADERS = gsl_linalg.h AM_CPPFLAGS = -I$(top_srcdir) libgsllinalg_la_SOURCES = cod.c condest.c invtri.c 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 hesstri.c cholesky.c choleskyc.c mcholesky.c pcholesky.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c inline.c noinst_HEADERS = apply_givens.c cholesky_common.c svdstep.c tridiag.h test_cholesky.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c 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 ../rng/libgslrng.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu linalg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsllinalg.la: $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_DEPENDENCIES) $(EXTRA_libgsllinalg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balancemat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidiag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/choleskyc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/condest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermtd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hessenberg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hesstri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householdercomplex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invtri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiply.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmtd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tridiag.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/linalg/ChangeLog0000664000175000017500000003434212616157443014021 0ustar eddedd2011-04-15 Brian Gough * choleskyc.c (gsl_linalg_complex_cholesky_invert): avoid mixing declarations and code (C9X) 2010-06-13 Brian Gough * choleskyc.c (gsl_linalg_complex_cholesky_invert): added new routine for inversion (Huan Wu) 2010-02-24 Brian Gough * svdstep.c (trailing_eigenvalue): compute the implicit shift value mu robustly * svd.c (gsl_linalg_SV_decomp): scale the bidiagonal matrix before the implicit QR step * householder.c (gsl_linalg_householder_transform): handle the case where the scaling factor is subnormal 2009-07-04 Brian Gough * luc.c (gsl_linalg_complex_LU_solve, gsl_linalg_complex_LU_svx, gsl_linalg_complex_LU_refine, singular): added check for singular matrix 2009-06-28 Brian Gough * lu.c (gsl_linalg_LU_solve, gsl_linalg_LU_svx, gsl_linalg_LU_refine, gsl_linalg_LU_invert, singular): added check for singular matrix 2009-06-04 Brian Gough * hermtd.c (gsl_linalg_hermtd_unpack): use U as matrix name instead of Q 2008-10-20 Brian Gough * svd.c (gsl_linalg_SV_decomp_jacobi): change use of gsl_coerce_double to macro so it is not called unnecessarily 2008-08-30 Brian Gough * tridiag.c (solve_cyc_tridiag_nonsym): use x_stride when storing in x[] (fixes bug #24162) 2008-08-26 Brian Gough * test.c (test_QRPT_update_dim): added tests for gsl_linalg_QRPT_update * qrpt.c (gsl_linalg_QRPT_update): handle rectangular matrices 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-04-28 Brian Gough * bidiag.c (gsl_linalg_bidiag_unpack, gsl_linalg_bidiag_unpack2): use new descending loop convention * hermtd.c (gsl_linalg_hermtd_unpack): use new descending loop convention * hh.c (gsl_linalg_HH_svx): use new descending loop convention * lq.c (gsl_linalg_LQ_vecQ, gsl_linalg_LQ_unpack): use new descending loop convention * qr.c (gsl_linalg_QR_Qvec, gsl_linalg_QR_unpack): use new descending loop convention * svd.c (gsl_linalg_SV_decomp_mod): use new descending loop convention * svdstep.c (chase_out_trailing_zero): use new descending loop convention * symmtd.c (gsl_linalg_symmtd_unpack): use new descending loop convention 2008-04-03 Brian Gough * qr.c lq.c: removed unused definition of REAL 2007-08-27 Brian Gough * tridiag.c: use GSL_ERROR for failed allocation, signal GSL_EZERODIV if matrix is not positive definite 2007-08-17 Brian Gough * svd.c (gsl_linalg_SV_decomp): bail out if number of iterations exceeds 100*N 2007-08-16 Brian Gough * test.c (main): add some svd tests with small values that will cause underflow in intermediate steps of SVD iteration 2006-08-14 Brian Gough * balancemat.c: balance a general matrix D^-1 A D for rows and columns 2006-04-24 Brian Gough * svdstep.c apply_givens.c householder.c: perform linear operations with level-1 blas when compiled with USE_BLAS. 2006-02-10 Brian Gough * cholesky.c (quiet_sqrt): added a quiet_sqrt to allow checking for positive definiteness without a runtime error 2005-08-22 Brian Gough * 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 * 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 * svd.c (gsl_linalg_SV_decomp_jacobi): changed M * qr.c (gsl_linalg_R_svx): added missing function 2004-09-13 Brian Gough * 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 * test.c (test_LU_solve): increase test tolerance to accommodate gcc-3.3.3 w/ bounds checking 2004-05-26 Brian Gough * 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 * test.c (test_TDN_solve): increased tolerance for tests (test_TDN_cyc_solve): increased tolerance for tests 2004-03-15 Brian Gough * 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 * 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 * 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 * tridiag.c (solve_cyc_tridiag_nonsym): fixed declarations of i so they do not shadow each other 2003-05-30 Brian Gough * householder.c (gsl_linalg_householder_hv): converted to use blas routines 2003-05-08 Brian Gough * 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 * 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 * 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 * 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 * tridiag.c (gsl_linalg_solve_tridiag): (gsl_linalg_solve_cyc_tridiag): added tridiagonal solvers for non-symmetric case (David Necas ) Mon Apr 15 19:55:40 2002 Brian Gough * 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 * 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 * test.c (test_LUc_solve): added a test for complex LU Tue Sep 4 17:22:58 2001 Brian Gough * luc.c: added LU decomposition for complex matrices Wed Aug 29 16:34:50 2001 Brian Gough * 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 * svdstep.c (trailing_eigenvalue): chose better value of mu when dt=0. Sun Jul 8 18:03:05 2001 Brian Gough * 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 * modified to use new-style vector views, affects most functions Wed Jun 20 13:38:24 2001 Brian Gough * svd.c (gsl_linalg_SV_decomp): added error checking Tue Jun 19 23:19:49 2001 Brian Gough * 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 * givens.c: split out apply_givens functions into separate file apply_givens.c Wed Jun 13 23:41:34 2001 Brian Gough * 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 * 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 * qr.c (gsl_linalg_QR_lssolve): added least squares solver Sat Apr 28 00:39:53 2001 Brian Gough * 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 * tridiag.c: removed EFAULT test since this should only apply to non-null invalid pointers Fri Apr 13 20:43:38 2001 Brian Gough * test.c: replaced uses of matmult by dgemm Sun Oct 22 13:56:30 2000 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * cholesky.c: added cholesky decomposition/solve from Thomas Walter. Modified for GSL. Fri Apr 28 17:13:00 2000 Brian Gough * renamed all matrices to use upper case variable names, e.g. A Thu Apr 27 20:31:46 2000 Brian Gough * 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 * renamed rhs -> b, and solution -> x throughout for consistency Mon Apr 24 17:04:52 2000 Brian Gough * 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 * 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 * matrix.c: removed, equivalent functions now in matrix directory Sat Mar 11 17:36:33 2000 Brian Gough * 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 * 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 * 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 * temporary changes resulting from changes to block/vector/matrix organization Fri Aug 6 14:42:23 1999 Brian Gough * linalg_simple.c: include to declare memcpy gsl-doc-2.3/linalg/bidiag.c0000664000175000017500000002361212616157443013630 0ustar eddedd/* linalg/bidiag.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include 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;) { /* 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;) { /* 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;) { /* 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;) { /* 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; } } gsl-doc-2.3/linalg/svd.c0000664000175000017500000004614712616157443013215 0ustar eddedd/* linalg/svd.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #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, iter; 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, Msize1 != 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; iter = 0; 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--; } iter++; if (iter > 100 * N) { GSL_ERROR("SVD decomposition failed to converge", GSL_EMAXITER); } { 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); int rescale = 0; double scale = 1; double norm = 0; /* Find the maximum absolute values of the diagonal and subdiagonal */ for (i = 0; i < n_block; i++) { double s_i = gsl_vector_get (&S_block.vector, i); double a = fabs(s_i); if (a > norm) norm = a; } for (i = 0; i < n_block - 1; i++) { double f_i = gsl_vector_get (&f_block.vector, i); double a = fabs(f_i); if (a > norm) norm = a; } /* Temporarily scale the submatrix if necessary */ if (norm > GSL_SQRT_DBL_MAX) { scale = (norm / GSL_SQRT_DBL_MAX); rescale = 1; } else if (norm < GSL_SQRT_DBL_MIN && norm > 0) { scale = (norm / GSL_SQRT_DBL_MIN); rescale = 1; } if (rescale) { gsl_blas_dscal(1.0 / scale, &S_block.vector); gsl_blas_dscal(1.0 / scale, &f_block.vector); } /* Perform the implicit QR step */ 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); /* Undo the scaling if needed */ if (rescale) { gsl_blas_dscal(scale, &S_block.vector); gsl_blas_dscal(scale, &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, Msize1 != 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;) { /* 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; } } /* gsl_linalg_SV_leverage() Compute statistical leverage values of a matrix: h = diag(A (A^T A)^{-1} A^T) Inputs: U - U matrix in SVD decomposition h - (output) vector of leverages Return: success or error */ int gsl_linalg_SV_leverage(const gsl_matrix *U, gsl_vector *h) { const size_t M = U->size1; if (M != h->size) { GSL_ERROR ("first dimension of matrix U must match size of vector h", GSL_EBADLEN); } else { size_t i; for (i = 0; i < M; ++i) { gsl_vector_const_view v = gsl_matrix_const_row(U, i); double hi; gsl_blas_ddot(&v.vector, &v.vector, &hi); gsl_vector_set(h, i, hi); } return GSL_SUCCESS; } } /* gsl_linalg_SV_leverage() */ /* 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, Msize1 != 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_DBL(a) >= GSL_COERCE_DBL(b)); orthog = (fabs (p) <= tolerance * GSL_COERCE_DBL(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; } } gsl-doc-2.3/linalg/choleskyc.c0000664000175000017500000002201312616157443014367 0ustar eddedd/* linalg/choleskyc.c * * Copyright (C) 2007 Patrick Alken * Copyright (C) 2010 Huan Wu (gsl_linalg_complex_cholesky_invert) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module contains routines related to the Cholesky decomposition * of a complex Hermitian positive definite matrix. */ static void cholesky_complex_conj_vector(gsl_vector_complex *v); /* gsl_linalg_complex_cholesky_decomp() Perform the Cholesky decomposition on a Hermitian positive definite matrix. See Golub & Van Loan, "Matrix Computations" (3rd ed), algorithm 4.2.2. Inputs: A - (input/output) complex postive definite matrix Return: success or error The lower triangle of A is overwritten with the Cholesky decomposition */ int gsl_linalg_complex_cholesky_decomp(gsl_matrix_complex *A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("cholesky decomposition requires square matrix", GSL_ENOTSQR); } else { size_t i, j; gsl_complex z; double ajj; for (j = 0; j < N; ++j) { z = gsl_matrix_complex_get(A, j, j); ajj = GSL_REAL(z); if (j > 0) { gsl_vector_complex_const_view aj = gsl_matrix_complex_const_subrow(A, j, 0, j); gsl_blas_zdotc(&aj.vector, &aj.vector, &z); ajj -= GSL_REAL(z); } if (ajj <= 0.0) { GSL_ERROR("matrix is not positive definite", GSL_EDOM); } ajj = sqrt(ajj); GSL_SET_COMPLEX(&z, ajj, 0.0); gsl_matrix_complex_set(A, j, j, z); if (j < N - 1) { gsl_vector_complex_view av = gsl_matrix_complex_subcolumn(A, j, j + 1, N - j - 1); if (j > 0) { gsl_vector_complex_view aj = gsl_matrix_complex_subrow(A, j, 0, j); gsl_matrix_complex_view am = gsl_matrix_complex_submatrix(A, j + 1, 0, N - j - 1, j); cholesky_complex_conj_vector(&aj.vector); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_NEGONE, &am.matrix, &aj.vector, GSL_COMPLEX_ONE, &av.vector); cholesky_complex_conj_vector(&aj.vector); } gsl_blas_zdscal(1.0 / ajj, &av.vector); } } /* Now store L^H in upper triangle */ for (i = 1; i < N; ++i) { for (j = 0; j < i; ++j) { z = gsl_matrix_complex_get(A, i, j); gsl_matrix_complex_set(A, j, i, gsl_complex_conjugate(z)); } } return GSL_SUCCESS; } } /* gsl_linalg_complex_cholesky_decomp() */ /* gsl_linalg_complex_cholesky_solve() Solve A x = b where A is in cholesky form */ int gsl_linalg_complex_cholesky_solve (const gsl_matrix_complex * cholesky, const gsl_vector_complex * b, gsl_vector_complex * x) { if (cholesky->size1 != cholesky->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (cholesky->size1 != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (cholesky->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { gsl_vector_complex_memcpy (x, b); /* solve for y using forward-substitution, L y = b */ gsl_blas_ztrsv (CblasLower, CblasNoTrans, CblasNonUnit, cholesky, x); /* perform back-substitution, L^H x = y */ gsl_blas_ztrsv (CblasLower, CblasConjTrans, CblasNonUnit, cholesky, x); return GSL_SUCCESS; } } /* gsl_linalg_complex_cholesky_solve() */ /* gsl_linalg_complex_cholesky_svx() Solve A x = b in place where A is in cholesky form */ int gsl_linalg_complex_cholesky_svx (const gsl_matrix_complex * cholesky, gsl_vector_complex * x) { if (cholesky->size1 != cholesky->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (cholesky->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { /* solve for y using forward-substitution, L y = b */ gsl_blas_ztrsv (CblasLower, CblasNoTrans, CblasNonUnit, cholesky, x); /* perform back-substitution, L^H x = y */ gsl_blas_ztrsv (CblasLower, CblasConjTrans, CblasNonUnit, cholesky, x); return GSL_SUCCESS; } } /* gsl_linalg_complex_cholesky_svx() */ /****************************************************************************** gsl_linalg_complex_cholesky_invert() Compute the inverse of an Hermitian positive definite matrix in Cholesky form. Inputs: LLT - matrix in cholesky form on input A^{-1} = L^{-H} L^{-1} on output Return: success or error ******************************************************************************/ int gsl_linalg_complex_cholesky_invert(gsl_matrix_complex * LLT) { if (LLT->size1 != LLT->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else { size_t N = LLT->size1; size_t i, j; gsl_vector_complex_view v1; /* invert the lower triangle of LLT */ for (i = 0; i < N; ++i) { double ajj; gsl_complex z; j = N - i - 1; { gsl_complex z0 = gsl_matrix_complex_get(LLT, j, j); ajj = 1.0 / GSL_REAL(z0); } GSL_SET_COMPLEX(&z, ajj, 0.0); gsl_matrix_complex_set(LLT, j, j, z); { gsl_complex z1 = gsl_matrix_complex_get(LLT, j, j); ajj = -GSL_REAL(z1); } if (j < N - 1) { gsl_matrix_complex_view m; m = gsl_matrix_complex_submatrix(LLT, j + 1, j + 1, N - j - 1, N - j - 1); v1 = gsl_matrix_complex_subcolumn(LLT, j, j + 1, N - j - 1); gsl_blas_ztrmv(CblasLower, CblasNoTrans, CblasNonUnit, &m.matrix, &v1.vector); gsl_blas_zdscal(ajj, &v1.vector); } } /* for (i = 0; i < N; ++i) */ /* * The lower triangle of LLT now contains L^{-1}. Now compute * A^{-1} = L^{-H} L^{-1} * * The (ij) element of A^{-1} is column i of conj(L^{-1}) dotted into * column j of L^{-1} */ for (i = 0; i < N; ++i) { gsl_complex sum; for (j = i + 1; j < N; ++j) { gsl_vector_complex_view v2; v1 = gsl_matrix_complex_subcolumn(LLT, i, j, N - j); v2 = gsl_matrix_complex_subcolumn(LLT, j, j, N - j); /* compute Ainv[i,j] = sum_k{conj(Linv[k,i]) * Linv[k,j]} */ gsl_blas_zdotc(&v1.vector, &v2.vector, &sum); /* store in upper triangle */ gsl_matrix_complex_set(LLT, i, j, sum); } /* now compute the diagonal element */ v1 = gsl_matrix_complex_subcolumn(LLT, i, i, N - i); gsl_blas_zdotc(&v1.vector, &v1.vector, &sum); gsl_matrix_complex_set(LLT, i, i, sum); } /* copy the Hermitian upper triangle to the lower triangle */ for (j = 1; j < N; j++) { for (i = 0; i < j; i++) { gsl_complex z = gsl_matrix_complex_get(LLT, i, j); gsl_matrix_complex_set(LLT, j, i, gsl_complex_conjugate(z)); } } return GSL_SUCCESS; } } /* gsl_linalg_complex_cholesky_invert() */ /******************************************** * INTERNAL ROUTINES * ********************************************/ static void cholesky_complex_conj_vector(gsl_vector_complex *v) { size_t i; for (i = 0; i < v->size; ++i) { gsl_complex z = gsl_vector_complex_get(v, i); gsl_vector_complex_set(v, i, gsl_complex_conjugate(z)); } } /* cholesky_complex_conj_vector() */ gsl-doc-2.3/linalg/lq.c0000664000175000017500000003440712616157443013031 0ustar eddedd/* linalg/lq.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #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;) { 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;) { 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--) /* loop from k = M-1 to 1 */ { double c, s; double wk = gsl_vector_get (w, k); double wkm1 = gsl_vector_get (w, k - 1); gsl_linalg_givens (wkm1, wk, &c, &s); gsl_linalg_givens_gv (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); gsl_linalg_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; } } gsl-doc-2.3/linalg/symmtd.c0000664000175000017500000001502712616157443013727 0ustar eddedd/* linalg/sytd.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include 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;) { 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; } } gsl-doc-2.3/linalg/householdercomplex.c0000664000175000017500000001647112616157443016327 0ustar eddedd/* linalg/householdercomplex.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include 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_mh (gsl_complex tau, const gsl_vector_complex * v, gsl_matrix_complex * A) { /* applies a householder transformation v,tau to matrix m on the right */ size_t i, j; if (GSL_REAL(tau) == 0.0 && GSL_IMAG(tau) == 0.0) { return GSL_SUCCESS; } /* A -> A - A*tau*v*v^h */ for (i = 0; i < A->size1; i++) { gsl_complex tauwi; gsl_complex Ai0 = gsl_matrix_complex_get (A, i, 0); gsl_complex wi = Ai0; /* compute w = A v */ for (j = 1; j < A->size2; j++) /* note, computed for v(0) = 1 above */ { gsl_complex Aij = gsl_matrix_complex_get(A, i, j); gsl_complex vj = gsl_vector_complex_get(v, j); gsl_complex Av = gsl_complex_mul (Aij, vj); wi = gsl_complex_add (wi, Av); } tauwi = gsl_complex_mul (tau, wi); /* A = A - w v^H */ { gsl_complex Atw = gsl_complex_sub (Ai0, tauwi); /* store Ai0 - tau * wi */ gsl_matrix_complex_set (A, i, 0, Atw); } for (j = 1; j < A->size2; j++) { gsl_complex vj = gsl_vector_complex_get (v, j); gsl_complex tauwv = gsl_complex_mul(gsl_complex_conjugate(vj), tauwi); gsl_complex Aij = gsl_matrix_complex_get (A, i, j); gsl_complex Atwv = gsl_complex_sub (Aij, tauwv); /* store Aij - tau * wi * conj(vj) */ 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; } gsl-doc-2.3/linalg/cholesky.c0000644000175000017500000003452412761322106014223 0ustar eddedd/* Cholesky Decomposition * * Copyright (C) 2000 Thomas Walter * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2007 Brian Gough, Gerard Jungman * Copyright (C) 2016 Patrick Alken * * 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 3, 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. * * 03 May 2000: Modified for GSL by Brian Gough * 29 Jul 2005: Additions by Gerard Jungman * 04 Mar 2016: Change Cholesky algorithm to gaxpy version by Patrick Alken */ /* * 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 #include #include #include #include #include #include static double cholesky_norm1(const gsl_matrix * LLT, gsl_vector * work); static int cholesky_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); /* In GSL 2.2, we decided to modify the behavior of the Cholesky decomposition to store the Cholesky factor in the lower triangle, and store the original matrix in the upper triangle. Previous versions stored the Cholesky factor in both places. The routine gsl_linalg_cholesky_decomp1 was added for the new behavior, and gsl_linalg_cholesky_decomp is maintained for backward compatibility. It will be removed in a future release. */ int gsl_linalg_cholesky_decomp (gsl_matrix * A) { int status; status = gsl_linalg_cholesky_decomp1(A); if (status == GSL_SUCCESS) { gsl_matrix_transpose_tricpy('L', 0, A, A); } return status; } /* gsl_linalg_cholesky_decomp1() Perform Cholesky decomposition of a symmetric positive definite matrix Inputs: A - (input) symmetric, positive definite matrix (output) lower triangle contains Cholesky factor Return: success/error Notes: 1) Based on algorithm 4.2.1 (Gaxpy Cholesky) of Golub and Van Loan, Matrix Computations (4th ed). */ int gsl_linalg_cholesky_decomp1 (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 j; for (j = 0; j < N; ++j) { double ajj; gsl_vector_view v = gsl_matrix_subcolumn(A, j, j, N - j); /* A(j:n,j) */ if (j > 0) { gsl_vector_view w = gsl_matrix_subrow(A, j, 0, j); /* A(j,1:j-1)^T */ gsl_matrix_view m = gsl_matrix_submatrix(A, j, 0, N - j, j); /* A(j:n,1:j-1) */ gsl_blas_dgemv(CblasNoTrans, -1.0, &m.matrix, &w.vector, 1.0, &v.vector); } ajj = gsl_matrix_get(A, j, j); if (ajj <= 0.0) { GSL_ERROR("matrix is not positive definite", GSL_EDOM); } ajj = sqrt(ajj); gsl_vector_scale(&v.vector, 1.0 / ajj); } 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 { int status; /* copy x <- b */ gsl_vector_memcpy (x, b); status = gsl_linalg_cholesky_svx(LLT, x); return status; } } 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, L^T x = c */ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LLT, x); return GSL_SUCCESS; } } /* gsl_linalg_cholesky_invert() Compute the inverse of a symmetric positive definite matrix in Cholesky form. Inputs: LLT - matrix in cholesky form on input A^{-1} = L^{-t} L^{-1} on output Return: success or error */ int gsl_linalg_cholesky_invert(gsl_matrix * LLT) { if (LLT->size1 != LLT->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else { const size_t N = LLT->size1; size_t i; gsl_vector_view v1, v2; /* invert the lower triangle of LLT */ gsl_linalg_tri_lower_invert(LLT); /* * The lower triangle of LLT now contains L^{-1}. Now compute * A^{-1} = L^{-T} L^{-1} */ for (i = 0; i < N; ++i) { double aii = gsl_matrix_get(LLT, i, i); if (i < N - 1) { double tmp; v1 = gsl_matrix_subcolumn(LLT, i, i, N - i); gsl_blas_ddot(&v1.vector, &v1.vector, &tmp); gsl_matrix_set(LLT, i, i, tmp); if (i > 0) { gsl_matrix_view m = gsl_matrix_submatrix(LLT, i + 1, 0, N - i - 1, i); v1 = gsl_matrix_subcolumn(LLT, i, i + 1, N - i - 1); v2 = gsl_matrix_subrow(LLT, i, 0, i); gsl_blas_dgemv(CblasTrans, 1.0, &m.matrix, &v1.vector, aii, &v2.vector); } } else { v1 = gsl_matrix_row(LLT, N - 1); gsl_blas_dscal(aii, &v1.vector); } } /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy('L', 0, LLT, LLT); return GSL_SUCCESS; } } /* gsl_linalg_cholesky_invert() */ 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_decomp1(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; } /* gsl_linalg_cholesky_scale() This function computes scale factors diag(S), such that diag(S) A diag(S) has a condition number within a factor N of the matrix with the smallest condition number over all possible diagonal scalings. See Corollary 7.6 of: N. J. Higham, Accuracy and Stability of Numerical Algorithms (2nd Edition), SIAM, 2002. Inputs: A - symmetric positive definite matrix S - (output) scale factors, S_i = 1 / sqrt(A_ii) */ int gsl_linalg_cholesky_scale(const gsl_matrix * A, gsl_vector * S) { const size_t M = A->size1; const size_t N = A->size2; if (M != N) { GSL_ERROR("A is not a square matrix", GSL_ENOTSQR); } else if (N != S->size) { GSL_ERROR("S must have length N", GSL_EBADLEN); } else { size_t i; /* compute S_i = 1/sqrt(A_{ii}) */ for (i = 0; i < N; ++i) { double Aii = gsl_matrix_get(A, i, i); if (Aii <= 0.0) gsl_vector_set(S, i, 1.0); /* matrix not positive definite */ else gsl_vector_set(S, i, 1.0 / sqrt(Aii)); } return GSL_SUCCESS; } } /* gsl_linalg_cholesky_scale_apply() This function applies scale transformation to A: A <- diag(S) A diag(S) Inputs: A - (input/output) on input, symmetric positive definite matrix on output, diag(S) * A * diag(S) in lower triangle S - (input) scale factors */ int gsl_linalg_cholesky_scale_apply(gsl_matrix * A, const gsl_vector * S) { const size_t M = A->size1; const size_t N = A->size2; if (M != N) { GSL_ERROR("A is not a square matrix", GSL_ENOTSQR); } else if (N != S->size) { GSL_ERROR("S must have length N", GSL_EBADLEN); } else { size_t i, j; /* compute: A <- diag(S) A diag(S) using lower triangle */ for (j = 0; j < N; ++j) { double sj = gsl_vector_get(S, j); for (i = j; i < N; ++i) { double si = gsl_vector_get(S, i); double *Aij = gsl_matrix_ptr(A, i, j); *Aij *= si * sj; } } return GSL_SUCCESS; } } int gsl_linalg_cholesky_decomp2(gsl_matrix * A, gsl_vector * S) { 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 if (N != S->size) { GSL_ERROR("S must have length N", GSL_EBADLEN); } else { int status; /* compute scaling factors to reduce cond(A) */ status = gsl_linalg_cholesky_scale(A, S); if (status) return status; /* apply scaling factors */ status = gsl_linalg_cholesky_scale_apply(A, S); if (status) return status; /* compute Cholesky decomposition of diag(S) A diag(S) */ status = gsl_linalg_cholesky_decomp1(A); if (status) return status; return GSL_SUCCESS; } } int gsl_linalg_cholesky_svx2 (const gsl_matrix * LLT, const gsl_vector * S, gsl_vector * x) { if (LLT->size1 != LLT->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (LLT->size2 != S->size) { GSL_ERROR ("matrix size must match S", GSL_EBADLEN); } else if (LLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { /* b~ = diag(S) b */ gsl_vector_mul(x, S); /* Solve for c using forward-substitution, L c = b~ */ gsl_blas_dtrsv (CblasLower, CblasNoTrans, CblasNonUnit, LLT, x); /* Perform back-substitution, L^T x~ = c */ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LLT, x); /* compute original solution vector x = S x~ */ gsl_vector_mul(x, S); return GSL_SUCCESS; } } int gsl_linalg_cholesky_solve2 (const gsl_matrix * LLT, const gsl_vector * S, 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 != S->size) { GSL_ERROR ("matrix size must match S size", GSL_EBADLEN); } 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 { int status; /* Copy x <- b */ gsl_vector_memcpy (x, b); status = gsl_linalg_cholesky_svx2(LLT, S, x); return status; } } int gsl_linalg_cholesky_rcond (const gsl_matrix * LLT, double * rcond, gsl_vector * work) { const size_t M = LLT->size1; const size_t N = LLT->size2; if (M != N) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; double Anorm = cholesky_norm1(LLT, work); /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ *rcond = 0.0; /* don't continue if matrix is singular */ if (Anorm == 0.0) return GSL_SUCCESS; /* estimate ||A^{-1}||_1 */ status = gsl_linalg_invnorm1(N, cholesky_Ainv, (void *) LLT, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* compute 1-norm of original matrix, stored in upper triangle of LLT; * diagonal entries have to be reconstructed */ static double cholesky_norm1(const gsl_matrix * LLT, gsl_vector * work) { const size_t N = LLT->size1; double max = 0.0; size_t i, j; for (j = 0; j < N; ++j) { double sum = 0.0; gsl_vector_const_view lj = gsl_matrix_const_subrow(LLT, j, 0, j + 1); double Ajj; /* compute diagonal (j,j) entry of A */ gsl_blas_ddot(&lj.vector, &lj.vector, &Ajj); for (i = 0; i < j; ++i) { double *wi = gsl_vector_ptr(work, i); double Aij = gsl_matrix_get(LLT, i, j); double absAij = fabs(Aij); sum += absAij; *wi += absAij; } gsl_vector_set(work, j, sum + fabs(Ajj)); } for (i = 0; i < N; ++i) { double wi = gsl_vector_get(work, i); max = GSL_MAX(max, wi); } return max; } /* x := A^{-1} x = A^{-t} x, A = L L^T */ static int cholesky_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { int status; gsl_matrix * A = (gsl_matrix * ) params; (void) TransA; /* unused parameter warning */ /* compute L^{-1} x */ status = gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasNonUnit, A, x); if (status) return status; /* compute L^{-t} x */ status = gsl_blas_dtrsv(CblasLower, CblasTrans, CblasNonUnit, A, x); if (status) return status; return GSL_SUCCESS; } gsl-doc-2.3/linalg/invtri.c0000644000175000017500000000752012756613510013717 0ustar eddedd/* linalg/invtri.c * * Copyright (C) 2016 Patrick Alken * * 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 3, 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. * * You should have received a copy of the GNU General Public 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 module contains code to invert triangular matrices */ #include #include #include #include #include #include #include static int triangular_inverse(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix * T); int gsl_linalg_tri_upper_invert(gsl_matrix * T) { int status = triangular_inverse(CblasUpper, CblasNonUnit, T); return status; } int gsl_linalg_tri_lower_invert(gsl_matrix * T) { int status = triangular_inverse(CblasLower, CblasNonUnit, T); return status; } int gsl_linalg_tri_upper_unit_invert(gsl_matrix * T) { int status = triangular_inverse(CblasUpper, CblasUnit, T); return status; } int gsl_linalg_tri_lower_unit_invert(gsl_matrix * T) { int status = triangular_inverse(CblasLower, CblasUnit, T); return status; } /* triangular_inverse() Invert a triangular matrix T Inputs: Uplo - CblasUpper or CblasLower Diag - unit triangular? T - on output the upper (or lower) part of T is replaced by its inverse Return: success/error */ static int triangular_inverse(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { gsl_matrix_view m; gsl_vector_view v; size_t i; if (Uplo == CblasUpper) { for (i = 0; i < N; ++i) { double aii; if (Diag == CblasNonUnit) { double *Tii = gsl_matrix_ptr(T, i, i); *Tii = 1.0 / *Tii; aii = -(*Tii); } else { aii = -1.0; } if (i > 0) { m = gsl_matrix_submatrix(T, 0, 0, i, i); v = gsl_matrix_subcolumn(T, i, 0, i); gsl_blas_dtrmv(CblasUpper, CblasNoTrans, Diag, &m.matrix, &v.vector); gsl_blas_dscal(aii, &v.vector); } } /* for (i = 0; i < N; ++i) */ } else { for (i = 0; i < N; ++i) { double ajj; size_t j = N - i - 1; if (Diag == CblasNonUnit) { double *Tjj = gsl_matrix_ptr(T, j, j); *Tjj = 1.0 / *Tjj; ajj = -(*Tjj); } else { ajj = -1.0; } if (j < N - 1) { m = gsl_matrix_submatrix(T, j + 1, j + 1, N - j - 1, N - j - 1); v = gsl_matrix_subcolumn(T, j, j + 1, N - j - 1); gsl_blas_dtrmv(CblasLower, CblasNoTrans, Diag, &m.matrix, &v.vector); gsl_blas_dscal(ajj, &v.vector); } } /* for (i = 0; i < N; ++i) */ } return GSL_SUCCESS; } } gsl-doc-2.3/linalg/pcholesky.c0000644000175000017500000003560512756614153014416 0ustar eddedd/* L D L^T Decomposition * * Copyright (C) 2016 Patrick Alken * * 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 3, 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. */ /* * L D L^T decomposition of a symmetrix positive definite matrix. * * This algorithm does: * P A P' = L D L' * with * L := unit lower left triangle matrix * D := diagonal matrix * L' := the transposed form of L. * P := permutation matrix * */ #include #include #include #include #include #include #include #include #include #include "cholesky_common.c" static double cholesky_LDLT_norm1(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * work); static int cholesky_LDLT_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); typedef struct { const gsl_matrix * LDLT; const gsl_permutation * perm; } pcholesky_params; /* pcholesky_decomp() Perform Pivoted Cholesky LDLT decomposition of a symmetric positive semidefinite matrix Inputs: copy_uplo - copy lower triangle to upper to save original matrix for rcond calculation later A - (input) symmetric, positive semidefinite matrix, stored in lower triangle (output) lower triangle contains L; diagonal contains D p - permutation vector Return: success/error Notes: 1) Based on algorithm 4.2.2 (Outer Product LDLT with Pivoting) of Golub and Van Loan, Matrix Computations (4th ed). */ static int pcholesky_decomp (const int copy_uplo, gsl_matrix * A, gsl_permutation * p) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("LDLT decomposition requires square matrix", GSL_ENOTSQR); } else if (p->size != N) { GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN); } else { gsl_vector_view diag = gsl_matrix_diagonal(A); size_t k; if (copy_uplo) { /* save a copy of A in upper triangle (for later rcond calculation) */ gsl_matrix_transpose_tricpy('L', 0, A, A); } gsl_permutation_init(p); for (k = 0; k < N; ++k) { gsl_vector_view w; size_t j; /* compute j = max_idx { A_kk, ..., A_nn } */ w = gsl_vector_subvector(&diag.vector, k, N - k); j = gsl_vector_max_index(&w.vector) + k; gsl_permutation_swap(p, k, j); cholesky_swap_rowcol(A, k, j); if (k < N - 1) { double alpha = gsl_matrix_get(A, k, k); double alphainv = 1.0 / alpha; /* v = A(k+1:n, k) */ gsl_vector_view v = gsl_matrix_subcolumn(A, k, k + 1, N - k - 1); /* m = A(k+1:n, k+1:n) */ gsl_matrix_view m = gsl_matrix_submatrix(A, k + 1, k + 1, N - k - 1, N - k - 1); /* m = m - v v^T / alpha */ gsl_blas_dsyr(CblasLower, -alphainv, &v.vector, &m.matrix); /* v = v / alpha */ gsl_vector_scale(&v.vector, alphainv); } } return GSL_SUCCESS; } } /* gsl_linalg_pcholesky_decomp() Perform Pivoted Cholesky LDLT decomposition of a symmetric positive semidefinite matrix Inputs: A - (input) symmetric, positive semidefinite matrix, stored in lower triangle (output) lower triangle contains L; diagonal contains D p - permutation vector Return: success/error Notes: 1) Based on algorithm 4.2.2 (Outer Product LDLT with Pivoting) of Golub and Van Loan, Matrix Computations (4th ed). */ int gsl_linalg_pcholesky_decomp (gsl_matrix * A, gsl_permutation * p) { int status = pcholesky_decomp(1, A, p); return status; } int gsl_linalg_pcholesky_solve(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x) { if (LDLT->size1 != LDLT->size2) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size1 != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (LDLT->size1 != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (LDLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { int status; gsl_vector_memcpy (x, b); status = gsl_linalg_pcholesky_svx (LDLT, p, x); return status; } } int gsl_linalg_pcholesky_svx(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * x) { if (LDLT->size1 != LDLT->size2) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size1 != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (LDLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { gsl_vector_const_view D = gsl_matrix_const_diagonal(LDLT); /* x := P b */ gsl_permute_vector(p, x); /* solve: L w = P b */ gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasUnit, LDLT, x); /* solve: D y = w */ gsl_vector_div(x, &D.vector); /* solve: L^T z = y */ gsl_blas_dtrsv(CblasLower, CblasTrans, CblasUnit, LDLT, x); /* compute: x = P^T z */ gsl_permute_vector_inverse(p, x); return GSL_SUCCESS; } } int gsl_linalg_pcholesky_decomp2(gsl_matrix * A, gsl_permutation * p, gsl_vector * S) { 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 if (N != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (N != S->size) { GSL_ERROR("S must have length N", GSL_EBADLEN); } else { int status; /* save a copy of A in upper triangle (for later rcond calculation) */ gsl_matrix_transpose_tricpy('L', 0, A, A); /* compute scaling factors to reduce cond(A) */ status = gsl_linalg_cholesky_scale(A, S); if (status) return status; /* apply scaling factors */ status = gsl_linalg_cholesky_scale_apply(A, S); if (status) return status; /* compute Cholesky decomposition of diag(S) A diag(S) */ status = pcholesky_decomp(0, A, p); if (status) return status; return GSL_SUCCESS; } } int gsl_linalg_pcholesky_solve2(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * S, const gsl_vector * b, gsl_vector * x) { if (LDLT->size1 != LDLT->size2) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size1 != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (LDLT->size1 != S->size) { GSL_ERROR ("matrix size must match S", GSL_EBADLEN); } else if (LDLT->size1 != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (LDLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { int status; gsl_vector_memcpy (x, b); status = gsl_linalg_pcholesky_svx2 (LDLT, p, S, x); return status; } } int gsl_linalg_pcholesky_svx2(const gsl_matrix * LDLT, const gsl_permutation * p, const gsl_vector * S, gsl_vector * x) { if (LDLT->size1 != LDLT->size2) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size1 != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (LDLT->size1 != S->size) { GSL_ERROR ("matrix size must match S", GSL_EBADLEN); } else if (LDLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { int status; /* x := S b */ gsl_vector_mul(x, S); /* solve: A~ x~ = b~, with A~ = S A S, b~ = S b */ status = gsl_linalg_pcholesky_svx(LDLT, p, x); if (status) return status; /* compute: x = S x~ */ gsl_vector_mul(x, S); return GSL_SUCCESS; } } /* gsl_linalg_pcholesky_invert() Compute the inverse of a symmetric positive definite matrix in Cholesky form. Inputs: LDLT - matrix in cholesky form p - permutation Ainv - (output) A^{-1} Return: success or error */ int gsl_linalg_pcholesky_invert(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_matrix * Ainv) { const size_t M = LDLT->size1; const size_t N = LDLT->size2; if (M != N) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size1 != p->size) { GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN); } else if (Ainv->size1 != Ainv->size2) { GSL_ERROR ("Ainv matrix must be square", GSL_ENOTSQR); } else if (Ainv->size1 != M) { GSL_ERROR ("Ainv matrix has wrong dimensions", GSL_EBADLEN); } else { size_t i, j; gsl_vector_view v1, v2; /* invert the lower triangle of LDLT */ gsl_matrix_memcpy(Ainv, LDLT); gsl_linalg_tri_lower_unit_invert(Ainv); /* compute sqrt(D^{-1}) L^{-1} in the lower triangle of Ainv */ for (i = 0; i < N; ++i) { double di = gsl_matrix_get(LDLT, i, i); double sqrt_di = sqrt(di); for (j = 0; j < i; ++j) { double *Lij = gsl_matrix_ptr(Ainv, i, j); *Lij /= sqrt_di; } gsl_matrix_set(Ainv, i, i, 1.0 / sqrt_di); } /* * The lower triangle of Ainv now contains D^{-1/2} L^{-1}. Now compute * A^{-1} = L^{-T} D^{-1} L^{-1} */ for (i = 0; i < N; ++i) { double aii = gsl_matrix_get(Ainv, i, i); if (i < N - 1) { double tmp; v1 = gsl_matrix_subcolumn(Ainv, i, i, N - i); gsl_blas_ddot(&v1.vector, &v1.vector, &tmp); gsl_matrix_set(Ainv, i, i, tmp); if (i > 0) { gsl_matrix_view m = gsl_matrix_submatrix(Ainv, i + 1, 0, N - i - 1, i); v1 = gsl_matrix_subcolumn(Ainv, i, i + 1, N - i - 1); v2 = gsl_matrix_subrow(Ainv, i, 0, i); gsl_blas_dgemv(CblasTrans, 1.0, &m.matrix, &v1.vector, aii, &v2.vector); } } else { v1 = gsl_matrix_row(Ainv, N - 1); gsl_blas_dscal(aii, &v1.vector); } } /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy('L', 0, Ainv, Ainv); /* now apply permutation p to the matrix */ /* compute L^{-T} D^{-1} L^{-1} P^T */ for (i = 0; i < N; ++i) { v1 = gsl_matrix_row(Ainv, i); gsl_permute_vector_inverse(p, &v1.vector); } /* compute P L^{-T} D^{-1} L^{-1} P^T */ for (i = 0; i < N; ++i) { v1 = gsl_matrix_column(Ainv, i); gsl_permute_vector_inverse(p, &v1.vector); } return GSL_SUCCESS; } } int gsl_linalg_pcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * p, double * rcond, gsl_vector * work) { const size_t M = LDLT->size1; const size_t N = LDLT->size2; if (M != N) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; double Anorm = cholesky_LDLT_norm1(LDLT, p, work); /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ pcholesky_params params; *rcond = 0.0; /* don't continue if matrix is singular */ if (Anorm == 0.0) return GSL_SUCCESS; params.LDLT = LDLT; params.perm = p; /* estimate ||A^{-1}||_1 */ status = gsl_linalg_invnorm1(N, cholesky_LDLT_Ainv, ¶ms, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* cholesky_LDLT_norm1 Compute 1-norm of original matrix A, stored in upper triangle of LDLT; diagonal entries have to be reconstructed Inputs: LDLT - Cholesky L D L^T decomposition (lower triangle) with original matrix in upper triangle p - permutation vector work - workspace, length 2*N */ static double cholesky_LDLT_norm1(const gsl_matrix * LDLT, const gsl_permutation * p, gsl_vector * work) { const size_t N = LDLT->size1; gsl_vector_const_view D = gsl_matrix_const_diagonal(LDLT); gsl_vector_view diagA = gsl_vector_subvector(work, N, N); double max = 0.0; size_t i, j; /* reconstruct diagonal entries of original matrix A */ for (j = 0; j < N; ++j) { double Ajj; /* compute diagonal (j,j) entry of A */ Ajj = gsl_vector_get(&D.vector, j); for (i = 0; i < j; ++i) { double Di = gsl_vector_get(&D.vector, i); double Lji = gsl_matrix_get(LDLT, j, i); Ajj += Di * Lji * Lji; } gsl_vector_set(&diagA.vector, j, Ajj); } gsl_permute_vector_inverse(p, &diagA.vector); for (j = 0; j < N; ++j) { double sum = 0.0; double Ajj = gsl_vector_get(&diagA.vector, j); for (i = 0; i < j; ++i) { double *wi = gsl_vector_ptr(work, i); double Aij = gsl_matrix_get(LDLT, i, j); double absAij = fabs(Aij); sum += absAij; *wi += absAij; } gsl_vector_set(work, j, sum + fabs(Ajj)); } for (i = 0; i < N; ++i) { double wi = gsl_vector_get(work, i); max = GSL_MAX(max, wi); } return max; } /* x := A^{-1} x = A^{-t} x, A = L D L^T */ static int cholesky_LDLT_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { int status; pcholesky_params *par = (pcholesky_params *) params; (void) TransA; /* unused parameter warning */ status = gsl_linalg_pcholesky_svx(par->LDLT, par->perm, x); return status; } gsl-doc-2.3/linalg/lu.c0000664000175000017500000001775013017374153013032 0ustar eddedd/* linalg/lu.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #define REAL double static int singular (const gsl_matrix * LU); /* 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 if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; /* Copy x <- b */ gsl_vector_memcpy (x, b); /* Solve for x */ status = gsl_linalg_LU_svx (LU, p, x); return status; } } 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 if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } 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 * work) { 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 if (LU->size1 != work->size) { GSL_ERROR ("matrix size must match workspace size", GSL_EBADLEN); } else if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; /* Compute residual = (A * x - b) */ gsl_vector_memcpy (work, b); gsl_blas_dgemv (CblasNoTrans, 1.0, A, x, -1.0, work); /* Find correction, delta = - (A^-1) * residual, and apply it */ status = gsl_linalg_LU_svx (LU, p, work); gsl_blas_daxpy (-1.0, work, x); return status; } } 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; if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } 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; } static int singular (const gsl_matrix * LU) { size_t i, n = LU->size1; for (i = 0; i < n; i++) { double u = gsl_matrix_get (LU, i, i); if (u == 0) return 1; } return 0; } gsl-doc-2.3/linalg/qrpt.c0000644000175000017500000004114112756612600013366 0ustar eddedd/* linalg/qrpt.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #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; } } /* Find the least squares solution to the overdetermined system * * A x = b * * for M >= N using the QRPT factorization A P = Q R. Assumes * A has full column rank. */ int gsl_linalg_QRPT_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x, gsl_vector * residual) { const size_t N = QR->size2; int status = gsl_linalg_QRPT_lssolve2(QR, tau, p, b, N, x, residual); return status; } /* Find the least squares solution to the overdetermined system * * A x = b * * for M >= N using the QRPT factorization A P = Q R, where A * is assumed rank deficient with a given rank. */ int gsl_linalg_QRPT_lssolve2 (const gsl_matrix * QR, const gsl_vector * tau, const gsl_permutation * p, const gsl_vector * b, const size_t rank, 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 (rank == 0 || rank > N) { GSL_ERROR ("rank must have 0 < rank <= N", 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 R11 = gsl_matrix_const_submatrix (QR, 0, 0, rank, rank); gsl_vector_view QTb1 = gsl_vector_subvector(residual, 0, rank); gsl_vector_view x1 = gsl_vector_subvector(x, 0, rank); size_t i; /* compute work = Q^T b */ gsl_vector_memcpy(residual, b); gsl_linalg_QR_QTvec (QR, tau, residual); /* solve R_{11} x(1:r) = [Q^T b](1:r) */ gsl_vector_memcpy(&(x1.vector), &(QTb1.vector)); gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, &(R11.matrix), &(x1.vector)); /* x(r+1:N) = 0 */ for (i = rank; i < N; ++i) gsl_vector_set(x, i, 0.0); /* compute x = P y */ gsl_permute_vector_inverse (p, x); /* compute residual = b - A x = Q (Q^T b - R x) */ gsl_vector_set_zero(&(QTb1.vector)); gsl_linalg_QR_Qvec(QR, tau, residual); 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) { 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); gsl_linalg_givens (wkm1, wk, &c, &s); gsl_linalg_givens_gv (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 < 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); gsl_linalg_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; } } /* gsl_linalg_QRPT_rank() Estimate rank of triangular matrix from QRPT decomposition Inputs: QR - QRPT decomposed matrix tol - tolerance for rank determination; if < 0, a default value is used: 20 * (M + N) * eps(max(|diag(R)|)) Return: rank estimate */ size_t gsl_linalg_QRPT_rank (const gsl_matrix * QR, const double tol) { const size_t M = QR->size1; const size_t N = QR->size2; gsl_vector_const_view diag = gsl_matrix_const_diagonal(QR); double eps; size_t i; size_t r = 0; if (tol < 0.0) { double min, max, absmax; int ee; gsl_vector_minmax(&diag.vector, &min, &max); absmax = GSL_MAX(fabs(min), fabs(max)); ee = (int) log2(absmax); eps = 20.0 * (M + N) * pow(2.0, (double) ee) * GSL_DBL_EPSILON; } else eps = tol; /* count number of diagonal elements with |di| > eps */ for (i = 0; i < GSL_MIN(M, N); ++i) { double di = gsl_vector_get(&diag.vector, i); if (fabs(di) > eps) ++r; } return r; } int gsl_linalg_QRPT_rcond(const gsl_matrix * QR, double * rcond, gsl_vector * work) { const size_t M = QR->size1; const size_t N = QR->size2; if (M < N) { GSL_ERROR ("M must be >= N", GSL_EBADLEN); } else if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { gsl_matrix_const_view R = gsl_matrix_const_submatrix (QR, 0, 0, N, N); int status; status = gsl_linalg_tri_upper_rcond(&R.matrix, rcond, work); return status; } } gsl-doc-2.3/linalg/tridiag.c0000664000175000017500000003707512616157443014044 0ustar eddedd/* linalg/tridiag.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "tridiag.h" #include /* 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 = GSL_SUCCESS; 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) { GSL_ERROR("failed to allocate working space", 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]; if (alpha[0] == 0) { status = GSL_EZERODIV; } 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 (alpha[i] == 0) { status = GSL_EZERODIV; } } 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)]; } } } if (z != 0) free (z); if (c != 0) free (c); if (alpha != 0) free (alpha); if (gamma != 0) free (gamma); if (status == GSL_EZERODIV) { GSL_ERROR ("matrix must be positive definite", status); } 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 = GSL_SUCCESS; double *alpha = (double *) malloc (N * sizeof (double)); double *z = (double *) malloc (N * sizeof (double)); if (alpha == 0 || z == 0) { GSL_ERROR("failed to allocate working space", GSL_ENOMEM); } else { size_t i, j; /* Bidiagonalization (eliminating belowdiag) & rhs update diag' = alpha rhs' = z */ alpha[0] = diag[0]; z[0] = rhs[0]; if (alpha[0] == 0) { status = GSL_EZERODIV; } 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]; if (alpha[i] == 0) { status = GSL_EZERODIV; } } /* 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]; } } } if (z != 0) free (z); if (alpha != 0) free (alpha); if (status == GSL_EZERODIV) { GSL_ERROR ("matrix must be positive definite", status); } 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 = GSL_SUCCESS; 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) { GSL_ERROR("failed to allocate working space", GSL_ENOMEM); } else { size_t i, j; double sum = 0.0; /* factor */ if (N == 1) { x[0] = b[0] / diag[0]; free(delta); free(gamma); free(alpha); free(c); free(z); return GSL_SUCCESS; } alpha[0] = diag[0]; gamma[0] = offdiag[0] / alpha[0]; delta[0] = offdiag[o_stride * (N-1)] / alpha[0]; if (alpha[0] == 0) { status = GSL_EZERODIV; } 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]; if (alpha[i] == 0) { status = GSL_EZERODIV; } } 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)]; } } } 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); if (status == GSL_EZERODIV) { GSL_ERROR ("matrix must be positive definite", status); } 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 = GSL_SUCCESS; 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)); if (alpha == 0 || zb == 0 || zu == 0 || w == 0) { GSL_ERROR("failed to allocate working space", GSL_ENOMEM); } else { double beta; /* 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; if (alpha[0] == 0) { status = GSL_EZERODIV; } { 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; } } } { 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; } } /* backsubstitution */ { size_t i, j; w[N-1] = zu[N-1]/alpha[N-1]; x[x_stride*(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; } { size_t i; for (i = 0; i < N; i++) x[i*x_stride] -= vx/(1 + vw)*w[i]; } } } if (zb != 0) free (zb); if (zu != 0) free (zu); if (w != 0) free (w); if (alpha != 0) free (alpha); if (status == GSL_EZERODIV) { GSL_ERROR ("matrix must be positive definite", status); } 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); } } gsl-doc-2.3/linalg/hesstri.c0000664000175000017500000001264512616157443014076 0ustar eddedd/* linalg/hesstri.c * * Copyright (C) 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* * This module contains routines related to the Hessenberg-Triangular * reduction of two general real matrices * * See Golub & Van Loan, "Matrix Computations", 3rd ed, sec 7.7.4 */ /* gsl_linalg_hesstri_decomp() Perform a reduction to generalized upper Hessenberg form. Given A and B, this function overwrites A with an upper Hessenberg matrix H = U^T A V and B with an upper triangular matrix R = U^T B V with U and V orthogonal. See Golub & Van Loan, "Matrix Computations" (3rd ed) algorithm 7.7.1 Inputs: A - real square matrix B - real square matrix U - (output) if non-null, U is stored here on output V - (output) if non-null, V is stored here on output work - workspace (length n) Return: success or error */ int gsl_linalg_hesstri_decomp(gsl_matrix * A, gsl_matrix * B, gsl_matrix * U, gsl_matrix * V, gsl_vector * work) { const size_t N = A->size1; if ((N != A->size2) || (N != B->size1) || (N != B->size2)) { GSL_ERROR ("Hessenberg-triangular reduction requires square matrices", GSL_ENOTSQR); } else if (N != work->size) { GSL_ERROR ("length of workspace must match matrix dimension", GSL_EBADLEN); } else { double cs, sn; /* rotation parameters */ size_t i, j; /* looping */ gsl_vector_view xv, yv; /* temporary views */ /* B -> Q^T B = R (upper triangular) */ gsl_linalg_QR_decomp(B, work); /* A -> Q^T A */ gsl_linalg_QR_QTmat(B, work, A); /* initialize U and V if desired */ if (U) { gsl_linalg_QR_unpack(B, work, U, B); } else { /* zero out lower triangle of B */ for (j = 0; j < N - 1; ++j) { for (i = j + 1; i < N; ++i) gsl_matrix_set(B, i, j, 0.0); } } if (V) gsl_matrix_set_identity(V); if (N < 3) return GSL_SUCCESS; /* nothing more to do */ /* reduce A and B */ for (j = 0; j < N - 2; ++j) { for (i = N - 1; i >= (j + 2); --i) { /* step 1: rotate rows i - 1, i to kill A(i,j) */ /* * compute G = [ CS SN ] so that G^t [ A(i-1,j) ] = [ * ] * [-SN CS ] [ A(i, j) ] [ 0 ] */ gsl_linalg_givens(gsl_matrix_get(A, i - 1, j), gsl_matrix_get(A, i, j), &cs, &sn); /* invert so drot() works correctly (G -> G^t) */ sn = -sn; /* compute G^t A(i-1:i, j:n) */ xv = gsl_matrix_subrow(A, i - 1, j, N - j); yv = gsl_matrix_subrow(A, i, j, N - j); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); /* compute G^t B(i-1:i, i-1:n) */ xv = gsl_matrix_subrow(B, i - 1, i - 1, N - i + 1); yv = gsl_matrix_subrow(B, i, i - 1, N - i + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (U) { /* accumulate U: U -> U G */ xv = gsl_matrix_column(U, i - 1); yv = gsl_matrix_column(U, i); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } /* step 2: rotate columns i, i - 1 to kill B(i, i - 1) */ gsl_linalg_givens(-gsl_matrix_get(B, i, i), gsl_matrix_get(B, i, i - 1), &cs, &sn); /* invert so drot() works correctly (G -> G^t) */ sn = -sn; /* compute B(1:i, i-1:i) G */ xv = gsl_matrix_subcolumn(B, i - 1, 0, i + 1); yv = gsl_matrix_subcolumn(B, i, 0, i + 1); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); /* apply to A(1:n, i-1:i) */ xv = gsl_matrix_column(A, i - 1); yv = gsl_matrix_column(A, i); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); if (V) { /* accumulate V: V -> V G */ xv = gsl_matrix_column(V, i - 1); yv = gsl_matrix_column(V, i); gsl_blas_drot(&xv.vector, &yv.vector, cs, sn); } } } return GSL_SUCCESS; } } /* gsl_linalg_hesstri_decomp() */ gsl-doc-2.3/linalg/luc.c0000664000175000017500000002233713017374325013173 0ustar eddedd/* linalg/luc.c * * Copyright (C) 2001, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include static int singular (const gsl_matrix_complex * LU); /* 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 if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; /* Copy x <- b */ gsl_vector_complex_memcpy (x, b); /* Solve for x */ status = gsl_linalg_complex_LU_svx (LU, p, x); return status; } } 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 if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } 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 * work) { 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 if (LU->size1 != work->size) { GSL_ERROR ("matrix size must match workspace size", GSL_EBADLEN); } else if (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; /* Compute residual = (A * x - b) */ gsl_vector_complex_memcpy (work, b); { gsl_complex one = GSL_COMPLEX_ONE; gsl_complex negone = GSL_COMPLEX_NEGONE; gsl_blas_zgemv (CblasNoTrans, one, A, x, negone, work); } /* Find correction, delta = - (A^-1) * residual, and apply it */ status = gsl_linalg_complex_LU_svx (LU, p, work); { gsl_complex negone= GSL_COMPLEX_NEGONE; gsl_blas_zaxpy (negone, work, x); } return status; } } 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; } static int singular (const gsl_matrix_complex * LU) { size_t i, n = LU->size1; for (i = 0; i < n; i++) { gsl_complex u = gsl_matrix_complex_get (LU, i, i); if (GSL_REAL(u) == 0 && GSL_IMAG(u) == 0) return 1; } return 0; } gsl-doc-2.3/linalg/householder.c0000664000175000017500000002117212616157443014731 0ustar eddedd/* linalg/householder.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* gsl_linalg_householder_transform() Compute a householder transformation (tau,v) of a vector x so that P x = [ I - tau*v*v' ] x annihilates x(1:n-1) Inputs: v - on input, x vector on output, householder vector v Notes: 1) on output, v is normalized so that v[0] = 1. The 1 is not actually stored; instead v[0] = -sign(x[0])*||x|| so that: P x = v[0] * e_1 Therefore external routines should take care when applying the projection matrix P to vectors, taking into account that v[0] should be 1 when doing so. */ 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 ; { double s = (alpha - beta); if (fabs(s) > GSL_DBL_MIN) { gsl_blas_dscal (1.0 / s, &x.vector); gsl_vector_set (v, 0, beta) ; } else { gsl_blas_dscal (GSL_DBL_EPSILON / s, &x.vector); gsl_blas_dscal (1.0 / GSL_DBL_EPSILON, &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 w0 = 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); /* compute d1 = v(2:n)'w(2:n) */ gsl_blas_ddot (&v1.vector, &w1.vector, &d1); /* compute d = v'w = w(1) + d1 since v(1) = 1 */ d = w0 + d1; /* compute w = w - tau (v) (v'w) */ 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; } gsl-doc-2.3/linalg/svdstep.c0000664000175000017500000003213412621461163014071 0ustar eddedd/* linalg/svdstep.c * * Copyright (C) 2007, 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 mu; #if GOLUB_VAN_LOAN_8_3_2 /* Golub and van Loan, Algorithm 8.3.2 The full SVD algorithm is described in section 8.6.2 */ double ta = da * da + fa * fa; double tb = db * db + fb * fb; double tab = da * fb; double dt = (ta - tb) / 2.0; if (dt >= 0) { mu = tb - (tab * tab) / (dt + hypot (dt, tab)); } else { mu = tb + (tab * tab) / ((-dt) + hypot (dt, tab)); } #else { /* We can compute mu more accurately than using the formula above since we know the roots cannot be negative. This also avoids the possibility of NaNs in the formula above. The matrix is [ da^2 + fa^2, da fb ; da fb , db^2 + fb^2 ] and mu is the eigenvalue closest to the bottom right element. */ double ta = da * da + fa * fa; double tb = db * db + fb * fb; double tab = da * fb; double dt = (ta - tb) / 2.0; double S = ta + tb; double da2 = da * da, db2 = db * db; double fa2 = fa * fa, fb2 = fb * fb; double P = (da2 * db2) + (fa2 * db2) + (fa2 * fb2); double D = hypot(dt, tab); double r1 = S/2 + D; if (dt >= 0) { /* tb < ta, choose smaller root */ mu = (r1 > 0) ? P / r1 : 0.0; } else { /* tb > ta, choose larger root */ mu = r1; } } #endif return mu; } static void create_schur (double d0, double f0, double d1, double * c, double * s) { double apq = 2.0 * d0 * f0; if (d0 == 0 || f0 == 0) { *c = 1.0; *s = 0.0; return; } /* Check if we need to rescale to avoid underflow/overflow */ if (fabs(d0) < GSL_SQRT_DBL_MIN || fabs(d0) > GSL_SQRT_DBL_MAX || fabs(f0) < GSL_SQRT_DBL_MIN || fabs(f0) > GSL_SQRT_DBL_MAX || fabs(d1) < GSL_SQRT_DBL_MIN || fabs(d1) > GSL_SQRT_DBL_MAX) { double scale; int d0_exp, f0_exp; frexp(d0, &d0_exp); frexp(f0, &f0_exp); /* Bring |d0*f0| into the range GSL_DBL_MIN to GSL_DBL_MAX */ scale = ldexp(1.0, -(d0_exp + f0_exp)/4); d0 *= scale; f0 *= scale; d1 *= scale; 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] */ gsl_linalg_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] */ gsl_linalg_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); } gsl_linalg_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++) { gsl_linalg_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;) { gsl_linalg_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; 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 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; } for (k = 0; k < n - 1; k++) { double c, s; gsl_linalg_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; } gsl_linalg_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); } gsl-doc-2.3/linalg/tridiag.h0000664000175000017500000000363712616157443014046 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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__ */ gsl-doc-2.3/linalg/balance.c0000664000175000017500000000373612616157443014003 0ustar eddedd/* linalg/balance.c * * Copyright (C) 2001, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 * * A_new = A D^{-1} * * where D is a diagonal matrix */ #include #include #include #include #include #include #include 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; } gsl-doc-2.3/linalg/qr.c0000664000175000017500000003647512701023634013033 0ustar eddedd/* linalg/qr.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 M", 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 M", GSL_EBADLEN); } else { size_t i; /* compute Q v */ for (i = GSL_MIN (M, N); i-- > 0;) { 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 product Q^T A from a QR factorized matrix */ int gsl_linalg_QR_QTmat (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A) { 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 (A->size1 != M) { GSL_ERROR ("matrix must have M rows", GSL_EBADLEN); } else { size_t i; /* compute Q^T A */ 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_matrix_view m = gsl_matrix_submatrix(A, i, 0, M - i, A->size2); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_hm (ti, &(h.vector), &(m.matrix)); } return GSL_SUCCESS; } } /* Form the product A Q from a QR factorized matrix */ int gsl_linalg_QR_matQ (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A) { 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 (A->size2 != M) { GSL_ERROR ("matrix must have M columns", GSL_EBADLEN); } else { size_t i; /* compute A Q */ 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_matrix_view m = gsl_matrix_submatrix(A, 0, i, A->size1, M - i); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_mh (ti, &(h.vector), &(m.matrix)); } 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;) { 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--) /* loop from k = M-1 to 1 */ { double c, s; double wk = gsl_vector_get (w, k); double wkm1 = gsl_vector_get (w, k - 1); gsl_linalg_givens (wkm1, wk, &c, &s); gsl_linalg_givens_gv (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); gsl_linalg_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; } } gsl-doc-2.3/linalg/test.c0000644000175000017500000040223312761321154013357 0ustar eddedd/* linalg/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2005, 2006, 2007, 2010 Gerard Jungman, Brian Gough * Copyright (C) Huan Wu (test_choleskyc_invert and test_choleskyc_invert_dim) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include "test_cholesky.c" #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); gsl_matrix * create_sparse_matrix(unsigned long m, unsigned long n); 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, const double expected_rcond, double eps); int test_QRPT_decomp(void); int test_QRPT_lssolve_dim(const gsl_matrix * m, const double * actual, double eps); int test_QRPT_lssolve(void); int test_QRPT_lssolve2_dim(const gsl_matrix * m, const double * actual, double eps); int test_QRPT_lssolve2(void); int test_QR_update_dim(const gsl_matrix * m, double eps); int test_QR_update(void); int test_QRPT_update_dim(const gsl_matrix * m, double eps); int test_QRPT_update(void); int test_COD_decomp_dim(const gsl_matrix * m, double eps); int test_COD_decomp(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_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_vector * vector_alloc (size_t n) { size_t p[5] = {3, 5, 7, 11, 13}; static size_t k = 0; size_t stride = p[k]; k = (k + 1) % 5; { gsl_block * b = gsl_block_alloc (n * stride); gsl_vector * v = gsl_vector_alloc_from_block (b, 0, n, stride); v->owner = 1; return v; } } void vector_free (gsl_vector * v) { gsl_vector_free (v); } gsl_matrix * create_hilbert_matrix(unsigned long size) { unsigned long i, j; gsl_matrix * m = gsl_matrix_alloc(size, size); for(i=0; isize1; size_t i, j; gsl_matrix_set_zero(m); for (i = 0; i < N; ++i) { for (j = 0; j <= i; ++j) { double mij = gsl_rng_uniform(r); /* put lower bound on diagonal entries to ensure invertibility */ if (i == j) mij = GSL_MAX(mij, 0.3); if (Uplo == CblasLower) gsl_matrix_set(m, i, j, mij); else gsl_matrix_set(m, j, i, mij); if (Diag == CblasUnit && i == j) gsl_matrix_set(m, i, j, 1.0); } } return GSL_SUCCESS; } 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; gsl_matrix * dblmin3, * dblmin5, * dblsubnorm5; gsl_matrix * bigsparse; 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; isize1; 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; isize1; 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; isize1; 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; isize1, 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; isize1, 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; isize1, N = m->size2; gsl_vector * rhs = gsl_vector_alloc(M); gsl_matrix * QRPT = gsl_matrix_alloc(M,N); gsl_vector * tau = 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_permutation * perm = gsl_permutation_alloc(N); gsl_vector * work = gsl_vector_alloc(N); int signum; gsl_matrix_memcpy(QRPT, m); for(i = 0; i < M; i++) gsl_vector_set(rhs, i, i + 1.0); s += gsl_linalg_QRPT_decomp(QRPT, tau, perm, &signum, work); s += gsl_linalg_QRPT_lssolve(QRPT, tau, perm, 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(tau); gsl_matrix_free(QRPT); gsl_vector_free(rhs); gsl_permutation_free(perm); gsl_vector_free(work); return s; } int test_QRPT_lssolve(void) { int f; int s = 0; f = test_QRPT_lssolve_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve m(5,3)"); s += f; f = test_QRPT_lssolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve hilbert(2)"); s += f; f = test_QRPT_lssolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve hilbert(3)"); s += f; f = test_QRPT_lssolve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve hilbert(4)"); s += f; f = test_QRPT_lssolve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " QRPT_lssolve hilbert(12)"); s += f; f = test_QRPT_lssolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve vander(2)"); s += f; f = test_QRPT_lssolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve vander(3)"); s += f; f = test_QRPT_lssolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve vander(4)"); s += f; f = test_QRPT_lssolve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " QRPT_lssolve vander(12)"); s += f; return s; } int test_QRPT_lssolve2_dim(const gsl_matrix * m, const double * actual, double eps) { int s = 0; size_t i, M = m->size1, N = m->size2; gsl_vector * rhs = gsl_vector_alloc(M); gsl_matrix * QRPT = gsl_matrix_alloc(M,N); gsl_vector * tau = 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_permutation * perm = gsl_permutation_alloc(N); gsl_vector * work = gsl_vector_alloc(N); int signum; size_t rank; gsl_matrix_memcpy(QRPT, m); for(i = 0; i < M; i++) gsl_vector_set(rhs, i, i + 1.0); s += gsl_linalg_QRPT_decomp(QRPT, tau, perm, &signum, work); rank = gsl_linalg_QRPT_rank(QRPT, -1.0); s += gsl_linalg_QRPT_lssolve2(QRPT, tau, perm, rhs, rank, x, res); if (M > N) { 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(tau); gsl_matrix_free(QRPT); gsl_vector_free(rhs); gsl_permutation_free(perm); gsl_vector_free(work); return s; } int test_QRPT_lssolve2(void) { int f; int s = 0; f = test_QRPT_lssolve2_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 m(5,3)"); s += f; f = test_QRPT_lssolve2_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 hilbert(2)"); s += f; f = test_QRPT_lssolve2_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 hilbert(3)"); s += f; f = test_QRPT_lssolve2_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 hilbert(4)"); s += f; f = test_QRPT_lssolve2_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " QRPT_lssolve2 hilbert(12)"); s += f; f = test_QRPT_lssolve2_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 vander(2)"); s += f; f = test_QRPT_lssolve2_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 vander(3)"); s += f; f = test_QRPT_lssolve2_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_lssolve2 vander(4)"); s += f; f = test_QRPT_lssolve2_dim(vander12, vander12_solution, 0.05); gsl_test(f, " QRPT_lssolve2 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; isize1; 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; isize1, 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 * tau = 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, tau, perm, &signum, norm); s += gsl_linalg_QR_unpack(QR, tau, 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; } } if (expected_rcond > 0.0) { double rcond; int foo; gsl_vector * work = gsl_vector_alloc(3 * N); gsl_linalg_QRPT_rcond(QR, &rcond, work); foo = check(rcond, expected_rcond, 1.0e-10); if (foo) printf("QRPT_rcond (%3lu,%3lu): %22.18g %22.18g\n", M, N, rcond, expected_rcond); s += foo; gsl_vector_free(work); } gsl_permutation_free (perm); gsl_vector_free(norm); gsl_vector_free(tau); 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, -1.0, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp m(3,5)"); s += f; /* rcond value from LAPACK DTRCON */ f = test_QRPT_decomp_dim(m53, 2.915362697820e-03, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp m(5,3)"); s += f; f = test_QRPT_decomp_dim(s35, -1.0, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp s(3,5)"); s += f; f = test_QRPT_decomp_dim(s53, 1.002045825443827e-03, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp s(5,3)"); s += f; f = test_QRPT_decomp_dim(hilb2, 4.347826086956522e-02, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(2)"); s += f; f = test_QRPT_decomp_dim(hilb3, 1.505488055305100e-03, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(3)"); s += f; f = test_QRPT_decomp_dim(hilb4, 4.872100915910022e-05, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(4)"); s += f; f = test_QRPT_decomp_dim(hilb12, -1.0, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(12)"); s += f; f = test_QRPT_decomp_dim(vander2, 1.249999999999999e-01, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(2)"); s += f; f = test_QRPT_decomp_dim(vander3, 9.708737864077667e-03, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(3)"); s += f; f = test_QRPT_decomp_dim(vander4, 5.255631229339451e-04, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(4)"); s += f; f = test_QRPT_decomp_dim(vander12, -1.0, 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_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; isize1, N = m->size2; 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 * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_vector * norm = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(qr1,m); gsl_matrix_memcpy(qr2,m); for(i=0; isize1, N = m->size2; size_t rank; gsl_matrix * QRZT = gsl_matrix_alloc(M, N); gsl_matrix * Q = gsl_matrix_alloc(M, M); gsl_matrix * R = gsl_matrix_alloc(M, N); gsl_matrix * QR = gsl_matrix_alloc(M, N); gsl_matrix * Z = gsl_matrix_alloc(N, N); gsl_vector * tau_Q = gsl_vector_alloc(GSL_MIN(M, N)); gsl_vector * tau_Z = gsl_vector_alloc(GSL_MIN(M, N)); gsl_vector * work = gsl_vector_alloc(N); gsl_matrix * lhs = gsl_matrix_alloc(M, N); gsl_matrix * rhs = gsl_matrix_alloc(M, N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(QRZT, m); s += gsl_linalg_COD_decomp(QRZT, tau_Q, tau_Z, perm, &rank, work); s += gsl_linalg_COD_unpack(QRZT, tau_Q, tau_Z, rank, Q, R, Z); /* compute lhs = m P */ gsl_matrix_memcpy(lhs, m); gsl_permute_matrix(perm, lhs); /* compute rhs = Q R Z */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, Q, R, 0.0, QR); gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, QR, Z, 0.0, rhs); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(rhs, i, j); double bij = gsl_matrix_get(lhs, i, j); int foo = check(aij, bij, eps); if (foo) { printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i, j, aij, bij); } s += foo; } } gsl_permutation_free (perm); gsl_vector_free(work); gsl_vector_free(tau_Q); gsl_vector_free(tau_Z); gsl_matrix_free(QRZT); gsl_matrix_free(lhs); gsl_matrix_free(rhs); gsl_matrix_free(QR); gsl_matrix_free(Q); gsl_matrix_free(R); gsl_matrix_free(Z); return s; } int test_COD_decomp(void) { int f; int s = 0; f = test_COD_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp m(3,5)"); s += f; f = test_COD_decomp_dim(m53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp m(5,3)"); s += f; f = test_COD_decomp_dim(s35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp s(3,5)"); s += f; f = test_COD_decomp_dim(s53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp s(5,3)"); s += f; f = test_COD_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp hilbert(2)"); s += f; f = test_COD_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp hilbert(3)"); s += f; f = test_COD_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp hilbert(4)"); s += f; f = test_COD_decomp_dim(hilb12, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp hilbert(12)"); s += f; f = test_COD_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp vander(2)"); s += f; f = test_COD_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp vander(3)"); s += f; f = test_COD_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_decomp vander(4)"); s += f; f = test_COD_decomp_dim(vander12, 0.001); /* FIXME: bad accuracy */ gsl_test(f, " COD_decomp vander(12)"); s += f; return s; } int test_COD_lssolve_dim(const gsl_matrix * m, const double * actual, double eps) { int s = 0; size_t i, M = m->size1, N = m->size2; gsl_vector * lhs = gsl_vector_alloc(M); gsl_vector * rhs = gsl_vector_alloc(M); gsl_matrix * QRZT = gsl_matrix_alloc(M, N); gsl_vector * tau_Q = gsl_vector_alloc(GSL_MIN(M, N)); gsl_vector * tau_Z = gsl_vector_alloc(GSL_MIN(M, N)); gsl_vector * work = 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_permutation * perm = gsl_permutation_alloc(N); size_t rank; gsl_matrix_memcpy(QRZT, m); for (i = 0; i < M; i++) gsl_vector_set(rhs, i, i + 1.0); s += gsl_linalg_COD_decomp(QRZT, tau_Q, tau_Z, perm, &rank, work); s += gsl_linalg_COD_lssolve(QRZT, tau_Q, tau_Z, perm, rank, rhs, x, res); if (M > N) { 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("res (%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(tau_Q); gsl_vector_free(tau_Z); gsl_matrix_free(QRZT); gsl_vector_free(rhs); gsl_vector_free(lhs); gsl_vector_free(work); gsl_permutation_free(perm); return s; } int test_COD_lssolve(void) { int f; int s = 0; f = test_COD_lssolve_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve m(5,3)"); s += f; f = test_COD_lssolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve hilbert(2)"); s += f; f = test_COD_lssolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve hilbert(3)"); s += f; f = test_COD_lssolve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve hilbert(4)"); s += f; f = test_COD_lssolve_dim(hilb12, hilb12_solution, 1.0e-5); gsl_test(f, " COD_lssolve hilbert(12)"); s += f; f = test_COD_lssolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve vander(2)"); s += f; f = test_COD_lssolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve vander(3)"); s += f; f = test_COD_lssolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " COD_lssolve vander(4)"); s += f; f = test_COD_lssolve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " COD_lssolve 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; isize1; 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; isize1, 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; isize1, 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; isize1; 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; isize1; 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; isize1, 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; isize1, 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; isize1; 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; isize1, N = m->size2; unsigned long input_nans = 0; 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); /* Check for nans in the input */ for (i = 0; i 0) continue; /* skip NaNs if present in input */ else { s++; printf("bad singular value %lu = %22.18g\n", i, di); } } 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; idata; 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; idata; 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; idata; 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; isize1; gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * u = gsl_matrix_alloc(dim,dim); gsl_vector * x = gsl_vector_calloc(dim); gsl_vector * D = gsl_vector_calloc(dim); gsl_matrix_memcpy(u,m); for(i=0; isize1; 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_choleskyc_solve_dim(const gsl_matrix_complex * m, const gsl_vector_complex * actual, double eps) { int s = 0; unsigned long i, dim = m->size1; gsl_complex z; gsl_vector_complex * rhs = gsl_vector_complex_alloc(dim); gsl_matrix_complex * u = gsl_matrix_complex_alloc(dim,dim); gsl_vector_complex * x = gsl_vector_complex_calloc(dim); GSL_SET_IMAG(&z, 0.0); gsl_matrix_complex_memcpy(u,m); for(i=0; isize1, N = m->size2; gsl_matrix_complex * v = gsl_matrix_complex_alloc(M,N); gsl_matrix_complex * a = gsl_matrix_complex_alloc(M,N); gsl_matrix_complex * l = gsl_matrix_complex_alloc(M,N); gsl_matrix_complex * lh = gsl_matrix_complex_alloc(N,N); gsl_matrix_complex_memcpy(v, m); gsl_matrix_complex_set_zero(l); gsl_matrix_complex_set_zero(lh); s += gsl_linalg_complex_cholesky_decomp(v); /* Compute L L^H */ for (i = 0; i < N ; i++) { for (j = 0; j <= i; j++) { gsl_complex vij = gsl_matrix_complex_get(v, i, j); gsl_matrix_complex_set (l, i, j, vij); gsl_matrix_complex_set (lh, j, i, gsl_complex_conjugate(vij)); } } /* compute a = l lh */ gsl_blas_zgemm (CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, l, lh, GSL_COMPLEX_ZERO, a); for(i=0; isize1; gsl_complex af, bt; gsl_matrix_complex * v = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * c = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex_memcpy(v, m); s += gsl_linalg_complex_cholesky_decomp(v); s += gsl_linalg_complex_cholesky_invert(v); GSL_SET_COMPLEX(&af, 1.0, 0.0); GSL_SET_COMPLEX(&bt, 0.0, 0.0); gsl_blas_zhemm(CblasLeft, CblasUpper, af, m, v, bt, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { int foo; gsl_complex cij = gsl_matrix_complex_get(c, i, j); double expected, actual; /* check real part */ if (i == j) expected = 1.0; else expected = 0.0; actual = GSL_REAL(cij); foo = check(actual, expected, eps); if (foo) printf("REAL(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", N, N, i,j, actual, expected); s += foo; /* check imaginary part */ expected = 0.0; actual = GSL_IMAG(cij); foo = check(actual, expected, eps); if (foo) printf("IMAG(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", N, N, i,j, actual, expected); s += foo; } } gsl_matrix_complex_free(v); gsl_matrix_complex_free(c); return s; } int test_choleskyc_invert(void) { int f; int s = 0; double dat2[] = { 92.303, 0.000, 10.858, 1.798, 10.858, -1.798, 89.027, 0.000 }; double dat3[] = { 59.75,0, 49.25,172.25, 66.75,-162.75, 49.25,-172.25, 555.5,0, -429,-333.5, 66.75,162.75, -429,333.5, 536.5,0 }; double dat4[] = { 102.108, 0.000, 14.721, 1.343, -17.480, 15.591, 3.308, -2.936, 14.721, -1.343, 101.970, 0.000, 11.671, -6.776, -5.009, -2.665, -17.480, -15.591, 11.671, 6.776, 105.071, 0.000, 3.396, 6.276, 3.308, 2.936, -5.009, 2.665, 3.396, -6.276, 107.128, 0.000 }; { gsl_matrix_complex_view rv2 = gsl_matrix_complex_view_array(dat2, 2, 2); f = test_choleskyc_invert_dim(&rv2.matrix, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " choleskyc_invert 2x2 Hermitian"); s += f; } { gsl_matrix_complex_view rv3 = gsl_matrix_complex_view_array(dat3, 3, 3); f = test_choleskyc_invert_dim(&rv3.matrix, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " choleskyc_invert 3x3 Hermitian"); s += f; } { gsl_matrix_complex_view rv4 = gsl_matrix_complex_view_array(dat4, 4, 4); f = test_choleskyc_invert_dim(&rv4.matrix, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " choleskyc_invert 4x4 Hermitian"); 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; isize1, 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 #include #include #include #include #include #include #include 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 U from the packed QR matrix */ int gsl_linalg_hermtd_unpack (const gsl_matrix_complex * A, const gsl_vector_complex * tau, gsl_matrix_complex * U, 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 (U->size1 != A->size1 || U->size2 != A->size1) { GSL_ERROR ("size of U 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 U to the identity */ gsl_matrix_complex_set_identity (U); for (i = N - 1; i-- > 0;) { 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 (U, 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; } } gsl-doc-2.3/ntuple/0000755000175000017500000000000013022553155012270 5ustar eddeddgsl-doc-2.3/ntuple/ntuple.c0000664000175000017500000001047112616157443013760 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include /* * 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; } gsl-doc-2.3/ntuple/Makefile.am0000664000175000017500000000160712616157443014342 0ustar eddeddnoinst_LTLIBRARIES = libgslntuple.la pkginclude_HEADERS = gsl_ntuple.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/ntuple/gsl_ntuple.h0000664000175000017500000000414512616157443014633 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/ntuple/Makefile.in0000644000175000017500000010454213022372406014341 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslntuple_la_LIBADD = am_libgslntuple_la_OBJECTS = ntuple.lo libgslntuple_la_OBJECTS = $(am_libgslntuple_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslntuple.la pkginclude_HEADERS = gsl_ntuple.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ntuple/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslntuple.la: $(libgslntuple_la_OBJECTS) $(libgslntuple_la_DEPENDENCIES) $(EXTRA_libgslntuple_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslntuple_la_OBJECTS) $(libgslntuple_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntuple.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/ntuple/ChangeLog0000664000175000017500000000042012616157443014050 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2004-05-30 Brian Gough * ntuple/test.c (main): choose ratio 1/(i+1.5) to avoid values exactly on test cutoff x=0.1 gsl-doc-2.3/ntuple/test.c0000664000175000017500000000677012616157443013437 0ustar eddedd#include #include #include #include #include #include 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 (); /* zero struct including padding bytes to avoid valgrind errors */ memset(&ntuple_row, 0, sizeof(struct data)); 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; } gsl-doc-2.3/bspline/0000755000175000017500000000000013022553155012415 5ustar eddeddgsl-doc-2.3/bspline/Makefile.am0000664000175000017500000000121312616157443014460 0ustar eddeddnoinst_LTLIBRARIES = libgslbspline.la pkginclude_HEADERS = gsl_bspline.h AM_CPPFLAGS = -I$(top_srcdir) libgslbspline_la_SOURCES = bspline.c greville.c noinst_HEADERS = bspline.h 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 ../statistics/libgslstatistics.la test_SOURCES = test.c gsl-doc-2.3/bspline/greville.c0000664000175000017500000001370712616157443014414 0ustar eddedd/* bspline/greville.c * * Copyright (C) 2006, 2007, 2008, 2009 Patrick Alken * Copyright (C) 2008, 2011 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* Return the location of the i-th Greville abscissa */ double gsl_bspline_greville_abscissa (size_t i, gsl_bspline_workspace *w) { const size_t stride = w->knots->stride; size_t km1 = w->km1; double * data = w->knots->data + (i+1)*stride; #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= gsl_bspline_ncoeffs(w))) { GSL_ERROR_VAL ("Greville abscissa index out of range", GSL_EINVAL, 0); } #endif if (km1 == 0) { /* Return interval midpoints in degenerate k = 1 case*/ km1 = 2; data -= stride; } return gsl_stats_mean(data, stride, km1); } int gsl_bspline_knots_greville (const gsl_vector *abscissae, gsl_bspline_workspace *w, double *abserr) { /* Limited function: see https://savannah.gnu.org/bugs/index.php?34361 */ int s; /* Check incoming arguments satisfy mandatory algorithmic assumptions */ if (w->k < 2) GSL_ERROR ("w->k must be at least 2", GSL_EINVAL); else if (abscissae->size < 2) GSL_ERROR ("abscissae->size must be at least 2", GSL_EINVAL); else if (w->nbreak != abscissae->size - w->k + 2) GSL_ERROR ("w->nbreak must equal abscissae->size - w->k + 2", GSL_EINVAL); if (w->nbreak == 2) { /* No flexibility in abscissae values possible in this degenerate case */ s = gsl_bspline_knots_uniform ( gsl_vector_get (abscissae, 0), gsl_vector_get (abscissae, abscissae->size - 1), w); } else { double * storage; gsl_matrix_view A; gsl_vector_view tau, b, x, r; size_t i, j; /* Constants derived from the B-spline workspace and abscissae details */ const size_t km2 = w->k - 2; const size_t M = abscissae->size - 2; const size_t N = w->nbreak - 2; const double invkm1 = 1.0 / w->km1; /* Allocate working storage and prepare multiple, zero-filled views */ storage = (double *) calloc (M*N + 2*N + 2*M, sizeof (double)); if (storage == 0) GSL_ERROR ("failed to allocate working storage", GSL_ENOMEM); A = gsl_matrix_view_array (storage, M, N); tau = gsl_vector_view_array (storage + M*N, N); b = gsl_vector_view_array (storage + M*N + N, M); x = gsl_vector_view_array (storage + M*N + N + M, N); r = gsl_vector_view_array (storage + M*N + N + M + N, M); /* Build matrix from interior breakpoints to interior Greville abscissae. * For example, when w->k = 4 and w->nbreak = 7 the matrix is * [ 1, 0, 0, 0, 0; * 2/3, 1/3, 0, 0, 0; * 1/3, 1/3, 1/3, 0, 0; * 0, 1/3, 1/3, 1/3, 0; * 0, 0, 1/3, 1/3, 1/3; * 0, 0, 0, 1/3, 2/3; * 0, 0, 0, 0, 1 ] * but only center formed as first/last breakpoint is known. */ for (j = 0; j < N; ++j) for (i = 0; i <= km2; ++i) gsl_matrix_set (&A.matrix, i+j, j, invkm1); /* Copy interior collocation points from abscissae into b */ for (i = 0; i < M; ++i) gsl_vector_set (&b.vector, i, gsl_vector_get (abscissae, i+1)); /* Adjust b to account for constraint columns not stored in A */ for (i = 0; i < km2; ++i) { double * const v = gsl_vector_ptr (&b.vector, i); *v -= (1 - (i+1)*invkm1) * gsl_vector_get (abscissae, 0); } for (i = 0; i < km2; ++i) { double * const v = gsl_vector_ptr (&b.vector, M - km2 + i); *v -= (i+1)*invkm1 * gsl_vector_get (abscissae, abscissae->size - 1); } /* Perform linear least squares to determine interior breakpoints */ s = gsl_linalg_QR_decomp (&A.matrix, &tau.vector) || gsl_linalg_QR_lssolve (&A.matrix, &tau.vector, &b.vector, &x.vector, &r.vector); if (s) { free (storage); return s; } /* "Expand" solution x by adding known first and last breakpoints. */ x = gsl_vector_view_array_with_stride ( gsl_vector_ptr (&x.vector, 0) - x.vector.stride, x.vector.stride, x.vector.size + 2); gsl_vector_set (&x.vector, 0, gsl_vector_get (abscissae, 0)); gsl_vector_set (&x.vector, x.vector.size - 1, gsl_vector_get (abscissae, abscissae->size - 1)); /* Finally, initialize workspace knots using the now-known breakpoints */ s = gsl_bspline_knots (&x.vector, w); free (storage); } /* Sum absolute errors in the resulting vs requested interior abscissae */ /* Provided as a fit quality metric which may be monitored by callers */ if (!s && abserr) { size_t i; *abserr = 0; for (i = 1; i < abscissae->size - 1; ++i) *abserr += fabs ( gsl_bspline_greville_abscissa (i, w) - gsl_vector_get (abscissae, i) ); } return s; } gsl-doc-2.3/bspline/TODO0000664000175000017500000000037712616157443013126 0ustar eddedd# -*- org -*- #+CATEGORY: bspline Add functions: 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 gsl-doc-2.3/bspline/bspline.h0000664000175000017500000000140212616157443014231 0ustar eddeddstatic inline size_t bspline_find_interval (const double x, int *flag, gsl_bspline_workspace * w); static inline int bspline_process_interval_for_eval (const double x, size_t * i, int flag, gsl_bspline_workspace * w); static void bspline_pppack_bsplvb (const gsl_vector * t, const size_t jhigh, const size_t index, const double x, const size_t left, size_t * j, gsl_vector * deltal, gsl_vector * deltar, gsl_vector * biatx); static void bspline_pppack_bsplvd (const gsl_vector * t, const size_t k, const double x, const size_t left, gsl_vector * deltal, gsl_vector * deltar, gsl_matrix * a, gsl_matrix * dbiatx, const size_t nderiv); gsl-doc-2.3/bspline/Makefile.in0000644000175000017500000010463113022372404014463 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslbspline_la_LIBADD = am_libgslbspline_la_OBJECTS = bspline.lo greville.lo libgslbspline_la_OBJECTS = $(am_libgslbspline_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 ../statistics/libgslstatistics.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslbspline.la pkginclude_HEADERS = gsl_bspline.h AM_CPPFLAGS = -I$(top_srcdir) libgslbspline_la_SOURCES = bspline.c greville.c noinst_HEADERS = bspline.h 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 ../statistics/libgslstatistics.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bspline/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslbspline.la: $(libgslbspline_la_OBJECTS) $(libgslbspline_la_DEPENDENCIES) $(EXTRA_libgslbspline_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslbspline_la_OBJECTS) $(libgslbspline_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/greville.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/bspline/ChangeLog0000664000175000017500000000300512616157443014177 0ustar eddedd2011-09-21 Rhys Ulerich * greville.c (gsl_bspline_knots_greville) Added routine to initialize breakpoints prescribed by specifying the desired Greville abscissae * test.c Add tests for the new gsl_bspline_knots_greville 2011-09-20 Rhys Ulerich * bspline.c (gsl_bspline_greville_abscissa) Greville-related logic moved to greville.c in preparation for upcoming gsl_bspline_knots_greville_abscissae functionality. 2009-08-12 Brian Gough * bspline.c (gsl_bspline_alloc): correct free to gsl_vector_free for components allocated with gsl_vector_alloc (gsl_bspline_deriv_alloc): correct free to gsl_matrix_free for components allocated with gsl_matrix_alloc 2009-07-21 Brian Gough * bspline.c (gsl_bspline_greville_abscissa): added function for greville abscissae 2009-07-09 Brian Gough * bspline.c (gsl_bspline_free): handle NULL argument in free (gsl_bspline_deriv_free): handle NULL argument in free 2008-12-09 Brian Gough * bspline.c (gsl_bspline_deriv_alloc): add size to derivative struct 2008-12-08 Brian Gough * gsl_bspline.h: preserve binary compatibility in workspaces 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2006-11-02 Brian Gough * added test program * initial checkin from P.Alken gsl-doc-2.3/bspline/gsl_bspline.h0000664000175000017500000000741112616157443015104 0ustar eddedd/* bspline/gsl_bspline.h * * Copyright (C) 2006 Patrick Alken * Copyright (C) 2008 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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 */ /* bspline derivative parameters */ gsl_matrix *A; /* work matrix */ gsl_matrix *dB; /* temporary derivative results */ } gsl_bspline_workspace; #ifndef GSL_DISABLE_DEPRECATED typedef struct { size_t k; /* spline order */ gsl_matrix *A; /* work matrix */ gsl_matrix *dB; /* temporary derivative results */ } gsl_bspline_deriv_workspace; gsl_bspline_deriv_workspace *gsl_bspline_deriv_alloc(const size_t k); void gsl_bspline_deriv_free(gsl_bspline_deriv_workspace *w); #endif /* !GSL_DISABLE_DEPRECATED */ 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); double gsl_bspline_greville_abscissa(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_knots_greville(const gsl_vector *abscissae, gsl_bspline_workspace *w, double *abserr); int gsl_bspline_eval(const double x, gsl_vector *B, gsl_bspline_workspace *w); int gsl_bspline_eval_nonzero(const double x, gsl_vector *Bk, size_t *istart, size_t *iend, gsl_bspline_workspace *w); int gsl_bspline_deriv_eval(const double x, const size_t nderiv, gsl_matrix *dB, gsl_bspline_workspace *w); int gsl_bspline_deriv_eval_nonzero(const double x, const size_t nderiv, gsl_matrix *dB, size_t *istart, size_t *iend, gsl_bspline_workspace *w); __END_DECLS #endif /* __GSL_BSPLINE_H__ */ gsl-doc-2.3/bspline/bspline.c0000664000175000017500000007042012616157443014232 0ustar eddedd/* bspline/bspline.c * * Copyright (C) 2006, 2007, 2008, 2009 Patrick Alken * Copyright (C) 2008 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* * 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. * * The bspline_pppack_* internal routines contain code adapted from * * [2] "PPPACK - Piecewise Polynomial Package", * http://www.netlib.org/pppack/ * */ #include "bspline.h" /* 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 = 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); if (w->deltal == 0) { gsl_bspline_free (w); GSL_ERROR_NULL ("failed to allocate space for deltal vector", GSL_ENOMEM); } w->deltar = gsl_vector_alloc (k); if (w->deltar == 0) { gsl_bspline_free (w); GSL_ERROR_NULL ("failed to allocate space for deltar vector", 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); } w->A = gsl_matrix_alloc (k, k); if (w->A == 0) { gsl_bspline_free (w); GSL_ERROR_NULL ("failed to allocate space for derivative work matrix", GSL_ENOMEM); } w->dB = gsl_matrix_alloc (k, k + 1); if (w->dB == 0) { gsl_bspline_free (w); GSL_ERROR_NULL ("failed to allocate space for temporary derivative matrix", GSL_ENOMEM); } return w; } } /* gsl_bspline_alloc() */ /* gsl_bspline_free() Free a gsl_bspline_workspace. Inputs: w - workspace to free Return: none */ void gsl_bspline_free (gsl_bspline_workspace * w) { RETURN_IF_NULL (w); 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); if (w->A) gsl_matrix_free(w->A); if (w->dB) gsl_matrix_free(w->dB); free (w); } /* gsl_bspline_free() */ #ifndef GSL_DISABLE_DEPRECATED /* gsl_bspline_deriv_alloc() Allocate space for a bspline derivative workspace. The size of the workspace is O(2k^2) Inputs: k - spline order (cubic = 4) Return: pointer to workspace */ gsl_bspline_deriv_workspace * gsl_bspline_deriv_alloc (const size_t k) { if (k == 0) { GSL_ERROR_NULL ("k must be at least 1", GSL_EINVAL); } else { gsl_bspline_deriv_workspace *dw; dw = (gsl_bspline_deriv_workspace *) malloc (sizeof (gsl_bspline_deriv_workspace)); if (dw == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } dw->A = gsl_matrix_alloc (k, k); if (dw->A == 0) { free (dw); GSL_ERROR_NULL ("failed to allocate space for derivative work matrix", GSL_ENOMEM); } dw->dB = gsl_matrix_alloc (k, k + 1); if (dw->dB == 0) { gsl_matrix_free (dw->A); free (dw); GSL_ERROR_NULL ("failed to allocate space for temporary derivative matrix", GSL_ENOMEM); } dw->k = k; return dw; } } /* gsl_bspline_deriv_alloc() */ /* gsl_bspline_deriv_free() Free a gsl_bspline_deriv_workspace. Inputs: dw - workspace to free Return: none */ void gsl_bspline_deriv_free (gsl_bspline_deriv_workspace * dw) { RETURN_IF_NULL (dw); gsl_matrix_free (dw->A); gsl_matrix_free (dw->dB); free (dw); } /* gsl_bspline_deriv_free() */ #endif /* !GSL_DISABLE_DEPRECATED */ /* 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; } /* Return the location of the i-th breakpoint*/ 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_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 a wrapper function for gsl_bspline_eval_nonzero() 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 ("vector B not of length n", GSL_EBADLEN); } else { size_t i; /* looping */ size_t istart; /* first non-zero spline for x */ size_t iend; /* last non-zero spline for x, knot for x */ int error; /* error handling */ /* find all non-zero B_i(x) values */ error = gsl_bspline_eval_nonzero (x, w->B, &istart, &iend, w); if (error) return error; /* store values in appropriate part of given vector */ for (i = 0; i < istart; i++) gsl_vector_set (B, i, 0.0); for (i = istart; i <= iend; i++) gsl_vector_set (B, i, gsl_vector_get (w->B, i - istart)); for (i = iend + 1; i < w->n; i++) gsl_vector_set (B, i, 0.0); return GSL_SUCCESS; } } /* gsl_bspline_eval() */ /* gsl_bspline_eval_nonzero() Evaluate all non-zero B-spline functions at point x. These are the B_i(x) for i in [istart, iend]. Always B_i(x) = 0 for i < istart and for i > iend. Inputs: x - point at which to evaluate splines Bk - (output) where to store B-spline values (length k) istart - (output) B-spline function index of first non-zero basis for given x iend - (output) B-spline function index of last non-zero basis for given x. This is also the knot index corresponding to x. 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_{istart,k}, B_{istart+1,k}, ..., B_{iend-1,k}, B_{iend,k}] evaluated at the given x. */ int gsl_bspline_eval_nonzero (const double x, gsl_vector * Bk, size_t * istart, size_t * iend, gsl_bspline_workspace * w) { if (Bk->size != w->k) { GSL_ERROR ("Bk vector length does not match order k", GSL_EBADLEN); } else { size_t i; /* spline index */ size_t j; /* looping */ int flag = 0; /* interval search flag */ int error = 0; /* error flag */ i = bspline_find_interval (x, &flag, w); error = bspline_process_interval_for_eval (x, &i, flag, w); if (error) return error; *istart = i - w->k + 1; *iend = i; bspline_pppack_bsplvb (w->knots, w->k, 1, x, *iend, &j, w->deltal, w->deltar, Bk); return GSL_SUCCESS; } } /* gsl_bspline_eval_nonzero() */ /* gsl_bspline_deriv_eval() Evaluate d^j/dx^j B_i(x) for all i, 0 <= j <= nderiv. This is a wrapper function for gsl_bspline_deriv_eval_nonzero() which formats the output in a nice way. Inputs: x - point for evaluation nderiv - number of derivatives to compute, inclusive. dB - (output) where to store d^j/dx^j B_i(x) values. the size of this matrix is (n = nbreak + k - 2 = l + k - 1 = w->n) by (nderiv + 1) w - bspline derivative workspace Return: success or error Notes: 1) The w->knots vector must be initialized prior to calling this function (see gsl_bspline_knots()) 2) based on PPPACK's bsplvd */ int gsl_bspline_deriv_eval (const double x, const size_t nderiv, gsl_matrix * dB, gsl_bspline_workspace * w) { if (dB->size1 != w->n) { GSL_ERROR ("dB matrix first dimension not of length n", GSL_EBADLEN); } else if (dB->size2 < nderiv + 1) { GSL_ERROR ("dB matrix second dimension must be at least length nderiv+1", GSL_EBADLEN); } else { size_t i; /* looping */ size_t j; /* looping */ size_t istart; /* first non-zero spline for x */ size_t iend; /* last non-zero spline for x, knot for x */ int error; /* error handling */ /* find all non-zero d^j/dx^j B_i(x) values */ error = gsl_bspline_deriv_eval_nonzero (x, nderiv, w->dB, &istart, &iend, w); if (error) return error; /* store values in appropriate part of given matrix */ for (j = 0; j <= nderiv; j++) { for (i = 0; i < istart; i++) gsl_matrix_set (dB, i, j, 0.0); for (i = istart; i <= iend; i++) gsl_matrix_set (dB, i, j, gsl_matrix_get (w->dB, i - istart, j)); for (i = iend + 1; i < w->n; i++) gsl_matrix_set (dB, i, j, 0.0); } return GSL_SUCCESS; } } /* gsl_bspline_deriv_eval() */ /* gsl_bspline_deriv_eval_nonzero() At point x evaluate all requested, non-zero B-spline function derivatives and store them in dB. These are the d^j/dx^j B_i(x) with i in [istart, iend] and j in [0, nderiv]. Always d^j/dx^j B_i(x) = 0 for i < istart and for i > iend. Inputs: x - point at which to evaluate splines nderiv - number of derivatives to request, inclusive dB - (output) where to store dB-spline derivatives (size k by nderiv + 1) istart - (output) B-spline function index of first non-zero basis for given x iend - (output) B-spline function index of last non-zero basis for given x. This is also the knot index corresponding to x. w - bspline derivative workspace Return: success or error Notes: 1) the w->knots vector must be initialized before calling this function 2) On output, dB contains [[B_{istart, k}, ..., d^nderiv/dx^nderiv B_{istart ,k}], [B_{istart+1,k}, ..., d^nderiv/dx^nderiv B_{istart+1,k}], ... [B_{iend-1, k}, ..., d^nderiv/dx^nderiv B_{iend-1, k}], [B_{iend, k}, ..., d^nderiv/dx^nderiv B_{iend, k}]] evaluated at x. B_{istart, k} is stored in dB(0,0). Each additional column contains an additional derivative. 3) Note that the zero-th column of the result contains the 0th derivative, which is simply a function evaluation. 4) based on PPPACK's bsplvd */ int gsl_bspline_deriv_eval_nonzero (const double x, const size_t nderiv, gsl_matrix * dB, size_t * istart, size_t * iend, gsl_bspline_workspace * w) { if (dB->size1 != w->k) { GSL_ERROR ("dB matrix first dimension not of length k", GSL_EBADLEN); } else if (dB->size2 < nderiv + 1) { GSL_ERROR ("dB matrix second dimension must be at least length nderiv+1", GSL_EBADLEN); } else { size_t i; /* spline index */ size_t j; /* looping */ int flag = 0; /* interval search flag */ int error = 0; /* error flag */ size_t min_nderivk; i = bspline_find_interval (x, &flag, w); error = bspline_process_interval_for_eval (x, &i, flag, w); if (error) return error; *istart = i - w->k + 1; *iend = i; bspline_pppack_bsplvd (w->knots, w->k, x, *iend, w->deltal, w->deltar, w->A, dB, nderiv); /* An order k b-spline has at most k-1 nonzero derivatives so we need to zero all requested higher order derivatives */ min_nderivk = GSL_MIN_INT (nderiv, w->k - 1); for (j = min_nderivk + 1; j <= nderiv; j++) { for (i = 0; i < w->k; i++) gsl_matrix_set (dB, i, j, 0.0); } return GSL_SUCCESS; } } /* gsl_bspline_deriv_eval_nonzero() */ /**************************************** * INTERNAL ROUTINES * ****************************************/ /* 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_i < x = t_{i+1} = t_{n+k-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 (ti < x && x == tip1 && tip1 == gsl_vector_get (w->knots, w->k + w->l - 1)) break; } if (i == w->k + w->l - 1) *flag = 1; else *flag = 0; return i; } /* bspline_find_interval() */ /* bspline_process_interval_for_eval() Consumes an x location, left knot from bspline_find_interval, flag from bspline_find_interval, and a workspace. Checks that x lies within the splines' knots, enforces some endpoint continuity requirements, and avoids divide by zero errors in the underlying bspline_pppack_* functions. */ static inline int bspline_process_interval_for_eval (const double x, size_t * i, const int flag, gsl_bspline_workspace * 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 -= 1; } else { GSL_ERROR ("x outside of knot interval", GSL_EINVAL); } } if (gsl_vector_get (w->knots, *i) == gsl_vector_get (w->knots, *i + 1)) { GSL_ERROR ("knot(i) = knot(i+1) will result in division by zero", GSL_EINVAL); } return GSL_SUCCESS; } /* bspline_process_interval_for_eval */ /******************************************************************** * PPPACK ROUTINES * * The routines herein deliberately avoid using the bspline workspace, * choosing instead to pass all work areas explicitly. This allows * others to more easily adapt these routines to low memory or * parallel scenarios. ********************************************************************/ /* bspline_pppack_bsplvb() calculates the value of all possibly nonzero b-splines at x of order jout = max( jhigh , (j+1)*(index-1) ) with knot sequence t. Parameters: t - knot sequence, of length left + jout , assumed to be nondecreasing. assumption t(left).lt.t(left + 1). division by zero will result if t(left) = t(left+1) jhigh - index - integers which determine the order jout = max(jhigh, (j+1)*(index-1)) of the b-splines whose values at x are to be returned. index is used to avoid recalculations when several columns of the triangular array of b-spline values are needed (e.g., in bsplpp or in bsplvd ). precisely, if index = 1 , the calculation starts from scratch and the entire triangular array of b-spline values of orders 1,2,...,jhigh is generated order by order , i.e., column by column . if index = 2 , only the b-spline values of order j+1, j+2, ..., jout are generated, the assumption being that biatx, j, deltal, deltar are, on entry, as they were on exit at the previous call. in particular, if jhigh = 0, then jout = j+1, i.e., just the next column of b-spline values is generated. x - the point at which the b-splines are to be evaluated. left - an integer chosen (usually) so that t(left) .le. x .le. t(left+1). j - (output) a working scalar for indexing deltal - (output) a working area which must be of length at least jout deltar - (output) a working area which must be of length at least jout biatx - (output) array of length jout, with biatx(i) containing the value at x of the polynomial of order jout which agrees with the b-spline b(left-jout+i,jout,t) on the interval (t(left), t(left+1)) . Method: the recurrence relation x - t(i) t(i+j+1) - x b(i,j+1)(x) = -----------b(i,j)(x) + ---------------b(i+1,j)(x) t(i+j)-t(i) t(i+j+1)-t(i+1) is used (repeatedly) to generate the (j+1)-vector b(left-j,j+1)(x), ...,b(left,j+1)(x) from the j-vector b(left-j+1,j)(x),..., b(left,j)(x), storing the new values in biatx over the old. the facts that b(i,1) = 1 if t(i) .le. x .lt. t(i+1) and that b(i,j)(x) = 0 unless t(i) .le. x .lt. t(i+j) are used. the particular organization of the calculations follows algorithm (8) in chapter x of [1]. Notes: (1) This is a direct translation of PPPACK's bsplvb routine with j, deltal, deltar rewritten as input parameters and utilizing zero-based indexing. (2) This routine contains no error checking. Please use routines like gsl_bspline_eval(). */ static void bspline_pppack_bsplvb (const gsl_vector * t, const size_t jhigh, const size_t index, const double x, const size_t left, size_t * j, gsl_vector * deltal, gsl_vector * deltar, gsl_vector * biatx) { size_t i; /* looping */ double saved; double term; if (index == 1) { *j = 0; gsl_vector_set (biatx, 0, 1.0); } for ( /* NOP */ ; *j < jhigh - 1; *j += 1) { gsl_vector_set (deltar, *j, gsl_vector_get (t, left + *j + 1) - x); gsl_vector_set (deltal, *j, x - gsl_vector_get (t, left - *j)); saved = 0.0; for (i = 0; i <= *j; i++) { term = gsl_vector_get (biatx, i) / (gsl_vector_get (deltar, i) + gsl_vector_get (deltal, *j - i)); gsl_vector_set (biatx, i, saved + gsl_vector_get (deltar, i) * term); saved = gsl_vector_get (deltal, *j - i) * term; } gsl_vector_set (biatx, *j + 1, saved); } return; } /* gsl_bspline_pppack_bsplvb */ /* bspline_pppack_bsplvd() calculates value and derivs of all b-splines which do not vanish at x Parameters: t - the knot array, of length left+k (at least) k - the order of the b-splines to be evaluated x - the point at which these values are sought left - an integer indicating the left endpoint of the interval of interest. the k b-splines whose support contains the interval (t(left), t(left+1)) are to be considered. it is assumed that t(left) .lt. t(left+1) division by zero will result otherwise (in bsplvb). also, the output is as advertised only if t(left) .le. x .le. t(left+1) . deltal - a working area which must be of length at least k deltar - a working area which must be of length at least k a - an array of order (k,k), to contain b-coeffs of the derivatives of a certain order of the k b-splines of interest. dbiatx - an array of order (k,nderiv). its entry (i,m) contains value of (m)th derivative of (left-k+i)-th b-spline of order k for knot sequence t, i=1,...,k, m=0,...,nderiv. nderiv - an integer indicating that values of b-splines and their derivatives up to AND INCLUDING the nderiv-th are asked for. (nderiv is replaced internally by the integer mhigh in (1,k) closest to it.) Method: values at x of all the relevant b-splines of order k,k-1,..., k+1-nderiv are generated via bsplvb and stored temporarily in dbiatx. then, the b-coeffs of the required derivatives of the b-splines of interest are generated by differencing, each from the preceeding one of lower order, and combined with the values of b-splines of corresponding order in dbiatx to produce the desired values . Notes: (1) This is a direct translation of PPPACK's bsplvd routine with deltal, deltar rewritten as input parameters (to later feed them to bspline_pppack_bsplvb) and utilizing zero-based indexing. (2) This routine contains no error checking. */ static void bspline_pppack_bsplvd (const gsl_vector * t, const size_t k, const double x, const size_t left, gsl_vector * deltal, gsl_vector * deltar, gsl_matrix * a, gsl_matrix * dbiatx, const size_t nderiv) { int i, ideriv, il, j, jlow, jp1mid, kmm, ldummy, m, mhigh; double factor, fkmm, sum; size_t bsplvb_j; gsl_vector_view dbcol = gsl_matrix_column (dbiatx, 0); mhigh = GSL_MIN_INT (nderiv, k - 1); bspline_pppack_bsplvb (t, k - mhigh, 1, x, left, &bsplvb_j, deltal, deltar, &dbcol.vector); if (mhigh > 0) { /* the first column of dbiatx always contains the b-spline values for the current order. these are stored in column k-current order before bsplvb is called to put values for the next higher order on top of it. */ ideriv = mhigh; for (m = 1; m <= mhigh; m++) { for (j = ideriv, jp1mid = 0; j < (int) k; j++, jp1mid++) { gsl_matrix_set (dbiatx, j, ideriv, gsl_matrix_get (dbiatx, jp1mid, 0)); } ideriv--; bspline_pppack_bsplvb (t, k - ideriv, 2, x, left, &bsplvb_j, deltal, deltar, &dbcol.vector); } /* at this point, b(left-k+i, k+1-j)(x) is in dbiatx(i,j) for i=j,...,k-1 and j=0,...,mhigh. in particular, the first column of dbiatx is already in final form. to obtain corresponding derivatives of b-splines in subsequent columns, generate their b-repr. by differencing, then evaluate at x. */ jlow = 0; for (i = 0; i < (int) k; i++) { for (j = jlow; j < (int) k; j++) { gsl_matrix_set (a, j, i, 0.0); } jlow = i; gsl_matrix_set (a, i, i, 1.0); } /* at this point, a(.,j) contains the b-coeffs for the j-th of the k b-splines of interest here. */ for (m = 1; m <= mhigh; m++) { kmm = k - m; fkmm = (float) kmm; il = left; i = k - 1; /* for j=1,...,k, construct b-coeffs of (m)th derivative of b-splines from those for preceding derivative by differencing and store again in a(.,j) . the fact that a(i,j) = 0 for i .lt. j is used. */ for (ldummy = 0; ldummy < kmm; ldummy++) { factor = fkmm / (gsl_vector_get (t, il + kmm) - gsl_vector_get (t, il)); /* the assumption that t(left).lt.t(left+1) makes denominator in factor nonzero. */ for (j = 0; j <= i; j++) { gsl_matrix_set (a, i, j, factor * (gsl_matrix_get (a, i, j) - gsl_matrix_get (a, i - 1, j))); } il--; i--; } /* for i=1,...,k, combine b-coeffs a(.,i) with b-spline values stored in dbiatx(.,m) to get value of (m)th derivative of i-th b-spline (of interest here) at x, and store in dbiatx(i,m). storage of this value over the value of a b-spline of order m there is safe since the remaining b-spline derivatives of the same order do not use this value due to the fact that a(j,i) = 0 for j .lt. i . */ for (i = 0; i < (int) k; i++) { sum = 0; jlow = GSL_MAX_INT (i, m); for (j = jlow; j < (int) k; j++) { sum += gsl_matrix_get (a, j, i) * gsl_matrix_get (dbiatx, j, m); } gsl_matrix_set (dbiatx, i, m, sum); } } } return; } /* bspline_pppack_bsplvd */ gsl-doc-2.3/bspline/test.c0000664000175000017500000004440212616157443013556 0ustar eddedd/* bspline/test.c * * Copyright (C) 2006, 2007, 2009 Brian Gough * Copyright (C) 2008, 2011 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include void test_bspline(gsl_bspline_workspace * bw) { gsl_vector *B; gsl_matrix *dB; 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); dB = gsl_matrix_alloc(ncoeffs, 1); /* Ensure B-splines form a partition of unity */ 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); } /* Ensure B-splines 0th derivatives agree with regular evaluation */ for (i = 0; i < n; i++) { double xi = a + (b - a) * (i / (n - 1.0)); gsl_bspline_eval(xi, B, bw); gsl_bspline_deriv_eval(xi, 0, dB, bw); for (j = 0; j < ncoeffs; j++) { gsl_test_abs(gsl_matrix_get(dB, j, 0), gsl_vector_get(B, j), GSL_DBL_EPSILON, "b-spline order %d basis #%d evaluation and 0th derivative consistent for x=%g", order, j, xi); } } gsl_vector_free(B); gsl_matrix_free(dB); } int main(int argc, char **argv) { 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); } } /* Spot check known 0th, 1st, 2nd derivative evaluations for a particular k = 2 case. */ { size_t i, j; /* looping */ const double xloc[4] = { 0.0, 1.0, 6.0, 7.0}; const double deriv[4][3] = { { -1.0/2.0, 1.0/2.0, 0.0 }, { -1.0/2.0, 1.0/2.0, 0.0 }, { 0.0, -1.0/5.0, 1.0/5.0 }, { 0.0, -1.0/5.0, 1.0/5.0 } }; gsl_bspline_workspace *bw = gsl_bspline_alloc(2, 3); gsl_matrix *dB = gsl_matrix_alloc(gsl_bspline_ncoeffs(bw), gsl_bspline_order(bw) + 1); gsl_vector *breakpts = gsl_vector_alloc(3); gsl_vector_set(breakpts, 0, 0.0); gsl_vector_set(breakpts, 1, 2.0); gsl_vector_set(breakpts, 2, 7.0); gsl_bspline_knots(breakpts, bw); for (i = 0; i < 4; ++i) /* at each location */ { /* Initialize dB with poison to ensure we overwrite it */ gsl_matrix_set_all(dB, GSL_NAN); gsl_bspline_deriv_eval(xloc[i], gsl_bspline_order(bw), dB, bw); for (j = 0; j < gsl_bspline_ncoeffs(bw) ; ++j) { /* check basis function 1st deriv */ gsl_test_abs(gsl_matrix_get(dB, j, 1), deriv[i][j], GSL_DBL_EPSILON, "b-spline k=%d basis #%d derivative %d at x = %f", gsl_bspline_order(bw), j, 1, xloc[i]); } for (j = 0; j < gsl_bspline_ncoeffs(bw); ++j) { /* check k order basis function has k-th deriv equal to 0 */ gsl_test_abs(gsl_matrix_get(dB, j, gsl_bspline_order(bw)), 0.0, GSL_DBL_EPSILON, "b-spline k=%d basis #%d derivative %d at x = %f", gsl_bspline_order(bw), j, gsl_bspline_order(bw), xloc[i]); } } gsl_matrix_free(dB); gsl_bspline_free(bw); gsl_vector_free(breakpts); } /* Spot check known 0th, 1st, 2nd derivative evaluations for a particular k = 3 case. */ { size_t i, j; /* looping */ const double xloc[5] = { 0.0, 5.0, 9.0, 12.0, 15.0 }; const double eval[5][6] = { { 4./25., 69./100., 3./ 20. , 0. , 0. , 0. }, { 0. , 4./21. , 143./210. , 9./70., 0. , 0. }, { 0. , 0. , 3./ 10. , 7./10., 0. , 0. }, { 0. , 0. , 0. , 3./4. , 1./4., 0. }, { 0. , 0. , 0. , 1./3. , 5./9., 1./9. } }; const double deriv[5][6] = { { -4./25., 3./50., 1./ 10., 0. , 0. , 0. }, { 0. , -2./21., 1./105., 3./35., 0. , 0. }, { 0. , 0. , -1./5. , 1./ 5., 0. , 0. }, { 0. , 0. , 0. , -1./ 6., 1./6. , 0. }, { 0. , 0. , 0. , -1./ 9., 1./27., 2./27. } }; const double deriv2[5][6] = { { 2./25., -17./150., 1.0/30.0 , 0.0 , 0. , 0. }, { 0. , 1./ 42., -11.0/210.0, 1.0/35.0, 0. , 0. }, { 0. , 0. , 1.0/15.0 ,-11.0/90.0, 1./18. , 0. }, { 0. , 0. , 0.0 , 1.0/54.0, -7./162., 2./81. }, { 0. , 0. , 0.0 , 1.0/54.0, -7./162., 2./81. } }; gsl_bspline_workspace *bw = gsl_bspline_alloc(3, 5); gsl_matrix *dB = gsl_matrix_alloc(gsl_bspline_ncoeffs(bw), gsl_bspline_order(bw) + 1); gsl_vector *breakpts = gsl_vector_alloc(5); gsl_vector_set(breakpts, 0, -3.0); gsl_vector_set(breakpts, 1, 2.0); gsl_vector_set(breakpts, 2, 9.0); gsl_vector_set(breakpts, 3, 12.0); gsl_vector_set(breakpts, 4, 21.0); gsl_bspline_knots(breakpts, bw); for (i = 0; i < 5; ++i) /* at each location */ { /* Initialize dB with poison to ensure we overwrite it */ gsl_matrix_set_all(dB, GSL_NAN); gsl_bspline_deriv_eval(xloc[i], gsl_bspline_order(bw), dB, bw); /* check basis function evaluation */ for (j = 0; j < gsl_bspline_ncoeffs(bw); ++j) { gsl_test_abs(gsl_matrix_get(dB, j, 0), eval[i][j], GSL_DBL_EPSILON, "b-spline k=%d basis #%d derivative %d at x = %f", gsl_bspline_order(bw), j, 0, xloc[i]); } /* check 1st derivative evaluation */ for (j = 0; j < gsl_bspline_ncoeffs(bw); ++j) { gsl_test_abs(gsl_matrix_get(dB, j, 1), deriv[i][j], GSL_DBL_EPSILON, "b-spline k=%d basis #%d derivative %d at x = %f", gsl_bspline_order(bw), j, 1, xloc[i]); } /* check 2nd derivative evaluation */ for (j = 0; j < gsl_bspline_ncoeffs(bw); ++j) { gsl_test_abs(gsl_matrix_get(dB, j, 2), deriv2[i][j], GSL_DBL_EPSILON, "b-spline k=%d basis #%d derivative %d at x = %f", gsl_bspline_order(bw), j, 2, xloc[i]); } } gsl_matrix_free(dB); gsl_bspline_free(bw); gsl_vector_free(breakpts); } /* Check Greville abscissae functionality on a non-uniform k=1 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 1; const double bpoint_data[] = { 0.0, 0.2, 0.5, 0.75, 1.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Expected results */ const double abscissae_data[] = { 0.1, 0.35, 0.625, 0.875 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); gsl_vector_const_view bpoints = gsl_vector_const_view_array(bpoint_data, nbreak); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots((const gsl_vector *) &bpoints, w); gsl_test_int(nabscissae, gsl_bspline_ncoeffs(w), "b-spline k=%d number of abscissae", k); for (i = 0; i < nabscissae; ++i) { gsl_test_abs(gsl_bspline_greville_abscissa(i, w), abscissae_data[i], 2*k*GSL_DBL_EPSILON, "b-spline k=%d Greville abscissa #%d at x = %f", k, i, abscissae_data[i]); } gsl_bspline_free(w); } /* Check Greville abscissae functionality on a non-uniform k=2 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 2; const double bpoint_data[] = { 0.0, 0.2, 0.5, 0.75, 1.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Expected results */ const double abscissae_data[] = { 0.0, 0.2, 0.5, 0.75, 1.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); gsl_vector_const_view bpoints = gsl_vector_const_view_array(bpoint_data, nbreak); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots((const gsl_vector *) &bpoints, w); gsl_test_int(nabscissae, gsl_bspline_ncoeffs(w), "b-spline k=%d number of abscissae", k); for (i = 0; i < nabscissae; ++i) { gsl_test_abs(gsl_bspline_greville_abscissa(i, w), abscissae_data[i], 2*k*GSL_DBL_EPSILON, "b-spline k=%d Greville abscissa #%d at x = %f", k, i, abscissae_data[i]); } gsl_bspline_free(w); } /* Check Greville abscissae functionality on non-uniform k=3 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 3; const double bpoint_data[] = { 0.0, 0.2, 0.5, 0.75, 1.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Expected results */ const double abscissae_data[] = { 0.0, 1.0/10.0, 7.0/20.0, 5.0/ 8.0, 7.0/ 8.0, 1.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); gsl_vector_const_view bpoints = gsl_vector_const_view_array(bpoint_data, nbreak); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots((const gsl_vector *) &bpoints, w); gsl_test_int(nabscissae, gsl_bspline_ncoeffs(w), "b-spline k=%d number of abscissae", k); for (i = 0; i < nabscissae; ++i) { gsl_test_abs(gsl_bspline_greville_abscissa(i, w), abscissae_data[i], 2*k*GSL_DBL_EPSILON, "b-spline k=%d Greville abscissa #%d at x = %f", k, i, abscissae_data[i]); } gsl_bspline_free(w); } /* Check Greville abscissae functionality on non-uniform k=4 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 4; const double bpoint_data[] = { 0.0, 0.2, 0.5, 0.75, 1.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Expected results */ const double abscissae_data[] = { 0.0, 1.0/15.0, 7.0/30.0, 29.0/60.0, 3.0/ 4.0, 11.0/12.0, 1.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); gsl_vector_const_view bpoints = gsl_vector_const_view_array(bpoint_data, nbreak); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots((const gsl_vector *) &bpoints, w); gsl_test_int(nabscissae, gsl_bspline_ncoeffs(w), "b-spline k=%d number of abscissae", k); for (i = 0; i < nabscissae; ++i) { gsl_test_abs(gsl_bspline_greville_abscissa(i, w), abscissae_data[i], 2*k*GSL_DBL_EPSILON, "b-spline k=%d Greville abscissa #%d at x = %f", k, i, abscissae_data[i]); } gsl_bspline_free(w); } /* Knots computed from prescribed Greville abscissae for k = 4 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 4; const double abscissae_data[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); /* Expected results */ const double bpoint_data[] = { 1.0, 4.0, 4.0, 4.0, 7.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Compute knots from Greville abscissae */ double abserr; gsl_vector_const_view abscissae = gsl_vector_const_view_array(abscissae_data, nabscissae); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots_greville(&abscissae.vector, w, &abserr); for (i = 0; i < nbreak; ++i) { gsl_test_abs(gsl_bspline_breakpoint(i,w), bpoint_data[i], GSL_DBL_EPSILON*50, "b-spline k=%d knots_greville breakpoint #%d", k, i); } gsl_test_abs(abserr, 0.0, GSL_DBL_EPSILON*15, "b-spline k=%d nbreak=%d knots_greville abserr", k, nbreak); gsl_bspline_free(w); } /* Knots computed from prescribed Greville abscissae for k = 8 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 8; const double abscissae_data[] = { 1.0, 10.0/7, 13.0/7, 16.0/7, 22.0/7, 4.0, 34.0/7, 40.0/7, 43.0/7, 46.0/7, 7.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); /* Expected results */ const double bpoint_data[] = { 1.0, 4.0, 4.0, 4.0, 7.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Compute knots from Greville abscissae */ double abserr; gsl_vector_const_view abscissae = gsl_vector_const_view_array(abscissae_data, nabscissae); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots_greville(&abscissae.vector, w, &abserr); for (i = 0; i < nbreak; ++i) { gsl_test_abs(gsl_bspline_breakpoint(i,w), bpoint_data[i], GSL_DBL_EPSILON*50, "b-spline k=%d knots_greville breakpoint #%d", k, i); } gsl_test_abs(abserr, 0.0, GSL_DBL_EPSILON*15, "b-spline k=%d nbreak=%d knots_greville abserr", k, nbreak); gsl_bspline_free(w); } /* Knots computed from prescribed Greville abscissae for k = 2 */ /* Not an interesting calculation but checks the k = 2 edge case */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 2; const double abscissae_data[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); /* Expected results */ const double bpoint_data[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Compute knots from Greville abscissae */ double abserr; gsl_vector_const_view abscissae = gsl_vector_const_view_array(abscissae_data, nabscissae); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots_greville(&abscissae.vector, w, &abserr); for (i = 0; i < nbreak; ++i) { gsl_test_abs(gsl_bspline_breakpoint(i,w), bpoint_data[i], GSL_DBL_EPSILON, "b-spline k=%d knots_greville breakpoint #%d", k, i); } gsl_test_abs(abserr, 0.0, GSL_DBL_EPSILON, "b-spline k=%d nbreak=%d knots_greville abserr", k, nbreak); gsl_bspline_free(w); } /* Knots computed from prescribed abscissae for edge case when nbreak = 2 */ { size_t i; /* looping */ /* Test parameters */ const size_t k = 4; double abscissae_data[] = { 1.0, 3.0, 5.0, 7.0 }; const size_t nabscissae = sizeof(abscissae_data)/sizeof(abscissae_data[0]); /* Expected results */ const double bpoint_data[] = { 1.0, 7.0 }; const size_t nbreak = sizeof(bpoint_data)/sizeof(bpoint_data[0]); /* Compute knots from Greville abscissae where abscissae are recoverable */ double abserr; gsl_vector_view abscissae = gsl_vector_view_array(abscissae_data, nabscissae); gsl_bspline_workspace *w = gsl_bspline_alloc(k, nbreak); gsl_bspline_knots_greville(&abscissae.vector, w, &abserr); /* Check recovery of breakpoints and abscissae */ for (i = 0; i < nbreak; ++i) { gsl_test_abs(gsl_bspline_breakpoint(i,w), bpoint_data[i], GSL_DBL_EPSILON, "b-spline k=%d knots_greville breakpoint #%d", k, i); } gsl_test_abs(abserr, 0.0, GSL_DBL_EPSILON, "b-spline k=%d nbreak=%d knots_greville abserr", k, nbreak); /* Modify interior abscissae so they cannot be recovered with nbreak = 2 */ /* Then recompute breakpoints and check that abserr is as expected */ abscissae_data[1] -= 1; abscissae_data[2] += 1; gsl_bspline_knots_greville(&abscissae.vector, w, &abserr); for (i = 0; i < nbreak; ++i) { gsl_test_abs(gsl_bspline_breakpoint(i,w), bpoint_data[i], GSL_DBL_EPSILON, "b-spline k=%d knots_greville breakpoint #%d", k, i); } gsl_test_abs(abserr, /* deliberate error */ 2.0, GSL_DBL_EPSILON, "b-spline k=%d nbreak=%d knots_greville abserr large", k, nbreak); gsl_bspline_free(w); } exit(gsl_test_summary()); } gsl-doc-2.3/sum/0000755000175000017500000000000013022553154011564 5ustar eddeddgsl-doc-2.3/sum/gsl_sum.h0000664000175000017500000001253412616157443013426 0ustar eddedd/* sum/gsl_sum.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/sum/Makefile.am0000664000175000017500000000060512616157443013634 0ustar eddeddnoinst_LTLIBRARIES = libgslsum.la pkginclude_HEADERS = gsl_sum.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/sum/levin_utrunc.c0000664000175000017500000001355012616157443014464 0ustar eddedd/* sum/levin_utrunc.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include 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; } } gsl-doc-2.3/sum/Makefile.in0000644000175000017500000010373413022372407013641 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsum.la pkginclude_HEADERS = gsl_sum.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sum/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsum.la: $(libgslsum_la_OBJECTS) $(libgslsum_la_DEPENDENCIES) $(EXTRA_libgslsum_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsum_la_OBJECTS) $(libgslsum_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levin_u.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levin_utrunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_u.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_utrunc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/sum/ChangeLog0000664000175000017500000000673512616157443013364 0ustar eddedd2009-07-09 Brian Gough * work_utrunc.c (gsl_sum_levin_utrunc_free): handle NULL argument in free * work_u.c (gsl_sum_levin_u_free): handle NULL argument in free 2009-06-28 Brian Gough * test.c (check_full): allow for case where err_est is zero. * levin_u.c (gsl_sum_levin_u_minmax): handle the special case where the sum has the form 1+0+0+0+... by ignoring trailing zeros. 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir Thu Dec 21 21:46:54 2000 Brian Gough * 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 * 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 * gsl_sum.h: added #include for size_t Mon Nov 1 12:50:17 1999 Brian Gough * 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 * 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 * 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 * 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 * 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 * test.c: added #include * 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 * 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 * test_sum.c: replace variable N by macro to avoid variable length array warning Tue Oct 27 18:06:16 1998 Brian Gough * 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. gsl-doc-2.3/sum/levin_u.c0000664000175000017500000001617512616157443013416 0ustar eddedd/* sum/levin_u.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { /* Ignore any trailing zeros in the array */ size_t size = array_size; while (size > 0 && array[size - 1] == 0) { size--; } if (size == 0) { *sum_accel = 0.0; *abserr = 0.0; w->sum_plain = 0.0; w->terms_used = 0; return GSL_SUCCESS; } else if (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; } } gsl-doc-2.3/sum/work_utrunc.c0000664000175000017500000000272712616157443014335 0ustar eddedd#include #include #include #include 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) { RETURN_IF_NULL (w); free (w->dsum); free (w->q_den); free (w->q_num); free (w); } gsl-doc-2.3/sum/test.c0000664000175000017500000001225112616157443012723 0ustar eddedd/* sum/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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)"); } { double t[N]; int n; double result = 1.23; for (n = 0; n < N; n++) { t[n] = (n == 0) ? 1.23 : 0.0; } check_trunc (t, result, "1.23 + 0 + 0 + 0..."); check_full (t, result, "1.23 + 0 + 0 + 0..."); } 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) + GSL_DBL_EPSILON); 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); } gsl-doc-2.3/sum/work_u.c0000664000175000017500000000413712616157443013256 0ustar eddedd#include #include #include #include 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) { RETURN_IF_NULL (w); free (w->dsum); free (w->dq_den); free (w->dq_num); free (w->q_den); free (w->q_num); free (w); } gsl-doc-2.3/statistics/0000755000175000017500000000000013022553154013152 5ustar eddeddgsl-doc-2.3/statistics/wkurtosis.c0000664000175000017500000000070212616157443015402 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/gsl_statistics_char.h0000664000175000017500000001111112616157443017365 0ustar eddedd/* statistics/gsl_statistics_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const char data[], const size_t stride, const size_t n); double gsl_stats_char_tss_m (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_correlation (const char data1[], const size_t stride1,const char data2[], const size_t stride2, const size_t n); double gsl_stats_char_spearman (const char data1[], const size_t stride1, const char data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/absdev_source.c0000664000175000017500000000305012616157443016153 0ustar eddedd/* statistics/absdev_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/gsl_statistics_long.h0000664000175000017500000001111112616157443017407 0ustar eddedd/* statistics/gsl_statistics_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const long data[], const size_t stride, const size_t n); double gsl_stats_long_tss_m (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_correlation (const long data1[], const size_t stride1,const long data2[], const size_t stride2, const size_t n); double gsl_stats_long_spearman (const long data1[], const size_t stride1, const long data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/wmean.c0000664000175000017500000000064512616157443014445 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/wskew.c0000664000175000017500000000066712616157443014502 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/wmean_source.c0000664000175000017500000000263012616157443016021 0ustar eddedd/* statistics/wmean_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/lag1_source.c0000664000175000017500000000327512616157443015544 0ustar eddedd/* statistics/lag1_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/test_int_source.c0000664000175000017500000002033412616157443016544 0ustar eddedd/* statistics/test_int_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 r = FUNCTION(gsl_stats,correlation) (igroupa, stridea, igroupb, strideb, inb); double expected = 0.793090350710101; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_correlation"); } { double *work = malloc(2 * ina * sizeof(double)); double r = FUNCTION(gsl_stats,spearman) (igroupa, stridea, igroupb, strideb, inb, work); double expected = 0.644239670474577; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_spearman"); free(work); } { 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); } gsl-doc-2.3/statistics/Makefile.am0000664000175000017500000000234012616157443015220 0ustar eddedd## 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 AM_CPPFLAGS = -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 ../vector/libgslvector.la gsl-doc-2.3/statistics/wabsdev_source.c0000664000175000017500000000327112616157443016347 0ustar eddedd/* statistics/wabsdev_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/median.c0000664000175000017500000000253212616157443014570 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/minmax_source.c0000664000175000017500000001021612616157443016202 0ustar eddedd/* statistics/minmax_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/mean_source.c0000664000175000017500000000230312616157443015627 0ustar eddedd/* statistics/mean_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/gsl_statistics_ulong.h0000664000175000017500000001173512616157443017610 0ustar eddedd/* statistics/gsl_statistics_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const unsigned long data[], const size_t stride, const size_t n); double gsl_stats_ulong_tss_m (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_correlation (const unsigned long data1[], const size_t stride1,const unsigned long data2[], const size_t stride2, const size_t n); double gsl_stats_ulong_spearman (const unsigned long data1[], const size_t stride1, const unsigned long data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/gsl_statistics_long_double.h0000664000175000017500000001706112616157443020753 0ustar eddedd/* statistics/gsl_statistics_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const long double data[], const size_t stride, const size_t n); double gsl_stats_long_double_tss_m (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_correlation (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_spearman (const long double data1[], const size_t stride1, const long double data2[], const size_t stride2, const size_t n, double work[]); 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_wtss (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_wtss_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 (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__ */ gsl-doc-2.3/statistics/TODO0000664000175000017500000000603712616157443013663 0ustar eddedd# -*- org -*- #+CATEGORY: statistics * From: James Theiler To: John Lamb 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). gsl-doc-2.3/statistics/mean.c0000664000175000017500000000250312616157443014251 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/gsl_statistics_double.h0000664000175000017500000001522212616157443017731 0ustar eddedd/* statistics/gsl_statistics_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const double data[], const size_t stride, const size_t n); double gsl_stats_tss_m (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_correlation (const double data1[], const size_t stride1,const double data2[], const size_t stride2, const size_t n); double gsl_stats_spearman (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n, double work[]); 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_wtss (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n); double gsl_stats_wtss_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 (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__ */ gsl-doc-2.3/statistics/quantiles_source.c0000664000175000017500000000272512616157443016724 0ustar eddedd/* statistics/quantiles_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/statistics/kurtosis_source.c0000664000175000017500000000364412616157443016603 0ustar eddedd/* statistics/kurtosis_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/wvariance.c0000664000175000017500000000070212616157443015307 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/lag1.c0000664000175000017500000000250312616157443014155 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/absdev.c0000664000175000017500000000255212616157443014601 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/wkurtosis_source.c0000664000175000017500000000427012616157443016766 0ustar eddedd/* statistics/wkurtosis_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/kurtosis.c0000664000175000017500000000260112616157443015213 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/test_nist.c0000664000175000017500000006354312616157443015360 0ustar eddedd/* statistics/test_nist.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include 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; } gsl-doc-2.3/statistics/covariance_source.c0000664000175000017500000001373512616157443017034 0ustar eddedd/* statistics/covar_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } /* gsl_stats_correlation() Calculate Pearson correlation = cov(X, Y) / (sigma_X * sigma_Y) This routine efficiently computes the correlation in one pass of the data and makes use of the algorithm described in: B. P. Welford, "Note on a Method for Calculating Corrected Sums of Squares and Products", Technometrics, Vol 4, No 3, 1962. This paper derives a numerically stable recurrence to compute a sum of products S = sum_{i=1..N} [ (x_i - mu_x) * (y_i - mu_y) ] with the relation S_n = S_{n-1} + ((n-1)/n) * (x_n - mu_x_{n-1}) * (y_n - mu_y_{n-1}) */ double FUNCTION(gsl_stats,correlation) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n) { size_t i; long double sum_xsq = 0.0; long double sum_ysq = 0.0; long double sum_cross = 0.0; long double ratio; long double delta_x, delta_y; long double mean_x, mean_y; long double r; /* * Compute: * sum_xsq = Sum [ (x_i - mu_x)^2 ], * sum_ysq = Sum [ (y_i - mu_y)^2 ] and * sum_cross = Sum [ (x_i - mu_x) * (y_i - mu_y) ] * using the above relation from Welford's paper */ mean_x = data1[0 * stride1]; mean_y = data2[0 * stride2]; for (i = 1; i < n; ++i) { ratio = i / (i + 1.0); delta_x = data1[i * stride1] - mean_x; delta_y = data2[i * stride2] - mean_y; sum_xsq += delta_x * delta_x * ratio; sum_ysq += delta_y * delta_y * ratio; sum_cross += delta_x * delta_y * ratio; mean_x += delta_x / (i + 1.0); mean_y += delta_y / (i + 1.0); } r = sum_cross / (sqrt(sum_xsq) * sqrt(sum_ysq)); return r; } /* gsl_stats_spearman() Compute Spearman rank correlation coefficient Inputs: data1 - data1 vector stride1 - stride of data1 data2 - data2 vector stride2 - stride of data2 n - number of elements in data1 and data2 work - additional workspace of size 2*n Return: Spearman rank correlation coefficient */ double FUNCTION(gsl_stats,spearman) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n, double work[]) { size_t i; gsl_vector_view ranks1 = gsl_vector_view_array(&work[0], n); gsl_vector_view ranks2 = gsl_vector_view_array(&work[n], n); double r; for (i = 0; i < n; ++i) { gsl_vector_set(&ranks1.vector, i, data1[i * stride1]); gsl_vector_set(&ranks2.vector, i, data2[i * stride2]); } /* sort data1 and update data2 at same time; compute rank of data1 */ gsl_sort_vector2(&ranks1.vector, &ranks2.vector); compute_rank(&ranks1.vector); /* now sort data2, updating ranks1 appropriately; compute rank of data2 */ gsl_sort_vector2(&ranks2.vector, &ranks1.vector); compute_rank(&ranks2.vector); /* compute correlation of rank vectors in double precision */ r = gsl_stats_correlation(ranks1.vector.data, ranks1.vector.stride, ranks2.vector.data, ranks2.vector.stride, n); return r; } gsl-doc-2.3/statistics/p_variance.c0000664000175000017500000000260612616157443015444 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/gsl_statistics_uchar.h0000664000175000017500000001173512616157443017566 0ustar eddedd/* statistics/gsl_statistics_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const unsigned char data[], const size_t stride, const size_t n); double gsl_stats_uchar_tss_m (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_correlation (const unsigned char data1[], const size_t stride1,const unsigned char data2[], const size_t stride2, const size_t n); double gsl_stats_uchar_spearman (const unsigned char data1[], const size_t stride1, const unsigned char data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/covariance.c0000664000175000017500000000515212616157443015446 0ustar eddedd#include #include #include #include #include static int compute_rank(gsl_vector *v); #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 /* compute_rank() Compute rank of a sorted vector Inputs: v - sorted data vector on input; rank vector on output Notes: ranks are always computed in double precision */ static int compute_rank(gsl_vector *v) { const size_t n = v->size; size_t i = 0; while (i < n - 1) { double vi = gsl_vector_get(v, i); if (vi == gsl_vector_get(v, i + 1)) { size_t j = i + 2; size_t k; double rank = 0.0; /* we have detected a tie, find number of equal elements */ while (j < n && vi == gsl_vector_get(v, j)) ++j; /* compute rank */ for (k = i; k < j; ++k) rank += k + 1.0; /* divide by number of ties */ rank /= (double) (j - i); for (k = i; k < j; ++k) gsl_vector_set(v, k, rank); i = j; } else { /* no tie - set rank to natural ordered position */ gsl_vector_set(v, i, i + 1.0); ++i; } } if (i == n - 1) gsl_vector_set(v, n - 1, (double) n); return GSL_SUCCESS; } /* compute_rank() */ gsl-doc-2.3/statistics/gsl_statistics_int.h0000664000175000017500000001077512616157443017261 0ustar eddedd/* statistics/gsl_statistics_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const int data[], const size_t stride, const size_t n); double gsl_stats_int_tss_m (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_correlation (const int data1[], const size_t stride1,const int data2[], const size_t stride2, const size_t n); double gsl_stats_int_spearman (const int data1[], const size_t stride1, const int data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/gsl_statistics.h0000664000175000017500000000100712616157443016373 0ustar eddedd#ifndef __GSL_STATISTICS_H__ #define __GSL_STATISTICS_H__ #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_STATISTICS_H__ */ gsl-doc-2.3/statistics/test_float_source.c0000664000175000017500000003261612616157443017065 0ustar eddedd/* statistics/test_float_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ss = FUNCTION(gsl_stats,tss) (groupb, strideb, nb); double expected = 0.01624436; gsl_test_rel (ss, expected, rel, NAME(gsl_stats) "_ss"); } { double mean = FUNCTION(gsl_stats,mean) (groupa, stridea, na); double ss = FUNCTION(gsl_stats,tss_m) (groupa, stridea, na, mean); double expected = 1.59372400000000e-02; gsl_test_rel (ss, expected, rel, NAME(gsl_stats) "_ss_m"); } { 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 wtss = FUNCTION(gsl_stats,wtss) (w, strideb, groupa, stridea, na); double expected = 1.39310864162578e-02; gsl_test_rel (wtss, expected, rel, NAME(gsl_stats) "_wtss"); } { double wmean = FUNCTION(gsl_stats,wmean) (w, strideb, groupa, stridea, na); double wtss = FUNCTION(gsl_stats,wtss_m) (w, strideb, groupa, stridea, na, wmean); double expected = 1.39310864162578e-02; gsl_test_rel (wtss, expected, rel, NAME(gsl_stats) "_wtss_m"); } { 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 r = FUNCTION(gsl_stats,correlation) (groupa, stridea, groupb, strideb, nb); double expected = -0.112322712666074171; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_correlation"); } { double *work = malloc(2 * na * sizeof(double)); double r = FUNCTION(gsl_stats,spearman) (groupa, stridea, groupb, strideb, nb, work); double expected = -0.1604395604395604396; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_spearman"); free(work); } { 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); } gsl-doc-2.3/statistics/p_variance_source.c0000664000175000017500000000266412616157443017030 0ustar eddedd/* statistics/p_variance_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/Makefile.in0000644000175000017500000011011513022372407015216 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 \ ../vector/libgslvector.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 ../vector/libgslvector.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu statistics/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslstatistics.la: $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_DEPENDENCIES) $(EXTRA_libgslstatistics_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/absdev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covariance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kurtosis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lag1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/median.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_variance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skew.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wabsdev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wkurtosis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wskew.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wvariance.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/statistics/ChangeLog0000664000175000017500000000771112616157443014745 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-10-02 Brian Gough * variance_source.c: added functions for sum of squares and weighted sum of squares 2006-01-07 Brian Gough * 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 * test_nist.c: added url/reference to the original NIST datasets Thu May 4 15:11:11 2000 Brian Gough * covariance.c: added covariance function Wed Mar 8 15:29:19 2000 Brian Gough * 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 * 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 * changed arguments of pvariance and ttest to have consistent form (DATA,STRIDE,SIZE) Mon Feb 28 20:29:08 2000 Brian Gough * 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 * test.c: added prototype for memcpy using #include Wed Aug 12 12:34:24 1998 Brian Gough * 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 * 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 * 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 * 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 * 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 * completely reorganised the source system to use macros as a primitive form of templates. Sun Mar 29 16:25:24 1998 Brian Gough * make everything const where possible (to reduce the chance of errors) Sun Mar 22 23:34:05 1998 Brian Gough * 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. gsl-doc-2.3/statistics/gsl_statistics_short.h0000664000175000017500000001122512616157443017615 0ustar eddedd/* statistics/gsl_statistics_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const short data[], const size_t stride, const size_t n); double gsl_stats_short_tss_m (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_correlation (const short data1[], const size_t stride1,const short data2[], const size_t stride2, const size_t n); double gsl_stats_short_spearman (const short data1[], const size_t stride1, const short data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/ttest_source.c0000664000175000017500000000324112616157443016054 0ustar eddedd/* statistics/ttest_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/wabsdev.c0000664000175000017500000000067412616157443014773 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/wskew_source.c0000664000175000017500000000400712616157443016052 0ustar eddedd/* statistics/wskew_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/minmax.c0000664000175000017500000000260712616157443014627 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/statistics/variance_source.c0000664000175000017500000000731012616157443016502 0ustar eddedd/* statistics/variance_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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,tss) (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 ; } static double FUNCTION(compute,tss) (const BASE data[], const size_t stride, const size_t n, const double mean) { /* takes a dataset and finds the sum of squares about the mean */ long double tss = 0 ; size_t i; /* find the sum of the squares */ for (i = 0; i < n; i++) { const long double delta = (data[i * stride] - mean); tss += delta * delta; } return tss ; } 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); } double FUNCTION(gsl_stats,tss_m) (const BASE data[], const size_t stride, const size_t n, const double mean) { const double tss = FUNCTION(compute,tss) (data, stride, n, mean); return tss; } double FUNCTION(gsl_stats,tss) (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,tss_m)(data, stride, n, mean); } gsl-doc-2.3/statistics/quantiles.c0000664000175000017500000000257312616157443015345 0ustar eddedd#include #include #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 gsl-doc-2.3/statistics/wvariance_source.c0000664000175000017500000001235012616157443016671 0ustar eddedd/* statistics/wvariance_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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,wtss) (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,wtss) (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 sum of squares about wmean*/ long double wtss = 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); wtss += wi * delta * delta; } } return wtss ; } 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 see the file doc/statnotes.tex for the derivation */ 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); } double FUNCTION(gsl_stats,wtss_m) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean) { const double wtss = FUNCTION(compute,wtss) (w, wstride, data, stride, n, wmean); return wtss; } double FUNCTION(gsl_stats,wtss) (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,wtss_m)(w, wstride, data, stride, n, wmean); } gsl-doc-2.3/statistics/ttest.c0000664000175000017500000000254112616157443014476 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/skew_source.c0000664000175000017500000000335512616157443015670 0ustar eddedd/* statistics/skew_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/statistics/variance.c0000664000175000017500000000260212616157443015121 0ustar eddedd#include #include #include #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 gsl-doc-2.3/statistics/gsl_statistics_uint.h0000664000175000017500000001162112616157443017435 0ustar eddedd/* statistics/gsl_statistics_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const unsigned int data[], const size_t stride, const size_t n); double gsl_stats_uint_tss_m (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_correlation (const unsigned int data1[], const size_t stride1,const unsigned int data2[], const size_t stride2, const size_t n); double gsl_stats_uint_spearman (const unsigned int data1[], const size_t stride1, const unsigned int data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/gsl_statistics_float.h0000664000175000017500000001553312616157443017571 0ustar eddedd/* statistics/gsl_statistics_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const float data[], const size_t stride, const size_t n); double gsl_stats_float_tss_m (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_correlation (const float data1[], const size_t stride1,const float data2[], const size_t stride2, const size_t n); double gsl_stats_float_spearman (const float data1[], const size_t stride1, const float data2[], const size_t stride2, const size_t n, double work[]); 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_wtss (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n); double gsl_stats_float_wtss_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 (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__ */ gsl-doc-2.3/statistics/gsl_statistics_ushort.h0000664000175000017500000001205112616157443020000 0ustar eddedd/* statistics/gsl_statistics_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_tss (const unsigned short data[], const size_t stride, const size_t n); double gsl_stats_ushort_tss_m (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_correlation (const unsigned short data1[], const size_t stride1,const unsigned short data2[], const size_t stride2, const size_t n); double gsl_stats_ushort_spearman (const unsigned short data1[], const size_t stride1, const unsigned short data2[], const size_t stride2, const size_t n, double work[]); 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__ */ gsl-doc-2.3/statistics/test.c0000664000175000017500000000573512616157443014322 0ustar eddedd/* statistics/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include 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 ()); } gsl-doc-2.3/statistics/median_source.c0000664000175000017500000000251412616157443016150 0ustar eddedd/* statistics/median_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/statistics/skew.c0000664000175000017500000000252612616157443014307 0ustar eddedd#include #include #include #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 gsl-doc-2.3/TODO0000664000175000017500000001730512616157443011471 0ustar eddedd# -*- org -*- #+TITLE: GSL TODO File * Main Todo Items We are looking for volunteers to do the following tasks. Consult the TODO files in each directory first for specific requirements. ** Document LQ linalg functions ** 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) ** Quasi-random number distributions ** ODE algorithms from RKSUITE ** Incomplete Fermi-Dirac 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 ) ** Cubature, e.g as provided by Cubpack. (Gert Van den Eynde ?) ** Fresnel Integrals ("Juergen J. Zach" ) ** Cumulative Distribution functions for discrete random distributions * Changes for Release 2.0 Break binary compatibility, but keep source compatibility. ** Add a 'void *' to all workspaces, to allow for future changes. ** Disable deprecated functions ** Fix up the workspace_alloc functions so they have consistent names (add functions where needed, don't remove) ** 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). ** gsl_roots doesn't store function value, so testing the residual requires function to be recomputed Generally all the iterative routines should follow a consistent approach to outputting everything that is necessary for the next iteration ** gsl_roots - consider having two returns from solvers - GSL_SUCCESS if a root has been found or GSL_CONTINUE if further iterations may be needed. ** mathieu functions - bring functional interfaces into line with GSL conventions for special functions. ** rewriting the spherical Bessel routines (there are around 3 separate bug reports for these) ** the nonlinear least squares Levenberg-Marquardt solver should be rewritten from scratch - the current version is filled with goto statements, and while its supposed to be based on MINPACK, I've found numerous examples where GSL fails to converge when MINPACK succeeds, so something was not implemented correctly. ** import 2D interpolation code; 3d or nd linear interpolation? * 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! ** 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/ ** From Goose ASCII import Categorical Sets Kernel Density Estimation Shampine Polynomial Regression Bootstrapping, Jacknife Descriptive: Range, Trimmed Mean, Winsorized Mean, Moments Harmonic mean, RMS, Durbin-Watson, AR1 independence Autocorr, Autocorr_z, Cramer vos Mises, Anderson-Darling Spearman-rho, Kendall-tau, EDF_D_both EDF_D_plus, EDF_D_minus, EDF_D, EDF_kuiper_V, pooled mean pooled var, Tests: kolmogorov_smirnov Moving average, Exponential moving average wilcoxon_statistic, wilcoxon_noties_cdf, wilcoxon_general_cdf Cochran Q test, KruskalWallis, McNemar, spearman_Rocc * 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. ** 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. gsl-doc-2.3/gsl_version.h.in0000664000175000017500000000076412616157443014112 0ustar eddedd#ifndef __GSL_VERSION_H__ #define __GSL_VERSION_H__ #include #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@" #define GSL_MAJOR_VERSION @GSL_MAJOR_VERSION@ #define GSL_MINOR_VERSION @GSL_MINOR_VERSION@ GSL_VAR const char * gsl_version; __END_DECLS #endif /* __GSL_VERSION_H__ */ gsl-doc-2.3/multiset/0000755000175000017500000000000013022553153012625 5ustar eddeddgsl-doc-2.3/multiset/Makefile.am0000664000175000017500000000121112616157443014670 0ustar eddeddnoinst_LTLIBRARIES = libgslmultiset.la pkginclude_HEADERS = gsl_multiset.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultiset_la_SOURCES = init.c file.c multiset.c inline.c noinst_HEADERS = TESTS = $(check_PROGRAMS) check_PROGRAMS = test test_SOURCES = test.c test_LDADD = libgslmultiset.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 = libgslmultiset.la ../vector/libgslvector.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la gsl-doc-2.3/multiset/file.c0000664000175000017500000000470212616157443013727 0ustar eddedd/* multiset/file.c * based on combination/file.c by Szymon Jaroszewicz * based on permutation/file.c by Brian Gough * * Copyright (C) 2001 Szymon Jaroszewicz * Copyright (C) 2009 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #define IN_FORMAT "%lu" int gsl_multiset_fread (FILE * stream, gsl_multiset * 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_multiset_fwrite (FILE * stream, const gsl_multiset * 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_multiset_fprintf (FILE * stream, const gsl_multiset * 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_multiset_fscanf (FILE * stream, gsl_multiset * 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; } gsl-doc-2.3/multiset/TODO0000664000175000017500000000020712616157443013330 0ustar eddedd# -*- org -*- #+CATEGORY: multiset * The module has a lot of overlap with combination/ some of the functions could be abstracted out. gsl-doc-2.3/multiset/init.c0000664000175000017500000000523012616157443013750 0ustar eddedd/* multiset/init.c * based on combination/init.c by Szymon Jaroszewicz * based on permutation/init.c by Brian Gough * * Copyright (C) 2001 Szymon Jaroszewicz * Copyright (C) 2009 Brian Gough * Copyright (C) 2009 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include gsl_multiset * gsl_multiset_alloc (const size_t n, const size_t k) { gsl_multiset * c; if (n == 0) { GSL_ERROR_VAL ("multiset parameter n must be positive integer", GSL_EDOM, 0); } c = (gsl_multiset *) malloc (sizeof (gsl_multiset)); if (c == 0) { GSL_ERROR_VAL ("failed to allocate space for multiset 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 multiset data", GSL_ENOMEM, 0); } } else { c->data = 0; } c->n = n; c->k = k; return c; } gsl_multiset * gsl_multiset_calloc (const size_t n, const size_t k) { size_t i; gsl_multiset * c = gsl_multiset_alloc (n, k); if (c == 0) return 0; /* initialize multiset to repeated first element */ for (i = 0; i < k; i++) { c->data[i] = 0; } return c; } void gsl_multiset_init_first (gsl_multiset * c) { const size_t k = c->k ; size_t i; /* initialize multiset to repeated first element */ for (i = 0; i < k; i++) { c->data[i] = 0; } } void gsl_multiset_init_last (gsl_multiset * c) { const size_t k = c->k ; size_t i; size_t n = c->n; /* initialize multiset to repeated last element */ for (i = 0; i < k; i++) { c->data[i] = n - 1; } } void gsl_multiset_free (gsl_multiset * c) { RETURN_IF_NULL (c); if (c->k > 0) free (c->data); free (c); } gsl-doc-2.3/multiset/inline.c0000664000175000017500000000160712616157443014267 0ustar eddedd/* multiset/inline.c * * Copyright (C) 2008 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/multiset/Makefile.in0000644000175000017500000010456413022372406014704 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = multiset DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultiset_la_LIBADD = am_libgslmultiset_la_OBJECTS = init.lo file.lo multiset.lo inline.lo libgslmultiset_la_OBJECTS = $(am_libgslmultiset_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultiset.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultiset_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultiset_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultiset.la pkginclude_HEADERS = gsl_multiset.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultiset_la_SOURCES = init.c file.c multiset.c inline.c noinst_HEADERS = TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultiset.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multiset/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multiset/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultiset.la: $(libgslmultiset_la_OBJECTS) $(libgslmultiset_la_DEPENDENCIES) $(EXTRA_libgslmultiset_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultiset_la_OBJECTS) $(libgslmultiset_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #noinst_PROGRAMS = demo #demo_SOURCES = demo.c #demo_LDADD = libgslmultiset.la ../vector/libgslvector.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: gsl-doc-2.3/multiset/ChangeLog0000664000175000017500000000077612616157443014425 0ustar eddedd2011-09-12 Rhys Ulerich * init.c (gsl_multiset_alloc): remove incorrect (k, n) constraint per question from Michael Underwood . k strictly greater than n is permissible. Incorrect constraint due to copy'n'pase from combinations logic. * multiset.c (gsl_multiset_valid): likewise * test.c: add tests to verify k > n working as expected. 2009-09-21 Rhys Ulerich * added multiset support to GSL based on combinations gsl-doc-2.3/multiset/multiset.c0000664000175000017500000000655612616157443014667 0ustar eddedd/* multiset/multiset.c * based on combination/combination.c by Szymon Jaroszewicz * based on permutation/permutation.c by Brian Gough * * Copyright (C) 2001 Szymon Jaroszewicz * Copyright (C) 2009 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include size_t gsl_multiset_n (const gsl_multiset * c) { return c->n ; } size_t gsl_multiset_k (const gsl_multiset * c) { return c->k ; } size_t * gsl_multiset_data (const gsl_multiset * c) { return c->data ; } int gsl_multiset_valid (gsl_multiset * c) { const size_t n = c->n ; const size_t k = c->k ; size_t i, j ; for (i = 0; i < k; i++) { const size_t ci = c->data[i]; if (ci >= n) { GSL_ERROR("multiset index outside range", GSL_FAILURE) ; } for (j = 0; j < i; j++) { if (c->data[j] > ci) { GSL_ERROR("multiset indices not in increasing order", GSL_FAILURE) ; } } } return GSL_SUCCESS; } int gsl_multiset_next (gsl_multiset * c) { /* Replaces c with the next multiset (in the standard lexicographical * ordering). Returns GSL_FAILURE if there is no next multiset. */ 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-1) { --i; } if (i == 0 && data[0] == n-1) { return GSL_FAILURE; } ++data[i]; while(i < k-1) { data[i+1] = data[i]; ++i; } return GSL_SUCCESS; } int gsl_multiset_prev (gsl_multiset * c) { /* Replaces c with the previous multiset (in the standard * lexicographical ordering). Returns GSL_FAILURE if there is no * previous multiset. */ 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-1] == data[i]) { --i; } if(i == 0 && data[i] == 0) { return GSL_FAILURE; } data[i]--; if (data[i] < n-1) { while (i < k-1) { data[++i] = n - 1; } } return GSL_SUCCESS; } int gsl_multiset_memcpy (gsl_multiset * dest, const gsl_multiset * 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 ("multiset 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; } gsl-doc-2.3/multiset/gsl_multiset.h0000664000175000017500000000534012616157443015527 0ustar eddedd/* multiset/gsl_multiset.h * based on combination/gsl_combination.h by Szymon Jaroszewicz * based on permutation/gsl_permutation.h by Brian Gough * * Copyright (C) 2009 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MULTISET_H__ #define __GSL_MULTISET_H__ #include #include #include #include #include #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_multiset_struct { size_t n; size_t k; size_t *data; }; typedef struct gsl_multiset_struct gsl_multiset; gsl_multiset *gsl_multiset_alloc (const size_t n, const size_t k); gsl_multiset *gsl_multiset_calloc (const size_t n, const size_t k); void gsl_multiset_init_first (gsl_multiset * c); void gsl_multiset_init_last (gsl_multiset * c); void gsl_multiset_free (gsl_multiset * c); int gsl_multiset_memcpy (gsl_multiset * dest, const gsl_multiset * src); int gsl_multiset_fread (FILE * stream, gsl_multiset * c); int gsl_multiset_fwrite (FILE * stream, const gsl_multiset * c); int gsl_multiset_fscanf (FILE * stream, gsl_multiset * c); int gsl_multiset_fprintf (FILE * stream, const gsl_multiset * c, const char *format); size_t gsl_multiset_n (const gsl_multiset * c); size_t gsl_multiset_k (const gsl_multiset * c); size_t * gsl_multiset_data (const gsl_multiset * c); int gsl_multiset_valid (gsl_multiset * c); int gsl_multiset_next (gsl_multiset * c); int gsl_multiset_prev (gsl_multiset * c); INLINE_DECL size_t gsl_multiset_get (const gsl_multiset * c, const size_t i); #ifdef HAVE_INLINE INLINE_FUN size_t gsl_multiset_get (const gsl_multiset * c, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= c->k)) /* size_t is unsigned, can't be negative */ { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return c->data[i]; } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_MULTISET_H__ */ gsl-doc-2.3/multiset/test.c0000664000175000017500000002057612616157443013776 0ustar eddedd/* multiset/test.c * based on combination/test.c by Szymon Jaroszewicz * based on permutation/test.c by Brian Gough * * Copyright (C) 2001 Szymon Jaroszewicz * Copyright (C) 2009 Rhys Ulerich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include size_t c63[56][3] = { { 0,0,0 }, { 0,0,1 }, { 0,0,2 }, { 0,0,3 }, { 0,0,4 }, { 0,0,5 }, { 0,1,1 }, { 0,1,2 }, { 0,1,3 }, { 0,1,4 }, { 0,1,5 }, { 0,2,2 }, { 0,2,3 }, { 0,2,4 }, { 0,2,5 }, { 0,3,3 }, { 0,3,4 }, { 0,3,5 }, { 0,4,4 }, { 0,4,5 }, { 0,5,5 }, { 1,1,1 }, { 1,1,2 }, { 1,1,3 }, { 1,1,4 }, { 1,1,5 }, { 1,2,2 }, { 1,2,3 }, { 1,2,4 }, { 1,2,5 }, { 1,3,3 }, { 1,3,4 }, { 1,3,5 }, { 1,4,4 }, { 1,4,5 }, { 1,5,5 }, { 2,2,2 }, { 2,2,3 }, { 2,2,4 }, { 2,2,5 }, { 2,3,3 }, { 2,3,4 }, { 2,3,5 }, { 2,4,4 }, { 2,4,5 }, { 2,5,5 }, { 3,3,3 }, { 3,3,4 }, { 3,3,5 }, { 3,4,4 }, { 3,4,5 }, { 3,5,5 }, { 4,4,4 }, { 4,4,5 }, { 4,5,5 }, { 5,5,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_multiset * c ; gsl_ieee_env_setup (); c = gsl_multiset_alloc (6,3); /* Test multisets in forward order */ gsl_multiset_init_first (c); i = 0; do { if ( i >= 56 ) { status = 1; break; } for (j = 0; j < 3; j++) { status |= (c->data[j] != c63[i][j]); } { int s1 = gsl_multiset_valid (c); gsl_test (s1, "gsl_multiset_valid (%u)", i); } i++; } while (gsl_multiset_next(c) == GSL_SUCCESS); gsl_test(status, "gsl_multiset_next, 6 choose 3 multiset, 56 steps"); gsl_multiset_next(c); gsl_multiset_next(c); gsl_multiset_next(c); for (j = 0; j < 3; j++) { status |= (c->data[j] != c63[55][j]); } gsl_test(status, "gsl_multiset_next on the last multiset"); { int s1 = gsl_multiset_valid (c); gsl_test (s1, "gsl_multiset_valid on the last multiset"); } { gsl_multiset * d = gsl_multiset_alloc (6,3); gsl_multiset_memcpy (d, c); status = 0; for (j = 0; j < 3; j++) { status |= (d->data[j] != c->data[j]); } gsl_test (status, "gsl_multiset_memcpy, 6 choose 3 multiset"); gsl_multiset_free(d); } /* Now test multisets in reverse order */ gsl_multiset_init_last (c); i = 56; do { if ( i == 0 ) { status = 1; break; } i--; for (j = 0; j < 3; j++) { status |= (c->data[j] != c63[i][j]); } { int s1 = gsl_multiset_valid (c); gsl_test (s1, "gsl_multiset_valid (%u)", i); } } while (gsl_multiset_prev(c) == GSL_SUCCESS); gsl_test(status, "gsl_multiset_prev, 6 choose 3 multiset, 20 steps"); gsl_multiset_prev(c); gsl_multiset_prev(c); gsl_multiset_prev(c); for (j = 0; j < 3; j++) { status |= (c->data[j] != c63[0][j]); } gsl_test(status, "gsl_multiset_prev on the first multiset"); { int s1 = gsl_multiset_valid (c); gsl_test (s1, "gsl_multiset_valid on the first multiset"); } { gsl_multiset * d = gsl_multiset_alloc (6,3); gsl_multiset_memcpy (d, c); status = 0; for (j = 0; j < 3; j++) { status |= (d->data[j] != c->data[j]); } gsl_test (status, "gsl_multiset_memcpy, 6 choose 3 multiset"); gsl_multiset_free(d); } gsl_multiset_free (c); /* Check k = 3 strictly greater than n = 2 gives results */ /* {0, 0, 0}, {0, 0, 1}, {0, 1, 1,}, and {1, 1, 1}. */ c = gsl_multiset_calloc(2, 3); status |= (c->data[0] != 0); status |= (c->data[1] != 0); status |= (c->data[2] != 0); status |= (gsl_multiset_valid(c) != GSL_SUCCESS); status |= (gsl_multiset_next(c) == GSL_FAILURE); status |= (c->data[0] != 0); status |= (c->data[1] != 0); status |= (c->data[2] != 1); status |= (gsl_multiset_valid(c) != GSL_SUCCESS); status |= (gsl_multiset_next(c) == GSL_FAILURE); status |= (c->data[0] != 0); status |= (c->data[1] != 1); status |= (c->data[2] != 1); status |= (gsl_multiset_valid(c) != GSL_SUCCESS); status |= (gsl_multiset_next(c) == GSL_FAILURE); status |= (c->data[0] != 1); status |= (c->data[1] != 1); status |= (c->data[2] != 1); status |= (gsl_multiset_valid(c) != GSL_SUCCESS); status |= (gsl_multiset_next(c) != GSL_FAILURE); gsl_test(status, "gsl_multiset 2 choose 3"); gsl_multiset_free (c); c = gsl_multiset_calloc(7, 0); /* should return GSL_FAILURE every time */ status |= (gsl_multiset_next(c) != GSL_FAILURE); status |= (gsl_multiset_next(c) != GSL_FAILURE); status |= (gsl_multiset_prev(c) != GSL_FAILURE); status |= (gsl_multiset_prev(c) != GSL_FAILURE); gsl_test(status, "gsl_multiset 7 choose 0"); gsl_multiset_free (c); c = gsl_multiset_calloc(1, 1); /* should return GSL_FAILURE every time */ for(j = 0; j < 1; j++) { status |= (gsl_multiset_get(c, j) != j); } status |= (gsl_multiset_next(c) != GSL_FAILURE); for(j = 0; j < 1; j++) { status |= (gsl_multiset_get(c, j) != j); } status |= (gsl_multiset_next(c) != GSL_FAILURE); for(j = 0; j < 1; j++) { status |= (gsl_multiset_get(c, j) != j); } status |= (gsl_multiset_prev(c) != GSL_FAILURE); for(j = 0; j < 1; j++) { status |= (gsl_multiset_get(c, j) != j); } status |= (gsl_multiset_prev(c) != GSL_FAILURE); for(j = 0; j < 1; j++) { status |= (gsl_multiset_get(c, j) != j); } gsl_test(status, "gsl_multiset 7 choose 7"); gsl_multiset_free (c); c = gsl_multiset_calloc(6, 3); gsl_set_error_handler (&my_error_handler); c->data[0] = 1; c->data[1] = 2; c->data[2] = 1; s = gsl_multiset_valid (c); gsl_test (!s, "gsl_multiset_valid on an invalid multiset (1,1,2)"); c->data[0] = 2; c->data[1] = 1; c->data[2] = 0; s = gsl_multiset_valid (c); gsl_test (!s, "gsl_multiset_valid on an invalid multiset (2,1,0)"); c->data[0] = 1; c->data[1] = 2; c->data[2] = 0; s = gsl_multiset_valid (c); gsl_test (!s, "gsl_multiset_valid on an invalid multiset (1,2,0)"); { gsl_multiset * d = gsl_multiset_alloc (6,4); int s = gsl_multiset_memcpy (d, c); gsl_test (!s, "gsl_multiset_memcpy, (6,4) vs (6,3)"); gsl_multiset_free(d); } { gsl_multiset * d = gsl_multiset_alloc (7,3); int s = gsl_multiset_memcpy (d, c); gsl_test (!s, "gsl_multiset_memcpy, (7,3) vs (6,3)"); gsl_multiset_free(d); } { gsl_multiset * d = gsl_multiset_alloc (7,2); int s = gsl_multiset_memcpy (d, c); gsl_test (!s, "gsl_multiset_memcpy, (7,2) vs (6,3)"); gsl_multiset_free(d); } gsl_multiset_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) ; } gsl-doc-2.3/utils/0000755000175000017500000000000013022553152012116 5ustar eddeddgsl-doc-2.3/utils/strtol.c0000664000175000017500000000744412616157443013637 0ustar eddedd/* 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 3 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 #include #include #include #include #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; } gsl-doc-2.3/utils/Makefile.am0000664000175000017500000000030112616157443014161 0ustar eddeddnoinst_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 gsl-doc-2.3/utils/memcpy.c0000664000175000017500000000065012616157443013572 0ustar eddedd/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined if the source overlaps with the destination. Return DESTADDR. */ #if HAVE_CONFIG_H #include #endif void * memcpy (destaddr, srcaddr, len) void *destaddr; const void *srcaddr; unsigned int len; { char *dest = (char *) destaddr; const char *src = srcaddr; while (len-- > 0) *dest++ = *src++; return destaddr; } gsl-doc-2.3/utils/placeholder.c0000664000175000017500000000014012616157443014554 0ustar eddeddvoid gsl_utils_placeholder (void); void gsl_utils_placeholder (void) { int i = 0; i++ ; } gsl-doc-2.3/utils/strtoul.c0000664000175000017500000000155512616157443014021 0ustar eddedd/* 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 3 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 gsl-doc-2.3/utils/memmove.c0000664000175000017500000000133112616157443013742 0ustar eddedd/* memmove.c -- copy memory. Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate. In the public domain. By David MacKenzie . */ #if HAVE_CONFIG_H #include #endif void * memmove (destaddr, sourceaddr, length) void *destaddr; const void *sourceaddr; unsigned length; { char *dest = destaddr; const char *source = sourceaddr; 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++; return destaddr; } gsl-doc-2.3/utils/Makefile.in0000644000175000017500000004506013022372407014172 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs strtoul.c strdup.c memmove.c \ memcpy.c strtol.c $(top_srcdir)/depcomp README 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libutils_la_DEPENDENCIES = @LIBOBJS@ am_libutils_la_OBJECTS = placeholder.lo libutils_la_OBJECTS = $(am_libutils_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libutils_la_SOURCES) DIST_SOURCES = $(libutils_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libutils.la: $(libutils_la_OBJECTS) $(libutils_la_DEPENDENCIES) $(EXTRA_libutils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libutils_la_OBJECTS) $(libutils_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoul.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/placeholder.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -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: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am 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 tags-am uninstall uninstall-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: gsl-doc-2.3/utils/README0000664000175000017500000000027012616157443013012 0ustar eddeddSome 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.) gsl-doc-2.3/utils/system.h0000664000175000017500000000463312616157443013636 0ustar eddedd/* 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 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public 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 TEXINFO_SYSTEM_H #define TEXINFO_SYSTEM_H #define _GNU_SOURCE #include /* should be included before any preprocessor test of _POSIX_VERSION. */ #if HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #include #if HAVE_LOCALE_H #include #endif #include /* 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 # endif # include #else # include char *memchr (); #endif #ifdef STDC_HEADERS #define getopt system_getopt #include #undef getopt #else extern char *getenv (); #endif #ifndef HAVE_STRERROR extern char *strerror (); #endif #include #ifndef errno extern int errno; #endif #ifdef VMS #include #endif #include #if HAVE_SYS_FILE_H #include #endif /* HAVE_SYS_FILE_H */ #ifndef O_RDONLY /* Since is POSIX, prefer that to . This also avoids some useless warnings on (at least) Linux. */ #if HAVE_FCNTL_H #include #else /* not HAVE_FCNTL_H */ #if HAVE_SYS_FCNTL_H #include #endif /* not HAVE_SYS_FCNTL_H */ #endif /* not HAVE_FCNTL_H */ #endif /* not O_RDONLY */ #if HAVE_PWD_H #include #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 */ gsl-doc-2.3/utils/strdup.c0000664000175000017500000000226712616157443013627 0ustar eddedd/* 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 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public 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 #endif #ifdef STDC_HEADERS #include #include #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; } gsl-doc-2.3/aclocal.m40000644000175000017500000125013213022372402012617 0ustar eddedd# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 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. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_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 "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl 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 # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. 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 delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # 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 sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -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 Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, 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 TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # 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 cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_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 _LT_EOF ;; esac _LT_PROG_LTMAIN # 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) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])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_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$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. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$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 -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_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${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed '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${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # 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. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_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 '$LINENO' "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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; 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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[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 ;; *-*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*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 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 \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$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:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/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 -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # 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* | cegcc*) # 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; ;; mint*) # On MiNT this can take a long time and run out of memory. 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 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; 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 ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then 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` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # 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. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` 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` fi ;; 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 max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_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 <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_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_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_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* | cegcc*) 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="-ldld"], [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="-ldld"]) ]) ]) ]) ]) ]) ;; 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_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_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 _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$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:$LINENO: $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:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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_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 .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_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 _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_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 _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_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_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) 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" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # 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. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) 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" 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 # correct to gnu/linux during the next big refactor 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' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor 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.so # instead of lib.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*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor 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* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc 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~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' 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}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; 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 dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. 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 # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # 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' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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}${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`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor 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 ;; 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[[23]].*) 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 ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor 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 ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" 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=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor 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 # correct to gnu/linux during the next big refactor 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 glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor 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 # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # 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>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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' ;; 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 # correct to gnu/linux during the next big refactor 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=qnx 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='ldqnx.so' ;; 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" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor 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 # correct to gnu/linux during the next big refactor 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 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 # correct to gnu/linux during the next big refactor 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 shlibpath_overrides_runpath=yes 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' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' 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' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor 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 if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[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]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_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="m4_if([$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 <<_LT_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 _LT_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 _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_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 _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_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])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 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | 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 ;; haiku*) 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])(-bit)?( [LM]SB)? 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 ;; interix[[3-9]]*) # 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 glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) 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=pass_all ;; 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 ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) 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 ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi 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 _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (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 : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-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_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # 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]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' 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 # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # 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 # Try without a prefix underscore, 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. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_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 <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_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_globsym_save_LIBS CFLAGS=$lt_globsym_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 -rf 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 # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # 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_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_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 ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_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_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # 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_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # 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 # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_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_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # 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. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = 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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[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 aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_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_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_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_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_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_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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$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' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $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_TAGVAR(ld_shlibs, $1)=no cat <<_LT_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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_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_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 ;; *) # 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. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_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_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_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_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_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) 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 # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_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]].*|aix[[5-9]]*) 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_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 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 : else # We have old collect2 _LT_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_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_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 _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_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 func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_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_SYS_MODULE_PATH_AIX([$1]) _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_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*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_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' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_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_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_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_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_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' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_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} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_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_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_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_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_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_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$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_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl 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_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # 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 ;; aix[[4-9]]*) 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_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl 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 else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_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_CFLAGS=$CFLAGS 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++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_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_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_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_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 -v "^Configured with:" | $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_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) 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]].*|aix[[5-9]]*) 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_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 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 : else # We have old collect2 _LT_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_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_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 _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_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 func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_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_SYS_MODULE_PATH_AIX([$1]) _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_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_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_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_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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_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_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_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) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_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; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_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_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_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_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-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_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_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) 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_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_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; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # 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_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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 -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_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::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_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_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_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | 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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_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=`func_echo_all "$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; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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 -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_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_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -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 -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_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 -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_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. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$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_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC 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 fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([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. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= 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... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac 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 for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${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 fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} 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_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_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_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$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_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_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 CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # 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_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # 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. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_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_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_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_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then 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 ;; aix[[4-9]]*) 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_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_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_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then 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 ;; aix[[4-9]]*) 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_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_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_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_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_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # 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_TAG_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_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # 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. # m4_defun([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 IFS=$as_save_IFS 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_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # 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 lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002-2013 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. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 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-2013 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_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl 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])]) # Copyright (C) 1999-2013 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 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_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 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 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.65])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 if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi 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], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])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]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # 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])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # 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_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 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 if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 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. # 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-2013 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_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 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_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 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_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 is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 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_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], [m4_foreach_w([_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-2013 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_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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 if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done 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]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 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_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 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="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 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_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 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_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. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} 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 /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 gsl-doc-2.3/sys/0000755000175000017500000000000013022553152011574 5ustar eddeddgsl-doc-2.3/sys/infnan.c0000664000175000017500000000527212616157443013234 0ustar eddedd/* sys/infnan.c * * Copyright (C) 2001, 2004, 2007, 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #if HAVE_IEEEFP_H #include #endif #include 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 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); } #else # if HAVE_DECL_ISFINITE int gsl_finite (const double x) { return isfinite(x); } # elif HAVE_DECL_FINITE int gsl_finite (const double x) { return finite(x); } # elif HAVE_IEEE_COMPARISONS int gsl_finite (const double x) { const double y = x - x; int status = (y == y); return status; } # else # error "cannot define gsl_finite without HAVE_DECL_FINITE or HAVE_IEEE_COMPARISONS" # endif # if HAVE_DECL_ISNAN int gsl_isnan (const double x) { return isnan(x); } #elif HAVE_IEEE_COMPARISONS int gsl_isnan (const double x) { int status = (x != x); return status; } # else # error "cannot define gsl_isnan without HAVE_DECL_ISNAN or HAVE_IEEE_COMPARISONS" # endif # if HAVE_DECL_ISINF int gsl_isinf (const double x) { /* isinf(3): In glibc 2.01 and earlier, isinf() returns a non-zero value (actually: 1) if x is an infinity (positive or negative). (This is all that C99 requires.) */ if (isinf(x)) { return (x > 0) ? 1 : -1; } else { return 0; } } # else int gsl_isinf (const double x) { if (! gsl_finite(x) && ! gsl_isnan(x)) { return (x > 0 ? +1 : -1); } else { return 0; } } # endif #endif gsl-doc-2.3/sys/ldfrexp.c0000664000175000017500000000436112616157443013425 0ustar eddedd/* sys/ldfrexp.c * * Copyright (C) 2002, Gert Van den Eynde * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include double gsl_ldexp (const double x, const int e) { int ex; if (x == 0.0) { return x; } { double y = gsl_frexp (x, &ex); double e2 = e + ex, p2; if (e2 >= DBL_MAX_EXP) { y *= pow (2.0, e2 - DBL_MAX_EXP + 1); e2 = DBL_MAX_EXP - 1; } else if (e2 <= DBL_MIN_EXP) { y *= pow (2.0, e2 - DBL_MIN_EXP - 1); e2 = DBL_MIN_EXP + 1; } p2 = pow (2.0, e2); return y * p2; } } double gsl_frexp (const double x, int *e) { if (x == 0.0) { *e = 0; return 0.0; } else if (!gsl_finite (x)) { *e = 0; return x; } else if (fabs (x) >= 0.5 && fabs (x) < 1) /* Handle the common case */ { *e = 0; return x; } else { double ex = ceil (log (fabs (x)) / M_LN2); int ei = (int) ex; double f; /* Prevent underflow and overflow of 2**(-ei) */ if (ei < DBL_MIN_EXP) ei = DBL_MIN_EXP; if (ei > -DBL_MIN_EXP) ei = -DBL_MIN_EXP; f = x * pow (2.0, -ei); if (!gsl_finite (f)) { /* This should not happen */ *e = 0; return f; } while (fabs (f) >= 1.0) { ei++; f /= 2.0; } while (fabs (f) > 0 && fabs (f) < 0.5) { ei--; f *= 2.0; } *e = ei; return f; } } gsl-doc-2.3/sys/Makefile.am0000664000175000017500000000065512616157443013653 0ustar eddeddnoinst_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 AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/sys/expm1.c0000664000175000017500000000253712616157443013016 0ustar eddedd/* sys/expm1.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } } gsl-doc-2.3/sys/invhyp.c0000664000175000017500000000417212616157443013276 0ustar eddedd/* sys/invhyp.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } } gsl-doc-2.3/sys/hypot.c0000664000175000017500000000367712616157443013135 0ustar eddedd/* sys/hypot.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include double gsl_hypot (const double x, const double y) { double xabs = fabs(x) ; double yabs = fabs(y) ; double min, max; /* Follow the optional behavior of the ISO C standard and return +Inf when any of the argument is +-Inf, even if the other is NaN. http://pubs.opengroup.org/onlinepubs/009695399/functions/hypot.html */ if (gsl_isinf(x) || gsl_isinf(y)) { return GSL_POSINF; } 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) ; } } double gsl_hypot3(const double x, const double y, const double z) { double xabs = fabs(x); double yabs = fabs(y); double zabs = fabs(z); double w = GSL_MAX(xabs, GSL_MAX(yabs, zabs)); if (w == 0.0) { return (0.0); } else { double r = w * sqrt((xabs / w) * (xabs / w) + (yabs / w) * (yabs / w) + (zabs / w) * (zabs / w)); return r; } } gsl-doc-2.3/sys/log1p.c0000664000175000017500000000203312616157443012775 0ustar eddedd/* sys/log1p.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include double gsl_log1p (const double x) { volatile double y, z; y = 1 + x; z = y - 1; return log(y) - (z-x)/y ; /* cancels errors with IEEE arithmetic */ } gsl-doc-2.3/sys/fcmp.c0000664000175000017500000000320712616157443012704 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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 */ } } gsl-doc-2.3/sys/fdiv.c0000664000175000017500000000163112616157443012706 0ustar eddedd/* sys/fdiv.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include double gsl_fdiv (const double x, const double y) { return x / y; } gsl-doc-2.3/sys/Makefile.in0000644000175000017500000010514713022372407013653 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsys.la: $(libgslsys_la_OBJECTS) $(libgslsys_la_DEPENDENCIES) $(EXTRA_libgslsys_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsys_la_OBJECTS) $(libgslsys_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coerce.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expm1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdiv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infnan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invhyp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldfrexp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log1p.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/sys/ChangeLog0000664000175000017500000001216412616157443013367 0ustar eddedd2011-05-20 Brian Gough * hypot.c (gsl_hypot): handle case where x or y is infinite 2010-10-12 Brian Gough * pow_int.c (gsl_pow_uint): added function gsl_pow_uint(x,n) for unsigned n (larger range) (gsl_pow_int): handle case where n=MIN_INT correctly 2010-02-15 Brian Gough * infnan.c: use #error if gsl_isnan or gsl_finite cannot be defined 2009-08-21 Brian Gough * test.c (main): move x/=2 outside test of while loops because it is (possibly) not volatile. 2008-10-13 Brian Gough * log1p.c: use gsl_sys.h header file * infnan.c: use gsl_sys.h header file * hypot.c: use gsl_sys.h header file * fdiv.c: use gsl_sys.h header file * coerce.c: use gsl_sys.h header file 2008-10-08 Brian Gough * infnan.c (gsl_isinf): handle the case where isinf(-inf) returns +1 2008-07-03 Brian Gough * prec.c: compile inline functions from header here * pow_int.c: compile inline functions from header here * minmax.c: compile inline functions from header here 2008-03-18 Brian Gough * test.c (main): use volatile to avoid extended precision in loop * ldfrexp.c (gsl_ldexp): added a test for x==0 2007-11-04 Brian Gough * ldfrexp.c (gsl_ldexp): handle full range of double precision (gsl_frexp): handle full range of double precision 2007-07-30 Brian Gough * infnan.c (gsl_finite): use isfinite (c99) in preference to finite 2007-07-23 Brian Gough * log1p.c (gsl_log1p): added another volatile to prevent unwanted optimisation 2007-04-03 Brian Gough * infnan.c (gsl_isinf): now return -1 for -Inf instead of +1 * test.c (main): add test for -inf * infnan.c (gsl_finite): always use finite where available (gsl_isnan): always use isnan where available (gsl_isinf): always use isinf where available 2005-11-14 Brian Gough * test.c: added tests for constants 2005-04-05 Brian Gough * infnan.c: added #include ieeefp.h for Solaris 2004-12-22 Brian Gough * infnan.c (gsl_isinf): added missing return type of int 2003-09-02 Brian Gough * infnan.c (gsl_isinf): added fallback for missing isinf (IRIX) 2003-07-24 Brian Gough * invhyp.c: removed duplicate declarations * ldfrexp.c: removed duplicate declarations * expm1.c: removed duplicate declaration of gsl_expm1 2003-01-02 Brian Gough * 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 * ldfrexp.c: fix include to use instead of 2002-08-25 Brian Gough * 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 * 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 * 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 * infnan.c: added gsl_isnan, gsl_isinf, gsl_isreal Sun Feb 25 11:54:21 2001 Brian Gough * invhyp.c: added gsl_acosh, gsl_asinh, gsl_atanh Mon Jan 29 10:53:06 2001 Brian Gough * 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 * coerce.c: added functions for coercing values out of registers so they are correctly rounded Sun Oct 22 15:00:24 2000 Brian Gough * expm1.c (gsl_expm1): added gsl_expm1, a substitute for BSD's expm1 Mon Apr 3 16:58:53 2000 Brian Gough * params.c (main): added parentheses around negative output values Tue Mar 21 12:44:07 2000 Brian Gough * hypot.c: added a quick gsl_hypot function for sqrt(x^2+y^2) 1999-07-14 Mark Galassi * 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 * params.c: added program for printing ieee parameters gsl-doc-2.3/sys/gsl_sys.h0000664000175000017500000000364212616157443013452 0ustar eddedd/* sys/gsl_sys.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_hypot3 (const double x, const double y, const double z); 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__ */ gsl-doc-2.3/sys/minmax.c0000664000175000017500000000221312616157443013244 0ustar eddedd/* sys/minmax.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include /* Define some static functions which are always available */ double gsl_max (double a, double b) { return GSL_MAX (a, b); } double gsl_min (double a, double b) { return GSL_MIN (a, b); } gsl-doc-2.3/sys/coerce.c0000664000175000017500000000233112616157443013214 0ustar eddedd/* sys/coerce.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include double gsl_coerce_double (const double x) { volatile double y; y = x; return y; } 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) { volatile long double y; y = x; return y; } gsl-doc-2.3/sys/pow_int.c0000664000175000017500000000256212616157443013441 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include double gsl_pow_int(double x, int n) { unsigned int un; if(n < 0) { x = 1.0/x; un = -n; } else { un = n; } return gsl_pow_uint(x, un); } double gsl_pow_uint(double x, unsigned int n) { double value = 1.0; /* 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; } gsl-doc-2.3/sys/prec.c0000664000175000017500000000342712616157443012714 0ustar eddedd/* sys/prec.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include #include 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 }; gsl-doc-2.3/sys/test.c0000664000175000017500000004436012616157443012743 0ustar eddedd/* sys/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 +-Inf, finite */ y = gsl_hypot (GSL_POSINF, 1.2); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_POSINF, 1.2)"); y = gsl_hypot (GSL_NEGINF, 1.2); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NEGINF, 1.2)"); y = gsl_hypot (1.2, GSL_POSINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_POSINF)"); y = gsl_hypot (1.2, GSL_NEGINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_NEGINF)"); /* Test NaN, finite */ y = gsl_hypot (GSL_NAN, 1.2); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, 1.2)"); y = gsl_hypot (1.2, GSL_NAN); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_NAN)"); /* Test NaN, NaN */ y = gsl_hypot (GSL_NAN, GSL_NAN); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_NAN)"); /* Test +Inf, NaN */ y = gsl_hypot (GSL_POSINF, GSL_NAN); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_POSINF, GSL_NAN)"); /* Test -Inf, NaN */ y = gsl_hypot (GSL_NEGINF, GSL_NAN); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NEGINF, GSL_NAN)"); /* Test NaN, +Inf */ y = gsl_hypot (GSL_NAN, GSL_POSINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_POSINF)"); /* Test NaN, -Inf */ y = gsl_hypot (GSL_NAN, GSL_NEGINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_NEGINF)"); /* Test for gsl_hypot3 */ y = gsl_hypot3 (0.0, 0.0, 0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(0.0, 0.0, 0.0)"); y = gsl_hypot3 (1e-10, 1e-10, 1e-10); y_expected = 1.732050807568877293527446e-10; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, 1e-10, 1e-10)"); y = gsl_hypot3 (1e-38, 1e-38, 1e-38); y_expected = 1.732050807568877293527446e-38; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-38, 1e-38, 1e-38)"); y = gsl_hypot3 (1e-10, 1e-10, -1.0); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, 1e-10, -1)"); y = gsl_hypot3 (1e-10, -1.0, 1e-10); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, -1, 1e-10)"); y = gsl_hypot3 (-1.0, 1e-10, 1e-10); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(-1, 1e-10, 1e-10)"); y = gsl_hypot3 (1e307, 1e301, 1e301); y_expected = 1.0000000000009999999999995e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e301, 1e301)"); y = gsl_hypot3 (1e307, 1e307, 1e307); y_expected = 1.732050807568877293527446e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e307, 1e307)"); y = gsl_hypot3 (1e307, 1e-307, 1e-307); y_expected = 1.0e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e-307, 1e-307)"); /* 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_int(-3.14,%d)", n); } } { unsigned int n; for (n = 0; n < 10; n++) { y = gsl_pow_uint (-3.14, n); y_expected = pow (-3.14, n); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_uint(-3.14,%d)", n); } } /* Test case for n at INT_MAX, INT_MIN */ { double u = 1.0000001; int n = INT_MAX; y = gsl_pow_int (u, n); y_expected = pow (u, n); gsl_test_rel (y, y_expected, 1e-6, "gsl_pow_int(%.7f,%d)", u, n); n = INT_MIN; y = gsl_pow_int (u, n); y_expected = pow (u, n); gsl_test_rel (y, y_expected, 1e-6, "gsl_pow_int(%.7f,%d)", u, 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)"); y = gsl_ldexp (9.999999999999998890e-01, 1024); y_expected = GSL_DBL_MAX; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp DBL_MAX"); y = gsl_ldexp (1e308, -2000); y_expected = 8.7098098162172166755761e-295; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(1e308,-2000)"); y = gsl_ldexp (GSL_DBL_MIN, 2000); y_expected = 2.554675596204441378334779940e294; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(DBL_MIN,2000)"); /* Test subnormals */ { int i = 0; volatile double x = GSL_DBL_MIN; y_expected = 2.554675596204441378334779940e294; x /= 2; while (x > 0) { i++ ; y = gsl_ldexp (x, 2000 + i); gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(DBL_MIN/2**%d,%d)",i,2000+i); x /= 2; } } /* Test for frexp */ y = gsl_frexp (0.0, &e); y_expected = 0; e_expected = 0; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(0) exponent"); 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"); y = gsl_frexp (GSL_DBL_MAX, &e); y_expected = 9.999999999999998890e-01; e_expected = 1024; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MAX) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MAX) exponent"); y = gsl_frexp (-GSL_DBL_MAX, &e); y_expected = -9.999999999999998890e-01; e_expected = 1024; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(-DBL_MAX) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(-DBL_MAX) exponent"); y = gsl_frexp (GSL_DBL_MIN, &e); y_expected = 0.5; e_expected = -1021; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MIN) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MIN) exponent"); y = gsl_frexp (-GSL_DBL_MIN, &e); y_expected = -0.5; e_expected = -1021; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(-DBL_MIN) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(-DBL_MIN) exponent"); /* Test subnormals */ { int i = 0; volatile double x = GSL_DBL_MIN; y_expected = 0.5; e_expected = -1021; x /= 2; while (x > 0) { e_expected--; i++ ; y = gsl_frexp (x, &e); gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MIN/2**%d) fraction",i); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MIN/2**%d) exponent", i); x /= 2; } } /* 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 (-inf); gsl_test_int (s, 0, "gsl_isnan(-inf)"); s = gsl_isnan (nan) != 0; 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 (-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 ()); } gsl-doc-2.3/gsl-config.in0000775000175000017500000000233312616157443013357 0ustar eddedd#! /bin/sh prefix=@prefix@ exec_prefix=@exec_prefix@ includedir=@includedir@ usage() { cat < AC_PROG_SED GSL_MAJOR_VERSION=`echo "$VERSION" | $SED 's/\([[^.]][[^.]]*\).*/\1/'` GSL_MINOR_VERSION=`echo "$VERSION" | $SED 's/[[^.]][[^.]]*.\([[^.]][[^.]]*\).*/\1/'` AC_SUBST(GSL_MAJOR_VERSION) AC_SUBST(GSL_MINOR_VERSION) 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 LT_INIT([win32-dll]) dnl Check compiler features AC_TYPE_SIZE_T dnl AC_C_CONST AC_C_VOLATILE AC_C_INLINE AC_C_CHAR_UNSIGNED GSL_CFLAGS="-I$includedir" GSL_LIBS="-L$libdir -lgsl" dnl macro from libtool - can be replaced with LT_LIB_M when we require libtool 2 LT_LIB_M GSL_LIBM=$LIBM AC_SUBST(GSL_CFLAGS) AC_SUBST(GSL_LIBS) AC_SUBST(GSL_LIBM) if test "$ac_cv_c_inline" != no ; then 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 GNU-style 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],[Define if you have inline]) else AC_CACHE_CHECK([for C99-style inline], ac_cv_c_c99inline, [ac_cv_c_c99inline=no dnl next line is a necessary condition AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[extern inline void* foo() { foo(); return &foo ; };]], [[ return foo() != 0 ]])],[ac_cv_c_c99inline="yes"],[]) dnl but not sufficient, extern must work but inline on its own should not if test "$ac_cv_c_c99inline" != no ; then AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[inline void* foo() { foo(); return &foo ; };]], [[ return foo() != 0 ]])],[],ac_cv_c_c99inline="no") fi ]) if test "$ac_cv_c_c99inline" != no ; then AC_DEFINE(HAVE_INLINE,[1],[Define if you have inline]) AC_DEFINE(HAVE_C99_INLINE,[1],[Define if you have inline with C99 behavior]) fi fi fi dnl Checks for header files. AC_CHECK_HEADERS(ieeefp.h) dnl Checks for typedefs, structures, and compiler characteristics. case $host in *-*-cygwin* | *-*-mingw* ) if test "$enable_shared" = yes; then GSLCBLAS_LDFLAGS="$GSLCBLAS_LDFLAGS -no-undefined" GSL_LDFLAGS="$GSL_LDFLAGS -no-undefined" GSL_LIBADD="cblas/libgslcblas.la" fi ;; esac AC_SUBST(GSLCBLAS_LDFLAGS) AC_SUBST(GSL_LDFLAGS) AC_SUBST(GSL_LIBADD) 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 #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,1,[Defined if you have ansi EXIT_SUCCESS and EXIT_FAILURE in stdlib.h]) 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 ]) AC_CHECK_DECLS(fesettrapenable,,,[#define _GNU_SOURCE 1 #include ]) AC_CHECK_DECLS(hypot,,,[#include ]) AC_CHECK_DECLS(expm1,,,[#include ]) AC_CHECK_DECLS(acosh,,,[#include ]) AC_CHECK_DECLS(asinh,,,[#include ]) AC_CHECK_DECLS(atanh,,,[#include ]) AC_CHECK_DECLS(ldexp,,,[#include ]) AC_CHECK_DECLS(frexp,,,[#include ]) AC_CHECK_DECLS([fprnd_t],[],[],[[#include ]]) AC_CHECK_DECLS(isinf,,,[#include ]) AC_CHECK_DECLS(isfinite,,,[#include ]) AC_CHECK_DECLS(finite,,,[#include #if HAVE_IEEEFP_H #include #endif]) AC_CHECK_DECLS(isnan,,,[#include ]) 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 ]) ;; esac AC_CACHE_CHECK([for long double stdio], ac_cv_func_printf_longdouble, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include int main (void) { const char * s = "5678.25"; long double x = 1.234 ; fprintf(stderr,"%Lg\n",x) ; sscanf(s, "%Lg", &x); if (x == 5678.25) {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,[Define this if printf can handle %Lf for long double]) 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,[Defined on architectures with excess floating-point precision]) 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 #ifndef _FPU_SETCW #include #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 if test "$ac_cv_c_ieee_interface" = "gnux86" ; then AC_CACHE_CHECK([for SSE extensions], ac_cv_c_fpu_sse, [ac_cv_c_fpu_sse=no AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) ]], [[ unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ]])],[ac_cv_c_fpu_sse="yes"],[ac_cv_c_fpu_sse="no"],[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) ]], [[ unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ]])],[ac_cv_c_fpu_sse="yes"],[ac_cv_c_fpu_sse="no"]) ])]) if test $ac_cv_c_fpu_sse = yes; then AC_DEFINE([HAVE_FPU_X86_SSE], 1, [Define if x86 processor has sse extensions.]) fi 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 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,[Define this if IEEE comparisons work correctly (e.g. NaN != NaN)]) 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 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,[Define this if IEEE denormalized numbers are available]) fi AH_TEMPLATE([HIDE_INLINE_STATIC],[Define if you need to hide the static definitions of inline functions]) AH_BOTTOM([/* 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]) AH_BOTTOM([/* 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]) AH_BOTTOM([/* 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. */ #if HAVE_EXTENDED_PRECISION_REGISTERS #define GSL_COERCE_DBL(x) (gsl_coerce_double(x)) #else #define GSL_COERCE_DBL(x) (x) #endif]) AH_BOTTOM([/* 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_ISFINITE #define isfinite gsl_finite #endif #if !HAVE_DECL_FINITE #define finite gsl_finite #endif #if !HAVE_DECL_ISNAN #define isnan gsl_isnan #endif]) AH_BOTTOM([#ifdef __GNUC__ #define DISCARD_POINTER(p) do { ; } while(p ? 0 : 0); #else #define DISCARD_POINTER(p) /* ignoring discarded pointer */ #endif]) AH_BOTTOM([#if defined(GSL_RANGE_CHECK_OFF) || !defined(GSL_RANGE_CHECK) #define GSL_RANGE_CHECK 0 /* turn off range checking by default internally */ #endif]) AH_BOTTOM([#define RETURN_IF_NULL(x) if (!x) { return ; } ]) AH_VERBATIM([GSL_DISABLE_DEPRECATED], [/* Disable deprecated functions and enums while building */ #define GSL_DISABLE_DEPRECATED 1]) dnl AC_CONFIG_FILES([ \ Makefile \ gsl_version.h \ gsl.spec \ blas/Makefile \ block/Makefile \ bspline/Makefile \ cblas/Makefile \ cdf/Makefile \ cheb/Makefile \ combination/Makefile \ complex/Makefile \ const/Makefile \ deriv/Makefile \ dht/Makefile \ diff/Makefile \ doc/Makefile \ doc/examples/Makefile \ eigen/Makefile \ err/Makefile \ fit/Makefile \ fft/Makefile \ gsl/Makefile \ histogram/Makefile \ ieee-utils/Makefile \ integration/Makefile \ interpolation/Makefile \ linalg/Makefile \ matrix/Makefile \ min/Makefile \ monte/Makefile \ multifit/Makefile \ multifit_nlinear/Makefile \ multilarge/Makefile \ multilarge_nlinear/Makefile \ multimin/Makefile \ multiroots/Makefile \ multiset/Makefile \ ntuple/Makefile \ ode-initval/Makefile \ ode-initval2/Makefile \ permutation/Makefile \ poly/Makefile \ qrng/Makefile \ randist/Makefile \ rng/Makefile \ roots/Makefile \ rstat/Makefile \ siman/Makefile \ sort/Makefile \ spblas/Makefile \ splinalg/Makefile \ spmatrix/Makefile \ specfunc/Makefile \ statistics/Makefile \ sum/Makefile \ sys/Makefile \ test/Makefile \ utils/Makefile \ vector/Makefile \ wavelet/Makefile \ ]) AC_OUTPUT gsl-doc-2.3/spblas/0000755000175000017500000000000013022553155012245 5ustar eddeddgsl-doc-2.3/spblas/spdgemm.c0000664000175000017500000001230212616157443014055 0ustar eddedd/* spdgemm.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* gsl_spblas_dgemm() Multiply two sparse matrices Inputs: alpha - scalar factor A - sparse matrix B - sparse matrix C - (output) C = alpha * A * B Return: success or error Notes: 1) based on CSparse routine cs_multiply */ int gsl_spblas_dgemm(const double alpha, const gsl_spmatrix *A, const gsl_spmatrix *B, gsl_spmatrix *C) { if (A->size2 != B->size1 || A->size1 != C->size1 || B->size2 != C->size2) { GSL_ERROR("matrix dimensions do not match", GSL_EBADLEN); } else if (A->sptype != B->sptype || A->sptype != C->sptype) { GSL_ERROR("matrix storage formats do not match", GSL_EINVAL); } else if (!GSL_SPMATRIX_ISCCS(A)) { GSL_ERROR("compressed column format required", GSL_EINVAL); } else { int status = GSL_SUCCESS; const size_t M = A->size1; const size_t N = B->size2; size_t *Bi = B->i; size_t *Bp = B->p; double *Bd = B->data; size_t *w = (size_t *) A->work; /* workspace of length M */ double *x = (double *) C->work; /* workspace of length M */ size_t *Cp, *Ci; double *Cd; size_t j, p; size_t nz = 0; if (C->nzmax < A->nz + B->nz) { status = gsl_spmatrix_realloc(A->nz + B->nz, C); if (status) { GSL_ERROR("unable to realloc matrix C", status); } } /* initialize workspace to 0 */ for (j = 0; j < M; ++j) w[j] = 0; Cp = C->p; Ci = C->i; Cd = C->data; for (j = 0; j < N; ++j) { if (nz + M > C->nzmax) { status = gsl_spmatrix_realloc(2 * C->nzmax + M, C); if (status) { GSL_ERROR("unable to realloc matrix C", status); } /* these pointers could have changed due to reallocation */ Ci = C->i; Cd = C->data; } Cp[j] = nz; /* column j of C starts here */ for (p = Bp[j]; p < Bp[j + 1]; ++p) { nz = gsl_spblas_scatter(A, Bi[p], Bd[p], w, x, j + 1, C, nz); } for (p = Cp[j]; p < nz; ++p) Cd[p] = x[Ci[p]]; } Cp[N] = nz; C->nz = nz; /* scale by alpha */ gsl_spmatrix_scale(C, alpha); return status; } } /* gsl_spblas_dgemm() */ /* gsl_spblas_scatter() Keep a running total x -> x + alpha*A(:,j) for adding matrices together in CCS, which will eventually be stored in C(:,j) When a new non-zero element with row index i is found, update C->i with the row index. C->data is updated only by the calling function after all matrices have been added via this function. Inputs: A - sparse matrix m-by-n j - column index alpha - scalar factor w - keeps track which rows of column j have been added to C; initialize to 0 prior to first call x - column vector of length m mark - C - output matrix whose jth column will be added to A(:,j) nz - (input/output) number of non-zeros in matrix C Notes: 1) This function is designed to be called successively when adding multiple matrices together. Column j of C is stored contiguously as per CCS but not necessarily in order - ie: the row indices C->i may not be in ascending order. 2) based on CSparse routine cs_scatter */ size_t gsl_spblas_scatter(const gsl_spmatrix *A, const size_t j, const double alpha, size_t *w, double *x, const size_t mark, gsl_spmatrix *C, size_t nz) { size_t p; size_t *Ai = A->i; size_t *Ap = A->p; double *Ad = A->data; size_t *Ci = C->i; for (p = Ap[j]; p < Ap[j + 1]; ++p) { size_t i = Ai[p]; /* A(i,j) is nonzero */ if (w[i] < mark) /* check if row i has been stored in column j yet */ { w[i] = mark; /* i is new entry in column j */ Ci[nz++] = i; /* add i to pattern of C(:,j) */ x[i] = alpha * Ad[p]; /* x(i) = alpha * A(i,j) */ } else /* this (i,j) exists in C from a previous call */ { x[i] += alpha * Ad[p]; /* add alpha*A(i,j) to C(i,j) */ } } return (nz) ; } /* gsl_spblas_scatter() */ gsl-doc-2.3/spblas/spdgemv.c0000644000175000017500000001006512736044021014056 0ustar eddedd/* spdgemv.c * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* gsl_spblas_dgemv() Multiply a sparse matrix and a vector Inputs: alpha - scalar factor A - sparse matrix x - dense vector beta - scalar factor y - (input/output) dense vector Return: y = alpha*op(A)*x + beta*y */ int gsl_spblas_dgemv(const CBLAS_TRANSPOSE_t TransA, const double alpha, const gsl_spmatrix *A, const gsl_vector *x, const double beta, gsl_vector *y) { const size_t M = A->size1; const size_t N = A->size2; if ((TransA == CblasNoTrans && N != x->size) || (TransA == CblasTrans && M != x->size)) { GSL_ERROR("invalid length of x vector", GSL_EBADLEN); } else if ((TransA == CblasNoTrans && M != y->size) || (TransA == CblasTrans && N != y->size)) { GSL_ERROR("invalid length of y vector", GSL_EBADLEN); } else { size_t j, p; size_t incX, incY; size_t lenX, lenY; double *X, *Y; double *Ad; size_t *Ap, *Ai, *Aj; if (TransA == CblasNoTrans) { lenX = N; lenY = M; } else { lenX = M; lenY = N; } /* form y := beta*y */ Y = y->data; incY = y->stride; if (beta == 0.0) { size_t jy = 0; for (j = 0; j < lenY; ++j) { Y[jy] = 0.0; jy += incY; } } else if (beta != 1.0) { size_t jy = 0; for (j = 0; j < lenY; ++j) { Y[jy] *= beta; jy += incY; } } if (alpha == 0.0) return GSL_SUCCESS; /* form y := alpha*op(A)*x + y */ Ap = A->p; Ad = A->data; X = x->data; incX = x->stride; if ((GSL_SPMATRIX_ISCCS(A) && (TransA == CblasNoTrans)) || (GSL_SPMATRIX_ISCRS(A) && (TransA == CblasTrans))) { Ai = A->i; for (j = 0; j < lenX; ++j) { for (p = Ap[j]; p < Ap[j + 1]; ++p) { Y[Ai[p] * incY] += alpha * Ad[p] * X[j * incX]; } } } else if ((GSL_SPMATRIX_ISCCS(A) && (TransA == CblasTrans)) || (GSL_SPMATRIX_ISCRS(A) && (TransA == CblasNoTrans))) { Ai = A->i; for (j = 0; j < lenY; ++j) { for (p = Ap[j]; p < Ap[j + 1]; ++p) { Y[j * incY] += alpha * Ad[p] * X[Ai[p] * incX]; } } } else if (GSL_SPMATRIX_ISTRIPLET(A)) { if (TransA == CblasNoTrans) { Ai = A->i; Aj = A->p; } else { Ai = A->p; Aj = A->i; } for (p = 0; p < A->nz; ++p) { Y[Ai[p] * incY] += alpha * Ad[p] * X[Aj[p] * incX]; } } else { GSL_ERROR("unsupported matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* gsl_spblas_dgemv() */ gsl-doc-2.3/spblas/Makefile.am0000664000175000017500000000077612616157443014325 0ustar eddeddnoinst_LTLIBRARIES = libgslspblas.la check_PROGRAMS = test pkginclude_HEADERS = gsl_spblas.h libgslspblas_la_SOURCES = spdgemm.c spdgemv.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslspblas.la ../spmatrix/libgslspmatrix.la ../test/libgsltest.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la test_SOURCES = test.c gsl-doc-2.3/spblas/gsl_spblas.h0000664000175000017500000000342112616157443014561 0ustar eddedd/* gsl_spblas.h * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_SPBLAS_H__ #define __GSL_SPBLAS_H__ #include #include #include #include #include #include #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 /* * Prototypes */ int gsl_spblas_dgemv(const CBLAS_TRANSPOSE_t TransA, const double alpha, const gsl_spmatrix *A, const gsl_vector *x, const double beta, gsl_vector *y); int gsl_spblas_dgemm(const double alpha, const gsl_spmatrix *A, const gsl_spmatrix *B, gsl_spmatrix *C); size_t gsl_spblas_scatter(const gsl_spmatrix *A, const size_t j, const double alpha, size_t *w, double *x, const size_t mark, gsl_spmatrix *C, size_t nz); __END_DECLS #endif /* __GSL_SPBLAS_H__ */ gsl-doc-2.3/spblas/Makefile.in0000644000175000017500000010413013022372406014307 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = spblas DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslspblas_la_LIBADD = am_libgslspblas_la_OBJECTS = spdgemm.lo spdgemv.lo libgslspblas_la_OBJECTS = $(am_libgslspblas_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslspblas.la ../spmatrix/libgslspmatrix.la \ ../test/libgsltest.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la \ ../rng/libgslrng.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspblas_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspblas_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslspblas.la pkginclude_HEADERS = gsl_spblas.h libgslspblas_la_SOURCES = spdgemm.c spdgemv.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslspblas.la ../spmatrix/libgslspmatrix.la ../test/libgsltest.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu spblas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu spblas/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspblas.la: $(libgslspblas_la_OBJECTS) $(libgslspblas_la_DEPENDENCIES) $(EXTRA_libgslspblas_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspblas_la_OBJECTS) $(libgslspblas_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spdgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spdgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/spblas/test.c0000644000175000017500000001620212736044021013367 0ustar eddedd/* test.c * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* create_random_sparse() Create a random sparse matrix with approximately M*N*density non-zero entries Inputs: M - number of rows N - number of columns density - sparse density \in [0,1] 0 = no non-zero entries 1 = all m*n entries are filled r - random number generator Return: pointer to sparse matrix in triplet format (must be freed by caller) Notes: 1) non-zero matrix entries are uniformly distributed in [0,1] */ static gsl_spmatrix * create_random_sparse(const size_t M, const size_t N, const double density, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); gsl_spmatrix *m = gsl_spmatrix_alloc_nzmax(M, N, nnzwanted, GSL_SPMATRIX_TRIPLET); while (gsl_spmatrix_nnz(m) < nnzwanted) { /* generate a random row and column */ size_t i = gsl_rng_uniform(r) * M; size_t j = gsl_rng_uniform(r) * N; /* generate random m_{ij} and add it */ double x = gsl_rng_uniform(r); gsl_spmatrix_set(m, i, j, x); } return m; } /* create_random_sparse() */ static void create_random_vector(gsl_vector *v, const gsl_rng *r) { size_t i; for (i = 0; i < v->size; ++i) { double x = gsl_rng_uniform(r); gsl_vector_set(v, i, x); } } /* create_random_vector() */ static int test_vectors(gsl_vector *observed, gsl_vector *expected, const double tol, const char *str) { int s = 0; size_t N = observed->size; size_t i; for (i = 0; i < N; ++i) { double x_obs = gsl_vector_get(observed, i); double x_exp = gsl_vector_get(expected, i); gsl_test_rel(x_obs, x_exp, tol, "N=%zu i=%zu %s", N, i, str); } return s; } /* test_vectors() */ static void test_dgemv(const size_t N, const size_t M, const double alpha, const double beta, const CBLAS_TRANSPOSE_t TransA, const gsl_rng *r) { gsl_spmatrix *A = create_random_sparse(M, N, 0.2, r); gsl_spmatrix *B, *C; gsl_matrix *A_dense = gsl_matrix_alloc(M, N); gsl_vector *x, *y, *y_gsl, *y_sp; size_t lenX, lenY; if (TransA == CblasNoTrans) { lenX = N; lenY = M; } else { lenX = M; lenY = N; } x = gsl_vector_alloc(lenX); y = gsl_vector_alloc(lenY); y_gsl = gsl_vector_alloc(lenY); y_sp = gsl_vector_alloc(lenY); /* create random dense vectors */ create_random_vector(x, r); create_random_vector(y, r); /* copy A into A_dense */ gsl_spmatrix_sp2d(A_dense, A); gsl_vector_memcpy(y_gsl, y); gsl_vector_memcpy(y_sp, y); /* compute y = alpha*op(A)*x + beta*y0 with gsl */ gsl_blas_dgemv(TransA, alpha, A_dense, x, beta, y_gsl); /* compute y = alpha*op(A)*x + beta*y0 with spblas/triplet */ gsl_spblas_dgemv(TransA, alpha, A, x, beta, y_sp); /* test y_sp = y_gsl */ test_vectors(y_sp, y_gsl, 1.0e-10, "test_dgemv: triplet format"); /* compute y = alpha*op(A)*x + beta*y0 with spblas/CCS */ B = gsl_spmatrix_ccs(A); gsl_vector_memcpy(y_sp, y); gsl_spblas_dgemv(TransA, alpha, B, x, beta, y_sp); /* test y_sp = y_gsl */ test_vectors(y_sp, y_gsl, 1.0e-10, "test_dgemv: CCS format"); /* compute y = alpha*op(A)*x + beta*y0 with spblas/CRS */ C = gsl_spmatrix_crs(A); gsl_vector_memcpy(y_sp, y); gsl_spblas_dgemv(TransA, alpha, C, x, beta, y_sp); /* test y_sp = y_gsl */ test_vectors(y_sp, y_gsl, 1.0e-10, "test_dgemv: CRS format"); gsl_spmatrix_free(A); gsl_spmatrix_free(B); gsl_spmatrix_free(C); gsl_matrix_free(A_dense); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(y_gsl); gsl_vector_free(y_sp); } /* test_dgemv() */ static void test_dgemm(const double alpha, const size_t M, const size_t N, const gsl_rng *r) { const size_t max = GSL_MAX(M, N); size_t i, j, k; gsl_matrix *A_dense = gsl_matrix_alloc(M, max); gsl_matrix *B_dense = gsl_matrix_alloc(max, N); gsl_matrix *C_dense = gsl_matrix_alloc(M, N); gsl_spmatrix *C = gsl_spmatrix_alloc_nzmax(M, N, 1, GSL_SPMATRIX_CCS); for (k = 1; k <= max; ++k) { gsl_matrix_view Ad = gsl_matrix_submatrix(A_dense, 0, 0, M, k); gsl_matrix_view Bd = gsl_matrix_submatrix(B_dense, 0, 0, k, N); gsl_spmatrix *TA = create_random_sparse(M, k, 0.2, r); gsl_spmatrix *TB = create_random_sparse(k, N, 0.2, r); gsl_spmatrix *A = gsl_spmatrix_ccs(TA); gsl_spmatrix *B = gsl_spmatrix_ccs(TB); gsl_spmatrix_set_zero(C); gsl_spblas_dgemm(alpha, A, B, C); /* make dense matrices and use standard dgemm to multiply them */ gsl_spmatrix_sp2d(&Ad.matrix, TA); gsl_spmatrix_sp2d(&Bd.matrix, TB); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, alpha, &Ad.matrix, &Bd.matrix, 0.0, C_dense); /* compare C and C_dense */ for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Cij = gsl_spmatrix_get(C, i, j); double Dij = gsl_matrix_get(C_dense, i, j); gsl_test_rel(Cij, Dij, 1.0e-12, "test_dgemm: _dgemm"); } } gsl_spmatrix_free(TA); gsl_spmatrix_free(TB); gsl_spmatrix_free(A); gsl_spmatrix_free(B); } gsl_spmatrix_free(C); gsl_matrix_free(A_dense); gsl_matrix_free(B_dense); gsl_matrix_free(C_dense); } /* test_dgemm() */ int main() { const size_t N_max = 40; size_t m, n; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); for (m = 1; m <= N_max; ++m) { for (n = 1; n <= N_max; ++n) { test_dgemv(m, n, 1.0, 0.0, CblasNoTrans, r); test_dgemv(m, n, 1.0, 0.0, CblasTrans, r); test_dgemv(m, n, 2.4, -0.5, CblasNoTrans, r); test_dgemv(m, n, 2.4, -0.5, CblasTrans, r); test_dgemv(m, n, 0.1, 10.0, CblasNoTrans, r); test_dgemv(m, n, 0.1, 10.0, CblasTrans, r); } } test_dgemm(1.0, 10, 10, r); test_dgemm(2.3, 20, 15, r); test_dgemm(1.8, 12, 30, r); test_dgemm(0.4, 45, 35, r); gsl_rng_free(r); exit (gsl_test_summary()); } /* main() */ gsl-doc-2.3/dht/0000755000175000017500000000000013022553153011536 5ustar eddeddgsl-doc-2.3/dht/Makefile.am0000664000175000017500000000062212616157443013606 0ustar eddeddnoinst_LTLIBRARIES = libgsldht.la pkginclude_HEADERS = gsl_dht.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/dht/gsl_dht.h0000664000175000017500000000510512616157443013350 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/dht/dht.c0000664000175000017500000001136012616157443012476 0ustar eddedd/* dht/dht.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include 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; msize+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; nsize+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) { RETURN_IF_NULL (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; msize; m++) { double sum = 0.0; double Y; for(i=0; isize; 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; } gsl-doc-2.3/dht/Makefile.in0000644000175000017500000010342413022372405013606 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsldht_la_LIBADD = am_libgsldht_la_OBJECTS = dht.lo libgsldht_la_OBJECTS = $(am_libgsldht_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsldht.la pkginclude_HEADERS = gsl_dht.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dht/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsldht.la: $(libgsldht_la_OBJECTS) $(libgsldht_la_DEPENDENCIES) $(EXTRA_libgsldht_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsldht_la_OBJECTS) $(libgsldht_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dht.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/dht/ChangeLog0000664000175000017500000000070512616157443013326 0ustar eddedd2009-07-09 Brian Gough * dht.c (gsl_dht_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir Mon Apr 23 10:31:58 2001 Brian Gough * unified error handling conventions to _e for error handling functions and no suffix for plain functions, so _impl functions are no longer needed. gsl-doc-2.3/dht/test.c0000664000175000017500000001204112616157443012673 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include /* 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()); } gsl-doc-2.3/fit/0000755000175000017500000000000013022553154011542 5ustar eddeddgsl-doc-2.3/fit/Makefile.am0000664000175000017500000000101012616157443013601 0ustar eddeddnoinst_LTLIBRARIES = libgslfit.la pkginclude_HEADERS = gsl_fit.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/fit/linear.c0000664000175000017500000002034112616157443013173 0ustar eddedd/* fit/linear.c * * Copyright (C) 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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 cov00, const double cov01, const double cov11, double *y, double *y_err) { *y = c0 + c1 * x; *y_err = sqrt (cov00 + x * (2 * cov01 + cov11 * 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 cov11, double *y, double *y_err) { *y = c1 * x; *y_err = sqrt (cov11) * fabs (x); return GSL_SUCCESS; } gsl-doc-2.3/fit/Makefile.in0000644000175000017500000010351513022372405013612 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslfit_la_LIBADD = am_libgslfit_la_OBJECTS = linear.lo libgslfit_la_OBJECTS = $(am_libgslfit_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslfit.la pkginclude_HEADERS = gsl_fit.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslfit.la: $(libgslfit_la_OBJECTS) $(libgslfit_la_DEPENDENCIES) $(EXTRA_libgslfit_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfit_la_OBJECTS) $(libgslfit_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/fit/ChangeLog0000664000175000017500000000104512616157443013327 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-05-23 Brian Gough * gsl_fit.h linear.c (gsl_fit_mul_est, gsl_fit_linear_est): made parameters in prototypes for _est functions consistent, c00->cov00, c01->cov01, c11 -> cov11 2004-12-23 Brian Gough * gsl_fit.h: remove unused declarations Tue Sep 19 19:09:46 2000 Brian Gough * fit/test.c (main): removed unused variables gsl-doc-2.3/fit/gsl_fit.h0000664000175000017500000000531412616157443013360 0ustar eddedd/* fit/gsl_fit.h * * Copyright (C) 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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 cov00, const double cov01, const double cov11, 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 cov11, double *y, double *y_err); __END_DECLS #endif /* __GSL_FIT_H__ */ gsl-doc-2.3/fit/test.c0000664000175000017500000001405012616157443012700 0ustar eddedd/* These tests are based on the NIST Statistical Reference Datasets See http://www.nist.gov/itl/div898/strd/index.html for more information. */ #include #include #include #include #include #include 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 ()); } gsl-doc-2.3/test/0000755000175000017500000000000013022553152011735 5ustar eddeddgsl-doc-2.3/test/Makefile.am0000664000175000017500000000036112616157443014006 0ustar eddeddnoinst_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 gsl-doc-2.3/test/Makefile.in0000644000175000017500000005077713022372407014024 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsltest_la_LIBADD = am_libgsltest_la_OBJECTS = results.lo libgsltest_la_OBJECTS = $(am_libgsltest_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsltest_la_SOURCES) DIST_SOURCES = $(libgsltest_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsltest.la: $(libgsltest_la_OBJECTS) $(libgsltest_la_DEPENDENCIES) $(EXTRA_libgsltest_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsltest_la_OBJECTS) $(libgsltest_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/results.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ 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 tags-am uninstall uninstall-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: gsl-doc-2.3/test/ChangeLog0000664000175000017500000000214512616157443013526 0ustar eddedd2005-06-21 Brian Gough * 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 * results.c (gsl_test_rel): catch NaN (gsl_test_abs): catch NaN Fri Sep 28 10:40:21 2001 Brian Gough * 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 * 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 * 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 * split out gsl_test code from err/ directory gsl-doc-2.3/test/gsl_test.h0000664000175000017500000000347212616157443013755 0ustar eddedd/* err/gsl_test.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/test/results.c0000664000175000017500000002215012616157443013617 0ustar eddedd/* err/test_results.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #if HAVE_VPRINTF #ifdef STDC_HEADERS #include #else #include #endif #endif #include 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; } gsl-doc-2.3/multiroots/0000755000175000017500000000000013022553155013202 5ustar eddeddgsl-doc-2.3/multiroots/gsl_multiroots.h0000664000175000017500000001401012616157443016447 0ustar eddedd/* multiroots/gsl_multiroots.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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__ */ gsl-doc-2.3/multiroots/fdjac.c0000664000175000017500000000561212616157443014433 0ustar eddedd/* multiroots/fdjac.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include 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; int status = 0; 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 f_stat = GSL_MULTIROOT_FN_EVAL (F, x1, f1); if (f_stat != GSL_SUCCESS) { status = GSL_EBADFUNC; break; /* n.b. avoid memory leak for x1,f1 */ } } 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_view col = gsl_matrix_column (jacobian, j); int null_col = gsl_vector_isnull (&col.vector); /* if column is null, return an error - this may be due to dx being too small. Try increasing epsrel */ if (null_col) { status = GSL_ESING; } } } gsl_vector_free (x1); gsl_vector_free (f1); } if (status) return status; else return GSL_SUCCESS; } gsl-doc-2.3/multiroots/Makefile.am0000664000175000017500000000137112616157443015252 0ustar eddedd# -*-makefile-*- noinst_LTLIBRARIES = libgslmultiroots.la pkginclude_HEADERS = gsl_multiroots.h noinst_HEADERS = enorm.c dogleg.c AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/multiroots/fdfsolver.c0000664000175000017500000001027212616157443015354 0ustar eddedd/* multiroots/fdfsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/multiroots/newton.c0000664000175000017500000000727212616157443014702 0ustar eddedd/* multiroots/newton.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include 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); { 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_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; gsl-doc-2.3/multiroots/dnewton.c0000664000175000017500000001047612616157443015046 0ustar eddedd/* multiroots/dnewton.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include /* 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; gsl-doc-2.3/multiroots/hybrid.c0000664000175000017500000003512412616157443014646 0ustar eddedd/* multiroots/hybrid.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #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 hybrid_set_impl (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 hybrid_iterate_impl (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 = hybrid_set_impl (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 = hybrid_set_impl (vstate, func, x, f, dx, 1); return status; } static int hybrid_set_impl (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 = hybrid_iterate_impl (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 = hybrid_iterate_impl (vstate, func, x, f, dx, 1); return status; } static int hybrid_iterate_impl (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; gsl-doc-2.3/multiroots/hybridj.c0000664000175000017500000003364512616157443015026 0ustar eddedd/* multiroots/hybridj.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #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 hybridj_set_impl (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 hybridj_iterate_impl (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 = hybridj_set_impl (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 = hybridj_set_impl (vstate, fdf, x, f, J, dx, 1); return status ; } static int hybridj_set_impl (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 = hybridj_iterate_impl (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 = hybridj_iterate_impl (vstate, fdf, x, f, J, dx, 1); return status; } static int hybridj_iterate_impl (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; gsl-doc-2.3/multiroots/Makefile.in0000644000175000017500000010642013022372406015250 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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-*- VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultiroots.la pkginclude_HEADERS = gsl_multiroots.h noinst_HEADERS = enorm.c dogleg.c AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multiroots/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultiroots.la: $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_DEPENDENCIES) $(EXTRA_libgslmultiroots_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/broyden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnewton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnewton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybridj.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multiroots/ChangeLog0000664000175000017500000001034212616157443014766 0ustar eddedd2011-01-24 Brian Gough * gnewton.c (gnewton_iterate): check for singular jacobian * newton.c (newton_iterate): check for singular jacobian 2009-07-09 Brian Gough * fsolver.c (gsl_multiroot_fsolver_free): handle NULL argument in free * fdfsolver.c (gsl_multiroot_fdfsolver_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-11-09 Brian Gough * convergence.c (gsl_multiroot_test_delta): accept dxi = 0 2007-08-27 Brian Gough * fdjac.c (gsl_multiroot_fdjacobian): detect null columns (dx too small) (gsl_multiroot_fdjacobian): avoid memory leak for x1,f1 2007-01-26 Brian Gough * 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 * 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 * 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 * hybrid.c (set): fix broken 'if' statement Thu Jan 10 19:26:55 2002 Brian Gough * hybrid.c dnewton.c: return status values for user-function (Theis Peter Hansen) Tue Jun 19 23:40:18 2001 Brian Gough * 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 * 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 * Makefile.am (test_LDADD): added cblas lib Mon Apr 16 20:18:08 2001 Brian Gough * dnewton.c (dnewton_iterate): removed unnecessary status variable Sun Feb 18 11:26:45 2001 Brian Gough * 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 * 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 * hybridj.c hybrid.c dogleg.c: begin comments with a capital letter to improve readability Sat Aug 26 16:12:19 2000 Brian Gough * 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 * changed gsl_vector_copy to gsl_vector_cpy Fri Feb 18 18:45:02 2000 Brian Gough * fixed various .c files to use permutation Wed Feb 16 21:13:24 2000 Brian Gough * fixed Makefiles that include gsl_linalg.h to add -I$(srcdir)/../permutation to their include path gsl-doc-2.3/multiroots/enorm.c0000664000175000017500000000205312616157443014500 0ustar eddedd/* multiroots/enorm.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); } gsl-doc-2.3/multiroots/fsolver.c0000664000175000017500000000754112616157443015047 0ustar eddedd/* multiroots/fsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/multiroots/dogleg.c0000664000175000017500000002255212616157443014627 0ustar eddedd/* multiroots/dogleg.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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; } gsl-doc-2.3/multiroots/convergence.c0000664000175000017500000000400112616157443015651 0ustar eddedd/* multiroots/convergence.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 || dxi == 0) { 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 ; } gsl-doc-2.3/multiroots/gnewton.c0000664000175000017500000001206112616157443015041 0ustar eddedd/* multiroots/gnewton.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #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); { int status = gsl_linalg_LU_solve (state->lu, state->permutation, f, state->d); if (status) return status; } 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; gsl-doc-2.3/multiroots/broyden.c0000664000175000017500000002331512616157443015026 0ustar eddedd/* multiroots/broyden.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #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; gsl-doc-2.3/multiroots/test_funcs.h0000644000175000017500000000705512663147424015547 0ustar eddedd/* multiroots/test_funcs.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); gsl-doc-2.3/multiroots/test_funcs.c0000644000175000017500000003755712663147423015553 0ustar eddedd/* multiroots/test_funcs.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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; } gsl-doc-2.3/multiroots/test.c0000664000175000017500000001560612663147413014345 0ustar eddedd/* multiroots/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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; } gsl-doc-2.3/rng/0000755000175000017500000000000013022553154011546 5ustar eddeddgsl-doc-2.3/rng/lecuyer21.c0000664000175000017500000000434312616157443013544 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/ranf.c0000664000175000017500000001023112616157443012650 0ustar eddedd/* rng/ranf.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; gsl-doc-2.3/rng/randu.c0000664000175000017500000000502212616157443013035 0ustar eddedd/* rng/randu.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/minstd.c0000664000175000017500000000546712616157443013237 0ustar eddedd/* rng/minstd.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/coveyou.c0000664000175000017500000000431212616157443013416 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/Makefile.am0000664000175000017500000000172312616157443013620 0ustar eddeddnoinst_LTLIBRARIES = libgslrng.la pkginclude_HEADERS = gsl_rng.h AM_CPPFLAGS = -I$(top_srcdir) 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 inline.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 gsl-doc-2.3/rng/taus.c0000664000175000017500000001266412616157443012712 0ustar eddedd/* rng/taus.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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) <>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; gsl-doc-2.3/rng/uni.c0000664000175000017500000001367212616157443012531 0ustar eddedd/* rng/uni.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; gsl-doc-2.3/rng/rng.c0000664000175000017500000000617712616157443012526 0ustar eddedd/* rng/rng.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 = calloc (1, 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); } 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) { RETURN_IF_NULL (r); free (r->state); free (r); } gsl-doc-2.3/rng/file.c0000664000175000017500000000261512616157443012650 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include int gsl_rng_fread (FILE * stream, gsl_rng * r) { size_t n = r->type->size ; char * state = (char *)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 = (char *)r->state; size_t items = fwrite (state, 1, n, stream); if (items != n) { GSL_ERROR ("fwrite failed", GSL_EFAILED); } return GSL_SUCCESS; } gsl-doc-2.3/rng/knuthran.c0000664000175000017500000001134712616157443013565 0ustar eddedd/* rng/knuthran.c * * Copyright (C) 2001, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/zuf.c0000664000175000017500000000671112616157443012536 0ustar eddedd/* rng/zuf.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/ran3.c0000664000175000017500000000603612616157443012575 0ustar eddedd/* rng/ran3.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; /* Avoid potential problem with negative values */ if (j < 0) j += 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; gsl-doc-2.3/rng/TODO0000664000175000017500000000750412616157443012257 0ustar eddedd# -*- org -*- #+CATEGORY: rng * 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]) gsl-doc-2.3/rng/knuthran2.c0000664000175000017500000000477212616157443013653 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/gfsr4.c0000664000175000017500000001263112616157443012755 0ustar eddedd/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include 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; gsl-doc-2.3/rng/taus113.c0000664000175000017500000001256712616157443013141 0ustar eddedd/* 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, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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)] ] */ gsl-doc-2.3/rng/borosh13.c0000664000175000017500000000423112616157443013365 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/ran0.c0000664000175000017500000000505012616157443012565 0ustar eddedd/* rng/ran0.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; gsl-doc-2.3/rng/slatec.c0000664000175000017500000001661712616157443013213 0ustar eddedd/* rng/slatec.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; gsl-doc-2.3/rng/ran1.c0000664000175000017500000000570212616157443012572 0ustar eddedd/* rng/ran1.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/gsl_rng.h0000664000175000017500000001545512616157443013377 0ustar eddedd/* rng/gsl_rng.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); INLINE_DECL unsigned long int gsl_rng_get (const gsl_rng * r); INLINE_DECL double gsl_rng_uniform (const gsl_rng * r); INLINE_DECL double gsl_rng_uniform_pos (const gsl_rng * r); INLINE_DECL unsigned long int gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n); #ifdef HAVE_INLINE INLINE_FUN unsigned long int gsl_rng_get (const gsl_rng * r) { return (r->type->get) (r->state); } INLINE_FUN double gsl_rng_uniform (const gsl_rng * r) { return (r->type->get_double) (r->state); } INLINE_FUN 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. */ INLINE_FUN 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__ */ gsl-doc-2.3/rng/schrage.c0000664000175000017500000000352212616157443013343 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/rng/inline.c0000664000175000017500000000203112616157443013177 0ustar eddedd/* rng/inline.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/rng/waterman14.c0000664000175000017500000000422112616157443013707 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/ranlxs.c0000664000175000017500000001577112616157443013247 0ustar eddedd/* rng/ranlxs.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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 & 0x7FFFFFFFUL; /* Allowed seeds for ranlxs are 0 .. 2^31-1 */ 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; gsl-doc-2.3/rng/types.c0000664000175000017500000000520412616157443013072 0ustar eddedd/* rng/types.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #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; } gsl-doc-2.3/rng/knuthran2002.c0000664000175000017500000001143012616157443014062 0ustar eddedd/* rng/knuthran2002.c * * Copyright (C) 2007 Brian Gough * Copyright (C) 2001, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/Makefile.in0000644000175000017500000011330413022372406013614 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 inline.lo libgslrng_la_OBJECTS = $(am_libgslrng_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrng.la pkginclude_HEADERS = gsl_rng.h AM_CPPFLAGS = -I$(top_srcdir) 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 inline.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rng/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrng.la: $(libgslrng_la_OBJECTS) $(libgslrng_la_DEPENDENCIES) $(EXTRA_libgslrng_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrng_la_OBJECTS) $(libgslrng_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/borosh13.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmrg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coveyou.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman18.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman20.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman2x.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfsr4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2002.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lecuyer21.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mrg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r250.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand48.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranmar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slatec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus113.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transputer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/waterman14.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zuf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/rng/rand.c0000664000175000017500000000436612616157443012662 0ustar eddedd/* rng/rand.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/ChangeLog0000664000175000017500000003075712616157443013347 0ustar eddedd2012-09-10 Rhys Ulerich * ranf.c Add include for gsl_sys.h to fix MSVC build. Thanks to Brian Gladman for the suggestion. 2011-04-28 Brian Gough * ranlxs.c (ranlxs_set_lux): enforce maximum seed of 2^31-1 (0x7FFFFFFF) for ranlxs 2010-01-07 Brian Gough * ran3.c (ran3_set): added a check for negative j 2009-07-09 Brian Gough * rng.c (gsl_rng_free): handle NULL argument in free 2008-10-13 Brian Gough * file.c: added (char *) to allow compilation with C++ compiler 2008-07-03 Brian Gough * rng.c: moved inline functions to inline.c * gsl_rng.h: use new inline declarations * inline.c: handle inline functions separately * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-01-28 Brian Gough * knuthran2002.c: added revised version from 9th printing 2007-01-04 Brian Gough * default.c (gsl_rng_env_setup): send newline to stderr not stdout 2006-04-13 Brian Gough * default.c (gsl_rng_env_setup): print a newline after list of generators in error message 2006-03-16 Brian Gough * test.c (main): added taus2 test 2006-02-19 Brian Gough * rng.c: added note about why range=max-min not max-min+1 2005-12-16 Brian Gough * rng.c (gsl_rng_uniform_int): catch the case n = 0 and return an error 2003-07-23 Brian Gough * file.c: added fwrite/fread functions 2003-06-12 Brian Gough * Makefile.am: removed benchmark programs from default build 2003-06-02 Brian Gough * 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 * 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 * taus.c (taus2_set): fixed bug in seeding for s2 < 8 Mon Jun 17 21:04:10 2002 Brian Gough * mt.c (mt_set): ensure state counter mti is initialised by seeding routine Wed May 29 21:52:11 2002 Brian Gough * randu.c: removed unused variable m Tue May 7 22:34:52 2002 Brian Gough * 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 * 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 * 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 * 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 * mt.c (mt_1998_set): renamed macro to avoid duplicate definition Fri Aug 31 17:49:37 2001 Brian Gough * 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 * 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 * types.c (gsl_rng_types_setup): added void to make prototype valid in ansi c Mon Apr 16 20:03:07 2001 Brian Gough * default.c (gsl_rng_env_setup): removed spurious argument to fprintf Tue Jan 23 13:24:26 2001 Brian Gough * 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 * 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 * 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 * 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 * ran3.c (ran3_set): initialize unused zeroth element of state to zero for consistency. Mon Feb 14 13:28:26 2000 Brian Gough * made all internal functions static Mon Dec 6 16:21:05 1999 Brian Gough * test.c (main): rewrote the tests to loop over all the generators Wed Aug 11 20:57:10 1999 Brian Gough * ranlxd.c, ranlxs.c: added ranlxd and ranlxs, second generation RANLUX generators from Martin Luescher. Mon Mar 1 21:12:28 1999 Brian Gough * 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 * gfsr4.c: added #include which was missing 1998-11-04 * 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 * rng.c: added #include to get prototype for memcpy Mon Sep 14 20:53:09 1998 Brian Gough * default.c (gsl_rng_env_setup): added gfsr4 1998-09-10 James Theiler * 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 * 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 * default.c (gsl_rng_env_setup): send default/enviroment output to stderr Mon Aug 3 18:25:52 1998 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * added implementations of the numerical recipes algorithms ran0, ran1, ran2, ran3 Sun Jun 28 11:51:48 1998 Brian Gough * 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 * 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 * added the MT19937 and TT880 mersenne prime generators Sat Jun 20 13:58:40 1998 Brian Gough * 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 * removed the gsl- prefix from generator name strings Thu Jun 18 12:17:16 1998 Brian Gough * 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 * minstd.c: added Park and Millers MINSTD generator Thu Jun 11 18:08:40 1998 Brian Gough * this will be an alternate, thread-safe interface to the random number generators. gsl-doc-2.3/rng/ran2.c0000664000175000017500000000676412616157443012604 0ustar eddedd/* rng/ran2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/fishman18.c0000664000175000017500000000443512616157443013531 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/rng/random.c0000664000175000017500000004003312616157443013205 0ustar eddedd/* rng/random.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/ranlxd.c0000664000175000017500000001321412616157443013216 0ustar eddedd/* rng/ranlxd.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/r250.c0000664000175000017500000001132412616157443012416 0ustar eddedd/* rng/r250.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/ranlux.c0000664000175000017500000001242412616157443013241 0ustar eddedd/* rng/ranlux.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/vax.c0000664000175000017500000000421212616157443012522 0ustar eddedd/* rng/vax.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/mt.c0000664000175000017500000001465612616157443012361 0ustar eddedd/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include 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; gsl-doc-2.3/rng/mrg.c0000664000175000017500000000760012616157443012515 0ustar eddedd/* rng/mrg.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/uni32.c0000664000175000017500000001406312616157443012671 0ustar eddedd/* rng/uni32.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; gsl-doc-2.3/rng/fishman2x.c0000664000175000017500000000551512616157443013632 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include /* 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; gsl-doc-2.3/rng/cmrg.c0000664000175000017500000001231012616157443012652 0ustar eddedd/* rng/cmrg.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/ranmar.c0000664000175000017500000000757012616157443013216 0ustar eddedd/* rng/ranmar.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/fishman20.c0000664000175000017500000000446212616157443013522 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include 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; gsl-doc-2.3/rng/tt.c0000664000175000017500000000741512616157443012363 0ustar eddedd/* rng/tt.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/transputer.c0000664000175000017500000000435412616157443014142 0ustar eddedd/* rng/transputer.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; gsl-doc-2.3/rng/test.c0000664000175000017500000004255412616157443012716 0ustar eddedd/* rng/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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); void rng_seed_test (const gsl_rng_type * T); #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); #ifdef TEST_SEEDS rng_seed_test (gsl_rng_mt19937); rng_seed_test (gsl_rng_ranlxs0); rng_seed_test (gsl_rng_ranlxs1); rng_seed_test (gsl_rng_ranlxs2); rng_seed_test (gsl_rng_ranlxd1); rng_seed_test (gsl_rng_ranlxd2); rng_seed_test (gsl_rng_ranlux); rng_seed_test (gsl_rng_ranlux389); rng_seed_test (gsl_rng_cmrg); rng_seed_test (gsl_rng_mrg); rng_seed_test (gsl_rng_taus); rng_seed_test (gsl_rng_taus2); rng_seed_test (gsl_rng_gfsr4); #endif 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, max, min 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, max, min 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; } int rng_sanity_test (gsl_rng * r) { double sum = 0, sigma; int i, status = 0; for (i = 0; i < N2; ++i) { double x = gsl_rng_uniform (r); sum += x; if (x < 0.0 || x > 1.0) { fprintf(stderr,"x=%g out of range\n", x); return 1; } } sum /= N2; /* expect the average to have a variance of 1/(12 n) */ sigma = (sum - 0.5)* sqrt (12.0 * N2); /* more than 5 sigma is an error */ status = (fabs (sigma) > 5 || fabs(sigma) < 0.0001); if (status) { fprintf(stderr,"sum=%g, sigma=%g\n",sum,sigma); } return status; } void rng_seed_test (const gsl_rng_type * T) { gsl_rng *r = gsl_rng_alloc (T); const char *name = gsl_rng_name (r); unsigned long int i; int j; int status; for (i = 0xFFFFFFFFUL ; i > 0; i >>= 1) { for (j = 1; j >= -1 ; j--) { unsigned long int seed = i + j; if (j > 0 && seed < i) continue; gsl_rng_set (r, seed); status = rng_sanity_test (r); if (status) gsl_test (status, "%s, sanity tests for seed = %#lx", name, seed); } } } gsl-doc-2.3/rng/rand48.c0000664000175000017500000000742712616157443013037 0ustar eddedd/* rng/rand48.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; gsl-doc-2.3/rng/default.c0000664000175000017500000000460012616157443013351 0ustar eddedd/* rng/default.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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; } gsl-doc-2.3/monte/0000755000175000017500000000000013022553155012103 5ustar eddeddgsl-doc-2.3/monte/gsl_monte_miser.h0000664000175000017500000000514612616157443015462 0ustar eddedd/* monte/gsl_monte_miser.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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); typedef struct { double estimate_frac; size_t min_calls; size_t min_calls_per_bisection; double alpha; double dither; } gsl_monte_miser_params; void gsl_monte_miser_params_get (const gsl_monte_miser_state * state, gsl_monte_miser_params * params); void gsl_monte_miser_params_set (gsl_monte_miser_state * state, const gsl_monte_miser_params * params); __END_DECLS #endif /* __GSL_MONTE_MISER_H__ */ gsl-doc-2.3/monte/Makefile.am0000664000175000017500000000131612616157443014152 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 gsl-doc-2.3/monte/vegas.c0000664000175000017500000005507012616157443013375 0ustar eddedd/* monte/vegas.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 /* standard headers */ #include #include /* gsl headers */ #include #include #include #include /* 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)]) #define USE_ORIGINAL_CHISQ_FORMULA 0 /* 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; state->chisq = 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 = gsl_pow_int ((double) boxes, 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; for (it = 0; it < state->iterations; it++) { double intgrl = 0.0, intgrl_sq = 0.0; double tss = 0.0; double wgt, var, sig; 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 { volatile double m = 0, q = 0; double f_sq_sum = 0.0; for (k = 0; k < calls_per_box; k++) { volatile double fval; double 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 (sum of squares) */ { 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; tss += 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 */ var = tss / (calls_per_box - 1.0) ; if (var > 0) { wgt = 1.0 / var; } else if (state->sum_wgts > 0) { wgt = state->sum_wgts / state->samples; } else { wgt = 0.0; } intgrl_sq = intgrl * intgrl; sig = sqrt (var); state->result = intgrl; state->sigma = sig; if (wgt > 0.0) { double sum_wgts = state->sum_wgts; double wtd_int_sum = state->wtd_int_sum; double m = (sum_wgts > 0) ? (wtd_int_sum / sum_wgts) : 0; double q = intgrl - m; 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 USE_ORIGINAL_CHISQ_FORMULA /* This is the chisq formula from the original Lepage paper. It computes the variance from - ^2 and can suffer from catastrophic cancellations, e.g. returning negative chisq. */ if (state->samples > 1) { state->chisq = (state->chi_sum - state->wtd_int_sum * cum_int) / (state->samples - 1.0); } #else /* The new formula below computes exactly the same quantity as above but using a stable recurrence */ if (state->samples == 1) { state->chisq = 0; } else { state->chisq *= (state->samples - 2.0); state->chisq += (wgt / (1 + (wgt / sum_wgts))) * q * q; state->chisq /= (state->samples - 1.0); } #endif } else { cum_int += (intgrl - cum_int) / (it + 1.0); cum_sig = 0.0; } if (state->verbose >= 0) { print_res (state, state->it_num, intgrl, 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) { RETURN_IF_NULL (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); } double gsl_monte_vegas_chisq (const gsl_monte_vegas_state * s) { return s->chisq; } void gsl_monte_vegas_runval (const gsl_monte_vegas_state * s, double * result, double * sigma) { *result = s->result; *sigma = s->sigma; } void gsl_monte_vegas_params_get (const gsl_monte_vegas_state * s, gsl_monte_vegas_params * p) { p->alpha = s->alpha; p->iterations = s->iterations; p->stage = s->stage; p->mode = s->mode; p->verbose = s->verbose; p->ostream = s->ostream; } void gsl_monte_vegas_params_set (gsl_monte_vegas_state * s, const gsl_monte_vegas_params * p) { s->alpha = p->alpha; s->iterations = p->iterations; s->stage = p->stage; s->mode = p->mode; s->verbose = p->verbose; s->ostream = p->ostream; } 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); } gsl-doc-2.3/monte/TODO0000664000175000017500000000230312616157443012603 0ustar eddedd# -*- org -*- #+CATEGORY: monte * 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. gsl-doc-2.3/monte/gsl_monte_vegas.h0000664000175000017500000000624212616157443015446 0ustar eddedd/* monte/gsl_monte_vegas.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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); double gsl_monte_vegas_chisq (const gsl_monte_vegas_state* state); void gsl_monte_vegas_runval (const gsl_monte_vegas_state* state, double * result, double * sigma); typedef struct { double alpha; size_t iterations; int stage; int mode; int verbose; FILE * ostream; } gsl_monte_vegas_params; void gsl_monte_vegas_params_get (const gsl_monte_vegas_state * state, gsl_monte_vegas_params * params); void gsl_monte_vegas_params_set (gsl_monte_vegas_state * state, const gsl_monte_vegas_params * params); __END_DECLS #endif /* __GSL_MONTE_VEGAS_H__ */ gsl-doc-2.3/monte/Makefile.in0000644000175000017500000010442313022372406014152 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog README 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu monte/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmonte.la: $(libgslmonte_la_OBJECTS) $(libgslmonte_la_DEPENDENCIES) $(EXTRA_libgslmonte_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmonte_la_OBJECTS) $(libgslmonte_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vegas.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/monte/ChangeLog0000664000175000017500000001625112616157443013674 0ustar eddedd2009-07-25 Brian Gough * vegas.c (gsl_monte_vegas_params_get) (gsl_monte_vegas_params_set): added get/set functions for params (gsl_monte_vegas_chisq): added chisq accessor * gsl_monte_vegas.h: added separate params struct * miser.c (gsl_monte_miser_params_set) (gsl_monte_miser_params_get): added get/set functions for params * gsl_monte_miser.h: added separate params struct 2009-07-09 Brian Gough * vegas.c (gsl_monte_vegas_free): handle NULL argument in free * plain.c (gsl_monte_plain_free): handle NULL argument in free * miser.c (gsl_monte_miser_free): handle NULL argument in free 2009-02-10 Brian Gough * vegas.c (gsl_monte_vegas_integrate): use gsl_pow_int to compute tot_boxes, avoids potentially inaccurate pow functions (MinGW). 2008-11-20 Brian Gough * vegas.c (gsl_monte_vegas_integrate): improve the chisq calculation to avoid cancellation errors in the original formula (fixes bug #24510) * test.c (MONTE_ERROR_TEST): added test cases for negative chisq in vegas 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-04-26 Brian Gough * vegas.c (gsl_monte_vegas_integrate): compute running totals as volatile double to prevent problems with excess precision, use meaningful variable names for sum of squares, variance and sigma. * test_main.c: compute the ensemble mean more accurately for the tests * test.c: added a test for warm-start vegas, as well as cold-start * miser.c (gsl_monte_miser_integrate): catch zero weights to avoid division by zero * test.c (main): added test for step-type function 2004-06-02 Brian Gough * test_main.c: handle the case where sd==0 && error[i] !=0 more carefully Mon Apr 23 13:23:47 2001 Brian Gough * test_main.c: removed unused status variable Sat Jan 6 19:56:49 2001 Brian Gough * 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 * 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 * vegas.c: tidied up the algorithm, deal with cases of sigma = 0 explicitly. Sat Dec 9 14:19:53 2000 Brian Gough * reorganization and clean up Thu Nov 16 19:50:27 2000 Brian Gough * 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 * 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 * 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 * 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 * miser_test.c (main): increased tolerances to allow tests to pass with different compilers Mon May 15 15:26:22 2000 Brian Gough * 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 * Makefile.am: removed ..._LDFLAGS = -static since this is specific to gcc Wed Nov 18 10:59:56 1998 Brian Gough * use standard headers templates_on.h and templates_off.h instead of source.h Tue Nov 17 16:49:12 1998 Brian Gough * added #include 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 * 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 * 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 * 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 * 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 * Makefile.in, Makefile.am: fixed some of the include requirements for make dist Mon Jul 27 15:19:54 1998 booth * 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 * 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 * Makefile.in: we're gonna make it... Thu Jul 16 16:23:45 1998 booth * 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 * 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. gsl-doc-2.3/monte/README0000664000175000017500000000302112616157443012771 0ustar eddeddG. 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 gsl-doc-2.3/monte/test_main.c0000664000175000017500000000277412616157443014256 0ustar eddeddfor (I = problems ; I->f != 0; I++) { size_t i; double 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); #ifdef MONTE_PARAMS MONTE_PARAMS params; #endif 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); } /* Check the results for consistency as an ensemble */ { double mean = 0, sumd2 = 0, sd; /* We need to compute the mean exactly when all terms are equal, to get an exact zero for the standard deviation (this is a common case when integrating a constant). */ for (i = 0; i < TRIALS; i++) { mean += (result[i] - mean) / (i + 1.0); } for (i = 0; i < TRIALS; i++) { sumd2 += pow(result[i] - mean, 2.0); } sd = sqrt(sumd2 / (TRIALS-1.0)) ; for (i = 0; i < TRIALS; i++) { gsl_test_factor (error[i], sd, 5.0, NAME ", %s, abserr[%d] vs sd", I->description, i); } } gsl_rng_free (r); } gsl-doc-2.3/monte/gsl_monte_plain.h0000664000175000017500000000353412616157443015445 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/monte/miser.c0000664000175000017500000004201612616157443013403 0ustar eddedd/* monte/miser.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include 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); if (weight_l == 0 && weight_r == 0) { weight_l = 1; weight_r = 1; } } } 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) { RETURN_IF_NULL (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); } void gsl_monte_miser_params_get (const gsl_monte_miser_state * s, gsl_monte_miser_params * p) { p->estimate_frac = s->estimate_frac; p->min_calls = s->min_calls; p->min_calls_per_bisection = s->min_calls_per_bisection; p->alpha = s->alpha; p->dither = s->dither; } void gsl_monte_miser_params_set (gsl_monte_miser_state * s, const gsl_monte_miser_params * p) { s->estimate_frac = p->estimate_frac; s->min_calls = p->min_calls; s->min_calls_per_bisection = p->min_calls_per_bisection; s->alpha = p->alpha; s->dither = p->dither; } 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; } gsl-doc-2.3/monte/plain.c0000664000175000017500000000656112616157443013374 0ustar eddedd/* monte/plain.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include 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) { RETURN_IF_NULL (s); free (s->x); free (s); } gsl-doc-2.3/monte/gsl_monte.h0000664000175000017500000000310112616157443014250 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/monte/test.c0000664000175000017500000004010412616157443013237 0ustar eddedd/* monte/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth * Copyright (C) 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define CONSTANT #define STEP #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 fstep (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 Fs = make_function(&fstep, 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 - )^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 STEP /* variance(Fs) = 0.4/sqrt(1000) */ add(problems,&n, &Fs, xl, xu, 1, 100000, 0.8, 1.264e-3, "step, 1d"); add(problems,&n, &Fs, xl, xu, 2, 100000, 0.8, 1.264e-3, "step, 2d"); add(problems,&n, &Fs, xl, xu, 3, 100000, 0.8, 1.264e-3, "step, 3d"); add(problems,&n, &Fs, xl, xu, 4, 100000, 0.8, 1.264e-3, "step, 4d"); add(problems,&n, &Fs, xl, xu, 5, 100000, 0.8, 1.264e-3, "step, 5d"); add(problems,&n, &Fs, xl, xu, 6, 100000, 0.8, 1.264e-3, "step, 6d"); add(problems,&n, &Fs, xl, xu, 7, 100000, 0.8, 1.264e-3, "step, 7d"); add(problems,&n, &Fs, xl, xu, 8, 100000, 0.8, 1.264e-3, "step, 8d"); add(problems,&n, &Fs, xl, xu, 9, 100000, 0.8, 1.264e-3, "step, 9d"); add(problems,&n, &Fs, xl, xu, 10, 100000, 0.8, 1.264e-3, "step, 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 MISER #define NAME "miser(params)" #define MONTE_STATE gsl_monte_miser_state #define MONTE_ALLOC gsl_monte_miser_alloc #define MONTE_PARAMS gsl_monte_miser_params #define MONTE_INTEGRATE(f,xl,xu,dim,calls,r,s,res,err) { gsl_monte_miser_params_get(s, ¶ms) ; params.alpha = 1.5 ; gsl_monte_miser_params_set(s, ¶ms) ; gsl_monte_miser_integrate(f,xl,xu,dim,calls,r,s,res,err); } #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_PARAMS #undef MONTE_INTEGRATE #undef MONTE_FREE #undef MONTE_ERROR_TEST #undef MONTE_SPEEDUP #endif #ifdef MISER #define NAME "miser(params)" #define MONTE_STATE gsl_monte_miser_state #define MONTE_ALLOC gsl_monte_miser_alloc #define MONTE_PARAMS gsl_monte_miser_params #define MONTE_INTEGRATE(f,xl,xu,dim,calls,r,s,res,err) { gsl_monte_miser_params_get(s, ¶ms) ; params.alpha = 1.5 ; gsl_monte_miser_params_set(s, ¶ms) ; gsl_monte_miser_integrate(f,xl,xu,dim,calls,r,s,res,err); } #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_PARAMS #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) ; } #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) ; gsl_test(gsl_monte_vegas_chisq(s) < 0, NAME " returns valid chisq (%g)", gsl_monte_vegas_chisq(s)) #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(warm)" #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) ; 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); gsl_test(gsl_monte_vegas_chisq(s) < 0, NAME " returns valid chisq (%g)", gsl_monte_vegas_chisq(s)) #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(params)" #define MONTE_STATE gsl_monte_vegas_state #define MONTE_ALLOC gsl_monte_vegas_alloc #define MONTE_PARAMS gsl_monte_vegas_params #define MONTE_INTEGRATE(f,xl,xu,dim,calls,r,s,res,err) { gsl_monte_vegas_params_get(s, ¶ms) ; params.alpha = 2 ; params.iterations = 3 ; gsl_monte_vegas_params_set(s, ¶ms) ; 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); gsl_test(gsl_monte_vegas_chisq(s) < 0, NAME " returns valid chisq (%g)", gsl_monte_vegas_chisq(s)) #include "test_main.c" #undef NAME #undef MONTE_STATE #undef MONTE_ALLOC #undef MONTE_PARAMS #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; } /* Step-type (pulse) function */ double fstep (double x[], size_t num_dim, void *params) { return (x[0] > 0.1 && x[0] < 0.9) ? 1 : 0; } /* 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); } gsl-doc-2.3/gsl_pow_int.h0000664000175000017500000000437512616157443013501 0ustar eddedd/* gsl_pow_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ #include #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 INLINE_DECL double gsl_pow_2(const double x); INLINE_DECL double gsl_pow_3(const double x); INLINE_DECL double gsl_pow_4(const double x); INLINE_DECL double gsl_pow_5(const double x); INLINE_DECL double gsl_pow_6(const double x); INLINE_DECL double gsl_pow_7(const double x); INLINE_DECL double gsl_pow_8(const double x); INLINE_DECL double gsl_pow_9(const double x); #ifdef HAVE_INLINE INLINE_FUN double gsl_pow_2(const double x) { return x*x; } INLINE_FUN double gsl_pow_3(const double x) { return x*x*x; } INLINE_FUN double gsl_pow_4(const double x) { double x2 = x*x; return x2*x2; } INLINE_FUN double gsl_pow_5(const double x) { double x2 = x*x; return x2*x2*x; } INLINE_FUN double gsl_pow_6(const double x) { double x2 = x*x; return x2*x2*x2; } INLINE_FUN double gsl_pow_7(const double x) { double x3 = x*x*x; return x3*x3*x; } INLINE_FUN double gsl_pow_8(const double x) { double x2 = x*x; double x4 = x2*x2; return x4*x4; } INLINE_FUN 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 gsl_pow_uint(double x, unsigned int n); __END_DECLS #endif /* __GSL_POW_INT_H__ */ gsl-doc-2.3/doc/0000755000175000017500000000000013022553155011526 5ustar eddeddgsl-doc-2.3/doc/mdate-sh0000755000175000017500000001363712630105472013167 0ustar eddedd#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2010-08-21.06; # UTC # Copyright (C) 1995-2013 Free Software Foundation, Inc. # written by Ulrich Drepper , 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, see . # 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 or send patches to # . if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST fi 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 day of FILE, in the format: 1 January 1970 Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac error () { echo "$0: $1" >&2 exit 1 } # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume 'unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi 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 # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" 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_command /` # Find which argument is the month. month= command= until test $month do test $# -gt 0 || error "failed parsing '$ls_command /' output" 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 test -n "$month" || error "failed parsing '$ls_command /' output" # 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-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/doc/min.texi0000664000175000017500000003473412766546241013235 0ustar eddedd@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}) @tindex gsl_min_fminimizer @tindex gsl_min_fminimizer_type 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.3819660}@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 @deffn {Minimizer} gsl_min_fminimizer_quad_golden @cindex safeguarded step-length algorithm This is a variant of Brent's algorithm which uses the safeguarded step-length algorithm of Gill and Murray. @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.txt @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 @w{} @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 gsl-doc-2.3/doc/roots-newtons-method.eps0000664000175000017500000001732012616157443016373 0ustar eddedd%!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 gsl-doc-2.3/doc/math.texi0000664000175000017500000003171612616157443013374 0ustar eddedd@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 @defvr {Macro} 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 defvr @defvr {Macro} 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 defvr @defvr {Macro} 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 defvr @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.@footnote{Note that the C99 standard only requires the system @code{isinf} function to return a non-zero value, without the sign of the infinity. The implementation in some earlier versions of GSL used the system @code{isinf} function and may have this behavior on some platforms. Therefore, it is advisable to test the sign of @var{x} separately, if needed, rather than relying the sign of the return value from @code{gsl_isinf()}.} @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_hypot3 (const double @var{x}, const double @var{y}, const double @var{z}) @cindex euclidean distance function, hypot @cindex length, computed accurately using hypot This function computes the value of @c{$\sqrt{x^2 + y^2 + z^2}$} @math{\sqrt@{x^2 + y^2 + z^2@}} in a way that avoids overflow. @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}) @deftypefunx double gsl_pow_uint (double @var{x}, unsigned int @var{n}) These routines 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 @code{HAVE_INLINE} is defined, so that use of these functions should be as efficient as explicitly writing the corresponding product expression. @end deftypefun @example #include 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 Note that the following macros perform multiple evaluations of their arguments, so they should not be used with arguments that have side effects (such as a call to a random number generator). @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}. Note that @math{x} and @math{y} are compared to relative accuracy, so this function is not suitable for testing whether a value is approximately zero. The implementation is based on the package @code{fcmp} by T.C. Belding. @end deftypefun gsl-doc-2.3/doc/siman-energy.eps0000664000175000017500000046054512616157443014665 0ustar eddedd%!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 gsl-doc-2.3/doc/specfunc-dilog.texi0000664000175000017500000000242712616157443015342 0ustar eddedd@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}. Note that Abramowitz & Stegun refer to the Spence integral @math{S(x)=Li_2(1-x)} as the dilogarithm rather than @math{Li_2(x)}. @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 gsl-doc-2.3/doc/specfunc-zeta.texi0000664000175000017500000000663312616157443015212 0ustar eddedd@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 @cindex 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 @cindex 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 @cindex 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 gsl-doc-2.3/doc/rand-gamma.tex0000664000175000017500000006043512616157443014276 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-gamma.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-gamma.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 4944 M 19 -72 V 20 -70 V 19 -69 V 20 -68 V 19 -67 V 20 -66 V 19 -64 V 19 -64 V 20 -63 V 19 -61 V 20 -61 V 19 -59 V 20 -59 V 19 -57 V 19 -57 V 20 -55 V 19 -55 V 20 -54 V 19 -53 V 20 -52 V 19 -51 V 19 -51 V 20 -49 V 19 -49 V 20 -48 V 19 -47 V 20 -46 V 19 -46 V 19 -44 V 20 -44 V 19 -44 V 20 -42 V 19 -42 V 20 -41 V 19 -41 V 19 -40 V 20 -39 V 19 -38 V 20 -38 V 19 -38 V 20 -36 V 19 -36 V 19 -36 V 20 -35 V 19 -34 V 20 -33 V 19 -34 V 20 -32 V 19 -32 V 19 -32 V 20 -31 V 19 -30 V 20 -30 V 19 -30 V 20 -29 V 19 -28 V 19 -28 V 20 -28 V 19 -27 V 20 -27 V 19 -26 V 20 -26 V 19 -25 V 19 -25 V 20 -24 V 19 -25 V 20 -23 V 19 -24 V 20 -23 V 19 -22 V 19 -22 V 20 -22 V 19 -22 V 20 -21 V 19 -20 V 20 -21 V 19 -20 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -18 V 20 -19 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -16 V 20 -16 V 19 -16 V 19 -16 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -14 V 19 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -14 V 3052 1401 L 20 -12 V 19 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -9 V 20 -8 V 19 -7 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 5092 764 L 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 71 V 20 69 V 19 66 V 20 64 V 19 62 V 20 59 V 19 58 V 19 56 V 20 53 V 19 52 V 20 50 V 19 48 V 20 46 V 19 45 V 19 43 V 20 41 V 19 40 V 20 38 V 19 36 V 20 35 V 19 34 V 19 32 V 20 31 V 19 30 V 20 28 V 19 27 V 20 26 V 19 24 V 19 24 V 20 22 V 19 21 V 20 21 V 19 19 V 20 18 V 19 17 V 19 16 V 20 15 V 19 15 V 20 13 V 19 13 V 20 12 V 19 11 V 19 10 V 20 9 V 19 9 V 20 8 V 19 8 V 20 6 V 19 6 V 19 6 V 20 5 V 19 4 V 20 4 V 19 3 V 20 2 V 19 2 V 19 2 V 20 1 V 19 1 V 20 0 V 19 -1 V 20 0 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 20 -8 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -10 V 3052 1958 L 20 -9 V 19 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -10 V 19 -9 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 5092 1094 L 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V stroke LT2 LTb LT2 6077 4381 M 543 0 V 1051 631 M 19 1 V 20 1 V 19 3 V 20 4 V 19 5 V 20 6 V 19 6 V 19 8 V 20 8 V 19 9 V 20 10 V 19 10 V 20 11 V 19 12 V 19 12 V 20 12 V 19 13 V 20 14 V 19 13 V 20 15 V 19 14 V 19 15 V 20 15 V 19 16 V 20 15 V 19 16 V 20 16 V 19 16 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 19 17 V 20 17 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 19 16 V 20 16 V 19 16 V 20 16 V 19 16 V 20 16 V 19 15 V 19 15 V 20 16 V 19 14 V 20 15 V 19 15 V 20 14 V 19 14 V 19 14 V 20 14 V 19 14 V 20 13 V 19 13 V 20 13 V 19 13 V 19 12 V 20 12 V 19 12 V 20 12 V 19 11 V 20 12 V 19 11 V 19 10 V 20 11 V 19 10 V 20 10 V 19 10 V 20 9 V 19 10 V 19 9 V 20 8 V 19 9 V 20 8 V 19 8 V 20 8 V 19 7 V 19 8 V 20 7 V 19 6 V 20 7 V 19 6 V 20 6 V 19 6 V 19 6 V 20 5 V 19 5 V 20 5 V 19 5 V 20 5 V 19 4 V 19 4 V 20 4 V 19 3 V 20 4 V 3052 1774 L 20 3 V 19 3 V 19 2 V 20 3 V 19 2 V 20 2 V 19 1 V 20 2 V 19 1 V 19 2 V 20 1 V 19 1 V 20 0 V 19 1 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 5092 1436 L 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4381){\rjust{\strut{}$a=3$}}% \put(5957,4581){\rjust{\strut{}$a=2$}}% \put(5957,4781){\rjust{\strut{}$a=1$}}% \put(3955,5244){\cjust{\strut{}Gamma Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/robust.eps0000664000175000017500000005473112616157443013601 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: robust.eps %%Creator: gnuplot 4.6 patchlevel 3 %%CreationDate: Fri May 10 14:35:06 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -80 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (robust.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 3) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Fri May 10 14:35:06 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 240 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 792 480 M 63 0 V 5912 0 R -63 0 V stroke 648 480 M [ [(Helvetica) 240.0 0.0 true true 0 (-10)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 868 M 63 0 V 5912 0 R -63 0 V stroke 648 868 M [ [(Helvetica) 240.0 0.0 true true 0 (-8)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 1257 M 63 0 V 5912 0 R -63 0 V stroke 648 1257 M [ [(Helvetica) 240.0 0.0 true true 0 (-6)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 1645 M 63 0 V 5912 0 R -63 0 V stroke 648 1645 M [ [(Helvetica) 240.0 0.0 true true 0 (-4)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 2033 M 63 0 V 5912 0 R -63 0 V stroke 648 2033 M [ [(Helvetica) 240.0 0.0 true true 0 (-2)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 2421 M 63 0 V 5912 0 R -63 0 V stroke 648 2421 M [ [(Helvetica) 240.0 0.0 true true 0 ( 0)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 2810 M 63 0 V 5912 0 R -63 0 V stroke 648 2810 M [ [(Helvetica) 240.0 0.0 true true 0 ( 2)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 3198 M 63 0 V 5912 0 R -63 0 V stroke 648 3198 M [ [(Helvetica) 240.0 0.0 true true 0 ( 4)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 3586 M 63 0 V 5912 0 R -63 0 V stroke 648 3586 M [ [(Helvetica) 240.0 0.0 true true 0 ( 6)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 3974 M 63 0 V 5912 0 R -63 0 V stroke 648 3974 M [ [(Helvetica) 240.0 0.0 true true 0 ( 8)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 4363 M 63 0 V 5912 0 R -63 0 V stroke 648 4363 M [ [(Helvetica) 240.0 0.0 true true 0 ( 10)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 4751 M 63 0 V 5912 0 R -63 0 V stroke 648 4751 M [ [(Helvetica) 240.0 0.0 true true 0 ( 12)] ] -80.0 MRshow 1.000 UL LTb LCb setrgbcolor 792 480 M 0 63 V 0 4208 R 0 -63 V stroke 792 240 M [ [(Helvetica) 240.0 0.0 true true 0 (-5)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 1390 480 M 0 63 V 0 4208 R 0 -63 V stroke 1390 240 M [ [(Helvetica) 240.0 0.0 true true 0 (-4)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 1987 480 M 0 63 V 0 4208 R 0 -63 V stroke 1987 240 M [ [(Helvetica) 240.0 0.0 true true 0 (-3)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 2585 480 M 0 63 V 0 4208 R 0 -63 V stroke 2585 240 M [ [(Helvetica) 240.0 0.0 true true 0 (-2)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 3182 480 M 0 63 V 0 4208 R 0 -63 V stroke 3182 240 M [ [(Helvetica) 240.0 0.0 true true 0 (-1)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 3780 480 M 0 63 V 0 4208 R 0 -63 V stroke 3780 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 0)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 4377 480 M 0 63 V 0 4208 R 0 -63 V stroke 4377 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 1)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 4975 480 M 0 63 V 0 4208 R 0 -63 V stroke 4975 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 2)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 5572 480 M 0 63 V 0 4208 R 0 -63 V stroke 5572 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 3)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 6170 480 M 0 63 V 0 4208 R 0 -63 V stroke 6170 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 4)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 6767 480 M 0 63 V 0 4208 R 0 -63 V stroke 6767 240 M [ [(Helvetica) 240.0 0.0 true true 0 ( 5)] ] -80.0 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 792 4751 N 792 480 L 5975 0 V 0 4271 V -5975 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 4.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 1800 4568 M [ [(Helvetica) 240.0 0.0 true true 0 (Robust)] ] -80.0 MRshow LT0 1944 4568 M 639 0 V 792 1886 M 122 56 V 122 56 V 122 57 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 121 56 V 122 56 V 122 57 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 57 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 121 56 V 122 56 V 122 56 V 122 57 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 56 V 122 57 V 122 56 V 122 56 V 122 56 V 122 56 V 121 56 V 122 56 V 122 56 V 122 56 V 122 57 V 122 56 V 187 86 V 5871 4224 L 358 165 V % End plot #1 % Begin plot #2 stroke LT1 LC1 setrgbcolor LCb setrgbcolor 1800 4328 M [ [(Helvetica) 240.0 0.0 true true 0 (OLS)] ] -80.0 MRshow LT1 1944 4328 M 639 0 V 792 2184 M 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 121 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 121 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 121 36 V 122 36 V 122 35 V 122 36 V 122 36 V 122 35 V 187 55 V 5871 3669 L 358 105 V % End plot #2 % Begin plot #3 2.000 UP stroke 1.000 UL LT2 LC2 setrgbcolor LCb setrgbcolor 1800 4088 M [ [(Helvetica) 240.0 0.0 true true 0 (Data)] ] -80.0 MRshow LT2 792 1961 TriUF 914 1856 TriUF 1036 1937 TriUF 1158 2123 TriUF 1280 2042 TriUF 1402 2149 TriUF 1524 2298 TriUF 1646 2314 TriUF 1768 2332 TriUF 1889 2428 TriUF 2011 2489 TriUF 2133 2527 TriUF 2255 2518 TriUF 2377 2670 TriUF 2499 2672 TriUF 2621 2662 TriUF 2743 2779 TriUF 2865 2820 TriUF 2987 2844 TriUF 3109 2900 TriUF 3231 2922 TriUF 3353 3038 TriUF 3475 3069 TriUF 3597 3272 TriUF 3719 3258 TriUF 3840 3378 TriUF 3962 3390 TriUF 4084 3415 TriUF 4206 3485 TriUF 4328 3469 TriUF 4450 3548 TriUF 4572 3571 TriUF 4694 3618 TriUF 4816 3789 TriUF 4938 3861 TriUF 5060 3902 TriUF 5182 3974 TriUF 5304 3912 TriUF 5426 4086 TriUF 5548 4029 TriUF 5670 4090 TriUF 5791 4220 TriUF 5913 4220 TriUF 6035 4293 TriUF 6157 4311 TriUF 6279 4377 TriUF 6401 4516 TriUF 6588 810 TriUF 5871 1121 TriUF 6229 1257 TriUF 2263 4088 TriUF % End plot #3 1.000 UL LTb LCb setrgbcolor 792 4751 N 792 480 L 5975 0 V 0 4271 V -5975 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica gsl-doc-2.3/doc/integration.texi0000664000175000017500000011025312620026734014751 0ustar eddedd@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, de Doncker-Kapenga, Ueberhuber and Kahaner. Fortran code for @sc{quadpack} is available on Netlib. Also included are non-adaptive, fixed-order Gauss-Legendre integration routines with high precision coefficients by Pavel Holoborodko. 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:: * CQUAD doubly-adaptive integration:: * Fixed order Gauss-Legendre integration:: * 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 In short, the routines return the first approximation which has an absolute error smaller than @c{$\hbox{\it epsabs}$} @math{epsabs} or a relative error smaller than @c{$\hbox{\it epsrel}$} @math{epsrel}. Note that this is an @i{either-or} constraint, not simultaneous. To compute to a specified absolute error, set @c{$\hbox{\it epsrel}$} @math{epsrel} to zero. To compute to a specified relative error, set @c{$\hbox{\it epsabs}$} @math{epsabs} to zero. 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-Patterson 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}) @tindex gsl_integration_workspace This function allocates a workspace sufficient to hold @var{n} double precision intervals, their integration results and error estimates. One workspace may be used multiple times as all necessary reinitialization is performed automatically by the integration routines. @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}) @tindex gsl_integration_qaws_table 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}) @tindex gsl_integration_qawo_table 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_{in - 1]}, this function obtains the @var{i}-th Gauss-Legendre point @var{xi} and weight @var{wi} on the interval [@var{a},@var{b}]. The points and weights are ordered by increasing point value. A function @math{f} may be integrated on [@var{a},@var{b}] by summing @math{wi * f(xi)} over @var{i}. @end deftypefun @deftypefun void gsl_integration_glfixed_table_free ({gsl_integration_glfixed_table *} @var{t}) @tindex gsl_integration_glfixed_table This function frees the memory associated with the table @var{t}. @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 an 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.txt @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 @w{} @item R. Piessens, E. de Doncker-Kapenga, C.W. Ueberhuber, D.K. Kahaner. @cite{@sc{quadpack} A subroutine package for automatic integration} Springer Verlag, 1983. @end itemize @noindent The @sc{cquad} integration algorithm is described in the following paper: @itemize @w{} @item P. Gonnet, ``Increasing the Reliability of Adaptive Quadrature Using Explicit Interpolants'', @cite{ACM Transactions on Mathematical Software}, Volume 37 (2010), Issue 3, Article 26. @end itemize gsl-doc-2.3/doc/roots-false-position.eps0000664000175000017500000002161412616157443016355 0ustar eddedd%!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 gsl-doc-2.3/doc/autoconf.texi0000664000175000017500000001015312616157443014251 0ustar eddedd@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],[cos]) AC_CHECK_LIB([gslcblas],[cblas_dgemm]) AC_CHECK_LIB([gsl],[gsl_blas_dgemm]) @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 cos in -lm... yes checking for cblas_dgemm in -lgslcblas... yes checking for gsl_blas_dgemm 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 AX_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{AX_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 } to substitute @code{gsl_hypot} for each occurrence of @code{hypot} when @code{hypot} is not available. gsl-doc-2.3/doc/ode-initval.texi0000664000175000017500000007625512616157443014665 0ustar eddedd@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. A driver object can be used as a high level wrapper for easy use of low level functions. These functions are declared in the header file @file{gsl_odeiv2.h}. This is a new interface in version 1.15 and uses the prefix @code{gsl_odeiv2} for all functions. It is recommended over the previous @code{gsl_odeiv} implementation defined in @file{gsl_odeiv.h} The old interface has been retained under the original name for backwards compatibility. @menu * Defining the ODE System:: * Stepping Functions:: * Adaptive Step-size Control:: * Evolution:: * Driver:: * 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_odeiv2_system} datatype. @deftp {Data Type} gsl_odeiv2_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. A special return value @code{GSL_EBADFUNC} causes @code{gsl_odeiv2} routines to immediately stop and return. If @code{function} is modified (for example contents of @var{params}), the user must call an appropriate reset function (@code{gsl_odeiv2_driver_reset}, @code{gsl_odeiv2_evolve_reset} or @code{gsl_odeiv2_step_reset}) before continuing. Use return values distinct from standard GSL error codes to distinguish your function as the source of the error. @item int (* jacobian) (double t, const double y[], double * dfdy, double dfdt[], void * params); @cindex Jacobian matrix, ODEs 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. Not all of the stepper algorithms of @code{gsl_odeiv2} make use of the Jacobian matrix, so it may not be necessary to provide this function (the @code{jacobian} element of the struct can be replaced by a null pointer for those algorithms). The function should return @code{GSL_SUCCESS} if the calculation was completed successfully. Any other return value indicates an error. A special return value @code{GSL_EBADFUNC} causes @code{gsl_odeiv2} routines to immediately stop and return. If @code{jacobian} is modified (for example contents of @var{params}), the user must call an appropriate reset function (@code{gsl_odeiv2_driver_reset}, @code{gsl_odeiv2_evolve_reset} or @code{gsl_odeiv2_step_reset}) before continuing. Use return values distinct from standard GSL error codes to distinguish your function as the source of the error. @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_odeiv2_step *} gsl_odeiv2_step_alloc (const gsl_odeiv2_step_type * @var{T}, size_t @var{dim}) @tindex gsl_odeiv2_step @tindex gsl_odeiv2_step_type 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. Please note that if you use a stepper method that requires access to a driver object, it is advisable to use a driver allocation method, which automatically allocates a stepper, too. @end deftypefun @deftypefun int gsl_odeiv2_step_reset (gsl_odeiv2_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_odeiv2_step_free (gsl_odeiv2_step * @var{s}) This function frees all the memory associated with the stepping function @var{s}. @end deftypefun @deftypefun {const char *} gsl_odeiv2_step_name (const gsl_odeiv2_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_odeiv2_step_name (s)); @end example @noindent would print something like @code{step method is 'rkf45'}. @end deftypefun @deftypefun {unsigned int} gsl_odeiv2_step_order (const gsl_odeiv2_step * @var{s}) This function returns the order of the stepping function on the previous step. The order can vary if the stepping function itself is adaptive. @end deftypefun @deftypefun int gsl_odeiv2_step_set_driver (gsl_odeiv2_step * @var{s}, const gsl_odeiv2_driver * @var{d}) This function sets a pointer of the driver object @var{d} for stepper @var{s}, to allow the stepper to access control (and evolve) object through the driver object. This is a requirement for some steppers, to get the desired error level for internal iteration of stepper. Allocation of a driver object calls this function automatically. @end deftypefun @deftypefun int gsl_odeiv2_step_apply (gsl_odeiv2_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_odeiv2_system * @var{sys}) This function applies the stepping function @var{s} to the system of equations defined by @var{sys}, 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. The stepping function returns @code{GSL_FAILURE} if it is unable to compute the requested step. Also, if the user-supplied functions defined in the system @var{sys} return a status other than @code{GSL_SUCCESS} the step will be aborted. In that 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. Failure may be due to a singularity in the system or too large step-size @var{h}. In that case the step should be attempted again with a smaller step-size, e.g. @math{@var{h}/2}. If the driver object is not appropriately set via @code{gsl_odeiv2_step_set_driver} for those steppers that need it, the stepping function returns @code{GSL_EFAULT}. If the user-supplied functions defined in the system @var{sys} returns @code{GSL_EBADFUNC}, the function returns immediately with the same return code. In this case the user must call @code{gsl_odeiv2_step_reset} before calling this function again. @end deftypefun The following algorithms are available, @deffn {Step Type} gsl_odeiv2_step_rk2 @cindex RK2, Runge-Kutta method @cindex Runge-Kutta methods, ordinary differential equations Explicit embedded Runge-Kutta (2, 3) method. @end deffn @deffn {Step Type} gsl_odeiv2_step_rk4 @cindex RK4, Runge-Kutta method Explicit 4th order (classical) Runge-Kutta. Error estimation is carried out by the step doubling method. For more efficient estimate of the error, use the embedded methods described below. @end deffn @deffn {Step Type} gsl_odeiv2_step_rkf45 @cindex Fehlberg method, differential equations @cindex RKF45, Runge-Kutta-Fehlberg method Explicit embedded Runge-Kutta-Fehlberg (4, 5) method. This method is a good general-purpose integrator. @end deffn @deffn {Step Type} gsl_odeiv2_step_rkck @cindex Runge-Kutta Cash-Karp method @cindex Cash-Karp, Runge-Kutta method Explicit embedded Runge-Kutta Cash-Karp (4, 5) method. @end deffn @deffn {Step Type} gsl_odeiv2_step_rk8pd @cindex Runge-Kutta Prince-Dormand method @cindex Prince-Dormand, Runge-Kutta method Explicit embedded Runge-Kutta Prince-Dormand (8, 9) method. @end deffn @deffn {Step Type} gsl_odeiv2_step_rk1imp @cindex Implicit Euler method Implicit Gaussian first order Runge-Kutta. Also known as implicit Euler or backward Euler method. Error estimation is carried out by the step doubling method. This algorithm requires the Jacobian and access to the driver object via @code{gsl_odeiv2_step_set_driver}. @end deffn @deffn {Step Type} gsl_odeiv2_step_rk2imp @cindex Implicit Runge-Kutta method Implicit Gaussian second order Runge-Kutta. Also known as implicit mid-point rule. Error estimation is carried out by the step doubling method. This stepper requires the Jacobian and access to the driver object via @code{gsl_odeiv2_step_set_driver}. @end deffn @deffn {Step Type} gsl_odeiv2_step_rk4imp Implicit Gaussian 4th order Runge-Kutta. Error estimation is carried out by the step doubling method. This algorithm requires the Jacobian and access to the driver object via @code{gsl_odeiv2_step_set_driver}. @end deffn @deffn {Step Type} gsl_odeiv2_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. The method is generally suitable for stiff problems. This stepper requires the Jacobian. @end deffn @deffn {Step Type} gsl_odeiv2_step_msadams @cindex Adams method @cindex multistep methods, ODEs @cindex predictor-corrector method, ODEs @cindex Nordsieck form A variable-coefficient linear multistep Adams method in Nordsieck form. This stepper uses explicit Adams-Bashforth (predictor) and implicit Adams-Moulton (corrector) methods in @math{P(EC)^m} functional iteration mode. Method order varies dynamically between 1 and 12. This stepper requires the access to the driver object via @code{gsl_odeiv2_step_set_driver}. @end deffn @deffn {Step Type} gsl_odeiv2_step_msbdf @cindex BDF method A variable-coefficient linear multistep backward differentiation formula (BDF) method in Nordsieck form. This stepper uses the explicit BDF formula as predictor and implicit BDF formula as corrector. A modified Newton iteration method is used to solve the system of non-linear equations. Method order varies dynamically between 1 and 5. The method is generally suitable for stiff problems. This stepper requires the Jacobian and the access to the driver object via @code{gsl_odeiv2_step_set_driver}. @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_odeiv2_control *} gsl_odeiv2_control_standard_new (double @var{eps_abs}, double @var{eps_rel}, double @var{a_y}, double @var{a_dydt}) @tindex gsl_odeiv2_control @tindex gsl_odeiv2_control_type 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\prime_i|) $$ \afterdisplay @end tex @ifinfo @example D_i = eps_abs + eps_rel * (a_y |y_i| + a_dydt h |y\prime_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_odeiv2_control *} gsl_odeiv2_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_odeiv2_control *} gsl_odeiv2_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_odeiv2_control *} gsl_odeiv2_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_odeiv2_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\prime_i|) $$ \afterdisplay @end tex @ifinfo @example D_i = eps_abs * s_i + eps_rel * (a_y |y_i| + a_dydt h |y\prime_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_odeiv2_control *} gsl_odeiv2_control_alloc (const gsl_odeiv2_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_odeiv2_control_init (gsl_odeiv2_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_odeiv2_control_free (gsl_odeiv2_control * @var{c}) This function frees all the memory associated with the control function @var{c}. @end deftypefun @deftypefun int gsl_odeiv2_control_hadjust (gsl_odeiv2_control * @var{c}, gsl_odeiv2_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_odeiv2_control_name (const gsl_odeiv2_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_odeiv2_control_name (c)); @end example @noindent would print something like @code{control method is 'standard'} @end deftypefun @deftypefun int gsl_odeiv2_control_errlevel (gsl_odeiv2_control * @var{c}, const double @var{y}, const double @var{dydt}, const double @var{h}, const size_t @var{ind}, double * @var{errlev}) This function calculates the desired error level of the @var{ind}-th component to @var{errlev}. It requires the value (@var{y}) and value of the derivative (@var{dydt}) of the component, and the current step size @var{h}. @end deftypefun @deftypefun int gsl_odeiv2_control_set_driver (gsl_odeiv2_control * @var{c}, const gsl_odeiv2_driver * @var{d}) This function sets a pointer of the driver object @var{d} for control object @var{c}. @end deftypefun @node Evolution @section Evolution The evolution function combines the results of a stepping function and control function to reliably advance the solution forward one step using an acceptable step-size. @deftypefun {gsl_odeiv2_evolve *} gsl_odeiv2_evolve_alloc (size_t @var{dim}) @tindex gsl_odeiv2_evolve 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_odeiv2_evolve_apply (gsl_odeiv2_evolve * @var{e}, gsl_odeiv2_control * @var{con}, gsl_odeiv2_step * @var{step}, const gsl_odeiv2_system * @var{sys}, double * @var{t}, double @var{t1}, double * @var{h}, double @var{y}[]) This function advances the system (@var{e}, @var{sys}) 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}. The control function @var{con} is applied to check whether the local error estimated by the stepping function @var{step} using step-size @var{h} exceeds the required error tolerance. If the error is too high, the step is retried by calling @var{step} with a decreased step-size. This process is continued until an acceptable step-size is found. An estimate of the local error for the step can be obtained from the components of the array @code{@var{e}->yerr[]}. If the user-supplied functions defined in the system @var{sys} returns @code{GSL_EBADFUNC}, the function returns immediately with the same return code. In this case the user must call @code{gsl_odeiv2_step_reset} and @code{gsl_odeiv2_evolve_reset} before calling this function again. Otherwise, if the user-supplied functions defined in the system @var{sys} or the stepping function @var{step} return a status other than @code{GSL_SUCCESS}, the step is retried with a decreased step-size. If the step-size decreases below machine precision, a status of @code{GSL_FAILURE} is returned if the user functions returned @code{GSL_SUCCESS}. Otherwise the value returned by user function is returned. If no acceptable step can be made, @var{t} and @var{y} will be restored to their pre-step values and @var{h} contains the final attempted step-size. If the step is successful the function returns a suggested step-size for the next step in @var{h}. 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. @end deftypefun @deftypefun int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve * @var{e}, gsl_odeiv2_control * @var{con}, gsl_odeiv2_step * @var{step}, const gsl_odeiv2_system * @var{sys}, double * @var{t}, const double @var{h}, double @var{y}[]) This function advances the ODE-system (@var{e}, @var{sys}, @var{con}) from time @var{t} and position @var{y} using the stepping function @var{step} by a specified step size @var{h}. If the local error estimated by the stepping function exceeds the desired error level, the step is not taken and the function returns @code{GSL_FAILURE}. Otherwise the value returned by user function is returned. @end deftypefun @deftypefun int gsl_odeiv2_evolve_reset (gsl_odeiv2_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_odeiv2_evolve_free (gsl_odeiv2_evolve * @var{e}) This function frees all the memory associated with the evolution function @var{e}. @end deftypefun @deftypefun int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve * @var{e}, const gsl_odeiv2_driver * @var{d}) This function sets a pointer of the driver object @var{d} for evolve object @var{e}. @end deftypefun @cindex discontinuities, in ODE systems If a system has discontinuous changes in the derivatives at known points, it is advisable to evolve the system between each discontinuity in sequence. For example, if a step-change in an external driving force occurs at times @math{t_a, t_b} and @math{t_c} then evolution should be carried out over the ranges @math{(t_0,t_a)}, @math{(t_a,t_b)}, @math{(t_b,t_c)}, and @math{(t_c,t_1)} separately and not directly over the range @math{(t_0,t_1)}. @node Driver @section Driver The driver object is a high level wrapper that combines the evolution, control and stepper objects for easy use. @deftypefun {gsl_odeiv2_driver *} gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system * @var{sys}, const gsl_odeiv2_step_type * @var{T}, const double @var{hstart}, const double @var{epsabs}, const double @var{epsrel}) @deftypefunx {gsl_odeiv2_driver *} gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * @var{sys}, const gsl_odeiv2_step_type * @var{T}, const double @var{hstart}, const double @var{epsabs}, const double @var{epsrel}) @deftypefunx {gsl_odeiv2_driver *} gsl_odeiv2_driver_alloc_standard_new (const gsl_odeiv2_system * @var{sys}, const gsl_odeiv2_step_type * @var{T}, const double @var{hstart}, const double @var{epsabs}, const double @var{epsrel}, const double @var{a_y}, const double @var{a_dydt}) @deftypefunx {gsl_odeiv2_driver *} gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system * @var{sys}, const gsl_odeiv2_step_type * @var{T}, const double @var{hstart}, const double @var{epsabs}, const double @var{epsrel}, const double @var{a_y}, const double @var{a_dydt}, const double @var{scale_abs}[]) These functions return a pointer to a newly allocated instance of a driver object. The functions automatically allocate and initialise the evolve, control and stepper objects for ODE system @var{sys} using stepper type @var{T}. The initial step size is given in @var{hstart}. The rest of the arguments follow the syntax and semantics of the control functions with same name (@code{gsl_odeiv2_control_*_new}). @end deftypefun @deftypefun {int} gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver * @var{d}, const double @var{hmin}) The function sets a minimum for allowed step size @var{hmin} for driver @var{d}. Default value is 0. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * @var{d}, const double @var{hmax}) The function sets a maximum for allowed step size @var{hmax} for driver @var{d}. Default value is @code{GSL_DBL_MAX}. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * @var{d}, const unsigned long int @var{nmax}) The function sets a maximum for allowed number of steps @var{nmax} for driver @var{d}. Default value of 0 sets no limit for steps. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_apply (gsl_odeiv2_driver * @var{d}, double * @var{t}, const double @var{t1}, double @var{y}[]) This function evolves the driver system @var{d} from @var{t} to @var{t1}. Initially vector @var{y} should contain the values of dependent variables at point @var{t}. If the function is unable to complete the calculation, an error code from @code{gsl_odeiv2_evolve_apply} is returned, and @var{t} and @var{y} contain the values from last successful step. If maximum number of steps is reached, a value of @code{GSL_EMAXITER} is returned. If the step size drops below minimum value, the function returns with @code{GSL_ENOPROG}. If the user-supplied functions defined in the system @var{sys} returns @code{GSL_EBADFUNC}, the function returns immediately with the same return code. In this case the user must call @code{gsl_odeiv2_driver_reset} before calling this function again. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * @var{d}, double * @var{t}, const double @var{h}, const unsigned long int @var{n}, double @var{y}[]) This function evolves the driver system @var{d} from @var{t} with @var{n} steps of size @var{h}. If the function is unable to complete the calculation, an error code from @code{gsl_odeiv2_evolve_apply_fixed_step} is returned, and @var{t} and @var{y} contain the values from last successful step. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_reset (gsl_odeiv2_driver * @var{d}) This function resets the evolution and stepper objects. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * @var{d}, const double @var{hstart}) The routine resets the evolution and stepper objects and sets new initial step size to @var{hstart}. This function can be used e.g. to change the direction of integration. @end deftypefun @deftypefun {int} gsl_odeiv2_driver_free (gsl_odeiv2_driver * @var{d}) This function frees the driver object, and the related evolution, stepper and control objects. @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 $$ u''(t) + \mu u'(t) (u(t)^2 - 1) + u(t) = 0 $$ \afterdisplay @end tex @ifinfo @example u''(t) + \mu u'(t) (u(t)^2 - 1) + u(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{v = u'(t)}, @tex \beforedisplay $$ \eqalign{ u' &= v\cr v' &= -u + \mu v (1-u^2) } $$ \afterdisplay @end tex @ifinfo @example u' = v v' = -u + \mu v (1-u^2) @end example @end ifinfo @noindent The program begins by defining functions for these derivatives and their Jacobian. The main function uses driver level functions to solve the problem. The program evolves the solution from @math{(u, v) = (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 @math{(u, v)}. The loop in the example prints the solution at the points @math{t_i = 1, 2, \dots, 100}. @example @verbatiminclude examples/ode-initval.c @end example @noindent The user can work with the lower level functions directly, as in the following example. In this case an intermediate result is printed after each successful step instead of equidistant time points. @example @verbatiminclude examples/ode-initval-low-level.c @end example @noindent For functions with multiple parameters, the appropriate information can be passed in through the @var{params} argument in @code{gsl_odeiv2_system} definition (@var{mu} in this example) by using a pointer to a struct. @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 It is also possible to work with a non-adaptive integrator, using only the stepping function itself, @code{gsl_odeiv2_driver_apply_fixed_step} or @code{gsl_odeiv2_evolve_apply_fixed_step}. The following program uses the driver level function, with fourth-order Runge-Kutta stepping function with a fixed stepsize of 0.001. @example @verbatiminclude examples/odefixed.c @end example @node ODE References and Further Reading @section References and Further Reading @itemize @w{} @item Ascher, U.M., Petzold, L.R., @cite{Computer Methods for Ordinary Differential and Differential-Algebraic Equations}, SIAM, Philadelphia, 1998. @end itemize @itemize @w{} @item Hairer, E., Norsett, S. P., Wanner, G., @cite{Solving Ordinary Differential Equations I: Nonstiff Problems}, Springer, Berlin, 1993. @end itemize @itemize @w{} @item Hairer, E., Wanner, G., @cite{Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems}, Springer, Berlin, 1996. @end itemize Many of the basic Runge-Kutta formulas can be found in the Handbook of Mathematical Functions, @itemize @w{} @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 @w{} @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 @noindent The Adams and BDF multistep methods @code{msadams} and @code{msbdf} are based on the following articles, @itemize @w{} @item G. D. Byrne and A. C. Hindmarsh, ``A Polyalgorithm for the Numerical Solution of Ordinary Differential Equations.'', ACM Trans. Math. Software, 1, 71--96, 1975. @item P. N. Brown, G. D. Byrne and A. C. Hindmarsh, ``VODE: A Variable-coefficient ODE Solver.'', SIAM J. Sci. Stat. Comput. 10, 1038--1051, 1989. @item A. C. Hindmarsh, P. N. Brown, K. E. Grant, S. L. Lee, R. Serban, D. E. Shumaker and C. S. Woodward, ``SUNDIALS: Suite of Nonlinear and Differential/Algebraic Equation Solvers.'', ACM Trans. Math. Software 31, 363--396, 2005. @end itemize gsl-doc-2.3/doc/rng.texi0000664000175000017500000013667212620443436013233 0ustar eddedd@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. @tindex gsl_rng_type 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}) @tindex gsl_rng 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}. @vindex gsl_rng_default_seed @vindex @env{GSL_RNG_SEED} @cindex @code{GSL_RNG_SEED} 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 @c{$@var{s} \geq 1$} @math{@var{s} >= 1} 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}. When using multiple seeds with the same generator, choose seed values greater than zero to avoid collisions with the default setting. Note that the most generators only accept 32-bit seeds, with higher values being reduced modulo @c{$2^{32}$} @math{2^32}. For generators with smaller ranges the maximum seed value will typically be lower. @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. @inlinefns{} 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 be 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 minimum 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) @vindex @env{GSL_RNG_TYPE} @vindex @env{GSL_RNG_SEED} @vindex gsl_rng_default @vindex gsl_rng_default_seed 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.txt @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. @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 @w{} @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. Note that the range of allowed seeds for this generator is @c{$[0,2^{31}-1]$} @math{[0,2^31-1]}. Higher seed values are wrapped modulo @c{$2^{31}$} @math{2^31}. @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 was used in the IMSL Library (subroutine RNUN) and in MATLAB (the RAND function) in the past. It is also sometimes known by the acronym ``GGL'' (I'm not sure what that stands for). For more information see, @itemize @w{} @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 @w{} @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 @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.txt @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/rngunif2.txt @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 @w{} @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 @w{} @item 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 @w{} @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 @w{} @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] gsl-doc-2.3/doc/specfunc-trig.texi0000664000175000017500000001474512616157443015217 0ustar eddedd@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{czr}, @var{czi}. @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{lszr}, @var{lszi}. @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 gsl-doc-2.3/doc/interp_compare.eps0000664000175000017500000005451212616157443015267 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: interp_compare.eps %%Creator: gnuplot 4.6 patchlevel 5 %%CreationDate: Mon Mar 31 16:17:38 2014 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (interp_compare.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 5) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Mon Mar 31 16:17:38 2014) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 546 280 M 63 0 V 6338 0 R -63 0 V stroke 462 280 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 1045 M 63 0 V 6338 0 R -63 0 V stroke 462 1045 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 1810 M 63 0 V 6338 0 R -63 0 V stroke 462 1810 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 2576 M 63 0 V 6338 0 R -63 0 V stroke 462 2576 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 3341 M 63 0 V 6338 0 R -63 0 V stroke 462 3341 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 4106 M 63 0 V 6338 0 R -63 0 V stroke 462 4106 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 4871 M 63 0 V 6338 0 R -63 0 V stroke 462 4871 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1.2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 546 280 M 0 63 V 0 4528 R 0 -63 V stroke 546 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 6)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1460 280 M 0 63 V 0 4528 R 0 -63 V stroke 1460 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 8)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2375 280 M 0 63 V 0 4528 R 0 -63 V stroke 2375 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3289 280 M 0 63 V 0 4528 R 0 -63 V stroke 3289 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 12)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4204 280 M 0 63 V 0 4528 R 0 -63 V stroke 4204 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 14)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5118 280 M 0 63 V 0 4528 R 0 -63 V stroke 5118 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 16)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6033 280 M 0 63 V 0 4528 R 0 -63 V stroke 6033 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 18)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6947 280 M 0 63 V 0 4528 R 0 -63 V stroke 6947 140 M [ [(Helvetica) 140.0 0.0 true true 0 ( 20)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 546 4871 N 546 280 L 6401 0 V 0 4591 V -6401 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 1.500 UP 1.000 UL LTb LCb setrgbcolor LCb setrgbcolor 6296 833 M [ [(Helvetica) 140.0 0.0 true true 0 (Data)] ] -46.7 MRshow LTb 1456 280 TriUF 1502 280 TriUF 1547 447 TriUF 1780 927 TriUF 2009 2076 TriUF 2375 3891 TriUF 3289 4101 TriUF 4661 4106 TriUF 6947 4106 TriUF 6579 833 TriUF % End plot #1 % Begin plot #2 4.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 6296 693 M [ [(Helvetica) 140.0 0.0 true true 0 (Cubic)] ] -46.7 MRshow LT0 6380 693 M 399 0 V 1456 280 M 55 23 V 55 212 V 55 139 V 55 84 V 54 79 V 55 124 V 55 204 V 55 269 V 55 310 V 55 327 V 55 325 V 55 312 V 55 298 V 55 277 V 55 254 V 54 227 V 55 195 V 55 161 V 55 130 V 55 101 V 55 74 V 55 50 V 55 29 V 55 9 V 55 -7 V 55 -22 V 54 -34 V 55 -42 V 55 -50 V 55 -54 V 55 -56 V 55 -56 V 55 -52 V 55 -48 V 55 -41 V 55 -35 V 55 -29 V 54 -25 V 55 -19 V 55 -15 V 55 -10 V 55 -6 V 55 -2 V 55 1 V 55 4 V 55 7 V 55 10 V 55 12 V 55 13 V 54 16 V 55 17 V 55 18 V 55 18 V 55 19 V 55 19 V 55 19 V 55 19 V 55 17 V 55 17 V 55 15 V 54 15 V 55 13 V 55 12 V 55 11 V 55 9 V 55 9 V 55 8 V 55 7 V 55 6 V 55 5 V 55 5 V 54 3 V 55 3 V 55 1 V 55 1 V 55 1 V 55 -1 V 55 -1 V 55 -1 V 55 -3 V 55 -2 V 55 -4 V 55 -4 V 54 -4 V 55 -5 V 55 -5 V 55 -6 V 55 -6 V 55 -7 V 55 -6 V 55 -7 V 55 -8 V 55 -7 V 55 -8 V 54 -8 V 55 -8 V 55 -8 V 55 -8 V 55 -9 V 55 -8 V % End plot #2 % Begin plot #3 stroke LT1 LC1 setrgbcolor LCb setrgbcolor 6296 553 M [ [(Helvetica) 140.0 0.0 true true 0 (Akima)] ] -46.7 MRshow LT1 6380 553 M 399 0 V 1456 280 M 55 29 V 55 184 V 55 85 V 55 61 V 54 103 V 55 209 V 55 273 V 55 277 V 55 278 V 55 276 V 55 281 V 55 289 V 55 291 V 55 285 V 55 271 V 54 251 V 55 223 V 55 180 V 55 139 V 55 101 V 55 67 V 55 37 V 55 12 V 55 -9 V 55 -27 V 55 -40 V 54 -49 V 55 -55 V 55 -54 V 55 -52 V 55 -44 V 55 -33 V 55 -17 V 55 -1 V 55 0 V 55 0 V 55 0 V 54 1 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 55 0 V 55 0 V 54 1 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V % End plot #3 % Begin plot #4 stroke LT2 LC2 setrgbcolor LCb setrgbcolor 6296 413 M [ [(Helvetica) 140.0 0.0 true true 0 (Steffen)] ] -46.7 MRshow LT2 6380 413 M 399 0 V 1456 280 M 55 13 V 55 211 V 55 117 V 55 77 V 54 91 V 55 156 V 55 235 V 55 282 V 55 302 V 55 291 V 55 302 V 55 343 V 55 353 V 55 328 V 55 272 V 54 181 V 55 63 V 55 24 V 55 23 V 55 21 V 55 19 V 55 18 V 55 16 V 55 15 V 55 14 V 55 11 V 54 11 V 55 9 V 55 7 V 55 6 V 55 5 V 55 3 V 55 1 V 55 1 V 55 0 V 55 1 V 55 0 V 54 0 V 55 1 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 1 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V 54 0 V 55 0 V 55 0 V 55 0 V 55 0 V 55 0 V % End plot #4 stroke 1.000 UL LTb LCb setrgbcolor 546 4871 N 546 280 L 6401 0 V 0 4591 V -6401 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica gsl-doc-2.3/doc/poly.texi0000664000175000017500000003441212620026734013413 0ustar eddedd@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 @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:: @end menu @node Polynomial Evaluation @section Polynomial Evaluation @cindex polynomial evaluation @cindex evaluation of polynomials The functions described here evaluate the polynomial @c{$P(x) = c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^{len-1}$} @math{P(x) = c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^@{len-1@}} using Horner's method for stability. @inlinefns{} @deftypefun double gsl_poly_eval (const double @var{c}[], const int @var{len}, const double @var{x}) This function evaluates a polynomial with real coefficients for the real variable @var{x}. @end deftypefun @deftypefun gsl_complex gsl_poly_complex_eval (const double @var{c}[], const int @var{len}, const gsl_complex @var{z}) This function evaluates a polynomial with real coefficients for the complex variable @var{z}. @end deftypefun @deftypefun gsl_complex gsl_complex_poly_complex_eval (const gsl_complex @var{c}[], const int @var{len}, const gsl_complex @var{z}) This function evaluates a polynomial with complex coefficients for the complex variable @var{z}. @end deftypefun @deftypefun int gsl_poly_eval_derivs (const double @var{c}[], const size_t @var{lenc}, const double @var{x}, double @var{res}[], const size_t @var{lenres}) This function evaluates a polynomial and its derivatives storing the results in the array @var{res} of size @var{lenres}. The output array contains the values of @math{d^k P/d x^k} for the specified value of @var{x} starting with @math{k = 0}. @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, and Burden and Faires, chapter 3, and discussed briefly below. @noindent Given a function @math{f(x)}, an @math{n}th degree interpolating polynomial @math{P_{n}(x)} can be constructed which agrees with @math{f} at @math{n+1} distinct points @math{x_0,x_1,...,x_{n}}. This polynomial can be written in a form known as Newton's divided-difference representation: @tex \beforedisplay $$ P_{n}(x) = f(x_0) + \sum_{k=1}^n [x_0,x_1,...,x_k] (x-x_0)(x-x_1) \cdots (x-x_{k-1}) $$ \afterdisplay @end tex @ifinfo @example P_n(x) = f(x_0) + \sum_(k=1)^n [x_0,x_1,...,x_k] (x-x_0)(x-x_1)...(x-x_(k-1)) @end example @end ifinfo where the divided differences @math{[x_0,x_1,...,x_k]} are defined in section 25.1.4 of Abramowitz and Stegun. Additionally, it is possible to construct an interpolating polynomial of degree @math{2n+1} which also matches the first derivatives of @math{f} at the points @math{x_0,x_1,...,x_n}. This is called the Hermite interpolating polynomial and is defined as @tex \beforedisplay $$ H_{2n+1}(x) = f(z_0) + \sum_{k=1}^{2n+1} [z_0,z_1,...,z_k] (x-z_0)(x-z_1) \cdots (x-z_{k-1}) $$ \afterdisplay @end tex @ifinfo @example H_(2n+1)(x) = f(z_0) + \sum_(k=1)^(2n+1) [z_0,z_1,...,z_k] (x-z_0)(x-z_1)...(x-z_(k-1)) @end example @end ifinfo where the elements of @math{z = \{x_0,x_0,x_1,x_1,...,x_n,x_n\}} are defined by @math{z_{2k} = z_{2k+1} = x_k}. The divided-differences @math{[z_0,z_1,...,z_k]} are discussed in Burden and Faires, section 3.4. @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{x}, @var{y}) 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}. Using the notation above, @math{dd[k] = [x_0,x_1,...,x_k]}. @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}. @inlinefn{} @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 @deftypefun int gsl_poly_dd_hermite_init (double @var{dd}[], double @var{za}[], const double @var{xa}[], const double @var{ya}[], const double @var{dya}[], const size_t @var{size}) This function computes a divided-difference representation of the interpolating Hermite polynomial for the points (@var{x}, @var{y}) stored in the arrays @var{xa} and @var{ya} of length @var{size}. Hermite interpolation constructs polynomials which also match first derivatives @math{dy/dx} which are provided in the array @var{dya} also of length @var{size}. The first derivatives can be incorported into the usual divided-difference algorithm by forming a new dataset @math{z = \{x_0,x_0,x_1,x_1,...\}}, which is stored in the array @var{za} of length 2*@var{size} on output. On output the divided-differences of the Hermite representation are stored in the array @var{dd}, also of length 2*@var{size}. Using the notation above, @math{dd[k] = [z_0,z_1,...,z_k]}. The resulting Hermite polynomial can be evaluated by calling @code{gsl_poly_dd_eval} and using @var{za} for the input argument @var{xa}. @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. As in the quadratic case, finite precision may cause equal or closely-spaced real roots to move off the real axis into the complex plane, leading to a discrete change in the number of real roots. @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}) @tindex gsl_poly_complex_workspace 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.txt @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 @w{} @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 the following texts, @itemize @w{} @item Abramowitz and Stegun, @cite{Handbook of Mathematical Functions}, Sections 25.1.4 and 25.2.26. @item R. L. Burden and J. D. Faires, @cite{Numerical Analysis}, 9th edition, ISBN 0-538-73351-9, 2011. @end itemize gsl-doc-2.3/doc/gsl-ref.info-30000644000175000017500000111503513022372746014115 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  File: gsl-ref.info, Node: Quasi-random number generator algorithms, Next: Quasi-random number generator examples, Prev: Saving and restoring quasi-random number generator state, Up: Quasi-Random Sequences 19.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. -- Generator: gsl_qrng_halton -- Generator: gsl_qrng_reversehalton These generators use the Halton and reverse Halton sequences described in J.H. Halton, 'Numerische Mathematik' 2, 84-90 (1960) and B. Vandewoestyne and R. Cools 'Computational and Applied Mathematics' 189, 1&2, 341-361 (2006). They are valid up to 1229 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 19.6 Examples ============= The following program prints the first 1024 points of the 2-dimensional Sobol sequence. #include #include 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 19.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 20 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 Multivariate 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 20.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 20.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-Muller 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 20.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 Multivariate Gaussian Distribution, Prev: The Gaussian Tail Distribution, Up: Random Number Distributions 20.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 Multivariate Gaussian Distribution, Next: The Exponential Distribution, Prev: The Bivariate Gaussian Distribution, Up: Random Number Distributions 20.5 The Multivariate Gaussian Distribution =========================================== -- Function: int gsl_ran_multivariate_gaussian (const gsl_rng * R, const gsl_vector * MU, const gsl_matrix * L, gsl_vector * RESULT) This function generates a random vector satisfying the k-dimensional multivariate Gaussian distribution with mean \mu and variance-covariance matrix \Sigma. On input, the k-vector \mu is given in MU, and the Cholesky factor of the k-by-k matrix \Sigma = L L^T is given in the lower triangle of L, as output from 'gsl_linalg_cholesky_decomp'. The random vector is stored in RESULT on output. The probability distribution for multivariate Gaussian random variates is p(x_1,...,x_k) dx_1 ... dx_k = {1 \over \sqrt{(2 \pi)^k |\Sigma|} \exp \left(-{1 \over 2} (x - \mu)^T \Sigma^{-1} (x - \mu)\right) dx_1 \dots dx_k -- Function: int gsl_ran_multivariate_gaussian_pdf (const gsl_vector * X, const gsl_vector * MU, const gsl_matrix * L, double * RESULT, gsl_vector * WORK) -- Function: int gsl_ran_multivariate_gaussian_log_pdf (const gsl_vector * X, const gsl_vector * MU, const gsl_matrix * L, double * RESULT, gsl_vector * WORK) These functions compute p(x) or \log{p(x)} at the point X, using mean vector MU and variance-covariance matrix specified by its Cholesky factor L using the formula above. Additional workspace of length k is required in WORK. -- Function: int gsl_ran_multivariate_gaussian_mean (const gsl_matrix * X, gsl_vector * MU_HAT) Given a set of n samples X_j from a k-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the mean of the distribution, given by \Hat{\mu} = {1 \over n} \sum_{j=1}^n X_j The samples X_1,X_2,\dots,X_n are given in the n-by-k matrix X, and the maximum likelihood estimate of the mean is stored in MU_HAT on output. -- Function: int gsl_ran_multivariate_gaussian_vcov (const gsl_matrix * X, gsl_matrix * SIGMA_HAT) Given a set of n samples X_j from a k-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the variance-covariance matrix of the distribution, given by \Hat{\Sigma} = {1 \over n} \sum_{j=1}^n \left( X_j - \Hat{\mu} \right) \left( X_j - \Hat{\mu} \right)^T The samples X_1,X_2,\dots,X_n are given in the n-by-k matrix X and the maximum likelihood estimate of the variance-covariance matrix is stored in SIGMA_HAT on output.  File: gsl-ref.info, Node: The Exponential Distribution, Next: The Laplace Distribution, Prev: The Multivariate Gaussian Distribution, Up: Random Number Distributions 20.6 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 20.7 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 20.8 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 20.9 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 20.10 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 20.11 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 20.12 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 20.13 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 20.14 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 20.15 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 20.16 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 20.17 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 20.18 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 20.19 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 20.20 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 20.21 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 20.22 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 20.23 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 20.24 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 20.25 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 20.26 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 20.27 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 20.28 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 20.29 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 variables 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 20.30 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 20.31 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 20.32 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 20.33 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. Davis, '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 20.34 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 20.35 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 20.36 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 20.37 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 20.38 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 20.39 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 20.40 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 #include #include 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 4 5 6 3 3 1 4 2 5 5 The following program generates a random walk in two dimensions. #include #include #include 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 some output from the program, four 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 #include 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 20.41 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. Available online at . 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) . 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: Running Statistics, Prev: Random Number Distributions, Up: Top 21 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'. All the functions operate on C arrays with a STRIDE parameter specifying the spacing between elements. * Menu: * Mean and standard deviation and variance:: * Absolute deviation:: * Higher moments (skewness and kurtosis):: * Autocorrelation:: * Covariance:: * Correlation:: * 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 21.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_tss (const double DATA[], size_t STRIDE, size_t N) -- Function: double gsl_stats_tss_m (const double DATA[], size_t STRIDE, size_t N, double MEAN) These functions return the total sum of squares (TSS) of DATA about the mean. For 'gsl_stats_tss_m' the user-supplied value of MEAN is used, and for 'gsl_stats_tss' it is computed using 'gsl_stats_mean'. TSS = \sum (x_i - mean)^2 -- 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 21.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 21.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 21.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 = 2}^{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: Correlation, Prev: Autocorrelation, Up: Statistics 21.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: Correlation, Next: Weighted Samples, Prev: Covariance, Up: Statistics 21.6 Correlation ================ -- Function: double gsl_stats_correlation (const double DATA1[], const size_t STRIDE1, const double DATA2[], const size_t STRIDE2, const size_t N) This function efficiently computes the Pearson correlation coefficient between the datasets DATA1 and DATA2 which must both be of the same length N. r = cov(x, y) / (\Hat\sigma_x \Hat\sigma_y) = {1/(n-1) \sum (x_i - \Hat x) (y_i - \Hat y) \over \sqrt{1/(n-1) \sum (x_i - \Hat x)^2} \sqrt{1/(n-1) \sum (y_i - \Hat y)^2} } -- Function: double gsl_stats_spearman (const double DATA1[], const size_t STRIDE1, const double DATA2[], const size_t STRIDE2, const size_t N, double WORK[]) This function computes the Spearman rank correlation coefficient between the datasets DATA1 and DATA2 which must both be of the same length N. Additional workspace of size 2*N is required in WORK. The Spearman rank correlation between vectors x and y is equivalent to the Pearson correlation between the ranked vectors x_R and y_R, where ranks are defined to be the average of the positions of an element in the ascending order of the values.  File: gsl-ref.info, Node: Weighted Samples, Next: Maximum and Minimum values, Prev: Correlation, Up: Statistics 21.7 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 calculated 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 the 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_wtss (const double W[], const size_t WSTRIDE, const double DATA[], size_t STRIDE, size_t N) -- Function: double gsl_stats_wtss_m (const double W[], const size_t WSTRIDE, const double DATA[], size_t STRIDE, size_t N, double WMEAN) These functions return the weighted total sum of squares (TSS) of DATA about the weighted mean. For 'gsl_stats_wtss_m' the user-supplied value of WMEAN is used, and for 'gsl_stats_wtss' it is computed using 'gsl_stats_wmean'. TSS = \sum w_i (x_i - wmean)^2 -- 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 - \Hat x)/\Hat \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 - \Hat x)/\Hat \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.  File: gsl-ref.info, Node: Maximum and Minimum values, Next: Median and Percentiles, Prev: Weighted Samples, Up: Statistics 21.8 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 21.9 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 21.10 Examples ============== Here is a basic example of how to use the statistical functions: #include #include 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 5.373 The largest value is 18.3 The smallest value is 12.6 Here is an example using sorted data, #include #include #include 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 21.11 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 .  File: gsl-ref.info, Node: Running Statistics, Next: Histograms, Prev: Statistics, Up: Top 22 Running Statistics ********************* This chapter describes routines for computing running statistics, also known as online statistics, of data. These routines are suitable for handling large datasets for which it may be inconvenient or impractical to store in memory all at once. The data can be processed in a single pass, one point at a time. Each time a data point is added to the accumulator, internal parameters are updated in order to compute the current mean, variance, standard deviation, skewness, and kurtosis. These statistics are exact, and are updated with numerically stable single-pass algorithms. The median and arbitrary quantiles are also available, however these calculations use algorithms which provide approximations, and grow more accurate as more data is added to the accumulator. The functions described in this chapter are declared in the header file 'gsl_rstat.h'. * Menu: * Running Statistics Initializing the Accumulator:: * Running Statistics Adding Data to the Accumulator:: * Running Statistics Current Statistics:: * Running Statistics Quantiles:: * Running Statistics Example programs:: * Running Statistics References and Further Reading::  File: gsl-ref.info, Node: Running Statistics Initializing the Accumulator, Next: Running Statistics Adding Data to the Accumulator, Up: Running Statistics 22.1 Initializing the Accumulator ================================= -- Function: gsl_rstat_workspace * gsl_rstat_alloc (void) This function allocates a workspace for computing running statistics. The size of the workspace is O(1). -- Function: void gsl_rstat_free (gsl_rstat_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_rstat_reset (gsl_rstat_workspace * W) This function resets the workspace W to its initial state, so it can begin working on a new set of data.  File: gsl-ref.info, Node: Running Statistics Adding Data to the Accumulator, Next: Running Statistics Current Statistics, Prev: Running Statistics Initializing the Accumulator, Up: Running Statistics 22.2 Adding Data to the Accumulator =================================== -- Function: int gsl_rstat_add (const double X, gsl_rstat_workspace * W) This function adds the data point X to the statistical accumulator, updating calculations of the mean, variance, standard deviation, skewness, kurtosis, and median. -- Function: size_t gsl_rstat_n (gsl_rstat_workspace * W) This function returns the number of data so far added to the accumulator.  File: gsl-ref.info, Node: Running Statistics Current Statistics, Next: Running Statistics Quantiles, Prev: Running Statistics Adding Data to the Accumulator, Up: Running Statistics 22.3 Current Statistics ======================= -- Function: double gsl_rstat_min (gsl_rstat_workspace * W) This function returns the minimum value added to the accumulator. -- Function: double gsl_rstat_max (gsl_rstat_workspace * W) This function returns the maximum value added to the accumulator. -- Function: double gsl_rstat_mean (gsl_rstat_workspace * W) This function returns the mean of all data added to the accumulator, defined as \Hat\mu = (1/N) \sum x_i -- Function: double gsl_rstat_variance (gsl_rstat_workspace * W) This function returns the variance of all data added to the accumulator, defined as \Hat\sigma^2 = (1/(N-1)) \sum (x_i - \Hat\mu)^2 -- Function: double gsl_rstat_sd (gsl_rstat_workspace * W) This function returns the standard deviation of all data added to the accumulator, defined as the square root of the variance given above. -- Function: double gsl_rstat_sd_mean (gsl_rstat_workspace * W) This function returns the standard deviation of the mean, defined as sd_mean = \Hat\sigma / \sqrt{N} -- Function: double gsl_rstat_rms (gsl_rstat_workspace * W) This function returns the root mean square of all data added to the accumulator, defined as rms = \sqrt ( 1/N \sum x_i^2 ) -- Function: double gsl_rstat_skew (gsl_rstat_workspace * W) This function returns the skewness of all data added to the accumulator, defined as skew = (1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^3 -- Function: double gsl_rstat_kurtosis (gsl_rstat_workspace * W) This function returns the kurtosis of all data added to the accumulator, defined as kurtosis = ((1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^4) - 3 -- Function: double gsl_rstat_median (gsl_rstat_workspace * W) This function returns an estimate of the median of the data added to the accumulator.  File: gsl-ref.info, Node: Running Statistics Quantiles, Next: Running Statistics Example programs, Prev: Running Statistics Current Statistics, Up: Running Statistics 22.4 Quantiles ============== The functions in this section estimate quantiles dynamically without storing the entire dataset, using the algorithm of Jain and Chlamtec, 1985. Only five points (markers) are stored which represent the minimum and maximum of the data, as well as current estimates of the p/2-, p-, and (1+p)/2-quantiles. Each time a new data point is added, the marker positions and heights are updated. -- Function: gsl_rstat_quantile_workspace * gsl_rstat_quantile_alloc (const double P) This function allocates a workspace for the dynamic estimation of P-quantiles, where P is between 0 and 1. The median corresponds to p = 0.5. The size of the workspace is O(1). -- Function: void gsl_rstat_quantile_free (gsl_rstat_quantile_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_rstat_quantile_reset (gsl_rstat_quantile_workspace * W) This function resets the workspace W to its initial state, so it can begin working on a new set of data. -- Function: int gsl_rstat_quantile_add (const double X, gsl_rstat_quantile_workspace * W) This function updates the estimate of the p-quantile with the new data point X. -- Function: double gsl_rstat_quantile_get (gsl_rstat_quantile_workspace * W) This function returns the current estimate of the p-quantile.  File: gsl-ref.info, Node: Running Statistics Example programs, Next: Running Statistics References and Further Reading, Prev: Running Statistics Quantiles, Up: Running Statistics 22.5 Examples ============= Here is a basic example of how to use the statistical functions: #include #include int main(void) { double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6}; double mean, variance, largest, smallest, sd, rms, sd_mean, median, skew, kurtosis; gsl_rstat_workspace *rstat_p = gsl_rstat_alloc(); size_t i, n; /* add data to rstat accumulator */ for (i = 0; i < 5; ++i) gsl_rstat_add(data[i], rstat_p); mean = gsl_rstat_mean(rstat_p); variance = gsl_rstat_variance(rstat_p); largest = gsl_rstat_max(rstat_p); smallest = gsl_rstat_min(rstat_p); median = gsl_rstat_median(rstat_p); sd = gsl_rstat_sd(rstat_p); sd_mean = gsl_rstat_sd_mean(rstat_p); skew = gsl_rstat_skew(rstat_p); rms = gsl_rstat_rms(rstat_p); kurtosis = gsl_rstat_kurtosis(rstat_p); n = gsl_rstat_n(rstat_p); 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); printf( "The median is %g\n", median); printf( "The standard deviation is %g\n", sd); printf( "The root mean square is %g\n", rms); printf( "The standard devation of the mean is %g\n", sd_mean); printf( "The skew is %g\n", skew); printf( "The kurtosis %g\n", kurtosis); printf( "There are %zu items in the accumulator\n", n); gsl_rstat_reset(rstat_p); n = gsl_rstat_n(rstat_p); printf( "There are %zu items in the accumulator\n", n); gsl_rstat_free(rstat_p); 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 5.373 The largest value is 18.3 The smallest value is 12.6 The median is 16.5 The standard deviation is 2.31797 The root mean square is 16.6694 The standard devation of the mean is 1.03663 The skew is -0.829058 The kurtosis -1.2217 There are 5 items in the accumulator There are 0 items in the accumulator This next program estimates the lower quartile, median and upper quartile from 10,000 samples of a random Rayleigh distribution, using the P^2 algorithm of Jain and Chlamtec. For comparison, the exact values are also computed from the sorted dataset. #include #include #include #include #include #include #include int main(void) { const size_t N = 10000; double *data = malloc(N * sizeof(double)); gsl_rstat_quantile_workspace *work_25 = gsl_rstat_quantile_alloc(0.25); gsl_rstat_quantile_workspace *work_50 = gsl_rstat_quantile_alloc(0.5); gsl_rstat_quantile_workspace *work_75 = gsl_rstat_quantile_alloc(0.75); gsl_rng *r = gsl_rng_alloc(gsl_rng_default); double exact_p25, exact_p50, exact_p75; double val_p25, val_p50, val_p75; size_t i; /* add data to quantile accumulators; also store data for exact * comparisons */ for (i = 0; i < N; ++i) { data[i] = gsl_ran_rayleigh(r, 1.0); gsl_rstat_quantile_add(data[i], work_25); gsl_rstat_quantile_add(data[i], work_50); gsl_rstat_quantile_add(data[i], work_75); } /* exact values */ gsl_sort(data, 1, N); exact_p25 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.25); exact_p50 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.5); exact_p75 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.75); /* estimated values */ val_p25 = gsl_rstat_quantile_get(work_25); val_p50 = gsl_rstat_quantile_get(work_50); val_p75 = gsl_rstat_quantile_get(work_75); printf ("The dataset is %g, %g, %g, %g, %g, ...\n", data[0], data[1], data[2], data[3], data[4]); printf ("0.25 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p25, val_p25, (val_p25 - exact_p25) / exact_p25); printf ("0.50 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p50, val_p50, (val_p50 - exact_p50) / exact_p50); printf ("0.75 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p75, val_p75, (val_p75 - exact_p75) / exact_p75); gsl_rstat_quantile_free(work_25); gsl_rstat_quantile_free(work_50); gsl_rstat_quantile_free(work_75); gsl_rng_free(r); free(data); return 0; } The program should produce the following output, The dataset is 0.00645272, 0.0074002, 0.0120706, 0.0207256, 0.0227282, ... 0.25 quartile: exact = 0.75766, estimated = 0.75580, error = -2.450209e-03 0.50 quartile: exact = 1.17508, estimated = 1.17438, error = -5.995912e-04 0.75 quartile: exact = 1.65347, estimated = 1.65696, error = 2.110571e-03  File: gsl-ref.info, Node: Running Statistics References and Further Reading, Prev: Running Statistics Example programs, Up: Running Statistics 22.6 References and Further Reading =================================== The algorithm used to dynamically estimate p-quantiles is described in the paper, R. Jain and I. Chlamtac. 'The P^2 algorithm for dynamic calculation of quantiles and histograms without storing observations', Communications of the ACM, Volume 28 (October), Number 10, 1985, p. 1076-1085.  File: gsl-ref.info, Node: Histograms, Next: N-tuples, Prev: Running Statistics, Up: Top 23 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 23.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 23.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 23.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 23.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 23.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 23.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 23.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 23.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 23.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 23.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 23.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 #include #include 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 23.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 23.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 23.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 23.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 23.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 23.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 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 23.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 23.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 23.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_histogram2d_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 23.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 23.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 #include #include 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 24 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 24.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 24.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 24.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 24.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 24.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 24.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 24.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 24.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 #include #include 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 #include #include 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) { (void)(params); /* avoid unused parameter warning */ 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 24.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 25 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 25.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 = ¶ms; 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 25.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 = (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^2 / N^2) \sum_i^N (f(x_i) - )^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, const double XL[], const 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 25.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, const double XL[], const 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 which can be changed using the following two functions.(1) -- Function: void gsl_monte_miser_params_get (const gsl_monte_miser_state * S, gsl_monte_miser_params * PARAMS) This function copies the parameters of the integrator state into the user-supplied PARAMS structure. -- Function: void gsl_monte_miser_params_set (gsl_monte_miser_state * S, const gsl_monte_miser_params * PARAMS) This function sets the integrator parameters based on values provided in the PARAMS structure. Typically the values of the parameters are first read using 'gsl_monte_miser_params_get', the necessary changes are made to the fields of the PARAMS structure, and the values are copied back into the integrator state using 'gsl_monte_miser_params_set'. The functions use the 'gsl_monte_miser_params' structure which contains the following fields: -- 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. ---------- Footnotes ---------- (1) The previous method of accessing these fields directly through the 'gsl_monte_miser_state' struct is now deprecated.  File: gsl-ref.info, Node: VEGAS, Next: Monte Carlo Examples, Prev: MISER, Up: Monte Carlo Integration 25.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 convergence of the algorithm can be tested using the overall chi-squared value of the results, which is available from the following function: -- Function: double gsl_monte_vegas_chisq (const gsl_monte_vegas_state * S) This function returns the chi-squared per degree of freedom for the weighted estimate of the integral. The returned value should be close to 1. A value 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. -- Function: void gsl_monte_vegas_runval (const gsl_monte_vegas_state * S, double * RESULT, double * SIGMA) This function returns the raw (unaveraged) values of the integral RESULT and its error SIGMA from the most recent iteration of the algorithm. The VEGAS algorithm is highly configurable. Several parameters can be changed using the following two functions. -- Function: void gsl_monte_vegas_params_get (const gsl_monte_vegas_state * S, gsl_monte_vegas_params * PARAMS) This function copies the parameters of the integrator state into the user-supplied PARAMS structure. -- Function: void gsl_monte_vegas_params_set (gsl_monte_vegas_state * S, const gsl_monte_vegas_params * PARAMS) This function sets the integrator parameters based on values provided in the PARAMS structure. Typically the values of the parameters are first read using 'gsl_monte_vegas_params_get', the necessary changes are made to the fields of the PARAMS structure, and the values are copied back into the integrator state using 'gsl_monte_vegas_params_set'. The functions use the 'gsl_monte_vegas_params' structure which contains the following fields: -- 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. The above fields and the CHISQ value can also be accessed directly in the 'gsl_monte_vegas_state' but such use is deprecated.  File: gsl-ref.info, Node: Monte Carlo Examples, Next: Monte Carlo Integration References and Further Reading, Prev: VEGAS, Up: Monte Carlo Integration 25.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 #include #include #include #include #include /* 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) { (void)(dim); /* avoid unused parameter warnings */ (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 = %.2g 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, gsl_monte_vegas_chisq (s)); } while (fabs (gsl_monte_vegas_chisq (s) - 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 1%. The estimated error 'sigma' is roughly consistent with the actual error-the computed result differs from the true result by about 1.4 standard deviations, plain ================== result = 1.412209 sigma = 0.013436 exact = 1.393204 error = 0.019005 = 1.4 sigma The MISER algorithm reduces the error by a factor of four, and also correctly estimates the error, miser ================== result = 1.391322 sigma = 0.003461 exact = 1.393204 error = -0.001882 = 0.54 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.392673 sigma = 0.003410 exact = 1.393204 error = -0.000531 = 0.16 sigma converging... result = 1.393281 sigma = 0.000362 chisq/dof = 1.5 vegas final ================== result = 1.393281 sigma = 0.000362 exact = 1.393204 error = 0.000077 = 0.21 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 25.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 26 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 26.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 26.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: #-iter #-evals temperature position energy best_energy 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 26.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 26.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 #include #include #include /* 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(void) { 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, $5}' | 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 26.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: -103.2 34.41 Clovis ###final_city_coord: -96.77 32.79 Dallas ###final_city_coord: -106.76 32.34 Las Cruces ###final_city_coord: -112.07 33.54 Phoenix ###final_city_coord: -108.74 35.52 Gallup ###final_city_coord: -108.58 37.35 Cortez ###final_city_coord: -107.87 37.29 Durango ###final_city_coord: -107.84 35.15 Grants ###final_city_coord: -106.62 35.12 Albuquerque ###final_city_coord: -106.28 35.89 Los Alamos ###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 26.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 27 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. A driver object can be used as a high level wrapper for easy use of low level functions. These functions are declared in the header file 'gsl_odeiv2.h'. This is a new interface in version 1.15 and uses the prefix 'gsl_odeiv2' for all functions. It is recommended over the previous 'gsl_odeiv' implementation defined in 'gsl_odeiv.h' The old interface has been retained under the original name for backwards compatibility. * Menu: * Defining the ODE System:: * Stepping Functions:: * Adaptive Step-size Control:: * Evolution:: * Driver:: * ODE Example programs:: * ODE References and Further Reading::  File: gsl-ref.info, Node: Defining the ODE System, Next: Stepping Functions, Up: Ordinary Differential Equations 27.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_odeiv2_system' datatype. -- Data Type: gsl_odeiv2_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. A special return value 'GSL_EBADFUNC' causes 'gsl_odeiv2' routines to immediately stop and return. If 'function' is modified (for example contents of PARAMS), the user must call an appropriate reset function ('gsl_odeiv2_driver_reset', 'gsl_odeiv2_evolve_reset' or 'gsl_odeiv2_step_reset') before continuing. Use return values distinct from standard GSL error codes to distinguish your function as the source of the error. 'int (* jacobian) (double t, const double y[], double * dfdy, double dfdt[], void * params);' This function should store the vector of derivative elements 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. Not all of the stepper algorithms of 'gsl_odeiv2' make use of the Jacobian matrix, so it may not be necessary to provide this function (the 'jacobian' element of the struct can be replaced by a null pointer for those algorithms). The function should return 'GSL_SUCCESS' if the calculation was completed successfully. Any other return value indicates an error. A special return value 'GSL_EBADFUNC' causes 'gsl_odeiv2' routines to immediately stop and return. If 'jacobian' is modified (for example contents of PARAMS), the user must call an appropriate reset function ('gsl_odeiv2_driver_reset', 'gsl_odeiv2_evolve_reset' or 'gsl_odeiv2_step_reset') before continuing. Use return values distinct from standard GSL error codes to distinguish your function as the source of the error. '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 27.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_odeiv2_step * gsl_odeiv2_step_alloc (const gsl_odeiv2_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. Please note that if you use a stepper method that requires access to a driver object, it is advisable to use a driver allocation method, which automatically allocates a stepper, too. -- Function: int gsl_odeiv2_step_reset (gsl_odeiv2_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_odeiv2_step_free (gsl_odeiv2_step * S) This function frees all the memory associated with the stepping function S. -- Function: const char * gsl_odeiv2_step_name (const gsl_odeiv2_step * S) This function returns a pointer to the name of the stepping function. For example, printf ("step method is '%s'\n", gsl_odeiv2_step_name (s)); would print something like 'step method is 'rkf45''. -- Function: unsigned int gsl_odeiv2_step_order (const gsl_odeiv2_step * S) This function returns the order of the stepping function on the previous step. The order can vary if the stepping function itself is adaptive. -- Function: int gsl_odeiv2_step_set_driver (gsl_odeiv2_step * S, const gsl_odeiv2_driver * D) This function sets a pointer of the driver object D for stepper S, to allow the stepper to access control (and evolve) object through the driver object. This is a requirement for some steppers, to get the desired error level for internal iteration of stepper. Allocation of a driver object calls this function automatically. -- Function: int gsl_odeiv2_step_apply (gsl_odeiv2_step * S, double T, double H, double Y[], double YERR[], const double DYDT_IN[], double DYDT_OUT[], const gsl_odeiv2_system * SYS) This function applies the stepping function S to the system of equations defined by SYS, 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. The stepping function returns 'GSL_FAILURE' if it is unable to compute the requested step. Also, if the user-supplied functions defined in the system SYS return a status other than 'GSL_SUCCESS' the step will be aborted. In that 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. Failure may be due to a singularity in the system or too large step-size H. In that case the step should be attempted again with a smaller step-size, e.g. H/2. If the driver object is not appropriately set via 'gsl_odeiv2_step_set_driver' for those steppers that need it, the stepping function returns 'GSL_EFAULT'. If the user-supplied functions defined in the system SYS returns 'GSL_EBADFUNC', the function returns immediately with the same return code. In this case the user must call 'gsl_odeiv2_step_reset' before calling this function again. The following algorithms are available, -- Step Type: gsl_odeiv2_step_rk2 Explicit embedded Runge-Kutta (2, 3) method. -- Step Type: gsl_odeiv2_step_rk4 Explicit 4th order (classical) Runge-Kutta. Error estimation is carried out by the step doubling method. For more efficient estimate of the error, use the embedded methods described below. -- Step Type: gsl_odeiv2_step_rkf45 Explicit embedded Runge-Kutta-Fehlberg (4, 5) method. This method is a good general-purpose integrator. -- Step Type: gsl_odeiv2_step_rkck Explicit embedded Runge-Kutta Cash-Karp (4, 5) method. -- Step Type: gsl_odeiv2_step_rk8pd Explicit embedded Runge-Kutta Prince-Dormand (8, 9) method. -- Step Type: gsl_odeiv2_step_rk1imp Implicit Gaussian first order Runge-Kutta. Also known as implicit Euler or backward Euler method. Error estimation is carried out by the step doubling method. This algorithm requires the Jacobian and access to the driver object via 'gsl_odeiv2_step_set_driver'. -- Step Type: gsl_odeiv2_step_rk2imp Implicit Gaussian second order Runge-Kutta. Also known as implicit mid-point rule. Error estimation is carried out by the step doubling method. This stepper requires the Jacobian and access to the driver object via 'gsl_odeiv2_step_set_driver'. -- Step Type: gsl_odeiv2_step_rk4imp Implicit Gaussian 4th order Runge-Kutta. Error estimation is carried out by the step doubling method. This algorithm requires the Jacobian and access to the driver object via 'gsl_odeiv2_step_set_driver'. -- Step Type: gsl_odeiv2_step_bsimp Implicit Bulirsch-Stoer method of Bader and Deuflhard. The method is generally suitable for stiff problems. This stepper requires the Jacobian. -- Step Type: gsl_odeiv2_step_msadams A variable-coefficient linear multistep Adams method in Nordsieck form. This stepper uses explicit Adams-Bashforth (predictor) and implicit Adams-Moulton (corrector) methods in P(EC)^m functional iteration mode. Method order varies dynamically between 1 and 12. This stepper requires the access to the driver object via 'gsl_odeiv2_step_set_driver'. -- Step Type: gsl_odeiv2_step_msbdf A variable-coefficient linear multistep backward differentiation formula (BDF) method in Nordsieck form. This stepper uses the explicit BDF formula as predictor and implicit BDF formula as corrector. A modified Newton iteration method is used to solve the system of non-linear equations. Method order varies dynamically between 1 and 5. The method is generally suitable for stiff problems. This stepper requires the Jacobian and the access to the driver object via 'gsl_odeiv2_step_set_driver'.  File: gsl-ref.info, Node: Adaptive Step-size Control, Next: Evolution, Prev: Stepping Functions, Up: Ordinary Differential Equations 27.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_odeiv2_control * gsl_odeiv2_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\prime_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_odeiv2_control * gsl_odeiv2_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_odeiv2_control * gsl_odeiv2_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_odeiv2_control * gsl_odeiv2_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_odeiv2_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\prime_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_odeiv2_control * gsl_odeiv2_control_alloc (const gsl_odeiv2_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_odeiv2_control_init (gsl_odeiv2_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_odeiv2_control_free (gsl_odeiv2_control * C) This function frees all the memory associated with the control function C. -- Function: int gsl_odeiv2_control_hadjust (gsl_odeiv2_control * C, gsl_odeiv2_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_odeiv2_control_name (const gsl_odeiv2_control * C) This function returns a pointer to the name of the control function. For example, printf ("control method is '%s'\n", gsl_odeiv2_control_name (c)); would print something like 'control method is 'standard'' -- Function: int gsl_odeiv2_control_errlevel (gsl_odeiv2_control * C, const double Y, const double DYDT, const double H, const size_t IND, double * ERRLEV) This function calculates the desired error level of the IND-th component to ERRLEV. It requires the value (Y) and value of the derivative (DYDT) of the component, and the current step size H. -- Function: int gsl_odeiv2_control_set_driver (gsl_odeiv2_control * C, const gsl_odeiv2_driver * D) This function sets a pointer of the driver object D for control object C.  File: gsl-ref.info, Node: Evolution, Next: Driver, Prev: Adaptive Step-size Control, Up: Ordinary Differential Equations 27.4 Evolution ============== The evolution function combines the results of a stepping function and control function to reliably advance the solution forward one step using an acceptable step-size. -- Function: gsl_odeiv2_evolve * gsl_odeiv2_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_odeiv2_evolve_apply (gsl_odeiv2_evolve * E, gsl_odeiv2_control * CON, gsl_odeiv2_step * STEP, const gsl_odeiv2_system * SYS, double * T, double T1, double * H, double Y[]) This function advances the system (E, SYS) 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. The control function CON is applied to check whether the local error estimated by the stepping function STEP using step-size H exceeds the required error tolerance. If the error is too high, the step is retried by calling STEP with a decreased step-size. This process is continued until an acceptable step-size is found. An estimate of the local error for the step can be obtained from the components of the array 'E->yerr[]'. If the user-supplied functions defined in the system SYS returns 'GSL_EBADFUNC', the function returns immediately with the same return code. In this case the user must call 'gsl_odeiv2_step_reset' and 'gsl_odeiv2_evolve_reset' before calling this function again. Otherwise, if the user-supplied functions defined in the system SYS or the stepping function STEP return a status other than 'GSL_SUCCESS', the step is retried with a decreased step-size. If the step-size decreases below machine precision, a status of 'GSL_FAILURE' is returned if the user functions returned 'GSL_SUCCESS'. Otherwise the value returned by user function is returned. If no acceptable step can be made, T and Y will be restored to their pre-step values and H contains the final attempted step-size. If the step is successful the function returns a suggested step-size for the next step in H. 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. -- Function: int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve * E, gsl_odeiv2_control * CON, gsl_odeiv2_step * STEP, const gsl_odeiv2_system * SYS, double * T, const double H, double Y[]) This function advances the ODE-system (E, SYS, CON) from time T and position Y using the stepping function STEP by a specified step size H. If the local error estimated by the stepping function exceeds the desired error level, the step is not taken and the function returns 'GSL_FAILURE'. Otherwise the value returned by user function is returned. -- Function: int gsl_odeiv2_evolve_reset (gsl_odeiv2_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_odeiv2_evolve_free (gsl_odeiv2_evolve * E) This function frees all the memory associated with the evolution function E. -- Function: int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve * E, const gsl_odeiv2_driver * D) This function sets a pointer of the driver object D for evolve object E. If a system has discontinuous changes in the derivatives at known points, it is advisable to evolve the system between each discontinuity in sequence. For example, if a step-change in an external driving force occurs at times t_a, t_b and t_c then evolution should be carried out over the ranges (t_0,t_a), (t_a,t_b), (t_b,t_c), and (t_c,t_1) separately and not directly over the range (t_0,t_1).  File: gsl-ref.info, Node: Driver, Next: ODE Example programs, Prev: Evolution, Up: Ordinary Differential Equations 27.5 Driver =========== The driver object is a high level wrapper that combines the evolution, control and stepper objects for easy use. -- Function: gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system * SYS, const gsl_odeiv2_step_type * T, const double HSTART, const double EPSABS, const double EPSREL) -- Function: gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * SYS, const gsl_odeiv2_step_type * T, const double HSTART, const double EPSABS, const double EPSREL) -- Function: gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_standard_new (const gsl_odeiv2_system * SYS, const gsl_odeiv2_step_type * T, const double HSTART, const double EPSABS, const double EPSREL, const double A_Y, const double A_DYDT) -- Function: gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system * SYS, const gsl_odeiv2_step_type * T, const double HSTART, const double EPSABS, const double EPSREL, const double A_Y, const double A_DYDT, const double SCALE_ABS[]) These functions return a pointer to a newly allocated instance of a driver object. The functions automatically allocate and initialise the evolve, control and stepper objects for ODE system SYS using stepper type T. The initial step size is given in HSTART. The rest of the arguments follow the syntax and semantics of the control functions with same name ('gsl_odeiv2_control_*_new'). -- Function: int gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver * D, const double HMIN) The function sets a minimum for allowed step size HMIN for driver D. Default value is 0. -- Function: int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * D, const double HMAX) The function sets a maximum for allowed step size HMAX for driver D. Default value is 'GSL_DBL_MAX'. -- Function: int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * D, const unsigned long int NMAX) The function sets a maximum for allowed number of steps NMAX for driver D. Default value of 0 sets no limit for steps. -- Function: int gsl_odeiv2_driver_apply (gsl_odeiv2_driver * D, double * T, const double T1, double Y[]) This function evolves the driver system D from T to T1. Initially vector Y should contain the values of dependent variables at point T. If the function is unable to complete the calculation, an error code from 'gsl_odeiv2_evolve_apply' is returned, and T and Y contain the values from last successful step. If maximum number of steps is reached, a value of 'GSL_EMAXITER' is returned. If the step size drops below minimum value, the function returns with 'GSL_ENOPROG'. If the user-supplied functions defined in the system SYS returns 'GSL_EBADFUNC', the function returns immediately with the same return code. In this case the user must call 'gsl_odeiv2_driver_reset' before calling this function again. -- Function: int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * D, double * T, const double H, const unsigned long int N, double Y[]) This function evolves the driver system D from T with N steps of size H. If the function is unable to complete the calculation, an error code from 'gsl_odeiv2_evolve_apply_fixed_step' is returned, and T and Y contain the values from last successful step. -- Function: int gsl_odeiv2_driver_reset (gsl_odeiv2_driver * D) This function resets the evolution and stepper objects. -- Function: int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * D, const double HSTART) The routine resets the evolution and stepper objects and sets new initial step size to HSTART. This function can be used e.g. to change the direction of integration. -- Function: int gsl_odeiv2_driver_free (gsl_odeiv2_driver * D) This function frees the driver object, and the related evolution, stepper and control objects.  File: gsl-ref.info, Node: ODE Example programs, Next: ODE References and Further Reading, Prev: Driver, Up: Ordinary Differential Equations 27.6 Examples ============= The following program solves the second-order nonlinear Van der Pol oscillator equation, u''(t) + \mu u'(t) (u(t)^2 - 1) + u(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, v = u'(t), u' = v v' = -u + \mu v (1-u^2) The program begins by defining functions for these derivatives and their Jacobian. The main function uses driver level functions to solve the problem. The program evolves the solution from (u, v) = (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 (u, v). The loop in the example prints the solution at the points t_i = 1, 2, \dots, 100. #include #include #include #include int func (double t, const double y[], double f[], void *params) { (void)(t); /* avoid unused parameter warning */ 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) { (void)(t); /* avoid unused parameter warning */ 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) { double mu = 10; gsl_odeiv2_system sys = {func, jac, 2, &mu}; gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd, 1e-6, 1e-6, 0.0); int i; double t = 0.0, t1 = 100.0; double y[2] = { 1.0, 0.0 }; for (i = 1; i <= 100; i++) { double ti = i * t1 / 100.0; int status = gsl_odeiv2_driver_apply (d, &t, ti, y); if (status != GSL_SUCCESS) { printf ("error, return value=%d\n", status); break; } printf ("%.5e %.5e %.5e\n", t, y[0], y[1]); } gsl_odeiv2_driver_free (d); return 0; } The user can work with the lower level functions directly, as in the following example. In this case an intermediate result is printed after each successful step instead of equidistant time points. int main (void) { const gsl_odeiv2_step_type * T = gsl_odeiv2_step_rk8pd; gsl_odeiv2_step * s = gsl_odeiv2_step_alloc (T, 2); gsl_odeiv2_control * c = gsl_odeiv2_control_y_new (1e-6, 0.0); gsl_odeiv2_evolve * e = gsl_odeiv2_evolve_alloc (2); double mu = 10; gsl_odeiv2_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_odeiv2_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_odeiv2_evolve_free (e); gsl_odeiv2_control_free (c); gsl_odeiv2_step_free (s); return 0; } For functions with multiple parameters, the appropriate information can be passed in through the PARAMS argument in 'gsl_odeiv2_system' definition (MU in this example) by using a pointer to a struct. It is also possible to work with a non-adaptive integrator, using only the stepping function itself, 'gsl_odeiv2_driver_apply_fixed_step' or 'gsl_odeiv2_evolve_apply_fixed_step'. The following program uses the driver level function, with fourth-order Runge-Kutta stepping function with a fixed stepsize of 0.001. int main (void) { double mu = 10; gsl_odeiv2_system sys = { func, jac, 2, &mu }; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk4, 1e-3, 1e-8, 1e-8); double t = 0.0; double y[2] = { 1.0, 0.0 }; int i, s; for (i = 0; i < 100; i++) { s = gsl_odeiv2_driver_apply_fixed_step (d, &t, 1e-3, 1000, y); if (s != GSL_SUCCESS) { printf ("error: driver returned %d\n", s); break; } printf ("%.5e %.5e %.5e\n", t, y[0], y[1]); } gsl_odeiv2_driver_free (d); return s; }  File: gsl-ref.info, Node: ODE References and Further Reading, Prev: ODE Example programs, Up: Ordinary Differential Equations 27.7 References and Further Reading =================================== Ascher, U.M., Petzold, L.R., 'Computer Methods for Ordinary Differential and Differential-Algebraic Equations', SIAM, Philadelphia, 1998. Hairer, E., Norsett, S. P., Wanner, G., 'Solving Ordinary Differential Equations I: Nonstiff Problems', Springer, Berlin, 1993. Hairer, E., Wanner, G., 'Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems', Springer, Berlin, 1996. 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. The Adams and BDF multistep methods 'msadams' and 'msbdf' are based on the following articles, G. D. Byrne and A. C. Hindmarsh, "A Polyalgorithm for the Numerical Solution of Ordinary Differential Equations.", ACM Trans. Math. Software, 1, 71-96, 1975. P. N. Brown, G. D. Byrne and A. C. Hindmarsh, "VODE: A Variable-coefficient ODE Solver.", SIAM J. Sci. Stat. Comput. 10, 1038-1051, 1989. A. C. Hindmarsh, P. N. Brown, K. E. Grant, S. L. Lee, R. Serban, D. E. Shumaker and C. S. Woodward, "SUNDIALS: Suite of Nonlinear and Differential/Algebraic Equation Solvers.", ACM Trans. Math. Software 31, 363-396, 2005.  File: gsl-ref.info, Node: Interpolation, Next: Numerical Differentiation, Prev: Ordinary Differential Equations, Up: Top 28 Interpolation **************** This chapter describes functions for performing interpolation. The library provides a variety of interpolation methods, including Cubic, Akima, and Steffen 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. Routines are provided for interpolating both one and two dimensional datasets. These interpolation methods produce curves that pass through each datapoint. To interpolate noisy data with a smoothing curve see *note Basis Splines::. The functions described in this section are declared in the header files 'gsl_interp.h' and 'gsl_spline.h'. * Menu: * 1D Introduction to Interpolation:: * 1D Interpolation Functions:: * 1D Interpolation Types:: * 1D Index Look-up and Acceleration:: * 1D Evaluation of Interpolating Functions:: * 1D Higher-level Interface:: * 1D Interpolation Example programs:: * 1D Interpolation References and Further Reading:: * 2D Introduction to Interpolation:: * 2D Interpolation Functions:: * 2D Interpolation Grids:: * 2D Interpolation Types:: * 2D Evaluation of Interpolating Functions:: * 2D Higher-level Interface:: * 2D Interpolation Example programs::  File: gsl-ref.info, Node: 1D Introduction to Interpolation, Next: 1D Interpolation Functions, Up: Interpolation 28.1 Introduction to 1D Interpolation ===================================== 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: 1D Interpolation Functions, Next: 1D Interpolation Types, Prev: 1D Introduction to Interpolation, Up: Interpolation 28.2 1D 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, with increasing x values; 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: 1D Interpolation Types, Next: 1D Index Look-up and Acceleration, Prev: 1D Interpolation Functions, Up: Interpolation 28.3 1D Interpolation Types =========================== The interpolation library provides the following 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. -- Interpolation Type: gsl_interp_steffen Steffen's method guarantees the monotonicity of the interpolating function between the given data points. Therefore, minima and maxima can only occur exactly at the data points, and there can never be spurious oscillations between data points. The interpolated function is piecewise cubic in each interval. The resulting curve and its first derivative are guaranteed to be continuous, but the second derivative may be discontinuous. 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) -- Function: unsigned int gsl_interp_type_min_size (const gsl_interp_type * T) These functions return the minimum number of points required by the interpolation object INTERP or interpolation type T. For example, Akima spline interpolation requires a minimum of 5 points.  File: gsl-ref.info, Node: 1D Index Look-up and Acceleration, Next: 1D Evaluation of Interpolating Functions, Prev: 1D Interpolation Types, Up: Interpolation 28.4 1D 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]. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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]'. An inline version of this function is used when 'HAVE_INLINE' is defined. -- Function: int gsl_interp_accel_reset (gsl_interp_accel * ACC); This function reinitializes the accelerator object ACC. It should be used when the cached information is no longer applicable--for example, when switching to a new dataset. -- Function: void gsl_interp_accel_free (gsl_interp_accel* ACC) This function frees the accelerator object ACC.  File: gsl-ref.info, Node: 1D Evaluation of Interpolating Functions, Next: 1D Higher-level Interface, Prev: 1D Index Look-up and Acceleration, Up: Interpolation 28.5 1D 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. When X is outside the range of XA, the error code 'GSL_EDOM' is returned with a value of 'GSL_NAN' for Y. -- 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: 1D Higher-level Interface, Next: 1D Interpolation Example programs, Prev: 1D Evaluation of Interpolating Functions, Up: Interpolation 28.6 1D 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: 1D Interpolation Example programs, Next: 1D Interpolation References and Further Reading, Prev: 1D Higher-level Interface, Up: Interpolation 28.7 Examples of 1D Interpolation ================================= 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 #include #include #include #include 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 be 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 #include #include #include #include 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: y[0] == y[3] 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. The next program illustrates the difference between the cubic spline, Akima, and Steffen interpolation types on a difficult dataset. #include #include #include #include #include int main(void) { size_t i; const size_t N = 9; /* this dataset is taken from * J. M. Hyman, Accurate Monotonicity preserving cubic interpolation, * SIAM J. Sci. Stat. Comput. 4, 4, 1983. */ const double x[] = { 7.99, 8.09, 8.19, 8.7, 9.2, 10.0, 12.0, 15.0, 20.0 }; const double y[] = { 0.0, 2.76429e-5, 4.37498e-2, 0.169183, 0.469428, 0.943740, 0.998636, 0.999919, 0.999994 }; gsl_interp_accel *acc = gsl_interp_accel_alloc(); gsl_spline *spline_cubic = gsl_spline_alloc(gsl_interp_cspline, N); gsl_spline *spline_akima = gsl_spline_alloc(gsl_interp_akima, N); gsl_spline *spline_steffen = gsl_spline_alloc(gsl_interp_steffen, N); gsl_spline_init(spline_cubic, x, y, N); gsl_spline_init(spline_akima, x, y, N); gsl_spline_init(spline_steffen, x, y, N); for (i = 0; i < N; ++i) printf("%g %g\n", x[i], y[i]); printf("\n\n"); for (i = 0; i <= 100; ++i) { double xi = (1 - i / 100.0) * x[0] + (i / 100.0) * x[N-1]; double yi_cubic = gsl_spline_eval(spline_cubic, xi, acc); double yi_akima = gsl_spline_eval(spline_akima, xi, acc); double yi_steffen = gsl_spline_eval(spline_steffen, xi, acc); printf("%g %g %g %g\n", xi, yi_cubic, yi_akima, yi_steffen); } gsl_spline_free(spline_cubic); gsl_spline_free(spline_akima); gsl_spline_free(spline_steffen); gsl_interp_accel_free(acc); return 0; } The cubic method exhibits a local maxima between the 6th and 7th data points and continues oscillating for the rest of the data. Akima also shows a local maxima but recovers and follows the data well after the 7th grid point. Steffen preserves monotonicity in all intervals and does not exhibit oscillations, at the expense of having a discontinuous second derivative.  File: gsl-ref.info, Node: 1D Interpolation References and Further Reading, Next: 2D Introduction to Interpolation, Prev: 1D Interpolation Example programs, Up: Interpolation 28.8 References and Further Reading =================================== Descriptions of the interpolation algorithms and further references can be found in the following publications: 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. M. Steffen, 'A simple method for monotonic interpolation in one dimension', Astron. Astrophys. 239, 443-450, 1990.  File: gsl-ref.info, Node: 2D Introduction to Interpolation, Next: 2D Interpolation Functions, Prev: 1D Interpolation References and Further Reading, Up: Interpolation 28.9 Introduction to 2D Interpolation ===================================== Given a set of x coordinates x_1,...,x_m and a set of y coordinates y_1,...,y_n, each in increasing order, plus a set of function values z_{ij} for each grid point (x_i,y_j), the routines described in this section compute a continuous interpolation function z(x,y) such that z(x_i,y_j) = z_{ij}.  File: gsl-ref.info, Node: 2D Interpolation Functions, Next: 2D Interpolation Grids, Prev: 2D Introduction to Interpolation, Up: Interpolation 28.10 2D Interpolation Functions ================================ The interpolation function for a given dataset is stored in a 'gsl_interp2d' object. These are created by the following functions. -- Function: gsl_interp2d * gsl_interp2d_alloc (const gsl_interp2d_type * T, const size_t XSIZE, const size_t YSIZE) This function returns a pointer to a newly allocated interpolation object of type T for XSIZE grid points in the x direction and YSIZE grid points in the y direction. -- Function: int gsl_interp2d_init (gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const size_t XSIZE, const size_t YSIZE) This function initializes the interpolation object INTERP for the data (XA,YA,ZA) where XA and YA are arrays of the x and y grid points of size XSIZE and YSIZE respectively, and ZA is an array of function values of size XSIZE*YSIZE. The interpolation object ('gsl_interp2d') does not save the data arrays XA, YA, and ZA and only stores the static state computed from the data. The XA and YA data arrays are always assumed to be strictly ordered, with increasing x,y values; the behavior for other arrangements is not defined. -- Function: void gsl_interp2d_free (gsl_interp2d * INTERP) This function frees the interpolation object INTERP.  File: gsl-ref.info, Node: 2D Interpolation Grids, Next: 2D Interpolation Types, Prev: 2D Interpolation Functions, Up: Interpolation 28.11 2D Interpolation Grids ============================ The 2D interpolation routines access the function values z_{ij} with the following ordering: z_ij = za[j*xsize + i] with i = 0,...,xsize-1 and j = 0,...,ysize-1. However, for ease of use, the following functions are provided to add and retrieve elements from the function grid without requiring knowledge of the internal ordering. -- Function: int gsl_interp2d_set (const gsl_interp2d * INTERP, double ZA[], const size_t I, const size_t J, const double Z) This function sets the value z_{ij} for grid point (I,J) of the array ZA to Z. -- Function: double gsl_interp2d_get (const gsl_interp2d * INTERP, const double ZA[], const size_t I, const size_t J) This function returns the value z_{ij} for grid point (I,J) stored in the array ZA. -- Function: size_t gsl_interp2d_idx (const gsl_interp2d * INTERP, const size_t I, const size_t J) This function returns the index corresponding to the grid point (I,J). The index is given by j*xsize + i.  File: gsl-ref.info, Node: 2D Interpolation Types, Next: 2D Evaluation of Interpolating Functions, Prev: 2D Interpolation Grids, Up: Interpolation 28.12 2D Interpolation Types ============================ The interpolation library provides the following 2D interpolation types: -- Interpolation Type: gsl_interp2d_bilinear Bilinear interpolation. This interpolation method does not require any additional memory. -- Interpolation Type: gsl_interp2d_bicubic Bicubic interpolation. -- Function: const char * gsl_interp2d_name (const gsl_interp2d * INTERP) This function returns the name of the interpolation type used by INTERP. For example, printf ("interp uses '%s' interpolation.\n", gsl_interp2d_name (interp)); would print something like, interp uses 'bilinear' interpolation. -- Function: unsigned int gsl_interp2d_min_size (const gsl_interp2d * INTERP) -- Function: unsigned int gsl_interp2d_type_min_size (const gsl_interp2d_type * T) These functions return the minimum number of points required by the interpolation object INTERP or interpolation type T. For example, bicubic interpolation requires a minimum of 4 points.  File: gsl-ref.info, Node: 2D Evaluation of Interpolating Functions, Next: 2D Higher-level Interface, Prev: 2D Interpolation Types, Up: Interpolation 28.13 2D Evaluation of Interpolating Functions ============================================== -- Function: double gsl_interp2d_eval (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * Z) These functions return the interpolated value of Z for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned. -- Function: double gsl_interp2d_eval_extrap (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_extrap_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * Z) These functions return the interpolated value of Z for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. The functions perform no bounds checking, so when X is outside the range of XA or Y is outside the range of YA, extrapolation is performed. -- Function: double gsl_interp2d_eval_deriv_x (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_deriv_x_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) These functions return the interpolated value D = \partial z / \partial x for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned. -- Function: double gsl_interp2d_eval_deriv_y (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_deriv_y_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) These functions return the interpolated value D = \partial z / \partial y for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned. -- Function: double gsl_interp2d_eval_deriv_xx (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_deriv_xx_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) These functions return the interpolated value D = \partial^2 z / \partial x^2 for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned. -- Function: double gsl_interp2d_eval_deriv_yy (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_deriv_yy_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) These functions return the interpolated value D = \partial^2 z / \partial y^2 for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned. -- Function: double gsl_interp2d_eval_deriv_xy (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_interp2d_eval_deriv_xy_e (const gsl_interp2d * INTERP, const double XA[], const double YA[], const double ZA[], const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) These functions return the interpolated value D = \partial^2 z / \partial x \partial y for a given point (X,Y), using the interpolation object INTERP, data arrays XA, YA, and ZA and the accelerators XACC and YACC. When X is outside the range of XA or Y is outside the range of YA, the error code 'GSL_EDOM' is returned.  File: gsl-ref.info, Node: 2D Higher-level Interface, Next: 2D Interpolation Example programs, Prev: 2D Evaluation of Interpolating Functions, Up: Interpolation 28.14 2D Higher-level Interface =============================== The functions described in the previous sections required the user to supply pointers to the x, y, and z arrays on each call. The following functions are equivalent to the corresponding 'gsl_interp2d' functions but maintain a copy of this data in the 'gsl_spline2d' object. This removes the need to pass XA, YA, and ZA as arguments on each evaluation. These functions are defined in the header file 'gsl_spline2d.h'. -- Function: gsl_spline2d * gsl_spline2d_alloc (const gsl_interp2d_type * T, size_t XSIZE, size_t YSIZE) -- Function: int gsl_spline2d_init (gsl_spline2d * SPLINE, const double XA[], const double YA[], const double ZA[], size_t XSIZE, size_t YSIZE) -- Function: void gsl_spline2d_free (gsl_spline2d * SPLINE) -- Function: const char * gsl_spline2d_name (const gsl_spline2d * SPLINE) -- Function: unsigned int gsl_spline2d_min_size (const gsl_spline2d * SPLINE) -- Function: double gsl_spline2d_eval (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * Z) -- Function: double gsl_spline2d_eval_deriv_x (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_deriv_x_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) -- Function: double gsl_spline2d_eval_deriv_y (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_deriv_y_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) -- Function: double gsl_spline2d_eval_deriv_xx (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_deriv_xx_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) -- Function: double gsl_spline2d_eval_deriv_yy (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_deriv_yy_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) -- Function: double gsl_spline2d_eval_deriv_xy (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC) -- Function: int gsl_spline2d_eval_deriv_xy_e (const gsl_spline2d * SPLINE, const double X, const double Y, gsl_interp_accel * XACC, gsl_interp_accel * YACC, double * D) -- Function: int gsl_spline2d_set (const gsl_spline2d * SPLINE, double ZA[], const size_t I, const size_t J, const double Z) -- Function: double gsl_spline2d_get (const gsl_spline2d * SPLINE, const double ZA[], const size_t I, const size_t J) This function returns the value z_{ij} for grid point (I,J) stored in the array ZA.  File: gsl-ref.info, Node: 2D Interpolation Example programs, Prev: 2D Higher-level Interface, Up: Interpolation 28.15 2D Interpolation Example programs ======================================= The following example performs bilinear interpolation on the unit square, using z values of (0,1,0.5,1) going clockwise around the square. #include #include #include #include #include int main() { const gsl_interp2d_type *T = gsl_interp2d_bilinear; const size_t N = 100; /* number of points to interpolate */ const double xa[] = { 0.0, 1.0 }; /* define unit square */ const double ya[] = { 0.0, 1.0 }; const size_t nx = sizeof(xa) / sizeof(double); /* x grid points */ const size_t ny = sizeof(ya) / sizeof(double); /* y grid points */ double *za = malloc(nx * ny * sizeof(double)); gsl_spline2d *spline = gsl_spline2d_alloc(T, nx, ny); gsl_interp_accel *xacc = gsl_interp_accel_alloc(); gsl_interp_accel *yacc = gsl_interp_accel_alloc(); size_t i, j; /* set z grid values */ gsl_spline2d_set(spline, za, 0, 0, 0.0); gsl_spline2d_set(spline, za, 0, 1, 1.0); gsl_spline2d_set(spline, za, 1, 1, 0.5); gsl_spline2d_set(spline, za, 1, 0, 1.0); /* initialize interpolation */ gsl_spline2d_init(spline, xa, ya, za, nx, ny); /* interpolate N values in x and y and print out grid for plotting */ for (i = 0; i < N; ++i) { double xi = i / (N - 1.0); for (j = 0; j < N; ++j) { double yj = j / (N - 1.0); double zij = gsl_spline2d_eval(spline, xi, yj, xacc, yacc); printf("%f %f %f\n", xi, yj, zij); } printf("\n"); } gsl_spline2d_free(spline); gsl_interp_accel_free(xacc); gsl_interp_accel_free(yacc); free(za); return 0; } The results of the interpolation are shown in the following plot, where the corners are labeled with their fixed z values.  File: gsl-ref.info, Node: Numerical Differentiation, Next: Chebyshev Approximations, Prev: Interpolation, Up: Top 29 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 29.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 29.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 #include #include double f (double x, void * params) { (void)(params); /* avoid unused parameter warning */ 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.0000005006 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 29.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 30 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:: * Auxiliary Functions for 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 30.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: Auxiliary Functions for Chebyshev Series, Prev: Chebyshev Definitions, Up: Chebyshev Approximations 30.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: Auxiliary Functions for Chebyshev Series, Next: Chebyshev Series Evaluation, Prev: Creation and Calculation of Chebyshev Series, Up: Chebyshev Approximations 30.3 Auxiliary Functions ======================== The following functions provide information about an existing Chebyshev series. -- Function: size_t gsl_cheb_order (const gsl_cheb_series * CS) This function returns the order of Chebyshev series CS. -- Function: size_t gsl_cheb_size (const gsl_cheb_series * CS) -- Function: double * gsl_cheb_coeffs (const gsl_cheb_series * CS) These functions return the size of the Chebyshev coefficient array 'c[]' and a pointer to its location in memory for the Chebyshev series CS.  File: gsl-ref.info, Node: Chebyshev Series Evaluation, Next: Derivatives and Integrals, Prev: Auxiliary Functions for Chebyshev Series, Up: Chebyshev Approximations 30.4 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 X, 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 30.5 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 30.6 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 #include #include double f (double x, void *p) { (void)(p); /* avoid unused parameter warning */ 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 30.7 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 31 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 31.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 31.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 31.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 #include #include #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 %zu terms\n", w->sum_plain, w->terms_used); printf ("exact value = % .16f\n", zeta_2); printf ("accelerated sum = % .16f using %zu 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.6449340669228176 using 13 terms estimated error = 0.0000000000888360 actual error = 0.0000000000745912 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. gsl-doc-2.3/doc/usage.texi0000664000175000017500000004775212620026734013547 0ustar eddedd@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,@footnote{The last few digits may vary slightly depending on the compiler and platform used---this is normal.} @example @verbatiminclude examples/intro.txt @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 @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. The option @code{-lm} links with the system math library. On some systems it is not needed.@footnote{It is not needed on MacOS X.} For a tutorial introduction to the GNU C Compiler and related programs, see @url{http://www.network-theory.co.uk/gcc/intro/,@cite{An Introduction to GCC},@cite{An Introduction to GCC}} (ISBN 0954161793).@footnote{@url{http://www.network-theory.co.uk/gcc/intro/}} @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 @file{libcblas.a}, @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 If the @sc{atlas} library is installed in a non-standard directory use the @code{-L} option to add it to the search path, as described above. For more information about @sc{blas} functions 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, either modify the system dynamic linker configuration@footnote{@file{/etc/ld.so.conf} on GNU/Linux systems.} or 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 $ 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 @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 can 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 @vindex @code{HAVE_INLINE} @vindex @code{GSL_C99_INLINE} @cindex inline functions @cindex HAVE_INLINE @cindex GSL_C99_INLINE @cindex C99, inline keyword @cindex @code{extern inline} The @code{inline} keyword is not part of the original ANSI C standard (C89) so the library does not export any inline function definitions by default. Inline functions were introduced officially in the newer C99 standard but most C89 compilers have also included @code{inline} as an extension for a long time. To allow the use of inline functions, the library provides optional inline versions of performance-critical routines by conditional compilation in the exported header files. 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. By default, the actual form of the inline keyword is @code{extern inline}, which is a @code{gcc} extension that eliminates unnecessary function definitions. If the form @code{extern inline} causes problems with other compilers a stricter autoconf test can be used, see @ref{Autoconf Macros}. When compiling with @code{gcc} in C99 mode (@code{gcc -std=c99}) the header files automatically switch to C99-compatible inline function declarations instead of @code{extern inline}. With other C99 compilers, define the macro @code{GSL_C99_INLINE} to use these declarations. @node Long double @section Long double @cindex long double In general, the algorithms in the library are written for double precision only. The @code{long double} type is not supported for actual computation. One reason for this choice is that the precision of @code{long double} is platform dependent. The IEEE standard only specifies the minimum precision of extended precision numbers, while the precision of @code{double} is the same on all platforms. However, it is sometimes necessary to interact with external data in long-double format, so the vector and matrix datatypes include long-double versions. It should be noted that 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 } 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 All types #include double #include long double #include float #include long #include unsigned long #include int #include unsigned int #include short #include unsigned short #include char #include unsigned char @end example @node Compatibility with C++ @section Compatibility with C++ @cindex C++, compatibility @cindex exceptions, C++ 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. gsl-doc-2.3/doc/rand-gaussian-tail.tex0000664000175000017500000004667312616157443015765 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-gaussian-tail.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-gaussian-tail.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1078 R -31 0 V 31 1079 R -31 0 V 31 1078 R -31 0 V 31 1078 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 4149 V 19 -103 V 19 -103 V 20 -100 V 19 -99 V 20 -98 V 19 -96 V 20 -95 V 19 -93 V 19 -91 V 20 -90 V 19 -88 V 20 -86 V 3052 3553 L 20 -84 V 19 -81 V 19 -81 V 20 -78 V 19 -77 V 20 -75 V 19 -74 V 20 -72 V 19 -71 V 19 -69 V 20 -67 V 19 -66 V 20 -65 V 19 -63 V 20 -61 V 19 -60 V 19 -58 V 20 -57 V 19 -56 V 20 -54 V 19 -53 V 20 -51 V 19 -50 V 19 -49 V 20 -47 V 19 -46 V 20 -45 V 19 -43 V 20 -42 V 19 -41 V 19 -40 V 20 -39 V 19 -37 V 20 -36 V 19 -36 V 20 -34 V 19 -33 V 19 -32 V 20 -31 V 19 -30 V 20 -29 V 19 -28 V 20 -27 V 19 -26 V 19 -26 V 20 -24 V 19 -24 V 20 -23 V 19 -22 V 19 -21 V 20 -21 V 19 -19 V 20 -19 V 19 -19 V 20 -17 V 19 -17 V 19 -17 V 20 -16 V 19 -15 V 20 -14 V 19 -14 V 20 -14 V 19 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 5092 661 L 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 -1 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 -1 V 19 0 V 20 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$\sigma=1,a=1.5$}}% \put(3955,5244){\cjust{\strut{}Gaussian Tail Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 2}}% \put(900,3866){\rjust{\strut{} 1.5}}% \put(900,2788){\rjust{\strut{} 1}}% \put(900,1709){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-erlang.tex0000664000175000017500000006044012616157443014460 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-erlang.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-erlang.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 4944 M 19 -72 V 20 -70 V 19 -69 V 20 -68 V 19 -67 V 20 -66 V 19 -64 V 19 -64 V 20 -63 V 19 -61 V 20 -61 V 19 -59 V 20 -59 V 19 -57 V 19 -57 V 20 -55 V 19 -55 V 20 -54 V 19 -53 V 20 -52 V 19 -51 V 19 -51 V 20 -49 V 19 -49 V 20 -48 V 19 -47 V 20 -46 V 19 -46 V 19 -44 V 20 -44 V 19 -44 V 20 -42 V 19 -42 V 20 -41 V 19 -41 V 19 -40 V 20 -39 V 19 -38 V 20 -38 V 19 -38 V 20 -36 V 19 -36 V 19 -36 V 20 -35 V 19 -34 V 20 -33 V 19 -34 V 20 -32 V 19 -32 V 19 -32 V 20 -31 V 19 -30 V 20 -30 V 19 -30 V 20 -29 V 19 -28 V 19 -28 V 20 -28 V 19 -27 V 20 -27 V 19 -26 V 20 -26 V 19 -25 V 19 -25 V 20 -24 V 19 -25 V 20 -23 V 19 -24 V 20 -23 V 19 -22 V 19 -22 V 20 -22 V 19 -22 V 20 -21 V 19 -20 V 20 -21 V 19 -20 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -18 V 20 -19 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -16 V 20 -16 V 19 -16 V 19 -16 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -14 V 19 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -14 V 3052 1401 L 20 -12 V 19 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -9 V 20 -8 V 19 -7 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 5092 764 L 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 71 V 20 69 V 19 66 V 20 64 V 19 62 V 20 59 V 19 58 V 19 56 V 20 53 V 19 52 V 20 50 V 19 48 V 20 46 V 19 45 V 19 43 V 20 41 V 19 40 V 20 38 V 19 36 V 20 35 V 19 34 V 19 32 V 20 31 V 19 30 V 20 28 V 19 27 V 20 26 V 19 24 V 19 24 V 20 22 V 19 21 V 20 21 V 19 19 V 20 18 V 19 17 V 19 16 V 20 15 V 19 15 V 20 13 V 19 13 V 20 12 V 19 11 V 19 10 V 20 9 V 19 9 V 20 8 V 19 8 V 20 6 V 19 6 V 19 6 V 20 5 V 19 4 V 20 4 V 19 3 V 20 2 V 19 2 V 19 2 V 20 1 V 19 1 V 20 0 V 19 -1 V 20 0 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 20 -8 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -10 V 3052 1958 L 20 -9 V 19 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -10 V 19 -9 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 5092 1094 L 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V stroke LT2 LTb LT2 6077 4381 M 543 0 V 1051 631 M 19 1 V 20 1 V 19 3 V 20 4 V 19 5 V 20 6 V 19 6 V 19 8 V 20 8 V 19 9 V 20 10 V 19 10 V 20 11 V 19 12 V 19 12 V 20 12 V 19 13 V 20 14 V 19 13 V 20 15 V 19 14 V 19 15 V 20 15 V 19 16 V 20 15 V 19 16 V 20 16 V 19 16 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 19 17 V 20 17 V 19 16 V 20 17 V 19 16 V 20 17 V 19 16 V 19 16 V 20 16 V 19 16 V 20 16 V 19 16 V 20 16 V 19 15 V 19 15 V 20 16 V 19 14 V 20 15 V 19 15 V 20 14 V 19 14 V 19 14 V 20 14 V 19 14 V 20 13 V 19 13 V 20 13 V 19 13 V 19 12 V 20 12 V 19 12 V 20 12 V 19 11 V 20 12 V 19 11 V 19 10 V 20 11 V 19 10 V 20 10 V 19 10 V 20 9 V 19 10 V 19 9 V 20 8 V 19 9 V 20 8 V 19 8 V 20 8 V 19 7 V 19 8 V 20 7 V 19 6 V 20 7 V 19 6 V 20 6 V 19 6 V 19 6 V 20 5 V 19 5 V 20 5 V 19 5 V 20 5 V 19 4 V 19 4 V 20 4 V 19 3 V 20 4 V 3052 1774 L 20 3 V 19 3 V 19 2 V 20 3 V 19 2 V 20 2 V 19 1 V 20 2 V 19 1 V 19 2 V 20 1 V 19 1 V 20 0 V 19 1 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 5092 1436 L 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4381){\rjust{\strut{}$n=3$}}% \put(5957,4581){\rjust{\strut{}$n=2$}}% \put(5957,4781){\rjust{\strut{}$n=1$}}% \put(3955,5244){\cjust{\strut{}Erlang Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/Makefile.am0000644000175000017500000000561213004361416013563 0ustar eddedd## Process this file with automake to produce Makefile.in SUBDIRS = . examples 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 rstat.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 multiset.texi complex.texi math.texi fitting.texi multifit-nlinear.texi const.texi ntuple.texi diff.texi qrng.texi cheb.texi multimin.texi gpl.texi fdl.texi autoconf.texi bspline.texi spblas.texi spmatrix.texi splinalg.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 interp2d.eps nlfit2.eps nlfit3.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 robust.eps sparse_poisson.eps interp_compare.eps regularized.eps regularized2.eps multilarge.eps noinst_DATA = $(figures) EXTRA_DIST = $(man_MANS) $(noinst_DATA) gsl-design.texi fftalgorithms.tex fftalgorithms.bib algorithm.sty algorithmic.sty calc.sty statnotes.tex # pdf disabled, use postscript and ps2pdf .PHONY: pdf pdf: gsl-doc-2.3/doc/fft-complex-radix2-t.eps0000664000175000017500000001267012616157443016133 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-binomial.tex0000664000175000017500000004730212616157443015004 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-binomial.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-binomial.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 645 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 127 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 491 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 1053 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 2994 2316 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 1263 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 590 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -590 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -1263 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 4956 2316 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -1053 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -491 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 -127 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -14 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.5,n=9$}}% \put(3955,5244){\cjust{\strut{}Binomial Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.3}}% \put(900,3506){\rjust{\strut{} 0.2}}% \put(900,2069){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/specfunc-transport.texi0000664000175000017500000000254012616157443016274 0ustar eddedd@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 gsl-doc-2.3/doc/multilarge.eps0000644000175000017500000016033412753406600014415 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: multilarge.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Fri Aug 12 11:55:12 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 554 482 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 554 50 lineto 554 482 lineto 50 482 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (multilarge.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Fri Aug 12 11:55:12 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 10080.00 8640.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 686 4768 M 63 0 V 4038 0 R -63 0 V stroke 602 4768 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 5199 M 63 0 V 4038 0 R -63 0 V stroke 602 5199 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 5631 M 63 0 V 4038 0 R -63 0 V stroke 602 5631 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 6062 M 63 0 V 4038 0 R -63 0 V stroke 602 6062 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 6494 M 63 0 V 4038 0 R -63 0 V stroke 602 6494 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 6925 M 63 0 V 4038 0 R -63 0 V stroke 602 6925 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 7356 M 63 0 V 4038 0 R -63 0 V stroke 602 7356 M [ [(Helvetica) 140.0 0.0 true true 0 ( 3)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 7788 M 63 0 V 4038 0 R -63 0 V stroke 602 7788 M [ [(Helvetica) 140.0 0.0 true true 0 ( 3.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 8219 M 63 0 V 4038 0 R -63 0 V stroke 602 8219 M [ [(Helvetica) 140.0 0.0 true true 0 ( 4)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 4768 M 0 63 V 0 3388 R 0 -63 V stroke 686 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1096 4768 M 0 63 V 0 3388 R 0 -63 V stroke 1096 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1506 4768 M 0 63 V 0 3388 R 0 -63 V stroke 1506 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1916 4768 M 0 63 V 0 3388 R 0 -63 V stroke 1916 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.3)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2326 4768 M 0 63 V 0 3388 R 0 -63 V stroke 2326 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2737 4768 M 0 63 V 0 3388 R 0 -63 V stroke 2737 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3147 4768 M 0 63 V 0 3388 R 0 -63 V stroke 3147 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3557 4768 M 0 63 V 0 3388 R 0 -63 V stroke 3557 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.7)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3967 4768 M 0 63 V 0 3388 R 0 -63 V stroke 3967 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4377 4768 M 0 63 V 0 3388 R 0 -63 V stroke 4377 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.9)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4787 4768 M 0 63 V 0 3388 R 0 -63 V stroke 4787 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 686 8219 N 0 -3451 V 4101 0 V 0 3451 V -4101 0 V Z stroke LCb setrgbcolor 112 6493 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (f\(t\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 2736 4418 M [ [(Helvetica) 140.0 0.0 true true 0 (t)] ] -46.7 MCshow LTb 2736 8429 M [ [(Helvetica) 140.0 0.0 true true 0 (Not regularized \()] [(Symbol) 140.0 0.0 true true 0 (l)] [(Helvetica) 140.0 0.0 true true 0 ( = 0\))] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.500 UP 2.000 UL LT0 0.00 0.00 0.00 C LCb setrgbcolor 1274 8086 M [ [(Helvetica) 140.0 0.0 true true 0 (Data)] ] -46.7 MRshow LT0 0.00 0.00 0.00 C 686 5642 CircleF 694 5680 CircleF 702 5637 CircleF 711 5635 CircleF 719 5660 CircleF 727 5630 CircleF 735 5607 CircleF 743 5710 CircleF 752 5655 CircleF 760 5629 CircleF 768 5554 CircleF 776 5783 CircleF 784 5846 CircleF 793 5522 CircleF 801 5628 CircleF 809 5776 CircleF 817 5667 CircleF 825 5593 CircleF 834 5659 CircleF 842 5645 CircleF 850 5558 CircleF 858 5769 CircleF 866 5743 CircleF 875 5747 CircleF 883 5720 CircleF 891 5689 CircleF 899 5840 CircleF 907 5812 CircleF 916 5878 CircleF 924 5775 CircleF 932 5865 CircleF 940 5837 CircleF 948 5845 CircleF 957 5905 CircleF 965 5881 CircleF 973 5697 CircleF 981 5945 CircleF 989 5917 CircleF 998 6187 CircleF 1006 5866 CircleF 1014 6014 CircleF 1022 5958 CircleF 1030 6219 CircleF 1039 6202 CircleF 1047 6163 CircleF 1055 6117 CircleF 1063 6477 CircleF 1072 6154 CircleF 1080 6247 CircleF 1088 6253 CircleF 1096 6352 CircleF 1104 6358 CircleF 1113 6385 CircleF 1121 6355 CircleF 1129 6577 CircleF 1137 6385 CircleF 1145 6690 CircleF 1154 6665 CircleF 1162 6952 CircleF 1170 6873 CircleF 1178 6903 CircleF 1186 6396 CircleF 1195 6835 CircleF 1203 6859 CircleF 1211 6954 CircleF 1219 7288 CircleF 1227 7045 CircleF 1236 6647 CircleF 1244 6979 CircleF 1252 6779 CircleF 1260 6910 CircleF 1268 7308 CircleF 1277 6817 CircleF 1285 7103 CircleF 1293 7050 CircleF 1301 6791 CircleF 1309 7098 CircleF 1318 7508 CircleF 1326 7341 CircleF 1334 7066 CircleF 1342 7198 CircleF 1350 6705 CircleF 1359 6716 CircleF 1367 6879 CircleF 1375 7318 CircleF 1383 7144 CircleF 1391 7427 CircleF 1400 6915 CircleF 1408 6884 CircleF 1416 6845 CircleF 1424 7180 CircleF 1432 6693 CircleF 1441 6742 CircleF 1449 6891 CircleF 1457 6566 CircleF 1465 6670 CircleF 1473 7094 CircleF 1482 6835 CircleF 1490 6647 CircleF 1498 6759 CircleF 1506 6714 CircleF 1514 6483 CircleF 1523 6397 CircleF 1531 6559 CircleF 1539 6223 CircleF 1547 6479 CircleF 1555 6511 CircleF 1564 6191 CircleF 1572 6462 CircleF 1580 6335 CircleF 1588 6534 CircleF 1596 6123 CircleF 1605 6125 CircleF 1613 5921 CircleF 1621 5957 CircleF 1629 6173 CircleF 1637 6166 CircleF 1646 5818 CircleF 1654 6182 CircleF 1662 6109 CircleF 1670 5968 CircleF 1678 6003 CircleF 1687 5858 CircleF 1695 5998 CircleF 1703 5722 CircleF 1711 5860 CircleF 1719 5776 CircleF 1728 5840 CircleF 1736 5842 CircleF 1744 5724 CircleF 1752 5814 CircleF 1760 5699 CircleF 1769 5680 CircleF 1777 5724 CircleF 1785 5861 CircleF 1793 5717 CircleF 1801 5622 CircleF 1810 5651 CircleF 1818 5836 CircleF 1826 5756 CircleF 1834 5686 CircleF 1843 5653 CircleF 1851 5736 CircleF 1859 5611 CircleF 1867 5659 CircleF 1875 5775 CircleF 1884 5708 CircleF 1892 5672 CircleF 1900 5626 CircleF 1908 5615 CircleF 1916 5600 CircleF 1925 5778 CircleF 1933 5553 CircleF 1941 5683 CircleF 1949 5688 CircleF 1957 5834 CircleF 1966 5616 CircleF 1974 5474 CircleF 1982 5780 CircleF 1990 5676 CircleF 1998 5595 CircleF 2007 5685 CircleF 2015 5670 CircleF 2023 5561 CircleF 2031 5482 CircleF 2039 5564 CircleF 2048 5596 CircleF 2056 5491 CircleF 2064 5712 CircleF 2072 5478 CircleF 2080 5615 CircleF 2089 5507 CircleF 2097 5570 CircleF 2105 5716 CircleF 2113 5555 CircleF 2121 5525 CircleF 2130 5523 CircleF 2138 5495 CircleF 2146 5532 CircleF 2154 5550 CircleF 2162 5586 CircleF 2171 5481 CircleF 2179 5454 CircleF 2187 5457 CircleF 2195 5426 CircleF 2203 5506 CircleF 2212 5556 CircleF 2220 5545 CircleF 2228 5427 CircleF 2236 5539 CircleF 2244 5495 CircleF 2253 5318 CircleF 2261 5400 CircleF 2269 5313 CircleF 2277 5476 CircleF 2285 5332 CircleF 2294 5392 CircleF 2302 5345 CircleF 2310 5275 CircleF 2318 5319 CircleF 2326 5350 CircleF 2335 5354 CircleF 2343 5250 CircleF 2351 5345 CircleF 2359 5337 CircleF 2367 5286 CircleF 2376 5365 CircleF 2384 5266 CircleF 2392 5185 CircleF 2400 5231 CircleF 2408 5203 CircleF 2417 5242 CircleF 2425 5194 CircleF 2433 5180 CircleF 2441 5120 CircleF 2449 5203 CircleF 2458 5166 CircleF 2466 5173 CircleF 2474 5201 CircleF 2482 5118 CircleF 2490 5129 CircleF 2499 5181 CircleF 2507 5131 CircleF 2515 5154 CircleF 2523 5092 CircleF 2531 5113 CircleF 2540 5090 CircleF 2548 5143 CircleF 2556 5133 CircleF 2564 5062 CircleF 2572 5126 CircleF 2581 5087 CircleF 2589 5101 CircleF 2597 5084 CircleF 2605 5073 CircleF 2614 5045 CircleF 2622 5132 CircleF 2630 5115 CircleF 2638 5058 CircleF 2646 5121 CircleF 2655 5100 CircleF 2663 5097 CircleF 2671 5077 CircleF 2679 5133 CircleF 2687 5157 CircleF 2696 5132 CircleF 2704 5102 CircleF 2712 5143 CircleF 2720 5125 CircleF 2728 5090 CircleF 2737 5195 CircleF 2745 5112 CircleF 2753 5051 CircleF 2761 5125 CircleF 2769 5241 CircleF 2778 5125 CircleF 2786 5127 CircleF 2794 5116 CircleF 2802 5172 CircleF 2810 5154 CircleF 2819 5212 CircleF 2827 5238 CircleF 2835 5273 CircleF 2843 5183 CircleF 2851 5236 CircleF 2860 5257 CircleF 2868 5320 CircleF 2876 5342 CircleF 2884 5397 CircleF 2892 5310 CircleF 2901 5411 CircleF 2909 5311 CircleF 2917 5420 CircleF 2925 5398 CircleF 2933 5233 CircleF 2942 5386 CircleF 2950 5332 CircleF 2958 5416 CircleF 2966 5416 CircleF 2974 5346 CircleF 2983 5536 CircleF 2991 5460 CircleF 2999 5542 CircleF 3007 5396 CircleF 3015 5522 CircleF 3024 5558 CircleF 3032 5459 CircleF 3040 5578 CircleF 3048 5494 CircleF 3056 5616 CircleF 3065 5459 CircleF 3073 5583 CircleF 3081 5501 CircleF 3089 5669 CircleF 3097 5624 CircleF 3106 5437 CircleF 3114 5545 CircleF 3122 5678 CircleF 3130 5587 CircleF 3138 5678 CircleF 3147 5597 CircleF 3155 5626 CircleF 3163 5581 CircleF 3171 5443 CircleF 3179 5512 CircleF 3188 5607 CircleF 3196 5703 CircleF 3204 5510 CircleF 3212 5584 CircleF 3220 5623 CircleF 3229 5748 CircleF 3237 5729 CircleF 3245 5696 CircleF 3253 5748 CircleF 3261 5622 CircleF 3270 5619 CircleF 3278 5599 CircleF 3286 5610 CircleF 3294 5746 CircleF 3302 5581 CircleF 3311 5683 CircleF 3319 5640 CircleF 3327 5646 CircleF 3335 5659 CircleF 3344 5651 CircleF 3352 5810 CircleF 3360 5656 CircleF 3368 5540 CircleF 3376 5660 CircleF 3385 5651 CircleF 3393 5607 CircleF 3401 5632 CircleF 3409 5682 CircleF 3417 5808 CircleF 3426 5882 CircleF 3434 5850 CircleF 3442 5649 CircleF 3450 5716 CircleF 3458 5847 CircleF 3467 5677 CircleF 3475 5839 CircleF 3483 5745 CircleF 3491 5810 CircleF 3499 5754 CircleF 3508 5793 CircleF 3516 5732 CircleF 3524 5646 CircleF 3532 5759 CircleF 3540 5896 CircleF 3549 5747 CircleF 3557 5924 CircleF 3565 5942 CircleF 3573 5811 CircleF 3581 6186 CircleF 3590 6047 CircleF 3598 6166 CircleF 3606 6089 CircleF 3614 6070 CircleF 3622 6107 CircleF 3631 6339 CircleF 3639 5795 CircleF 3647 6383 CircleF 3655 6328 CircleF 3663 6183 CircleF 3672 6404 CircleF 3680 6334 CircleF 3688 6725 CircleF 3696 6373 CircleF 3704 6415 CircleF 3713 6572 CircleF 3721 6759 CircleF 3729 6256 CircleF 3737 6611 CircleF 3745 6910 CircleF 3754 7131 CircleF 3762 6652 CircleF 3770 6930 CircleF 3778 6715 CircleF 3786 6694 CircleF 3795 6854 CircleF 3803 7135 CircleF 3811 6917 CircleF 3819 7004 CircleF 3827 7262 CircleF 3836 6875 CircleF 3844 7180 CircleF 3852 7255 CircleF 3860 7102 CircleF 3868 7240 CircleF 3877 7297 CircleF 3885 7007 CircleF 3893 7165 CircleF 3901 7001 CircleF 3909 6860 CircleF 3918 7779 CircleF 3926 7120 CircleF 3934 7201 CircleF 3942 7180 CircleF 3950 6734 CircleF 3959 7105 CircleF 3967 7239 CircleF 3975 6921 CircleF 3983 6909 CircleF 3991 7150 CircleF 4000 6876 CircleF 4008 6981 CircleF 4016 6632 CircleF 4024 7199 CircleF 4032 7087 CircleF 4041 6688 CircleF 4049 6696 CircleF 4057 6810 CircleF 4065 6322 CircleF 4073 6493 CircleF 4082 6599 CircleF 4090 6199 CircleF 4098 6535 CircleF 4106 6483 CircleF 4115 6543 CircleF 4123 6277 CircleF 4131 6524 CircleF 4139 6486 CircleF 4147 6436 CircleF 4156 6431 CircleF 4164 6085 CircleF 4172 6343 CircleF 4180 6017 CircleF 4188 5861 CircleF 4197 6127 CircleF 4205 6122 CircleF 4213 6029 CircleF 4221 5839 CircleF 4229 5963 CircleF 4238 6009 CircleF 4246 6026 CircleF 4254 5670 CircleF 4262 5766 CircleF 4270 5830 CircleF 4279 5683 CircleF 4287 5810 CircleF 4295 5888 CircleF 4303 5857 CircleF 4311 5694 CircleF 4320 5757 CircleF 4328 5726 CircleF 4336 5753 CircleF 4344 5709 CircleF 4352 5646 CircleF 4361 5911 CircleF 4369 5679 CircleF 4377 5617 CircleF 4385 5603 CircleF 4393 5598 CircleF 4402 5705 CircleF 4410 5566 CircleF 4418 5701 CircleF 4426 5588 CircleF 4434 5703 CircleF 4443 5730 CircleF 4451 5761 CircleF 4459 5801 CircleF 4467 5553 CircleF 4475 5562 CircleF 4484 5684 CircleF 4492 5517 CircleF 4500 5737 CircleF 4508 5398 CircleF 4516 5690 CircleF 4525 5675 CircleF 4533 5579 CircleF 4541 5453 CircleF 4549 5591 CircleF 4557 5587 CircleF 4566 5588 CircleF 4574 5490 CircleF 4582 5562 CircleF 4590 5664 CircleF 4598 5678 CircleF 4607 5459 CircleF 4615 5725 CircleF 4623 5656 CircleF 4631 5533 CircleF 4639 5705 CircleF 4648 5497 CircleF 4656 5480 CircleF 4664 5613 CircleF 4672 5460 CircleF 4680 5654 CircleF 4689 5688 CircleF 4697 5560 CircleF 4705 5694 CircleF 4713 5454 CircleF 4721 5639 CircleF 4730 5449 CircleF 4738 5646 CircleF 4746 5525 CircleF 4754 5639 CircleF 4762 5521 CircleF 4771 5515 CircleF 4779 5502 CircleF 1535 8086 CircleF % End plot #1 % Begin plot #2 6.000 UL LT1 0.37 0.61 0.21 C LCb setrgbcolor 1274 7946 M [ [(Helvetica) 140.0 0.0 true true 0 (Exact)] ] -46.7 MRshow LT1 0.37 0.61 0.21 C 1358 7946 M 354 0 V 686 5631 M 41 1 V 41 6 V 41 15 V 41 30 V 41 48 V 41 70 V 41 94 V 41 121 V 41 147 V 41 170 V 41 186 V 41 188 V 41 172 V 41 135 V 41 82 V 41 14 V 41 -54 V 41 -115 V 41 -160 V 41 -183 V 41 -189 V 41 -177 V 41 -158 V 41 -132 V 41 -105 V 41 -80 V 41 -56 V 41 -37 V 41 -21 V 41 -10 V 41 -2 V 41 0 V 41 -4 V 41 -11 V 41 -22 V 41 -35 V 41 -47 V 41 -58 V 41 -63 V 41 -64 V 41 -60 V 41 -54 V 41 -45 V 41 -36 V 41 -25 V 41 -16 V 41 -6 V 41 4 V 41 13 V 42 23 V 41 33 V 41 43 V 41 52 V 41 59 V 41 63 V 41 64 V 41 59 V 41 50 V 41 39 V 41 25 V 41 14 V 41 4 V 41 1 V 41 1 V 41 7 V 41 18 V 41 33 V 41 51 V 41 74 V 41 99 V 41 125 V 41 151 V 41 174 V 41 187 V 41 186 V 41 168 V 41 127 V 41 71 V 41 3 V 41 -66 V 41 -124 V 41 -164 V 41 -186 V 41 -188 V 41 -175 V 41 -153 V 41 -127 V 41 -101 V 41 -76 V 41 -53 V 41 -34 V 41 -19 V 41 -8 V 41 -1 V 41 -1 V 41 -4 V 41 -12 V 41 -25 V 41 -37 V % End plot #2 % Begin plot #3 stroke LT2 0.00 0.38 0.68 C LCb setrgbcolor 1274 7806 M [ [(Helvetica) 140.0 0.0 true true 0 (TSQR)] ] -46.7 MRshow LT2 0.00 0.38 0.68 C 1358 7806 M 354 0 V 686 5723 M 41 -123 V 41 30 V 41 49 V 41 34 V 41 29 V 41 46 V 41 82 V 41 124 V 41 164 V 41 192 V 41 199 V 41 188 V 41 158 V 41 114 V 41 60 V 41 3 V 41 -51 V 41 -100 V 41 -138 V 41 -163 V 41 -176 V 41 -176 V 41 -166 V 41 -146 V 41 -121 V 41 -94 V 41 -66 V 41 -41 V 41 -19 V 41 -4 V 41 5 V 41 8 V 41 5 V 41 -3 V 41 -14 V 41 -28 V 41 -41 V 41 -54 V 41 -64 V 41 -71 V 41 -73 V 41 -70 V 41 -64 V 41 -52 V 41 -38 V 41 -21 V 41 -3 V 41 15 V 41 31 V 42 45 V 41 57 V 41 63 V 41 66 V 41 64 V 41 59 V 41 51 V 41 39 V 41 29 V 41 17 V 41 7 V 41 1 V 41 -2 V 41 -1 V 41 6 V 41 18 V 41 34 V 41 54 V 41 75 V 41 98 V 41 120 V 41 137 V 41 151 V 41 156 V 41 154 V 41 143 V 41 123 V 41 94 V 41 57 V 41 14 V 41 -30 V 41 -74 V 41 -116 V 41 -149 V 41 -174 V 41 -184 V 41 -183 V 41 -167 V 41 -139 V 41 -102 V 41 -61 V 41 -23 V 41 10 V 41 27 V 41 29 V 41 11 V 41 -20 V 41 -52 V 41 -65 V 41 -30 V % End plot #3 % Begin plot #4 stroke LT3 0.95 0.35 0.00 C LCb setrgbcolor 1274 7666 M [ [(Helvetica) 140.0 0.0 true true 0 (Normal)] ] -46.7 MRshow LT3 0.95 0.35 0.00 C 1358 7666 M 354 0 V 686 6118 M 41 -447 V 41 -207 V 41 -35 V 41 80 V 41 150 V 41 187 V 41 199 V 41 194 V 41 174 V 41 149 V 41 118 V 41 86 V 41 54 V 41 24 V 41 -2 V 41 -26 V 41 -45 V 41 -62 V 41 -75 V 41 -84 V 41 -91 V 41 -94 V 41 -96 V 41 -97 V 41 -94 V 41 -92 V 41 -87 V 41 -84 V 41 -78 V 41 -72 V 41 -67 V 41 -61 V 41 -55 V 41 -48 V 41 -43 V 41 -38 V 41 -31 V 41 -26 V 41 -21 V 41 -16 V 41 -12 V 41 -8 V 41 -4 V 41 -1 V 41 1 V 41 3 V 41 5 V 41 7 V 41 7 V 42 8 V 41 8 V 41 8 V 41 10 V 41 10 V 41 11 V 41 14 V 41 16 V 41 19 V 41 24 V 41 29 V 41 35 V 41 43 V 41 51 V 41 59 V 41 69 V 41 78 V 41 86 V 41 95 V 41 102 V 41 106 V 41 110 V 41 110 V 41 108 V 41 101 V 41 92 V 41 78 V 41 60 V 41 40 V 41 16 V 41 -11 V 41 -38 V 41 -66 V 41 -93 V 41 -118 V 41 -137 V 41 -151 V 41 -159 V 41 -156 V 41 -144 V 41 -123 V 41 -92 V 41 -54 V 41 -12 V 41 29 V 41 63 V 41 76 V 41 59 V 41 -7 V 41 -140 V % End plot #4 stroke 1.000 UL LTb LCb setrgbcolor 686 8219 N 0 -3451 V 4101 0 V 0 3451 V -4101 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5726 4768 M 63 0 V 4038 0 R -63 0 V stroke 5642 4768 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 5199 M 63 0 V 4038 0 R -63 0 V stroke 5642 5199 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 5631 M 63 0 V 4038 0 R -63 0 V stroke 5642 5631 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 6062 M 63 0 V 4038 0 R -63 0 V stroke 5642 6062 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 6494 M 63 0 V 4038 0 R -63 0 V stroke 5642 6494 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 6925 M 63 0 V 4038 0 R -63 0 V stroke 5642 6925 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 7356 M 63 0 V 4038 0 R -63 0 V stroke 5642 7356 M [ [(Helvetica) 140.0 0.0 true true 0 ( 3)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 7788 M 63 0 V 4038 0 R -63 0 V stroke 5642 7788 M [ [(Helvetica) 140.0 0.0 true true 0 ( 3.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 8219 M 63 0 V 4038 0 R -63 0 V stroke 5642 8219 M [ [(Helvetica) 140.0 0.0 true true 0 ( 4)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 5726 4768 M 0 63 V 0 3388 R 0 -63 V stroke 5726 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6136 4768 M 0 63 V 0 3388 R 0 -63 V stroke 6136 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6546 4768 M 0 63 V 0 3388 R 0 -63 V stroke 6546 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6956 4768 M 0 63 V 0 3388 R 0 -63 V stroke 6956 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.3)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 7366 4768 M 0 63 V 0 3388 R 0 -63 V stroke 7366 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 7777 4768 M 0 63 V 0 3388 R 0 -63 V stroke 7777 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 8187 4768 M 0 63 V 0 3388 R 0 -63 V stroke 8187 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 8597 4768 M 0 63 V 0 3388 R 0 -63 V stroke 8597 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.7)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 9007 4768 M 0 63 V 0 3388 R 0 -63 V stroke 9007 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 9417 4768 M 0 63 V 0 3388 R 0 -63 V stroke 9417 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.9)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 9827 4768 M 0 63 V 0 3388 R 0 -63 V stroke 9827 4628 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5726 8219 N 0 -3451 V 4101 0 V 0 3451 V -4101 0 V Z stroke LCb setrgbcolor 5152 6493 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (f\(t\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 7776 4418 M [ [(Helvetica) 140.0 0.0 true true 0 (t)] ] -46.7 MCshow LTb 7776 8429 M [ [(Helvetica) 140.0 0.0 true true 0 (Regularized \()] [(Symbol) 140.0 0.0 true true 0 (l)] [(Helvetica) 140.0 0.0 true true 0 ( = 1e-6\))] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.500 UP 2.000 UL LT0 0.00 0.00 0.00 C 5726 5642 CircleF 5734 5680 CircleF 5742 5637 CircleF 5751 5635 CircleF 5759 5660 CircleF 5767 5630 CircleF 5775 5607 CircleF 5783 5710 CircleF 5792 5655 CircleF 5800 5629 CircleF 5808 5554 CircleF 5816 5783 CircleF 5824 5846 CircleF 5833 5522 CircleF 5841 5628 CircleF 5849 5776 CircleF 5857 5667 CircleF 5865 5593 CircleF 5874 5659 CircleF 5882 5645 CircleF 5890 5558 CircleF 5898 5769 CircleF 5906 5743 CircleF 5915 5747 CircleF 5923 5720 CircleF 5931 5689 CircleF 5939 5840 CircleF 5947 5812 CircleF 5956 5878 CircleF 5964 5775 CircleF 5972 5865 CircleF 5980 5837 CircleF 5988 5845 CircleF 5997 5905 CircleF 6005 5881 CircleF 6013 5697 CircleF 6021 5945 CircleF 6029 5917 CircleF 6038 6187 CircleF 6046 5866 CircleF 6054 6014 CircleF 6062 5958 CircleF 6070 6219 CircleF 6079 6202 CircleF 6087 6163 CircleF 6095 6117 CircleF 6103 6477 CircleF 6112 6154 CircleF 6120 6247 CircleF 6128 6253 CircleF 6136 6352 CircleF 6144 6358 CircleF 6153 6385 CircleF 6161 6355 CircleF 6169 6577 CircleF 6177 6385 CircleF 6185 6690 CircleF 6194 6665 CircleF 6202 6952 CircleF 6210 6873 CircleF 6218 6903 CircleF 6226 6396 CircleF 6235 6835 CircleF 6243 6859 CircleF 6251 6954 CircleF 6259 7288 CircleF 6267 7045 CircleF 6276 6647 CircleF 6284 6979 CircleF 6292 6779 CircleF 6300 6910 CircleF 6308 7308 CircleF 6317 6817 CircleF 6325 7103 CircleF 6333 7050 CircleF 6341 6791 CircleF 6349 7098 CircleF 6358 7508 CircleF 6366 7341 CircleF 6374 7066 CircleF 6382 7198 CircleF 6390 6705 CircleF 6399 6716 CircleF 6407 6879 CircleF 6415 7318 CircleF 6423 7144 CircleF 6431 7427 CircleF 6440 6915 CircleF 6448 6884 CircleF 6456 6845 CircleF 6464 7180 CircleF 6472 6693 CircleF 6481 6742 CircleF 6489 6891 CircleF 6497 6566 CircleF 6505 6670 CircleF 6513 7094 CircleF 6522 6835 CircleF 6530 6647 CircleF 6538 6759 CircleF 6546 6714 CircleF 6554 6483 CircleF 6563 6397 CircleF 6571 6559 CircleF 6579 6223 CircleF 6587 6479 CircleF 6595 6511 CircleF 6604 6191 CircleF 6612 6462 CircleF 6620 6335 CircleF 6628 6534 CircleF 6636 6123 CircleF 6645 6125 CircleF 6653 5921 CircleF 6661 5957 CircleF 6669 6173 CircleF 6677 6166 CircleF 6686 5818 CircleF 6694 6182 CircleF 6702 6109 CircleF 6710 5968 CircleF 6718 6003 CircleF 6727 5858 CircleF 6735 5998 CircleF 6743 5722 CircleF 6751 5860 CircleF 6759 5776 CircleF 6768 5840 CircleF 6776 5842 CircleF 6784 5724 CircleF 6792 5814 CircleF 6800 5699 CircleF 6809 5680 CircleF 6817 5724 CircleF 6825 5861 CircleF 6833 5717 CircleF 6841 5622 CircleF 6850 5651 CircleF 6858 5836 CircleF 6866 5756 CircleF 6874 5686 CircleF 6883 5653 CircleF 6891 5736 CircleF 6899 5611 CircleF 6907 5659 CircleF 6915 5775 CircleF 6924 5708 CircleF 6932 5672 CircleF 6940 5626 CircleF 6948 5615 CircleF 6956 5600 CircleF 6965 5778 CircleF 6973 5553 CircleF 6981 5683 CircleF 6989 5688 CircleF 6997 5834 CircleF 7006 5616 CircleF 7014 5474 CircleF 7022 5780 CircleF 7030 5676 CircleF 7038 5595 CircleF 7047 5685 CircleF 7055 5670 CircleF 7063 5561 CircleF 7071 5482 CircleF 7079 5564 CircleF 7088 5596 CircleF 7096 5491 CircleF 7104 5712 CircleF 7112 5478 CircleF 7120 5615 CircleF 7129 5507 CircleF 7137 5570 CircleF 7145 5716 CircleF 7153 5555 CircleF 7161 5525 CircleF 7170 5523 CircleF 7178 5495 CircleF 7186 5532 CircleF 7194 5550 CircleF 7202 5586 CircleF 7211 5481 CircleF 7219 5454 CircleF 7227 5457 CircleF 7235 5426 CircleF 7243 5506 CircleF 7252 5556 CircleF 7260 5545 CircleF 7268 5427 CircleF 7276 5539 CircleF 7284 5495 CircleF 7293 5318 CircleF 7301 5400 CircleF 7309 5313 CircleF 7317 5476 CircleF 7325 5332 CircleF 7334 5392 CircleF 7342 5345 CircleF 7350 5275 CircleF 7358 5319 CircleF 7366 5350 CircleF 7375 5354 CircleF 7383 5250 CircleF 7391 5345 CircleF 7399 5337 CircleF 7407 5286 CircleF 7416 5365 CircleF 7424 5266 CircleF 7432 5185 CircleF 7440 5231 CircleF 7448 5203 CircleF 7457 5242 CircleF 7465 5194 CircleF 7473 5180 CircleF 7481 5120 CircleF 7489 5203 CircleF 7498 5166 CircleF 7506 5173 CircleF 7514 5201 CircleF 7522 5118 CircleF 7530 5129 CircleF 7539 5181 CircleF 7547 5131 CircleF 7555 5154 CircleF 7563 5092 CircleF 7571 5113 CircleF 7580 5090 CircleF 7588 5143 CircleF 7596 5133 CircleF 7604 5062 CircleF 7612 5126 CircleF 7621 5087 CircleF 7629 5101 CircleF 7637 5084 CircleF 7645 5073 CircleF 7654 5045 CircleF 7662 5132 CircleF 7670 5115 CircleF 7678 5058 CircleF 7686 5121 CircleF 7695 5100 CircleF 7703 5097 CircleF 7711 5077 CircleF 7719 5133 CircleF 7727 5157 CircleF 7736 5132 CircleF 7744 5102 CircleF 7752 5143 CircleF 7760 5125 CircleF 7768 5090 CircleF 7777 5195 CircleF 7785 5112 CircleF 7793 5051 CircleF 7801 5125 CircleF 7809 5241 CircleF 7818 5125 CircleF 7826 5127 CircleF 7834 5116 CircleF 7842 5172 CircleF 7850 5154 CircleF 7859 5212 CircleF 7867 5238 CircleF 7875 5273 CircleF 7883 5183 CircleF 7891 5236 CircleF 7900 5257 CircleF 7908 5320 CircleF 7916 5342 CircleF 7924 5397 CircleF 7932 5310 CircleF 7941 5411 CircleF 7949 5311 CircleF 7957 5420 CircleF 7965 5398 CircleF 7973 5233 CircleF 7982 5386 CircleF 7990 5332 CircleF 7998 5416 CircleF 8006 5416 CircleF 8014 5346 CircleF 8023 5536 CircleF 8031 5460 CircleF 8039 5542 CircleF 8047 5396 CircleF 8055 5522 CircleF 8064 5558 CircleF 8072 5459 CircleF 8080 5578 CircleF 8088 5494 CircleF 8096 5616 CircleF 8105 5459 CircleF 8113 5583 CircleF 8121 5501 CircleF 8129 5669 CircleF 8137 5624 CircleF 8146 5437 CircleF 8154 5545 CircleF 8162 5678 CircleF 8170 5587 CircleF 8178 5678 CircleF 8187 5597 CircleF 8195 5626 CircleF 8203 5581 CircleF 8211 5443 CircleF 8219 5512 CircleF 8228 5607 CircleF 8236 5703 CircleF 8244 5510 CircleF 8252 5584 CircleF 8260 5623 CircleF 8269 5748 CircleF 8277 5729 CircleF 8285 5696 CircleF 8293 5748 CircleF 8301 5622 CircleF 8310 5619 CircleF 8318 5599 CircleF 8326 5610 CircleF 8334 5746 CircleF 8342 5581 CircleF 8351 5683 CircleF 8359 5640 CircleF 8367 5646 CircleF 8375 5659 CircleF 8384 5651 CircleF 8392 5810 CircleF 8400 5656 CircleF 8408 5540 CircleF 8416 5660 CircleF 8425 5651 CircleF 8433 5607 CircleF 8441 5632 CircleF 8449 5682 CircleF 8457 5808 CircleF 8466 5882 CircleF 8474 5850 CircleF 8482 5649 CircleF 8490 5716 CircleF 8498 5847 CircleF 8507 5677 CircleF 8515 5839 CircleF 8523 5745 CircleF 8531 5810 CircleF 8539 5754 CircleF 8548 5793 CircleF 8556 5732 CircleF 8564 5646 CircleF 8572 5759 CircleF 8580 5896 CircleF 8589 5747 CircleF 8597 5924 CircleF 8605 5942 CircleF 8613 5811 CircleF 8621 6186 CircleF 8630 6047 CircleF 8638 6166 CircleF 8646 6089 CircleF 8654 6070 CircleF 8662 6107 CircleF 8671 6339 CircleF 8679 5795 CircleF 8687 6383 CircleF 8695 6328 CircleF 8703 6183 CircleF 8712 6404 CircleF 8720 6334 CircleF 8728 6725 CircleF 8736 6373 CircleF 8744 6415 CircleF 8753 6572 CircleF 8761 6759 CircleF 8769 6256 CircleF 8777 6611 CircleF 8785 6910 CircleF 8794 7131 CircleF 8802 6652 CircleF 8810 6930 CircleF 8818 6715 CircleF 8826 6694 CircleF 8835 6854 CircleF 8843 7135 CircleF 8851 6917 CircleF 8859 7004 CircleF 8867 7262 CircleF 8876 6875 CircleF 8884 7180 CircleF 8892 7255 CircleF 8900 7102 CircleF 8908 7240 CircleF 8917 7297 CircleF 8925 7007 CircleF 8933 7165 CircleF 8941 7001 CircleF 8949 6860 CircleF 8958 7779 CircleF 8966 7120 CircleF 8974 7201 CircleF 8982 7180 CircleF 8990 6734 CircleF 8999 7105 CircleF 9007 7239 CircleF 9015 6921 CircleF 9023 6909 CircleF 9031 7150 CircleF 9040 6876 CircleF 9048 6981 CircleF 9056 6632 CircleF 9064 7199 CircleF 9072 7087 CircleF 9081 6688 CircleF 9089 6696 CircleF 9097 6810 CircleF 9105 6322 CircleF 9113 6493 CircleF 9122 6599 CircleF 9130 6199 CircleF 9138 6535 CircleF 9146 6483 CircleF 9155 6543 CircleF 9163 6277 CircleF 9171 6524 CircleF 9179 6486 CircleF 9187 6436 CircleF 9196 6431 CircleF 9204 6085 CircleF 9212 6343 CircleF 9220 6017 CircleF 9228 5861 CircleF 9237 6127 CircleF 9245 6122 CircleF 9253 6029 CircleF 9261 5839 CircleF 9269 5963 CircleF 9278 6009 CircleF 9286 6026 CircleF 9294 5670 CircleF 9302 5766 CircleF 9310 5830 CircleF 9319 5683 CircleF 9327 5810 CircleF 9335 5888 CircleF 9343 5857 CircleF 9351 5694 CircleF 9360 5757 CircleF 9368 5726 CircleF 9376 5753 CircleF 9384 5709 CircleF 9392 5646 CircleF 9401 5911 CircleF 9409 5679 CircleF 9417 5617 CircleF 9425 5603 CircleF 9433 5598 CircleF 9442 5705 CircleF 9450 5566 CircleF 9458 5701 CircleF 9466 5588 CircleF 9474 5703 CircleF 9483 5730 CircleF 9491 5761 CircleF 9499 5801 CircleF 9507 5553 CircleF 9515 5562 CircleF 9524 5684 CircleF 9532 5517 CircleF 9540 5737 CircleF 9548 5398 CircleF 9556 5690 CircleF 9565 5675 CircleF 9573 5579 CircleF 9581 5453 CircleF 9589 5591 CircleF 9597 5587 CircleF 9606 5588 CircleF 9614 5490 CircleF 9622 5562 CircleF 9630 5664 CircleF 9638 5678 CircleF 9647 5459 CircleF 9655 5725 CircleF 9663 5656 CircleF 9671 5533 CircleF 9679 5705 CircleF 9688 5497 CircleF 9696 5480 CircleF 9704 5613 CircleF 9712 5460 CircleF 9720 5654 CircleF 9729 5688 CircleF 9737 5560 CircleF 9745 5694 CircleF 9753 5454 CircleF 9761 5639 CircleF 9770 5449 CircleF 9778 5646 CircleF 9786 5525 CircleF 9794 5639 CircleF 9802 5521 CircleF 9811 5515 CircleF 9819 5502 CircleF % End plot #1 % Begin plot #2 6.000 UL LT1 0.37 0.61 0.21 C 5726 5631 M 41 1 V 41 6 V 41 15 V 41 30 V 41 48 V 41 70 V 41 94 V 41 121 V 41 147 V 41 170 V 41 186 V 41 188 V 41 172 V 41 135 V 41 82 V 41 14 V 41 -54 V 41 -115 V 41 -160 V 41 -183 V 41 -189 V 41 -177 V 41 -158 V 41 -132 V 41 -105 V 41 -80 V 41 -56 V 41 -37 V 41 -21 V 41 -10 V 41 -2 V 41 0 V 41 -4 V 41 -11 V 41 -22 V 41 -35 V 41 -47 V 41 -58 V 41 -63 V 41 -64 V 41 -60 V 41 -54 V 41 -45 V 41 -36 V 41 -25 V 41 -16 V 41 -6 V 41 4 V 41 13 V 42 23 V 41 33 V 41 43 V 41 52 V 41 59 V 41 63 V 41 64 V 41 59 V 41 50 V 41 39 V 41 25 V 41 14 V 41 4 V 41 1 V 41 1 V 41 7 V 41 18 V 41 33 V 41 51 V 41 74 V 41 99 V 41 125 V 41 151 V 41 174 V 41 187 V 41 186 V 41 168 V 41 127 V 41 71 V 41 3 V 41 -66 V 41 -124 V 41 -164 V 41 -186 V 41 -188 V 41 -175 V 41 -153 V 41 -127 V 41 -101 V 41 -76 V 41 -53 V 41 -34 V 41 -19 V 41 -8 V 41 -1 V 41 -1 V 41 -4 V 41 -12 V 41 -25 V 41 -37 V % End plot #2 % Begin plot #3 stroke LT2 0.00 0.38 0.68 C 5726 5907 M 41 -231 V 41 -132 V 41 -39 V 41 44 V 41 108 V 41 153 V 41 179 V 41 189 V 41 182 V 41 165 V 41 138 V 41 108 V 41 73 V 41 39 V 41 6 V 41 -24 V 41 -49 V 41 -70 V 41 -87 V 41 -98 V 41 -104 V 41 -108 V 41 -107 V 41 -104 V 41 -99 V 41 -93 V 41 -85 V 41 -78 V 41 -70 V 41 -63 V 41 -56 V 41 -51 V 41 -45 V 41 -41 V 41 -37 V 41 -33 V 41 -31 V 41 -27 V 41 -25 V 41 -22 V 41 -20 V 41 -16 V 41 -13 V 41 -9 V 41 -6 V 41 -3 V 41 1 V 41 4 V 41 8 V 42 9 V 41 13 V 41 14 V 41 16 V 41 18 V 41 19 V 41 20 V 41 22 V 41 24 V 41 27 V 41 30 V 41 35 V 41 39 V 41 46 V 41 54 V 41 61 V 41 71 V 41 79 V 41 89 V 41 97 V 41 104 V 41 109 V 41 112 V 41 112 V 41 107 V 41 98 V 41 86 V 41 68 V 41 46 V 41 20 V 41 -8 V 41 -39 V 41 -70 V 41 -99 V 41 -125 V 41 -147 V 41 -159 V 41 -165 V 41 -160 V 41 -143 V 41 -117 V 41 -82 V 41 -42 V 41 -1 V 41 37 V 41 60 V 41 64 V 41 38 V 41 -25 V 41 -129 V % End plot #3 % Begin plot #4 stroke LT3 0.95 0.35 0.00 C 5726 6115 M 41 -445 V 41 -205 V 41 -35 V 41 80 V 41 149 V 41 187 V 41 199 V 41 193 V 41 174 V 41 149 V 41 118 V 41 86 V 41 54 V 41 25 V 41 -2 V 41 -25 V 41 -45 V 41 -62 V 41 -75 V 41 -84 V 41 -91 V 41 -94 V 41 -97 V 41 -96 V 41 -95 V 41 -92 V 41 -88 V 41 -84 V 41 -78 V 41 -72 V 41 -67 V 41 -61 V 41 -55 V 41 -48 V 41 -43 V 41 -37 V 41 -31 V 41 -26 V 41 -20 V 41 -16 V 41 -12 V 41 -8 V 41 -4 V 41 -1 V 41 1 V 41 3 V 41 5 V 41 6 V 41 7 V 42 7 V 41 8 V 41 9 V 41 9 V 41 10 V 41 11 V 41 13 V 41 16 V 41 20 V 41 24 V 41 30 V 41 35 V 41 44 V 41 51 V 41 59 V 41 69 V 41 78 V 41 87 V 41 94 V 41 102 V 41 106 V 41 110 V 41 109 V 41 108 V 41 100 V 41 92 V 41 77 V 41 61 V 41 39 V 41 16 V 41 -10 V 41 -38 V 41 -65 V 41 -93 V 41 -117 V 41 -136 V 41 -152 V 41 -158 V 41 -156 V 41 -145 V 41 -124 V 41 -93 V 41 -55 V 41 -12 V 41 29 V 41 63 V 41 78 V 41 61 V 41 -6 V 41 -142 V % End plot #4 stroke 1.000 UL LTb LCb setrgbcolor 5726 8219 N 0 -3451 V 4101 0 V 0 3451 V -4101 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 602 448 M 31 0 V 4154 0 R -31 0 V 602 762 M 63 0 V 4122 0 R -63 0 V stroke 518 762 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 1076 M 31 0 V 4154 0 R -31 0 V 602 1389 M 63 0 V 4122 0 R -63 0 V stroke 518 1389 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 1703 M 31 0 V 4154 0 R -31 0 V 602 2017 M 63 0 V 4122 0 R -63 0 V stroke 518 2017 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (4)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2331 M 31 0 V 4154 0 R -31 0 V 602 2645 M 63 0 V 4122 0 R -63 0 V stroke 518 2645 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (6)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2959 M 31 0 V 4154 0 R -31 0 V 602 3272 M 63 0 V 4122 0 R -63 0 V stroke 518 3272 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (8)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 3586 M 31 0 V 4154 0 R -31 0 V 602 3900 M 63 0 V 4122 0 R -63 0 V stroke 518 3900 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (10)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 448 M 0 63 V 0 3389 R 0 -63 V stroke 602 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1232 448 M 0 31 V 0 3421 R 0 -31 V 1600 448 M 0 31 V 0 3421 R 0 -31 V 1862 448 M 0 31 V 0 3421 R 0 -31 V 2065 448 M 0 31 V 0 3421 R 0 -31 V 2230 448 M 0 31 V 0 3421 R 0 -31 V 2370 448 M 0 31 V 0 3421 R 0 -31 V 2492 448 M 0 31 V 0 3421 R 0 -31 V 2599 448 M 0 31 V 0 3421 R 0 -31 V 2695 448 M 0 63 V 0 3389 R 0 -63 V stroke 2695 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 3324 448 M 0 31 V 0 3421 R 0 -31 V 3693 448 M 0 31 V 0 3421 R 0 -31 V 3954 448 M 0 31 V 0 3421 R 0 -31 V 4157 448 M 0 31 V 0 3421 R 0 -31 V 4323 448 M 0 31 V 0 3421 R 0 -31 V 4463 448 M 0 31 V 0 3421 R 0 -31 V 4584 448 M 0 31 V 0 3421 R 0 -31 V 4691 448 M 0 31 V 0 3421 R 0 -31 V 4787 448 M 0 63 V 0 3389 R 0 -63 V stroke 4787 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (3)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 602 3900 N 602 448 L 4185 0 V 0 3452 V -4185 0 V Z stroke LCb setrgbcolor 112 2174 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (solution norm ||c||)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 2694 98 M [ [(Helvetica) 140.0 0.0 true true 0 (residual norm ||y - X c||)] ] -46.7 MCshow LTb 2694 4110 M [ [(Helvetica) 140.0 0.0 true true 0 (L-curve computed from TSQR method)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 6.000 UL LT0 0.45 0.59 0.90 C /Helvetica findfont 140 scalefont setfont /vshift -46 def 3435 655 M -48 19 V -49 16 V -46 14 V -43 13 V -38 11 V -33 10 V -28 9 V -23 8 V -18 7 V -14 6 V -12 6 V -10 6 V -9 6 V -9 7 V -9 8 V -10 10 V -11 12 V -12 13 V -13 15 V -13 16 V -14 15 V -13 16 V -13 14 V -12 14 V -10 13 V -9 12 V -9 12 V -8 12 V -9 13 V -8 14 V -10 16 V -10 17 V -12 19 V -14 21 V -16 22 V -19 23 V -22 24 V -25 23 V -28 23 V -31 22 V -33 20 V -33 19 V -32 17 V -30 15 V -27 13 V -23 12 V -20 11 V -18 10 V -15 9 V -13 9 V -12 9 V -11 9 V -11 9 V -8 9 V -8 9 V -6 8 V -6 7 V -4 7 V -3 6 V -2 6 V -2 5 V -2 6 V -1 6 V -2 6 V -1 7 V -1 7 V -1 8 V -1 9 V -2 11 V -1 12 V -1 14 V -2 16 V -1 19 V -2 20 V -2 22 V -3 23 V -3 24 V -3 24 V -3 24 V -4 25 V -5 26 V -6 27 V -6 27 V -8 27 V -9 28 V -11 27 V -13 27 V -14 26 V -16 25 V -16 22 V -17 21 V -16 19 V -14 17 V -13 14 V -11 13 V -9 10 V -6 9 V -5 8 V -4 7 V -3 7 V -3 6 V -2 7 V -2 7 V -2 7 V stroke 2131 2128 M -2 9 V -2 8 V -1 9 V -2 9 V -1 10 V -1 8 V -1 9 V -1 10 V -1 10 V -1 12 V -1 14 V -1 15 V -1 17 V -1 19 V -2 19 V -1 19 V -1 18 V -2 17 V -1 15 V -1 14 V 0 12 V -1 10 V 0 10 V -1 8 V 0 9 V -1 9 V 0 9 V 0 12 V -1 14 V 0 17 V 0 21 V -1 22 V -1 26 V -1 27 V -1 28 V -1 30 V -2 31 V -3 31 V -2 33 V -4 32 V -5 33 V -5 32 V -8 32 V -8 32 V -11 31 V -14 31 V -15 29 V -18 27 V -21 27 V -22 24 V -24 22 V -23 20 V -23 18 V -20 16 V -18 13 V -14 12 V -11 9 V -8 8 V -6 7 V -4 5 V -3 4 V -2 4 V -1 3 V -1 2 V -1 3 V 0 2 V -1 3 V 0 3 V -1 4 V 0 5 V -1 6 V 0 7 V 0 7 V -1 8 V 0 9 V -1 10 V 0 12 V -1 13 V 0 17 V -1 19 V 0 23 V -1 26 V -2 28 V -1 29 V -2 31 V -2 30 V -3 31 V -4 30 V -4 29 V -4 28 V -5 27 V -5 25 V -6 23 V -5 21 V -5 19 V % End plot #1 stroke 1.000 UL LTb LCb setrgbcolor 602 3900 N 602 448 L 4185 0 V 0 3452 V -4185 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5642 448 M 31 0 V 4154 0 R -31 0 V 5642 762 M 63 0 V 4122 0 R -63 0 V stroke 5558 762 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 1076 M 31 0 V 4154 0 R -31 0 V 5642 1389 M 63 0 V 4122 0 R -63 0 V stroke 5558 1389 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 1703 M 31 0 V 4154 0 R -31 0 V 5642 2017 M 63 0 V 4122 0 R -63 0 V stroke 5558 2017 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (4)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 2331 M 31 0 V 4154 0 R -31 0 V 5642 2645 M 63 0 V 4122 0 R -63 0 V stroke 5558 2645 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (6)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 2959 M 31 0 V 4154 0 R -31 0 V 5642 3272 M 63 0 V 4122 0 R -63 0 V stroke 5558 3272 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (8)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 3586 M 31 0 V 4154 0 R -31 0 V 5642 3900 M 63 0 V 4122 0 R -63 0 V stroke 5558 3900 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (10)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 5642 448 M 0 63 V 0 3389 R 0 -63 V stroke 5642 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 6272 448 M 0 31 V 0 3421 R 0 -31 V 6640 448 M 0 31 V 0 3421 R 0 -31 V 6902 448 M 0 31 V 0 3421 R 0 -31 V 7105 448 M 0 31 V 0 3421 R 0 -31 V 7270 448 M 0 31 V 0 3421 R 0 -31 V 7410 448 M 0 31 V 0 3421 R 0 -31 V 7532 448 M 0 31 V 0 3421 R 0 -31 V 7639 448 M 0 31 V 0 3421 R 0 -31 V 7735 448 M 0 63 V 0 3389 R 0 -63 V stroke 7735 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 8364 448 M 0 31 V 0 3421 R 0 -31 V 8733 448 M 0 31 V 0 3421 R 0 -31 V 8994 448 M 0 31 V 0 3421 R 0 -31 V 9197 448 M 0 31 V 0 3421 R 0 -31 V 9363 448 M 0 31 V 0 3421 R 0 -31 V 9503 448 M 0 31 V 0 3421 R 0 -31 V 9624 448 M 0 31 V 0 3421 R 0 -31 V 9731 448 M 0 31 V 0 3421 R 0 -31 V 9827 448 M 0 63 V 0 3389 R 0 -63 V stroke 9827 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (3)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5642 3900 N 0 -3452 V 4185 0 V 0 3452 V -4185 0 V Z stroke LCb setrgbcolor 5152 2174 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (solution norm ||c||)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 7734 98 M [ [(Helvetica) 140.0 0.0 true true 0 (residual norm ||y - X c||)] ] -46.7 MCshow LTb 7734 4110 M [ [(Helvetica) 140.0 0.0 true true 0 (L-curve computed from normal equations method)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 6.000 UL LT0 0.45 0.59 0.90 C /Helvetica findfont 140 scalefont setfont 8475 655 M -63 23 V -61 20 V -57 18 V -50 14 V -40 13 V -32 10 V -24 10 V -18 8 V -14 7 V -12 8 V -11 9 V -12 11 V -14 15 V -16 17 V -17 20 V -17 20 V -18 20 V -16 19 V -14 17 V -13 16 V -11 16 V -11 16 V -11 17 V -12 20 V -14 23 V -16 26 V -21 28 V -25 31 V -30 30 V -35 30 V -40 28 V -43 26 V -42 23 V -39 20 V -34 17 V -28 14 V -24 13 V -19 12 V -17 12 V -15 12 V -13 11 V -11 12 V -9 11 V -7 9 V -5 9 V -3 8 V -3 7 V -2 7 V -2 8 V -2 8 V -1 10 V -2 11 V -1 12 V -2 15 V -1 19 V -2 22 V -3 26 V -3 28 V -3 30 V -4 31 V -4 32 V -6 33 V -6 33 V -8 35 V -11 36 V -13 36 V -15 35 V -19 34 V -20 31 V -22 28 V -21 25 V -18 21 V -16 18 V -12 14 V -8 12 V -6 10 V -5 8 V -3 8 V -3 9 V -3 9 V -2 11 V -2 11 V -2 12 V -2 12 V -1 12 V -1 11 V -2 13 V -1 15 V -1 18 V -2 21 V -1 24 V -2 24 V -2 24 V -1 23 V -2 20 V -1 17 V -1 15 V 0 12 V -1 10 V 0 11 V -1 11 V 0 13 V 0 18 V -1 22 V stroke 7142 2505 M 0 25 V -1 31 V -4 83 V 2 -1 V 0 1 V -2 41 V -6 85 V -18 113 V 24 -143 V 1 -24 V 0 3 V 0 3 V 0 1 V 0 2 V 0 -1 V 0 2 V 0 3 V % End plot #1 stroke 1.000 UL LTb LCb setrgbcolor 5642 3900 N 0 -3452 V 4185 0 V 0 3452 V -4185 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Symbol Helvetica gsl-doc-2.3/doc/rand-gumbel1.tex0000664000175000017500000004740112616157443014546 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-gumbel1.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-gumbel1.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 1051 631 M 0 -31 V 830 31 R 0 -31 V 830 31 R 0 -31 V 830 31 R 0 -31 V 829 31 R 0 -31 V 830 31 R 0 -31 V 830 31 R 0 -31 V 830 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 670 M 19 7 V 20 7 V 19 8 V 20 8 V 19 10 V 20 11 V 19 12 V 19 13 V 20 15 V 19 16 V 20 17 V 19 19 V 20 20 V 19 22 V 19 23 V 20 25 V 19 27 V 20 29 V 19 30 V 20 33 V 19 34 V 19 36 V 20 37 V 19 40 V 20 41 V 19 44 V 20 44 V 19 47 V 19 48 V 20 50 V 19 51 V 20 53 V 19 54 V 20 56 V 19 56 V 19 58 V 20 59 V 19 59 V 20 61 V 19 60 V 20 62 V 19 62 V 19 62 V 20 62 V 19 63 V 20 62 V 19 62 V 20 62 V 19 61 V 19 61 V 20 60 V 19 59 V 20 59 V 19 57 V 20 56 V 19 56 V 19 53 V 20 53 V 19 51 V 20 49 V 19 48 V 20 46 V 19 44 V 19 43 V 20 41 V 19 38 V 20 37 V 19 35 V 20 33 V 19 31 V 19 29 V 20 27 V 19 25 V 20 23 V 19 21 V 20 19 V 19 17 V 19 15 V 20 13 V 19 11 V 20 9 V 19 7 V 20 5 V 19 4 V 19 1 V 20 0 V 19 -2 V 20 -3 V 19 -5 V 20 -7 V 19 -8 V 19 -10 V 20 -11 V 19 -13 V 20 -14 V 19 -15 V 20 -17 V 19 -17 V 19 -19 V 20 -20 V 19 -21 V 20 -22 V 3052 3578 L 20 -24 V 19 -25 V 19 -25 V 20 -26 V 19 -27 V 20 -27 V 19 -28 V 20 -29 V 19 -29 V 19 -29 V 20 -31 V 19 -30 V 20 -31 V 19 -31 V 20 -31 V 19 -32 V 19 -32 V 20 -32 V 19 -32 V 20 -32 V 19 -33 V 20 -32 V 19 -33 V 19 -32 V 20 -33 V 19 -32 V 20 -33 V 19 -32 V 20 -32 V 19 -32 V 19 -32 V 20 -32 V 19 -32 V 20 -31 V 19 -32 V 20 -31 V 19 -31 V 19 -30 V 20 -31 V 19 -30 V 20 -29 V 19 -30 V 20 -29 V 19 -29 V 19 -29 V 20 -28 V 19 -28 V 20 -28 V 19 -27 V 19 -27 V 20 -27 V 19 -26 V 20 -26 V 19 -26 V 20 -25 V 19 -25 V 19 -25 V 20 -24 V 19 -24 V 20 -23 V 19 -24 V 20 -23 V 19 -22 V 19 -22 V 20 -22 V 19 -21 V 20 -22 V 19 -20 V 20 -21 V 19 -20 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -18 V 20 -18 V 19 -18 V 19 -18 V 20 -17 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -16 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -14 V 20 -14 V 19 -13 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 5092 1093 L 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}Type 1, $a=1,b=1$}}% \put(3955,5244){\cjust{\strut{}Type 1 Gumbel Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6030,400){\cjust{\strut{}4}}% \put(5200,400){\cjust{\strut{}3}}% \put(4370,400){\cjust{\strut{}2}}% \put(3541,400){\cjust{\strut{}1}}% \put(2711,400){\cjust{\strut{}0}}% \put(1881,400){\cjust{\strut{}-1}}% \put(1051,400){\cjust{\strut{}-2}}% \put(900,4944){\rjust{\strut{} 0.5}}% \put(900,4081){\rjust{\strut{} 0.4}}% \put(900,3219){\rjust{\strut{} 0.3}}% \put(900,2356){\rjust{\strut{} 0.2}}% \put(900,1494){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/debug.texi0000664000175000017500000003342412616157443013527 0ustar eddeddThis 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 @cindex 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 @cindex exceptions, floating point @cindex 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 @comment #include @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 -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 -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 @w{} @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 @w{} @item B.J. Gough, @url{http://www.network-theory.co.uk/gcc/intro/,@cite{An Introduction to GCC},@cite{An Introduction to GCC}}, Network Theory Ltd, ISBN 0954161793 @end itemize gsl-doc-2.3/doc/fftalgorithms.bib0000664000175000017500000001344112616157443015072 0ustar eddedd@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} } gsl-doc-2.3/doc/vdp.eps0000664000175000017500000005145012616157443013047 0ustar eddedd%!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 gsl-doc-2.3/doc/interp2.eps0000664000175000017500000013730312616157443013643 0ustar eddedd%!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 gsl-doc-2.3/doc/specfunc-expint.texi0000664000175000017500000001240212616157443015545 0ustar eddedd@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 @deftypefun double gsl_sf_expint_En (int @var{n}, double @var{x}) @deftypefunx int gsl_sf_expint_En_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result}) These routines compute the exponential integral @math{E_n(x)} of order @math{n}, @tex \beforedisplay $$ E_n(x) := \Re \int_1^\infty dt \exp(-xt)/t^n. $$ \afterdisplay @end tex @ifinfo @example E_n(x) := \Re \int_1^\infty dt \exp(-xt)/t^n. @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 @c{$\hbox{Ei}(x)$} @math{Ei(x)}, @tex \beforedisplay $$ \hbox{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 @c{$\hbox{Shi}(x) = \int_0^x dt \sinh(t)/t$} @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 @c{$\hbox{Chi}(x) := \Re[ \gamma_E + \log(x) + \int_0^x dt (\cosh(t)-1)/t]$} @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 @c{${\rm Ei}_3(x) = \int_0^xdt \exp(-t^3)$} @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 @c{$\hbox{Si}(x) = \int_0^x dt \sin(t)/t$} @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 @c{$\hbox{Ci}(x) = -\int_x^\infty dt \cos(t)/t$} @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 @c{$\hbox{AtanInt}(x) = \int_0^x dt \arctan(t)/t$} @math{AtanInt(x) = \int_0^x dt \arctan(t)/t}. @comment Domain: @comment Exceptional Return Values: @end deftypefun gsl-doc-2.3/doc/intro.texi0000664000175000017500000002225512616157443013574 0ustar eddedd@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 Basis Splines @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 @w{} @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 @w{} @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. 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 or online in the GSL bug tracker.@footnote{@url{http://savannah.gnu.org/bugs/?group=gsl}} 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 (3rd Ed.), ISBN 0954612078}. 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}). gsl-doc-2.3/doc/montecarlo.texi0000664000175000017500000007007612616157443014610 0ustar eddedd@cindex Monte Carlo integration @cindex stratified sampling in Monte Carlo integration @cindex multidimensional 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, @file{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 = ¶ms; @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 = (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^2 \over N^2 } \sum_i^N (f(x_i) - \langle f \rangle)^2. $$ \afterdisplay @end tex @ifinfo @example \sigma^2 (E; N) = (V^2 / N^2) \sum_i^N (f(x_i) - )^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}) @tindex gsl_monte_plain_state 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}, const double @var{xl}[], const 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}) @tindex gsl_monte_miser_state 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}, const double @var{xl}[], const 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 which can be changed using the following two functions.@footnote{The previous method of accessing these fields directly through the @code{gsl_monte_miser_state} struct is now deprecated.} @deftypefun void gsl_monte_miser_params_get (const gsl_monte_miser_state * @var{s}, gsl_monte_miser_params * @var{params}) This function copies the parameters of the integrator state into the user-supplied @var{params} structure. @end deftypefun @deftypefun void gsl_monte_miser_params_set (gsl_monte_miser_state * @var{s}, const gsl_monte_miser_params * @var{params}) This function sets the integrator parameters based on values provided in the @var{params} structure. @end deftypefun Typically the values of the parameters are first read using @code{gsl_monte_miser_params_get}, the necessary changes are made to the fields of the @var{params} structure, and the values are copied back into the integrator state using @code{gsl_monte_miser_params_set}. The functions use the @code{gsl_monte_miser_params} structure which contains the following fields: @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}) @tindex gsl_monte_vegas_state 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 convergence of the algorithm can be tested using the overall chi-squared value of the results, which is available from the following function: @deftypefun double gsl_monte_vegas_chisq (const gsl_monte_vegas_state * @var{s}) This function returns the chi-squared per degree of freedom for the weighted estimate of the integral. The returned value should be close to 1. A value 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 deftypefun @deftypefun void gsl_monte_vegas_runval (const gsl_monte_vegas_state * @var{s}, double * @var{result}, double * @var{sigma}) This function returns the raw (unaveraged) values of the integral @var{result} and its error @var{sigma} from the most recent iteration of the algorithm. @end deftypefun The @sc{vegas} algorithm is highly configurable. Several parameters can be changed using the following two functions. @deftypefun void gsl_monte_vegas_params_get (const gsl_monte_vegas_state * @var{s}, gsl_monte_vegas_params * @var{params}) This function copies the parameters of the integrator state into the user-supplied @var{params} structure. @end deftypefun @deftypefun void gsl_monte_vegas_params_set (gsl_monte_vegas_state * @var{s}, const gsl_monte_vegas_params * @var{params}) This function sets the integrator parameters based on values provided in the @var{params} structure. @end deftypefun Typically the values of the parameters are first read using @code{gsl_monte_vegas_params_get}, the necessary changes are made to the fields of the @var{params} structure, and the values are copied back into the integrator state using @code{gsl_monte_vegas_params_set}. The functions use the @code{gsl_monte_vegas_params} structure which contains the following fields: @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 @sc{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 The above fields and the @var{chisq} value can also be accessed directly in the @code{gsl_monte_vegas_state} but such use is deprecated. @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 1%. The estimated error @code{sigma} is roughly consistent with the actual error--the computed result differs from the true result by about 1.4 standard deviations, @example plain ================== result = 1.412209 sigma = 0.013436 exact = 1.393204 error = 0.019005 = 1.4 sigma @end example @noindent The @sc{miser} algorithm reduces the error by a factor of four, and also correctly estimates the error, @example miser ================== result = 1.391322 sigma = 0.003461 exact = 1.393204 error = -0.001882 = 0.54 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.392673 sigma = 0.003410 exact = 1.393204 error = -0.000531 = 0.16 sigma converging... result = 1.393281 sigma = 0.000362 chisq/dof = 1.5 vegas final ================== result = 1.393281 sigma = 0.000362 exact = 1.393204 error = 0.000077 = 0.21 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 @w{} @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 @w{} @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 gsl-doc-2.3/doc/rand-weibull.tex0000664000175000017500000006041412616157443014654 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-weibull.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-weibull.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -31 V 1452 31 R 0 -31 V 1453 31 R 0 -31 V 1452 31 R 0 -31 V 1452 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 3506 M 19 -19 V 20 -19 V 19 -19 V 20 -19 V 19 -18 V 20 -19 V 19 -18 V 19 -18 V 20 -19 V 19 -18 V 20 -18 V 19 -17 V 20 -18 V 19 -18 V 19 -17 V 20 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -16 V 19 -17 V 20 -17 V 19 -16 V 20 -16 V 19 -17 V 20 -16 V 19 -16 V 19 -16 V 20 -15 V 19 -16 V 20 -16 V 19 -15 V 20 -16 V 19 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -14 V 19 -15 V 19 -14 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 20 -14 V 19 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -12 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 20 -13 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -12 V 19 -12 V 20 -12 V 19 -11 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -11 V 19 -10 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 3052 2075 L 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 19 -8 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -9 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 5092 1346 L 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 38 V 20 39 V 19 38 V 20 39 V 19 38 V 20 38 V 19 39 V 19 38 V 20 38 V 19 38 V 20 38 V 19 38 V 20 37 V 19 38 V 19 37 V 20 37 V 19 38 V 20 36 V 19 37 V 20 37 V 19 36 V 19 36 V 20 36 V 19 36 V 20 35 V 19 35 V 20 35 V 19 35 V 19 34 V 20 34 V 19 34 V 20 34 V 19 33 V 20 33 V 19 33 V 19 32 V 20 32 V 19 31 V 20 31 V 19 31 V 20 31 V 19 30 V 19 30 V 20 29 V 19 29 V 20 29 V 19 28 V 20 28 V 19 27 V 19 27 V 20 26 V 19 26 V 20 26 V 19 25 V 20 25 V 19 24 V 19 24 V 20 23 V 19 23 V 20 23 V 19 22 V 20 21 V 19 21 V 19 21 V 20 20 V 19 19 V 20 19 V 19 19 V 20 18 V 19 18 V 19 17 V 20 16 V 19 16 V 20 16 V 19 15 V 20 15 V 19 14 V 19 13 V 20 13 V 19 13 V 20 12 V 19 12 V 20 11 V 19 10 V 19 10 V 20 10 V 19 9 V 20 9 V 19 8 V 20 7 V 19 8 V 19 6 V 20 6 V 19 6 V 20 5 V 19 5 V 20 4 V 19 4 V 19 3 V 20 3 V 19 2 V 20 2 V 3052 3096 L 20 1 V 19 0 V 19 0 V 20 0 V 19 -1 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -3 V 19 -4 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -6 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -8 V 19 -8 V 20 -8 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -10 V 19 -11 V 20 -10 V 19 -11 V 20 -11 V 19 -12 V 20 -12 V 19 -11 V 19 -13 V 20 -12 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -14 V 19 -13 V 20 -14 V 19 -15 V 20 -14 V 19 -14 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -16 V 19 -16 V 19 -15 V 20 -16 V 19 -16 V 20 -16 V 19 -16 V 20 -17 V 19 -16 V 19 -17 V 20 -16 V 19 -17 V 20 -16 V 19 -17 V 20 -17 V 19 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 19 -17 V 20 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 19 -17 V 20 -16 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -17 V 19 -16 V 20 -17 V 19 -16 V 20 -16 V 19 -16 V 20 -16 V 5092 1786 L 19 -16 V 20 -16 V 19 -16 V 20 -15 V 19 -16 V 20 -15 V 19 -16 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -14 V 20 -15 V 19 -15 V 19 -14 V 20 -14 V 19 -14 V 20 -14 V 19 -14 V 20 -14 V 19 -14 V 19 -13 V 20 -14 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -13 V 19 -12 V 20 -13 V 19 -12 V 20 -12 V 19 -13 V 20 -11 V 19 -12 V 19 -12 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V stroke LT2 LTb LT2 6077 4381 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 1 V 19 0 V 20 1 V 19 0 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 2 V 20 1 V 19 2 V 20 2 V 19 1 V 20 2 V 19 2 V 19 2 V 20 3 V 19 2 V 20 2 V 19 3 V 20 2 V 19 3 V 19 3 V 20 2 V 19 3 V 20 3 V 19 3 V 20 4 V 19 3 V 19 3 V 20 4 V 19 4 V 20 3 V 19 4 V 20 4 V 19 4 V 19 4 V 20 4 V 19 4 V 20 5 V 19 4 V 20 5 V 19 4 V 19 5 V 20 5 V 19 5 V 20 5 V 19 5 V 20 5 V 19 5 V 19 6 V 20 5 V 19 6 V 20 5 V 19 6 V 20 6 V 19 6 V 19 6 V 20 6 V 19 6 V 20 6 V 19 6 V 20 7 V 19 6 V 19 7 V 20 7 V 19 6 V 20 7 V 19 7 V 20 7 V 19 7 V 19 7 V 20 8 V 19 7 V 20 7 V 19 8 V 20 7 V 19 8 V 19 8 V 20 7 V 19 8 V 20 8 V 19 8 V 20 8 V 19 8 V 19 9 V 20 8 V 19 8 V 20 9 V 19 8 V 20 9 V 19 8 V 19 9 V 20 9 V 19 9 V 20 8 V 3052 1122 L 20 9 V 19 9 V 19 9 V 20 10 V 19 9 V 20 9 V 19 9 V 20 10 V 19 9 V 19 10 V 20 9 V 19 10 V 20 9 V 19 10 V 20 10 V 19 9 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 19 11 V 20 10 V 19 10 V 20 10 V 19 11 V 20 10 V 19 10 V 19 11 V 20 10 V 19 10 V 20 11 V 19 10 V 20 10 V 19 11 V 19 10 V 20 10 V 19 11 V 20 10 V 19 10 V 19 11 V 20 10 V 19 10 V 20 11 V 19 10 V 20 10 V 19 10 V 19 11 V 20 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 19 9 V 20 10 V 19 10 V 20 9 V 19 10 V 20 9 V 19 10 V 19 9 V 20 9 V 19 10 V 20 9 V 19 9 V 20 9 V 19 9 V 19 9 V 20 9 V 19 8 V 20 9 V 19 9 V 20 8 V 19 9 V 19 8 V 20 8 V 19 9 V 20 8 V 19 8 V 20 8 V 19 7 V 19 8 V 20 8 V 19 7 V 20 8 V 19 7 V 20 7 V 5092 2122 L 19 7 V 20 7 V 19 6 V 20 7 V 19 7 V 20 6 V 19 7 V 19 6 V 20 6 V 19 6 V 20 6 V 19 6 V 20 5 V 19 6 V 19 5 V 20 6 V 19 5 V 20 5 V 19 5 V 20 5 V 19 4 V 19 5 V 20 4 V 19 5 V 20 4 V 19 4 V 20 4 V 19 3 V 19 4 V 20 3 V 19 4 V 20 3 V 19 3 V 20 3 V 19 2 V 19 3 V 20 2 V 19 3 V 20 2 V 19 2 V 20 2 V 19 2 V 19 1 V 20 2 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 0 V 20 1 V 19 0 V 20 0 V 19 0 V 20 0 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4381){\rjust{\strut{}$a=2,b=3$}}% \put(5957,4581){\rjust{\strut{}$a=1,b=2$}}% \put(5957,4781){\rjust{\strut{}$a=1,b=1$}}% \put(3955,5244){\cjust{\strut{}Weibull Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}2}}% \put(5408,400){\cjust{\strut{}1.5}}% \put(3956,400){\cjust{\strut{}1}}% \put(2503,400){\cjust{\strut{}0.5}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1.5}}% \put(900,3506){\rjust{\strut{} 1}}% \put(900,2069){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/bspline.eps0000664000175000017500000033422712616157443013720 0ustar eddedd%!PS-Adobe-3.0 EPSF-3.0 %%Creator: GNU libplot drawing library 4.2 %%Title: PostScript plot %%CreationDate: Fri Nov 2 13:18:54 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.123234e-17 1 -1 6.123234e-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 8726 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 8382 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 8371 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 7656 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 7274 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 7605 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 7630 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 7691 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 7338 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 6935 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 6893 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 6855 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 6753 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 6390 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 6199 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 6064 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 5829 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 5639 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 5483 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 5279 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 5093 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 4937 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 4752 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 4536 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 4368 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 4294 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 4077 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 3710 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 3814 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 3703 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 3573 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 3923 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 3250 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 3295 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 3272 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 3023 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 2796 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 3201 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 2843 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 2711 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 3280 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 3283 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 2745 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 3422 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 2947 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 3099 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 3519 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 3594 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 3431 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 3791 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 3869 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 3878 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 4047 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 4234 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 4254 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 4518 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 4612 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 4884 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 4957 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 5085 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 5236 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 5373 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 5488 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 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 4596 5803 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 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 4666 6082 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 6098 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 6382 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 6272 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 6543 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 6442 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 6608 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 6895 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 6807 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 7300 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 7121 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 7153 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 7007 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 6747 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 6974 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 6989 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 6529 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 6784 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 6517 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 6660 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 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 5395 6594 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 6672 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 6528 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 6304 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 6318 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 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 5604 6356 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 6312 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 6064 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 5967 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 5923 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 5774 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 5628 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 5549 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 5459 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 5334 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 5230 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 5140 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 5064 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 4985 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 4859 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 4671 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 4756 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 4667 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 4531 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 4437 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 4176 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 4301 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 4248 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 4321 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 4018 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 4221 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 3938 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 4095 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 4252 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 4099 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 4177 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 4045 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 4018 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 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 6785 4266 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 4199 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 4365 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 4399 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 4330 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 4439 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 4551 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 4543 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 4677 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 4713 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 4761 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 4734 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 4961 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 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 7271 5051 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 5145 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 5241 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 5319 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 5392 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 5428 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 5515 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 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 7549 5671 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 5729 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 5800 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 5888 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 5862 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 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 7757 5983 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 6033 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 6170 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 5989 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 6199 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 6052 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 6206 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 6191 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 6193 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 6229 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 6143 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 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 8174 6220 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 6082 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 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 8278 5967 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 6104 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 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 8382 5899 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 5996 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 5780 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 5888 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 5780 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 5743 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 5754 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 5663 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 5558 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 5498 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 5432 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 5389 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 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 8834 5287 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 5221 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 5180 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 5136 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 5095 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 5015 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 4917 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 4909 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 4914 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 4849 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 4839 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 4819 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 8375 2350 8317 2396 8230 2442 8114 2488 7974 2534 7812 2580 7629 2627 7429 2673 7213 2719 6985 2765 6747 2811 6500 2857 6249 2903 5994 2949 5739 2995 5486 3041 5237 3087 4996 3133 4763 3180 4539 3226 4327 3272 4127 3318 3940 3364 3768 3410 3611 3456 3470 3502 3347 3548 3242 3594 3158 3640 3094 3686 3052 3732 3033 3779 3038 3825 3069 3871 3125 3917 3207 3963 3311 4009 3436 4055 3579 4101 3737 4147 3909 4193 4091 4239 4283 4285 4480 4332 4682 4378 4884 4424 5087 4470 5285 4516 5479 4562 5664 4608 5839 4654 6002 4700 6152 4746 6289 4792 6413 4838 6523 4884 6620 4931 6704 4977 6773 5023 6828 5069 6869 5115 6896 5161 6908 5207 6905 5253 6887 5299 6854 5345 6805 5391 6742 5437 6663 5484 6570 5530 6466 5576 6351 5622 6227 5668 6097 5714 5960 5760 5820 5806 5677 5852 5533 5898 5390 5944 5249 5990 5113 6036 4981 6083 4857 6129 4741 6175 4636 6221 4541 6267 4457 6313 4384 6359 4321 6405 4268 6451 4226 6497 4195 6543 4174 6589 4163 6636 4162 6682 4172 6728 4191 6774 4221 6820 4261 6866 4310 6912 4370 6958 4439 7004 4517 7050 4603 7096 4694 7142 4791 7188 4892 7235 4996 7281 5102 7327 5208 7373 5313 7419 5416 7465 5517 7511 5613 7557 5704 7603 5789 7649 5865 7695 5933 7741 5992 7788 6041 7834 6081 7880 6112 7926 6135 7972 6150 8018 6156 8064 6155 8110 6146 8156 6130 8202 6108 8248 6078 8294 6042 8340 6000 8387 5952 8433 5898 8479 5839 8525 5775 8571 5707 8617 5636 8663 5563 8709 5488 8755 5413 8801 5337 8847 5263 8893 5190 8940 5121 8986 5054 9032 4992 9078 4935 9124 4884 9170 4840 9216 4803 151 MLine End %%PageTrailer End %I eop showpage %%Trailer end %%EOF gsl-doc-2.3/doc/specfunc-coupling.texi0000664000175000017500000000634312616157443016065 0ustar eddedd@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 gsl-doc-2.3/doc/specfunc-coulomb.texi0000664000175000017500000001435012616157443015702 0ustar eddedd@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 gsl-doc-2.3/doc/specfunc-gegenbauer.texi0000664000175000017500000000377512616157443016357 0ustar eddedd@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 gsl-doc-2.3/doc/algorithm.sty0000664000175000017500000000425712616157443014277 0ustar eddedd% 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}} gsl-doc-2.3/doc/calc.sty0000664000175000017500000001345612616157443013214 0ustar eddedd%% %% 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'. gsl-doc-2.3/doc/rand-geometric.tex0000664000175000017500000004702312616157443015170 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-geometric.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-geometric.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1051 631 M 0 -63 V 484 63 R 0 -31 V 484 31 R 0 -63 V 484 63 R 0 -31 V 484 31 R 0 -63 V 484 63 R 0 -31 V 484 31 R 0 -63 V 485 63 R 0 -31 V 484 31 R 0 -63 V 484 63 R 0 -31 V 484 31 R 0 -63 V 484 63 R 0 -31 V 484 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 3081 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -1541 V 3013 2171 L 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -770 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -385 V 19 0 V 19 0 V 20 0 V 5014 1016 L 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -192 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -97 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.5$}}% \put(3955,5244){\cjust{\strut{}Geometric Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6376,400){\cjust{\strut{}5}}% \put(5408,400){\cjust{\strut{}4}}% \put(4440,400){\cjust{\strut{}3}}% \put(3471,400){\cjust{\strut{}2}}% \put(2503,400){\cjust{\strut{}1}}% \put(1535,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.7}}% \put(900,4328){\rjust{\strut{} 0.6}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,3096){\rjust{\strut{} 0.4}}% \put(900,2479){\rjust{\strut{} 0.3}}% \put(900,1863){\rjust{\strut{} 0.2}}% \put(900,1247){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/fdl.texi0000664000175000017500000005611712616157443013212 0ustar eddedd@c The GNU Free Documentation License. @center Version 1.3, 3 November 2008 @iftex @smallerfonts @rm @end iftex @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. @uref{http://fsf.org/} 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. The ``publisher'' means any person or entity that distributes copies of the Document to the public. 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 under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. @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. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. @item RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. @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.3 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@dots{}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: gsl-doc-2.3/doc/specfunc-legendre.texi0000664000175000017500000005122012616157443016024 0ustar eddedd@cindex Legendre polynomials @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 arrays of Legendre polynomials @math{P_l(x)} and 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)} which are solutions of the differential equation @tex \beforedisplay $$ (1 - x^2) {d^2 \over dx^2} P_l^m(x) - 2x {d \over dx} P_l^m(x) + \left( l(l+1) - {m^2 \over 1 - x^2} \right) P_l^m(x) = 0 $$ \afterdisplay @end tex @ifinfo @example (1 - x^2) d^2 P_l^m(x) / dx^2 P_l^m(x) - 2x d/dx P_l^m(x) + ( l(l+1) - m^2 / (1 - x^2) ) P_l^m(x) = 0 @end example @end ifinfo where the degree @math{l} and order @math{m} satisfy @math{0 \le l} and @math{0 \le m \le l}. The functions @math{P_l^m(x)} grow combinatorially with @math{l} and can overflow for @math{l} larger than about 150. Alternatively, one may calculate normalized associated Legendre polynomials. There are a number of different normalization conventions, and these functions can be stably computed up to degree and order 2700. The following normalizations are provided: @table @code @item Schmidt semi-normalization Schmidt semi-normalized associated Legendre polynomials are often used in the magnetics community and are defined as @tex \beforedisplay $$ \eqalign{ S_l^0(x) &= P_l^0(x) \cr S_l^m(x) &= (-1)^m \sqrt{2 {(l-m)! \over (l+m)!}} P_l^m(x), m > 0 } $$ \afterdisplay @end tex @ifinfo @example S_l^0(x) = P_l^0(x) S_l^m(x) = (-1)^m \sqrt((2(l-m)! / (l+m)!)) P_l^m(x), m > 0 @end example @end ifinfo The factor of @math{(-1)^m} is called the Condon-Shortley phase factor and can be excluded if desired by setting the parameter @code{csphase = 1} in the functions below. @item Spherical Harmonic Normalization The associated Legendre polynomials suitable for calculating spherical harmonics are defined as @tex \beforedisplay $$ Y_l^m(x) = (-1)^m \sqrt{{2l + 1 \over 4 \pi} {(l-m)! \over (l+m)!}} P_l^m(x) $$ \afterdisplay @end tex @ifinfo @example Y_l^m(x) = (-1)^m \sqrt((2l + 1) * (l-m)! / (4 \pi) / (l+m)!) P_l^m(x) @end example @end ifinfo where again the phase factor @math{(-1)^m} can be included or excluded if desired. @item Full Normalization The fully normalized associated Legendre polynomials are defined as @tex \beforedisplay $$ N_l^m(x) = (-1)^m \sqrt{(l + {1 \over 2}) {(l-m)! \over (l+m)!}} P_l^m(x) $$ \afterdisplay @end tex @ifinfo @example N_l^m(x) = (-1)^m \sqrt((l + 1/2) * (l-m)! / (l+m)!) P_l^m(x) @end example @end ifinfo and have the property @tex \beforedisplay $$ \int_{-1}^1 N_l^m(x)^2 dx = 1 $$ \afterdisplay @end tex @ifinfo @example \int_(-1)^1 ( N_l^m(x) )^2 dx = 1 @end example @end ifinfo @end table The normalized associated Legendre routines below use a recurrence relation which is stable up to a degree and order of about 2700. Beyond this, the computed functions could suffer from underflow leading to incorrect results. Routines are provided to compute first and second derivatives @math{dP_l^m(x)/dx} and @math{d^2 P_l^m(x)/dx^2} as well as their alternate versions @math{d P_l^m(\cos{\theta})/d\theta} and @math{d^2 P_l^m(\cos{\theta})/d\theta^2}. While there is a simple scaling relationship between the two forms, the derivatives involving @math{\theta} are heavily used in spherical harmonic expansions and so these routines are also provided. In the functions below, a parameter of type @code{gsl_sf_legendre_t} specifies the type of normalization to use. The possible values are @table @code @item GSL_SF_LEGENDRE_NONE This specifies the computation of the unnormalized associated Legendre polynomials @math{P_l^m(x)}. @item GSL_SF_LEGENDRE_SCHMIDT This specifies the computation of the Schmidt semi-normalized associated Legendre polynomials @math{S_l^m(x)}. @item GSL_SF_LEGENDRE_SPHARM This specifies the computation of the spherical harmonic associated Legendre polynomials @math{Y_l^m(x)}. @item GSL_SF_LEGENDRE_FULL This specifies the computation of the fully normalized associated Legendre polynomials @math{N_l^m(x)}. @end table @deftypefun int gsl_sf_legendre_array (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, double @var{result_array}[]) @deftypefunx int gsl_sf_legendre_array_e (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, const double @var{csphase}, double @var{result_array}[]) These functions calculate all normalized associated Legendre polynomials for @math{0 \le l \le lmax} and @math{0 \le m \le l} for @c{$|x| \le 1$} @math{|x| <= 1}. The @var{norm} parameter specifies which normalization is used. The normalized @math{P_l^m(x)} values are stored in @var{result_array}, whose minimum size can be obtained from calling @code{gsl_sf_legendre_array_n}. The array index of @math{P_l^m(x)} is obtained from calling @code{gsl_sf_legendre_array_index(l, m)}. To include or exclude the Condon-Shortley phase factor of @math{(-1)^m}, set the parameter @var{csphase} to either @math{-1} or @math{1} respectively in the @code{_e} function. This factor is included by default. @end deftypefun @deftypefun int gsl_sf_legendre_deriv_array (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[]) @deftypefunx int gsl_sf_legendre_deriv_array_e (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, const double @var{csphase}, double @var{result_array}[], double @var{result_deriv_array}[]) These functions calculate all normalized associated Legendre functions and their first derivatives up to degree @var{lmax} for @c{$|x| < 1$} @math{|x| < 1}. The parameter @var{norm} specifies the normalization used. The normalized @math{P_l^m(x)} values and their derivatives @math{dP_l^m(x)/dx} are stored in @var{result_array} and @var{result_deriv_array} respectively. To include or exclude the Condon-Shortley phase factor of @math{(-1)^m}, set the parameter @var{csphase} to either @math{-1} or @math{1} respectively in the @code{_e} function. This factor is included by default. @end deftypefun @deftypefun int gsl_sf_legendre_deriv_alt_array (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[]) @deftypefunx int gsl_sf_legendre_deriv_alt_array_e (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, const double @var{csphase}, double @var{result_array}[], double @var{result_deriv_array}[]) These functions calculate all normalized associated Legendre functions and their (alternate) first derivatives up to degree @var{lmax} for @c{$|x| < 1$} @math{|x| < 1}. The normalized @math{P_l^m(x)} values and their derivatives @math{dP_l^m(\cos{\theta})/d\theta} are stored in @var{result_array} and @var{result_deriv_array} respectively. To include or exclude the Condon-Shortley phase factor of @math{(-1)^m}, set the parameter @var{csphase} to either @math{-1} or @math{1} respectively in the @code{_e} function. This factor is included by default. @end deftypefun @deftypefun int gsl_sf_legendre_deriv2_array (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[], double @var{result_deriv2_array}[]) @deftypefunx int gsl_sf_legendre_deriv2_array_e (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, const double @var{csphase}, double @var{result_array}[], double @var{result_deriv_array}[], double @var{result_deriv2_array}[]) These functions calculate all normalized associated Legendre functions and their first and second derivatives up to degree @var{lmax} for @c{$|x| < 1$} @math{|x| < 1}. The parameter @var{norm} specifies the normalization used. The normalized @math{P_l^m(x)}, their first derivatives @math{dP_l^m(x)/dx}, and their second derivatives @math{d^2 P_l^m(x)/dx^2} are stored in @var{result_array}, @var{result_deriv_array}, and @var{result_deriv2_array} respectively. To include or exclude the Condon-Shortley phase factor of @math{(-1)^m}, set the parameter @var{csphase} to either @math{-1} or @math{1} respectively in the @code{_e} function. This factor is included by default. @end deftypefun @deftypefun int gsl_sf_legendre_deriv2_alt_array (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[], double @var{result_deriv2_array}[]) @deftypefunx int gsl_sf_legendre_deriv2_alt_array_e (const gsl_sf_legendre_t @var{norm}, const size_t @var{lmax}, const double @var{x}, const double @var{csphase}, double @var{result_array}[], double @var{result_deriv_array}[], double @var{result_deriv2_array}[]) These functions calculate all normalized associated Legendre functions and their (alternate) first and second derivatives up to degree @var{lmax} for @c{$|x| < 1$} @math{|x| < 1}. The parameter @var{norm} specifies the normalization used. The normalized @math{P_l^m(x)}, their first derivatives @math{dP_l^m(\cos{\theta})/d\theta}, and their second derivatives @math{d^2 P_l^m(\cos{\theta})/d\theta^2} are stored in @var{result_array}, @var{result_deriv_array}, and @var{result_deriv2_array} respectively. To include or exclude the Condon-Shortley phase factor of @math{(-1)^m}, set the parameter @var{csphase} to either @math{-1} or @math{1} respectively in the @code{_e} function. This factor is included by default. @end deftypefun @deftypefun size_t gsl_sf_legendre_array_n (const size_t @var{lmax}) This function returns the minimum array size for maximum degree @var{lmax} needed for the array versions of the associated Legendre functions. Size is calculated as the total number of @math{P_l^m(x)} functions, plus extra space for precomputing multiplicative factors used in the recurrence relations. @end deftypefun @deftypefun size_t gsl_sf_legendre_array_index (const size_t @var{l}, const size_t @var{m}) This function returns the index into @var{result_array}, @var{result_deriv_array}, or @var{result_deriv2_array} corresponding to @math{P_l^m(x)}, @math{P_l^{'m}(x)}, or @math{P_l^{''m}(x)}. The index is given by @math{l(l+1)/2 + m}. @end deftypefun @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 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_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 are now deprecated and will be removed in a future release; see @code{gsl_sf_legendre_array} and @code{gsl_sf_legendre_deriv_array}. @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 are now deprecated and will be removed in a future release; see @code{gsl_sf_legendre_array} and @code{gsl_sf_legendre_deriv_array}. @end deftypefun @deftypefun int gsl_sf_legendre_array_size (const int @var{lmax}, const int @var{m}) This function is now deprecated and will be removed in a future release. @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 gsl-doc-2.3/doc/stamp-vti0000664000175000017500000000013513022372557013403 0ustar eddedd@set UPDATED 29 August 2016 @set UPDATED-MONTH August 2016 @set EDITION 2.3 @set VERSION 2.3 gsl-doc-2.3/doc/12-cities.eps0000664000175000017500000061234012616157443013757 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-lognormal.tex0000664000175000017500000005341512616157443015206 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-lognormal.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-lognormal.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 3081 R -31 0 V 1051 631 M 0 -31 V 1936 31 R 0 -31 V 1937 31 R 0 -31 V 1936 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1070 637 M 20 53 V 19 118 V 20 171 V 19 209 V 20 231 V 19 241 V 19 243 V 20 239 V 19 232 V 20 220 V 19 209 V 20 195 V 19 183 V 19 168 V 20 156 V 19 142 V 20 130 V 19 119 V 20 108 V 19 97 V 19 87 V 20 78 V 19 70 V 20 61 V 19 54 V 20 47 V 19 41 V 19 35 V 20 29 V 19 24 V 20 19 V 19 15 V 20 11 V 19 7 V 19 4 V 20 0 V 19 -2 V 20 -5 V 19 -8 V 20 -10 V 19 -12 V 19 -13 V 20 -16 V 19 -17 V 20 -19 V 19 -20 V 20 -22 V 19 -22 V 19 -24 V 20 -24 V 19 -25 V 20 -26 V 19 -27 V 20 -27 V 19 -28 V 19 -28 V 20 -29 V 19 -29 V 20 -29 V 19 -30 V 20 -30 V 19 -30 V 19 -30 V 20 -30 V 19 -30 V 20 -31 V 19 -30 V 20 -31 V 19 -30 V 19 -30 V 20 -31 V 19 -30 V 20 -30 V 19 -30 V 20 -30 V 19 -30 V 19 -29 V 20 -30 V 19 -29 V 20 -29 V 19 -29 V 20 -28 V 19 -29 V 19 -28 V 20 -28 V 19 -28 V 20 -28 V 19 -27 V 20 -27 V 19 -27 V 19 -27 V 20 -26 V 19 -26 V 20 -26 V 19 -26 V 20 -25 V 19 -25 V 19 -25 V 20 -25 V 19 -25 V 20 -24 V 19 -24 V 3072 2985 L 19 -24 V 19 -23 V 20 -23 V 19 -23 V 20 -22 V 19 -23 V 20 -22 V 19 -21 V 19 -22 V 20 -21 V 19 -21 V 20 -21 V 19 -21 V 20 -20 V 19 -20 V 19 -20 V 20 -20 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -18 V 19 -19 V 20 -18 V 19 -18 V 20 -18 V 19 -17 V 20 -18 V 19 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -16 V 19 -16 V 20 -16 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 19 -14 V 20 -14 V 19 -15 V 20 -14 V 19 -14 V 19 -13 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 20 -13 V 19 -12 V 19 -13 V 20 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 19 -10 V 20 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 19 -9 V 20 -9 V 19 -8 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 5111 1522 L 20 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1070 631 M 20 1 V 19 2 V 20 5 V 19 9 V 20 12 V 19 15 V 19 18 V 20 21 V 19 23 V 20 25 V 19 28 V 20 28 V 19 30 V 19 31 V 20 32 V 19 32 V 20 33 V 19 33 V 20 32 V 19 33 V 19 33 V 20 33 V 19 32 V 20 32 V 19 31 V 20 31 V 19 31 V 19 30 V 20 29 V 19 29 V 20 28 V 19 27 V 20 27 V 19 26 V 19 26 V 20 24 V 19 25 V 20 23 V 19 23 V 20 22 V 19 21 V 19 21 V 20 20 V 19 20 V 20 19 V 19 18 V 20 18 V 19 17 V 19 16 V 20 16 V 19 16 V 20 14 V 19 15 V 20 13 V 19 14 V 19 12 V 20 13 V 19 11 V 20 12 V 19 11 V 20 10 V 19 10 V 19 10 V 20 9 V 19 8 V 20 9 V 19 8 V 20 7 V 19 8 V 19 7 V 20 6 V 19 6 V 20 6 V 19 6 V 20 5 V 19 5 V 19 5 V 20 4 V 19 4 V 20 4 V 19 4 V 20 3 V 19 3 V 19 3 V 20 3 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 20 0 V 19 1 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 3072 2121 L 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 5111 1764 L 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\zeta=1, \sigma=1$}}% \put(5957,4781){\rjust{\strut{}$\zeta=0, \sigma=1$}}% \put(3955,5244){\cjust{\strut{}Lognormal Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}3}}% \put(4924,400){\cjust{\strut{}2}}% \put(2987,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/gsl-ref.info-20000644000175000017500000110711713022372743014113 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  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 #include #include #include 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 #include 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: Multisets, 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. An inline version of this function is used when 'HAVE_INLINE' is defined.  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. In ISO C99 the type modifier 'z' represents 'size_t', so '"%zu\n"' is a suitable format.(1) 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. ---------- Footnotes ---------- (1) In versions of the GNU C library prior to the ISO C99 standard, the type modifier 'Z' was used instead.  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 #include 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: Multisets, Next: Sorting, Prev: Combinations, Up: Top 11 Multisets ************ This chapter describes functions for creating and manipulating multisets. A multiset c is represented by an array of k integers in the range 0 to n-1, where each value c_i may occur more than once. The multiset c corresponds to indices of k elements chosen from an n element vector with replacement. In mathematical terms, n is the cardinality of the multiset while k is the maximum multiplicity of any value. Multisets are useful, for example, when iterating over the indices of a k-th order symmetric tensor in n-space. The functions described in this chapter are defined in the header file 'gsl_multiset.h'. * Menu: * The Multiset struct:: * Multiset allocation:: * Accessing multiset elements:: * Multiset properties:: * Multiset functions:: * Reading and writing multisets:: * Multiset Examples::  File: gsl-ref.info, Node: The Multiset struct, Next: Multiset allocation, Up: Multisets 11.1 The Multiset struct ======================== A multiset is defined by a structure containing three components, the values of n and k, and a pointer to the multiset array. The elements of the multiset array are all of type 'size_t', and are stored in increasing order. The 'gsl_multiset' structure looks like this, typedef struct { size_t n; size_t k; size_t *data; } gsl_multiset;  File: gsl-ref.info, Node: Multiset allocation, Next: Accessing multiset elements, Prev: The Multiset struct, Up: Multisets 11.2 Multiset allocation ======================== -- Function: gsl_multiset * gsl_multiset_alloc (size_t N, size_t K) This function allocates memory for a new multiset with parameters N, K. The multiset is not initialized and its elements are undefined. Use the function 'gsl_multiset_calloc' if you want to create a multiset which is initialized to the lexicographically first multiset element. A null pointer is returned if insufficient memory is available to create the multiset. -- Function: gsl_multiset * gsl_multiset_calloc (size_t N, size_t K) This function allocates memory for a new multiset with parameters N, K and initializes it to the lexicographically first multiset element. A null pointer is returned if insufficient memory is available to create the multiset. -- Function: void gsl_multiset_init_first (gsl_multiset * C) This function initializes the multiset C to the lexicographically first multiset element, i.e. 0 repeated k times. -- Function: void gsl_multiset_init_last (gsl_multiset * C) This function initializes the multiset C to the lexicographically last multiset element, i.e. n-1 repeated k times. -- Function: void gsl_multiset_free (gsl_multiset * C) This function frees all the memory used by the multiset C. -- Function: int gsl_multiset_memcpy (gsl_multiset * DEST, const gsl_multiset * SRC) This function copies the elements of the multiset SRC into the multiset DEST. The two multisets must have the same size.  File: gsl-ref.info, Node: Accessing multiset elements, Next: Multiset properties, Prev: Multiset allocation, Up: Multisets 11.3 Accessing multiset elements ================================ The following function can be used to access the elements of a multiset. -- Function: size_t gsl_multiset_get (const gsl_multiset * C, const size_t I) This function returns the value of the I-th element of the multiset C. If I lies outside the allowed range of 0 to K-1 then the error handler is invoked and 0 is returned. An inline version of this function is used when 'HAVE_INLINE' is defined.  File: gsl-ref.info, Node: Multiset properties, Next: Multiset functions, Prev: Accessing multiset elements, Up: Multisets 11.4 Multiset properties ======================== -- Function: size_t gsl_multiset_n (const gsl_multiset * C) This function returns the range (n) of the multiset C. -- Function: size_t gsl_multiset_k (const gsl_multiset * C) This function returns the number of elements (k) in the multiset C. -- Function: size_t * gsl_multiset_data (const gsl_multiset * C) This function returns a pointer to the array of elements in the multiset C. -- Function: int gsl_multiset_valid (gsl_multiset * C) This function checks that the multiset C is valid. The K elements should lie in the range 0 to N-1, with each value occurring in nondecreasing order.  File: gsl-ref.info, Node: Multiset functions, Next: Reading and writing multisets, Prev: Multiset properties, Up: Multisets 11.5 Multiset functions ======================= -- Function: int gsl_multiset_next (gsl_multiset * C) This function advances the multiset C to the next multiset element in lexicographic order and returns 'GSL_SUCCESS'. If no further multisets elements are available it returns 'GSL_FAILURE' and leaves C unmodified. Starting with the first multiset and repeatedly applying this function will iterate through all possible multisets of a given order. -- Function: int gsl_multiset_prev (gsl_multiset * C) This function steps backwards from the multiset C to the previous multiset element in lexicographic order, returning 'GSL_SUCCESS'. If no previous multiset is available it returns 'GSL_FAILURE' and leaves C unmodified.  File: gsl-ref.info, Node: Reading and writing multisets, Next: Multiset Examples, Prev: Multiset functions, Up: Multisets 11.6 Reading and writing multisets ================================== The library provides functions for reading and writing multisets to a file as binary data or formatted text. -- Function: int gsl_multiset_fwrite (FILE * STREAM, const gsl_multiset * C) This function writes the elements of the multiset 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_multiset_fread (FILE * STREAM, gsl_multiset * C) This function reads elements from the open stream STREAM into the multiset C in binary format. The multiset 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_multiset_fprintf (FILE * STREAM, const gsl_multiset * C, const char * FORMAT) This function writes the elements of the multiset C line-by-line to the stream STREAM using the format specifier FORMAT, which should be suitable for a type of SIZE_T. In ISO C99 the type modifier 'z' represents 'size_t', so '"%zu\n"' is a suitable format.(1) The function returns 'GSL_EFAILED' if there was a problem writing to the file. -- Function: int gsl_multiset_fscanf (FILE * STREAM, gsl_multiset * C) This function reads formatted data from the stream STREAM into the multiset C. The multiset 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. ---------- Footnotes ---------- (1) In versions of the GNU C library prior to the ISO C99 standard, the type modifier 'Z' was used instead.  File: gsl-ref.info, Node: Multiset Examples, Prev: Reading and writing multisets, Up: Multisets 11.7 Examples ============= The example program below prints all multisets elements containing the values {0,1,2,3} ordered by size. Multiset elements of the same size are ordered lexicographically. #include #include int main (void) { gsl_multiset * c; size_t i; printf ("All multisets of {0,1,2,3} by size:\n") ; for (i = 0; i <= 4; i++) { c = gsl_multiset_calloc (4, i); do { printf ("{"); gsl_multiset_fprintf (stdout, c, " %u"); printf (" }\n"); } while (gsl_multiset_next (c) == GSL_SUCCESS); gsl_multiset_free (c); } return 0; } Here is the output from the program, $ ./a.out All multisets of {0,1,2,3} by size: { } { 0 } { 1 } { 2 } { 3 } { 0 0 } { 0 1 } { 0 2 } { 0 3 } { 1 1 } { 1 2 } { 1 3 } { 2 2 } { 2 3 } { 3 3 } { 0 0 0 } { 0 0 1 } { 0 0 2 } { 0 0 3 } { 0 1 1 } { 0 1 2 } { 0 1 3 } { 0 2 2 } { 0 2 3 } { 0 3 3 } { 1 1 1 } { 1 1 2 } { 1 1 3 } { 1 2 2 } { 1 2 3 } { 1 3 3 } { 2 2 2 } { 2 2 3 } { 2 3 3 } { 3 3 3 } { 0 0 0 0 } { 0 0 0 1 } { 0 0 0 2 } { 0 0 0 3 } { 0 0 1 1 } { 0 0 1 2 } { 0 0 1 3 } { 0 0 2 2 } { 0 0 2 3 } { 0 0 3 3 } { 0 1 1 1 } { 0 1 1 2 } { 0 1 1 3 } { 0 1 2 2 } { 0 1 2 3 } { 0 1 3 3 } { 0 2 2 2 } { 0 2 2 3 } { 0 2 3 3 } { 0 3 3 3 } { 1 1 1 1 } { 1 1 1 2 } { 1 1 1 3 } { 1 1 2 2 } { 1 1 2 3 } { 1 1 3 3 } { 1 2 2 2 } { 1 2 2 3 } { 1 2 3 3 } { 1 3 3 3 } { 2 2 2 2 } { 2 2 2 3 } { 2 2 3 3 } { 2 3 3 3 } { 3 3 3 3 } All 70 multisets are generated and sorted lexicographically.  File: gsl-ref.info, Node: Sorting, Next: BLAS Support, Prev: Multisets, Up: Top 12 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 12.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 12.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, const 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_sort2 (double * DATA1, const size_t STRIDE1, double * DATA2, const size_t STRIDE2, size_t N) This function sorts the N elements of the array DATA1 with stride STRIDE1 into ascending numerical order, while making the same rearrangement of the array DATA2 with stride STRIDE2, also of size N. -- 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_vector2 (gsl_vector * V1, gsl_vector * V2) This function sorts the elements of the vector V1 into ascending numerical order, while making the same rearrangement of the vector V2. -- 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.  File: gsl-ref.info, Node: Selecting the k smallest or largest elements, Next: Computing the rank, Prev: Sorting vectors, Up: Sorting 12.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 12.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 12.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 #include 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 ("%zu smallest values from %zu\n", k, N); for (i = 0; i < k; i++) { printf ("%zu: %.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 12.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 13 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 described in this chapter. The functions are declared in the file 'gsl_blas.h' and 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. Similarly, GSL vectors are restricted to positive strides, whereas the low-level CBLAS interface supports negative strides as specified in the BLAS standard.(1) The interface for the 'gsl_cblas' layer is specified in the file 'gsl_cblas.h'. This interface corresponds to the BLAS Technical Forum's 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 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". Note that the vector and matrix arguments to BLAS functions must not be aliased, as the results are undefined when the underlying arrays overlap (*note Aliasing of arrays::). * Menu: * GSL BLAS Interface:: * BLAS Examples:: * BLAS References and Further Reading:: ---------- Footnotes ---------- (1) In the low-level CBLAS interface, a negative stride accesses the vector elements in reverse order, i.e. the i-th element is given by (N-i)*|incx| for incx < 0.  File: gsl-ref.info, Node: GSL BLAS Interface, Next: BLAS Examples, Up: BLAS Support 13.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 13.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 DOTU -- 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 DOTC -- 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 13.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 13.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 '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. -- 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 13.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 #include 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 13.3 References and Further Reading =================================== Information on the BLAS standards, including both the legacy and updated interface standards, is available online from the BLAS Homepage and BLAS Technical Forum web-site. 'BLAS Homepage' 'BLAS Technical Forum' 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 . 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 14 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' with Level-1 and Level-2 BLAS calls for efficiency. 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:: * Complete Orthogonal Decomposition:: * Singular Value Decomposition:: * Cholesky Decomposition:: * Pivoted Cholesky Decomposition:: * Modified Cholesky Decomposition:: * Tridiagonal Decomposition of Real Symmetric Matrices:: * Tridiagonal Decomposition of Hermitian Matrices:: * Hessenberg Decomposition of Real Matrices:: * Hessenberg-Triangular Decomposition of Real Matrices:: * Bidiagonalization:: * Givens Rotations:: * Householder Transformations:: * Householder solver for linear systems:: * Tridiagonal Systems:: * Triangular Systems:: * Balancing:: * Linear Algebra Examples:: * Linear Algebra References and Further Reading::  File: gsl-ref.info, Node: LU Decomposition, Next: QR Decomposition, Up: Linear Algebra 14.1 LU Decomposition ===================== A general N-by-N 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 on output. 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' as input. -- 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 precomputed 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 * WORK) -- 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 * WORK) These functions apply an iterative improvement to X, the solution of A x = b, from the precomputed LU decomposition of A into (LU,P). Additional workspace of length N is required in WORK. -- 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 14.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 held in (QR, TAU) which must have been computed previously with '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 held in (QR,TAU) which must have been computed previously 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 requires as input 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_QTmat (const gsl_matrix * QR, const gsl_vector * TAU, gsl_matrix * A) This function applies the matrix Q^T encoded in the decomposition (QR,TAU) to the matrix A, storing the result Q^T A in A. 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_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: Complete Orthogonal Decomposition, Prev: QR Decomposition, Up: Linear Algebra 14.3 QR Decomposition with Column Pivoting ========================================== The QR decomposition of an M-by-N matrix A 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. When A is rank deficient with r = {\rm rank}(A), the matrix R can be partitioned as R = [ R11 R12; 0 R22 ] =~ [ R11 R12; 0 0 ] where R_{11} is r-by-r and nonsingular. In this case, a "basic" least squares solution for the overdetermined system A x = b can be obtained as x = P [ R11^-1 c1 ; 0 ] where c_1 consists of the first r elements of Q^T b. This basic solution is not guaranteed to be the minimum norm solution unless R_{12} = 0 (see *note Complete Orthogonal Decomposition::). -- 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 held in (QR, TAU, P) which must have been computed previously 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 held in (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_lssolve (const gsl_matrix * QR, const gsl_vector * TAU, const gsl_permutation * P, 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 and is assumed to have full rank. The least squares solution minimizes the Euclidean norm of the residual, ||b - A x||. The routine requires as input the QR decomposition of A into (QR, TAU, P) given by 'gsl_linalg_QRPT_decomp'. The solution is returned in X. The residual is computed as a by-product and stored in RESIDUAL. For rank deficient matrices, 'gsl_linalg_QRPT_lssolve2' should be used instead. -- Function: int gsl_linalg_QRPT_lssolve2 (const gsl_matrix * QR, const gsl_vector * TAU, const gsl_permutation * P, const gsl_vector * B, const size_t RANK, 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 and has rank given by the input RANK. If the user does not know the rank of A, the routine 'gsl_linalg_QRPT_rank' can be called to estimate it. The least squares solution is the so-called "basic" solution discussed above and may not be the minimum norm solution. The routine requires as input the QR decomposition of A into (QR, TAU, P) given by 'gsl_linalg_QRPT_decomp'. The solution is returned in X. The residual is computed as a by-product and stored in RESIDUAL. -- 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 * W, 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 P) 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. -- Function: size_t gsl_linalg_QRPT_rank (const gsl_matrix * QR, const double TOL) This function estimates the rank of the triangular matrix R contained in QR. The algorithm simply counts the number of diagonal elements of R whose absolute value is greater than the specified tolerance TOL. If the input TOL is negative, a default value of 20 (M + N) eps(max(|diag(R)|)) is used. -- Function: int gsl_linalg_QRPT_rcond (const gsl_matrix * QR, double * RCOND, gsl_vector * WORK) This function estimates the reciprocal condition number (using the 1-norm) of the R factor, stored in the upper triangle of QR. The reciprocal condition number estimate, defined as 1 / (||R||_1 \cdot ||R^{-1}||_1), is stored in RCOND. Additional workspace of size 3 N is required in WORK.  File: gsl-ref.info, Node: Complete Orthogonal Decomposition, Next: Singular Value Decomposition, Prev: QR Decomposition with Column Pivoting, Up: Linear Algebra 14.4 Complete Orthogonal Decomposition ====================================== The complete orthogonal decomposition of a M-by-N matrix A is a generalization of the QR decomposition with column pivoting, given by A P = Q [ R11 0 ] Z [ 0 0 ] where P is a N-by-N permutation matrix, Q is M-by-M orthogonal, R_{11} is r-by-r upper triangular, with r = {\rm rank}(A), and Z is N-by-N orthogonal. If A has full rank, then R_{11} = R, Z = I and this reduces to the QR decomposition with column pivoting. The advantage of using the complete orthogonal decomposition for rank deficient matrices is the ability to compute the minimum norm solution to the linear least squares problem Ax = b, which is given by x = P Z^T [ R11^-1 c1 ] [ 0 ] and the vector c_1 is the first r elements of Q^T b. -- Function: int gsl_linalg_COD_decomp (gsl_matrix * A, gsl_vector * TAU_Q, gsl_vector * TAU_Z, gsl_permutation * P, size_t * RANK, gsl_vector * WORK) -- Function: int gsl_linalg_COD_decomp_e (gsl_matrix * A, gsl_vector * TAU_Q, gsl_vector * TAU_Z, gsl_permutation * P, double TOL, size_t * RANK, gsl_vector * WORK) These functions factor the M-by-N matrix A into the decomposition A = Q R Z P^T. The rank of A is computed as the number of diagonal elements of R greater than the tolerance TOL and output in RANK. If TOL is not specified, a default value is used (see 'gsl_linalg_QRPT_rank'). On output, the permutation matrix P is stored in P. The matrix R_{11} is stored in the upper RANK-by-RANK block of A. The matrices Q and Z are encoded in packed storage in A on output. The vectors TAU_Q and TAU_Z contain the Householder scalars corresponding to the matrices Q and Z respectively and must be of length k = \min(M,N). The vector WORK is additional workspace of length N. -- Function: int gsl_linalg_COD_lssolve (const gsl_matrix * QRZ, const gsl_vector * TAU_Q, const gsl_vector * TAU_Z, const gsl_permutation * P, const size_t RANK, 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, ||b - A x||. The routine requires as input the QRZ decomposition of A into (QRZ, TAU_Q, TAU_Z, P, RANK) given by 'gsl_linalg_COD_decomp'. The solution is returned in X. The residual is computed as a by-product and stored in RESIDUAL. -- Function: int gsl_linalg_COD_unpack (const gsl_matrix * QRZ, const gsl_vector * TAU_Q, const gsl_vector * TAU_Z, const size_t RANK, gsl_matrix * Q, gsl_matrix * R, gsl_matrix * Z) This function unpacks the encoded QRZ decomposition (QRZ, TAU_Q, TAU_Z, RANK) into the matrices Q, R, and Z, where Q is M-by-M, R is M-by-N, and Z is N-by-N. -- Function: int gsl_linalg_COD_matZ (const gsl_matrix * QRZ, const gsl_vector * TAU_Z, const size_t RANK, gsl_matrix * A, gsl_vector * WORK) This function multiplies the input matrix A on the right by Z, A' = A Z using the encoded QRZ decomposition (QRZ, TAU_Z, RANK). A must have N columns but may have any number of rows. Additional workspace of length M is provided in WORK.  File: gsl-ref.info, Node: Singular Value Decomposition, Next: Cholesky Decomposition, Prev: Complete Orthogonal Decomposition, Up: Linear Algebra 14.5 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. Note that the routines here compute the "thin" version of the SVD with U as M-by-N orthogonal matrix. This allows in-place computation and is the most commonly-used form in practice. Mathematically, the "full" SVD is defined with U as an M-by-M orthogonal matrix and S as an M-by-N diagonal matrix (with additional rows of zeros). -- 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 (const gsl_matrix * U, const gsl_matrix * V, const 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 which must have been computed previously with '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. -- Function: int gsl_linalg_SV_leverage (const gsl_matrix * U, gsl_vector * H) This function computes the statistical leverage values h_i of a matrix A using its singular value decomposition (U, S, V) previously computed with 'gsl_linalg_SV_decomp'. h_i are the diagonal values of the matrix A (A^T A)^{-1} A^T and depend only on the matrix U which is the input to this function.  File: gsl-ref.info, Node: Cholesky Decomposition, Next: Pivoted Cholesky Decomposition, Prev: Singular Value Decomposition, Up: Linear Algebra 14.6 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. If the matrix A is near singular, it is sometimes possible to reduce the condition number and recover a more accurate solution vector x by scaling as ( S A S ) ( S^(-1) x ) = S b where S is a diagonal matrix whose elements are given by S_{ii} = 1/\sqrt{A_{ii}}. This scaling is also known as Jacobi preconditioning. There are routines below to solve both the scaled and unscaled systems. -- Function: int gsl_linalg_cholesky_decomp1 (gsl_matrix * A) -- Function: int gsl_linalg_complex_cholesky_decomp (gsl_matrix_complex * A) These functions factorize the symmetric, positive-definite square matrix A into the Cholesky decomposition A = L L^T (or A = L L^H for the complex case). On input, the values from the diagonal and lower-triangular part of the matrix A are used (the upper triangular part is ignored). On output the diagonal and lower triangular part of the input matrix A contain the matrix L, while the upper triangular part is unmodified. If the matrix is not positive-definite then the decomposition will fail, returning the error code 'GSL_EDOM'. When testing whether a matrix is positive-definite, disable the error handler first to avoid triggering an error. -- Function: int gsl_linalg_cholesky_decomp (gsl_matrix * A) This function is now deprecated and is provided only for backward compatibility. -- Function: int gsl_linalg_cholesky_solve (const gsl_matrix * CHOLESKY, const gsl_vector * B, gsl_vector * X) -- Function: int gsl_linalg_complex_cholesky_solve (const gsl_matrix_complex * CHOLESKY, const gsl_vector_complex * B, gsl_vector_complex * X) These functions solve the system A x = b using the Cholesky decomposition of A held in the matrix CHOLESKY which must have been previously computed by 'gsl_linalg_cholesky_decomp' or 'gsl_linalg_complex_cholesky_decomp'. -- Function: int gsl_linalg_cholesky_svx (const gsl_matrix * CHOLESKY, gsl_vector * X) -- Function: int gsl_linalg_complex_cholesky_svx (const gsl_matrix_complex * CHOLESKY, gsl_vector_complex * X) These functions solve the system A x = b in-place using the Cholesky decomposition of A held in the matrix CHOLESKY which must have been previously computed by 'gsl_linalg_cholesky_decomp' or 'gsl_linalg_complex_cholesky_decomp'. On input X should contain the right-hand side b, which is replaced by the solution on output. -- Function: int gsl_linalg_cholesky_invert (gsl_matrix * CHOLESKY) -- Function: int gsl_linalg_complex_cholesky_invert (gsl_matrix_complex * CHOLESKY) These functions compute the inverse of a matrix from its Cholesky decomposition CHOLESKY, which must have been previously computed by 'gsl_linalg_cholesky_decomp' or 'gsl_linalg_complex_cholesky_decomp'. On output, the inverse is stored in-place in CHOLESKY. -- Function: int gsl_linalg_cholesky_decomp2 (gsl_matrix * A, gsl_vector * S) This function calculates a diagonal scaling transformation S for the symmetric, positive-definite square matrix A, and then computes the Cholesky decomposition S A S = L L^T. On input, the values from the diagonal and lower-triangular part of the matrix A are used (the upper triangular part is ignored). On output the diagonal and lower triangular part of the input matrix A contain the matrix L, while the upper triangular part of the input matrix is overwritten with 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'. The diagonal scale factors are stored in S on output. When testing whether a matrix is positive-definite, disable the error handler first to avoid triggering an error. -- Function: int gsl_linalg_cholesky_solve2 (const gsl_matrix * CHOLESKY, const gsl_vector * S, const gsl_vector * B, gsl_vector * X) This function solves the system (S A S) (S^{-1} x) = S b using the Cholesky decomposition of S A S held in the matrix CHOLESKY which must have been previously computed by 'gsl_linalg_cholesky_decomp2'. -- Function: int gsl_linalg_cholesky_svx2 (const gsl_matrix * CHOLESKY, const gsl_vector * S, gsl_vector * X) This function solves the system (S A S) (S^{-1} x) = S b in-place using the Cholesky decomposition of S A S held in the matrix CHOLESKY which must have been previously computed by 'gsl_linalg_cholesky_decomp2'. On input X should contain the right-hand side b, which is replaced by the solution on output. -- Function: int gsl_linalg_cholesky_scale (const gsl_matrix * A, gsl_vector * S) This function calculates a diagonal scaling transformation of the symmetric, positive definite matrix A, such that S A S has a condition number within a factor of N of the matrix of smallest possible condition number over all possible diagonal scalings. On output, S contains the scale factors, given by S_i = 1/\sqrt{A_{ii}}. For any A_{ii} \le 0, the corresponding scale factor S_i is set to 1. -- Function: int gsl_linalg_cholesky_scale_apply (gsl_matrix * A, const gsl_vector * S) This function applies the scaling transformation S to the matrix A. On output, A is replaced by S A S. -- Function: int gsl_linalg_cholesky_rcond (const gsl_matrix * CHOLESKY, double * RCOND, gsl_vector * WORK) This function estimates the reciprocal condition number (using the 1-norm) of the symmetric positive definite matrix A, using its Cholesky decomposition provided in CHOLESKY. The reciprocal condition number estimate, defined as 1 / (||A||_1 \cdot ||A^{-1}||_1), is stored in RCOND. Additional workspace of size 3 N is required in WORK.  File: gsl-ref.info, Node: Pivoted Cholesky Decomposition, Next: Modified Cholesky Decomposition, Prev: Cholesky Decomposition, Up: Linear Algebra 14.7 Pivoted Cholesky Decomposition =================================== A symmetric, positive definite square matrix A has an alternate Cholesky decomposition into a product of a lower unit triangular matrix L, a diagonal matrix D and L^T, given by L D L^T. This is equivalent to the Cholesky formulation discussed above, with the standard Cholesky lower triangular factor given by L D^{1 \over 2}. For ill-conditioned matrices, it can help to use a pivoting strategy to prevent the entries of D and L from growing too large, and also ensure D_1 \ge D_2 \ge \cdots \ge D_n > 0, where D_i are the diagonal entries of D. The final decomposition is given by P A P^T = L D L^T where P is a permutation matrix. -- Function: int gsl_linalg_pcholesky_decomp (gsl_matrix * A, gsl_permutation * P) This function factors the symmetric, positive-definite square matrix A into the Pivoted Cholesky decomposition P A P^T = L D L^T. On input, the values from the diagonal and lower-triangular part of the matrix A are used to construct the factorization. On output the diagonal of the input matrix A stores the diagonal elements of D, and the lower triangular portion of A contains the matrix L. Since L has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of A is unmodified. The permutation matrix P is stored in P on output. -- Function: int gsl_linalg_pcholesky_solve (const gsl_matrix * LDLT, const gsl_permutation * P, const gsl_vector * B, gsl_vector * X) This function solves the system A x = b using the Pivoted Cholesky decomposition of A held in the matrix LDLT and permutation P which must have been previously computed by 'gsl_linalg_pcholesky_decomp'. -- Function: int gsl_linalg_pcholesky_svx (const gsl_matrix * LDLT, const gsl_permutation * P, gsl_vector * X) This function solves the system A x = b in-place using the Pivoted Cholesky decomposition of A held in the matrix LDLT and permutation P which must have been previously computed by 'gsl_linalg_pcholesky_decomp'. On input, X contains the right hand side vector b which is replaced by the solution vector on output. -- Function: int gsl_linalg_pcholesky_decomp2 (gsl_matrix * A, gsl_permutation * P, gsl_vector * S) This function computes the pivoted Cholesky factorization of the matrix S A S, where the input matrix A is symmetric and positive definite, and the diagonal scaling matrix S is computed to reduce the condition number of A as much as possible. See *note Cholesky Decomposition:: for more information on the matrix S. The Pivoted Cholesky decomposition satisfies P S A S P^T = L D L^T. On input, the values from the diagonal and lower-triangular part of the matrix A are used to construct the factorization. On output the diagonal of the input matrix A stores the diagonal elements of D, and the lower triangular portion of A contains the matrix L. Since L has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of A is unmodified. The permutation matrix P is stored in P on output. The diagonal scaling transformation is stored in S on output. -- Function: int gsl_linalg_pcholesky_solve2 (const gsl_matrix * LDLT, const gsl_permutation * P, const gsl_vector * S, const gsl_vector * B, gsl_vector * X) This function solves the system (S A S) (S^{-1} x) = S b using the Pivoted Cholesky decomposition of S A S held in the matrix LDLT, permutation P, and vector S, which must have been previously computed by 'gsl_linalg_pcholesky_decomp2'. -- Function: int gsl_linalg_pcholesky_svx2 (const gsl_matrix * LDLT, const gsl_permutation * P, const gsl_vector * S, gsl_vector * X) This function solves the system (S A S) (S^{-1} x) = S b in-place using the Pivoted Cholesky decomposition of S A S held in the matrix LDLT, permutation P and vector S, which must have been previously computed by 'gsl_linalg_pcholesky_decomp2'. On input, X contains the right hand side vector b which is replaced by the solution vector on output. -- Function: int gsl_linalg_pcholesky_invert (const gsl_matrix * LDLT, const gsl_permutation * P, gsl_matrix * AINV) This function computes the inverse of the matrix A, using the Pivoted Cholesky decomposition stored in LDLT and P. On output, the matrix AINV contains A^{-1}. -- Function: int gsl_linalg_pcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * P, double * RCOND, gsl_vector * WORK) This function estimates the reciprocal condition number (using the 1-norm) of the symmetric positive definite matrix A, using its pivoted Cholesky decomposition provided in LDLT. The reciprocal condition number estimate, defined as 1 / (||A||_1 \cdot ||A^{-1}||_1), is stored in RCOND. Additional workspace of size 3 N is required in WORK.  File: gsl-ref.info, Node: Modified Cholesky Decomposition, Next: Tridiagonal Decomposition of Real Symmetric Matrices, Prev: Pivoted Cholesky Decomposition, Up: Linear Algebra 14.8 Modified Cholesky Decomposition ==================================== The modified Cholesky decomposition is suitable for solving systems A x = b where A is a symmetric indefinite matrix. Such matrices arise in nonlinear optimization algorithms. The standard Cholesky decomposition requires a positive definite matrix and would fail in this case. Instead of resorting to a method like QR or SVD, which do not take into account the symmetry of the matrix, we can instead introduce a small perturbation to the matrix A to make it positive definite, and then use a Cholesky decomposition on the perturbed matrix. The resulting decomposition satisfies P (A + E) P^T = L D L^T where P is a permutation matrix, E is a diagonal perturbation matrix, L is unit lower triangular, and D is diagonal. If A is sufficiently positive definite, then the perturbation matrix E will be zero and this method is equivalent to the pivoted Cholesky algorithm. For indefinite matrices, the perturbation matrix E is computed to ensure that A + E is positive definite and well conditioned. -- Function: int gsl_linalg_mcholesky_decomp (gsl_matrix * A, gsl_permutation * P, gsl_vector * E) This function factors the symmetric, indefinite square matrix A into the Modified Cholesky decomposition P (A + E) P^T = L D L^T. On input, the values from the diagonal and lower-triangular part of the matrix A are used to construct the factorization. On output the diagonal of the input matrix A stores the diagonal elements of D, and the lower triangular portion of A contains the matrix L. Since L has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of A is unmodified. The permutation matrix P is stored in P on output. The diagonal perturbation matrix is stored in E on output. The parameter E may be set to NULL if it is not required. -- Function: int gsl_linalg_mcholesky_solve (const gsl_matrix * LDLT, const gsl_permutation * P, const gsl_vector * B, gsl_vector * X) This function solves the perturbed system (A + E) x = b using the Cholesky decomposition of A + E held in the matrix LDLT and permutation P which must have been previously computed by 'gsl_linalg_mcholesky_decomp'. -- Function: int gsl_linalg_mcholesky_svx (const gsl_matrix * LDLT, const gsl_permutation * P, gsl_vector * X) This function solves the perturbed system (A + E) x = b in-place using the Cholesky decomposition of A + E held in the matrix LDLT and permutation P which must have been previously computed by 'gsl_linalg_mcholesky_decomp'. On input, X contains the right hand side vector b which is replaced by the solution vector on output. -- Function: int gsl_linalg_mcholesky_rcond (const gsl_matrix * LDLT, const gsl_permutation * P, double * RCOND, gsl_vector * WORK) This function estimates the reciprocal condition number (using the 1-norm) of the perturbed matrix A + E, using its pivoted Cholesky decomposition provided in LDLT. The reciprocal condition number estimate, defined as 1 / (||A + E||_1 \cdot ||(A + E)^{-1}||_1), is stored in RCOND. Additional workspace of size 3 N is required in WORK.  File: gsl-ref.info, Node: Tridiagonal Decomposition of Real Symmetric Matrices, Next: Tridiagonal Decomposition of Hermitian Matrices, Prev: Modified Cholesky Decomposition, Up: Linear Algebra 14.9 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 14.10 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 unitary matrix U. 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 * U, 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: Hessenberg-Triangular Decomposition of Real Matrices, Prev: Tridiagonal Decomposition of Hermitian Matrices, Up: Linear Algebra 14.11 Hessenberg Decomposition of Real Matrices =============================================== A general real 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_decomp (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_decomp'. -- 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: int 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_decomp'.  File: gsl-ref.info, Node: Hessenberg-Triangular Decomposition of Real Matrices, Next: Bidiagonalization, Prev: Hessenberg Decomposition of Real Matrices, Up: Linear Algebra 14.12 Hessenberg-Triangular Decomposition of Real Matrices ========================================================== A general real matrix pair (A, B) can be decomposed by orthogonal similarity transformations into the form A = U H V^T B = U R V^T where U and V are orthogonal, H is an upper Hessenberg matrix, and R is upper triangular. The Hessenberg-Triangular reduction is the first step in the generalized Schur decomposition for the generalized eigenvalue problem. -- Function: int gsl_linalg_hesstri_decomp (gsl_matrix * A, gsl_matrix * B, gsl_matrix * U, gsl_matrix * V, gsl_vector * WORK) This function computes the Hessenberg-Triangular decomposition of the matrix pair (A, B). On output, H is stored in A, and R is stored in B. If U and V are provided (they may be null), the similarity transformations are stored in them. Additional workspace of length N is needed in WORK.  File: gsl-ref.info, Node: Bidiagonalization, Next: Givens Rotations, Prev: Hessenberg-Triangular Decomposition of Real Matrices, Up: Linear Algebra 14.13 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 produced 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 produced 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 from 'gsl_linalg_bidiag_decomp', into the diagonal vector DIAG and superdiagonal vector SUPERDIAG.  File: gsl-ref.info, Node: Givens Rotations, Next: Householder Transformations, Prev: Bidiagonalization, Up: Linear Algebra 14.14 Givens Rotations ====================== A Givens rotation is a rotation in the plane acting on two elements of a given vector. It can be represented in matrix form as where the \cos{\theta} and \sin{\theta} appear at the intersection of the ith and jth rows and columns. When acting on a vector x, G(i,j,\theta) x performs a rotation of the (i,j) elements of x. Givens rotations are typically used to introduce zeros in vectors, such as during the QR decomposition of a matrix. In this case, it is typically desired to find c and s such that with r = \sqrt{a^2 + b^2}. -- Function: void gsl_linalg_givens (const double A, const double B, double * C, double * S) This function computes c = \cos{\theta} and s = \sin{\theta} so that the Givens matrix G(\theta) acting on the vector (a,b) produces (r, 0), with r = \sqrt{a^2 + b^2}. -- Function: void gsl_linalg_givens_gv (gsl_vector * V, const size_t I, const size_t J, const double C, const double S) This function applies the Givens rotation defined by c = \cos{\theta} and s = \sin{\theta} to the I and J elements of V. On output, (v(i),v(j)) \leftarrow G(\theta) (v(i),v(j)).  File: gsl-ref.info, Node: Householder Transformations, Next: Householder solver for linear systems, Prev: Givens Rotations, Up: Linear Algebra 14.15 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 * W) -- Function: gsl_complex gsl_linalg_complex_householder_transform (gsl_vector_complex * W) 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 W except the first. On output the Householder vector V is stored in W and the scalar \tau is returned. The householder vector V is normalized so that V[0] = 1, however this 1 is not stored in the output vector. Instead, W[0] is set to the first element of the transformed vector, so that if u = P w, W[0] = u[0] on output and the remainder of u is zero. -- Function: int gsl_linalg_householder_hm (double TAU, const gsl_vector * V, gsl_matrix * A) -- Function: int gsl_linalg_complex_householder_hm (gsl_complex TAU, const gsl_vector_complex * V, gsl_matrix_complex * 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) -- Function: int gsl_linalg_complex_householder_mh (gsl_complex TAU, const gsl_vector_complex * V, gsl_matrix_complex * 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) -- Function: int gsl_linalg_complex_householder_hv (gsl_complex TAU, const gsl_vector_complex * V, gsl_vector_complex * 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 14.16 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: Triangular Systems, Prev: Householder solver for linear systems, Up: Linear Algebra 14.17 Tridiagonal Systems ========================= The functions described in this section efficiently solve symmetric, non-symmetric and cyclic tridiagonal systems with minimal storage. Note that the current implementations of these functions use a variant of Cholesky decomposition, so the tridiagonal matrix must be positive definite. For non-positive definite matrices, the functions return the error code 'GSL_ESING'. -- 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 ) -- 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: Triangular Systems, Next: Balancing, Prev: Tridiagonal Systems, Up: Linear Algebra 14.18 Triangular Systems ======================== -- Function: int gsl_linalg_tri_upper_invert (gsl_matrix * T) -- Function: int gsl_linalg_tri_lower_invert (gsl_matrix * T) -- Function: int gsl_linalg_tri_upper_unit_invert (gsl_matrix * T) -- Function: int gsl_linalg_tri_lower_unit_invert (gsl_matrix * T) These functions calculate the in-place inverse of the triangular matrix T. When the 'upper' prefix is specified, then the upper triangle of T is used, and when the 'lower' prefix is specified, the lower triangle is used. If the 'unit' prefix is specified, then the diagonal elements of the matrix T are taken as unity and are not referenced. Otherwise the diagonal elements are used in the inversion. -- Function: int gsl_linalg_tri_upper_rcond (const gsl_matrix * T, double * RCOND, gsl_vector * WORK) -- Function: int gsl_linalg_tri_lower_rcond (const gsl_matrix * T, double * RCOND, gsl_vector * WORK) These functions estimate the reciprocal condition number, in the 1-norm, of the upper or lower N-by-N triangular matrix T. The reciprocal condition number is stored in RCOND on output, and is defined by 1 / (||T||_1 \cdot ||T^{-1}||_1). Additional workspace of size 3 N is required in WORK.  File: gsl-ref.info, Node: Balancing, Next: Linear Algebra Examples, Prev: Triangular Systems, Up: Linear Algebra 14.19 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 14.20 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 #include 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 14.21 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. 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 (1975), p 74-76 J.C. Nash and S. Shlien "Simple algorithms for the partial singular value decomposition", 'Computer Journal', Volume 30 (1987), p 268-275. James Demmel, Kres in the 'lawns' or 'lawnspdf' directories. The algorithm for estimating a matrix condition number is described in the following paper, N. J. Higham, "FORTRAN codes for estimating the one-norm of a real or complex matrix, with applications to condition estimation", ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.  File: gsl-ref.info, Node: Eigensystems, Next: Fast Fourier Transforms, Prev: Linear Algebra, Up: Top 15 Eigensystems *************** This chapter describes functions for computing eigenvalues and eigenvectors of matrices. There are routines for real symmetric, real nonsymmetric, complex hermitian, real generalized symmetric-definite, complex generalized hermitian-definite, and real generalized nonsymmetric eigensystems. Eigenvalues can be computed with or without eigenvectors. The hermitian and real symmetric matrix algorithms are symmetric bidiagonalization followed by QR reduction. The nonsymmetric algorithm is the Francis QR double-shift. The generalized nonsymmetric algorithm is the QZ method due to Moler and Stewart. 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:: * Real Generalized Symmetric-Definite Eigensystems:: * Complex Generalized Hermitian-Definite Eigensystems:: * Real Generalized Nonsymmetric Eigensystems:: * 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 15.1 Real Symmetric Matrices ============================ For real symmetric matrices, the library uses the symmetric bidiagonalization and QR reduction method. This is described in Golub & van Loan, section 8.3. The computed eigenvalues are accurate to an absolute accuracy of \epsilon ||A||_2, where \epsilon is the machine precision. -- 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 15.2 Complex Hermitian Matrices =============================== For hermitian matrices, the library uses the complex form of the symmetric bidiagonalization and QR reduction method. -- 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: Real Generalized Symmetric-Definite Eigensystems, Prev: Complex Hermitian Matrices, Up: Eigensystems 15.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 may 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 that 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: void gsl_eigen_nonsymmv_params (const int BALANCE, gsl_eigen_nonsymm_workspace * W) This function sets parameters which determine how the eigenvalue problem is solved in subsequent calls to 'gsl_eigen_nonsymmv'. If BALANCE is set to 1, a balancing transformation is applied to the matrix. See 'gsl_eigen_nonsymm_params' for more information. Balancing is turned off by default since it does not preserve the orthogonality of the Schur vectors. -- 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 unit magnitude. 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 that it also saves the Schur vectors into Z.  File: gsl-ref.info, Node: Real Generalized Symmetric-Definite Eigensystems, Next: Complex Generalized Hermitian-Definite Eigensystems, Prev: Real Nonsymmetric Matrices, Up: Eigensystems 15.4 Real Generalized Symmetric-Definite Eigensystems ===================================================== The real generalized symmetric-definite eigenvalue problem is to find eigenvalues \lambda and eigenvectors x such that A x = \lambda B x where A and B are symmetric matrices, and B is positive-definite. This problem reduces to the standard symmetric eigenvalue problem by applying the Cholesky decomposition to B: A x = \lambda B x A x = \lambda L L^t x ( L^{-1} A L^{-t} ) L^t x = \lambda L^t x Therefore, the problem becomes C y = \lambda y where C = L^{-1} A L^{-t} is symmetric, and y = L^t x. The standard symmetric eigensolver can be applied to the matrix C. The resulting eigenvectors are backtransformed to find the vectors of the original problem. The eigenvalues and eigenvectors of the generalized symmetric-definite eigenproblem are always real. -- Function: gsl_eigen_gensymm_workspace * gsl_eigen_gensymm_alloc (const size_t N) This function allocates a workspace for computing eigenvalues of N-by-N real generalized symmetric-definite eigensystems. The size of the workspace is O(2n). -- Function: void gsl_eigen_gensymm_free (gsl_eigen_gensymm_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_eigen_gensymm (gsl_matrix * A, gsl_matrix * B, gsl_vector * EVAL, gsl_eigen_gensymm_workspace * W) This function computes the eigenvalues of the real generalized symmetric-definite matrix pair (A, B), and stores them in EVAL, using the method outlined above. On output, B contains its Cholesky decomposition and A is destroyed. -- Function: gsl_eigen_gensymmv_workspace * gsl_eigen_gensymmv_alloc (const size_t N) This function allocates a workspace for computing eigenvalues and eigenvectors of N-by-N real generalized symmetric-definite eigensystems. The size of the workspace is O(4n). -- Function: void gsl_eigen_gensymmv_free (gsl_eigen_gensymmv_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_eigen_gensymmv (gsl_matrix * A, gsl_matrix * B, gsl_vector * EVAL, gsl_matrix * EVEC, gsl_eigen_gensymmv_workspace * W) This function computes the eigenvalues and eigenvectors of the real generalized symmetric-definite matrix pair (A, B), and stores them in EVAL and EVEC respectively. The computed eigenvectors are normalized to have unit magnitude. On output, B contains its Cholesky decomposition and A is destroyed.  File: gsl-ref.info, Node: Complex Generalized Hermitian-Definite Eigensystems, Next: Real Generalized Nonsymmetric Eigensystems, Prev: Real Generalized Symmetric-Definite Eigensystems, Up: Eigensystems 15.5 Complex Generalized Hermitian-Definite Eigensystems ======================================================== The complex generalized hermitian-definite eigenvalue problem is to find eigenvalues \lambda and eigenvectors x such that A x = \lambda B x where A and B are hermitian matrices, and B is positive-definite. Similarly to the real case, this can be reduced to C y = \lambda y where C = L^{-1} A L^{-H} is hermitian, and y = L^H x. The standard hermitian eigensolver can be applied to the matrix C. The resulting eigenvectors are backtransformed to find the vectors of the original problem. The eigenvalues of the generalized hermitian-definite eigenproblem are always real. -- Function: gsl_eigen_genherm_workspace * gsl_eigen_genherm_alloc (const size_t N) This function allocates a workspace for computing eigenvalues of N-by-N complex generalized hermitian-definite eigensystems. The size of the workspace is O(3n). -- Function: void gsl_eigen_genherm_free (gsl_eigen_genherm_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_eigen_genherm (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * EVAL, gsl_eigen_genherm_workspace * W) This function computes the eigenvalues of the complex generalized hermitian-definite matrix pair (A, B), and stores them in EVAL, using the method outlined above. On output, B contains its Cholesky decomposition and A is destroyed. -- Function: gsl_eigen_genhermv_workspace * gsl_eigen_genhermv_alloc (const size_t N) This function allocates a workspace for computing eigenvalues and eigenvectors of N-by-N complex generalized hermitian-definite eigensystems. The size of the workspace is O(5n). -- Function: void gsl_eigen_genhermv_free (gsl_eigen_genhermv_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_eigen_genhermv (gsl_matrix_complex * A, gsl_matrix_complex * B, gsl_vector * EVAL, gsl_matrix_complex * EVEC, gsl_eigen_genhermv_workspace * W) This function computes the eigenvalues and eigenvectors of the complex generalized hermitian-definite matrix pair (A, B), and stores them in EVAL and EVEC respectively. The computed eigenvectors are normalized to have unit magnitude. On output, B contains its Cholesky decomposition and A is destroyed.  File: gsl-ref.info, Node: Real Generalized Nonsymmetric Eigensystems, Next: Sorting Eigenvalues and Eigenvectors, Prev: Complex Generalized Hermitian-Definite Eigensystems, Up: Eigensystems 15.6 Real Generalized Nonsymmetric Eigensystems =============================================== Given two square matrices (A, B), the generalized nonsymmetric eigenvalue problem is to find eigenvalues \lambda and eigenvectors x such that A x = \lambda B x We may also define the problem as finding eigenvalues \mu and eigenvectors y such that \mu A y = B y Note that these two problems are equivalent (with \lambda = 1/\mu) if neither \lambda nor \mu is zero. If say, \lambda is zero, then it is still a well defined eigenproblem, but its alternate problem involving \mu is not. Therefore, to allow for zero (and infinite) eigenvalues, the problem which is actually solved is \beta A x = \alpha B x The eigensolver routines below will return two values \alpha and \beta and leave it to the user to perform the divisions \lambda = \alpha / \beta and \mu = \beta / \alpha. If the determinant of the matrix pencil A - \lambda B is zero for all \lambda, the problem is said to be singular; otherwise it is called regular. Singularity normally leads to some \alpha = \beta = 0 which means the eigenproblem is ill-conditioned and generally does not have well defined eigenvalue solutions. The routines below are intended for regular matrix pencils and could yield unpredictable results when applied to singular pencils. The solution of the real generalized nonsymmetric eigensystem problem for a matrix pair (A, B) involves computing the generalized Schur decomposition A = Q S Z^T B = Q T Z^T where Q and Z are orthogonal matrices of left and right Schur vectors respectively, and (S, T) is the generalized Schur form whose diagonal elements give the \alpha and \beta values. The algorithm used is the QZ method due to Moler and Stewart (see references). -- Function: gsl_eigen_gen_workspace * gsl_eigen_gen_alloc (const size_t N) This function allocates a workspace for computing eigenvalues of N-by-N real generalized nonsymmetric eigensystems. The size of the workspace is O(n). -- Function: void gsl_eigen_gen_free (gsl_eigen_gen_workspace * W) This function frees the memory associated with the workspace W. -- Function: void gsl_eigen_gen_params (const int COMPUTE_S, const int COMPUTE_T, const int BALANCE, gsl_eigen_gen_workspace * W) This function sets some parameters which determine how the eigenvalue problem is solved in subsequent calls to 'gsl_eigen_gen'. If COMPUTE_S is set to 1, the full Schur form S will be computed by 'gsl_eigen_gen'. If it is set to 0, S will not be computed (this is the default setting). S is a quasi upper triangular matrix with 1-by-1 and 2-by-2 blocks on its diagonal. 1-by-1 blocks correspond to real eigenvalues, and 2-by-2 blocks correspond to complex eigenvalues. If COMPUTE_T is set to 1, the full Schur form T will be computed by 'gsl_eigen_gen'. If it is set to 0, T will not be computed (this is the default setting). T is an upper triangular matrix with non-negative elements on its diagonal. Any 2-by-2 blocks in S will correspond to a 2-by-2 diagonal block in T. The BALANCE parameter is currently ignored, since generalized balancing is not yet implemented. -- Function: int gsl_eigen_gen (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * ALPHA, gsl_vector * BETA, gsl_eigen_gen_workspace * W) This function computes the eigenvalues of the real generalized nonsymmetric matrix pair (A, B), and stores them as pairs in (ALPHA, BETA), where ALPHA is complex and BETA is real. If \beta_i is non-zero, then \lambda = \alpha_i / \beta_i is an eigenvalue. Likewise, if \alpha_i is non-zero, then \mu = \beta_i / \alpha_i is an eigenvalue of the alternate problem \mu A y = B y. The elements of BETA are normalized to be non-negative. If S is desired, it is stored in A on output. If T is desired, it is stored in B on output. The ordering of eigenvalues in (ALPHA, BETA) follows the ordering of the diagonal blocks in the Schur forms S and T. In rare cases, this function may fail to find all eigenvalues. If this occurs, an error code is returned. -- Function: int gsl_eigen_gen_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * ALPHA, gsl_vector * BETA, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_gen_workspace * W) This function is identical to 'gsl_eigen_gen' except that it also computes the left and right Schur vectors and stores them into Q and Z respectively. -- Function: gsl_eigen_genv_workspace * gsl_eigen_genv_alloc (const size_t N) This function allocates a workspace for computing eigenvalues and eigenvectors of N-by-N real generalized nonsymmetric eigensystems. The size of the workspace is O(7n). -- Function: void gsl_eigen_genv_free (gsl_eigen_genv_workspace * W) This function frees the memory associated with the workspace W. -- Function: int gsl_eigen_genv (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * ALPHA, gsl_vector * BETA, gsl_matrix_complex * EVEC, gsl_eigen_genv_workspace * W) This function computes eigenvalues and right eigenvectors of the N-by-N real generalized nonsymmetric matrix pair (A, B). The eigenvalues are stored in (ALPHA, BETA) and the eigenvectors are stored in EVEC. It first calls 'gsl_eigen_gen' to compute the eigenvalues, Schur forms, and Schur vectors. Then it finds eigenvectors of the Schur forms and backtransforms them using the Schur vectors. The Schur vectors are destroyed in the process, but can be saved by using 'gsl_eigen_genv_QZ'. The computed eigenvectors are normalized to have unit magnitude. On output, (A, B) contains the generalized Schur form (S, T). If 'gsl_eigen_gen' fails, no eigenvectors are computed, and an error code is returned. -- Function: int gsl_eigen_genv_QZ (gsl_matrix * A, gsl_matrix * B, gsl_vector_complex * ALPHA, gsl_vector * BETA, gsl_matrix_complex * EVEC, gsl_matrix * Q, gsl_matrix * Z, gsl_eigen_genv_workspace * W) This function is identical to 'gsl_eigen_genv' except that it also computes the left and right Schur vectors and stores them into Q and Z respectively.  File: gsl-ref.info, Node: Sorting Eigenvalues and Eigenvectors, Next: Eigenvalue and Eigenvector Examples, Prev: Real Generalized Nonsymmetric Eigensystems, Up: Eigensystems 15.7 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. -- Function: int gsl_eigen_gensymmv_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 as shown above. -- Function: int gsl_eigen_genhermv_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_genv_sort (gsl_vector_complex * ALPHA, gsl_vector * BETA, gsl_matrix_complex * EVEC, gsl_eigen_sort_t SORT_TYPE) This function simultaneously sorts the eigenvalues stored in the vectors (ALPHA, BETA) 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 15.8 Examples ============= The following program computes the eigenvalues and eigenvectors of the 4-th order Hilbert matrix, H(i,j) = 1/(i + j + 1). #include #include #include 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 #include #include 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 differ by the multiplicative constant 0.9999984 + 0.0017674i which is an arbitrary phase factor of magnitude 1.  File: gsl-ref.info, Node: Eigenvalue and Eigenvector References, Prev: Eigenvalue and Eigenvector Examples, Up: Eigensystems 15.9 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. Further information on the generalized eigensystems QZ algorithm can be found in this paper, C. Moler, G. Stewart, "An Algorithm for Generalized Matrix Eigenvalue Problems", SIAM J. Numer. Anal., Vol 10, No 2, 1973. Eigensystem routines for very large matrices can be found in the Fortran library LAPACK. The LAPACK library is described in, 'LAPACK Users' Guide' (Third Edition, 1999), Published by SIAM, ISBN 0-89871-447-8. 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 16 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 16.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_m 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 16.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 16.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 #include #include #include #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 16.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 #include #include #include #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 < (int) wavetable->nf; i++) { printf ("# factor %d: %zu\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 16.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 16.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 (assuming STRIDE=1), 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_radix2_unpack' described below. 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. -- Function: int gsl_fft_halfcomplex_radix2_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_radix2_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[i*stride]; double hc_imag = halfcomplex_coefficient[(n-i)*stride]; complex_coefficient[i*stride].real = hc_real; complex_coefficient[i*stride].imag = hc_imag; complex_coefficient[(n - i)*stride].real = hc_real; complex_coefficient[(n - i)*stride].imag = -hc_imag; } if (i == n - i) { complex_coefficient[i*stride].real = halfcomplex_coefficient[(n - 1)*stride]; complex_coefficient[i*stride].imag = 0.0; }  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 16.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*stride].real = real_coefficient[i*stride]; complex_coefficient[i*stride].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)*stride]; double hc_imag = halfcomplex_coefficient[(2 * i)*stride]; complex_coefficient[i*stride].real = hc_real; complex_coefficient[i*stride].imag = hc_imag; complex_coefficient[(n - i)*stride].real = hc_real; complex_coefficient[(n - i)*stride].imag = -hc_imag; } if (i == n - i) { complex_coefficient[i*stride].real = halfcomplex_coefficient[(n - 1)*stride]; complex_coefficient[i*stride].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 #include #include #include #include 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 16.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, The source code for FFTPACK is available from Netlib, FFTPACK,  File: gsl-ref.info, Node: Numerical Integration, Next: Random Number Generation, Prev: Fast Fourier Transforms, Up: Top 17 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, de Doncker-Kapenga, Ueberhuber and Kahaner. Fortran code for QUADPACK is available on Netlib. Also included are non-adaptive, fixed-order Gauss-Legendre integration routines with high precision coefficients by Pavel Holoborodko. 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:: * CQUAD doubly-adaptive integration:: * Fixed order Gauss-Legendre integration:: * 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 17.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|) In short, the routines return the first approximation which has an absolute error smaller than epsabs or a relative error smaller than epsrel. Note that this is an either-or constraint, not simultaneous. To compute to a specified absolute error, set epsrel to zero. To compute to a specified relative error, set epsabs to zero. 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 17.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 17.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 17.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 17.2 QNG non-adaptive Gauss-Kronrod integration =============================================== The QNG algorithm is a non-adaptive procedure which uses fixed Gauss-Kronrod-Patterson 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 17.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. One workspace may be used multiple times as all necessary reinitialization is performed automatically by the integration routines. -- 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 17.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 17.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 17.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 17.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 17.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 17.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: CQUAD doubly-adaptive integration, Prev: QAWO adaptive integration for oscillatory functions, Up: Numerical Integration 17.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_{in - 1], this function obtains the I-th Gauss-Legendre point XI and weight WI on the interval [A,B]. The points and weights are ordered by increasing point value. A function f may be integrated on [A,B] by summing wi * f(xi) over I. -- Function: void gsl_integration_glfixed_table_free (gsl_integration_glfixed_table * T) This function frees the memory associated with the table T.  File: gsl-ref.info, Node: Numerical integration error codes, Next: Numerical integration examples, Prev: Fixed order Gauss-Legendre integration, Up: Numerical Integration 17.13 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 17.14 Examples ============== The integrator 'QAGS' will handle a large class of definite integrals. For example, consider the following integral, which has an 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 #include #include 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 = α 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 = %zu\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 = -4.000000000000085265 exact result = -4.000000000000000000 estimated error = 0.000000000000135447 actual error = -0.000000000000085265 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 17.15 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. Ueberhuber, D.K. Kahaner. 'QUADPACK A subroutine package for automatic integration' Springer Verlag, 1983. The CQUAD integration algorithm is described in the following paper: P. Gonnet, "Increasing the Reliability of Adaptive Quadrature Using Explicit Interpolants", 'ACM Transactions on Mathematical Software', Volume 37 (2010), Issue 3, Article 26.  File: gsl-ref.info, Node: Random Number Generation, Next: Quasi-Random Sequences, Prev: Numerical Integration, Up: Top 18 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 18.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 18.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 18.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 >= 1 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'. When using multiple seeds with the same generator, choose seed values greater than zero to avoid collisions with the default setting. Note that the most generators only accept 32-bit seeds, with higher values being reduced modulo 2^32. For generators with smaller ranges the maximum seed value will typically be lower. -- 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 18.4 Sampling from a random number generator ============================================ The following functions return uniformly distributed random numbers, either as integers or double precision floating point numbers. Inline versions of these functions are used when 'HAVE_INLINE' is defined. 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 be 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 minimum 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 18.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 18.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 #include 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 18.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 18.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. -- 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 18.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. Note that the range of allowed seeds for this generator is [0,2^31-1]. Higher seed values are wrapped modulo 2^31. -- 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 18.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 18.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 was used in the IMSL Library (subroutine RNUN) and in MATLAB (the RAND function) in the past. 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 18.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  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 18.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 #include 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 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 18.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. in the file 'handsim.ps'. The source code for the DIEHARD random number generator tests is also available online, 'DIEHARD source code' G. Marsaglia, 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".  File: gsl-ref.info, Node: Random Number Acknowledgements, Prev: Random Number References and Further Reading, Up: Random Number Generation 18.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 19 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 restoring 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 19.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 19.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. An inline version of this function is used when 'HAVE_INLINE' is defined.  File: gsl-ref.info, Node: Auxiliary quasi-random number generator functions, Next: Saving and restoring quasi-random number generator state, Prev: Sampling from a quasi-random number generator, Up: Quasi-Random Sequences 19.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 restoring quasi-random number generator state, Next: Quasi-random number generator algorithms, Prev: Auxiliary quasi-random number generator functions, Up: Quasi-Random Sequences 19.4 Saving and restoring 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. gsl-doc-2.3/doc/landau.dat0000664000175000017500000001305712616157443013504 0ustar eddedd-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 gsl-doc-2.3/doc/rstat.texi0000644000175000017500000001751612774420036013574 0ustar eddedd@cindex running statistics @cindex online statistics This chapter describes routines for computing running statistics, also known as online statistics, of data. These routines are suitable for handling large datasets for which it may be inconvenient or impractical to store in memory all at once. The data can be processed in a single pass, one point at a time. Each time a data point is added to the accumulator, internal parameters are updated in order to compute the current mean, variance, standard deviation, skewness, and kurtosis. These statistics are exact, and are updated with numerically stable single-pass algorithms. The median and arbitrary quantiles are also available, however these calculations use algorithms which provide approximations, and grow more accurate as more data is added to the accumulator. The functions described in this chapter are declared in the header file @file{gsl_rstat.h}. @menu * Running Statistics Initializing the Accumulator:: * Running Statistics Adding Data to the Accumulator:: * Running Statistics Current Statistics:: * Running Statistics Quantiles:: * Running Statistics Example programs:: * Running Statistics References and Further Reading:: @end menu @node Running Statistics Initializing the Accumulator @section Initializing the Accumulator @deftypefun {gsl_rstat_workspace *} gsl_rstat_alloc (void) This function allocates a workspace for computing running statistics. The size of the workspace is @math{O(1)}. @end deftypefun @deftypefun void gsl_rstat_free (gsl_rstat_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_rstat_reset (gsl_rstat_workspace * @var{w}) This function resets the workspace @var{w} to its initial state, so it can begin working on a new set of data. @end deftypefun @node Running Statistics Adding Data to the Accumulator @section Adding Data to the Accumulator @deftypefun int gsl_rstat_add (const double @var{x}, gsl_rstat_workspace * @var{w}) This function adds the data point @var{x} to the statistical accumulator, updating calculations of the mean, variance, standard deviation, skewness, kurtosis, and median. @end deftypefun @deftypefun size_t gsl_rstat_n (gsl_rstat_workspace * @var{w}) This function returns the number of data so far added to the accumulator. @end deftypefun @node Running Statistics Current Statistics @section Current Statistics @deftypefun double gsl_rstat_min (gsl_rstat_workspace * @var{w}) This function returns the minimum value added to the accumulator. @end deftypefun @deftypefun double gsl_rstat_max (gsl_rstat_workspace * @var{w}) This function returns the maximum value added to the accumulator. @end deftypefun @deftypefun double gsl_rstat_mean (gsl_rstat_workspace * @var{w}) This function returns the mean of all data added to the accumulator, 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 @end deftypefun @deftypefun double gsl_rstat_variance (gsl_rstat_workspace * @var{w}) This function returns the variance of all data added to the accumulator, defined as @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 @end deftypefun @deftypefun double gsl_rstat_sd (gsl_rstat_workspace * @var{w}) This function returns the standard deviation of all data added to the accumulator, defined as the square root of the variance given above. @end deftypefun @deftypefun double gsl_rstat_sd_mean (gsl_rstat_workspace * @var{w}) This function returns the standard deviation of the mean, defined as @tex \beforedisplay $$ \Hat\sigma_{\Hat\mu} = {\Hat\sigma \over \sqrt{N}} $$ \afterdisplay @end tex @ifinfo @example sd_mean = \Hat\sigma / \sqrt@{N@} @end example @end ifinfo @end deftypefun @deftypefun double gsl_rstat_rms (gsl_rstat_workspace * @var{w}) This function returns the root mean square of all data added to the accumulator, defined as @tex \beforedisplay $$ rms = \sqrt{{1 \over N} \sum x_i^2} $$ \afterdisplay @end tex @ifinfo @example rms = \sqrt ( 1/N \sum x_i^2 ) @end example @end ifinfo @end deftypefun @deftypefun double gsl_rstat_skew (gsl_rstat_workspace * @var{w}) This function returns the skewness of all data added to the accumulator, 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 @end deftypefun @deftypefun double gsl_rstat_kurtosis (gsl_rstat_workspace * @var{w}) This function returns the kurtosis of all data added to the accumulator, 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 @end deftypefun @deftypefun double gsl_rstat_median (gsl_rstat_workspace * @var{w}) This function returns an estimate of the median of the data added to the accumulator. @end deftypefun @node Running Statistics Quantiles @section Quantiles The functions in this section estimate quantiles dynamically without storing the entire dataset, using the algorithm of Jain and Chlamtec, 1985. Only five points (markers) are stored which represent the minimum and maximum of the data, as well as current estimates of the @math{p/2}-, @math{p}-, and @math{(1+p)/2}-quantiles. Each time a new data point is added, the marker positions and heights are updated. @deftypefun {gsl_rstat_quantile_workspace *} gsl_rstat_quantile_alloc (const double @var{p}) This function allocates a workspace for the dynamic estimation of @var{p}-quantiles, where @var{p} is between @math{0} and @math{1}. The median corresponds to @math{p = 0.5}. The size of the workspace is @math{O(1)}. @end deftypefun @deftypefun void gsl_rstat_quantile_free (gsl_rstat_quantile_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_rstat_quantile_reset (gsl_rstat_quantile_workspace * @var{w}) This function resets the workspace @var{w} to its initial state, so it can begin working on a new set of data. @end deftypefun @deftypefun int gsl_rstat_quantile_add (const double @var{x}, gsl_rstat_quantile_workspace * @var{w}) This function updates the estimate of the @math{p}-quantile with the new data point @var{x}. @end deftypefun @deftypefun double gsl_rstat_quantile_get (gsl_rstat_quantile_workspace * @var{w}) This function returns the current estimate of the @math{p}-quantile. @end deftypefun @node Running Statistics Example programs @section Examples Here is a basic example of how to use the statistical functions: @example @verbatiminclude examples/rstat.c @end example The program should produce the following output, @example @verbatiminclude examples/rstat.txt @end example @noindent This next program estimates the lower quartile, median and upper quartile from 10,000 samples of a random Rayleigh distribution, using the @math{P^2} algorithm of Jain and Chlamtec. For comparison, the exact values are also computed from the sorted dataset. @example @verbatiminclude examples/rquantile.c @end example The program should produce the following output, @example @verbatiminclude examples/rquantile.txt @end example @node Running Statistics References and Further Reading @section References and Further Reading The algorithm used to dynamically estimate @math{p}-quantiles is described in the paper, @itemize @w{} @item R. Jain and I. Chlamtac. @cite{The P^2 algorithm for dynamic calculation of quantiles and histograms without storing observations}, Communications of the ACM, Volume 28 (October), Number 10, 1985, p. 1076-1085. @end itemize gsl-doc-2.3/doc/gsl-ref.info-10000644000175000017500000111500513022372740014102 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  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 2.3 of the library. Please report any errors in this manual to . More information about GSL can be found at the project homepage, . Printed copies of this manual can be purchased from Network Theory Ltd at . 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, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." * Menu: * Introduction:: * Using the library:: * Error Handling:: * Mathematical Functions:: * Complex Numbers:: * Polynomials:: * Special Functions:: * Vectors and Matrices:: * Permutations:: * Combinations:: * Multisets:: * Sorting:: * BLAS Support:: * Linear Algebra:: * Eigensystems:: * Fast Fourier Transforms:: * Numerical Integration:: * Random Number Generation:: * Quasi-Random Sequences:: * Random Number Distributions:: * Statistics:: * Running 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:: * Sparse Matrices:: * Sparse BLAS Support:: * Sparse Linear Algebra:: * Physical Constants:: * IEEE floating-point arithmetic:: * Debugging Numerical Programs:: * Contributors to GSL:: * Autoconf Macros:: * GSL CBLAS Library:: * 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 Basis Splines 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', The Free Software Foundation also operates a license consulting service for commercial users (contact details available from ).  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, 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. 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 or online in the GSL bug tracker.(1) 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 . 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. ---------- Footnotes ---------- (1)  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 (3rd Ed.), ISBN 0954612078'. If you want to give a url, use "".  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 #include 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,(1) J0(5) = -1.775967713143382642e-01 The steps needed to compile this program are described in the following sections. ---------- Footnotes ---------- (1) The last few digits may vary slightly depending on the compiler and platform used--this is normal.  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 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. The option '-lm' links with the system math library. On some systems it is not needed.(1) For a tutorial introduction to the GNU C Compiler and related programs, see 'An Introduction to GCC' (ISBN 0954161793).(2) ---------- Footnotes ---------- (1) It is not needed on MacOS X. (2)  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 'libcblas.a', $ 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 If the ATLAS library is installed in a non-standard directory use the '-L' option to add it to the search path, as described above. For more information about BLAS functions 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, either modify the system dynamic linker configuration(1) or 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 $ 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 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 can 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 ---------- Footnotes ---------- (1) '/etc/ld.so.conf' on GNU/Linux systems.  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) so the library does not export any inline function definitions by default. Inline functions were introduced officially in the newer C99 standard but most C89 compilers have also included 'inline' as an extension for a long time. To allow the use of inline functions, the library provides optional inline versions of performance-critical routines by conditional compilation in the exported header files. 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. By default, the actual form of the inline keyword is 'extern inline', which is a 'gcc' extension that eliminates unnecessary function definitions. If the form 'extern inline' causes problems with other compilers a stricter autoconf test can be used, see *note Autoconf Macros::. When compiling with 'gcc' in C99 mode ('gcc -std=c99') the header files automatically switch to C99-compatible inline function declarations instead of 'extern inline'. With other C99 compilers, define the macro 'GSL_C99_INLINE' to use these declarations.  File: gsl-ref.info, Node: Long double, Next: Portability functions, Prev: Inline functions, Up: Using the library 2.6 Long double =============== In general, the algorithms in the library are written for double precision only. The 'long double' type is not supported for actual computation. One reason for this choice is that the precision of 'long double' is platform dependent. The IEEE standard only specifies the minimum precision of extended precision numbers, while the precision of 'double' is the same on all platforms. However, it is sometimes necessary to interact with external data in long-double format, so the vector and matrix datatypes include long-double versions. It should be noted that 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 ' 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 All types #include double #include long double #include float #include long #include unsigned long #include int #include unsigned int #include short #include unsigned short #include char #include 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 #include #include ... int status; size_t n = 37; gsl_set_error_handler_off(); status = gsl_fft_complex_radix2_forward (data, stride, 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.(1) -- 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. ---------- Footnotes ---------- (1) Note that the C99 standard only requires the system 'isinf' function to return a non-zero value, without the sign of the infinity. The implementation in some earlier versions of GSL used the system 'isinf' function and may have this behavior on some platforms. Therefore, it is advisable to test the sign of X separately, if needed, rather than relying the sign of the return value from 'gsl_isinf()'.  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_hypot3 (const double X, const double Y, const double Z) This function computes the value of \sqrt{x^2 + y^2 + z^2} in a way that avoids overflow. -- 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) -- Function: double gsl_pow_uint (double X, unsigned int N) These routines 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 'HAVE_INLINE' is defined, so that use of these functions should be as efficient as explicitly writing the corresponding product expression. #include 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 ================================= Note that the following macros perform multiple evaluations of their arguments, so they should not be used with arguments that have side effects (such as a call to a random number generator). -- 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. Note that x and y are compared to relative accuracy, so this function is not suitable for testing whether a value is approximately zero. 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: * Representation of 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: Representation of complex numbers, Next: Properties of complex numbers, Up: Complex Numbers 5.1 Representation of 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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: Representation of 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 ========================= The functions described here evaluate the polynomial P(x) = c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^{len-1} using Horner's method for stability. Inline versions of these functions are used when 'HAVE_INLINE' is defined. -- Function: double gsl_poly_eval (const double C[], const int LEN, const double X) This function evaluates a polynomial with real coefficients for the real variable X. -- Function: gsl_complex gsl_poly_complex_eval (const double C[], const int LEN, const gsl_complex Z) This function evaluates a polynomial with real coefficients for the complex variable Z. -- Function: gsl_complex gsl_complex_poly_complex_eval (const gsl_complex C[], const int LEN, const gsl_complex Z) This function evaluates a polynomial with complex coefficients for the complex variable Z. -- Function: int gsl_poly_eval_derivs (const double C[], const size_t LENC, const double X, double RES[], const size_t LENRES) This function evaluates a polynomial and its derivatives storing the results in the array RES of size LENRES. The output array contains the values of d^k P/d x^k for the specified value of X starting with k = 0.  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, and Burden and Faires, chapter 3, and discussed briefly below. Given a function f(x), an nth degree interpolating polynomial P_{n}(x) can be constructed which agrees with f at n+1 distinct points x_0,x_1,...,x_{n}. This polynomial can be written in a form known as Newton's divided-difference representation: P_n(x) = f(x_0) + \sum_(k=1)^n [x_0,x_1,...,x_k] (x-x_0)(x-x_1)...(x-x_(k-1)) where the divided differences [x_0,x_1,...,x_k] are defined in section 25.1.4 of Abramowitz and Stegun. Additionally, it is possible to construct an interpolating polynomial of degree 2n+1 which also matches the first derivatives of f at the points x_0,x_1,...,x_n. This is called the Hermite interpolating polynomial and is defined as H_(2n+1)(x) = f(z_0) + \sum_(k=1)^(2n+1) [z_0,z_1,...,z_k] (x-z_0)(x-z_1)...(x-z_(k-1)) where the elements of z = \{x_0,x_0,x_1,x_1,...,x_n,x_n\} are defined by z_{2k} = z_{2k+1} = x_k. The divided-differences [z_0,z_1,...,z_k] are discussed in Burden and Faires, section 3.4. -- 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 (X, Y) 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. Using the notation above, dd[k] = [x_0,x_1,...,x_k]. -- 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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. -- Function: int gsl_poly_dd_hermite_init (double DD[], double ZA[], const double XA[], const double YA[], const double DYA[], const size_t SIZE) This function computes a divided-difference representation of the interpolating Hermite polynomial for the points (X, Y) stored in the arrays XA and YA of length SIZE. Hermite interpolation constructs polynomials which also match first derivatives dy/dx which are provided in the array DYA also of length SIZE. The first derivatives can be incorported into the usual divided-difference algorithm by forming a new dataset z = \{x_0,x_0,x_1,x_1,...\}, which is stored in the array ZA of length 2*SIZE on output. On output the divided-differences of the Hermite representation are stored in the array DD, also of length 2*SIZE. Using the notation above, dd[k] = [z_0,z_1,...,z_k]. The resulting Hermite polynomial can be evaluated by calling 'gsl_poly_dd_eval' and using ZA for the input argument XA.  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. As in the quadratic case, finite precision may cause equal or closely-spaced real roots to move off the real axis into the complex plane, leading to a discrete change in the number of real roots. -- 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 #include 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.809016994374947673 +0.587785252292473359 z1 = -0.809016994374947673 -0.587785252292473359 z2 = +0.309016994374947507 +0.951056516295152976 z3 = +0.309016994374947507 -0.951056516295152976 z4 = +0.999999999999999889 +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 the following texts, Abramowitz and Stegun, 'Handbook of Mathematical Functions', Sections 25.1.4 and 25.2.26. R. L. Burden and J. D. Faires, 'Numerical Analysis', 9th edition, ISBN 0-538-73351-9, 2011.  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 + xt) + \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 * RESULT_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 spherical 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. Note that Abramowitz & Stegun refer to the Spence integral S(x)=Li_2(1-x) as the dilogarithm rather than Li_2(x).  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, gsl_mode_t MODE) -- Function: int gsl_sf_ellint_D_e (double PHI, double K, 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) = (1/3)(\sin(\phi))^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1).  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 Mills' 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_exprel_2'. 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. -- Function: double gsl_sf_expint_En (int N, double X) -- Function: int gsl_sf_expint_En_e (int N, double X, gsl_sf_result * RESULT) These routines compute the exponential integral E_n(x) of order n, E_n(x) := \Re \int_1^\infty dt \exp(-xt)/t^n.  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/\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1)) Note that the Fermi-Dirac integral is sometimes defined without the normalisation factor in other texts. -- 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 ============================= This following routines compute the gamma and beta functions in their full and incomplete forms, as well as various kinds of factorials. 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. -- 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 and its error can be reconstructed using the relation \Gamma(x) = sgn * \exp(result\_lg), taking into account the two components of RESULT_LG. -- 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). The Pochhammer symbol is also known as the Apell symbol and sometimes written as (a,x). When a and a+x are negative integers or zero, the limiting value of the ratio is returned. -- 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)). -- 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|) with a corresponding error term, and sgn = \sgn((a)_x) where (a)_x = \Gamma(a + x)/\Gamma(a). -- 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 0 <= x <= 1. For a > 0, b > 0 the value is computed using a continued fraction expansion. For all other values it is computed using the relation I_x(a,b,x) = (1/a) x^a 2F1(a,1-b,a+1,x)/B(a,b).  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) = F(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. -- 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 arrays of Legendre polynomials P_l(x) and 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) which are solutions of the differential equation (1 - x^2) d^2 P_l^m(x) / dx^2 P_l^m(x) - 2x d/dx P_l^m(x) + ( l(l+1) - m^2 / (1 - x^2) ) P_l^m(x) = 0 where the degree l and order m satisfy 0 \le l and 0 \le m \le l. The functions P_l^m(x) grow combinatorially with l and can overflow for l larger than about 150. Alternatively, one may calculate normalized associated Legendre polynomials. There are a number of different normalization conventions, and these functions can be stably computed up to degree and order 2700. The following normalizations are provided: 'Schmidt semi-normalization' Schmidt semi-normalized associated Legendre polynomials are often used in the magnetics community and are defined as S_l^0(x) = P_l^0(x) S_l^m(x) = (-1)^m \sqrt((2(l-m)! / (l+m)!)) P_l^m(x), m > 0 The factor of (-1)^m is called the Condon-Shortley phase factor and can be excluded if desired by setting the parameter 'csphase = 1' in the functions below. 'Spherical Harmonic Normalization' The associated Legendre polynomials suitable for calculating spherical harmonics are defined as Y_l^m(x) = (-1)^m \sqrt((2l + 1) * (l-m)! / (4 \pi) / (l+m)!) P_l^m(x) where again the phase factor (-1)^m can be included or excluded if desired. 'Full Normalization' The fully normalized associated Legendre polynomials are defined as N_l^m(x) = (-1)^m \sqrt((l + 1/2) * (l-m)! / (l+m)!) P_l^m(x) and have the property \int_(-1)^1 ( N_l^m(x) )^2 dx = 1 The normalized associated Legendre routines below use a recurrence relation which is stable up to a degree and order of about 2700. Beyond this, the computed functions could suffer from underflow leading to incorrect results. Routines are provided to compute first and second derivatives dP_l^m(x)/dx and d^2 P_l^m(x)/dx^2 as well as their alternate versions d P_l^m(\cos{\theta})/d\theta and d^2 P_l^m(\cos{\theta})/d\theta^2. While there is a simple scaling relationship between the two forms, the derivatives involving \theta are heavily used in spherical harmonic expansions and so these routines are also provided. In the functions below, a parameter of type 'gsl_sf_legendre_t' specifies the type of normalization to use. The possible values are 'GSL_SF_LEGENDRE_NONE' This specifies the computation of the unnormalized associated Legendre polynomials P_l^m(x). 'GSL_SF_LEGENDRE_SCHMIDT' This specifies the computation of the Schmidt semi-normalized associated Legendre polynomials S_l^m(x). 'GSL_SF_LEGENDRE_SPHARM' This specifies the computation of the spherical harmonic associated Legendre polynomials Y_l^m(x). 'GSL_SF_LEGENDRE_FULL' This specifies the computation of the fully normalized associated Legendre polynomials N_l^m(x). -- Function: int gsl_sf_legendre_array (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, double RESULT_ARRAY[]) -- Function: int gsl_sf_legendre_array_e (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, const double CSPHASE, double RESULT_ARRAY[]) These functions calculate all normalized associated Legendre polynomials for 0 \le l \le lmax and 0 \le m \le l for |x| <= 1. The NORM parameter specifies which normalization is used. The normalized P_l^m(x) values are stored in RESULT_ARRAY, whose minimum size can be obtained from calling 'gsl_sf_legendre_array_n'. The array index of P_l^m(x) is obtained from calling 'gsl_sf_legendre_array_index(l, m)'. To include or exclude the Condon-Shortley phase factor of (-1)^m, set the parameter CSPHASE to either -1 or 1 respectively in the '_e' function. This factor is included by default. -- Function: int gsl_sf_legendre_deriv_array (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) -- Function: int gsl_sf_legendre_deriv_array_e (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, const double CSPHASE, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) These functions calculate all normalized associated Legendre functions and their first derivatives up to degree LMAX for |x| < 1. The parameter NORM specifies the normalization used. The normalized P_l^m(x) values and their derivatives dP_l^m(x)/dx are stored in RESULT_ARRAY and RESULT_DERIV_ARRAY respectively. To include or exclude the Condon-Shortley phase factor of (-1)^m, set the parameter CSPHASE to either -1 or 1 respectively in the '_e' function. This factor is included by default. -- Function: int gsl_sf_legendre_deriv_alt_array (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) -- Function: int gsl_sf_legendre_deriv_alt_array_e (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, const double CSPHASE, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) These functions calculate all normalized associated Legendre functions and their (alternate) first derivatives up to degree LMAX for |x| < 1. The normalized P_l^m(x) values and their derivatives dP_l^m(\cos{\theta})/d\theta are stored in RESULT_ARRAY and RESULT_DERIV_ARRAY respectively. To include or exclude the Condon-Shortley phase factor of (-1)^m, set the parameter CSPHASE to either -1 or 1 respectively in the '_e' function. This factor is included by default. -- Function: int gsl_sf_legendre_deriv2_array (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[], double RESULT_DERIV2_ARRAY[]) -- Function: int gsl_sf_legendre_deriv2_array_e (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, const double CSPHASE, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[], double RESULT_DERIV2_ARRAY[]) These functions calculate all normalized associated Legendre functions and their first and second derivatives up to degree LMAX for |x| < 1. The parameter NORM specifies the normalization used. The normalized P_l^m(x), their first derivatives dP_l^m(x)/dx, and their second derivatives d^2 P_l^m(x)/dx^2 are stored in RESULT_ARRAY, RESULT_DERIV_ARRAY, and RESULT_DERIV2_ARRAY respectively. To include or exclude the Condon-Shortley phase factor of (-1)^m, set the parameter CSPHASE to either -1 or 1 respectively in the '_e' function. This factor is included by default. -- Function: int gsl_sf_legendre_deriv2_alt_array (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[], double RESULT_DERIV2_ARRAY[]) -- Function: int gsl_sf_legendre_deriv2_alt_array_e (const gsl_sf_legendre_t NORM, const size_t LMAX, const double X, const double CSPHASE, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[], double RESULT_DERIV2_ARRAY[]) These functions calculate all normalized associated Legendre functions and their (alternate) first and second derivatives up to degree LMAX for |x| < 1. The parameter NORM specifies the normalization used. The normalized P_l^m(x), their first derivatives dP_l^m(\cos{\theta})/d\theta, and their second derivatives d^2 P_l^m(\cos{\theta})/d\theta^2 are stored in RESULT_ARRAY, RESULT_DERIV_ARRAY, and RESULT_DERIV2_ARRAY respectively. To include or exclude the Condon-Shortley phase factor of (-1)^m, set the parameter CSPHASE to either -1 or 1 respectively in the '_e' function. This factor is included by default. -- Function: size_t gsl_sf_legendre_array_n (const size_t LMAX) This function returns the minimum array size for maximum degree LMAX needed for the array versions of the associated Legendre functions. Size is calculated as the total number of P_l^m(x) functions, plus extra space for precomputing multiplicative factors used in the recurrence relations. -- Function: size_t gsl_sf_legendre_array_index (const size_t L, const size_t M) This function returns the index into RESULT_ARRAY, RESULT_DERIV_ARRAY, or RESULT_DERIV2_ARRAY corresponding to P_l^m(x), P_l^{'m}(x), or P_l^{''m}(x). The index is given by l(l+1)/2 + m. -- 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: 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_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 are now deprecated and will be removed in a future release; see 'gsl_sf_legendre_array' and 'gsl_sf_legendre_deriv_array'. -- 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 are now deprecated and will be removed in a future release; see 'gsl_sf_legendre_array' and 'gsl_sf_legendre_deriv_array'. -- Function: int gsl_sf_legendre_array_size (const int LMAX, const int M) This function is now deprecated and will be removed in a future release.  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) -- Function: int gsl_sf_mathieu_a_e (int N, double Q, gsl_sf_result * RESULT) -- Function: int gsl_sf_mathieu_b (int N, double Q) -- Function: int gsl_sf_mathieu_b_e (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) -- Function: int gsl_sf_mathieu_ce_e (int N, double Q, double X, gsl_sf_result * RESULT) -- Function: int gsl_sf_mathieu_se (int N, double Q, double X) -- Function: int gsl_sf_mathieu_se_e (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) -- Function: int gsl_sf_mathieu_Mc_e (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) -- Function: int gsl_sf_mathieu_Ms_e (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 /* 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 CZR, CZI. -- 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 LSZR, LSZI.  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 #include #include 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.177596771314338264 +/- 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 #include 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.177596771314338264 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, Allan J. MacLeod, 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) N. M. Temme, Special Functions: An Introduction to the Classical Functions of Mathematical Physics (1996), ISBN 978-0471113133. 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). S. A. Holmes and W. E. Featherstone, A unified approach to the Clenshaw summation and the recursive computation of very high degree and order normalised associated Legendre functions, Journal of Geodesy, 76, pg. 279-299, 2002.  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'.  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 #include int main (void) { gsl_block * b = gsl_block_alloc (100); printf ("length of block = %zu\n", b->size); printf ("block data address = %p\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.  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.(1) 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 preprocessor 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. If you use a C99 compiler which requires inline functions in header files to be declared 'inline' instead of 'extern inline', define the macro 'GSL_C99_INLINE' (*note Inline functions::). With GCC this is selected automatically when compiling in C99 mode ('-std=c99'). If inline functions are not used, calls to the functions 'gsl_vector_get' and 'gsl_vector_set' will link to the compiled versions of these functions in the library itself. The range checking in these functions is controlled by the global integer variable 'gsl_check_range'. It is enabled by default--to disable it, set 'gsl_check_range' to zero. Due to function-call overhead, there is less benefit in disabling range checking here than for inline functions. -- Function: double gsl_vector_get (const gsl_vector * V, const 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- Function: void gsl_vector_set (gsl_vector * V, const 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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. Inline versions of these functions are used when 'HAVE_INLINE' is defined. ---------- Footnotes ---------- (1) Range checking is available in the GNU C Compiler bounds-checking extension, but it is not part of the default installation of GCC. Memory accesses can also be checked with Valgrind or the 'gcc -fmudflap' memory protection option.  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 ----------------------- -- 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. The result a_i \leftarrow a_i + b_i is stored in A and B remains unchanged. 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. The result a_i \leftarrow a_i - b_i is stored in A and B remains unchanged. 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. The result a_i \leftarrow a_i * b_i is stored in A and B remains unchanged. 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. The result a_i \leftarrow a_i / b_i is stored in A and B remains unchanged. 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. The result a_i \leftarrow x a_i is stored in A. -- 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. The result a_i \leftarrow a_i + x is stored in A.  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 ----------------------------------------------------- The following operations are only defined for real 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 ------------------------ The following functions are defined for real and complex vectors. For complex vectors both the real and imaginary parts must satisfy the conditions. -- 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) -- Function: int gsl_vector_isnonneg (const gsl_vector * V) These functions return 1 if all the elements of the vector V are zero, strictly positive, strictly negative, or non-negative respectively, and 0 otherwise. -- Function: int gsl_vector_equal (const gsl_vector * U, const gsl_vector * V) This function returns 1 if the vectors U and V are equal (by comparison of element values) and 0 otherwise.  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 #include 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 #include 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 #include 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 matrix 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.  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, const size_t I, const 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- Function: void gsl_matrix_set (gsl_matrix * M, const size_t I, const 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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. Inline versions of these functions are used when 'HAVE_INLINE' is defined.  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_subrow (gsl_matrix * M, size_t I, size_t OFFSET, size_t N) -- Function: gsl_vector_const_view gsl_matrix_const_subrow (const gsl_matrix * M, size_t I, size_t OFFSET, size_t N) These functions return a vector view of the I-th row of the matrix M beginning at OFFSET elements past the first column and containing N elements. The 'data' pointer of the new vector is set to null if I, OFFSET, or N are out of range. The function 'gsl_vector_const_subrow' is equivalent to 'gsl_matrix_subrow' but can be used for matrices which are declared 'const'. -- Function: gsl_vector_view gsl_matrix_subcolumn (gsl_matrix * M, size_t J, size_t OFFSET, size_t N) -- Function: gsl_vector_const_view gsl_matrix_const_subcolumn (const gsl_matrix * M, size_t J, size_t OFFSET, size_t N) These functions return a vector view of the J-th column of the matrix M beginning at OFFSET elements past the first row and containing N elements. The 'data' pointer of the new vector is set to null if J, OFFSET, or N are out of range. The function 'gsl_vector_const_subcolumn' is equivalent to 'gsl_matrix_subcolumn' 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 return 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. The result a(i,j) \leftarrow a(i,j) + b(i,j) is stored in A and B remains unchanged. 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. The result a(i,j) \leftarrow a(i,j) - b(i,j) is stored in A and B remains unchanged. 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. The result a(i,j) \leftarrow a(i,j) * b(i,j) is stored in A and B remains unchanged. 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. The result a(i,j) \leftarrow a(i,j) / b(i,j) is stored in A and B remains unchanged. 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. The result a(i,j) \leftarrow x a(i,j) is stored in A. -- 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. The result a(i,j) \leftarrow a(i,j) + x is stored in A.  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 ------------------------ The following functions are defined for real and complex matrices. For complex matrices both the real and imaginary parts must satisfy the conditions. -- 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) -- Function: int gsl_matrix_isnonneg (const gsl_matrix * M) These functions return 1 if all the elements of the matrix M are zero, strictly positive, strictly negative, or non-negative respectively, and 0 otherwise. To test whether a matrix is positive-definite, use the Cholesky decomposition (*note Cholesky Decomposition::). -- Function: int gsl_matrix_equal (const gsl_matrix * A, const gsl_matrix * B) This function returns 1 if the matrices A and B are equal (by comparison of element values) and 0 otherwise.  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 #include 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 #include 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 #include #include #include 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 %zu, 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. An inline version of this function is used when 'HAVE_INLINE' is defined. -- 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 (const 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_permute_matrix (const gsl_permutation * P, gsl_matrix * A) This function applies the permutation P to the matrix A from the right, A' = A P. The j-th column of the permutation matrix P is given by the P_j-th column of the identity matrix. This effectively permutes the columns of A according to the permutation P, and so the number of columns of A must equal the size of the permutation P. -- 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. In ISO C99 the type modifier 'z' represents 'size_t', so '"%zu\n"' is a suitable format.(1) 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. ---------- Footnotes ---------- (1) In versions of the GNU C library prior to the ISO C99 standard, the type modifier 'Z' was used instead.  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. gsl-doc-2.3/doc/gsl-design.texi0000664000175000017500000017077712616157443014512 0ustar eddedd\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 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@@sourceware.org} 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 Chebyshev @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 @dots{} 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 @w{} @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 @w{} @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 @w{} @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. Wherever 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 precede 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 output and the argument of @code{@@math} in the plain info output. Note that the @code{@@c@{@}} macro must go at the end of the preceding 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. To avoid confusion over ownership, workspaces should not own each other or contain other workspaces. For clarity and ease of use in different contexts, they should be allocated from integer arguments rather than derived from other structs. @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= 0; i--) @{ ... @} /* DOESN'T WORK */ @end example @noindent use something like @example for (i = N; i-- > 0;) @{ ... @} @end example @noindent to avoid problems with wrap-around at @code{i=0}. Note that the post-decrement ensures that the loop variable is tested before it reaches zero. Beware that @code{i} will wraparound on exit from the loop. (This could also be written as @code{for (i = N; i--;)} since the test for @code{i>0} is equivalent to @code{i!=0} for an unsigned integer) 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 Note (BJG). Originally, I suggested using @example for (i = N; i > 0 && i--;) @{ ... @} @end example which makes the test for @code{i>0} explicit and leaves @code{i=0} on exit from the loop. However, it is slower as there is an additional branch which prevents unrolling. Thanks to J. Seward for pointing this out. Note: As a matter of style, please use post-increment (@code{i++}) and post-decrement (@code{i--}) operators by default and only use pre-increment (@code{++i}) and pre-decrement (@code{--i}) operators where specifically needed. @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. , 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 nonhomogeneous 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 gsl-doc-2.3/doc/fft.texi0000664000175000017500000011755212616157443013225 0ustar eddedd@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_m$} @math{f_1 f_2 ... f_m} 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}) @tindex gsl_fft_complex_workspace 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 (assuming @var{stride=1}), @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_radix2_unpack} described below. @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 @deftypefun int gsl_fft_halfcomplex_radix2_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_radix2_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[i*stride]; double hc_imag = halfcomplex_coefficient[(n-i)*stride]; complex_coefficient[i*stride].real = hc_real; complex_coefficient[i*stride].imag = hc_imag; complex_coefficient[(n - i)*stride].real = hc_real; complex_coefficient[(n - i)*stride].imag = -hc_imag; @} if (i == n - i) @{ complex_coefficient[i*stride].real = halfcomplex_coefficient[(n - 1)*stride]; complex_coefficient[i*stride].imag = 0.0; @} @end example @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}) @tindex gsl_fft_real_wavetable @tindex gsl_fft_halfcomplex_wavetable 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}) @tindex gsl_fft_real_workspace 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*stride].real = real_coefficient[i*stride]; complex_coefficient[i*stride].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)*stride]; double hc_imag = halfcomplex_coefficient[(2 * i)*stride]; complex_coefficient[i*stride].real = hc_real; complex_coefficient[i*stride].imag = hc_imag; complex_coefficient[(n - i)*stride].real = hc_real; complex_coefficient[(n - i)*stride].imag = -hc_imag; @} if (i == n - i) @{ complex_coefficient[i*stride].real = halfcomplex_coefficient[(n - 1)*stride]; complex_coefficient[i*stride].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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @item FFTW Website, @uref{http://www.fftw.org/} @end itemize @noindent The source code for @sc{fftpack} is available from Netlib, @itemize @w{} @item FFTPACK, @uref{http://www.netlib.org/fftpack/} @end itemize gsl-doc-2.3/doc/final-route.eps0000664000175000017500000050714012616157443014505 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-fdist.tex0000664000175000017500000005335712616157443014332 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-fdist.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-fdist.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 2905 31 R 0 -31 V 2904 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1301 4944 M 3 -30 V 19 -181 V 19 -163 V 20 -148 V 19 -135 V 20 -125 V 19 -114 V 20 -106 V 19 -99 V 19 -92 V 20 -87 V 19 -81 V 20 -76 V 19 -72 V 20 -68 V 19 -64 V 19 -61 V 20 -58 V 19 -56 V 20 -53 V 19 -50 V 20 -49 V 19 -46 V 19 -44 V 20 -43 V 19 -41 V 20 -39 V 19 -38 V 20 -37 V 19 -35 V 19 -34 V 20 -33 V 19 -32 V 20 -30 V 19 -30 V 20 -29 V 19 -28 V 19 -27 V 20 -26 V 19 -26 V 20 -25 V 19 -24 V 20 -23 V 19 -23 V 19 -22 V 20 -22 V 19 -21 V 20 -21 V 19 -20 V 20 -19 V 19 -19 V 19 -19 V 20 -18 V 19 -18 V 20 -17 V 19 -17 V 20 -16 V 19 -17 V 19 -15 V 20 -16 V 19 -15 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 19 -14 V 20 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 19 -8 V 20 -7 V 3285 1516 L 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 5325 1089 L 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 1121 V 20 404 V 19 273 V 20 202 V 19 155 V 20 122 V 19 97 V 19 76 V 20 62 V 19 48 V 20 37 V 19 28 V 20 21 V 19 15 V 19 9 V 20 4 V 19 1 V 20 -3 V 19 -6 V 20 -9 V 19 -10 V 19 -13 V 20 -14 V 19 -16 V 20 -17 V 19 -18 V 20 -18 V 19 -20 V 19 -20 V 20 -21 V 19 -21 V 20 -21 V 19 -22 V 20 -22 V 19 -22 V 19 -22 V 20 -22 V 19 -23 V 20 -22 V 19 -22 V 20 -22 V 19 -22 V 19 -22 V 20 -22 V 19 -22 V 20 -21 V 19 -21 V 20 -21 V 19 -21 V 19 -21 V 20 -21 V 19 -20 V 20 -20 V 19 -20 V 20 -20 V 19 -19 V 19 -19 V 20 -19 V 19 -19 V 20 -18 V 19 -19 V 20 -18 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -17 V 19 -16 V 20 -15 V 19 -16 V 20 -15 V 19 -16 V 20 -15 V 19 -14 V 19 -15 V 20 -14 V 19 -14 V 20 -14 V 19 -14 V 20 -14 V 19 -13 V 19 -13 V 20 -14 V 19 -12 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 3052 1890 L 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 5092 1260 L 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\nu_1=3, \nu_2=2$}}% \put(5957,4781){\rjust{\strut{}$\nu_1=1, \nu_2=1$}}% \put(3955,5244){\cjust{\strut{}F-Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}2}}% \put(3956,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/specfunc-gamma.texi0000664000175000017500000003141312616157443015323 0ustar eddeddThis following routines compute the gamma and beta functions in their full and incomplete forms, as well as various kinds of factorials. 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. @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 and its error can be reconstructed using the relation @math{\Gamma(x) = sgn * \exp(result\_lg)}, taking into account the two components of @var{result_lg}. @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_EOVRFLW @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_EOVRFLW @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 Pochhammer symbol These routines compute the Pochhammer symbol @math{(a)_x = \Gamma(a + x)/\Gamma(a)}. The Pochhammer symbol is also known as the Apell symbol and sometimes written as @math{(a,x)}. When @math{a} and @math{a+x} are negative integers or zero, the limiting value of the ratio is returned. @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))}. @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|)} with a corresponding error term, and @math{sgn = \sgn((a)_x)} where @math{(a)_x = \Gamma(a + x)/\Gamma(a)}. @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 @c{$0 \le x \le 1$} @math{0 <= x <= 1}. For @math{a > 0}, @math{b > 0} the value is computed using a continued fraction expansion. For all other values it is computed using the relation @c{$I_x(a,b,x) = (1/a) x^a {}_2F_1(a,1-b,a+1,x)/B(a,b)$} @math{I_x(a,b,x) = (1/a) x^a 2F1(a,1-b,a+1,x)/B(a,b)}. @end deftypefun gsl-doc-2.3/doc/gpl.texi0000664000175000017500000010440512616157443013221 0ustar eddedd@center Version 3, 29 June 2007 @iftex @smallerfonts @rm @end iftex @c This file is intended to be included in another file. @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. @heading TERMS AND CONDITIONS @enumerate 0 @item Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. @item Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. @item Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. @item Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. @item Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. @item Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. @item You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. @item If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. @end enumerate A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. @item Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @enumerate a @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. @item Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. @item Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. @item Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. @end enumerate A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. @item Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or @item Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. @end enumerate All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. @item Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. @item Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. @item Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. @item Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. @item No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. @item Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. @item Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. @item Disclaimer of Warranty. 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 Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. @item Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. @end enumerate @heading END OF TERMS AND CONDITIONS @heading 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 state 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{year} @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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{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, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see @url{http://www.gnu.org/licenses/}. The GNU 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 Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. @iftex @* @textfonts @rm @end iftex gsl-doc-2.3/doc/gsl.30000664000175000017500000000241512616157443012413 0ustar eddedd.TH GSL 3 "GNU Scientific Library" "GSL Team" \" -*- nroff -*- .SH NAME gsl - GNU Scientific Library .SH SYNOPSIS #include .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. gsl-doc-2.3/doc/examples/0000755000175000017500000000000013022553155013344 5ustar eddeddgsl-doc-2.3/doc/examples/eigen.txt0000664000175000017500000000046112620431354015176 0ustar eddeddeigenvalue = 9.67023e-05 eigenvector = -0.0291933 0.328712 -0.791411 0.514553 eigenvalue = 0.00673827 eigenvector = -0.179186 0.741918 -0.100228 -0.638283 eigenvalue = 0.169141 eigenvector = 0.582076 -0.370502 -0.509579 -0.514048 eigenvalue = 1.50021 eigenvector = 0.792608 0.451923 0.322416 0.252161 gsl-doc-2.3/doc/examples/ntuple.txt0000664000175000017500000000537112620440522015420 0ustar eddedd0.000000 0.100000 0.000000 0.100000 0.200000 0.000000 0.200000 0.300000 0.000000 0.300000 0.400000 0.000000 0.400000 0.500000 0.000000 0.500000 0.600000 0.000000 0.600000 0.700000 0.000000 0.700000 0.800000 0.000000 0.800000 0.900000 0.000000 0.900000 1.000000 0.000000 1.000000 1.100000 0.000000 1.100000 1.200000 0.000000 1.200000 1.300000 0.000000 1.300000 1.400000 0.000000 1.400000 1.500000 0.000000 1.500000 1.600000 210.000000 1.600000 1.700000 221.000000 1.700000 1.800000 237.000000 1.800000 1.900000 207.000000 1.900000 2.000000 208.000000 2.000000 2.100000 212.000000 2.100000 2.200000 214.000000 2.200000 2.300000 177.000000 2.300000 2.400000 204.000000 2.400000 2.500000 172.000000 2.500000 2.600000 194.000000 2.600000 2.700000 167.000000 2.700000 2.800000 166.000000 2.800000 2.900000 174.000000 2.900000 3.000000 157.000000 3.000000 3.100000 159.000000 3.100000 3.200000 126.000000 3.200000 3.300000 146.000000 3.300000 3.400000 135.000000 3.400000 3.500000 129.000000 3.500000 3.600000 124.000000 3.600000 3.700000 110.000000 3.700000 3.800000 109.000000 3.800000 3.900000 120.000000 3.900000 4.000000 103.000000 4.000000 4.100000 104.000000 4.100000 4.200000 107.000000 4.200000 4.300000 104.000000 4.300000 4.400000 94.000000 4.400000 4.500000 88.000000 4.500000 4.600000 97.000000 4.600000 4.700000 82.000000 4.700000 4.800000 81.000000 4.800000 4.900000 69.000000 4.900000 5.000000 74.000000 5.000000 5.100000 67.000000 5.100000 5.200000 77.000000 5.200000 5.300000 66.000000 5.300000 5.400000 61.000000 5.400000 5.500000 66.000000 5.500000 5.600000 57.000000 5.600000 5.700000 62.000000 5.700000 5.800000 54.000000 5.800000 5.900000 52.000000 5.900000 6.000000 44.000000 6.000000 6.100000 43.000000 6.100000 6.200000 44.000000 6.200000 6.300000 46.000000 6.300000 6.400000 35.000000 6.400000 6.500000 37.000000 6.500000 6.600000 32.000000 6.600000 6.700000 37.000000 6.700000 6.800000 27.000000 6.800000 6.900000 38.000000 6.900000 7.000000 37.000000 7.000000 7.100000 38.000000 7.100000 7.200000 24.000000 7.200000 7.300000 33.000000 7.300000 7.400000 24.000000 7.400000 7.500000 25.000000 7.500000 7.600000 24.000000 7.600000 7.700000 20.000000 7.700000 7.800000 23.000000 7.800000 7.900000 19.000000 7.900000 8.000000 26.000000 8.000000 8.100000 18.000000 8.100000 8.200000 22.000000 8.200000 8.300000 22.000000 8.300000 8.400000 15.000000 8.400000 8.500000 14.000000 8.500000 8.600000 20.000000 8.600000 8.700000 17.000000 8.700000 8.800000 15.000000 8.800000 8.900000 9.000000 8.900000 9.000000 8.000000 9.000000 9.100000 12.000000 9.100000 9.200000 7.000000 9.200000 9.300000 10.000000 9.300000 9.400000 12.000000 9.400000 9.500000 9.000000 9.500000 9.600000 13.000000 9.600000 9.700000 12.000000 9.700000 9.800000 11.000000 9.800000 9.900000 13.000000 9.900000 10.000000 8.000000 gsl-doc-2.3/doc/examples/largefit.c0000644000175000017500000001070412753406363015317 0ustar eddedd#include #include #include #include #include #include #include #include /* function to be fitted */ double func(const double t) { double x = sin(10.0 * t); return exp(x*x*x); } /* construct a row of the least squares matrix */ int build_row(const double t, gsl_vector *row) { const size_t p = row->size; double Xj = 1.0; size_t j; for (j = 0; j < p; ++j) { gsl_vector_set(row, j, Xj); Xj *= t; } return 0; } int solve_system(const int print_data, const gsl_multilarge_linear_type * T, const double lambda, const size_t n, const size_t p, gsl_vector * c) { const size_t nblock = 5; /* number of blocks to accumulate */ const size_t nrows = n / nblock; /* number of rows per block */ gsl_multilarge_linear_workspace * w = gsl_multilarge_linear_alloc(T, p); gsl_matrix *X = gsl_matrix_alloc(nrows, p); gsl_vector *y = gsl_vector_alloc(nrows); gsl_rng *r = gsl_rng_alloc(gsl_rng_default); const size_t nlcurve = 200; gsl_vector *reg_param = gsl_vector_alloc(nlcurve); gsl_vector *rho = gsl_vector_alloc(nlcurve); gsl_vector *eta = gsl_vector_alloc(nlcurve); size_t rowidx = 0; double rnorm, snorm, rcond; double t = 0.0; double dt = 1.0 / (n - 1.0); while (rowidx < n) { size_t nleft = n - rowidx; /* number of rows left to accumulate */ size_t nr = GSL_MIN(nrows, nleft); /* number of rows in this block */ gsl_matrix_view Xv = gsl_matrix_submatrix(X, 0, 0, nr, p); gsl_vector_view yv = gsl_vector_subvector(y, 0, nr); size_t i; /* build (X,y) block with 'nr' rows */ for (i = 0; i < nr; ++i) { gsl_vector_view row = gsl_matrix_row(&Xv.matrix, i); double fi = func(t); double ei = gsl_ran_gaussian (r, 0.1 * fi); /* noise */ double yi = fi + ei; /* construct this row of LS matrix */ build_row(t, &row.vector); /* set right hand side value with added noise */ gsl_vector_set(&yv.vector, i, yi); if (print_data && (i % 100 == 0)) printf("%f %f\n", t, yi); t += dt; } /* accumulate (X,y) block into LS system */ gsl_multilarge_linear_accumulate(&Xv.matrix, &yv.vector, w); rowidx += nr; } if (print_data) printf("\n\n"); /* compute L-curve */ gsl_multilarge_linear_lcurve(reg_param, rho, eta, w); /* solve large LS system and store solution in c */ gsl_multilarge_linear_solve(lambda, c, &rnorm, &snorm, w); /* compute reciprocal condition number */ gsl_multilarge_linear_rcond(&rcond, w); fprintf(stderr, "=== Method %s ===\n", gsl_multilarge_linear_name(w)); fprintf(stderr, "condition number = %e\n", 1.0 / rcond); fprintf(stderr, "residual norm = %e\n", rnorm); fprintf(stderr, "solution norm = %e\n", snorm); /* output L-curve */ { size_t i; for (i = 0; i < nlcurve; ++i) { printf("%.12e %.12e %.12e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i)); } printf("\n\n"); } gsl_matrix_free(X); gsl_vector_free(y); gsl_multilarge_linear_free(w); gsl_rng_free(r); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); return 0; } int main(int argc, char *argv[]) { const size_t n = 50000; /* number of observations */ const size_t p = 16; /* polynomial order + 1 */ double lambda = 0.0; /* regularization parameter */ gsl_vector *c_tsqr = gsl_vector_alloc(p); gsl_vector *c_normal = gsl_vector_alloc(p); if (argc > 1) lambda = atof(argv[1]); /* solve system with TSQR method */ solve_system(1, gsl_multilarge_linear_tsqr, lambda, n, p, c_tsqr); /* solve system with Normal equations method */ solve_system(0, gsl_multilarge_linear_normal, lambda, n, p, c_normal); /* output solutions */ { gsl_vector *v = gsl_vector_alloc(p); double t; for (t = 0.0; t <= 1.0; t += 0.01) { double f_exact = func(t); double f_tsqr, f_normal; build_row(t, v); gsl_blas_ddot(v, c_tsqr, &f_tsqr); gsl_blas_ddot(v, c_normal, &f_normal); printf("%f %e %e %e\n", t, f_exact, f_tsqr, f_normal); } gsl_vector_free(v); } gsl_vector_free(c_tsqr); gsl_vector_free(c_normal); return 0; } gsl-doc-2.3/doc/examples/nmsimplex.txt0000664000175000017500000000250012620026734016121 0ustar eddedd 1 6.500e+00 5.000e+00 f() = 512.500 size = 1.130 2 5.250e+00 4.000e+00 f() = 290.625 size = 1.409 3 5.250e+00 4.000e+00 f() = 290.625 size = 1.409 4 5.500e+00 1.000e+00 f() = 252.500 size = 1.409 5 2.625e+00 3.500e+00 f() = 101.406 size = 1.847 6 2.625e+00 3.500e+00 f() = 101.406 size = 1.847 7 0.000e+00 3.000e+00 f() = 60.000 size = 1.847 8 2.094e+00 1.875e+00 f() = 42.275 size = 1.321 9 2.578e-01 1.906e+00 f() = 35.684 size = 1.069 10 5.879e-01 2.445e+00 f() = 35.664 size = 0.841 11 1.258e+00 2.025e+00 f() = 30.680 size = 0.476 12 1.258e+00 2.025e+00 f() = 30.680 size = 0.367 13 1.093e+00 1.849e+00 f() = 30.539 size = 0.300 14 8.830e-01 2.004e+00 f() = 30.137 size = 0.172 15 8.830e-01 2.004e+00 f() = 30.137 size = 0.126 16 9.582e-01 2.060e+00 f() = 30.090 size = 0.106 17 1.022e+00 2.004e+00 f() = 30.005 size = 0.063 18 1.022e+00 2.004e+00 f() = 30.005 size = 0.043 19 1.022e+00 2.004e+00 f() = 30.005 size = 0.043 20 1.022e+00 2.004e+00 f() = 30.005 size = 0.027 21 1.022e+00 2.004e+00 f() = 30.005 size = 0.022 22 9.920e-01 1.997e+00 f() = 30.001 size = 0.016 23 9.920e-01 1.997e+00 f() = 30.001 size = 0.013 converged to minimum at 24 9.920e-01 1.997e+00 f() = 30.001 size = 0.008 gsl-doc-2.3/doc/examples/eigen.c0000664000175000017500000000213212616157443014607 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/sortsmall.c0000664000175000017500000000116412620170441015530 0ustar eddedd#include #include 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 ("%zu smallest values from %zu\n", k, N); for (i = 0; i < k; i++) { printf ("%zu: %.18f\n", i, small[i]); } free (x); free (small); gsl_rng_free (r); return 0; } gsl-doc-2.3/doc/examples/min.c0000664000175000017500000000266012620167752014310 0ustar eddedd#include #include #include #include double fn1 (double x, void * params) { (void)(params); /* avoid unused parameter warning */ 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\n", iter, a, b, m, m - m_expected, b - a); } while (status == GSL_CONTINUE && iter < max_iter); gsl_min_fminimizer_free (s); return status; } gsl-doc-2.3/doc/examples/ieeeround.c0000664000175000017500000000070212616157443015500 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/interpp.c0000664000175000017500000000160012616157443015200 0ustar eddedd#include #include #include #include #include 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: y[0] == y[3] 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; } gsl-doc-2.3/doc/examples/interp2d.txt0000664000175000017500000101742412620026734015650 0ustar eddedd0.000000 0.000000 0.000000 0.000000 0.010101 0.010101 0.000000 0.020202 0.020202 0.000000 0.030303 0.030303 0.000000 0.040404 0.040404 0.000000 0.050505 0.050505 0.000000 0.060606 0.060606 0.000000 0.070707 0.070707 0.000000 0.080808 0.080808 0.000000 0.090909 0.090909 0.000000 0.101010 0.101010 0.000000 0.111111 0.111111 0.000000 0.121212 0.121212 0.000000 0.131313 0.131313 0.000000 0.141414 0.141414 0.000000 0.151515 0.151515 0.000000 0.161616 0.161616 0.000000 0.171717 0.171717 0.000000 0.181818 0.181818 0.000000 0.191919 0.191919 0.000000 0.202020 0.202020 0.000000 0.212121 0.212121 0.000000 0.222222 0.222222 0.000000 0.232323 0.232323 0.000000 0.242424 0.242424 0.000000 0.252525 0.252525 0.000000 0.262626 0.262626 0.000000 0.272727 0.272727 0.000000 0.282828 0.282828 0.000000 0.292929 0.292929 0.000000 0.303030 0.303030 0.000000 0.313131 0.313131 0.000000 0.323232 0.323232 0.000000 0.333333 0.333333 0.000000 0.343434 0.343434 0.000000 0.353535 0.353535 0.000000 0.363636 0.363636 0.000000 0.373737 0.373737 0.000000 0.383838 0.383838 0.000000 0.393939 0.393939 0.000000 0.404040 0.404040 0.000000 0.414141 0.414141 0.000000 0.424242 0.424242 0.000000 0.434343 0.434343 0.000000 0.444444 0.444444 0.000000 0.454545 0.454545 0.000000 0.464646 0.464646 0.000000 0.474747 0.474747 0.000000 0.484848 0.484848 0.000000 0.494949 0.494949 0.000000 0.505051 0.505051 0.000000 0.515152 0.515152 0.000000 0.525253 0.525253 0.000000 0.535354 0.535354 0.000000 0.545455 0.545455 0.000000 0.555556 0.555556 0.000000 0.565657 0.565657 0.000000 0.575758 0.575758 0.000000 0.585859 0.585859 0.000000 0.595960 0.595960 0.000000 0.606061 0.606061 0.000000 0.616162 0.616162 0.000000 0.626263 0.626263 0.000000 0.636364 0.636364 0.000000 0.646465 0.646465 0.000000 0.656566 0.656566 0.000000 0.666667 0.666667 0.000000 0.676768 0.676768 0.000000 0.686869 0.686869 0.000000 0.696970 0.696970 0.000000 0.707071 0.707071 0.000000 0.717172 0.717172 0.000000 0.727273 0.727273 0.000000 0.737374 0.737374 0.000000 0.747475 0.747475 0.000000 0.757576 0.757576 0.000000 0.767677 0.767677 0.000000 0.777778 0.777778 0.000000 0.787879 0.787879 0.000000 0.797980 0.797980 0.000000 0.808081 0.808081 0.000000 0.818182 0.818182 0.000000 0.828283 0.828283 0.000000 0.838384 0.838384 0.000000 0.848485 0.848485 0.000000 0.858586 0.858586 0.000000 0.868687 0.868687 0.000000 0.878788 0.878788 0.000000 0.888889 0.888889 0.000000 0.898990 0.898990 0.000000 0.909091 0.909091 0.000000 0.919192 0.919192 0.000000 0.929293 0.929293 0.000000 0.939394 0.939394 0.000000 0.949495 0.949495 0.000000 0.959596 0.959596 0.000000 0.969697 0.969697 0.000000 0.979798 0.979798 0.000000 0.989899 0.989899 0.000000 1.000000 1.000000 0.010101 0.000000 0.010101 0.010101 0.010101 0.020049 0.010101 0.020202 0.029997 0.010101 0.030303 0.039945 0.010101 0.040404 0.049893 0.010101 0.050505 0.059841 0.010101 0.060606 0.069789 0.010101 0.070707 0.079737 0.010101 0.080808 0.089685 0.010101 0.090909 0.099633 0.010101 0.101010 0.109581 0.010101 0.111111 0.119529 0.010101 0.121212 0.129477 0.010101 0.131313 0.139425 0.010101 0.141414 0.149373 0.010101 0.151515 0.159320 0.010101 0.161616 0.169268 0.010101 0.171717 0.179216 0.010101 0.181818 0.189164 0.010101 0.191919 0.199112 0.010101 0.202020 0.209060 0.010101 0.212121 0.219008 0.010101 0.222222 0.228956 0.010101 0.232323 0.238904 0.010101 0.242424 0.248852 0.010101 0.252525 0.258800 0.010101 0.262626 0.268748 0.010101 0.272727 0.278696 0.010101 0.282828 0.288644 0.010101 0.292929 0.298592 0.010101 0.303030 0.308540 0.010101 0.313131 0.318488 0.010101 0.323232 0.328436 0.010101 0.333333 0.338384 0.010101 0.343434 0.348332 0.010101 0.353535 0.358280 0.010101 0.363636 0.368228 0.010101 0.373737 0.378176 0.010101 0.383838 0.388124 0.010101 0.393939 0.398072 0.010101 0.404040 0.408020 0.010101 0.414141 0.417968 0.010101 0.424242 0.427916 0.010101 0.434343 0.437863 0.010101 0.444444 0.447811 0.010101 0.454545 0.457759 0.010101 0.464646 0.467707 0.010101 0.474747 0.477655 0.010101 0.484848 0.487603 0.010101 0.494949 0.497551 0.010101 0.505051 0.507499 0.010101 0.515152 0.517447 0.010101 0.525253 0.527395 0.010101 0.535354 0.537343 0.010101 0.545455 0.547291 0.010101 0.555556 0.557239 0.010101 0.565657 0.567187 0.010101 0.575758 0.577135 0.010101 0.585859 0.587083 0.010101 0.595960 0.597031 0.010101 0.606061 0.606979 0.010101 0.616162 0.616927 0.010101 0.626263 0.626875 0.010101 0.636364 0.636823 0.010101 0.646465 0.646771 0.010101 0.656566 0.656719 0.010101 0.666667 0.666667 0.010101 0.676768 0.676615 0.010101 0.686869 0.686563 0.010101 0.696970 0.696511 0.010101 0.707071 0.706459 0.010101 0.717172 0.716406 0.010101 0.727273 0.726354 0.010101 0.737374 0.736302 0.010101 0.747475 0.746250 0.010101 0.757576 0.756198 0.010101 0.767677 0.766146 0.010101 0.777778 0.776094 0.010101 0.787879 0.786042 0.010101 0.797980 0.795990 0.010101 0.808081 0.805938 0.010101 0.818182 0.815886 0.010101 0.828283 0.825834 0.010101 0.838384 0.835782 0.010101 0.848485 0.845730 0.010101 0.858586 0.855678 0.010101 0.868687 0.865626 0.010101 0.878788 0.875574 0.010101 0.888889 0.885522 0.010101 0.898990 0.895470 0.010101 0.909091 0.905418 0.010101 0.919192 0.915366 0.010101 0.929293 0.925314 0.010101 0.939394 0.935262 0.010101 0.949495 0.945210 0.010101 0.959596 0.955158 0.010101 0.969697 0.965106 0.010101 0.979798 0.975054 0.010101 0.989899 0.985002 0.010101 1.000000 0.994949 0.020202 0.000000 0.020202 0.020202 0.010101 0.029997 0.020202 0.020202 0.039792 0.020202 0.030303 0.049587 0.020202 0.040404 0.059382 0.020202 0.050505 0.069177 0.020202 0.060606 0.078972 0.020202 0.070707 0.088766 0.020202 0.080808 0.098561 0.020202 0.090909 0.108356 0.020202 0.101010 0.118151 0.020202 0.111111 0.127946 0.020202 0.121212 0.137741 0.020202 0.131313 0.147536 0.020202 0.141414 0.157331 0.020202 0.151515 0.167126 0.020202 0.161616 0.176921 0.020202 0.171717 0.186716 0.020202 0.181818 0.196511 0.020202 0.191919 0.206305 0.020202 0.202020 0.216100 0.020202 0.212121 0.225895 0.020202 0.222222 0.235690 0.020202 0.232323 0.245485 0.020202 0.242424 0.255280 0.020202 0.252525 0.265075 0.020202 0.262626 0.274870 0.020202 0.272727 0.284665 0.020202 0.282828 0.294460 0.020202 0.292929 0.304255 0.020202 0.303030 0.314050 0.020202 0.313131 0.323845 0.020202 0.323232 0.333639 0.020202 0.333333 0.343434 0.020202 0.343434 0.353229 0.020202 0.353535 0.363024 0.020202 0.363636 0.372819 0.020202 0.373737 0.382614 0.020202 0.383838 0.392409 0.020202 0.393939 0.402204 0.020202 0.404040 0.411999 0.020202 0.414141 0.421794 0.020202 0.424242 0.431589 0.020202 0.434343 0.441384 0.020202 0.444444 0.451178 0.020202 0.454545 0.460973 0.020202 0.464646 0.470768 0.020202 0.474747 0.480563 0.020202 0.484848 0.490358 0.020202 0.494949 0.500153 0.020202 0.505051 0.509948 0.020202 0.515152 0.519743 0.020202 0.525253 0.529538 0.020202 0.535354 0.539333 0.020202 0.545455 0.549128 0.020202 0.555556 0.558923 0.020202 0.565657 0.568717 0.020202 0.575758 0.578512 0.020202 0.585859 0.588307 0.020202 0.595960 0.598102 0.020202 0.606061 0.607897 0.020202 0.616162 0.617692 0.020202 0.626263 0.627487 0.020202 0.636364 0.637282 0.020202 0.646465 0.647077 0.020202 0.656566 0.656872 0.020202 0.666667 0.666667 0.020202 0.676768 0.676462 0.020202 0.686869 0.686257 0.020202 0.696970 0.696051 0.020202 0.707071 0.705846 0.020202 0.717172 0.715641 0.020202 0.727273 0.725436 0.020202 0.737374 0.735231 0.020202 0.747475 0.745026 0.020202 0.757576 0.754821 0.020202 0.767677 0.764616 0.020202 0.777778 0.774411 0.020202 0.787879 0.784206 0.020202 0.797980 0.794001 0.020202 0.808081 0.803796 0.020202 0.818182 0.813590 0.020202 0.828283 0.823385 0.020202 0.838384 0.833180 0.020202 0.848485 0.842975 0.020202 0.858586 0.852770 0.020202 0.868687 0.862565 0.020202 0.878788 0.872360 0.020202 0.888889 0.882155 0.020202 0.898990 0.891950 0.020202 0.909091 0.901745 0.020202 0.919192 0.911540 0.020202 0.929293 0.921335 0.020202 0.939394 0.931129 0.020202 0.949495 0.940924 0.020202 0.959596 0.950719 0.020202 0.969697 0.960514 0.020202 0.979798 0.970309 0.020202 0.989899 0.980104 0.020202 1.000000 0.989899 0.030303 0.000000 0.030303 0.030303 0.010101 0.039945 0.030303 0.020202 0.049587 0.030303 0.030303 0.059229 0.030303 0.040404 0.068871 0.030303 0.050505 0.078512 0.030303 0.060606 0.088154 0.030303 0.070707 0.097796 0.030303 0.080808 0.107438 0.030303 0.090909 0.117080 0.030303 0.101010 0.126722 0.030303 0.111111 0.136364 0.030303 0.121212 0.146006 0.030303 0.131313 0.155647 0.030303 0.141414 0.165289 0.030303 0.151515 0.174931 0.030303 0.161616 0.184573 0.030303 0.171717 0.194215 0.030303 0.181818 0.203857 0.030303 0.191919 0.213499 0.030303 0.202020 0.223140 0.030303 0.212121 0.232782 0.030303 0.222222 0.242424 0.030303 0.232323 0.252066 0.030303 0.242424 0.261708 0.030303 0.252525 0.271350 0.030303 0.262626 0.280992 0.030303 0.272727 0.290634 0.030303 0.282828 0.300275 0.030303 0.292929 0.309917 0.030303 0.303030 0.319559 0.030303 0.313131 0.329201 0.030303 0.323232 0.338843 0.030303 0.333333 0.348485 0.030303 0.343434 0.358127 0.030303 0.353535 0.367769 0.030303 0.363636 0.377410 0.030303 0.373737 0.387052 0.030303 0.383838 0.396694 0.030303 0.393939 0.406336 0.030303 0.404040 0.415978 0.030303 0.414141 0.425620 0.030303 0.424242 0.435262 0.030303 0.434343 0.444904 0.030303 0.444444 0.454545 0.030303 0.454545 0.464187 0.030303 0.464646 0.473829 0.030303 0.474747 0.483471 0.030303 0.484848 0.493113 0.030303 0.494949 0.502755 0.030303 0.505051 0.512397 0.030303 0.515152 0.522039 0.030303 0.525253 0.531680 0.030303 0.535354 0.541322 0.030303 0.545455 0.550964 0.030303 0.555556 0.560606 0.030303 0.565657 0.570248 0.030303 0.575758 0.579890 0.030303 0.585859 0.589532 0.030303 0.595960 0.599174 0.030303 0.606061 0.608815 0.030303 0.616162 0.618457 0.030303 0.626263 0.628099 0.030303 0.636364 0.637741 0.030303 0.646465 0.647383 0.030303 0.656566 0.657025 0.030303 0.666667 0.666667 0.030303 0.676768 0.676309 0.030303 0.686869 0.685950 0.030303 0.696970 0.695592 0.030303 0.707071 0.705234 0.030303 0.717172 0.714876 0.030303 0.727273 0.724518 0.030303 0.737374 0.734160 0.030303 0.747475 0.743802 0.030303 0.757576 0.753444 0.030303 0.767677 0.763085 0.030303 0.777778 0.772727 0.030303 0.787879 0.782369 0.030303 0.797980 0.792011 0.030303 0.808081 0.801653 0.030303 0.818182 0.811295 0.030303 0.828283 0.820937 0.030303 0.838384 0.830579 0.030303 0.848485 0.840220 0.030303 0.858586 0.849862 0.030303 0.868687 0.859504 0.030303 0.878788 0.869146 0.030303 0.888889 0.878788 0.030303 0.898990 0.888430 0.030303 0.909091 0.898072 0.030303 0.919192 0.907713 0.030303 0.929293 0.917355 0.030303 0.939394 0.926997 0.030303 0.949495 0.936639 0.030303 0.959596 0.946281 0.030303 0.969697 0.955923 0.030303 0.979798 0.965565 0.030303 0.989899 0.975207 0.030303 1.000000 0.984848 0.040404 0.000000 0.040404 0.040404 0.010101 0.049893 0.040404 0.020202 0.059382 0.040404 0.030303 0.068871 0.040404 0.040404 0.078359 0.040404 0.050505 0.087848 0.040404 0.060606 0.097337 0.040404 0.070707 0.106826 0.040404 0.080808 0.116315 0.040404 0.090909 0.125803 0.040404 0.101010 0.135292 0.040404 0.111111 0.144781 0.040404 0.121212 0.154270 0.040404 0.131313 0.163759 0.040404 0.141414 0.173248 0.040404 0.151515 0.182736 0.040404 0.161616 0.192225 0.040404 0.171717 0.201714 0.040404 0.181818 0.211203 0.040404 0.191919 0.220692 0.040404 0.202020 0.230181 0.040404 0.212121 0.239669 0.040404 0.222222 0.249158 0.040404 0.232323 0.258647 0.040404 0.242424 0.268136 0.040404 0.252525 0.277625 0.040404 0.262626 0.287114 0.040404 0.272727 0.296602 0.040404 0.282828 0.306091 0.040404 0.292929 0.315580 0.040404 0.303030 0.325069 0.040404 0.313131 0.334558 0.040404 0.323232 0.344047 0.040404 0.333333 0.353535 0.040404 0.343434 0.363024 0.040404 0.353535 0.372513 0.040404 0.363636 0.382002 0.040404 0.373737 0.391491 0.040404 0.383838 0.400979 0.040404 0.393939 0.410468 0.040404 0.404040 0.419957 0.040404 0.414141 0.429446 0.040404 0.424242 0.438935 0.040404 0.434343 0.448424 0.040404 0.444444 0.457912 0.040404 0.454545 0.467401 0.040404 0.464646 0.476890 0.040404 0.474747 0.486379 0.040404 0.484848 0.495868 0.040404 0.494949 0.505357 0.040404 0.505051 0.514845 0.040404 0.515152 0.524334 0.040404 0.525253 0.533823 0.040404 0.535354 0.543312 0.040404 0.545455 0.552801 0.040404 0.555556 0.562290 0.040404 0.565657 0.571778 0.040404 0.575758 0.581267 0.040404 0.585859 0.590756 0.040404 0.595960 0.600245 0.040404 0.606061 0.609734 0.040404 0.616162 0.619223 0.040404 0.626263 0.628711 0.040404 0.636364 0.638200 0.040404 0.646465 0.647689 0.040404 0.656566 0.657178 0.040404 0.666667 0.666667 0.040404 0.676768 0.676155 0.040404 0.686869 0.685644 0.040404 0.696970 0.695133 0.040404 0.707071 0.704622 0.040404 0.717172 0.714111 0.040404 0.727273 0.723600 0.040404 0.737374 0.733088 0.040404 0.747475 0.742577 0.040404 0.757576 0.752066 0.040404 0.767677 0.761555 0.040404 0.777778 0.771044 0.040404 0.787879 0.780533 0.040404 0.797980 0.790021 0.040404 0.808081 0.799510 0.040404 0.818182 0.808999 0.040404 0.828283 0.818488 0.040404 0.838384 0.827977 0.040404 0.848485 0.837466 0.040404 0.858586 0.846954 0.040404 0.868687 0.856443 0.040404 0.878788 0.865932 0.040404 0.888889 0.875421 0.040404 0.898990 0.884910 0.040404 0.909091 0.894399 0.040404 0.919192 0.903887 0.040404 0.929293 0.913376 0.040404 0.939394 0.922865 0.040404 0.949495 0.932354 0.040404 0.959596 0.941843 0.040404 0.969697 0.951331 0.040404 0.979798 0.960820 0.040404 0.989899 0.970309 0.040404 1.000000 0.979798 0.050505 0.000000 0.050505 0.050505 0.010101 0.059841 0.050505 0.020202 0.069177 0.050505 0.030303 0.078512 0.050505 0.040404 0.087848 0.050505 0.050505 0.097184 0.050505 0.060606 0.106520 0.050505 0.070707 0.115856 0.050505 0.080808 0.125191 0.050505 0.090909 0.134527 0.050505 0.101010 0.143863 0.050505 0.111111 0.153199 0.050505 0.121212 0.162534 0.050505 0.131313 0.171870 0.050505 0.141414 0.181206 0.050505 0.151515 0.190542 0.050505 0.161616 0.199878 0.050505 0.171717 0.209213 0.050505 0.181818 0.218549 0.050505 0.191919 0.227885 0.050505 0.202020 0.237221 0.050505 0.212121 0.246556 0.050505 0.222222 0.255892 0.050505 0.232323 0.265228 0.050505 0.242424 0.274564 0.050505 0.252525 0.283900 0.050505 0.262626 0.293235 0.050505 0.272727 0.302571 0.050505 0.282828 0.311907 0.050505 0.292929 0.321243 0.050505 0.303030 0.330579 0.050505 0.313131 0.339914 0.050505 0.323232 0.349250 0.050505 0.333333 0.358586 0.050505 0.343434 0.367922 0.050505 0.353535 0.377257 0.050505 0.363636 0.386593 0.050505 0.373737 0.395929 0.050505 0.383838 0.405265 0.050505 0.393939 0.414601 0.050505 0.404040 0.423936 0.050505 0.414141 0.433272 0.050505 0.424242 0.442608 0.050505 0.434343 0.451944 0.050505 0.444444 0.461279 0.050505 0.454545 0.470615 0.050505 0.464646 0.479951 0.050505 0.474747 0.489287 0.050505 0.484848 0.498623 0.050505 0.494949 0.507958 0.050505 0.505051 0.517294 0.050505 0.515152 0.526630 0.050505 0.525253 0.535966 0.050505 0.535354 0.545301 0.050505 0.545455 0.554637 0.050505 0.555556 0.563973 0.050505 0.565657 0.573309 0.050505 0.575758 0.582645 0.050505 0.585859 0.591980 0.050505 0.595960 0.601316 0.050505 0.606061 0.610652 0.050505 0.616162 0.619988 0.050505 0.626263 0.629324 0.050505 0.636364 0.638659 0.050505 0.646465 0.647995 0.050505 0.656566 0.657331 0.050505 0.666667 0.666667 0.050505 0.676768 0.676002 0.050505 0.686869 0.685338 0.050505 0.696970 0.694674 0.050505 0.707071 0.704010 0.050505 0.717172 0.713346 0.050505 0.727273 0.722681 0.050505 0.737374 0.732017 0.050505 0.747475 0.741353 0.050505 0.757576 0.750689 0.050505 0.767677 0.760024 0.050505 0.777778 0.769360 0.050505 0.787879 0.778696 0.050505 0.797980 0.788032 0.050505 0.808081 0.797368 0.050505 0.818182 0.806703 0.050505 0.828283 0.816039 0.050505 0.838384 0.825375 0.050505 0.848485 0.834711 0.050505 0.858586 0.844047 0.050505 0.868687 0.853382 0.050505 0.878788 0.862718 0.050505 0.888889 0.872054 0.050505 0.898990 0.881390 0.050505 0.909091 0.890725 0.050505 0.919192 0.900061 0.050505 0.929293 0.909397 0.050505 0.939394 0.918733 0.050505 0.949495 0.928069 0.050505 0.959596 0.937404 0.050505 0.969697 0.946740 0.050505 0.979798 0.956076 0.050505 0.989899 0.965412 0.050505 1.000000 0.974747 0.060606 0.000000 0.060606 0.060606 0.010101 0.069789 0.060606 0.020202 0.078972 0.060606 0.030303 0.088154 0.060606 0.040404 0.097337 0.060606 0.050505 0.106520 0.060606 0.060606 0.115702 0.060606 0.070707 0.124885 0.060606 0.080808 0.134068 0.060606 0.090909 0.143251 0.060606 0.101010 0.152433 0.060606 0.111111 0.161616 0.060606 0.121212 0.170799 0.060606 0.131313 0.179982 0.060606 0.141414 0.189164 0.060606 0.151515 0.198347 0.060606 0.161616 0.207530 0.060606 0.171717 0.216713 0.060606 0.181818 0.225895 0.060606 0.191919 0.235078 0.060606 0.202020 0.244261 0.060606 0.212121 0.253444 0.060606 0.222222 0.262626 0.060606 0.232323 0.271809 0.060606 0.242424 0.280992 0.060606 0.252525 0.290174 0.060606 0.262626 0.299357 0.060606 0.272727 0.308540 0.060606 0.282828 0.317723 0.060606 0.292929 0.326905 0.060606 0.303030 0.336088 0.060606 0.313131 0.345271 0.060606 0.323232 0.354454 0.060606 0.333333 0.363636 0.060606 0.343434 0.372819 0.060606 0.353535 0.382002 0.060606 0.363636 0.391185 0.060606 0.373737 0.400367 0.060606 0.383838 0.409550 0.060606 0.393939 0.418733 0.060606 0.404040 0.427916 0.060606 0.414141 0.437098 0.060606 0.424242 0.446281 0.060606 0.434343 0.455464 0.060606 0.444444 0.464646 0.060606 0.454545 0.473829 0.060606 0.464646 0.483012 0.060606 0.474747 0.492195 0.060606 0.484848 0.501377 0.060606 0.494949 0.510560 0.060606 0.505051 0.519743 0.060606 0.515152 0.528926 0.060606 0.525253 0.538108 0.060606 0.535354 0.547291 0.060606 0.545455 0.556474 0.060606 0.555556 0.565657 0.060606 0.565657 0.574839 0.060606 0.575758 0.584022 0.060606 0.585859 0.593205 0.060606 0.595960 0.602388 0.060606 0.606061 0.611570 0.060606 0.616162 0.620753 0.060606 0.626263 0.629936 0.060606 0.636364 0.639118 0.060606 0.646465 0.648301 0.060606 0.656566 0.657484 0.060606 0.666667 0.666667 0.060606 0.676768 0.675849 0.060606 0.686869 0.685032 0.060606 0.696970 0.694215 0.060606 0.707071 0.703398 0.060606 0.717172 0.712580 0.060606 0.727273 0.721763 0.060606 0.737374 0.730946 0.060606 0.747475 0.740129 0.060606 0.757576 0.749311 0.060606 0.767677 0.758494 0.060606 0.777778 0.767677 0.060606 0.787879 0.776860 0.060606 0.797980 0.786042 0.060606 0.808081 0.795225 0.060606 0.818182 0.804408 0.060606 0.828283 0.813590 0.060606 0.838384 0.822773 0.060606 0.848485 0.831956 0.060606 0.858586 0.841139 0.060606 0.868687 0.850321 0.060606 0.878788 0.859504 0.060606 0.888889 0.868687 0.060606 0.898990 0.877870 0.060606 0.909091 0.887052 0.060606 0.919192 0.896235 0.060606 0.929293 0.905418 0.060606 0.939394 0.914601 0.060606 0.949495 0.923783 0.060606 0.959596 0.932966 0.060606 0.969697 0.942149 0.060606 0.979798 0.951331 0.060606 0.989899 0.960514 0.060606 1.000000 0.969697 0.070707 0.000000 0.070707 0.070707 0.010101 0.079737 0.070707 0.020202 0.088766 0.070707 0.030303 0.097796 0.070707 0.040404 0.106826 0.070707 0.050505 0.115856 0.070707 0.060606 0.124885 0.070707 0.070707 0.133915 0.070707 0.080808 0.142945 0.070707 0.090909 0.151974 0.070707 0.101010 0.161004 0.070707 0.111111 0.170034 0.070707 0.121212 0.179063 0.070707 0.131313 0.188093 0.070707 0.141414 0.197123 0.070707 0.151515 0.206152 0.070707 0.161616 0.215182 0.070707 0.171717 0.224212 0.070707 0.181818 0.233242 0.070707 0.191919 0.242271 0.070707 0.202020 0.251301 0.070707 0.212121 0.260331 0.070707 0.222222 0.269360 0.070707 0.232323 0.278390 0.070707 0.242424 0.287420 0.070707 0.252525 0.296449 0.070707 0.262626 0.305479 0.070707 0.272727 0.314509 0.070707 0.282828 0.323538 0.070707 0.292929 0.332568 0.070707 0.303030 0.341598 0.070707 0.313131 0.350627 0.070707 0.323232 0.359657 0.070707 0.333333 0.368687 0.070707 0.343434 0.377717 0.070707 0.353535 0.386746 0.070707 0.363636 0.395776 0.070707 0.373737 0.404806 0.070707 0.383838 0.413835 0.070707 0.393939 0.422865 0.070707 0.404040 0.431895 0.070707 0.414141 0.440924 0.070707 0.424242 0.449954 0.070707 0.434343 0.458984 0.070707 0.444444 0.468013 0.070707 0.454545 0.477043 0.070707 0.464646 0.486073 0.070707 0.474747 0.495103 0.070707 0.484848 0.504132 0.070707 0.494949 0.513162 0.070707 0.505051 0.522192 0.070707 0.515152 0.531221 0.070707 0.525253 0.540251 0.070707 0.535354 0.549281 0.070707 0.545455 0.558310 0.070707 0.555556 0.567340 0.070707 0.565657 0.576370 0.070707 0.575758 0.585399 0.070707 0.585859 0.594429 0.070707 0.595960 0.603459 0.070707 0.606061 0.612489 0.070707 0.616162 0.621518 0.070707 0.626263 0.630548 0.070707 0.636364 0.639578 0.070707 0.646465 0.648607 0.070707 0.656566 0.657637 0.070707 0.666667 0.666667 0.070707 0.676768 0.675696 0.070707 0.686869 0.684726 0.070707 0.696970 0.693756 0.070707 0.707071 0.702785 0.070707 0.717172 0.711815 0.070707 0.727273 0.720845 0.070707 0.737374 0.729875 0.070707 0.747475 0.738904 0.070707 0.757576 0.747934 0.070707 0.767677 0.756964 0.070707 0.777778 0.765993 0.070707 0.787879 0.775023 0.070707 0.797980 0.784053 0.070707 0.808081 0.793082 0.070707 0.818182 0.802112 0.070707 0.828283 0.811142 0.070707 0.838384 0.820171 0.070707 0.848485 0.829201 0.070707 0.858586 0.838231 0.070707 0.868687 0.847260 0.070707 0.878788 0.856290 0.070707 0.888889 0.865320 0.070707 0.898990 0.874350 0.070707 0.909091 0.883379 0.070707 0.919192 0.892409 0.070707 0.929293 0.901439 0.070707 0.939394 0.910468 0.070707 0.949495 0.919498 0.070707 0.959596 0.928528 0.070707 0.969697 0.937557 0.070707 0.979798 0.946587 0.070707 0.989899 0.955617 0.070707 1.000000 0.964646 0.080808 0.000000 0.080808 0.080808 0.010101 0.089685 0.080808 0.020202 0.098561 0.080808 0.030303 0.107438 0.080808 0.040404 0.116315 0.080808 0.050505 0.125191 0.080808 0.060606 0.134068 0.080808 0.070707 0.142945 0.080808 0.080808 0.151821 0.080808 0.090909 0.160698 0.080808 0.101010 0.169575 0.080808 0.111111 0.178451 0.080808 0.121212 0.187328 0.080808 0.131313 0.196204 0.080808 0.141414 0.205081 0.080808 0.151515 0.213958 0.080808 0.161616 0.222834 0.080808 0.171717 0.231711 0.080808 0.181818 0.240588 0.080808 0.191919 0.249464 0.080808 0.202020 0.258341 0.080808 0.212121 0.267218 0.080808 0.222222 0.276094 0.080808 0.232323 0.284971 0.080808 0.242424 0.293848 0.080808 0.252525 0.302724 0.080808 0.262626 0.311601 0.080808 0.272727 0.320478 0.080808 0.282828 0.329354 0.080808 0.292929 0.338231 0.080808 0.303030 0.347107 0.080808 0.313131 0.355984 0.080808 0.323232 0.364861 0.080808 0.333333 0.373737 0.080808 0.343434 0.382614 0.080808 0.353535 0.391491 0.080808 0.363636 0.400367 0.080808 0.373737 0.409244 0.080808 0.383838 0.418121 0.080808 0.393939 0.426997 0.080808 0.404040 0.435874 0.080808 0.414141 0.444751 0.080808 0.424242 0.453627 0.080808 0.434343 0.462504 0.080808 0.444444 0.471380 0.080808 0.454545 0.480257 0.080808 0.464646 0.489134 0.080808 0.474747 0.498010 0.080808 0.484848 0.506887 0.080808 0.494949 0.515764 0.080808 0.505051 0.524640 0.080808 0.515152 0.533517 0.080808 0.525253 0.542394 0.080808 0.535354 0.551270 0.080808 0.545455 0.560147 0.080808 0.555556 0.569024 0.080808 0.565657 0.577900 0.080808 0.575758 0.586777 0.080808 0.585859 0.595654 0.080808 0.595960 0.604530 0.080808 0.606061 0.613407 0.080808 0.616162 0.622283 0.080808 0.626263 0.631160 0.080808 0.636364 0.640037 0.080808 0.646465 0.648913 0.080808 0.656566 0.657790 0.080808 0.666667 0.666667 0.080808 0.676768 0.675543 0.080808 0.686869 0.684420 0.080808 0.696970 0.693297 0.080808 0.707071 0.702173 0.080808 0.717172 0.711050 0.080808 0.727273 0.719927 0.080808 0.737374 0.728803 0.080808 0.747475 0.737680 0.080808 0.757576 0.746556 0.080808 0.767677 0.755433 0.080808 0.777778 0.764310 0.080808 0.787879 0.773186 0.080808 0.797980 0.782063 0.080808 0.808081 0.790940 0.080808 0.818182 0.799816 0.080808 0.828283 0.808693 0.080808 0.838384 0.817570 0.080808 0.848485 0.826446 0.080808 0.858586 0.835323 0.080808 0.868687 0.844200 0.080808 0.878788 0.853076 0.080808 0.888889 0.861953 0.080808 0.898990 0.870830 0.080808 0.909091 0.879706 0.080808 0.919192 0.888583 0.080808 0.929293 0.897459 0.080808 0.939394 0.906336 0.080808 0.949495 0.915213 0.080808 0.959596 0.924089 0.080808 0.969697 0.932966 0.080808 0.979798 0.941843 0.080808 0.989899 0.950719 0.080808 1.000000 0.959596 0.090909 0.000000 0.090909 0.090909 0.010101 0.099633 0.090909 0.020202 0.108356 0.090909 0.030303 0.117080 0.090909 0.040404 0.125803 0.090909 0.050505 0.134527 0.090909 0.060606 0.143251 0.090909 0.070707 0.151974 0.090909 0.080808 0.160698 0.090909 0.090909 0.169421 0.090909 0.101010 0.178145 0.090909 0.111111 0.186869 0.090909 0.121212 0.195592 0.090909 0.131313 0.204316 0.090909 0.141414 0.213039 0.090909 0.151515 0.221763 0.090909 0.161616 0.230487 0.090909 0.171717 0.239210 0.090909 0.181818 0.247934 0.090909 0.191919 0.256657 0.090909 0.202020 0.265381 0.090909 0.212121 0.274105 0.090909 0.222222 0.282828 0.090909 0.232323 0.291552 0.090909 0.242424 0.300275 0.090909 0.252525 0.308999 0.090909 0.262626 0.317723 0.090909 0.272727 0.326446 0.090909 0.282828 0.335170 0.090909 0.292929 0.343893 0.090909 0.303030 0.352617 0.090909 0.313131 0.361341 0.090909 0.323232 0.370064 0.090909 0.333333 0.378788 0.090909 0.343434 0.387511 0.090909 0.353535 0.396235 0.090909 0.363636 0.404959 0.090909 0.373737 0.413682 0.090909 0.383838 0.422406 0.090909 0.393939 0.431129 0.090909 0.404040 0.439853 0.090909 0.414141 0.448577 0.090909 0.424242 0.457300 0.090909 0.434343 0.466024 0.090909 0.444444 0.474747 0.090909 0.454545 0.483471 0.090909 0.464646 0.492195 0.090909 0.474747 0.500918 0.090909 0.484848 0.509642 0.090909 0.494949 0.518365 0.090909 0.505051 0.527089 0.090909 0.515152 0.535813 0.090909 0.525253 0.544536 0.090909 0.535354 0.553260 0.090909 0.545455 0.561983 0.090909 0.555556 0.570707 0.090909 0.565657 0.579431 0.090909 0.575758 0.588154 0.090909 0.585859 0.596878 0.090909 0.595960 0.605601 0.090909 0.606061 0.614325 0.090909 0.616162 0.623049 0.090909 0.626263 0.631772 0.090909 0.636364 0.640496 0.090909 0.646465 0.649219 0.090909 0.656566 0.657943 0.090909 0.666667 0.666667 0.090909 0.676768 0.675390 0.090909 0.686869 0.684114 0.090909 0.696970 0.692837 0.090909 0.707071 0.701561 0.090909 0.717172 0.710285 0.090909 0.727273 0.719008 0.090909 0.737374 0.727732 0.090909 0.747475 0.736455 0.090909 0.757576 0.745179 0.090909 0.767677 0.753903 0.090909 0.777778 0.762626 0.090909 0.787879 0.771350 0.090909 0.797980 0.780073 0.090909 0.808081 0.788797 0.090909 0.818182 0.797521 0.090909 0.828283 0.806244 0.090909 0.838384 0.814968 0.090909 0.848485 0.823691 0.090909 0.858586 0.832415 0.090909 0.868687 0.841139 0.090909 0.878788 0.849862 0.090909 0.888889 0.858586 0.090909 0.898990 0.867309 0.090909 0.909091 0.876033 0.090909 0.919192 0.884757 0.090909 0.929293 0.893480 0.090909 0.939394 0.902204 0.090909 0.949495 0.910927 0.090909 0.959596 0.919651 0.090909 0.969697 0.928375 0.090909 0.979798 0.937098 0.090909 0.989899 0.945822 0.090909 1.000000 0.954545 0.101010 0.000000 0.101010 0.101010 0.010101 0.109581 0.101010 0.020202 0.118151 0.101010 0.030303 0.126722 0.101010 0.040404 0.135292 0.101010 0.050505 0.143863 0.101010 0.060606 0.152433 0.101010 0.070707 0.161004 0.101010 0.080808 0.169575 0.101010 0.090909 0.178145 0.101010 0.101010 0.186716 0.101010 0.111111 0.195286 0.101010 0.121212 0.203857 0.101010 0.131313 0.212427 0.101010 0.141414 0.220998 0.101010 0.151515 0.229568 0.101010 0.161616 0.238139 0.101010 0.171717 0.246710 0.101010 0.181818 0.255280 0.101010 0.191919 0.263851 0.101010 0.202020 0.272421 0.101010 0.212121 0.280992 0.101010 0.222222 0.289562 0.101010 0.232323 0.298133 0.101010 0.242424 0.306703 0.101010 0.252525 0.315274 0.101010 0.262626 0.323845 0.101010 0.272727 0.332415 0.101010 0.282828 0.340986 0.101010 0.292929 0.349556 0.101010 0.303030 0.358127 0.101010 0.313131 0.366697 0.101010 0.323232 0.375268 0.101010 0.333333 0.383838 0.101010 0.343434 0.392409 0.101010 0.353535 0.400979 0.101010 0.363636 0.409550 0.101010 0.373737 0.418121 0.101010 0.383838 0.426691 0.101010 0.393939 0.435262 0.101010 0.404040 0.443832 0.101010 0.414141 0.452403 0.101010 0.424242 0.460973 0.101010 0.434343 0.469544 0.101010 0.444444 0.478114 0.101010 0.454545 0.486685 0.101010 0.464646 0.495256 0.101010 0.474747 0.503826 0.101010 0.484848 0.512397 0.101010 0.494949 0.520967 0.101010 0.505051 0.529538 0.101010 0.515152 0.538108 0.101010 0.525253 0.546679 0.101010 0.535354 0.555249 0.101010 0.545455 0.563820 0.101010 0.555556 0.572391 0.101010 0.565657 0.580961 0.101010 0.575758 0.589532 0.101010 0.585859 0.598102 0.101010 0.595960 0.606673 0.101010 0.606061 0.615243 0.101010 0.616162 0.623814 0.101010 0.626263 0.632384 0.101010 0.636364 0.640955 0.101010 0.646465 0.649526 0.101010 0.656566 0.658096 0.101010 0.666667 0.666667 0.101010 0.676768 0.675237 0.101010 0.686869 0.683808 0.101010 0.696970 0.692378 0.101010 0.707071 0.700949 0.101010 0.717172 0.709519 0.101010 0.727273 0.718090 0.101010 0.737374 0.726661 0.101010 0.747475 0.735231 0.101010 0.757576 0.743802 0.101010 0.767677 0.752372 0.101010 0.777778 0.760943 0.101010 0.787879 0.769513 0.101010 0.797980 0.778084 0.101010 0.808081 0.786654 0.101010 0.818182 0.795225 0.101010 0.828283 0.803796 0.101010 0.838384 0.812366 0.101010 0.848485 0.820937 0.101010 0.858586 0.829507 0.101010 0.868687 0.838078 0.101010 0.878788 0.846648 0.101010 0.888889 0.855219 0.101010 0.898990 0.863789 0.101010 0.909091 0.872360 0.101010 0.919192 0.880931 0.101010 0.929293 0.889501 0.101010 0.939394 0.898072 0.101010 0.949495 0.906642 0.101010 0.959596 0.915213 0.101010 0.969697 0.923783 0.101010 0.979798 0.932354 0.101010 0.989899 0.940924 0.101010 1.000000 0.949495 0.111111 0.000000 0.111111 0.111111 0.010101 0.119529 0.111111 0.020202 0.127946 0.111111 0.030303 0.136364 0.111111 0.040404 0.144781 0.111111 0.050505 0.153199 0.111111 0.060606 0.161616 0.111111 0.070707 0.170034 0.111111 0.080808 0.178451 0.111111 0.090909 0.186869 0.111111 0.101010 0.195286 0.111111 0.111111 0.203704 0.111111 0.121212 0.212121 0.111111 0.131313 0.220539 0.111111 0.141414 0.228956 0.111111 0.151515 0.237374 0.111111 0.161616 0.245791 0.111111 0.171717 0.254209 0.111111 0.181818 0.262626 0.111111 0.191919 0.271044 0.111111 0.202020 0.279461 0.111111 0.212121 0.287879 0.111111 0.222222 0.296296 0.111111 0.232323 0.304714 0.111111 0.242424 0.313131 0.111111 0.252525 0.321549 0.111111 0.262626 0.329966 0.111111 0.272727 0.338384 0.111111 0.282828 0.346801 0.111111 0.292929 0.355219 0.111111 0.303030 0.363636 0.111111 0.313131 0.372054 0.111111 0.323232 0.380471 0.111111 0.333333 0.388889 0.111111 0.343434 0.397306 0.111111 0.353535 0.405724 0.111111 0.363636 0.414141 0.111111 0.373737 0.422559 0.111111 0.383838 0.430976 0.111111 0.393939 0.439394 0.111111 0.404040 0.447811 0.111111 0.414141 0.456229 0.111111 0.424242 0.464646 0.111111 0.434343 0.473064 0.111111 0.444444 0.481481 0.111111 0.454545 0.489899 0.111111 0.464646 0.498316 0.111111 0.474747 0.506734 0.111111 0.484848 0.515152 0.111111 0.494949 0.523569 0.111111 0.505051 0.531987 0.111111 0.515152 0.540404 0.111111 0.525253 0.548822 0.111111 0.535354 0.557239 0.111111 0.545455 0.565657 0.111111 0.555556 0.574074 0.111111 0.565657 0.582492 0.111111 0.575758 0.590909 0.111111 0.585859 0.599327 0.111111 0.595960 0.607744 0.111111 0.606061 0.616162 0.111111 0.616162 0.624579 0.111111 0.626263 0.632997 0.111111 0.636364 0.641414 0.111111 0.646465 0.649832 0.111111 0.656566 0.658249 0.111111 0.666667 0.666667 0.111111 0.676768 0.675084 0.111111 0.686869 0.683502 0.111111 0.696970 0.691919 0.111111 0.707071 0.700337 0.111111 0.717172 0.708754 0.111111 0.727273 0.717172 0.111111 0.737374 0.725589 0.111111 0.747475 0.734007 0.111111 0.757576 0.742424 0.111111 0.767677 0.750842 0.111111 0.777778 0.759259 0.111111 0.787879 0.767677 0.111111 0.797980 0.776094 0.111111 0.808081 0.784512 0.111111 0.818182 0.792929 0.111111 0.828283 0.801347 0.111111 0.838384 0.809764 0.111111 0.848485 0.818182 0.111111 0.858586 0.826599 0.111111 0.868687 0.835017 0.111111 0.878788 0.843434 0.111111 0.888889 0.851852 0.111111 0.898990 0.860269 0.111111 0.909091 0.868687 0.111111 0.919192 0.877104 0.111111 0.929293 0.885522 0.111111 0.939394 0.893939 0.111111 0.949495 0.902357 0.111111 0.959596 0.910774 0.111111 0.969697 0.919192 0.111111 0.979798 0.927609 0.111111 0.989899 0.936027 0.111111 1.000000 0.944444 0.121212 0.000000 0.121212 0.121212 0.010101 0.129477 0.121212 0.020202 0.137741 0.121212 0.030303 0.146006 0.121212 0.040404 0.154270 0.121212 0.050505 0.162534 0.121212 0.060606 0.170799 0.121212 0.070707 0.179063 0.121212 0.080808 0.187328 0.121212 0.090909 0.195592 0.121212 0.101010 0.203857 0.121212 0.111111 0.212121 0.121212 0.121212 0.220386 0.121212 0.131313 0.228650 0.121212 0.141414 0.236915 0.121212 0.151515 0.245179 0.121212 0.161616 0.253444 0.121212 0.171717 0.261708 0.121212 0.181818 0.269972 0.121212 0.191919 0.278237 0.121212 0.202020 0.286501 0.121212 0.212121 0.294766 0.121212 0.222222 0.303030 0.121212 0.232323 0.311295 0.121212 0.242424 0.319559 0.121212 0.252525 0.327824 0.121212 0.262626 0.336088 0.121212 0.272727 0.344353 0.121212 0.282828 0.352617 0.121212 0.292929 0.360882 0.121212 0.303030 0.369146 0.121212 0.313131 0.377410 0.121212 0.323232 0.385675 0.121212 0.333333 0.393939 0.121212 0.343434 0.402204 0.121212 0.353535 0.410468 0.121212 0.363636 0.418733 0.121212 0.373737 0.426997 0.121212 0.383838 0.435262 0.121212 0.393939 0.443526 0.121212 0.404040 0.451791 0.121212 0.414141 0.460055 0.121212 0.424242 0.468320 0.121212 0.434343 0.476584 0.121212 0.444444 0.484848 0.121212 0.454545 0.493113 0.121212 0.464646 0.501377 0.121212 0.474747 0.509642 0.121212 0.484848 0.517906 0.121212 0.494949 0.526171 0.121212 0.505051 0.534435 0.121212 0.515152 0.542700 0.121212 0.525253 0.550964 0.121212 0.535354 0.559229 0.121212 0.545455 0.567493 0.121212 0.555556 0.575758 0.121212 0.565657 0.584022 0.121212 0.575758 0.592287 0.121212 0.585859 0.600551 0.121212 0.595960 0.608815 0.121212 0.606061 0.617080 0.121212 0.616162 0.625344 0.121212 0.626263 0.633609 0.121212 0.636364 0.641873 0.121212 0.646465 0.650138 0.121212 0.656566 0.658402 0.121212 0.666667 0.666667 0.121212 0.676768 0.674931 0.121212 0.686869 0.683196 0.121212 0.696970 0.691460 0.121212 0.707071 0.699725 0.121212 0.717172 0.707989 0.121212 0.727273 0.716253 0.121212 0.737374 0.724518 0.121212 0.747475 0.732782 0.121212 0.757576 0.741047 0.121212 0.767677 0.749311 0.121212 0.777778 0.757576 0.121212 0.787879 0.765840 0.121212 0.797980 0.774105 0.121212 0.808081 0.782369 0.121212 0.818182 0.790634 0.121212 0.828283 0.798898 0.121212 0.838384 0.807163 0.121212 0.848485 0.815427 0.121212 0.858586 0.823691 0.121212 0.868687 0.831956 0.121212 0.878788 0.840220 0.121212 0.888889 0.848485 0.121212 0.898990 0.856749 0.121212 0.909091 0.865014 0.121212 0.919192 0.873278 0.121212 0.929293 0.881543 0.121212 0.939394 0.889807 0.121212 0.949495 0.898072 0.121212 0.959596 0.906336 0.121212 0.969697 0.914601 0.121212 0.979798 0.922865 0.121212 0.989899 0.931129 0.121212 1.000000 0.939394 0.131313 0.000000 0.131313 0.131313 0.010101 0.139425 0.131313 0.020202 0.147536 0.131313 0.030303 0.155647 0.131313 0.040404 0.163759 0.131313 0.050505 0.171870 0.131313 0.060606 0.179982 0.131313 0.070707 0.188093 0.131313 0.080808 0.196204 0.131313 0.090909 0.204316 0.131313 0.101010 0.212427 0.131313 0.111111 0.220539 0.131313 0.121212 0.228650 0.131313 0.131313 0.236762 0.131313 0.141414 0.244873 0.131313 0.151515 0.252984 0.131313 0.161616 0.261096 0.131313 0.171717 0.269207 0.131313 0.181818 0.277319 0.131313 0.191919 0.285430 0.131313 0.202020 0.293541 0.131313 0.212121 0.301653 0.131313 0.222222 0.309764 0.131313 0.232323 0.317876 0.131313 0.242424 0.325987 0.131313 0.252525 0.334099 0.131313 0.262626 0.342210 0.131313 0.272727 0.350321 0.131313 0.282828 0.358433 0.131313 0.292929 0.366544 0.131313 0.303030 0.374656 0.131313 0.313131 0.382767 0.131313 0.323232 0.390878 0.131313 0.333333 0.398990 0.131313 0.343434 0.407101 0.131313 0.353535 0.415213 0.131313 0.363636 0.423324 0.131313 0.373737 0.431436 0.131313 0.383838 0.439547 0.131313 0.393939 0.447658 0.131313 0.404040 0.455770 0.131313 0.414141 0.463881 0.131313 0.424242 0.471993 0.131313 0.434343 0.480104 0.131313 0.444444 0.488215 0.131313 0.454545 0.496327 0.131313 0.464646 0.504438 0.131313 0.474747 0.512550 0.131313 0.484848 0.520661 0.131313 0.494949 0.528773 0.131313 0.505051 0.536884 0.131313 0.515152 0.544995 0.131313 0.525253 0.553107 0.131313 0.535354 0.561218 0.131313 0.545455 0.569330 0.131313 0.555556 0.577441 0.131313 0.565657 0.585552 0.131313 0.575758 0.593664 0.131313 0.585859 0.601775 0.131313 0.595960 0.609887 0.131313 0.606061 0.617998 0.131313 0.616162 0.626110 0.131313 0.626263 0.634221 0.131313 0.636364 0.642332 0.131313 0.646465 0.650444 0.131313 0.656566 0.658555 0.131313 0.666667 0.666667 0.131313 0.676768 0.674778 0.131313 0.686869 0.682890 0.131313 0.696970 0.691001 0.131313 0.707071 0.699112 0.131313 0.717172 0.707224 0.131313 0.727273 0.715335 0.131313 0.737374 0.723447 0.131313 0.747475 0.731558 0.131313 0.757576 0.739669 0.131313 0.767677 0.747781 0.131313 0.777778 0.755892 0.131313 0.787879 0.764004 0.131313 0.797980 0.772115 0.131313 0.808081 0.780227 0.131313 0.818182 0.788338 0.131313 0.828283 0.796449 0.131313 0.838384 0.804561 0.131313 0.848485 0.812672 0.131313 0.858586 0.820784 0.131313 0.868687 0.828895 0.131313 0.878788 0.837006 0.131313 0.888889 0.845118 0.131313 0.898990 0.853229 0.131313 0.909091 0.861341 0.131313 0.919192 0.869452 0.131313 0.929293 0.877564 0.131313 0.939394 0.885675 0.131313 0.949495 0.893786 0.131313 0.959596 0.901898 0.131313 0.969697 0.910009 0.131313 0.979798 0.918121 0.131313 0.989899 0.926232 0.131313 1.000000 0.934343 0.141414 0.000000 0.141414 0.141414 0.010101 0.149373 0.141414 0.020202 0.157331 0.141414 0.030303 0.165289 0.141414 0.040404 0.173248 0.141414 0.050505 0.181206 0.141414 0.060606 0.189164 0.141414 0.070707 0.197123 0.141414 0.080808 0.205081 0.141414 0.090909 0.213039 0.141414 0.101010 0.220998 0.141414 0.111111 0.228956 0.141414 0.121212 0.236915 0.141414 0.131313 0.244873 0.141414 0.141414 0.252831 0.141414 0.151515 0.260790 0.141414 0.161616 0.268748 0.141414 0.171717 0.276706 0.141414 0.181818 0.284665 0.141414 0.191919 0.292623 0.141414 0.202020 0.300582 0.141414 0.212121 0.308540 0.141414 0.222222 0.316498 0.141414 0.232323 0.324457 0.141414 0.242424 0.332415 0.141414 0.252525 0.340373 0.141414 0.262626 0.348332 0.141414 0.272727 0.356290 0.141414 0.282828 0.364249 0.141414 0.292929 0.372207 0.141414 0.303030 0.380165 0.141414 0.313131 0.388124 0.141414 0.323232 0.396082 0.141414 0.333333 0.404040 0.141414 0.343434 0.411999 0.141414 0.353535 0.419957 0.141414 0.363636 0.427916 0.141414 0.373737 0.435874 0.141414 0.383838 0.443832 0.141414 0.393939 0.451791 0.141414 0.404040 0.459749 0.141414 0.414141 0.467707 0.141414 0.424242 0.475666 0.141414 0.434343 0.483624 0.141414 0.444444 0.491582 0.141414 0.454545 0.499541 0.141414 0.464646 0.507499 0.141414 0.474747 0.515458 0.141414 0.484848 0.523416 0.141414 0.494949 0.531374 0.141414 0.505051 0.539333 0.141414 0.515152 0.547291 0.141414 0.525253 0.555249 0.141414 0.535354 0.563208 0.141414 0.545455 0.571166 0.141414 0.555556 0.579125 0.141414 0.565657 0.587083 0.141414 0.575758 0.595041 0.141414 0.585859 0.603000 0.141414 0.595960 0.610958 0.141414 0.606061 0.618916 0.141414 0.616162 0.626875 0.141414 0.626263 0.634833 0.141414 0.636364 0.642792 0.141414 0.646465 0.650750 0.141414 0.656566 0.658708 0.141414 0.666667 0.666667 0.141414 0.676768 0.674625 0.141414 0.686869 0.682583 0.141414 0.696970 0.690542 0.141414 0.707071 0.698500 0.141414 0.717172 0.706459 0.141414 0.727273 0.714417 0.141414 0.737374 0.722375 0.141414 0.747475 0.730334 0.141414 0.757576 0.738292 0.141414 0.767677 0.746250 0.141414 0.777778 0.754209 0.141414 0.787879 0.762167 0.141414 0.797980 0.770125 0.141414 0.808081 0.778084 0.141414 0.818182 0.786042 0.141414 0.828283 0.794001 0.141414 0.838384 0.801959 0.141414 0.848485 0.809917 0.141414 0.858586 0.817876 0.141414 0.868687 0.825834 0.141414 0.878788 0.833792 0.141414 0.888889 0.841751 0.141414 0.898990 0.849709 0.141414 0.909091 0.857668 0.141414 0.919192 0.865626 0.141414 0.929293 0.873584 0.141414 0.939394 0.881543 0.141414 0.949495 0.889501 0.141414 0.959596 0.897459 0.141414 0.969697 0.905418 0.141414 0.979798 0.913376 0.141414 0.989899 0.921335 0.141414 1.000000 0.929293 0.151515 0.000000 0.151515 0.151515 0.010101 0.159320 0.151515 0.020202 0.167126 0.151515 0.030303 0.174931 0.151515 0.040404 0.182736 0.151515 0.050505 0.190542 0.151515 0.060606 0.198347 0.151515 0.070707 0.206152 0.151515 0.080808 0.213958 0.151515 0.090909 0.221763 0.151515 0.101010 0.229568 0.151515 0.111111 0.237374 0.151515 0.121212 0.245179 0.151515 0.131313 0.252984 0.151515 0.141414 0.260790 0.151515 0.151515 0.268595 0.151515 0.161616 0.276400 0.151515 0.171717 0.284206 0.151515 0.181818 0.292011 0.151515 0.191919 0.299816 0.151515 0.202020 0.307622 0.151515 0.212121 0.315427 0.151515 0.222222 0.323232 0.151515 0.232323 0.331038 0.151515 0.242424 0.338843 0.151515 0.252525 0.346648 0.151515 0.262626 0.354454 0.151515 0.272727 0.362259 0.151515 0.282828 0.370064 0.151515 0.292929 0.377870 0.151515 0.303030 0.385675 0.151515 0.313131 0.393480 0.151515 0.323232 0.401286 0.151515 0.333333 0.409091 0.151515 0.343434 0.416896 0.151515 0.353535 0.424702 0.151515 0.363636 0.432507 0.151515 0.373737 0.440312 0.151515 0.383838 0.448118 0.151515 0.393939 0.455923 0.151515 0.404040 0.463728 0.151515 0.414141 0.471534 0.151515 0.424242 0.479339 0.151515 0.434343 0.487144 0.151515 0.444444 0.494949 0.151515 0.454545 0.502755 0.151515 0.464646 0.510560 0.151515 0.474747 0.518365 0.151515 0.484848 0.526171 0.151515 0.494949 0.533976 0.151515 0.505051 0.541781 0.151515 0.515152 0.549587 0.151515 0.525253 0.557392 0.151515 0.535354 0.565197 0.151515 0.545455 0.573003 0.151515 0.555556 0.580808 0.151515 0.565657 0.588613 0.151515 0.575758 0.596419 0.151515 0.585859 0.604224 0.151515 0.595960 0.612029 0.151515 0.606061 0.619835 0.151515 0.616162 0.627640 0.151515 0.626263 0.635445 0.151515 0.636364 0.643251 0.151515 0.646465 0.651056 0.151515 0.656566 0.658861 0.151515 0.666667 0.666667 0.151515 0.676768 0.674472 0.151515 0.686869 0.682277 0.151515 0.696970 0.690083 0.151515 0.707071 0.697888 0.151515 0.717172 0.705693 0.151515 0.727273 0.713499 0.151515 0.737374 0.721304 0.151515 0.747475 0.729109 0.151515 0.757576 0.736915 0.151515 0.767677 0.744720 0.151515 0.777778 0.752525 0.151515 0.787879 0.760331 0.151515 0.797980 0.768136 0.151515 0.808081 0.775941 0.151515 0.818182 0.783747 0.151515 0.828283 0.791552 0.151515 0.838384 0.799357 0.151515 0.848485 0.807163 0.151515 0.858586 0.814968 0.151515 0.868687 0.822773 0.151515 0.878788 0.830579 0.151515 0.888889 0.838384 0.151515 0.898990 0.846189 0.151515 0.909091 0.853994 0.151515 0.919192 0.861800 0.151515 0.929293 0.869605 0.151515 0.939394 0.877410 0.151515 0.949495 0.885216 0.151515 0.959596 0.893021 0.151515 0.969697 0.900826 0.151515 0.979798 0.908632 0.151515 0.989899 0.916437 0.151515 1.000000 0.924242 0.161616 0.000000 0.161616 0.161616 0.010101 0.169268 0.161616 0.020202 0.176921 0.161616 0.030303 0.184573 0.161616 0.040404 0.192225 0.161616 0.050505 0.199878 0.161616 0.060606 0.207530 0.161616 0.070707 0.215182 0.161616 0.080808 0.222834 0.161616 0.090909 0.230487 0.161616 0.101010 0.238139 0.161616 0.111111 0.245791 0.161616 0.121212 0.253444 0.161616 0.131313 0.261096 0.161616 0.141414 0.268748 0.161616 0.151515 0.276400 0.161616 0.161616 0.284053 0.161616 0.171717 0.291705 0.161616 0.181818 0.299357 0.161616 0.191919 0.307009 0.161616 0.202020 0.314662 0.161616 0.212121 0.322314 0.161616 0.222222 0.329966 0.161616 0.232323 0.337619 0.161616 0.242424 0.345271 0.161616 0.252525 0.352923 0.161616 0.262626 0.360575 0.161616 0.272727 0.368228 0.161616 0.282828 0.375880 0.161616 0.292929 0.383532 0.161616 0.303030 0.391185 0.161616 0.313131 0.398837 0.161616 0.323232 0.406489 0.161616 0.333333 0.414141 0.161616 0.343434 0.421794 0.161616 0.353535 0.429446 0.161616 0.363636 0.437098 0.161616 0.373737 0.444751 0.161616 0.383838 0.452403 0.161616 0.393939 0.460055 0.161616 0.404040 0.467707 0.161616 0.414141 0.475360 0.161616 0.424242 0.483012 0.161616 0.434343 0.490664 0.161616 0.444444 0.498316 0.161616 0.454545 0.505969 0.161616 0.464646 0.513621 0.161616 0.474747 0.521273 0.161616 0.484848 0.528926 0.161616 0.494949 0.536578 0.161616 0.505051 0.544230 0.161616 0.515152 0.551882 0.161616 0.525253 0.559535 0.161616 0.535354 0.567187 0.161616 0.545455 0.574839 0.161616 0.555556 0.582492 0.161616 0.565657 0.590144 0.161616 0.575758 0.597796 0.161616 0.585859 0.605448 0.161616 0.595960 0.613101 0.161616 0.606061 0.620753 0.161616 0.616162 0.628405 0.161616 0.626263 0.636058 0.161616 0.636364 0.643710 0.161616 0.646465 0.651362 0.161616 0.656566 0.659014 0.161616 0.666667 0.666667 0.161616 0.676768 0.674319 0.161616 0.686869 0.681971 0.161616 0.696970 0.689624 0.161616 0.707071 0.697276 0.161616 0.717172 0.704928 0.161616 0.727273 0.712580 0.161616 0.737374 0.720233 0.161616 0.747475 0.727885 0.161616 0.757576 0.735537 0.161616 0.767677 0.743189 0.161616 0.777778 0.750842 0.161616 0.787879 0.758494 0.161616 0.797980 0.766146 0.161616 0.808081 0.773799 0.161616 0.818182 0.781451 0.161616 0.828283 0.789103 0.161616 0.838384 0.796755 0.161616 0.848485 0.804408 0.161616 0.858586 0.812060 0.161616 0.868687 0.819712 0.161616 0.878788 0.827365 0.161616 0.888889 0.835017 0.161616 0.898990 0.842669 0.161616 0.909091 0.850321 0.161616 0.919192 0.857974 0.161616 0.929293 0.865626 0.161616 0.939394 0.873278 0.161616 0.949495 0.880931 0.161616 0.959596 0.888583 0.161616 0.969697 0.896235 0.161616 0.979798 0.903887 0.161616 0.989899 0.911540 0.161616 1.000000 0.919192 0.171717 0.000000 0.171717 0.171717 0.010101 0.179216 0.171717 0.020202 0.186716 0.171717 0.030303 0.194215 0.171717 0.040404 0.201714 0.171717 0.050505 0.209213 0.171717 0.060606 0.216713 0.171717 0.070707 0.224212 0.171717 0.080808 0.231711 0.171717 0.090909 0.239210 0.171717 0.101010 0.246710 0.171717 0.111111 0.254209 0.171717 0.121212 0.261708 0.171717 0.131313 0.269207 0.171717 0.141414 0.276706 0.171717 0.151515 0.284206 0.171717 0.161616 0.291705 0.171717 0.171717 0.299204 0.171717 0.181818 0.306703 0.171717 0.191919 0.314203 0.171717 0.202020 0.321702 0.171717 0.212121 0.329201 0.171717 0.222222 0.336700 0.171717 0.232323 0.344200 0.171717 0.242424 0.351699 0.171717 0.252525 0.359198 0.171717 0.262626 0.366697 0.171717 0.272727 0.374197 0.171717 0.282828 0.381696 0.171717 0.292929 0.389195 0.171717 0.303030 0.396694 0.171717 0.313131 0.404193 0.171717 0.323232 0.411693 0.171717 0.333333 0.419192 0.171717 0.343434 0.426691 0.171717 0.353535 0.434190 0.171717 0.363636 0.441690 0.171717 0.373737 0.449189 0.171717 0.383838 0.456688 0.171717 0.393939 0.464187 0.171717 0.404040 0.471687 0.171717 0.414141 0.479186 0.171717 0.424242 0.486685 0.171717 0.434343 0.494184 0.171717 0.444444 0.501684 0.171717 0.454545 0.509183 0.171717 0.464646 0.516682 0.171717 0.474747 0.524181 0.171717 0.484848 0.531680 0.171717 0.494949 0.539180 0.171717 0.505051 0.546679 0.171717 0.515152 0.554178 0.171717 0.525253 0.561677 0.171717 0.535354 0.569177 0.171717 0.545455 0.576676 0.171717 0.555556 0.584175 0.171717 0.565657 0.591674 0.171717 0.575758 0.599174 0.171717 0.585859 0.606673 0.171717 0.595960 0.614172 0.171717 0.606061 0.621671 0.171717 0.616162 0.629170 0.171717 0.626263 0.636670 0.171717 0.636364 0.644169 0.171717 0.646465 0.651668 0.171717 0.656566 0.659167 0.171717 0.666667 0.666667 0.171717 0.676768 0.674166 0.171717 0.686869 0.681665 0.171717 0.696970 0.689164 0.171717 0.707071 0.696664 0.171717 0.717172 0.704163 0.171717 0.727273 0.711662 0.171717 0.737374 0.719161 0.171717 0.747475 0.726661 0.171717 0.757576 0.734160 0.171717 0.767677 0.741659 0.171717 0.777778 0.749158 0.171717 0.787879 0.756657 0.171717 0.797980 0.764157 0.171717 0.808081 0.771656 0.171717 0.818182 0.779155 0.171717 0.828283 0.786654 0.171717 0.838384 0.794154 0.171717 0.848485 0.801653 0.171717 0.858586 0.809152 0.171717 0.868687 0.816651 0.171717 0.878788 0.824151 0.171717 0.888889 0.831650 0.171717 0.898990 0.839149 0.171717 0.909091 0.846648 0.171717 0.919192 0.854148 0.171717 0.929293 0.861647 0.171717 0.939394 0.869146 0.171717 0.949495 0.876645 0.171717 0.959596 0.884144 0.171717 0.969697 0.891644 0.171717 0.979798 0.899143 0.171717 0.989899 0.906642 0.171717 1.000000 0.914141 0.181818 0.000000 0.181818 0.181818 0.010101 0.189164 0.181818 0.020202 0.196511 0.181818 0.030303 0.203857 0.181818 0.040404 0.211203 0.181818 0.050505 0.218549 0.181818 0.060606 0.225895 0.181818 0.070707 0.233242 0.181818 0.080808 0.240588 0.181818 0.090909 0.247934 0.181818 0.101010 0.255280 0.181818 0.111111 0.262626 0.181818 0.121212 0.269972 0.181818 0.131313 0.277319 0.181818 0.141414 0.284665 0.181818 0.151515 0.292011 0.181818 0.161616 0.299357 0.181818 0.171717 0.306703 0.181818 0.181818 0.314050 0.181818 0.191919 0.321396 0.181818 0.202020 0.328742 0.181818 0.212121 0.336088 0.181818 0.222222 0.343434 0.181818 0.232323 0.350781 0.181818 0.242424 0.358127 0.181818 0.252525 0.365473 0.181818 0.262626 0.372819 0.181818 0.272727 0.380165 0.181818 0.282828 0.387511 0.181818 0.292929 0.394858 0.181818 0.303030 0.402204 0.181818 0.313131 0.409550 0.181818 0.323232 0.416896 0.181818 0.333333 0.424242 0.181818 0.343434 0.431589 0.181818 0.353535 0.438935 0.181818 0.363636 0.446281 0.181818 0.373737 0.453627 0.181818 0.383838 0.460973 0.181818 0.393939 0.468320 0.181818 0.404040 0.475666 0.181818 0.414141 0.483012 0.181818 0.424242 0.490358 0.181818 0.434343 0.497704 0.181818 0.444444 0.505051 0.181818 0.454545 0.512397 0.181818 0.464646 0.519743 0.181818 0.474747 0.527089 0.181818 0.484848 0.534435 0.181818 0.494949 0.541781 0.181818 0.505051 0.549128 0.181818 0.515152 0.556474 0.181818 0.525253 0.563820 0.181818 0.535354 0.571166 0.181818 0.545455 0.578512 0.181818 0.555556 0.585859 0.181818 0.565657 0.593205 0.181818 0.575758 0.600551 0.181818 0.585859 0.607897 0.181818 0.595960 0.615243 0.181818 0.606061 0.622590 0.181818 0.616162 0.629936 0.181818 0.626263 0.637282 0.181818 0.636364 0.644628 0.181818 0.646465 0.651974 0.181818 0.656566 0.659320 0.181818 0.666667 0.666667 0.181818 0.676768 0.674013 0.181818 0.686869 0.681359 0.181818 0.696970 0.688705 0.181818 0.707071 0.696051 0.181818 0.717172 0.703398 0.181818 0.727273 0.710744 0.181818 0.737374 0.718090 0.181818 0.747475 0.725436 0.181818 0.757576 0.732782 0.181818 0.767677 0.740129 0.181818 0.777778 0.747475 0.181818 0.787879 0.754821 0.181818 0.797980 0.762167 0.181818 0.808081 0.769513 0.181818 0.818182 0.776860 0.181818 0.828283 0.784206 0.181818 0.838384 0.791552 0.181818 0.848485 0.798898 0.181818 0.858586 0.806244 0.181818 0.868687 0.813590 0.181818 0.878788 0.820937 0.181818 0.888889 0.828283 0.181818 0.898990 0.835629 0.181818 0.909091 0.842975 0.181818 0.919192 0.850321 0.181818 0.929293 0.857668 0.181818 0.939394 0.865014 0.181818 0.949495 0.872360 0.181818 0.959596 0.879706 0.181818 0.969697 0.887052 0.181818 0.979798 0.894399 0.181818 0.989899 0.901745 0.181818 1.000000 0.909091 0.191919 0.000000 0.191919 0.191919 0.010101 0.199112 0.191919 0.020202 0.206305 0.191919 0.030303 0.213499 0.191919 0.040404 0.220692 0.191919 0.050505 0.227885 0.191919 0.060606 0.235078 0.191919 0.070707 0.242271 0.191919 0.080808 0.249464 0.191919 0.090909 0.256657 0.191919 0.101010 0.263851 0.191919 0.111111 0.271044 0.191919 0.121212 0.278237 0.191919 0.131313 0.285430 0.191919 0.141414 0.292623 0.191919 0.151515 0.299816 0.191919 0.161616 0.307009 0.191919 0.171717 0.314203 0.191919 0.181818 0.321396 0.191919 0.191919 0.328589 0.191919 0.202020 0.335782 0.191919 0.212121 0.342975 0.191919 0.222222 0.350168 0.191919 0.232323 0.357361 0.191919 0.242424 0.364555 0.191919 0.252525 0.371748 0.191919 0.262626 0.378941 0.191919 0.272727 0.386134 0.191919 0.282828 0.393327 0.191919 0.292929 0.400520 0.191919 0.303030 0.407713 0.191919 0.313131 0.414907 0.191919 0.323232 0.422100 0.191919 0.333333 0.429293 0.191919 0.343434 0.436486 0.191919 0.353535 0.443679 0.191919 0.363636 0.450872 0.191919 0.373737 0.458066 0.191919 0.383838 0.465259 0.191919 0.393939 0.472452 0.191919 0.404040 0.479645 0.191919 0.414141 0.486838 0.191919 0.424242 0.494031 0.191919 0.434343 0.501224 0.191919 0.444444 0.508418 0.191919 0.454545 0.515611 0.191919 0.464646 0.522804 0.191919 0.474747 0.529997 0.191919 0.484848 0.537190 0.191919 0.494949 0.544383 0.191919 0.505051 0.551576 0.191919 0.515152 0.558770 0.191919 0.525253 0.565963 0.191919 0.535354 0.573156 0.191919 0.545455 0.580349 0.191919 0.555556 0.587542 0.191919 0.565657 0.594735 0.191919 0.575758 0.601928 0.191919 0.585859 0.609122 0.191919 0.595960 0.616315 0.191919 0.606061 0.623508 0.191919 0.616162 0.630701 0.191919 0.626263 0.637894 0.191919 0.636364 0.645087 0.191919 0.646465 0.652280 0.191919 0.656566 0.659474 0.191919 0.666667 0.666667 0.191919 0.676768 0.673860 0.191919 0.686869 0.681053 0.191919 0.696970 0.688246 0.191919 0.707071 0.695439 0.191919 0.717172 0.702632 0.191919 0.727273 0.709826 0.191919 0.737374 0.717019 0.191919 0.747475 0.724212 0.191919 0.757576 0.731405 0.191919 0.767677 0.738598 0.191919 0.777778 0.745791 0.191919 0.787879 0.752984 0.191919 0.797980 0.760178 0.191919 0.808081 0.767371 0.191919 0.818182 0.774564 0.191919 0.828283 0.781757 0.191919 0.838384 0.788950 0.191919 0.848485 0.796143 0.191919 0.858586 0.803336 0.191919 0.868687 0.810530 0.191919 0.878788 0.817723 0.191919 0.888889 0.824916 0.191919 0.898990 0.832109 0.191919 0.909091 0.839302 0.191919 0.919192 0.846495 0.191919 0.929293 0.853688 0.191919 0.939394 0.860882 0.191919 0.949495 0.868075 0.191919 0.959596 0.875268 0.191919 0.969697 0.882461 0.191919 0.979798 0.889654 0.191919 0.989899 0.896847 0.191919 1.000000 0.904040 0.202020 0.000000 0.202020 0.202020 0.010101 0.209060 0.202020 0.020202 0.216100 0.202020 0.030303 0.223140 0.202020 0.040404 0.230181 0.202020 0.050505 0.237221 0.202020 0.060606 0.244261 0.202020 0.070707 0.251301 0.202020 0.080808 0.258341 0.202020 0.090909 0.265381 0.202020 0.101010 0.272421 0.202020 0.111111 0.279461 0.202020 0.121212 0.286501 0.202020 0.131313 0.293541 0.202020 0.141414 0.300582 0.202020 0.151515 0.307622 0.202020 0.161616 0.314662 0.202020 0.171717 0.321702 0.202020 0.181818 0.328742 0.202020 0.191919 0.335782 0.202020 0.202020 0.342822 0.202020 0.212121 0.349862 0.202020 0.222222 0.356902 0.202020 0.232323 0.363942 0.202020 0.242424 0.370983 0.202020 0.252525 0.378023 0.202020 0.262626 0.385063 0.202020 0.272727 0.392103 0.202020 0.282828 0.399143 0.202020 0.292929 0.406183 0.202020 0.303030 0.413223 0.202020 0.313131 0.420263 0.202020 0.323232 0.427303 0.202020 0.333333 0.434343 0.202020 0.343434 0.441384 0.202020 0.353535 0.448424 0.202020 0.363636 0.455464 0.202020 0.373737 0.462504 0.202020 0.383838 0.469544 0.202020 0.393939 0.476584 0.202020 0.404040 0.483624 0.202020 0.414141 0.490664 0.202020 0.424242 0.497704 0.202020 0.434343 0.504744 0.202020 0.444444 0.511785 0.202020 0.454545 0.518825 0.202020 0.464646 0.525865 0.202020 0.474747 0.532905 0.202020 0.484848 0.539945 0.202020 0.494949 0.546985 0.202020 0.505051 0.554025 0.202020 0.515152 0.561065 0.202020 0.525253 0.568105 0.202020 0.535354 0.575145 0.202020 0.545455 0.582185 0.202020 0.555556 0.589226 0.202020 0.565657 0.596266 0.202020 0.575758 0.603306 0.202020 0.585859 0.610346 0.202020 0.595960 0.617386 0.202020 0.606061 0.624426 0.202020 0.616162 0.631466 0.202020 0.626263 0.638506 0.202020 0.636364 0.645546 0.202020 0.646465 0.652586 0.202020 0.656566 0.659627 0.202020 0.666667 0.666667 0.202020 0.676768 0.673707 0.202020 0.686869 0.680747 0.202020 0.696970 0.687787 0.202020 0.707071 0.694827 0.202020 0.717172 0.701867 0.202020 0.727273 0.708907 0.202020 0.737374 0.715947 0.202020 0.747475 0.722987 0.202020 0.757576 0.730028 0.202020 0.767677 0.737068 0.202020 0.777778 0.744108 0.202020 0.787879 0.751148 0.202020 0.797980 0.758188 0.202020 0.808081 0.765228 0.202020 0.818182 0.772268 0.202020 0.828283 0.779308 0.202020 0.838384 0.786348 0.202020 0.848485 0.793388 0.202020 0.858586 0.800429 0.202020 0.868687 0.807469 0.202020 0.878788 0.814509 0.202020 0.888889 0.821549 0.202020 0.898990 0.828589 0.202020 0.909091 0.835629 0.202020 0.919192 0.842669 0.202020 0.929293 0.849709 0.202020 0.939394 0.856749 0.202020 0.949495 0.863789 0.202020 0.959596 0.870830 0.202020 0.969697 0.877870 0.202020 0.979798 0.884910 0.202020 0.989899 0.891950 0.202020 1.000000 0.898990 0.212121 0.000000 0.212121 0.212121 0.010101 0.219008 0.212121 0.020202 0.225895 0.212121 0.030303 0.232782 0.212121 0.040404 0.239669 0.212121 0.050505 0.246556 0.212121 0.060606 0.253444 0.212121 0.070707 0.260331 0.212121 0.080808 0.267218 0.212121 0.090909 0.274105 0.212121 0.101010 0.280992 0.212121 0.111111 0.287879 0.212121 0.121212 0.294766 0.212121 0.131313 0.301653 0.212121 0.141414 0.308540 0.212121 0.151515 0.315427 0.212121 0.161616 0.322314 0.212121 0.171717 0.329201 0.212121 0.181818 0.336088 0.212121 0.191919 0.342975 0.212121 0.202020 0.349862 0.212121 0.212121 0.356749 0.212121 0.222222 0.363636 0.212121 0.232323 0.370523 0.212121 0.242424 0.377410 0.212121 0.252525 0.384298 0.212121 0.262626 0.391185 0.212121 0.272727 0.398072 0.212121 0.282828 0.404959 0.212121 0.292929 0.411846 0.212121 0.303030 0.418733 0.212121 0.313131 0.425620 0.212121 0.323232 0.432507 0.212121 0.333333 0.439394 0.212121 0.343434 0.446281 0.212121 0.353535 0.453168 0.212121 0.363636 0.460055 0.212121 0.373737 0.466942 0.212121 0.383838 0.473829 0.212121 0.393939 0.480716 0.212121 0.404040 0.487603 0.212121 0.414141 0.494490 0.212121 0.424242 0.501377 0.212121 0.434343 0.508264 0.212121 0.444444 0.515152 0.212121 0.454545 0.522039 0.212121 0.464646 0.528926 0.212121 0.474747 0.535813 0.212121 0.484848 0.542700 0.212121 0.494949 0.549587 0.212121 0.505051 0.556474 0.212121 0.515152 0.563361 0.212121 0.525253 0.570248 0.212121 0.535354 0.577135 0.212121 0.545455 0.584022 0.212121 0.555556 0.590909 0.212121 0.565657 0.597796 0.212121 0.575758 0.604683 0.212121 0.585859 0.611570 0.212121 0.595960 0.618457 0.212121 0.606061 0.625344 0.212121 0.616162 0.632231 0.212121 0.626263 0.639118 0.212121 0.636364 0.646006 0.212121 0.646465 0.652893 0.212121 0.656566 0.659780 0.212121 0.666667 0.666667 0.212121 0.676768 0.673554 0.212121 0.686869 0.680441 0.212121 0.696970 0.687328 0.212121 0.707071 0.694215 0.212121 0.717172 0.701102 0.212121 0.727273 0.707989 0.212121 0.737374 0.714876 0.212121 0.747475 0.721763 0.212121 0.757576 0.728650 0.212121 0.767677 0.735537 0.212121 0.777778 0.742424 0.212121 0.787879 0.749311 0.212121 0.797980 0.756198 0.212121 0.808081 0.763085 0.212121 0.818182 0.769972 0.212121 0.828283 0.776860 0.212121 0.838384 0.783747 0.212121 0.848485 0.790634 0.212121 0.858586 0.797521 0.212121 0.868687 0.804408 0.212121 0.878788 0.811295 0.212121 0.888889 0.818182 0.212121 0.898990 0.825069 0.212121 0.909091 0.831956 0.212121 0.919192 0.838843 0.212121 0.929293 0.845730 0.212121 0.939394 0.852617 0.212121 0.949495 0.859504 0.212121 0.959596 0.866391 0.212121 0.969697 0.873278 0.212121 0.979798 0.880165 0.212121 0.989899 0.887052 0.212121 1.000000 0.893939 0.222222 0.000000 0.222222 0.222222 0.010101 0.228956 0.222222 0.020202 0.235690 0.222222 0.030303 0.242424 0.222222 0.040404 0.249158 0.222222 0.050505 0.255892 0.222222 0.060606 0.262626 0.222222 0.070707 0.269360 0.222222 0.080808 0.276094 0.222222 0.090909 0.282828 0.222222 0.101010 0.289562 0.222222 0.111111 0.296296 0.222222 0.121212 0.303030 0.222222 0.131313 0.309764 0.222222 0.141414 0.316498 0.222222 0.151515 0.323232 0.222222 0.161616 0.329966 0.222222 0.171717 0.336700 0.222222 0.181818 0.343434 0.222222 0.191919 0.350168 0.222222 0.202020 0.356902 0.222222 0.212121 0.363636 0.222222 0.222222 0.370370 0.222222 0.232323 0.377104 0.222222 0.242424 0.383838 0.222222 0.252525 0.390572 0.222222 0.262626 0.397306 0.222222 0.272727 0.404040 0.222222 0.282828 0.410774 0.222222 0.292929 0.417508 0.222222 0.303030 0.424242 0.222222 0.313131 0.430976 0.222222 0.323232 0.437710 0.222222 0.333333 0.444444 0.222222 0.343434 0.451178 0.222222 0.353535 0.457912 0.222222 0.363636 0.464646 0.222222 0.373737 0.471380 0.222222 0.383838 0.478114 0.222222 0.393939 0.484848 0.222222 0.404040 0.491582 0.222222 0.414141 0.498316 0.222222 0.424242 0.505051 0.222222 0.434343 0.511785 0.222222 0.444444 0.518519 0.222222 0.454545 0.525253 0.222222 0.464646 0.531987 0.222222 0.474747 0.538721 0.222222 0.484848 0.545455 0.222222 0.494949 0.552189 0.222222 0.505051 0.558923 0.222222 0.515152 0.565657 0.222222 0.525253 0.572391 0.222222 0.535354 0.579125 0.222222 0.545455 0.585859 0.222222 0.555556 0.592593 0.222222 0.565657 0.599327 0.222222 0.575758 0.606061 0.222222 0.585859 0.612795 0.222222 0.595960 0.619529 0.222222 0.606061 0.626263 0.222222 0.616162 0.632997 0.222222 0.626263 0.639731 0.222222 0.636364 0.646465 0.222222 0.646465 0.653199 0.222222 0.656566 0.659933 0.222222 0.666667 0.666667 0.222222 0.676768 0.673401 0.222222 0.686869 0.680135 0.222222 0.696970 0.686869 0.222222 0.707071 0.693603 0.222222 0.717172 0.700337 0.222222 0.727273 0.707071 0.222222 0.737374 0.713805 0.222222 0.747475 0.720539 0.222222 0.757576 0.727273 0.222222 0.767677 0.734007 0.222222 0.777778 0.740741 0.222222 0.787879 0.747475 0.222222 0.797980 0.754209 0.222222 0.808081 0.760943 0.222222 0.818182 0.767677 0.222222 0.828283 0.774411 0.222222 0.838384 0.781145 0.222222 0.848485 0.787879 0.222222 0.858586 0.794613 0.222222 0.868687 0.801347 0.222222 0.878788 0.808081 0.222222 0.888889 0.814815 0.222222 0.898990 0.821549 0.222222 0.909091 0.828283 0.222222 0.919192 0.835017 0.222222 0.929293 0.841751 0.222222 0.939394 0.848485 0.222222 0.949495 0.855219 0.222222 0.959596 0.861953 0.222222 0.969697 0.868687 0.222222 0.979798 0.875421 0.222222 0.989899 0.882155 0.222222 1.000000 0.888889 0.232323 0.000000 0.232323 0.232323 0.010101 0.238904 0.232323 0.020202 0.245485 0.232323 0.030303 0.252066 0.232323 0.040404 0.258647 0.232323 0.050505 0.265228 0.232323 0.060606 0.271809 0.232323 0.070707 0.278390 0.232323 0.080808 0.284971 0.232323 0.090909 0.291552 0.232323 0.101010 0.298133 0.232323 0.111111 0.304714 0.232323 0.121212 0.311295 0.232323 0.131313 0.317876 0.232323 0.141414 0.324457 0.232323 0.151515 0.331038 0.232323 0.161616 0.337619 0.232323 0.171717 0.344200 0.232323 0.181818 0.350781 0.232323 0.191919 0.357361 0.232323 0.202020 0.363942 0.232323 0.212121 0.370523 0.232323 0.222222 0.377104 0.232323 0.232323 0.383685 0.232323 0.242424 0.390266 0.232323 0.252525 0.396847 0.232323 0.262626 0.403428 0.232323 0.272727 0.410009 0.232323 0.282828 0.416590 0.232323 0.292929 0.423171 0.232323 0.303030 0.429752 0.232323 0.313131 0.436333 0.232323 0.323232 0.442914 0.232323 0.333333 0.449495 0.232323 0.343434 0.456076 0.232323 0.353535 0.462657 0.232323 0.363636 0.469238 0.232323 0.373737 0.475819 0.232323 0.383838 0.482400 0.232323 0.393939 0.488981 0.232323 0.404040 0.495562 0.232323 0.414141 0.502143 0.232323 0.424242 0.508724 0.232323 0.434343 0.515305 0.232323 0.444444 0.521886 0.232323 0.454545 0.528466 0.232323 0.464646 0.535047 0.232323 0.474747 0.541628 0.232323 0.484848 0.548209 0.232323 0.494949 0.554790 0.232323 0.505051 0.561371 0.232323 0.515152 0.567952 0.232323 0.525253 0.574533 0.232323 0.535354 0.581114 0.232323 0.545455 0.587695 0.232323 0.555556 0.594276 0.232323 0.565657 0.600857 0.232323 0.575758 0.607438 0.232323 0.585859 0.614019 0.232323 0.595960 0.620600 0.232323 0.606061 0.627181 0.232323 0.616162 0.633762 0.232323 0.626263 0.640343 0.232323 0.636364 0.646924 0.232323 0.646465 0.653505 0.232323 0.656566 0.660086 0.232323 0.666667 0.666667 0.232323 0.676768 0.673248 0.232323 0.686869 0.679829 0.232323 0.696970 0.686410 0.232323 0.707071 0.692991 0.232323 0.717172 0.699571 0.232323 0.727273 0.706152 0.232323 0.737374 0.712733 0.232323 0.747475 0.719314 0.232323 0.757576 0.725895 0.232323 0.767677 0.732476 0.232323 0.777778 0.739057 0.232323 0.787879 0.745638 0.232323 0.797980 0.752219 0.232323 0.808081 0.758800 0.232323 0.818182 0.765381 0.232323 0.828283 0.771962 0.232323 0.838384 0.778543 0.232323 0.848485 0.785124 0.232323 0.858586 0.791705 0.232323 0.868687 0.798286 0.232323 0.878788 0.804867 0.232323 0.888889 0.811448 0.232323 0.898990 0.818029 0.232323 0.909091 0.824610 0.232323 0.919192 0.831191 0.232323 0.929293 0.837772 0.232323 0.939394 0.844353 0.232323 0.949495 0.850934 0.232323 0.959596 0.857515 0.232323 0.969697 0.864096 0.232323 0.979798 0.870676 0.232323 0.989899 0.877257 0.232323 1.000000 0.883838 0.242424 0.000000 0.242424 0.242424 0.010101 0.248852 0.242424 0.020202 0.255280 0.242424 0.030303 0.261708 0.242424 0.040404 0.268136 0.242424 0.050505 0.274564 0.242424 0.060606 0.280992 0.242424 0.070707 0.287420 0.242424 0.080808 0.293848 0.242424 0.090909 0.300275 0.242424 0.101010 0.306703 0.242424 0.111111 0.313131 0.242424 0.121212 0.319559 0.242424 0.131313 0.325987 0.242424 0.141414 0.332415 0.242424 0.151515 0.338843 0.242424 0.161616 0.345271 0.242424 0.171717 0.351699 0.242424 0.181818 0.358127 0.242424 0.191919 0.364555 0.242424 0.202020 0.370983 0.242424 0.212121 0.377410 0.242424 0.222222 0.383838 0.242424 0.232323 0.390266 0.242424 0.242424 0.396694 0.242424 0.252525 0.403122 0.242424 0.262626 0.409550 0.242424 0.272727 0.415978 0.242424 0.282828 0.422406 0.242424 0.292929 0.428834 0.242424 0.303030 0.435262 0.242424 0.313131 0.441690 0.242424 0.323232 0.448118 0.242424 0.333333 0.454545 0.242424 0.343434 0.460973 0.242424 0.353535 0.467401 0.242424 0.363636 0.473829 0.242424 0.373737 0.480257 0.242424 0.383838 0.486685 0.242424 0.393939 0.493113 0.242424 0.404040 0.499541 0.242424 0.414141 0.505969 0.242424 0.424242 0.512397 0.242424 0.434343 0.518825 0.242424 0.444444 0.525253 0.242424 0.454545 0.531680 0.242424 0.464646 0.538108 0.242424 0.474747 0.544536 0.242424 0.484848 0.550964 0.242424 0.494949 0.557392 0.242424 0.505051 0.563820 0.242424 0.515152 0.570248 0.242424 0.525253 0.576676 0.242424 0.535354 0.583104 0.242424 0.545455 0.589532 0.242424 0.555556 0.595960 0.242424 0.565657 0.602388 0.242424 0.575758 0.608815 0.242424 0.585859 0.615243 0.242424 0.595960 0.621671 0.242424 0.606061 0.628099 0.242424 0.616162 0.634527 0.242424 0.626263 0.640955 0.242424 0.636364 0.647383 0.242424 0.646465 0.653811 0.242424 0.656566 0.660239 0.242424 0.666667 0.666667 0.242424 0.676768 0.673095 0.242424 0.686869 0.679522 0.242424 0.696970 0.685950 0.242424 0.707071 0.692378 0.242424 0.717172 0.698806 0.242424 0.727273 0.705234 0.242424 0.737374 0.711662 0.242424 0.747475 0.718090 0.242424 0.757576 0.724518 0.242424 0.767677 0.730946 0.242424 0.777778 0.737374 0.242424 0.787879 0.743802 0.242424 0.797980 0.750230 0.242424 0.808081 0.756657 0.242424 0.818182 0.763085 0.242424 0.828283 0.769513 0.242424 0.838384 0.775941 0.242424 0.848485 0.782369 0.242424 0.858586 0.788797 0.242424 0.868687 0.795225 0.242424 0.878788 0.801653 0.242424 0.888889 0.808081 0.242424 0.898990 0.814509 0.242424 0.909091 0.820937 0.242424 0.919192 0.827365 0.242424 0.929293 0.833792 0.242424 0.939394 0.840220 0.242424 0.949495 0.846648 0.242424 0.959596 0.853076 0.242424 0.969697 0.859504 0.242424 0.979798 0.865932 0.242424 0.989899 0.872360 0.242424 1.000000 0.878788 0.252525 0.000000 0.252525 0.252525 0.010101 0.258800 0.252525 0.020202 0.265075 0.252525 0.030303 0.271350 0.252525 0.040404 0.277625 0.252525 0.050505 0.283900 0.252525 0.060606 0.290174 0.252525 0.070707 0.296449 0.252525 0.080808 0.302724 0.252525 0.090909 0.308999 0.252525 0.101010 0.315274 0.252525 0.111111 0.321549 0.252525 0.121212 0.327824 0.252525 0.131313 0.334099 0.252525 0.141414 0.340373 0.252525 0.151515 0.346648 0.252525 0.161616 0.352923 0.252525 0.171717 0.359198 0.252525 0.181818 0.365473 0.252525 0.191919 0.371748 0.252525 0.202020 0.378023 0.252525 0.212121 0.384298 0.252525 0.222222 0.390572 0.252525 0.232323 0.396847 0.252525 0.242424 0.403122 0.252525 0.252525 0.409397 0.252525 0.262626 0.415672 0.252525 0.272727 0.421947 0.252525 0.282828 0.428222 0.252525 0.292929 0.434496 0.252525 0.303030 0.440771 0.252525 0.313131 0.447046 0.252525 0.323232 0.453321 0.252525 0.333333 0.459596 0.252525 0.343434 0.465871 0.252525 0.353535 0.472146 0.252525 0.363636 0.478421 0.252525 0.373737 0.484695 0.252525 0.383838 0.490970 0.252525 0.393939 0.497245 0.252525 0.404040 0.503520 0.252525 0.414141 0.509795 0.252525 0.424242 0.516070 0.252525 0.434343 0.522345 0.252525 0.444444 0.528620 0.252525 0.454545 0.534894 0.252525 0.464646 0.541169 0.252525 0.474747 0.547444 0.252525 0.484848 0.553719 0.252525 0.494949 0.559994 0.252525 0.505051 0.566269 0.252525 0.515152 0.572544 0.252525 0.525253 0.578818 0.252525 0.535354 0.585093 0.252525 0.545455 0.591368 0.252525 0.555556 0.597643 0.252525 0.565657 0.603918 0.252525 0.575758 0.610193 0.252525 0.585859 0.616468 0.252525 0.595960 0.622743 0.252525 0.606061 0.629017 0.252525 0.616162 0.635292 0.252525 0.626263 0.641567 0.252525 0.636364 0.647842 0.252525 0.646465 0.654117 0.252525 0.656566 0.660392 0.252525 0.666667 0.666667 0.252525 0.676768 0.672942 0.252525 0.686869 0.679216 0.252525 0.696970 0.685491 0.252525 0.707071 0.691766 0.252525 0.717172 0.698041 0.252525 0.727273 0.704316 0.252525 0.737374 0.710591 0.252525 0.747475 0.716866 0.252525 0.757576 0.723140 0.252525 0.767677 0.729415 0.252525 0.777778 0.735690 0.252525 0.787879 0.741965 0.252525 0.797980 0.748240 0.252525 0.808081 0.754515 0.252525 0.818182 0.760790 0.252525 0.828283 0.767065 0.252525 0.838384 0.773339 0.252525 0.848485 0.779614 0.252525 0.858586 0.785889 0.252525 0.868687 0.792164 0.252525 0.878788 0.798439 0.252525 0.888889 0.804714 0.252525 0.898990 0.810989 0.252525 0.909091 0.817264 0.252525 0.919192 0.823538 0.252525 0.929293 0.829813 0.252525 0.939394 0.836088 0.252525 0.949495 0.842363 0.252525 0.959596 0.848638 0.252525 0.969697 0.854913 0.252525 0.979798 0.861188 0.252525 0.989899 0.867463 0.252525 1.000000 0.873737 0.262626 0.000000 0.262626 0.262626 0.010101 0.268748 0.262626 0.020202 0.274870 0.262626 0.030303 0.280992 0.262626 0.040404 0.287114 0.262626 0.050505 0.293235 0.262626 0.060606 0.299357 0.262626 0.070707 0.305479 0.262626 0.080808 0.311601 0.262626 0.090909 0.317723 0.262626 0.101010 0.323845 0.262626 0.111111 0.329966 0.262626 0.121212 0.336088 0.262626 0.131313 0.342210 0.262626 0.141414 0.348332 0.262626 0.151515 0.354454 0.262626 0.161616 0.360575 0.262626 0.171717 0.366697 0.262626 0.181818 0.372819 0.262626 0.191919 0.378941 0.262626 0.202020 0.385063 0.262626 0.212121 0.391185 0.262626 0.222222 0.397306 0.262626 0.232323 0.403428 0.262626 0.242424 0.409550 0.262626 0.252525 0.415672 0.262626 0.262626 0.421794 0.262626 0.272727 0.427916 0.262626 0.282828 0.434037 0.262626 0.292929 0.440159 0.262626 0.303030 0.446281 0.262626 0.313131 0.452403 0.262626 0.323232 0.458525 0.262626 0.333333 0.464646 0.262626 0.343434 0.470768 0.262626 0.353535 0.476890 0.262626 0.363636 0.483012 0.262626 0.373737 0.489134 0.262626 0.383838 0.495256 0.262626 0.393939 0.501377 0.262626 0.404040 0.507499 0.262626 0.414141 0.513621 0.262626 0.424242 0.519743 0.262626 0.434343 0.525865 0.262626 0.444444 0.531987 0.262626 0.454545 0.538108 0.262626 0.464646 0.544230 0.262626 0.474747 0.550352 0.262626 0.484848 0.556474 0.262626 0.494949 0.562596 0.262626 0.505051 0.568717 0.262626 0.515152 0.574839 0.262626 0.525253 0.580961 0.262626 0.535354 0.587083 0.262626 0.545455 0.593205 0.262626 0.555556 0.599327 0.262626 0.565657 0.605448 0.262626 0.575758 0.611570 0.262626 0.585859 0.617692 0.262626 0.595960 0.623814 0.262626 0.606061 0.629936 0.262626 0.616162 0.636058 0.262626 0.626263 0.642179 0.262626 0.636364 0.648301 0.262626 0.646465 0.654423 0.262626 0.656566 0.660545 0.262626 0.666667 0.666667 0.262626 0.676768 0.672788 0.262626 0.686869 0.678910 0.262626 0.696970 0.685032 0.262626 0.707071 0.691154 0.262626 0.717172 0.697276 0.262626 0.727273 0.703398 0.262626 0.737374 0.709519 0.262626 0.747475 0.715641 0.262626 0.757576 0.721763 0.262626 0.767677 0.727885 0.262626 0.777778 0.734007 0.262626 0.787879 0.740129 0.262626 0.797980 0.746250 0.262626 0.808081 0.752372 0.262626 0.818182 0.758494 0.262626 0.828283 0.764616 0.262626 0.838384 0.770738 0.262626 0.848485 0.776860 0.262626 0.858586 0.782981 0.262626 0.868687 0.789103 0.262626 0.878788 0.795225 0.262626 0.888889 0.801347 0.262626 0.898990 0.807469 0.262626 0.909091 0.813590 0.262626 0.919192 0.819712 0.262626 0.929293 0.825834 0.262626 0.939394 0.831956 0.262626 0.949495 0.838078 0.262626 0.959596 0.844200 0.262626 0.969697 0.850321 0.262626 0.979798 0.856443 0.262626 0.989899 0.862565 0.262626 1.000000 0.868687 0.272727 0.000000 0.272727 0.272727 0.010101 0.278696 0.272727 0.020202 0.284665 0.272727 0.030303 0.290634 0.272727 0.040404 0.296602 0.272727 0.050505 0.302571 0.272727 0.060606 0.308540 0.272727 0.070707 0.314509 0.272727 0.080808 0.320478 0.272727 0.090909 0.326446 0.272727 0.101010 0.332415 0.272727 0.111111 0.338384 0.272727 0.121212 0.344353 0.272727 0.131313 0.350321 0.272727 0.141414 0.356290 0.272727 0.151515 0.362259 0.272727 0.161616 0.368228 0.272727 0.171717 0.374197 0.272727 0.181818 0.380165 0.272727 0.191919 0.386134 0.272727 0.202020 0.392103 0.272727 0.212121 0.398072 0.272727 0.222222 0.404040 0.272727 0.232323 0.410009 0.272727 0.242424 0.415978 0.272727 0.252525 0.421947 0.272727 0.262626 0.427916 0.272727 0.272727 0.433884 0.272727 0.282828 0.439853 0.272727 0.292929 0.445822 0.272727 0.303030 0.451791 0.272727 0.313131 0.457759 0.272727 0.323232 0.463728 0.272727 0.333333 0.469697 0.272727 0.343434 0.475666 0.272727 0.353535 0.481635 0.272727 0.363636 0.487603 0.272727 0.373737 0.493572 0.272727 0.383838 0.499541 0.272727 0.393939 0.505510 0.272727 0.404040 0.511478 0.272727 0.414141 0.517447 0.272727 0.424242 0.523416 0.272727 0.434343 0.529385 0.272727 0.444444 0.535354 0.272727 0.454545 0.541322 0.272727 0.464646 0.547291 0.272727 0.474747 0.553260 0.272727 0.484848 0.559229 0.272727 0.494949 0.565197 0.272727 0.505051 0.571166 0.272727 0.515152 0.577135 0.272727 0.525253 0.583104 0.272727 0.535354 0.589073 0.272727 0.545455 0.595041 0.272727 0.555556 0.601010 0.272727 0.565657 0.606979 0.272727 0.575758 0.612948 0.272727 0.585859 0.618916 0.272727 0.595960 0.624885 0.272727 0.606061 0.630854 0.272727 0.616162 0.636823 0.272727 0.626263 0.642792 0.272727 0.636364 0.648760 0.272727 0.646465 0.654729 0.272727 0.656566 0.660698 0.272727 0.666667 0.666667 0.272727 0.676768 0.672635 0.272727 0.686869 0.678604 0.272727 0.696970 0.684573 0.272727 0.707071 0.690542 0.272727 0.717172 0.696511 0.272727 0.727273 0.702479 0.272727 0.737374 0.708448 0.272727 0.747475 0.714417 0.272727 0.757576 0.720386 0.272727 0.767677 0.726354 0.272727 0.777778 0.732323 0.272727 0.787879 0.738292 0.272727 0.797980 0.744261 0.272727 0.808081 0.750230 0.272727 0.818182 0.756198 0.272727 0.828283 0.762167 0.272727 0.838384 0.768136 0.272727 0.848485 0.774105 0.272727 0.858586 0.780073 0.272727 0.868687 0.786042 0.272727 0.878788 0.792011 0.272727 0.888889 0.797980 0.272727 0.898990 0.803949 0.272727 0.909091 0.809917 0.272727 0.919192 0.815886 0.272727 0.929293 0.821855 0.272727 0.939394 0.827824 0.272727 0.949495 0.833792 0.272727 0.959596 0.839761 0.272727 0.969697 0.845730 0.272727 0.979798 0.851699 0.272727 0.989899 0.857668 0.272727 1.000000 0.863636 0.282828 0.000000 0.282828 0.282828 0.010101 0.288644 0.282828 0.020202 0.294460 0.282828 0.030303 0.300275 0.282828 0.040404 0.306091 0.282828 0.050505 0.311907 0.282828 0.060606 0.317723 0.282828 0.070707 0.323538 0.282828 0.080808 0.329354 0.282828 0.090909 0.335170 0.282828 0.101010 0.340986 0.282828 0.111111 0.346801 0.282828 0.121212 0.352617 0.282828 0.131313 0.358433 0.282828 0.141414 0.364249 0.282828 0.151515 0.370064 0.282828 0.161616 0.375880 0.282828 0.171717 0.381696 0.282828 0.181818 0.387511 0.282828 0.191919 0.393327 0.282828 0.202020 0.399143 0.282828 0.212121 0.404959 0.282828 0.222222 0.410774 0.282828 0.232323 0.416590 0.282828 0.242424 0.422406 0.282828 0.252525 0.428222 0.282828 0.262626 0.434037 0.282828 0.272727 0.439853 0.282828 0.282828 0.445669 0.282828 0.292929 0.451485 0.282828 0.303030 0.457300 0.282828 0.313131 0.463116 0.282828 0.323232 0.468932 0.282828 0.333333 0.474747 0.282828 0.343434 0.480563 0.282828 0.353535 0.486379 0.282828 0.363636 0.492195 0.282828 0.373737 0.498010 0.282828 0.383838 0.503826 0.282828 0.393939 0.509642 0.282828 0.404040 0.515458 0.282828 0.414141 0.521273 0.282828 0.424242 0.527089 0.282828 0.434343 0.532905 0.282828 0.444444 0.538721 0.282828 0.454545 0.544536 0.282828 0.464646 0.550352 0.282828 0.474747 0.556168 0.282828 0.484848 0.561983 0.282828 0.494949 0.567799 0.282828 0.505051 0.573615 0.282828 0.515152 0.579431 0.282828 0.525253 0.585246 0.282828 0.535354 0.591062 0.282828 0.545455 0.596878 0.282828 0.555556 0.602694 0.282828 0.565657 0.608509 0.282828 0.575758 0.614325 0.282828 0.585859 0.620141 0.282828 0.595960 0.625957 0.282828 0.606061 0.631772 0.282828 0.616162 0.637588 0.282828 0.626263 0.643404 0.282828 0.636364 0.649219 0.282828 0.646465 0.655035 0.282828 0.656566 0.660851 0.282828 0.666667 0.666667 0.282828 0.676768 0.672482 0.282828 0.686869 0.678298 0.282828 0.696970 0.684114 0.282828 0.707071 0.689930 0.282828 0.717172 0.695745 0.282828 0.727273 0.701561 0.282828 0.737374 0.707377 0.282828 0.747475 0.713193 0.282828 0.757576 0.719008 0.282828 0.767677 0.724824 0.282828 0.777778 0.730640 0.282828 0.787879 0.736455 0.282828 0.797980 0.742271 0.282828 0.808081 0.748087 0.282828 0.818182 0.753903 0.282828 0.828283 0.759718 0.282828 0.838384 0.765534 0.282828 0.848485 0.771350 0.282828 0.858586 0.777166 0.282828 0.868687 0.782981 0.282828 0.878788 0.788797 0.282828 0.888889 0.794613 0.282828 0.898990 0.800429 0.282828 0.909091 0.806244 0.282828 0.919192 0.812060 0.282828 0.929293 0.817876 0.282828 0.939394 0.823691 0.282828 0.949495 0.829507 0.282828 0.959596 0.835323 0.282828 0.969697 0.841139 0.282828 0.979798 0.846954 0.282828 0.989899 0.852770 0.282828 1.000000 0.858586 0.292929 0.000000 0.292929 0.292929 0.010101 0.298592 0.292929 0.020202 0.304255 0.292929 0.030303 0.309917 0.292929 0.040404 0.315580 0.292929 0.050505 0.321243 0.292929 0.060606 0.326905 0.292929 0.070707 0.332568 0.292929 0.080808 0.338231 0.292929 0.090909 0.343893 0.292929 0.101010 0.349556 0.292929 0.111111 0.355219 0.292929 0.121212 0.360882 0.292929 0.131313 0.366544 0.292929 0.141414 0.372207 0.292929 0.151515 0.377870 0.292929 0.161616 0.383532 0.292929 0.171717 0.389195 0.292929 0.181818 0.394858 0.292929 0.191919 0.400520 0.292929 0.202020 0.406183 0.292929 0.212121 0.411846 0.292929 0.222222 0.417508 0.292929 0.232323 0.423171 0.292929 0.242424 0.428834 0.292929 0.252525 0.434496 0.292929 0.262626 0.440159 0.292929 0.272727 0.445822 0.292929 0.282828 0.451485 0.292929 0.292929 0.457147 0.292929 0.303030 0.462810 0.292929 0.313131 0.468473 0.292929 0.323232 0.474135 0.292929 0.333333 0.479798 0.292929 0.343434 0.485461 0.292929 0.353535 0.491123 0.292929 0.363636 0.496786 0.292929 0.373737 0.502449 0.292929 0.383838 0.508111 0.292929 0.393939 0.513774 0.292929 0.404040 0.519437 0.292929 0.414141 0.525099 0.292929 0.424242 0.530762 0.292929 0.434343 0.536425 0.292929 0.444444 0.542088 0.292929 0.454545 0.547750 0.292929 0.464646 0.553413 0.292929 0.474747 0.559076 0.292929 0.484848 0.564738 0.292929 0.494949 0.570401 0.292929 0.505051 0.576064 0.292929 0.515152 0.581726 0.292929 0.525253 0.587389 0.292929 0.535354 0.593052 0.292929 0.545455 0.598714 0.292929 0.555556 0.604377 0.292929 0.565657 0.610040 0.292929 0.575758 0.615702 0.292929 0.585859 0.621365 0.292929 0.595960 0.627028 0.292929 0.606061 0.632691 0.292929 0.616162 0.638353 0.292929 0.626263 0.644016 0.292929 0.636364 0.649679 0.292929 0.646465 0.655341 0.292929 0.656566 0.661004 0.292929 0.666667 0.666667 0.292929 0.676768 0.672329 0.292929 0.686869 0.677992 0.292929 0.696970 0.683655 0.292929 0.707071 0.689317 0.292929 0.717172 0.694980 0.292929 0.727273 0.700643 0.292929 0.737374 0.706305 0.292929 0.747475 0.711968 0.292929 0.757576 0.717631 0.292929 0.767677 0.723294 0.292929 0.777778 0.728956 0.292929 0.787879 0.734619 0.292929 0.797980 0.740282 0.292929 0.808081 0.745944 0.292929 0.818182 0.751607 0.292929 0.828283 0.757270 0.292929 0.838384 0.762932 0.292929 0.848485 0.768595 0.292929 0.858586 0.774258 0.292929 0.868687 0.779920 0.292929 0.878788 0.785583 0.292929 0.888889 0.791246 0.292929 0.898990 0.796908 0.292929 0.909091 0.802571 0.292929 0.919192 0.808234 0.292929 0.929293 0.813897 0.292929 0.939394 0.819559 0.292929 0.949495 0.825222 0.292929 0.959596 0.830885 0.292929 0.969697 0.836547 0.292929 0.979798 0.842210 0.292929 0.989899 0.847873 0.292929 1.000000 0.853535 0.303030 0.000000 0.303030 0.303030 0.010101 0.308540 0.303030 0.020202 0.314050 0.303030 0.030303 0.319559 0.303030 0.040404 0.325069 0.303030 0.050505 0.330579 0.303030 0.060606 0.336088 0.303030 0.070707 0.341598 0.303030 0.080808 0.347107 0.303030 0.090909 0.352617 0.303030 0.101010 0.358127 0.303030 0.111111 0.363636 0.303030 0.121212 0.369146 0.303030 0.131313 0.374656 0.303030 0.141414 0.380165 0.303030 0.151515 0.385675 0.303030 0.161616 0.391185 0.303030 0.171717 0.396694 0.303030 0.181818 0.402204 0.303030 0.191919 0.407713 0.303030 0.202020 0.413223 0.303030 0.212121 0.418733 0.303030 0.222222 0.424242 0.303030 0.232323 0.429752 0.303030 0.242424 0.435262 0.303030 0.252525 0.440771 0.303030 0.262626 0.446281 0.303030 0.272727 0.451791 0.303030 0.282828 0.457300 0.303030 0.292929 0.462810 0.303030 0.303030 0.468320 0.303030 0.313131 0.473829 0.303030 0.323232 0.479339 0.303030 0.333333 0.484848 0.303030 0.343434 0.490358 0.303030 0.353535 0.495868 0.303030 0.363636 0.501377 0.303030 0.373737 0.506887 0.303030 0.383838 0.512397 0.303030 0.393939 0.517906 0.303030 0.404040 0.523416 0.303030 0.414141 0.528926 0.303030 0.424242 0.534435 0.303030 0.434343 0.539945 0.303030 0.444444 0.545455 0.303030 0.454545 0.550964 0.303030 0.464646 0.556474 0.303030 0.474747 0.561983 0.303030 0.484848 0.567493 0.303030 0.494949 0.573003 0.303030 0.505051 0.578512 0.303030 0.515152 0.584022 0.303030 0.525253 0.589532 0.303030 0.535354 0.595041 0.303030 0.545455 0.600551 0.303030 0.555556 0.606061 0.303030 0.565657 0.611570 0.303030 0.575758 0.617080 0.303030 0.585859 0.622590 0.303030 0.595960 0.628099 0.303030 0.606061 0.633609 0.303030 0.616162 0.639118 0.303030 0.626263 0.644628 0.303030 0.636364 0.650138 0.303030 0.646465 0.655647 0.303030 0.656566 0.661157 0.303030 0.666667 0.666667 0.303030 0.676768 0.672176 0.303030 0.686869 0.677686 0.303030 0.696970 0.683196 0.303030 0.707071 0.688705 0.303030 0.717172 0.694215 0.303030 0.727273 0.699725 0.303030 0.737374 0.705234 0.303030 0.747475 0.710744 0.303030 0.757576 0.716253 0.303030 0.767677 0.721763 0.303030 0.777778 0.727273 0.303030 0.787879 0.732782 0.303030 0.797980 0.738292 0.303030 0.808081 0.743802 0.303030 0.818182 0.749311 0.303030 0.828283 0.754821 0.303030 0.838384 0.760331 0.303030 0.848485 0.765840 0.303030 0.858586 0.771350 0.303030 0.868687 0.776860 0.303030 0.878788 0.782369 0.303030 0.888889 0.787879 0.303030 0.898990 0.793388 0.303030 0.909091 0.798898 0.303030 0.919192 0.804408 0.303030 0.929293 0.809917 0.303030 0.939394 0.815427 0.303030 0.949495 0.820937 0.303030 0.959596 0.826446 0.303030 0.969697 0.831956 0.303030 0.979798 0.837466 0.303030 0.989899 0.842975 0.303030 1.000000 0.848485 0.313131 0.000000 0.313131 0.313131 0.010101 0.318488 0.313131 0.020202 0.323845 0.313131 0.030303 0.329201 0.313131 0.040404 0.334558 0.313131 0.050505 0.339914 0.313131 0.060606 0.345271 0.313131 0.070707 0.350627 0.313131 0.080808 0.355984 0.313131 0.090909 0.361341 0.313131 0.101010 0.366697 0.313131 0.111111 0.372054 0.313131 0.121212 0.377410 0.313131 0.131313 0.382767 0.313131 0.141414 0.388124 0.313131 0.151515 0.393480 0.313131 0.161616 0.398837 0.313131 0.171717 0.404193 0.313131 0.181818 0.409550 0.313131 0.191919 0.414907 0.313131 0.202020 0.420263 0.313131 0.212121 0.425620 0.313131 0.222222 0.430976 0.313131 0.232323 0.436333 0.313131 0.242424 0.441690 0.313131 0.252525 0.447046 0.313131 0.262626 0.452403 0.313131 0.272727 0.457759 0.313131 0.282828 0.463116 0.313131 0.292929 0.468473 0.313131 0.303030 0.473829 0.313131 0.313131 0.479186 0.313131 0.323232 0.484542 0.313131 0.333333 0.489899 0.313131 0.343434 0.495256 0.313131 0.353535 0.500612 0.313131 0.363636 0.505969 0.313131 0.373737 0.511325 0.313131 0.383838 0.516682 0.313131 0.393939 0.522039 0.313131 0.404040 0.527395 0.313131 0.414141 0.532752 0.313131 0.424242 0.538108 0.313131 0.434343 0.543465 0.313131 0.444444 0.548822 0.313131 0.454545 0.554178 0.313131 0.464646 0.559535 0.313131 0.474747 0.564891 0.313131 0.484848 0.570248 0.313131 0.494949 0.575605 0.313131 0.505051 0.580961 0.313131 0.515152 0.586318 0.313131 0.525253 0.591674 0.313131 0.535354 0.597031 0.313131 0.545455 0.602388 0.313131 0.555556 0.607744 0.313131 0.565657 0.613101 0.313131 0.575758 0.618457 0.313131 0.585859 0.623814 0.313131 0.595960 0.629170 0.313131 0.606061 0.634527 0.313131 0.616162 0.639884 0.313131 0.626263 0.645240 0.313131 0.636364 0.650597 0.313131 0.646465 0.655953 0.313131 0.656566 0.661310 0.313131 0.666667 0.666667 0.313131 0.676768 0.672023 0.313131 0.686869 0.677380 0.313131 0.696970 0.682736 0.313131 0.707071 0.688093 0.313131 0.717172 0.693450 0.313131 0.727273 0.698806 0.313131 0.737374 0.704163 0.313131 0.747475 0.709519 0.313131 0.757576 0.714876 0.313131 0.767677 0.720233 0.313131 0.777778 0.725589 0.313131 0.787879 0.730946 0.313131 0.797980 0.736302 0.313131 0.808081 0.741659 0.313131 0.818182 0.747016 0.313131 0.828283 0.752372 0.313131 0.838384 0.757729 0.313131 0.848485 0.763085 0.313131 0.858586 0.768442 0.313131 0.868687 0.773799 0.313131 0.878788 0.779155 0.313131 0.888889 0.784512 0.313131 0.898990 0.789868 0.313131 0.909091 0.795225 0.313131 0.919192 0.800582 0.313131 0.929293 0.805938 0.313131 0.939394 0.811295 0.313131 0.949495 0.816651 0.313131 0.959596 0.822008 0.313131 0.969697 0.827365 0.313131 0.979798 0.832721 0.313131 0.989899 0.838078 0.313131 1.000000 0.843434 0.323232 0.000000 0.323232 0.323232 0.010101 0.328436 0.323232 0.020202 0.333639 0.323232 0.030303 0.338843 0.323232 0.040404 0.344047 0.323232 0.050505 0.349250 0.323232 0.060606 0.354454 0.323232 0.070707 0.359657 0.323232 0.080808 0.364861 0.323232 0.090909 0.370064 0.323232 0.101010 0.375268 0.323232 0.111111 0.380471 0.323232 0.121212 0.385675 0.323232 0.131313 0.390878 0.323232 0.141414 0.396082 0.323232 0.151515 0.401286 0.323232 0.161616 0.406489 0.323232 0.171717 0.411693 0.323232 0.181818 0.416896 0.323232 0.191919 0.422100 0.323232 0.202020 0.427303 0.323232 0.212121 0.432507 0.323232 0.222222 0.437710 0.323232 0.232323 0.442914 0.323232 0.242424 0.448118 0.323232 0.252525 0.453321 0.323232 0.262626 0.458525 0.323232 0.272727 0.463728 0.323232 0.282828 0.468932 0.323232 0.292929 0.474135 0.323232 0.303030 0.479339 0.323232 0.313131 0.484542 0.323232 0.323232 0.489746 0.323232 0.333333 0.494949 0.323232 0.343434 0.500153 0.323232 0.353535 0.505357 0.323232 0.363636 0.510560 0.323232 0.373737 0.515764 0.323232 0.383838 0.520967 0.323232 0.393939 0.526171 0.323232 0.404040 0.531374 0.323232 0.414141 0.536578 0.323232 0.424242 0.541781 0.323232 0.434343 0.546985 0.323232 0.444444 0.552189 0.323232 0.454545 0.557392 0.323232 0.464646 0.562596 0.323232 0.474747 0.567799 0.323232 0.484848 0.573003 0.323232 0.494949 0.578206 0.323232 0.505051 0.583410 0.323232 0.515152 0.588613 0.323232 0.525253 0.593817 0.323232 0.535354 0.599021 0.323232 0.545455 0.604224 0.323232 0.555556 0.609428 0.323232 0.565657 0.614631 0.323232 0.575758 0.619835 0.323232 0.585859 0.625038 0.323232 0.595960 0.630242 0.323232 0.606061 0.635445 0.323232 0.616162 0.640649 0.323232 0.626263 0.645852 0.323232 0.636364 0.651056 0.323232 0.646465 0.656260 0.323232 0.656566 0.661463 0.323232 0.666667 0.666667 0.323232 0.676768 0.671870 0.323232 0.686869 0.677074 0.323232 0.696970 0.682277 0.323232 0.707071 0.687481 0.323232 0.717172 0.692684 0.323232 0.727273 0.697888 0.323232 0.737374 0.703092 0.323232 0.747475 0.708295 0.323232 0.757576 0.713499 0.323232 0.767677 0.718702 0.323232 0.777778 0.723906 0.323232 0.787879 0.729109 0.323232 0.797980 0.734313 0.323232 0.808081 0.739516 0.323232 0.818182 0.744720 0.323232 0.828283 0.749923 0.323232 0.838384 0.755127 0.323232 0.848485 0.760331 0.323232 0.858586 0.765534 0.323232 0.868687 0.770738 0.323232 0.878788 0.775941 0.323232 0.888889 0.781145 0.323232 0.898990 0.786348 0.323232 0.909091 0.791552 0.323232 0.919192 0.796755 0.323232 0.929293 0.801959 0.323232 0.939394 0.807163 0.323232 0.949495 0.812366 0.323232 0.959596 0.817570 0.323232 0.969697 0.822773 0.323232 0.979798 0.827977 0.323232 0.989899 0.833180 0.323232 1.000000 0.838384 0.333333 0.000000 0.333333 0.333333 0.010101 0.338384 0.333333 0.020202 0.343434 0.333333 0.030303 0.348485 0.333333 0.040404 0.353535 0.333333 0.050505 0.358586 0.333333 0.060606 0.363636 0.333333 0.070707 0.368687 0.333333 0.080808 0.373737 0.333333 0.090909 0.378788 0.333333 0.101010 0.383838 0.333333 0.111111 0.388889 0.333333 0.121212 0.393939 0.333333 0.131313 0.398990 0.333333 0.141414 0.404040 0.333333 0.151515 0.409091 0.333333 0.161616 0.414141 0.333333 0.171717 0.419192 0.333333 0.181818 0.424242 0.333333 0.191919 0.429293 0.333333 0.202020 0.434343 0.333333 0.212121 0.439394 0.333333 0.222222 0.444444 0.333333 0.232323 0.449495 0.333333 0.242424 0.454545 0.333333 0.252525 0.459596 0.333333 0.262626 0.464646 0.333333 0.272727 0.469697 0.333333 0.282828 0.474747 0.333333 0.292929 0.479798 0.333333 0.303030 0.484848 0.333333 0.313131 0.489899 0.333333 0.323232 0.494949 0.333333 0.333333 0.500000 0.333333 0.343434 0.505051 0.333333 0.353535 0.510101 0.333333 0.363636 0.515152 0.333333 0.373737 0.520202 0.333333 0.383838 0.525253 0.333333 0.393939 0.530303 0.333333 0.404040 0.535354 0.333333 0.414141 0.540404 0.333333 0.424242 0.545455 0.333333 0.434343 0.550505 0.333333 0.444444 0.555556 0.333333 0.454545 0.560606 0.333333 0.464646 0.565657 0.333333 0.474747 0.570707 0.333333 0.484848 0.575758 0.333333 0.494949 0.580808 0.333333 0.505051 0.585859 0.333333 0.515152 0.590909 0.333333 0.525253 0.595960 0.333333 0.535354 0.601010 0.333333 0.545455 0.606061 0.333333 0.555556 0.611111 0.333333 0.565657 0.616162 0.333333 0.575758 0.621212 0.333333 0.585859 0.626263 0.333333 0.595960 0.631313 0.333333 0.606061 0.636364 0.333333 0.616162 0.641414 0.333333 0.626263 0.646465 0.333333 0.636364 0.651515 0.333333 0.646465 0.656566 0.333333 0.656566 0.661616 0.333333 0.666667 0.666667 0.333333 0.676768 0.671717 0.333333 0.686869 0.676768 0.333333 0.696970 0.681818 0.333333 0.707071 0.686869 0.333333 0.717172 0.691919 0.333333 0.727273 0.696970 0.333333 0.737374 0.702020 0.333333 0.747475 0.707071 0.333333 0.757576 0.712121 0.333333 0.767677 0.717172 0.333333 0.777778 0.722222 0.333333 0.787879 0.727273 0.333333 0.797980 0.732323 0.333333 0.808081 0.737374 0.333333 0.818182 0.742424 0.333333 0.828283 0.747475 0.333333 0.838384 0.752525 0.333333 0.848485 0.757576 0.333333 0.858586 0.762626 0.333333 0.868687 0.767677 0.333333 0.878788 0.772727 0.333333 0.888889 0.777778 0.333333 0.898990 0.782828 0.333333 0.909091 0.787879 0.333333 0.919192 0.792929 0.333333 0.929293 0.797980 0.333333 0.939394 0.803030 0.333333 0.949495 0.808081 0.333333 0.959596 0.813131 0.333333 0.969697 0.818182 0.333333 0.979798 0.823232 0.333333 0.989899 0.828283 0.333333 1.000000 0.833333 0.343434 0.000000 0.343434 0.343434 0.010101 0.348332 0.343434 0.020202 0.353229 0.343434 0.030303 0.358127 0.343434 0.040404 0.363024 0.343434 0.050505 0.367922 0.343434 0.060606 0.372819 0.343434 0.070707 0.377717 0.343434 0.080808 0.382614 0.343434 0.090909 0.387511 0.343434 0.101010 0.392409 0.343434 0.111111 0.397306 0.343434 0.121212 0.402204 0.343434 0.131313 0.407101 0.343434 0.141414 0.411999 0.343434 0.151515 0.416896 0.343434 0.161616 0.421794 0.343434 0.171717 0.426691 0.343434 0.181818 0.431589 0.343434 0.191919 0.436486 0.343434 0.202020 0.441384 0.343434 0.212121 0.446281 0.343434 0.222222 0.451178 0.343434 0.232323 0.456076 0.343434 0.242424 0.460973 0.343434 0.252525 0.465871 0.343434 0.262626 0.470768 0.343434 0.272727 0.475666 0.343434 0.282828 0.480563 0.343434 0.292929 0.485461 0.343434 0.303030 0.490358 0.343434 0.313131 0.495256 0.343434 0.323232 0.500153 0.343434 0.333333 0.505051 0.343434 0.343434 0.509948 0.343434 0.353535 0.514845 0.343434 0.363636 0.519743 0.343434 0.373737 0.524640 0.343434 0.383838 0.529538 0.343434 0.393939 0.534435 0.343434 0.404040 0.539333 0.343434 0.414141 0.544230 0.343434 0.424242 0.549128 0.343434 0.434343 0.554025 0.343434 0.444444 0.558923 0.343434 0.454545 0.563820 0.343434 0.464646 0.568717 0.343434 0.474747 0.573615 0.343434 0.484848 0.578512 0.343434 0.494949 0.583410 0.343434 0.505051 0.588307 0.343434 0.515152 0.593205 0.343434 0.525253 0.598102 0.343434 0.535354 0.603000 0.343434 0.545455 0.607897 0.343434 0.555556 0.612795 0.343434 0.565657 0.617692 0.343434 0.575758 0.622590 0.343434 0.585859 0.627487 0.343434 0.595960 0.632384 0.343434 0.606061 0.637282 0.343434 0.616162 0.642179 0.343434 0.626263 0.647077 0.343434 0.636364 0.651974 0.343434 0.646465 0.656872 0.343434 0.656566 0.661769 0.343434 0.666667 0.666667 0.343434 0.676768 0.671564 0.343434 0.686869 0.676462 0.343434 0.696970 0.681359 0.343434 0.707071 0.686257 0.343434 0.717172 0.691154 0.343434 0.727273 0.696051 0.343434 0.737374 0.700949 0.343434 0.747475 0.705846 0.343434 0.757576 0.710744 0.343434 0.767677 0.715641 0.343434 0.777778 0.720539 0.343434 0.787879 0.725436 0.343434 0.797980 0.730334 0.343434 0.808081 0.735231 0.343434 0.818182 0.740129 0.343434 0.828283 0.745026 0.343434 0.838384 0.749923 0.343434 0.848485 0.754821 0.343434 0.858586 0.759718 0.343434 0.868687 0.764616 0.343434 0.878788 0.769513 0.343434 0.888889 0.774411 0.343434 0.898990 0.779308 0.343434 0.909091 0.784206 0.343434 0.919192 0.789103 0.343434 0.929293 0.794001 0.343434 0.939394 0.798898 0.343434 0.949495 0.803796 0.343434 0.959596 0.808693 0.343434 0.969697 0.813590 0.343434 0.979798 0.818488 0.343434 0.989899 0.823385 0.343434 1.000000 0.828283 0.353535 0.000000 0.353535 0.353535 0.010101 0.358280 0.353535 0.020202 0.363024 0.353535 0.030303 0.367769 0.353535 0.040404 0.372513 0.353535 0.050505 0.377257 0.353535 0.060606 0.382002 0.353535 0.070707 0.386746 0.353535 0.080808 0.391491 0.353535 0.090909 0.396235 0.353535 0.101010 0.400979 0.353535 0.111111 0.405724 0.353535 0.121212 0.410468 0.353535 0.131313 0.415213 0.353535 0.141414 0.419957 0.353535 0.151515 0.424702 0.353535 0.161616 0.429446 0.353535 0.171717 0.434190 0.353535 0.181818 0.438935 0.353535 0.191919 0.443679 0.353535 0.202020 0.448424 0.353535 0.212121 0.453168 0.353535 0.222222 0.457912 0.353535 0.232323 0.462657 0.353535 0.242424 0.467401 0.353535 0.252525 0.472146 0.353535 0.262626 0.476890 0.353535 0.272727 0.481635 0.353535 0.282828 0.486379 0.353535 0.292929 0.491123 0.353535 0.303030 0.495868 0.353535 0.313131 0.500612 0.353535 0.323232 0.505357 0.353535 0.333333 0.510101 0.353535 0.343434 0.514845 0.353535 0.353535 0.519590 0.353535 0.363636 0.524334 0.353535 0.373737 0.529079 0.353535 0.383838 0.533823 0.353535 0.393939 0.538567 0.353535 0.404040 0.543312 0.353535 0.414141 0.548056 0.353535 0.424242 0.552801 0.353535 0.434343 0.557545 0.353535 0.444444 0.562290 0.353535 0.454545 0.567034 0.353535 0.464646 0.571778 0.353535 0.474747 0.576523 0.353535 0.484848 0.581267 0.353535 0.494949 0.586012 0.353535 0.505051 0.590756 0.353535 0.515152 0.595500 0.353535 0.525253 0.600245 0.353535 0.535354 0.604989 0.353535 0.545455 0.609734 0.353535 0.555556 0.614478 0.353535 0.565657 0.619223 0.353535 0.575758 0.623967 0.353535 0.585859 0.628711 0.353535 0.595960 0.633456 0.353535 0.606061 0.638200 0.353535 0.616162 0.642945 0.353535 0.626263 0.647689 0.353535 0.636364 0.652433 0.353535 0.646465 0.657178 0.353535 0.656566 0.661922 0.353535 0.666667 0.666667 0.353535 0.676768 0.671411 0.353535 0.686869 0.676155 0.353535 0.696970 0.680900 0.353535 0.707071 0.685644 0.353535 0.717172 0.690389 0.353535 0.727273 0.695133 0.353535 0.737374 0.699878 0.353535 0.747475 0.704622 0.353535 0.757576 0.709366 0.353535 0.767677 0.714111 0.353535 0.777778 0.718855 0.353535 0.787879 0.723600 0.353535 0.797980 0.728344 0.353535 0.808081 0.733088 0.353535 0.818182 0.737833 0.353535 0.828283 0.742577 0.353535 0.838384 0.747322 0.353535 0.848485 0.752066 0.353535 0.858586 0.756811 0.353535 0.868687 0.761555 0.353535 0.878788 0.766299 0.353535 0.888889 0.771044 0.353535 0.898990 0.775788 0.353535 0.909091 0.780533 0.353535 0.919192 0.785277 0.353535 0.929293 0.790021 0.353535 0.939394 0.794766 0.353535 0.949495 0.799510 0.353535 0.959596 0.804255 0.353535 0.969697 0.808999 0.353535 0.979798 0.813743 0.353535 0.989899 0.818488 0.353535 1.000000 0.823232 0.363636 0.000000 0.363636 0.363636 0.010101 0.368228 0.363636 0.020202 0.372819 0.363636 0.030303 0.377410 0.363636 0.040404 0.382002 0.363636 0.050505 0.386593 0.363636 0.060606 0.391185 0.363636 0.070707 0.395776 0.363636 0.080808 0.400367 0.363636 0.090909 0.404959 0.363636 0.101010 0.409550 0.363636 0.111111 0.414141 0.363636 0.121212 0.418733 0.363636 0.131313 0.423324 0.363636 0.141414 0.427916 0.363636 0.151515 0.432507 0.363636 0.161616 0.437098 0.363636 0.171717 0.441690 0.363636 0.181818 0.446281 0.363636 0.191919 0.450872 0.363636 0.202020 0.455464 0.363636 0.212121 0.460055 0.363636 0.222222 0.464646 0.363636 0.232323 0.469238 0.363636 0.242424 0.473829 0.363636 0.252525 0.478421 0.363636 0.262626 0.483012 0.363636 0.272727 0.487603 0.363636 0.282828 0.492195 0.363636 0.292929 0.496786 0.363636 0.303030 0.501377 0.363636 0.313131 0.505969 0.363636 0.323232 0.510560 0.363636 0.333333 0.515152 0.363636 0.343434 0.519743 0.363636 0.353535 0.524334 0.363636 0.363636 0.528926 0.363636 0.373737 0.533517 0.363636 0.383838 0.538108 0.363636 0.393939 0.542700 0.363636 0.404040 0.547291 0.363636 0.414141 0.551882 0.363636 0.424242 0.556474 0.363636 0.434343 0.561065 0.363636 0.444444 0.565657 0.363636 0.454545 0.570248 0.363636 0.464646 0.574839 0.363636 0.474747 0.579431 0.363636 0.484848 0.584022 0.363636 0.494949 0.588613 0.363636 0.505051 0.593205 0.363636 0.515152 0.597796 0.363636 0.525253 0.602388 0.363636 0.535354 0.606979 0.363636 0.545455 0.611570 0.363636 0.555556 0.616162 0.363636 0.565657 0.620753 0.363636 0.575758 0.625344 0.363636 0.585859 0.629936 0.363636 0.595960 0.634527 0.363636 0.606061 0.639118 0.363636 0.616162 0.643710 0.363636 0.626263 0.648301 0.363636 0.636364 0.652893 0.363636 0.646465 0.657484 0.363636 0.656566 0.662075 0.363636 0.666667 0.666667 0.363636 0.676768 0.671258 0.363636 0.686869 0.675849 0.363636 0.696970 0.680441 0.363636 0.707071 0.685032 0.363636 0.717172 0.689624 0.363636 0.727273 0.694215 0.363636 0.737374 0.698806 0.363636 0.747475 0.703398 0.363636 0.757576 0.707989 0.363636 0.767677 0.712580 0.363636 0.777778 0.717172 0.363636 0.787879 0.721763 0.363636 0.797980 0.726354 0.363636 0.808081 0.730946 0.363636 0.818182 0.735537 0.363636 0.828283 0.740129 0.363636 0.838384 0.744720 0.363636 0.848485 0.749311 0.363636 0.858586 0.753903 0.363636 0.868687 0.758494 0.363636 0.878788 0.763085 0.363636 0.888889 0.767677 0.363636 0.898990 0.772268 0.363636 0.909091 0.776860 0.363636 0.919192 0.781451 0.363636 0.929293 0.786042 0.363636 0.939394 0.790634 0.363636 0.949495 0.795225 0.363636 0.959596 0.799816 0.363636 0.969697 0.804408 0.363636 0.979798 0.808999 0.363636 0.989899 0.813590 0.363636 1.000000 0.818182 0.373737 0.000000 0.373737 0.373737 0.010101 0.378176 0.373737 0.020202 0.382614 0.373737 0.030303 0.387052 0.373737 0.040404 0.391491 0.373737 0.050505 0.395929 0.373737 0.060606 0.400367 0.373737 0.070707 0.404806 0.373737 0.080808 0.409244 0.373737 0.090909 0.413682 0.373737 0.101010 0.418121 0.373737 0.111111 0.422559 0.373737 0.121212 0.426997 0.373737 0.131313 0.431436 0.373737 0.141414 0.435874 0.373737 0.151515 0.440312 0.373737 0.161616 0.444751 0.373737 0.171717 0.449189 0.373737 0.181818 0.453627 0.373737 0.191919 0.458066 0.373737 0.202020 0.462504 0.373737 0.212121 0.466942 0.373737 0.222222 0.471380 0.373737 0.232323 0.475819 0.373737 0.242424 0.480257 0.373737 0.252525 0.484695 0.373737 0.262626 0.489134 0.373737 0.272727 0.493572 0.373737 0.282828 0.498010 0.373737 0.292929 0.502449 0.373737 0.303030 0.506887 0.373737 0.313131 0.511325 0.373737 0.323232 0.515764 0.373737 0.333333 0.520202 0.373737 0.343434 0.524640 0.373737 0.353535 0.529079 0.373737 0.363636 0.533517 0.373737 0.373737 0.537955 0.373737 0.383838 0.542394 0.373737 0.393939 0.546832 0.373737 0.404040 0.551270 0.373737 0.414141 0.555709 0.373737 0.424242 0.560147 0.373737 0.434343 0.564585 0.373737 0.444444 0.569024 0.373737 0.454545 0.573462 0.373737 0.464646 0.577900 0.373737 0.474747 0.582339 0.373737 0.484848 0.586777 0.373737 0.494949 0.591215 0.373737 0.505051 0.595654 0.373737 0.515152 0.600092 0.373737 0.525253 0.604530 0.373737 0.535354 0.608968 0.373737 0.545455 0.613407 0.373737 0.555556 0.617845 0.373737 0.565657 0.622283 0.373737 0.575758 0.626722 0.373737 0.585859 0.631160 0.373737 0.595960 0.635598 0.373737 0.606061 0.640037 0.373737 0.616162 0.644475 0.373737 0.626263 0.648913 0.373737 0.636364 0.653352 0.373737 0.646465 0.657790 0.373737 0.656566 0.662228 0.373737 0.666667 0.666667 0.373737 0.676768 0.671105 0.373737 0.686869 0.675543 0.373737 0.696970 0.679982 0.373737 0.707071 0.684420 0.373737 0.717172 0.688858 0.373737 0.727273 0.693297 0.373737 0.737374 0.697735 0.373737 0.747475 0.702173 0.373737 0.757576 0.706612 0.373737 0.767677 0.711050 0.373737 0.777778 0.715488 0.373737 0.787879 0.719927 0.373737 0.797980 0.724365 0.373737 0.808081 0.728803 0.373737 0.818182 0.733242 0.373737 0.828283 0.737680 0.373737 0.838384 0.742118 0.373737 0.848485 0.746556 0.373737 0.858586 0.750995 0.373737 0.868687 0.755433 0.373737 0.878788 0.759871 0.373737 0.888889 0.764310 0.373737 0.898990 0.768748 0.373737 0.909091 0.773186 0.373737 0.919192 0.777625 0.373737 0.929293 0.782063 0.373737 0.939394 0.786501 0.373737 0.949495 0.790940 0.373737 0.959596 0.795378 0.373737 0.969697 0.799816 0.373737 0.979798 0.804255 0.373737 0.989899 0.808693 0.373737 1.000000 0.813131 0.383838 0.000000 0.383838 0.383838 0.010101 0.388124 0.383838 0.020202 0.392409 0.383838 0.030303 0.396694 0.383838 0.040404 0.400979 0.383838 0.050505 0.405265 0.383838 0.060606 0.409550 0.383838 0.070707 0.413835 0.383838 0.080808 0.418121 0.383838 0.090909 0.422406 0.383838 0.101010 0.426691 0.383838 0.111111 0.430976 0.383838 0.121212 0.435262 0.383838 0.131313 0.439547 0.383838 0.141414 0.443832 0.383838 0.151515 0.448118 0.383838 0.161616 0.452403 0.383838 0.171717 0.456688 0.383838 0.181818 0.460973 0.383838 0.191919 0.465259 0.383838 0.202020 0.469544 0.383838 0.212121 0.473829 0.383838 0.222222 0.478114 0.383838 0.232323 0.482400 0.383838 0.242424 0.486685 0.383838 0.252525 0.490970 0.383838 0.262626 0.495256 0.383838 0.272727 0.499541 0.383838 0.282828 0.503826 0.383838 0.292929 0.508111 0.383838 0.303030 0.512397 0.383838 0.313131 0.516682 0.383838 0.323232 0.520967 0.383838 0.333333 0.525253 0.383838 0.343434 0.529538 0.383838 0.353535 0.533823 0.383838 0.363636 0.538108 0.383838 0.373737 0.542394 0.383838 0.383838 0.546679 0.383838 0.393939 0.550964 0.383838 0.404040 0.555249 0.383838 0.414141 0.559535 0.383838 0.424242 0.563820 0.383838 0.434343 0.568105 0.383838 0.444444 0.572391 0.383838 0.454545 0.576676 0.383838 0.464646 0.580961 0.383838 0.474747 0.585246 0.383838 0.484848 0.589532 0.383838 0.494949 0.593817 0.383838 0.505051 0.598102 0.383838 0.515152 0.602388 0.383838 0.525253 0.606673 0.383838 0.535354 0.610958 0.383838 0.545455 0.615243 0.383838 0.555556 0.619529 0.383838 0.565657 0.623814 0.383838 0.575758 0.628099 0.383838 0.585859 0.632384 0.383838 0.595960 0.636670 0.383838 0.606061 0.640955 0.383838 0.616162 0.645240 0.383838 0.626263 0.649526 0.383838 0.636364 0.653811 0.383838 0.646465 0.658096 0.383838 0.656566 0.662381 0.383838 0.666667 0.666667 0.383838 0.676768 0.670952 0.383838 0.686869 0.675237 0.383838 0.696970 0.679522 0.383838 0.707071 0.683808 0.383838 0.717172 0.688093 0.383838 0.727273 0.692378 0.383838 0.737374 0.696664 0.383838 0.747475 0.700949 0.383838 0.757576 0.705234 0.383838 0.767677 0.709519 0.383838 0.777778 0.713805 0.383838 0.787879 0.718090 0.383838 0.797980 0.722375 0.383838 0.808081 0.726661 0.383838 0.818182 0.730946 0.383838 0.828283 0.735231 0.383838 0.838384 0.739516 0.383838 0.848485 0.743802 0.383838 0.858586 0.748087 0.383838 0.868687 0.752372 0.383838 0.878788 0.756657 0.383838 0.888889 0.760943 0.383838 0.898990 0.765228 0.383838 0.909091 0.769513 0.383838 0.919192 0.773799 0.383838 0.929293 0.778084 0.383838 0.939394 0.782369 0.383838 0.949495 0.786654 0.383838 0.959596 0.790940 0.383838 0.969697 0.795225 0.383838 0.979798 0.799510 0.383838 0.989899 0.803796 0.383838 1.000000 0.808081 0.393939 0.000000 0.393939 0.393939 0.010101 0.398072 0.393939 0.020202 0.402204 0.393939 0.030303 0.406336 0.393939 0.040404 0.410468 0.393939 0.050505 0.414601 0.393939 0.060606 0.418733 0.393939 0.070707 0.422865 0.393939 0.080808 0.426997 0.393939 0.090909 0.431129 0.393939 0.101010 0.435262 0.393939 0.111111 0.439394 0.393939 0.121212 0.443526 0.393939 0.131313 0.447658 0.393939 0.141414 0.451791 0.393939 0.151515 0.455923 0.393939 0.161616 0.460055 0.393939 0.171717 0.464187 0.393939 0.181818 0.468320 0.393939 0.191919 0.472452 0.393939 0.202020 0.476584 0.393939 0.212121 0.480716 0.393939 0.222222 0.484848 0.393939 0.232323 0.488981 0.393939 0.242424 0.493113 0.393939 0.252525 0.497245 0.393939 0.262626 0.501377 0.393939 0.272727 0.505510 0.393939 0.282828 0.509642 0.393939 0.292929 0.513774 0.393939 0.303030 0.517906 0.393939 0.313131 0.522039 0.393939 0.323232 0.526171 0.393939 0.333333 0.530303 0.393939 0.343434 0.534435 0.393939 0.353535 0.538567 0.393939 0.363636 0.542700 0.393939 0.373737 0.546832 0.393939 0.383838 0.550964 0.393939 0.393939 0.555096 0.393939 0.404040 0.559229 0.393939 0.414141 0.563361 0.393939 0.424242 0.567493 0.393939 0.434343 0.571625 0.393939 0.444444 0.575758 0.393939 0.454545 0.579890 0.393939 0.464646 0.584022 0.393939 0.474747 0.588154 0.393939 0.484848 0.592287 0.393939 0.494949 0.596419 0.393939 0.505051 0.600551 0.393939 0.515152 0.604683 0.393939 0.525253 0.608815 0.393939 0.535354 0.612948 0.393939 0.545455 0.617080 0.393939 0.555556 0.621212 0.393939 0.565657 0.625344 0.393939 0.575758 0.629477 0.393939 0.585859 0.633609 0.393939 0.595960 0.637741 0.393939 0.606061 0.641873 0.393939 0.616162 0.646006 0.393939 0.626263 0.650138 0.393939 0.636364 0.654270 0.393939 0.646465 0.658402 0.393939 0.656566 0.662534 0.393939 0.666667 0.666667 0.393939 0.676768 0.670799 0.393939 0.686869 0.674931 0.393939 0.696970 0.679063 0.393939 0.707071 0.683196 0.393939 0.717172 0.687328 0.393939 0.727273 0.691460 0.393939 0.737374 0.695592 0.393939 0.747475 0.699725 0.393939 0.757576 0.703857 0.393939 0.767677 0.707989 0.393939 0.777778 0.712121 0.393939 0.787879 0.716253 0.393939 0.797980 0.720386 0.393939 0.808081 0.724518 0.393939 0.818182 0.728650 0.393939 0.828283 0.732782 0.393939 0.838384 0.736915 0.393939 0.848485 0.741047 0.393939 0.858586 0.745179 0.393939 0.868687 0.749311 0.393939 0.878788 0.753444 0.393939 0.888889 0.757576 0.393939 0.898990 0.761708 0.393939 0.909091 0.765840 0.393939 0.919192 0.769972 0.393939 0.929293 0.774105 0.393939 0.939394 0.778237 0.393939 0.949495 0.782369 0.393939 0.959596 0.786501 0.393939 0.969697 0.790634 0.393939 0.979798 0.794766 0.393939 0.989899 0.798898 0.393939 1.000000 0.803030 0.404040 0.000000 0.404040 0.404040 0.010101 0.408020 0.404040 0.020202 0.411999 0.404040 0.030303 0.415978 0.404040 0.040404 0.419957 0.404040 0.050505 0.423936 0.404040 0.060606 0.427916 0.404040 0.070707 0.431895 0.404040 0.080808 0.435874 0.404040 0.090909 0.439853 0.404040 0.101010 0.443832 0.404040 0.111111 0.447811 0.404040 0.121212 0.451791 0.404040 0.131313 0.455770 0.404040 0.141414 0.459749 0.404040 0.151515 0.463728 0.404040 0.161616 0.467707 0.404040 0.171717 0.471687 0.404040 0.181818 0.475666 0.404040 0.191919 0.479645 0.404040 0.202020 0.483624 0.404040 0.212121 0.487603 0.404040 0.222222 0.491582 0.404040 0.232323 0.495562 0.404040 0.242424 0.499541 0.404040 0.252525 0.503520 0.404040 0.262626 0.507499 0.404040 0.272727 0.511478 0.404040 0.282828 0.515458 0.404040 0.292929 0.519437 0.404040 0.303030 0.523416 0.404040 0.313131 0.527395 0.404040 0.323232 0.531374 0.404040 0.333333 0.535354 0.404040 0.343434 0.539333 0.404040 0.353535 0.543312 0.404040 0.363636 0.547291 0.404040 0.373737 0.551270 0.404040 0.383838 0.555249 0.404040 0.393939 0.559229 0.404040 0.404040 0.563208 0.404040 0.414141 0.567187 0.404040 0.424242 0.571166 0.404040 0.434343 0.575145 0.404040 0.444444 0.579125 0.404040 0.454545 0.583104 0.404040 0.464646 0.587083 0.404040 0.474747 0.591062 0.404040 0.484848 0.595041 0.404040 0.494949 0.599021 0.404040 0.505051 0.603000 0.404040 0.515152 0.606979 0.404040 0.525253 0.610958 0.404040 0.535354 0.614937 0.404040 0.545455 0.618916 0.404040 0.555556 0.622896 0.404040 0.565657 0.626875 0.404040 0.575758 0.630854 0.404040 0.585859 0.634833 0.404040 0.595960 0.638812 0.404040 0.606061 0.642792 0.404040 0.616162 0.646771 0.404040 0.626263 0.650750 0.404040 0.636364 0.654729 0.404040 0.646465 0.658708 0.404040 0.656566 0.662687 0.404040 0.666667 0.666667 0.404040 0.676768 0.670646 0.404040 0.686869 0.674625 0.404040 0.696970 0.678604 0.404040 0.707071 0.682583 0.404040 0.717172 0.686563 0.404040 0.727273 0.690542 0.404040 0.737374 0.694521 0.404040 0.747475 0.698500 0.404040 0.757576 0.702479 0.404040 0.767677 0.706459 0.404040 0.777778 0.710438 0.404040 0.787879 0.714417 0.404040 0.797980 0.718396 0.404040 0.808081 0.722375 0.404040 0.818182 0.726354 0.404040 0.828283 0.730334 0.404040 0.838384 0.734313 0.404040 0.848485 0.738292 0.404040 0.858586 0.742271 0.404040 0.868687 0.746250 0.404040 0.878788 0.750230 0.404040 0.888889 0.754209 0.404040 0.898990 0.758188 0.404040 0.909091 0.762167 0.404040 0.919192 0.766146 0.404040 0.929293 0.770125 0.404040 0.939394 0.774105 0.404040 0.949495 0.778084 0.404040 0.959596 0.782063 0.404040 0.969697 0.786042 0.404040 0.979798 0.790021 0.404040 0.989899 0.794001 0.404040 1.000000 0.797980 0.414141 0.000000 0.414141 0.414141 0.010101 0.417968 0.414141 0.020202 0.421794 0.414141 0.030303 0.425620 0.414141 0.040404 0.429446 0.414141 0.050505 0.433272 0.414141 0.060606 0.437098 0.414141 0.070707 0.440924 0.414141 0.080808 0.444751 0.414141 0.090909 0.448577 0.414141 0.101010 0.452403 0.414141 0.111111 0.456229 0.414141 0.121212 0.460055 0.414141 0.131313 0.463881 0.414141 0.141414 0.467707 0.414141 0.151515 0.471534 0.414141 0.161616 0.475360 0.414141 0.171717 0.479186 0.414141 0.181818 0.483012 0.414141 0.191919 0.486838 0.414141 0.202020 0.490664 0.414141 0.212121 0.494490 0.414141 0.222222 0.498316 0.414141 0.232323 0.502143 0.414141 0.242424 0.505969 0.414141 0.252525 0.509795 0.414141 0.262626 0.513621 0.414141 0.272727 0.517447 0.414141 0.282828 0.521273 0.414141 0.292929 0.525099 0.414141 0.303030 0.528926 0.414141 0.313131 0.532752 0.414141 0.323232 0.536578 0.414141 0.333333 0.540404 0.414141 0.343434 0.544230 0.414141 0.353535 0.548056 0.414141 0.363636 0.551882 0.414141 0.373737 0.555709 0.414141 0.383838 0.559535 0.414141 0.393939 0.563361 0.414141 0.404040 0.567187 0.414141 0.414141 0.571013 0.414141 0.424242 0.574839 0.414141 0.434343 0.578665 0.414141 0.444444 0.582492 0.414141 0.454545 0.586318 0.414141 0.464646 0.590144 0.414141 0.474747 0.593970 0.414141 0.484848 0.597796 0.414141 0.494949 0.601622 0.414141 0.505051 0.605448 0.414141 0.515152 0.609275 0.414141 0.525253 0.613101 0.414141 0.535354 0.616927 0.414141 0.545455 0.620753 0.414141 0.555556 0.624579 0.414141 0.565657 0.628405 0.414141 0.575758 0.632231 0.414141 0.585859 0.636058 0.414141 0.595960 0.639884 0.414141 0.606061 0.643710 0.414141 0.616162 0.647536 0.414141 0.626263 0.651362 0.414141 0.636364 0.655188 0.414141 0.646465 0.659014 0.414141 0.656566 0.662841 0.414141 0.666667 0.666667 0.414141 0.676768 0.670493 0.414141 0.686869 0.674319 0.414141 0.696970 0.678145 0.414141 0.707071 0.681971 0.414141 0.717172 0.685797 0.414141 0.727273 0.689624 0.414141 0.737374 0.693450 0.414141 0.747475 0.697276 0.414141 0.757576 0.701102 0.414141 0.767677 0.704928 0.414141 0.777778 0.708754 0.414141 0.787879 0.712580 0.414141 0.797980 0.716406 0.414141 0.808081 0.720233 0.414141 0.818182 0.724059 0.414141 0.828283 0.727885 0.414141 0.838384 0.731711 0.414141 0.848485 0.735537 0.414141 0.858586 0.739363 0.414141 0.868687 0.743189 0.414141 0.878788 0.747016 0.414141 0.888889 0.750842 0.414141 0.898990 0.754668 0.414141 0.909091 0.758494 0.414141 0.919192 0.762320 0.414141 0.929293 0.766146 0.414141 0.939394 0.769972 0.414141 0.949495 0.773799 0.414141 0.959596 0.777625 0.414141 0.969697 0.781451 0.414141 0.979798 0.785277 0.414141 0.989899 0.789103 0.414141 1.000000 0.792929 0.424242 0.000000 0.424242 0.424242 0.010101 0.427916 0.424242 0.020202 0.431589 0.424242 0.030303 0.435262 0.424242 0.040404 0.438935 0.424242 0.050505 0.442608 0.424242 0.060606 0.446281 0.424242 0.070707 0.449954 0.424242 0.080808 0.453627 0.424242 0.090909 0.457300 0.424242 0.101010 0.460973 0.424242 0.111111 0.464646 0.424242 0.121212 0.468320 0.424242 0.131313 0.471993 0.424242 0.141414 0.475666 0.424242 0.151515 0.479339 0.424242 0.161616 0.483012 0.424242 0.171717 0.486685 0.424242 0.181818 0.490358 0.424242 0.191919 0.494031 0.424242 0.202020 0.497704 0.424242 0.212121 0.501377 0.424242 0.222222 0.505051 0.424242 0.232323 0.508724 0.424242 0.242424 0.512397 0.424242 0.252525 0.516070 0.424242 0.262626 0.519743 0.424242 0.272727 0.523416 0.424242 0.282828 0.527089 0.424242 0.292929 0.530762 0.424242 0.303030 0.534435 0.424242 0.313131 0.538108 0.424242 0.323232 0.541781 0.424242 0.333333 0.545455 0.424242 0.343434 0.549128 0.424242 0.353535 0.552801 0.424242 0.363636 0.556474 0.424242 0.373737 0.560147 0.424242 0.383838 0.563820 0.424242 0.393939 0.567493 0.424242 0.404040 0.571166 0.424242 0.414141 0.574839 0.424242 0.424242 0.578512 0.424242 0.434343 0.582185 0.424242 0.444444 0.585859 0.424242 0.454545 0.589532 0.424242 0.464646 0.593205 0.424242 0.474747 0.596878 0.424242 0.484848 0.600551 0.424242 0.494949 0.604224 0.424242 0.505051 0.607897 0.424242 0.515152 0.611570 0.424242 0.525253 0.615243 0.424242 0.535354 0.618916 0.424242 0.545455 0.622590 0.424242 0.555556 0.626263 0.424242 0.565657 0.629936 0.424242 0.575758 0.633609 0.424242 0.585859 0.637282 0.424242 0.595960 0.640955 0.424242 0.606061 0.644628 0.424242 0.616162 0.648301 0.424242 0.626263 0.651974 0.424242 0.636364 0.655647 0.424242 0.646465 0.659320 0.424242 0.656566 0.662994 0.424242 0.666667 0.666667 0.424242 0.676768 0.670340 0.424242 0.686869 0.674013 0.424242 0.696970 0.677686 0.424242 0.707071 0.681359 0.424242 0.717172 0.685032 0.424242 0.727273 0.688705 0.424242 0.737374 0.692378 0.424242 0.747475 0.696051 0.424242 0.757576 0.699725 0.424242 0.767677 0.703398 0.424242 0.777778 0.707071 0.424242 0.787879 0.710744 0.424242 0.797980 0.714417 0.424242 0.808081 0.718090 0.424242 0.818182 0.721763 0.424242 0.828283 0.725436 0.424242 0.838384 0.729109 0.424242 0.848485 0.732782 0.424242 0.858586 0.736455 0.424242 0.868687 0.740129 0.424242 0.878788 0.743802 0.424242 0.888889 0.747475 0.424242 0.898990 0.751148 0.424242 0.909091 0.754821 0.424242 0.919192 0.758494 0.424242 0.929293 0.762167 0.424242 0.939394 0.765840 0.424242 0.949495 0.769513 0.424242 0.959596 0.773186 0.424242 0.969697 0.776860 0.424242 0.979798 0.780533 0.424242 0.989899 0.784206 0.424242 1.000000 0.787879 0.434343 0.000000 0.434343 0.434343 0.010101 0.437863 0.434343 0.020202 0.441384 0.434343 0.030303 0.444904 0.434343 0.040404 0.448424 0.434343 0.050505 0.451944 0.434343 0.060606 0.455464 0.434343 0.070707 0.458984 0.434343 0.080808 0.462504 0.434343 0.090909 0.466024 0.434343 0.101010 0.469544 0.434343 0.111111 0.473064 0.434343 0.121212 0.476584 0.434343 0.131313 0.480104 0.434343 0.141414 0.483624 0.434343 0.151515 0.487144 0.434343 0.161616 0.490664 0.434343 0.171717 0.494184 0.434343 0.181818 0.497704 0.434343 0.191919 0.501224 0.434343 0.202020 0.504744 0.434343 0.212121 0.508264 0.434343 0.222222 0.511785 0.434343 0.232323 0.515305 0.434343 0.242424 0.518825 0.434343 0.252525 0.522345 0.434343 0.262626 0.525865 0.434343 0.272727 0.529385 0.434343 0.282828 0.532905 0.434343 0.292929 0.536425 0.434343 0.303030 0.539945 0.434343 0.313131 0.543465 0.434343 0.323232 0.546985 0.434343 0.333333 0.550505 0.434343 0.343434 0.554025 0.434343 0.353535 0.557545 0.434343 0.363636 0.561065 0.434343 0.373737 0.564585 0.434343 0.383838 0.568105 0.434343 0.393939 0.571625 0.434343 0.404040 0.575145 0.434343 0.414141 0.578665 0.434343 0.424242 0.582185 0.434343 0.434343 0.585706 0.434343 0.444444 0.589226 0.434343 0.454545 0.592746 0.434343 0.464646 0.596266 0.434343 0.474747 0.599786 0.434343 0.484848 0.603306 0.434343 0.494949 0.606826 0.434343 0.505051 0.610346 0.434343 0.515152 0.613866 0.434343 0.525253 0.617386 0.434343 0.535354 0.620906 0.434343 0.545455 0.624426 0.434343 0.555556 0.627946 0.434343 0.565657 0.631466 0.434343 0.575758 0.634986 0.434343 0.585859 0.638506 0.434343 0.595960 0.642026 0.434343 0.606061 0.645546 0.434343 0.616162 0.649066 0.434343 0.626263 0.652586 0.434343 0.636364 0.656107 0.434343 0.646465 0.659627 0.434343 0.656566 0.663147 0.434343 0.666667 0.666667 0.434343 0.676768 0.670187 0.434343 0.686869 0.673707 0.434343 0.696970 0.677227 0.434343 0.707071 0.680747 0.434343 0.717172 0.684267 0.434343 0.727273 0.687787 0.434343 0.737374 0.691307 0.434343 0.747475 0.694827 0.434343 0.757576 0.698347 0.434343 0.767677 0.701867 0.434343 0.777778 0.705387 0.434343 0.787879 0.708907 0.434343 0.797980 0.712427 0.434343 0.808081 0.715947 0.434343 0.818182 0.719467 0.434343 0.828283 0.722987 0.434343 0.838384 0.726507 0.434343 0.848485 0.730028 0.434343 0.858586 0.733548 0.434343 0.868687 0.737068 0.434343 0.878788 0.740588 0.434343 0.888889 0.744108 0.434343 0.898990 0.747628 0.434343 0.909091 0.751148 0.434343 0.919192 0.754668 0.434343 0.929293 0.758188 0.434343 0.939394 0.761708 0.434343 0.949495 0.765228 0.434343 0.959596 0.768748 0.434343 0.969697 0.772268 0.434343 0.979798 0.775788 0.434343 0.989899 0.779308 0.434343 1.000000 0.782828 0.444444 0.000000 0.444444 0.444444 0.010101 0.447811 0.444444 0.020202 0.451178 0.444444 0.030303 0.454545 0.444444 0.040404 0.457912 0.444444 0.050505 0.461279 0.444444 0.060606 0.464646 0.444444 0.070707 0.468013 0.444444 0.080808 0.471380 0.444444 0.090909 0.474747 0.444444 0.101010 0.478114 0.444444 0.111111 0.481481 0.444444 0.121212 0.484848 0.444444 0.131313 0.488215 0.444444 0.141414 0.491582 0.444444 0.151515 0.494949 0.444444 0.161616 0.498316 0.444444 0.171717 0.501684 0.444444 0.181818 0.505051 0.444444 0.191919 0.508418 0.444444 0.202020 0.511785 0.444444 0.212121 0.515152 0.444444 0.222222 0.518519 0.444444 0.232323 0.521886 0.444444 0.242424 0.525253 0.444444 0.252525 0.528620 0.444444 0.262626 0.531987 0.444444 0.272727 0.535354 0.444444 0.282828 0.538721 0.444444 0.292929 0.542088 0.444444 0.303030 0.545455 0.444444 0.313131 0.548822 0.444444 0.323232 0.552189 0.444444 0.333333 0.555556 0.444444 0.343434 0.558923 0.444444 0.353535 0.562290 0.444444 0.363636 0.565657 0.444444 0.373737 0.569024 0.444444 0.383838 0.572391 0.444444 0.393939 0.575758 0.444444 0.404040 0.579125 0.444444 0.414141 0.582492 0.444444 0.424242 0.585859 0.444444 0.434343 0.589226 0.444444 0.444444 0.592593 0.444444 0.454545 0.595960 0.444444 0.464646 0.599327 0.444444 0.474747 0.602694 0.444444 0.484848 0.606061 0.444444 0.494949 0.609428 0.444444 0.505051 0.612795 0.444444 0.515152 0.616162 0.444444 0.525253 0.619529 0.444444 0.535354 0.622896 0.444444 0.545455 0.626263 0.444444 0.555556 0.629630 0.444444 0.565657 0.632997 0.444444 0.575758 0.636364 0.444444 0.585859 0.639731 0.444444 0.595960 0.643098 0.444444 0.606061 0.646465 0.444444 0.616162 0.649832 0.444444 0.626263 0.653199 0.444444 0.636364 0.656566 0.444444 0.646465 0.659933 0.444444 0.656566 0.663300 0.444444 0.666667 0.666667 0.444444 0.676768 0.670034 0.444444 0.686869 0.673401 0.444444 0.696970 0.676768 0.444444 0.707071 0.680135 0.444444 0.717172 0.683502 0.444444 0.727273 0.686869 0.444444 0.737374 0.690236 0.444444 0.747475 0.693603 0.444444 0.757576 0.696970 0.444444 0.767677 0.700337 0.444444 0.777778 0.703704 0.444444 0.787879 0.707071 0.444444 0.797980 0.710438 0.444444 0.808081 0.713805 0.444444 0.818182 0.717172 0.444444 0.828283 0.720539 0.444444 0.838384 0.723906 0.444444 0.848485 0.727273 0.444444 0.858586 0.730640 0.444444 0.868687 0.734007 0.444444 0.878788 0.737374 0.444444 0.888889 0.740741 0.444444 0.898990 0.744108 0.444444 0.909091 0.747475 0.444444 0.919192 0.750842 0.444444 0.929293 0.754209 0.444444 0.939394 0.757576 0.444444 0.949495 0.760943 0.444444 0.959596 0.764310 0.444444 0.969697 0.767677 0.444444 0.979798 0.771044 0.444444 0.989899 0.774411 0.444444 1.000000 0.777778 0.454545 0.000000 0.454545 0.454545 0.010101 0.457759 0.454545 0.020202 0.460973 0.454545 0.030303 0.464187 0.454545 0.040404 0.467401 0.454545 0.050505 0.470615 0.454545 0.060606 0.473829 0.454545 0.070707 0.477043 0.454545 0.080808 0.480257 0.454545 0.090909 0.483471 0.454545 0.101010 0.486685 0.454545 0.111111 0.489899 0.454545 0.121212 0.493113 0.454545 0.131313 0.496327 0.454545 0.141414 0.499541 0.454545 0.151515 0.502755 0.454545 0.161616 0.505969 0.454545 0.171717 0.509183 0.454545 0.181818 0.512397 0.454545 0.191919 0.515611 0.454545 0.202020 0.518825 0.454545 0.212121 0.522039 0.454545 0.222222 0.525253 0.454545 0.232323 0.528466 0.454545 0.242424 0.531680 0.454545 0.252525 0.534894 0.454545 0.262626 0.538108 0.454545 0.272727 0.541322 0.454545 0.282828 0.544536 0.454545 0.292929 0.547750 0.454545 0.303030 0.550964 0.454545 0.313131 0.554178 0.454545 0.323232 0.557392 0.454545 0.333333 0.560606 0.454545 0.343434 0.563820 0.454545 0.353535 0.567034 0.454545 0.363636 0.570248 0.454545 0.373737 0.573462 0.454545 0.383838 0.576676 0.454545 0.393939 0.579890 0.454545 0.404040 0.583104 0.454545 0.414141 0.586318 0.454545 0.424242 0.589532 0.454545 0.434343 0.592746 0.454545 0.444444 0.595960 0.454545 0.454545 0.599174 0.454545 0.464646 0.602388 0.454545 0.474747 0.605601 0.454545 0.484848 0.608815 0.454545 0.494949 0.612029 0.454545 0.505051 0.615243 0.454545 0.515152 0.618457 0.454545 0.525253 0.621671 0.454545 0.535354 0.624885 0.454545 0.545455 0.628099 0.454545 0.555556 0.631313 0.454545 0.565657 0.634527 0.454545 0.575758 0.637741 0.454545 0.585859 0.640955 0.454545 0.595960 0.644169 0.454545 0.606061 0.647383 0.454545 0.616162 0.650597 0.454545 0.626263 0.653811 0.454545 0.636364 0.657025 0.454545 0.646465 0.660239 0.454545 0.656566 0.663453 0.454545 0.666667 0.666667 0.454545 0.676768 0.669881 0.454545 0.686869 0.673095 0.454545 0.696970 0.676309 0.454545 0.707071 0.679522 0.454545 0.717172 0.682736 0.454545 0.727273 0.685950 0.454545 0.737374 0.689164 0.454545 0.747475 0.692378 0.454545 0.757576 0.695592 0.454545 0.767677 0.698806 0.454545 0.777778 0.702020 0.454545 0.787879 0.705234 0.454545 0.797980 0.708448 0.454545 0.808081 0.711662 0.454545 0.818182 0.714876 0.454545 0.828283 0.718090 0.454545 0.838384 0.721304 0.454545 0.848485 0.724518 0.454545 0.858586 0.727732 0.454545 0.868687 0.730946 0.454545 0.878788 0.734160 0.454545 0.888889 0.737374 0.454545 0.898990 0.740588 0.454545 0.909091 0.743802 0.454545 0.919192 0.747016 0.454545 0.929293 0.750230 0.454545 0.939394 0.753444 0.454545 0.949495 0.756657 0.454545 0.959596 0.759871 0.454545 0.969697 0.763085 0.454545 0.979798 0.766299 0.454545 0.989899 0.769513 0.454545 1.000000 0.772727 0.464646 0.000000 0.464646 0.464646 0.010101 0.467707 0.464646 0.020202 0.470768 0.464646 0.030303 0.473829 0.464646 0.040404 0.476890 0.464646 0.050505 0.479951 0.464646 0.060606 0.483012 0.464646 0.070707 0.486073 0.464646 0.080808 0.489134 0.464646 0.090909 0.492195 0.464646 0.101010 0.495256 0.464646 0.111111 0.498316 0.464646 0.121212 0.501377 0.464646 0.131313 0.504438 0.464646 0.141414 0.507499 0.464646 0.151515 0.510560 0.464646 0.161616 0.513621 0.464646 0.171717 0.516682 0.464646 0.181818 0.519743 0.464646 0.191919 0.522804 0.464646 0.202020 0.525865 0.464646 0.212121 0.528926 0.464646 0.222222 0.531987 0.464646 0.232323 0.535047 0.464646 0.242424 0.538108 0.464646 0.252525 0.541169 0.464646 0.262626 0.544230 0.464646 0.272727 0.547291 0.464646 0.282828 0.550352 0.464646 0.292929 0.553413 0.464646 0.303030 0.556474 0.464646 0.313131 0.559535 0.464646 0.323232 0.562596 0.464646 0.333333 0.565657 0.464646 0.343434 0.568717 0.464646 0.353535 0.571778 0.464646 0.363636 0.574839 0.464646 0.373737 0.577900 0.464646 0.383838 0.580961 0.464646 0.393939 0.584022 0.464646 0.404040 0.587083 0.464646 0.414141 0.590144 0.464646 0.424242 0.593205 0.464646 0.434343 0.596266 0.464646 0.444444 0.599327 0.464646 0.454545 0.602388 0.464646 0.464646 0.605448 0.464646 0.474747 0.608509 0.464646 0.484848 0.611570 0.464646 0.494949 0.614631 0.464646 0.505051 0.617692 0.464646 0.515152 0.620753 0.464646 0.525253 0.623814 0.464646 0.535354 0.626875 0.464646 0.545455 0.629936 0.464646 0.555556 0.632997 0.464646 0.565657 0.636058 0.464646 0.575758 0.639118 0.464646 0.585859 0.642179 0.464646 0.595960 0.645240 0.464646 0.606061 0.648301 0.464646 0.616162 0.651362 0.464646 0.626263 0.654423 0.464646 0.636364 0.657484 0.464646 0.646465 0.660545 0.464646 0.656566 0.663606 0.464646 0.666667 0.666667 0.464646 0.676768 0.669728 0.464646 0.686869 0.672788 0.464646 0.696970 0.675849 0.464646 0.707071 0.678910 0.464646 0.717172 0.681971 0.464646 0.727273 0.685032 0.464646 0.737374 0.688093 0.464646 0.747475 0.691154 0.464646 0.757576 0.694215 0.464646 0.767677 0.697276 0.464646 0.777778 0.700337 0.464646 0.787879 0.703398 0.464646 0.797980 0.706459 0.464646 0.808081 0.709519 0.464646 0.818182 0.712580 0.464646 0.828283 0.715641 0.464646 0.838384 0.718702 0.464646 0.848485 0.721763 0.464646 0.858586 0.724824 0.464646 0.868687 0.727885 0.464646 0.878788 0.730946 0.464646 0.888889 0.734007 0.464646 0.898990 0.737068 0.464646 0.909091 0.740129 0.464646 0.919192 0.743189 0.464646 0.929293 0.746250 0.464646 0.939394 0.749311 0.464646 0.949495 0.752372 0.464646 0.959596 0.755433 0.464646 0.969697 0.758494 0.464646 0.979798 0.761555 0.464646 0.989899 0.764616 0.464646 1.000000 0.767677 0.474747 0.000000 0.474747 0.474747 0.010101 0.477655 0.474747 0.020202 0.480563 0.474747 0.030303 0.483471 0.474747 0.040404 0.486379 0.474747 0.050505 0.489287 0.474747 0.060606 0.492195 0.474747 0.070707 0.495103 0.474747 0.080808 0.498010 0.474747 0.090909 0.500918 0.474747 0.101010 0.503826 0.474747 0.111111 0.506734 0.474747 0.121212 0.509642 0.474747 0.131313 0.512550 0.474747 0.141414 0.515458 0.474747 0.151515 0.518365 0.474747 0.161616 0.521273 0.474747 0.171717 0.524181 0.474747 0.181818 0.527089 0.474747 0.191919 0.529997 0.474747 0.202020 0.532905 0.474747 0.212121 0.535813 0.474747 0.222222 0.538721 0.474747 0.232323 0.541628 0.474747 0.242424 0.544536 0.474747 0.252525 0.547444 0.474747 0.262626 0.550352 0.474747 0.272727 0.553260 0.474747 0.282828 0.556168 0.474747 0.292929 0.559076 0.474747 0.303030 0.561983 0.474747 0.313131 0.564891 0.474747 0.323232 0.567799 0.474747 0.333333 0.570707 0.474747 0.343434 0.573615 0.474747 0.353535 0.576523 0.474747 0.363636 0.579431 0.474747 0.373737 0.582339 0.474747 0.383838 0.585246 0.474747 0.393939 0.588154 0.474747 0.404040 0.591062 0.474747 0.414141 0.593970 0.474747 0.424242 0.596878 0.474747 0.434343 0.599786 0.474747 0.444444 0.602694 0.474747 0.454545 0.605601 0.474747 0.464646 0.608509 0.474747 0.474747 0.611417 0.474747 0.484848 0.614325 0.474747 0.494949 0.617233 0.474747 0.505051 0.620141 0.474747 0.515152 0.623049 0.474747 0.525253 0.625957 0.474747 0.535354 0.628864 0.474747 0.545455 0.631772 0.474747 0.555556 0.634680 0.474747 0.565657 0.637588 0.474747 0.575758 0.640496 0.474747 0.585859 0.643404 0.474747 0.595960 0.646312 0.474747 0.606061 0.649219 0.474747 0.616162 0.652127 0.474747 0.626263 0.655035 0.474747 0.636364 0.657943 0.474747 0.646465 0.660851 0.474747 0.656566 0.663759 0.474747 0.666667 0.666667 0.474747 0.676768 0.669575 0.474747 0.686869 0.672482 0.474747 0.696970 0.675390 0.474747 0.707071 0.678298 0.474747 0.717172 0.681206 0.474747 0.727273 0.684114 0.474747 0.737374 0.687022 0.474747 0.747475 0.689930 0.474747 0.757576 0.692837 0.474747 0.767677 0.695745 0.474747 0.777778 0.698653 0.474747 0.787879 0.701561 0.474747 0.797980 0.704469 0.474747 0.808081 0.707377 0.474747 0.818182 0.710285 0.474747 0.828283 0.713193 0.474747 0.838384 0.716100 0.474747 0.848485 0.719008 0.474747 0.858586 0.721916 0.474747 0.868687 0.724824 0.474747 0.878788 0.727732 0.474747 0.888889 0.730640 0.474747 0.898990 0.733548 0.474747 0.909091 0.736455 0.474747 0.919192 0.739363 0.474747 0.929293 0.742271 0.474747 0.939394 0.745179 0.474747 0.949495 0.748087 0.474747 0.959596 0.750995 0.474747 0.969697 0.753903 0.474747 0.979798 0.756811 0.474747 0.989899 0.759718 0.474747 1.000000 0.762626 0.484848 0.000000 0.484848 0.484848 0.010101 0.487603 0.484848 0.020202 0.490358 0.484848 0.030303 0.493113 0.484848 0.040404 0.495868 0.484848 0.050505 0.498623 0.484848 0.060606 0.501377 0.484848 0.070707 0.504132 0.484848 0.080808 0.506887 0.484848 0.090909 0.509642 0.484848 0.101010 0.512397 0.484848 0.111111 0.515152 0.484848 0.121212 0.517906 0.484848 0.131313 0.520661 0.484848 0.141414 0.523416 0.484848 0.151515 0.526171 0.484848 0.161616 0.528926 0.484848 0.171717 0.531680 0.484848 0.181818 0.534435 0.484848 0.191919 0.537190 0.484848 0.202020 0.539945 0.484848 0.212121 0.542700 0.484848 0.222222 0.545455 0.484848 0.232323 0.548209 0.484848 0.242424 0.550964 0.484848 0.252525 0.553719 0.484848 0.262626 0.556474 0.484848 0.272727 0.559229 0.484848 0.282828 0.561983 0.484848 0.292929 0.564738 0.484848 0.303030 0.567493 0.484848 0.313131 0.570248 0.484848 0.323232 0.573003 0.484848 0.333333 0.575758 0.484848 0.343434 0.578512 0.484848 0.353535 0.581267 0.484848 0.363636 0.584022 0.484848 0.373737 0.586777 0.484848 0.383838 0.589532 0.484848 0.393939 0.592287 0.484848 0.404040 0.595041 0.484848 0.414141 0.597796 0.484848 0.424242 0.600551 0.484848 0.434343 0.603306 0.484848 0.444444 0.606061 0.484848 0.454545 0.608815 0.484848 0.464646 0.611570 0.484848 0.474747 0.614325 0.484848 0.484848 0.617080 0.484848 0.494949 0.619835 0.484848 0.505051 0.622590 0.484848 0.515152 0.625344 0.484848 0.525253 0.628099 0.484848 0.535354 0.630854 0.484848 0.545455 0.633609 0.484848 0.555556 0.636364 0.484848 0.565657 0.639118 0.484848 0.575758 0.641873 0.484848 0.585859 0.644628 0.484848 0.595960 0.647383 0.484848 0.606061 0.650138 0.484848 0.616162 0.652893 0.484848 0.626263 0.655647 0.484848 0.636364 0.658402 0.484848 0.646465 0.661157 0.484848 0.656566 0.663912 0.484848 0.666667 0.666667 0.484848 0.676768 0.669421 0.484848 0.686869 0.672176 0.484848 0.696970 0.674931 0.484848 0.707071 0.677686 0.484848 0.717172 0.680441 0.484848 0.727273 0.683196 0.484848 0.737374 0.685950 0.484848 0.747475 0.688705 0.484848 0.757576 0.691460 0.484848 0.767677 0.694215 0.484848 0.777778 0.696970 0.484848 0.787879 0.699725 0.484848 0.797980 0.702479 0.484848 0.808081 0.705234 0.484848 0.818182 0.707989 0.484848 0.828283 0.710744 0.484848 0.838384 0.713499 0.484848 0.848485 0.716253 0.484848 0.858586 0.719008 0.484848 0.868687 0.721763 0.484848 0.878788 0.724518 0.484848 0.888889 0.727273 0.484848 0.898990 0.730028 0.484848 0.909091 0.732782 0.484848 0.919192 0.735537 0.484848 0.929293 0.738292 0.484848 0.939394 0.741047 0.484848 0.949495 0.743802 0.484848 0.959596 0.746556 0.484848 0.969697 0.749311 0.484848 0.979798 0.752066 0.484848 0.989899 0.754821 0.484848 1.000000 0.757576 0.494949 0.000000 0.494949 0.494949 0.010101 0.497551 0.494949 0.020202 0.500153 0.494949 0.030303 0.502755 0.494949 0.040404 0.505357 0.494949 0.050505 0.507958 0.494949 0.060606 0.510560 0.494949 0.070707 0.513162 0.494949 0.080808 0.515764 0.494949 0.090909 0.518365 0.494949 0.101010 0.520967 0.494949 0.111111 0.523569 0.494949 0.121212 0.526171 0.494949 0.131313 0.528773 0.494949 0.141414 0.531374 0.494949 0.151515 0.533976 0.494949 0.161616 0.536578 0.494949 0.171717 0.539180 0.494949 0.181818 0.541781 0.494949 0.191919 0.544383 0.494949 0.202020 0.546985 0.494949 0.212121 0.549587 0.494949 0.222222 0.552189 0.494949 0.232323 0.554790 0.494949 0.242424 0.557392 0.494949 0.252525 0.559994 0.494949 0.262626 0.562596 0.494949 0.272727 0.565197 0.494949 0.282828 0.567799 0.494949 0.292929 0.570401 0.494949 0.303030 0.573003 0.494949 0.313131 0.575605 0.494949 0.323232 0.578206 0.494949 0.333333 0.580808 0.494949 0.343434 0.583410 0.494949 0.353535 0.586012 0.494949 0.363636 0.588613 0.494949 0.373737 0.591215 0.494949 0.383838 0.593817 0.494949 0.393939 0.596419 0.494949 0.404040 0.599021 0.494949 0.414141 0.601622 0.494949 0.424242 0.604224 0.494949 0.434343 0.606826 0.494949 0.444444 0.609428 0.494949 0.454545 0.612029 0.494949 0.464646 0.614631 0.494949 0.474747 0.617233 0.494949 0.484848 0.619835 0.494949 0.494949 0.622436 0.494949 0.505051 0.625038 0.494949 0.515152 0.627640 0.494949 0.525253 0.630242 0.494949 0.535354 0.632844 0.494949 0.545455 0.635445 0.494949 0.555556 0.638047 0.494949 0.565657 0.640649 0.494949 0.575758 0.643251 0.494949 0.585859 0.645852 0.494949 0.595960 0.648454 0.494949 0.606061 0.651056 0.494949 0.616162 0.653658 0.494949 0.626263 0.656260 0.494949 0.636364 0.658861 0.494949 0.646465 0.661463 0.494949 0.656566 0.664065 0.494949 0.666667 0.666667 0.494949 0.676768 0.669268 0.494949 0.686869 0.671870 0.494949 0.696970 0.674472 0.494949 0.707071 0.677074 0.494949 0.717172 0.679676 0.494949 0.727273 0.682277 0.494949 0.737374 0.684879 0.494949 0.747475 0.687481 0.494949 0.757576 0.690083 0.494949 0.767677 0.692684 0.494949 0.777778 0.695286 0.494949 0.787879 0.697888 0.494949 0.797980 0.700490 0.494949 0.808081 0.703092 0.494949 0.818182 0.705693 0.494949 0.828283 0.708295 0.494949 0.838384 0.710897 0.494949 0.848485 0.713499 0.494949 0.858586 0.716100 0.494949 0.868687 0.718702 0.494949 0.878788 0.721304 0.494949 0.888889 0.723906 0.494949 0.898990 0.726507 0.494949 0.909091 0.729109 0.494949 0.919192 0.731711 0.494949 0.929293 0.734313 0.494949 0.939394 0.736915 0.494949 0.949495 0.739516 0.494949 0.959596 0.742118 0.494949 0.969697 0.744720 0.494949 0.979798 0.747322 0.494949 0.989899 0.749923 0.494949 1.000000 0.752525 0.505051 0.000000 0.505051 0.505051 0.010101 0.507499 0.505051 0.020202 0.509948 0.505051 0.030303 0.512397 0.505051 0.040404 0.514845 0.505051 0.050505 0.517294 0.505051 0.060606 0.519743 0.505051 0.070707 0.522192 0.505051 0.080808 0.524640 0.505051 0.090909 0.527089 0.505051 0.101010 0.529538 0.505051 0.111111 0.531987 0.505051 0.121212 0.534435 0.505051 0.131313 0.536884 0.505051 0.141414 0.539333 0.505051 0.151515 0.541781 0.505051 0.161616 0.544230 0.505051 0.171717 0.546679 0.505051 0.181818 0.549128 0.505051 0.191919 0.551576 0.505051 0.202020 0.554025 0.505051 0.212121 0.556474 0.505051 0.222222 0.558923 0.505051 0.232323 0.561371 0.505051 0.242424 0.563820 0.505051 0.252525 0.566269 0.505051 0.262626 0.568717 0.505051 0.272727 0.571166 0.505051 0.282828 0.573615 0.505051 0.292929 0.576064 0.505051 0.303030 0.578512 0.505051 0.313131 0.580961 0.505051 0.323232 0.583410 0.505051 0.333333 0.585859 0.505051 0.343434 0.588307 0.505051 0.353535 0.590756 0.505051 0.363636 0.593205 0.505051 0.373737 0.595654 0.505051 0.383838 0.598102 0.505051 0.393939 0.600551 0.505051 0.404040 0.603000 0.505051 0.414141 0.605448 0.505051 0.424242 0.607897 0.505051 0.434343 0.610346 0.505051 0.444444 0.612795 0.505051 0.454545 0.615243 0.505051 0.464646 0.617692 0.505051 0.474747 0.620141 0.505051 0.484848 0.622590 0.505051 0.494949 0.625038 0.505051 0.505051 0.627487 0.505051 0.515152 0.629936 0.505051 0.525253 0.632384 0.505051 0.535354 0.634833 0.505051 0.545455 0.637282 0.505051 0.555556 0.639731 0.505051 0.565657 0.642179 0.505051 0.575758 0.644628 0.505051 0.585859 0.647077 0.505051 0.595960 0.649526 0.505051 0.606061 0.651974 0.505051 0.616162 0.654423 0.505051 0.626263 0.656872 0.505051 0.636364 0.659320 0.505051 0.646465 0.661769 0.505051 0.656566 0.664218 0.505051 0.666667 0.666667 0.505051 0.676768 0.669115 0.505051 0.686869 0.671564 0.505051 0.696970 0.674013 0.505051 0.707071 0.676462 0.505051 0.717172 0.678910 0.505051 0.727273 0.681359 0.505051 0.737374 0.683808 0.505051 0.747475 0.686257 0.505051 0.757576 0.688705 0.505051 0.767677 0.691154 0.505051 0.777778 0.693603 0.505051 0.787879 0.696051 0.505051 0.797980 0.698500 0.505051 0.808081 0.700949 0.505051 0.818182 0.703398 0.505051 0.828283 0.705846 0.505051 0.838384 0.708295 0.505051 0.848485 0.710744 0.505051 0.858586 0.713193 0.505051 0.868687 0.715641 0.505051 0.878788 0.718090 0.505051 0.888889 0.720539 0.505051 0.898990 0.722987 0.505051 0.909091 0.725436 0.505051 0.919192 0.727885 0.505051 0.929293 0.730334 0.505051 0.939394 0.732782 0.505051 0.949495 0.735231 0.505051 0.959596 0.737680 0.505051 0.969697 0.740129 0.505051 0.979798 0.742577 0.505051 0.989899 0.745026 0.505051 1.000000 0.747475 0.515152 0.000000 0.515152 0.515152 0.010101 0.517447 0.515152 0.020202 0.519743 0.515152 0.030303 0.522039 0.515152 0.040404 0.524334 0.515152 0.050505 0.526630 0.515152 0.060606 0.528926 0.515152 0.070707 0.531221 0.515152 0.080808 0.533517 0.515152 0.090909 0.535813 0.515152 0.101010 0.538108 0.515152 0.111111 0.540404 0.515152 0.121212 0.542700 0.515152 0.131313 0.544995 0.515152 0.141414 0.547291 0.515152 0.151515 0.549587 0.515152 0.161616 0.551882 0.515152 0.171717 0.554178 0.515152 0.181818 0.556474 0.515152 0.191919 0.558770 0.515152 0.202020 0.561065 0.515152 0.212121 0.563361 0.515152 0.222222 0.565657 0.515152 0.232323 0.567952 0.515152 0.242424 0.570248 0.515152 0.252525 0.572544 0.515152 0.262626 0.574839 0.515152 0.272727 0.577135 0.515152 0.282828 0.579431 0.515152 0.292929 0.581726 0.515152 0.303030 0.584022 0.515152 0.313131 0.586318 0.515152 0.323232 0.588613 0.515152 0.333333 0.590909 0.515152 0.343434 0.593205 0.515152 0.353535 0.595500 0.515152 0.363636 0.597796 0.515152 0.373737 0.600092 0.515152 0.383838 0.602388 0.515152 0.393939 0.604683 0.515152 0.404040 0.606979 0.515152 0.414141 0.609275 0.515152 0.424242 0.611570 0.515152 0.434343 0.613866 0.515152 0.444444 0.616162 0.515152 0.454545 0.618457 0.515152 0.464646 0.620753 0.515152 0.474747 0.623049 0.515152 0.484848 0.625344 0.515152 0.494949 0.627640 0.515152 0.505051 0.629936 0.515152 0.515152 0.632231 0.515152 0.525253 0.634527 0.515152 0.535354 0.636823 0.515152 0.545455 0.639118 0.515152 0.555556 0.641414 0.515152 0.565657 0.643710 0.515152 0.575758 0.646006 0.515152 0.585859 0.648301 0.515152 0.595960 0.650597 0.515152 0.606061 0.652893 0.515152 0.616162 0.655188 0.515152 0.626263 0.657484 0.515152 0.636364 0.659780 0.515152 0.646465 0.662075 0.515152 0.656566 0.664371 0.515152 0.666667 0.666667 0.515152 0.676768 0.668962 0.515152 0.686869 0.671258 0.515152 0.696970 0.673554 0.515152 0.707071 0.675849 0.515152 0.717172 0.678145 0.515152 0.727273 0.680441 0.515152 0.737374 0.682736 0.515152 0.747475 0.685032 0.515152 0.757576 0.687328 0.515152 0.767677 0.689624 0.515152 0.777778 0.691919 0.515152 0.787879 0.694215 0.515152 0.797980 0.696511 0.515152 0.808081 0.698806 0.515152 0.818182 0.701102 0.515152 0.828283 0.703398 0.515152 0.838384 0.705693 0.515152 0.848485 0.707989 0.515152 0.858586 0.710285 0.515152 0.868687 0.712580 0.515152 0.878788 0.714876 0.515152 0.888889 0.717172 0.515152 0.898990 0.719467 0.515152 0.909091 0.721763 0.515152 0.919192 0.724059 0.515152 0.929293 0.726354 0.515152 0.939394 0.728650 0.515152 0.949495 0.730946 0.515152 0.959596 0.733242 0.515152 0.969697 0.735537 0.515152 0.979798 0.737833 0.515152 0.989899 0.740129 0.515152 1.000000 0.742424 0.525253 0.000000 0.525253 0.525253 0.010101 0.527395 0.525253 0.020202 0.529538 0.525253 0.030303 0.531680 0.525253 0.040404 0.533823 0.525253 0.050505 0.535966 0.525253 0.060606 0.538108 0.525253 0.070707 0.540251 0.525253 0.080808 0.542394 0.525253 0.090909 0.544536 0.525253 0.101010 0.546679 0.525253 0.111111 0.548822 0.525253 0.121212 0.550964 0.525253 0.131313 0.553107 0.525253 0.141414 0.555249 0.525253 0.151515 0.557392 0.525253 0.161616 0.559535 0.525253 0.171717 0.561677 0.525253 0.181818 0.563820 0.525253 0.191919 0.565963 0.525253 0.202020 0.568105 0.525253 0.212121 0.570248 0.525253 0.222222 0.572391 0.525253 0.232323 0.574533 0.525253 0.242424 0.576676 0.525253 0.252525 0.578818 0.525253 0.262626 0.580961 0.525253 0.272727 0.583104 0.525253 0.282828 0.585246 0.525253 0.292929 0.587389 0.525253 0.303030 0.589532 0.525253 0.313131 0.591674 0.525253 0.323232 0.593817 0.525253 0.333333 0.595960 0.525253 0.343434 0.598102 0.525253 0.353535 0.600245 0.525253 0.363636 0.602388 0.525253 0.373737 0.604530 0.525253 0.383838 0.606673 0.525253 0.393939 0.608815 0.525253 0.404040 0.610958 0.525253 0.414141 0.613101 0.525253 0.424242 0.615243 0.525253 0.434343 0.617386 0.525253 0.444444 0.619529 0.525253 0.454545 0.621671 0.525253 0.464646 0.623814 0.525253 0.474747 0.625957 0.525253 0.484848 0.628099 0.525253 0.494949 0.630242 0.525253 0.505051 0.632384 0.525253 0.515152 0.634527 0.525253 0.525253 0.636670 0.525253 0.535354 0.638812 0.525253 0.545455 0.640955 0.525253 0.555556 0.643098 0.525253 0.565657 0.645240 0.525253 0.575758 0.647383 0.525253 0.585859 0.649526 0.525253 0.595960 0.651668 0.525253 0.606061 0.653811 0.525253 0.616162 0.655953 0.525253 0.626263 0.658096 0.525253 0.636364 0.660239 0.525253 0.646465 0.662381 0.525253 0.656566 0.664524 0.525253 0.666667 0.666667 0.525253 0.676768 0.668809 0.525253 0.686869 0.670952 0.525253 0.696970 0.673095 0.525253 0.707071 0.675237 0.525253 0.717172 0.677380 0.525253 0.727273 0.679522 0.525253 0.737374 0.681665 0.525253 0.747475 0.683808 0.525253 0.757576 0.685950 0.525253 0.767677 0.688093 0.525253 0.777778 0.690236 0.525253 0.787879 0.692378 0.525253 0.797980 0.694521 0.525253 0.808081 0.696664 0.525253 0.818182 0.698806 0.525253 0.828283 0.700949 0.525253 0.838384 0.703092 0.525253 0.848485 0.705234 0.525253 0.858586 0.707377 0.525253 0.868687 0.709519 0.525253 0.878788 0.711662 0.525253 0.888889 0.713805 0.525253 0.898990 0.715947 0.525253 0.909091 0.718090 0.525253 0.919192 0.720233 0.525253 0.929293 0.722375 0.525253 0.939394 0.724518 0.525253 0.949495 0.726661 0.525253 0.959596 0.728803 0.525253 0.969697 0.730946 0.525253 0.979798 0.733088 0.525253 0.989899 0.735231 0.525253 1.000000 0.737374 0.535354 0.000000 0.535354 0.535354 0.010101 0.537343 0.535354 0.020202 0.539333 0.535354 0.030303 0.541322 0.535354 0.040404 0.543312 0.535354 0.050505 0.545301 0.535354 0.060606 0.547291 0.535354 0.070707 0.549281 0.535354 0.080808 0.551270 0.535354 0.090909 0.553260 0.535354 0.101010 0.555249 0.535354 0.111111 0.557239 0.535354 0.121212 0.559229 0.535354 0.131313 0.561218 0.535354 0.141414 0.563208 0.535354 0.151515 0.565197 0.535354 0.161616 0.567187 0.535354 0.171717 0.569177 0.535354 0.181818 0.571166 0.535354 0.191919 0.573156 0.535354 0.202020 0.575145 0.535354 0.212121 0.577135 0.535354 0.222222 0.579125 0.535354 0.232323 0.581114 0.535354 0.242424 0.583104 0.535354 0.252525 0.585093 0.535354 0.262626 0.587083 0.535354 0.272727 0.589073 0.535354 0.282828 0.591062 0.535354 0.292929 0.593052 0.535354 0.303030 0.595041 0.535354 0.313131 0.597031 0.535354 0.323232 0.599021 0.535354 0.333333 0.601010 0.535354 0.343434 0.603000 0.535354 0.353535 0.604989 0.535354 0.363636 0.606979 0.535354 0.373737 0.608968 0.535354 0.383838 0.610958 0.535354 0.393939 0.612948 0.535354 0.404040 0.614937 0.535354 0.414141 0.616927 0.535354 0.424242 0.618916 0.535354 0.434343 0.620906 0.535354 0.444444 0.622896 0.535354 0.454545 0.624885 0.535354 0.464646 0.626875 0.535354 0.474747 0.628864 0.535354 0.484848 0.630854 0.535354 0.494949 0.632844 0.535354 0.505051 0.634833 0.535354 0.515152 0.636823 0.535354 0.525253 0.638812 0.535354 0.535354 0.640802 0.535354 0.545455 0.642792 0.535354 0.555556 0.644781 0.535354 0.565657 0.646771 0.535354 0.575758 0.648760 0.535354 0.585859 0.650750 0.535354 0.595960 0.652740 0.535354 0.606061 0.654729 0.535354 0.616162 0.656719 0.535354 0.626263 0.658708 0.535354 0.636364 0.660698 0.535354 0.646465 0.662687 0.535354 0.656566 0.664677 0.535354 0.666667 0.666667 0.535354 0.676768 0.668656 0.535354 0.686869 0.670646 0.535354 0.696970 0.672635 0.535354 0.707071 0.674625 0.535354 0.717172 0.676615 0.535354 0.727273 0.678604 0.535354 0.737374 0.680594 0.535354 0.747475 0.682583 0.535354 0.757576 0.684573 0.535354 0.767677 0.686563 0.535354 0.777778 0.688552 0.535354 0.787879 0.690542 0.535354 0.797980 0.692531 0.535354 0.808081 0.694521 0.535354 0.818182 0.696511 0.535354 0.828283 0.698500 0.535354 0.838384 0.700490 0.535354 0.848485 0.702479 0.535354 0.858586 0.704469 0.535354 0.868687 0.706459 0.535354 0.878788 0.708448 0.535354 0.888889 0.710438 0.535354 0.898990 0.712427 0.535354 0.909091 0.714417 0.535354 0.919192 0.716406 0.535354 0.929293 0.718396 0.535354 0.939394 0.720386 0.535354 0.949495 0.722375 0.535354 0.959596 0.724365 0.535354 0.969697 0.726354 0.535354 0.979798 0.728344 0.535354 0.989899 0.730334 0.535354 1.000000 0.732323 0.545455 0.000000 0.545455 0.545455 0.010101 0.547291 0.545455 0.020202 0.549128 0.545455 0.030303 0.550964 0.545455 0.040404 0.552801 0.545455 0.050505 0.554637 0.545455 0.060606 0.556474 0.545455 0.070707 0.558310 0.545455 0.080808 0.560147 0.545455 0.090909 0.561983 0.545455 0.101010 0.563820 0.545455 0.111111 0.565657 0.545455 0.121212 0.567493 0.545455 0.131313 0.569330 0.545455 0.141414 0.571166 0.545455 0.151515 0.573003 0.545455 0.161616 0.574839 0.545455 0.171717 0.576676 0.545455 0.181818 0.578512 0.545455 0.191919 0.580349 0.545455 0.202020 0.582185 0.545455 0.212121 0.584022 0.545455 0.222222 0.585859 0.545455 0.232323 0.587695 0.545455 0.242424 0.589532 0.545455 0.252525 0.591368 0.545455 0.262626 0.593205 0.545455 0.272727 0.595041 0.545455 0.282828 0.596878 0.545455 0.292929 0.598714 0.545455 0.303030 0.600551 0.545455 0.313131 0.602388 0.545455 0.323232 0.604224 0.545455 0.333333 0.606061 0.545455 0.343434 0.607897 0.545455 0.353535 0.609734 0.545455 0.363636 0.611570 0.545455 0.373737 0.613407 0.545455 0.383838 0.615243 0.545455 0.393939 0.617080 0.545455 0.404040 0.618916 0.545455 0.414141 0.620753 0.545455 0.424242 0.622590 0.545455 0.434343 0.624426 0.545455 0.444444 0.626263 0.545455 0.454545 0.628099 0.545455 0.464646 0.629936 0.545455 0.474747 0.631772 0.545455 0.484848 0.633609 0.545455 0.494949 0.635445 0.545455 0.505051 0.637282 0.545455 0.515152 0.639118 0.545455 0.525253 0.640955 0.545455 0.535354 0.642792 0.545455 0.545455 0.644628 0.545455 0.555556 0.646465 0.545455 0.565657 0.648301 0.545455 0.575758 0.650138 0.545455 0.585859 0.651974 0.545455 0.595960 0.653811 0.545455 0.606061 0.655647 0.545455 0.616162 0.657484 0.545455 0.626263 0.659320 0.545455 0.636364 0.661157 0.545455 0.646465 0.662994 0.545455 0.656566 0.664830 0.545455 0.666667 0.666667 0.545455 0.676768 0.668503 0.545455 0.686869 0.670340 0.545455 0.696970 0.672176 0.545455 0.707071 0.674013 0.545455 0.717172 0.675849 0.545455 0.727273 0.677686 0.545455 0.737374 0.679522 0.545455 0.747475 0.681359 0.545455 0.757576 0.683196 0.545455 0.767677 0.685032 0.545455 0.777778 0.686869 0.545455 0.787879 0.688705 0.545455 0.797980 0.690542 0.545455 0.808081 0.692378 0.545455 0.818182 0.694215 0.545455 0.828283 0.696051 0.545455 0.838384 0.697888 0.545455 0.848485 0.699725 0.545455 0.858586 0.701561 0.545455 0.868687 0.703398 0.545455 0.878788 0.705234 0.545455 0.888889 0.707071 0.545455 0.898990 0.708907 0.545455 0.909091 0.710744 0.545455 0.919192 0.712580 0.545455 0.929293 0.714417 0.545455 0.939394 0.716253 0.545455 0.949495 0.718090 0.545455 0.959596 0.719927 0.545455 0.969697 0.721763 0.545455 0.979798 0.723600 0.545455 0.989899 0.725436 0.545455 1.000000 0.727273 0.555556 0.000000 0.555556 0.555556 0.010101 0.557239 0.555556 0.020202 0.558923 0.555556 0.030303 0.560606 0.555556 0.040404 0.562290 0.555556 0.050505 0.563973 0.555556 0.060606 0.565657 0.555556 0.070707 0.567340 0.555556 0.080808 0.569024 0.555556 0.090909 0.570707 0.555556 0.101010 0.572391 0.555556 0.111111 0.574074 0.555556 0.121212 0.575758 0.555556 0.131313 0.577441 0.555556 0.141414 0.579125 0.555556 0.151515 0.580808 0.555556 0.161616 0.582492 0.555556 0.171717 0.584175 0.555556 0.181818 0.585859 0.555556 0.191919 0.587542 0.555556 0.202020 0.589226 0.555556 0.212121 0.590909 0.555556 0.222222 0.592593 0.555556 0.232323 0.594276 0.555556 0.242424 0.595960 0.555556 0.252525 0.597643 0.555556 0.262626 0.599327 0.555556 0.272727 0.601010 0.555556 0.282828 0.602694 0.555556 0.292929 0.604377 0.555556 0.303030 0.606061 0.555556 0.313131 0.607744 0.555556 0.323232 0.609428 0.555556 0.333333 0.611111 0.555556 0.343434 0.612795 0.555556 0.353535 0.614478 0.555556 0.363636 0.616162 0.555556 0.373737 0.617845 0.555556 0.383838 0.619529 0.555556 0.393939 0.621212 0.555556 0.404040 0.622896 0.555556 0.414141 0.624579 0.555556 0.424242 0.626263 0.555556 0.434343 0.627946 0.555556 0.444444 0.629630 0.555556 0.454545 0.631313 0.555556 0.464646 0.632997 0.555556 0.474747 0.634680 0.555556 0.484848 0.636364 0.555556 0.494949 0.638047 0.555556 0.505051 0.639731 0.555556 0.515152 0.641414 0.555556 0.525253 0.643098 0.555556 0.535354 0.644781 0.555556 0.545455 0.646465 0.555556 0.555556 0.648148 0.555556 0.565657 0.649832 0.555556 0.575758 0.651515 0.555556 0.585859 0.653199 0.555556 0.595960 0.654882 0.555556 0.606061 0.656566 0.555556 0.616162 0.658249 0.555556 0.626263 0.659933 0.555556 0.636364 0.661616 0.555556 0.646465 0.663300 0.555556 0.656566 0.664983 0.555556 0.666667 0.666667 0.555556 0.676768 0.668350 0.555556 0.686869 0.670034 0.555556 0.696970 0.671717 0.555556 0.707071 0.673401 0.555556 0.717172 0.675084 0.555556 0.727273 0.676768 0.555556 0.737374 0.678451 0.555556 0.747475 0.680135 0.555556 0.757576 0.681818 0.555556 0.767677 0.683502 0.555556 0.777778 0.685185 0.555556 0.787879 0.686869 0.555556 0.797980 0.688552 0.555556 0.808081 0.690236 0.555556 0.818182 0.691919 0.555556 0.828283 0.693603 0.555556 0.838384 0.695286 0.555556 0.848485 0.696970 0.555556 0.858586 0.698653 0.555556 0.868687 0.700337 0.555556 0.878788 0.702020 0.555556 0.888889 0.703704 0.555556 0.898990 0.705387 0.555556 0.909091 0.707071 0.555556 0.919192 0.708754 0.555556 0.929293 0.710438 0.555556 0.939394 0.712121 0.555556 0.949495 0.713805 0.555556 0.959596 0.715488 0.555556 0.969697 0.717172 0.555556 0.979798 0.718855 0.555556 0.989899 0.720539 0.555556 1.000000 0.722222 0.565657 0.000000 0.565657 0.565657 0.010101 0.567187 0.565657 0.020202 0.568717 0.565657 0.030303 0.570248 0.565657 0.040404 0.571778 0.565657 0.050505 0.573309 0.565657 0.060606 0.574839 0.565657 0.070707 0.576370 0.565657 0.080808 0.577900 0.565657 0.090909 0.579431 0.565657 0.101010 0.580961 0.565657 0.111111 0.582492 0.565657 0.121212 0.584022 0.565657 0.131313 0.585552 0.565657 0.141414 0.587083 0.565657 0.151515 0.588613 0.565657 0.161616 0.590144 0.565657 0.171717 0.591674 0.565657 0.181818 0.593205 0.565657 0.191919 0.594735 0.565657 0.202020 0.596266 0.565657 0.212121 0.597796 0.565657 0.222222 0.599327 0.565657 0.232323 0.600857 0.565657 0.242424 0.602388 0.565657 0.252525 0.603918 0.565657 0.262626 0.605448 0.565657 0.272727 0.606979 0.565657 0.282828 0.608509 0.565657 0.292929 0.610040 0.565657 0.303030 0.611570 0.565657 0.313131 0.613101 0.565657 0.323232 0.614631 0.565657 0.333333 0.616162 0.565657 0.343434 0.617692 0.565657 0.353535 0.619223 0.565657 0.363636 0.620753 0.565657 0.373737 0.622283 0.565657 0.383838 0.623814 0.565657 0.393939 0.625344 0.565657 0.404040 0.626875 0.565657 0.414141 0.628405 0.565657 0.424242 0.629936 0.565657 0.434343 0.631466 0.565657 0.444444 0.632997 0.565657 0.454545 0.634527 0.565657 0.464646 0.636058 0.565657 0.474747 0.637588 0.565657 0.484848 0.639118 0.565657 0.494949 0.640649 0.565657 0.505051 0.642179 0.565657 0.515152 0.643710 0.565657 0.525253 0.645240 0.565657 0.535354 0.646771 0.565657 0.545455 0.648301 0.565657 0.555556 0.649832 0.565657 0.565657 0.651362 0.565657 0.575758 0.652893 0.565657 0.585859 0.654423 0.565657 0.595960 0.655953 0.565657 0.606061 0.657484 0.565657 0.616162 0.659014 0.565657 0.626263 0.660545 0.565657 0.636364 0.662075 0.565657 0.646465 0.663606 0.565657 0.656566 0.665136 0.565657 0.666667 0.666667 0.565657 0.676768 0.668197 0.565657 0.686869 0.669728 0.565657 0.696970 0.671258 0.565657 0.707071 0.672788 0.565657 0.717172 0.674319 0.565657 0.727273 0.675849 0.565657 0.737374 0.677380 0.565657 0.747475 0.678910 0.565657 0.757576 0.680441 0.565657 0.767677 0.681971 0.565657 0.777778 0.683502 0.565657 0.787879 0.685032 0.565657 0.797980 0.686563 0.565657 0.808081 0.688093 0.565657 0.818182 0.689624 0.565657 0.828283 0.691154 0.565657 0.838384 0.692684 0.565657 0.848485 0.694215 0.565657 0.858586 0.695745 0.565657 0.868687 0.697276 0.565657 0.878788 0.698806 0.565657 0.888889 0.700337 0.565657 0.898990 0.701867 0.565657 0.909091 0.703398 0.565657 0.919192 0.704928 0.565657 0.929293 0.706459 0.565657 0.939394 0.707989 0.565657 0.949495 0.709519 0.565657 0.959596 0.711050 0.565657 0.969697 0.712580 0.565657 0.979798 0.714111 0.565657 0.989899 0.715641 0.565657 1.000000 0.717172 0.575758 0.000000 0.575758 0.575758 0.010101 0.577135 0.575758 0.020202 0.578512 0.575758 0.030303 0.579890 0.575758 0.040404 0.581267 0.575758 0.050505 0.582645 0.575758 0.060606 0.584022 0.575758 0.070707 0.585399 0.575758 0.080808 0.586777 0.575758 0.090909 0.588154 0.575758 0.101010 0.589532 0.575758 0.111111 0.590909 0.575758 0.121212 0.592287 0.575758 0.131313 0.593664 0.575758 0.141414 0.595041 0.575758 0.151515 0.596419 0.575758 0.161616 0.597796 0.575758 0.171717 0.599174 0.575758 0.181818 0.600551 0.575758 0.191919 0.601928 0.575758 0.202020 0.603306 0.575758 0.212121 0.604683 0.575758 0.222222 0.606061 0.575758 0.232323 0.607438 0.575758 0.242424 0.608815 0.575758 0.252525 0.610193 0.575758 0.262626 0.611570 0.575758 0.272727 0.612948 0.575758 0.282828 0.614325 0.575758 0.292929 0.615702 0.575758 0.303030 0.617080 0.575758 0.313131 0.618457 0.575758 0.323232 0.619835 0.575758 0.333333 0.621212 0.575758 0.343434 0.622590 0.575758 0.353535 0.623967 0.575758 0.363636 0.625344 0.575758 0.373737 0.626722 0.575758 0.383838 0.628099 0.575758 0.393939 0.629477 0.575758 0.404040 0.630854 0.575758 0.414141 0.632231 0.575758 0.424242 0.633609 0.575758 0.434343 0.634986 0.575758 0.444444 0.636364 0.575758 0.454545 0.637741 0.575758 0.464646 0.639118 0.575758 0.474747 0.640496 0.575758 0.484848 0.641873 0.575758 0.494949 0.643251 0.575758 0.505051 0.644628 0.575758 0.515152 0.646006 0.575758 0.525253 0.647383 0.575758 0.535354 0.648760 0.575758 0.545455 0.650138 0.575758 0.555556 0.651515 0.575758 0.565657 0.652893 0.575758 0.575758 0.654270 0.575758 0.585859 0.655647 0.575758 0.595960 0.657025 0.575758 0.606061 0.658402 0.575758 0.616162 0.659780 0.575758 0.626263 0.661157 0.575758 0.636364 0.662534 0.575758 0.646465 0.663912 0.575758 0.656566 0.665289 0.575758 0.666667 0.666667 0.575758 0.676768 0.668044 0.575758 0.686869 0.669421 0.575758 0.696970 0.670799 0.575758 0.707071 0.672176 0.575758 0.717172 0.673554 0.575758 0.727273 0.674931 0.575758 0.737374 0.676309 0.575758 0.747475 0.677686 0.575758 0.757576 0.679063 0.575758 0.767677 0.680441 0.575758 0.777778 0.681818 0.575758 0.787879 0.683196 0.575758 0.797980 0.684573 0.575758 0.808081 0.685950 0.575758 0.818182 0.687328 0.575758 0.828283 0.688705 0.575758 0.838384 0.690083 0.575758 0.848485 0.691460 0.575758 0.858586 0.692837 0.575758 0.868687 0.694215 0.575758 0.878788 0.695592 0.575758 0.888889 0.696970 0.575758 0.898990 0.698347 0.575758 0.909091 0.699725 0.575758 0.919192 0.701102 0.575758 0.929293 0.702479 0.575758 0.939394 0.703857 0.575758 0.949495 0.705234 0.575758 0.959596 0.706612 0.575758 0.969697 0.707989 0.575758 0.979798 0.709366 0.575758 0.989899 0.710744 0.575758 1.000000 0.712121 0.585859 0.000000 0.585859 0.585859 0.010101 0.587083 0.585859 0.020202 0.588307 0.585859 0.030303 0.589532 0.585859 0.040404 0.590756 0.585859 0.050505 0.591980 0.585859 0.060606 0.593205 0.585859 0.070707 0.594429 0.585859 0.080808 0.595654 0.585859 0.090909 0.596878 0.585859 0.101010 0.598102 0.585859 0.111111 0.599327 0.585859 0.121212 0.600551 0.585859 0.131313 0.601775 0.585859 0.141414 0.603000 0.585859 0.151515 0.604224 0.585859 0.161616 0.605448 0.585859 0.171717 0.606673 0.585859 0.181818 0.607897 0.585859 0.191919 0.609122 0.585859 0.202020 0.610346 0.585859 0.212121 0.611570 0.585859 0.222222 0.612795 0.585859 0.232323 0.614019 0.585859 0.242424 0.615243 0.585859 0.252525 0.616468 0.585859 0.262626 0.617692 0.585859 0.272727 0.618916 0.585859 0.282828 0.620141 0.585859 0.292929 0.621365 0.585859 0.303030 0.622590 0.585859 0.313131 0.623814 0.585859 0.323232 0.625038 0.585859 0.333333 0.626263 0.585859 0.343434 0.627487 0.585859 0.353535 0.628711 0.585859 0.363636 0.629936 0.585859 0.373737 0.631160 0.585859 0.383838 0.632384 0.585859 0.393939 0.633609 0.585859 0.404040 0.634833 0.585859 0.414141 0.636058 0.585859 0.424242 0.637282 0.585859 0.434343 0.638506 0.585859 0.444444 0.639731 0.585859 0.454545 0.640955 0.585859 0.464646 0.642179 0.585859 0.474747 0.643404 0.585859 0.484848 0.644628 0.585859 0.494949 0.645852 0.585859 0.505051 0.647077 0.585859 0.515152 0.648301 0.585859 0.525253 0.649526 0.585859 0.535354 0.650750 0.585859 0.545455 0.651974 0.585859 0.555556 0.653199 0.585859 0.565657 0.654423 0.585859 0.575758 0.655647 0.585859 0.585859 0.656872 0.585859 0.595960 0.658096 0.585859 0.606061 0.659320 0.585859 0.616162 0.660545 0.585859 0.626263 0.661769 0.585859 0.636364 0.662994 0.585859 0.646465 0.664218 0.585859 0.656566 0.665442 0.585859 0.666667 0.666667 0.585859 0.676768 0.667891 0.585859 0.686869 0.669115 0.585859 0.696970 0.670340 0.585859 0.707071 0.671564 0.585859 0.717172 0.672788 0.585859 0.727273 0.674013 0.585859 0.737374 0.675237 0.585859 0.747475 0.676462 0.585859 0.757576 0.677686 0.585859 0.767677 0.678910 0.585859 0.777778 0.680135 0.585859 0.787879 0.681359 0.585859 0.797980 0.682583 0.585859 0.808081 0.683808 0.585859 0.818182 0.685032 0.585859 0.828283 0.686257 0.585859 0.838384 0.687481 0.585859 0.848485 0.688705 0.585859 0.858586 0.689930 0.585859 0.868687 0.691154 0.585859 0.878788 0.692378 0.585859 0.888889 0.693603 0.585859 0.898990 0.694827 0.585859 0.909091 0.696051 0.585859 0.919192 0.697276 0.585859 0.929293 0.698500 0.585859 0.939394 0.699725 0.585859 0.949495 0.700949 0.585859 0.959596 0.702173 0.585859 0.969697 0.703398 0.585859 0.979798 0.704622 0.585859 0.989899 0.705846 0.585859 1.000000 0.707071 0.595960 0.000000 0.595960 0.595960 0.010101 0.597031 0.595960 0.020202 0.598102 0.595960 0.030303 0.599174 0.595960 0.040404 0.600245 0.595960 0.050505 0.601316 0.595960 0.060606 0.602388 0.595960 0.070707 0.603459 0.595960 0.080808 0.604530 0.595960 0.090909 0.605601 0.595960 0.101010 0.606673 0.595960 0.111111 0.607744 0.595960 0.121212 0.608815 0.595960 0.131313 0.609887 0.595960 0.141414 0.610958 0.595960 0.151515 0.612029 0.595960 0.161616 0.613101 0.595960 0.171717 0.614172 0.595960 0.181818 0.615243 0.595960 0.191919 0.616315 0.595960 0.202020 0.617386 0.595960 0.212121 0.618457 0.595960 0.222222 0.619529 0.595960 0.232323 0.620600 0.595960 0.242424 0.621671 0.595960 0.252525 0.622743 0.595960 0.262626 0.623814 0.595960 0.272727 0.624885 0.595960 0.282828 0.625957 0.595960 0.292929 0.627028 0.595960 0.303030 0.628099 0.595960 0.313131 0.629170 0.595960 0.323232 0.630242 0.595960 0.333333 0.631313 0.595960 0.343434 0.632384 0.595960 0.353535 0.633456 0.595960 0.363636 0.634527 0.595960 0.373737 0.635598 0.595960 0.383838 0.636670 0.595960 0.393939 0.637741 0.595960 0.404040 0.638812 0.595960 0.414141 0.639884 0.595960 0.424242 0.640955 0.595960 0.434343 0.642026 0.595960 0.444444 0.643098 0.595960 0.454545 0.644169 0.595960 0.464646 0.645240 0.595960 0.474747 0.646312 0.595960 0.484848 0.647383 0.595960 0.494949 0.648454 0.595960 0.505051 0.649526 0.595960 0.515152 0.650597 0.595960 0.525253 0.651668 0.595960 0.535354 0.652740 0.595960 0.545455 0.653811 0.595960 0.555556 0.654882 0.595960 0.565657 0.655953 0.595960 0.575758 0.657025 0.595960 0.585859 0.658096 0.595960 0.595960 0.659167 0.595960 0.606061 0.660239 0.595960 0.616162 0.661310 0.595960 0.626263 0.662381 0.595960 0.636364 0.663453 0.595960 0.646465 0.664524 0.595960 0.656566 0.665595 0.595960 0.666667 0.666667 0.595960 0.676768 0.667738 0.595960 0.686869 0.668809 0.595960 0.696970 0.669881 0.595960 0.707071 0.670952 0.595960 0.717172 0.672023 0.595960 0.727273 0.673095 0.595960 0.737374 0.674166 0.595960 0.747475 0.675237 0.595960 0.757576 0.676309 0.595960 0.767677 0.677380 0.595960 0.777778 0.678451 0.595960 0.787879 0.679522 0.595960 0.797980 0.680594 0.595960 0.808081 0.681665 0.595960 0.818182 0.682736 0.595960 0.828283 0.683808 0.595960 0.838384 0.684879 0.595960 0.848485 0.685950 0.595960 0.858586 0.687022 0.595960 0.868687 0.688093 0.595960 0.878788 0.689164 0.595960 0.888889 0.690236 0.595960 0.898990 0.691307 0.595960 0.909091 0.692378 0.595960 0.919192 0.693450 0.595960 0.929293 0.694521 0.595960 0.939394 0.695592 0.595960 0.949495 0.696664 0.595960 0.959596 0.697735 0.595960 0.969697 0.698806 0.595960 0.979798 0.699878 0.595960 0.989899 0.700949 0.595960 1.000000 0.702020 0.606061 0.000000 0.606061 0.606061 0.010101 0.606979 0.606061 0.020202 0.607897 0.606061 0.030303 0.608815 0.606061 0.040404 0.609734 0.606061 0.050505 0.610652 0.606061 0.060606 0.611570 0.606061 0.070707 0.612489 0.606061 0.080808 0.613407 0.606061 0.090909 0.614325 0.606061 0.101010 0.615243 0.606061 0.111111 0.616162 0.606061 0.121212 0.617080 0.606061 0.131313 0.617998 0.606061 0.141414 0.618916 0.606061 0.151515 0.619835 0.606061 0.161616 0.620753 0.606061 0.171717 0.621671 0.606061 0.181818 0.622590 0.606061 0.191919 0.623508 0.606061 0.202020 0.624426 0.606061 0.212121 0.625344 0.606061 0.222222 0.626263 0.606061 0.232323 0.627181 0.606061 0.242424 0.628099 0.606061 0.252525 0.629017 0.606061 0.262626 0.629936 0.606061 0.272727 0.630854 0.606061 0.282828 0.631772 0.606061 0.292929 0.632691 0.606061 0.303030 0.633609 0.606061 0.313131 0.634527 0.606061 0.323232 0.635445 0.606061 0.333333 0.636364 0.606061 0.343434 0.637282 0.606061 0.353535 0.638200 0.606061 0.363636 0.639118 0.606061 0.373737 0.640037 0.606061 0.383838 0.640955 0.606061 0.393939 0.641873 0.606061 0.404040 0.642792 0.606061 0.414141 0.643710 0.606061 0.424242 0.644628 0.606061 0.434343 0.645546 0.606061 0.444444 0.646465 0.606061 0.454545 0.647383 0.606061 0.464646 0.648301 0.606061 0.474747 0.649219 0.606061 0.484848 0.650138 0.606061 0.494949 0.651056 0.606061 0.505051 0.651974 0.606061 0.515152 0.652893 0.606061 0.525253 0.653811 0.606061 0.535354 0.654729 0.606061 0.545455 0.655647 0.606061 0.555556 0.656566 0.606061 0.565657 0.657484 0.606061 0.575758 0.658402 0.606061 0.585859 0.659320 0.606061 0.595960 0.660239 0.606061 0.606061 0.661157 0.606061 0.616162 0.662075 0.606061 0.626263 0.662994 0.606061 0.636364 0.663912 0.606061 0.646465 0.664830 0.606061 0.656566 0.665748 0.606061 0.666667 0.666667 0.606061 0.676768 0.667585 0.606061 0.686869 0.668503 0.606061 0.696970 0.669421 0.606061 0.707071 0.670340 0.606061 0.717172 0.671258 0.606061 0.727273 0.672176 0.606061 0.737374 0.673095 0.606061 0.747475 0.674013 0.606061 0.757576 0.674931 0.606061 0.767677 0.675849 0.606061 0.777778 0.676768 0.606061 0.787879 0.677686 0.606061 0.797980 0.678604 0.606061 0.808081 0.679522 0.606061 0.818182 0.680441 0.606061 0.828283 0.681359 0.606061 0.838384 0.682277 0.606061 0.848485 0.683196 0.606061 0.858586 0.684114 0.606061 0.868687 0.685032 0.606061 0.878788 0.685950 0.606061 0.888889 0.686869 0.606061 0.898990 0.687787 0.606061 0.909091 0.688705 0.606061 0.919192 0.689624 0.606061 0.929293 0.690542 0.606061 0.939394 0.691460 0.606061 0.949495 0.692378 0.606061 0.959596 0.693297 0.606061 0.969697 0.694215 0.606061 0.979798 0.695133 0.606061 0.989899 0.696051 0.606061 1.000000 0.696970 0.616162 0.000000 0.616162 0.616162 0.010101 0.616927 0.616162 0.020202 0.617692 0.616162 0.030303 0.618457 0.616162 0.040404 0.619223 0.616162 0.050505 0.619988 0.616162 0.060606 0.620753 0.616162 0.070707 0.621518 0.616162 0.080808 0.622283 0.616162 0.090909 0.623049 0.616162 0.101010 0.623814 0.616162 0.111111 0.624579 0.616162 0.121212 0.625344 0.616162 0.131313 0.626110 0.616162 0.141414 0.626875 0.616162 0.151515 0.627640 0.616162 0.161616 0.628405 0.616162 0.171717 0.629170 0.616162 0.181818 0.629936 0.616162 0.191919 0.630701 0.616162 0.202020 0.631466 0.616162 0.212121 0.632231 0.616162 0.222222 0.632997 0.616162 0.232323 0.633762 0.616162 0.242424 0.634527 0.616162 0.252525 0.635292 0.616162 0.262626 0.636058 0.616162 0.272727 0.636823 0.616162 0.282828 0.637588 0.616162 0.292929 0.638353 0.616162 0.303030 0.639118 0.616162 0.313131 0.639884 0.616162 0.323232 0.640649 0.616162 0.333333 0.641414 0.616162 0.343434 0.642179 0.616162 0.353535 0.642945 0.616162 0.363636 0.643710 0.616162 0.373737 0.644475 0.616162 0.383838 0.645240 0.616162 0.393939 0.646006 0.616162 0.404040 0.646771 0.616162 0.414141 0.647536 0.616162 0.424242 0.648301 0.616162 0.434343 0.649066 0.616162 0.444444 0.649832 0.616162 0.454545 0.650597 0.616162 0.464646 0.651362 0.616162 0.474747 0.652127 0.616162 0.484848 0.652893 0.616162 0.494949 0.653658 0.616162 0.505051 0.654423 0.616162 0.515152 0.655188 0.616162 0.525253 0.655953 0.616162 0.535354 0.656719 0.616162 0.545455 0.657484 0.616162 0.555556 0.658249 0.616162 0.565657 0.659014 0.616162 0.575758 0.659780 0.616162 0.585859 0.660545 0.616162 0.595960 0.661310 0.616162 0.606061 0.662075 0.616162 0.616162 0.662841 0.616162 0.626263 0.663606 0.616162 0.636364 0.664371 0.616162 0.646465 0.665136 0.616162 0.656566 0.665901 0.616162 0.666667 0.666667 0.616162 0.676768 0.667432 0.616162 0.686869 0.668197 0.616162 0.696970 0.668962 0.616162 0.707071 0.669728 0.616162 0.717172 0.670493 0.616162 0.727273 0.671258 0.616162 0.737374 0.672023 0.616162 0.747475 0.672788 0.616162 0.757576 0.673554 0.616162 0.767677 0.674319 0.616162 0.777778 0.675084 0.616162 0.787879 0.675849 0.616162 0.797980 0.676615 0.616162 0.808081 0.677380 0.616162 0.818182 0.678145 0.616162 0.828283 0.678910 0.616162 0.838384 0.679676 0.616162 0.848485 0.680441 0.616162 0.858586 0.681206 0.616162 0.868687 0.681971 0.616162 0.878788 0.682736 0.616162 0.888889 0.683502 0.616162 0.898990 0.684267 0.616162 0.909091 0.685032 0.616162 0.919192 0.685797 0.616162 0.929293 0.686563 0.616162 0.939394 0.687328 0.616162 0.949495 0.688093 0.616162 0.959596 0.688858 0.616162 0.969697 0.689624 0.616162 0.979798 0.690389 0.616162 0.989899 0.691154 0.616162 1.000000 0.691919 0.626263 0.000000 0.626263 0.626263 0.010101 0.626875 0.626263 0.020202 0.627487 0.626263 0.030303 0.628099 0.626263 0.040404 0.628711 0.626263 0.050505 0.629324 0.626263 0.060606 0.629936 0.626263 0.070707 0.630548 0.626263 0.080808 0.631160 0.626263 0.090909 0.631772 0.626263 0.101010 0.632384 0.626263 0.111111 0.632997 0.626263 0.121212 0.633609 0.626263 0.131313 0.634221 0.626263 0.141414 0.634833 0.626263 0.151515 0.635445 0.626263 0.161616 0.636058 0.626263 0.171717 0.636670 0.626263 0.181818 0.637282 0.626263 0.191919 0.637894 0.626263 0.202020 0.638506 0.626263 0.212121 0.639118 0.626263 0.222222 0.639731 0.626263 0.232323 0.640343 0.626263 0.242424 0.640955 0.626263 0.252525 0.641567 0.626263 0.262626 0.642179 0.626263 0.272727 0.642792 0.626263 0.282828 0.643404 0.626263 0.292929 0.644016 0.626263 0.303030 0.644628 0.626263 0.313131 0.645240 0.626263 0.323232 0.645852 0.626263 0.333333 0.646465 0.626263 0.343434 0.647077 0.626263 0.353535 0.647689 0.626263 0.363636 0.648301 0.626263 0.373737 0.648913 0.626263 0.383838 0.649526 0.626263 0.393939 0.650138 0.626263 0.404040 0.650750 0.626263 0.414141 0.651362 0.626263 0.424242 0.651974 0.626263 0.434343 0.652586 0.626263 0.444444 0.653199 0.626263 0.454545 0.653811 0.626263 0.464646 0.654423 0.626263 0.474747 0.655035 0.626263 0.484848 0.655647 0.626263 0.494949 0.656260 0.626263 0.505051 0.656872 0.626263 0.515152 0.657484 0.626263 0.525253 0.658096 0.626263 0.535354 0.658708 0.626263 0.545455 0.659320 0.626263 0.555556 0.659933 0.626263 0.565657 0.660545 0.626263 0.575758 0.661157 0.626263 0.585859 0.661769 0.626263 0.595960 0.662381 0.626263 0.606061 0.662994 0.626263 0.616162 0.663606 0.626263 0.626263 0.664218 0.626263 0.636364 0.664830 0.626263 0.646465 0.665442 0.626263 0.656566 0.666054 0.626263 0.666667 0.666667 0.626263 0.676768 0.667279 0.626263 0.686869 0.667891 0.626263 0.696970 0.668503 0.626263 0.707071 0.669115 0.626263 0.717172 0.669728 0.626263 0.727273 0.670340 0.626263 0.737374 0.670952 0.626263 0.747475 0.671564 0.626263 0.757576 0.672176 0.626263 0.767677 0.672788 0.626263 0.777778 0.673401 0.626263 0.787879 0.674013 0.626263 0.797980 0.674625 0.626263 0.808081 0.675237 0.626263 0.818182 0.675849 0.626263 0.828283 0.676462 0.626263 0.838384 0.677074 0.626263 0.848485 0.677686 0.626263 0.858586 0.678298 0.626263 0.868687 0.678910 0.626263 0.878788 0.679522 0.626263 0.888889 0.680135 0.626263 0.898990 0.680747 0.626263 0.909091 0.681359 0.626263 0.919192 0.681971 0.626263 0.929293 0.682583 0.626263 0.939394 0.683196 0.626263 0.949495 0.683808 0.626263 0.959596 0.684420 0.626263 0.969697 0.685032 0.626263 0.979798 0.685644 0.626263 0.989899 0.686257 0.626263 1.000000 0.686869 0.636364 0.000000 0.636364 0.636364 0.010101 0.636823 0.636364 0.020202 0.637282 0.636364 0.030303 0.637741 0.636364 0.040404 0.638200 0.636364 0.050505 0.638659 0.636364 0.060606 0.639118 0.636364 0.070707 0.639578 0.636364 0.080808 0.640037 0.636364 0.090909 0.640496 0.636364 0.101010 0.640955 0.636364 0.111111 0.641414 0.636364 0.121212 0.641873 0.636364 0.131313 0.642332 0.636364 0.141414 0.642792 0.636364 0.151515 0.643251 0.636364 0.161616 0.643710 0.636364 0.171717 0.644169 0.636364 0.181818 0.644628 0.636364 0.191919 0.645087 0.636364 0.202020 0.645546 0.636364 0.212121 0.646006 0.636364 0.222222 0.646465 0.636364 0.232323 0.646924 0.636364 0.242424 0.647383 0.636364 0.252525 0.647842 0.636364 0.262626 0.648301 0.636364 0.272727 0.648760 0.636364 0.282828 0.649219 0.636364 0.292929 0.649679 0.636364 0.303030 0.650138 0.636364 0.313131 0.650597 0.636364 0.323232 0.651056 0.636364 0.333333 0.651515 0.636364 0.343434 0.651974 0.636364 0.353535 0.652433 0.636364 0.363636 0.652893 0.636364 0.373737 0.653352 0.636364 0.383838 0.653811 0.636364 0.393939 0.654270 0.636364 0.404040 0.654729 0.636364 0.414141 0.655188 0.636364 0.424242 0.655647 0.636364 0.434343 0.656107 0.636364 0.444444 0.656566 0.636364 0.454545 0.657025 0.636364 0.464646 0.657484 0.636364 0.474747 0.657943 0.636364 0.484848 0.658402 0.636364 0.494949 0.658861 0.636364 0.505051 0.659320 0.636364 0.515152 0.659780 0.636364 0.525253 0.660239 0.636364 0.535354 0.660698 0.636364 0.545455 0.661157 0.636364 0.555556 0.661616 0.636364 0.565657 0.662075 0.636364 0.575758 0.662534 0.636364 0.585859 0.662994 0.636364 0.595960 0.663453 0.636364 0.606061 0.663912 0.636364 0.616162 0.664371 0.636364 0.626263 0.664830 0.636364 0.636364 0.665289 0.636364 0.646465 0.665748 0.636364 0.656566 0.666208 0.636364 0.666667 0.666667 0.636364 0.676768 0.667126 0.636364 0.686869 0.667585 0.636364 0.696970 0.668044 0.636364 0.707071 0.668503 0.636364 0.717172 0.668962 0.636364 0.727273 0.669421 0.636364 0.737374 0.669881 0.636364 0.747475 0.670340 0.636364 0.757576 0.670799 0.636364 0.767677 0.671258 0.636364 0.777778 0.671717 0.636364 0.787879 0.672176 0.636364 0.797980 0.672635 0.636364 0.808081 0.673095 0.636364 0.818182 0.673554 0.636364 0.828283 0.674013 0.636364 0.838384 0.674472 0.636364 0.848485 0.674931 0.636364 0.858586 0.675390 0.636364 0.868687 0.675849 0.636364 0.878788 0.676309 0.636364 0.888889 0.676768 0.636364 0.898990 0.677227 0.636364 0.909091 0.677686 0.636364 0.919192 0.678145 0.636364 0.929293 0.678604 0.636364 0.939394 0.679063 0.636364 0.949495 0.679522 0.636364 0.959596 0.679982 0.636364 0.969697 0.680441 0.636364 0.979798 0.680900 0.636364 0.989899 0.681359 0.636364 1.000000 0.681818 0.646465 0.000000 0.646465 0.646465 0.010101 0.646771 0.646465 0.020202 0.647077 0.646465 0.030303 0.647383 0.646465 0.040404 0.647689 0.646465 0.050505 0.647995 0.646465 0.060606 0.648301 0.646465 0.070707 0.648607 0.646465 0.080808 0.648913 0.646465 0.090909 0.649219 0.646465 0.101010 0.649526 0.646465 0.111111 0.649832 0.646465 0.121212 0.650138 0.646465 0.131313 0.650444 0.646465 0.141414 0.650750 0.646465 0.151515 0.651056 0.646465 0.161616 0.651362 0.646465 0.171717 0.651668 0.646465 0.181818 0.651974 0.646465 0.191919 0.652280 0.646465 0.202020 0.652586 0.646465 0.212121 0.652893 0.646465 0.222222 0.653199 0.646465 0.232323 0.653505 0.646465 0.242424 0.653811 0.646465 0.252525 0.654117 0.646465 0.262626 0.654423 0.646465 0.272727 0.654729 0.646465 0.282828 0.655035 0.646465 0.292929 0.655341 0.646465 0.303030 0.655647 0.646465 0.313131 0.655953 0.646465 0.323232 0.656260 0.646465 0.333333 0.656566 0.646465 0.343434 0.656872 0.646465 0.353535 0.657178 0.646465 0.363636 0.657484 0.646465 0.373737 0.657790 0.646465 0.383838 0.658096 0.646465 0.393939 0.658402 0.646465 0.404040 0.658708 0.646465 0.414141 0.659014 0.646465 0.424242 0.659320 0.646465 0.434343 0.659627 0.646465 0.444444 0.659933 0.646465 0.454545 0.660239 0.646465 0.464646 0.660545 0.646465 0.474747 0.660851 0.646465 0.484848 0.661157 0.646465 0.494949 0.661463 0.646465 0.505051 0.661769 0.646465 0.515152 0.662075 0.646465 0.525253 0.662381 0.646465 0.535354 0.662687 0.646465 0.545455 0.662994 0.646465 0.555556 0.663300 0.646465 0.565657 0.663606 0.646465 0.575758 0.663912 0.646465 0.585859 0.664218 0.646465 0.595960 0.664524 0.646465 0.606061 0.664830 0.646465 0.616162 0.665136 0.646465 0.626263 0.665442 0.646465 0.636364 0.665748 0.646465 0.646465 0.666054 0.646465 0.656566 0.666361 0.646465 0.666667 0.666667 0.646465 0.676768 0.666973 0.646465 0.686869 0.667279 0.646465 0.696970 0.667585 0.646465 0.707071 0.667891 0.646465 0.717172 0.668197 0.646465 0.727273 0.668503 0.646465 0.737374 0.668809 0.646465 0.747475 0.669115 0.646465 0.757576 0.669421 0.646465 0.767677 0.669728 0.646465 0.777778 0.670034 0.646465 0.787879 0.670340 0.646465 0.797980 0.670646 0.646465 0.808081 0.670952 0.646465 0.818182 0.671258 0.646465 0.828283 0.671564 0.646465 0.838384 0.671870 0.646465 0.848485 0.672176 0.646465 0.858586 0.672482 0.646465 0.868687 0.672788 0.646465 0.878788 0.673095 0.646465 0.888889 0.673401 0.646465 0.898990 0.673707 0.646465 0.909091 0.674013 0.646465 0.919192 0.674319 0.646465 0.929293 0.674625 0.646465 0.939394 0.674931 0.646465 0.949495 0.675237 0.646465 0.959596 0.675543 0.646465 0.969697 0.675849 0.646465 0.979798 0.676155 0.646465 0.989899 0.676462 0.646465 1.000000 0.676768 0.656566 0.000000 0.656566 0.656566 0.010101 0.656719 0.656566 0.020202 0.656872 0.656566 0.030303 0.657025 0.656566 0.040404 0.657178 0.656566 0.050505 0.657331 0.656566 0.060606 0.657484 0.656566 0.070707 0.657637 0.656566 0.080808 0.657790 0.656566 0.090909 0.657943 0.656566 0.101010 0.658096 0.656566 0.111111 0.658249 0.656566 0.121212 0.658402 0.656566 0.131313 0.658555 0.656566 0.141414 0.658708 0.656566 0.151515 0.658861 0.656566 0.161616 0.659014 0.656566 0.171717 0.659167 0.656566 0.181818 0.659320 0.656566 0.191919 0.659474 0.656566 0.202020 0.659627 0.656566 0.212121 0.659780 0.656566 0.222222 0.659933 0.656566 0.232323 0.660086 0.656566 0.242424 0.660239 0.656566 0.252525 0.660392 0.656566 0.262626 0.660545 0.656566 0.272727 0.660698 0.656566 0.282828 0.660851 0.656566 0.292929 0.661004 0.656566 0.303030 0.661157 0.656566 0.313131 0.661310 0.656566 0.323232 0.661463 0.656566 0.333333 0.661616 0.656566 0.343434 0.661769 0.656566 0.353535 0.661922 0.656566 0.363636 0.662075 0.656566 0.373737 0.662228 0.656566 0.383838 0.662381 0.656566 0.393939 0.662534 0.656566 0.404040 0.662687 0.656566 0.414141 0.662841 0.656566 0.424242 0.662994 0.656566 0.434343 0.663147 0.656566 0.444444 0.663300 0.656566 0.454545 0.663453 0.656566 0.464646 0.663606 0.656566 0.474747 0.663759 0.656566 0.484848 0.663912 0.656566 0.494949 0.664065 0.656566 0.505051 0.664218 0.656566 0.515152 0.664371 0.656566 0.525253 0.664524 0.656566 0.535354 0.664677 0.656566 0.545455 0.664830 0.656566 0.555556 0.664983 0.656566 0.565657 0.665136 0.656566 0.575758 0.665289 0.656566 0.585859 0.665442 0.656566 0.595960 0.665595 0.656566 0.606061 0.665748 0.656566 0.616162 0.665901 0.656566 0.626263 0.666054 0.656566 0.636364 0.666208 0.656566 0.646465 0.666361 0.656566 0.656566 0.666514 0.656566 0.666667 0.666667 0.656566 0.676768 0.666820 0.656566 0.686869 0.666973 0.656566 0.696970 0.667126 0.656566 0.707071 0.667279 0.656566 0.717172 0.667432 0.656566 0.727273 0.667585 0.656566 0.737374 0.667738 0.656566 0.747475 0.667891 0.656566 0.757576 0.668044 0.656566 0.767677 0.668197 0.656566 0.777778 0.668350 0.656566 0.787879 0.668503 0.656566 0.797980 0.668656 0.656566 0.808081 0.668809 0.656566 0.818182 0.668962 0.656566 0.828283 0.669115 0.656566 0.838384 0.669268 0.656566 0.848485 0.669421 0.656566 0.858586 0.669575 0.656566 0.868687 0.669728 0.656566 0.878788 0.669881 0.656566 0.888889 0.670034 0.656566 0.898990 0.670187 0.656566 0.909091 0.670340 0.656566 0.919192 0.670493 0.656566 0.929293 0.670646 0.656566 0.939394 0.670799 0.656566 0.949495 0.670952 0.656566 0.959596 0.671105 0.656566 0.969697 0.671258 0.656566 0.979798 0.671411 0.656566 0.989899 0.671564 0.656566 1.000000 0.671717 0.666667 0.000000 0.666667 0.666667 0.010101 0.666667 0.666667 0.020202 0.666667 0.666667 0.030303 0.666667 0.666667 0.040404 0.666667 0.666667 0.050505 0.666667 0.666667 0.060606 0.666667 0.666667 0.070707 0.666667 0.666667 0.080808 0.666667 0.666667 0.090909 0.666667 0.666667 0.101010 0.666667 0.666667 0.111111 0.666667 0.666667 0.121212 0.666667 0.666667 0.131313 0.666667 0.666667 0.141414 0.666667 0.666667 0.151515 0.666667 0.666667 0.161616 0.666667 0.666667 0.171717 0.666667 0.666667 0.181818 0.666667 0.666667 0.191919 0.666667 0.666667 0.202020 0.666667 0.666667 0.212121 0.666667 0.666667 0.222222 0.666667 0.666667 0.232323 0.666667 0.666667 0.242424 0.666667 0.666667 0.252525 0.666667 0.666667 0.262626 0.666667 0.666667 0.272727 0.666667 0.666667 0.282828 0.666667 0.666667 0.292929 0.666667 0.666667 0.303030 0.666667 0.666667 0.313131 0.666667 0.666667 0.323232 0.666667 0.666667 0.333333 0.666667 0.666667 0.343434 0.666667 0.666667 0.353535 0.666667 0.666667 0.363636 0.666667 0.666667 0.373737 0.666667 0.666667 0.383838 0.666667 0.666667 0.393939 0.666667 0.666667 0.404040 0.666667 0.666667 0.414141 0.666667 0.666667 0.424242 0.666667 0.666667 0.434343 0.666667 0.666667 0.444444 0.666667 0.666667 0.454545 0.666667 0.666667 0.464646 0.666667 0.666667 0.474747 0.666667 0.666667 0.484848 0.666667 0.666667 0.494949 0.666667 0.666667 0.505051 0.666667 0.666667 0.515152 0.666667 0.666667 0.525253 0.666667 0.666667 0.535354 0.666667 0.666667 0.545455 0.666667 0.666667 0.555556 0.666667 0.666667 0.565657 0.666667 0.666667 0.575758 0.666667 0.666667 0.585859 0.666667 0.666667 0.595960 0.666667 0.666667 0.606061 0.666667 0.666667 0.616162 0.666667 0.666667 0.626263 0.666667 0.666667 0.636364 0.666667 0.666667 0.646465 0.666667 0.666667 0.656566 0.666667 0.666667 0.666667 0.666667 0.666667 0.676768 0.666667 0.666667 0.686869 0.666667 0.666667 0.696970 0.666667 0.666667 0.707071 0.666667 0.666667 0.717172 0.666667 0.666667 0.727273 0.666667 0.666667 0.737374 0.666667 0.666667 0.747475 0.666667 0.666667 0.757576 0.666667 0.666667 0.767677 0.666667 0.666667 0.777778 0.666667 0.666667 0.787879 0.666667 0.666667 0.797980 0.666667 0.666667 0.808081 0.666667 0.666667 0.818182 0.666667 0.666667 0.828283 0.666667 0.666667 0.838384 0.666667 0.666667 0.848485 0.666667 0.666667 0.858586 0.666667 0.666667 0.868687 0.666667 0.666667 0.878788 0.666667 0.666667 0.888889 0.666667 0.666667 0.898990 0.666667 0.666667 0.909091 0.666667 0.666667 0.919192 0.666667 0.666667 0.929293 0.666667 0.666667 0.939394 0.666667 0.666667 0.949495 0.666667 0.666667 0.959596 0.666667 0.666667 0.969697 0.666667 0.666667 0.979798 0.666667 0.666667 0.989899 0.666667 0.666667 1.000000 0.666667 0.676768 0.000000 0.676768 0.676768 0.010101 0.676615 0.676768 0.020202 0.676462 0.676768 0.030303 0.676309 0.676768 0.040404 0.676155 0.676768 0.050505 0.676002 0.676768 0.060606 0.675849 0.676768 0.070707 0.675696 0.676768 0.080808 0.675543 0.676768 0.090909 0.675390 0.676768 0.101010 0.675237 0.676768 0.111111 0.675084 0.676768 0.121212 0.674931 0.676768 0.131313 0.674778 0.676768 0.141414 0.674625 0.676768 0.151515 0.674472 0.676768 0.161616 0.674319 0.676768 0.171717 0.674166 0.676768 0.181818 0.674013 0.676768 0.191919 0.673860 0.676768 0.202020 0.673707 0.676768 0.212121 0.673554 0.676768 0.222222 0.673401 0.676768 0.232323 0.673248 0.676768 0.242424 0.673095 0.676768 0.252525 0.672942 0.676768 0.262626 0.672788 0.676768 0.272727 0.672635 0.676768 0.282828 0.672482 0.676768 0.292929 0.672329 0.676768 0.303030 0.672176 0.676768 0.313131 0.672023 0.676768 0.323232 0.671870 0.676768 0.333333 0.671717 0.676768 0.343434 0.671564 0.676768 0.353535 0.671411 0.676768 0.363636 0.671258 0.676768 0.373737 0.671105 0.676768 0.383838 0.670952 0.676768 0.393939 0.670799 0.676768 0.404040 0.670646 0.676768 0.414141 0.670493 0.676768 0.424242 0.670340 0.676768 0.434343 0.670187 0.676768 0.444444 0.670034 0.676768 0.454545 0.669881 0.676768 0.464646 0.669728 0.676768 0.474747 0.669575 0.676768 0.484848 0.669421 0.676768 0.494949 0.669268 0.676768 0.505051 0.669115 0.676768 0.515152 0.668962 0.676768 0.525253 0.668809 0.676768 0.535354 0.668656 0.676768 0.545455 0.668503 0.676768 0.555556 0.668350 0.676768 0.565657 0.668197 0.676768 0.575758 0.668044 0.676768 0.585859 0.667891 0.676768 0.595960 0.667738 0.676768 0.606061 0.667585 0.676768 0.616162 0.667432 0.676768 0.626263 0.667279 0.676768 0.636364 0.667126 0.676768 0.646465 0.666973 0.676768 0.656566 0.666820 0.676768 0.666667 0.666667 0.676768 0.676768 0.666514 0.676768 0.686869 0.666361 0.676768 0.696970 0.666208 0.676768 0.707071 0.666054 0.676768 0.717172 0.665901 0.676768 0.727273 0.665748 0.676768 0.737374 0.665595 0.676768 0.747475 0.665442 0.676768 0.757576 0.665289 0.676768 0.767677 0.665136 0.676768 0.777778 0.664983 0.676768 0.787879 0.664830 0.676768 0.797980 0.664677 0.676768 0.808081 0.664524 0.676768 0.818182 0.664371 0.676768 0.828283 0.664218 0.676768 0.838384 0.664065 0.676768 0.848485 0.663912 0.676768 0.858586 0.663759 0.676768 0.868687 0.663606 0.676768 0.878788 0.663453 0.676768 0.888889 0.663300 0.676768 0.898990 0.663147 0.676768 0.909091 0.662994 0.676768 0.919192 0.662841 0.676768 0.929293 0.662687 0.676768 0.939394 0.662534 0.676768 0.949495 0.662381 0.676768 0.959596 0.662228 0.676768 0.969697 0.662075 0.676768 0.979798 0.661922 0.676768 0.989899 0.661769 0.676768 1.000000 0.661616 0.686869 0.000000 0.686869 0.686869 0.010101 0.686563 0.686869 0.020202 0.686257 0.686869 0.030303 0.685950 0.686869 0.040404 0.685644 0.686869 0.050505 0.685338 0.686869 0.060606 0.685032 0.686869 0.070707 0.684726 0.686869 0.080808 0.684420 0.686869 0.090909 0.684114 0.686869 0.101010 0.683808 0.686869 0.111111 0.683502 0.686869 0.121212 0.683196 0.686869 0.131313 0.682890 0.686869 0.141414 0.682583 0.686869 0.151515 0.682277 0.686869 0.161616 0.681971 0.686869 0.171717 0.681665 0.686869 0.181818 0.681359 0.686869 0.191919 0.681053 0.686869 0.202020 0.680747 0.686869 0.212121 0.680441 0.686869 0.222222 0.680135 0.686869 0.232323 0.679829 0.686869 0.242424 0.679522 0.686869 0.252525 0.679216 0.686869 0.262626 0.678910 0.686869 0.272727 0.678604 0.686869 0.282828 0.678298 0.686869 0.292929 0.677992 0.686869 0.303030 0.677686 0.686869 0.313131 0.677380 0.686869 0.323232 0.677074 0.686869 0.333333 0.676768 0.686869 0.343434 0.676462 0.686869 0.353535 0.676155 0.686869 0.363636 0.675849 0.686869 0.373737 0.675543 0.686869 0.383838 0.675237 0.686869 0.393939 0.674931 0.686869 0.404040 0.674625 0.686869 0.414141 0.674319 0.686869 0.424242 0.674013 0.686869 0.434343 0.673707 0.686869 0.444444 0.673401 0.686869 0.454545 0.673095 0.686869 0.464646 0.672788 0.686869 0.474747 0.672482 0.686869 0.484848 0.672176 0.686869 0.494949 0.671870 0.686869 0.505051 0.671564 0.686869 0.515152 0.671258 0.686869 0.525253 0.670952 0.686869 0.535354 0.670646 0.686869 0.545455 0.670340 0.686869 0.555556 0.670034 0.686869 0.565657 0.669728 0.686869 0.575758 0.669421 0.686869 0.585859 0.669115 0.686869 0.595960 0.668809 0.686869 0.606061 0.668503 0.686869 0.616162 0.668197 0.686869 0.626263 0.667891 0.686869 0.636364 0.667585 0.686869 0.646465 0.667279 0.686869 0.656566 0.666973 0.686869 0.666667 0.666667 0.686869 0.676768 0.666361 0.686869 0.686869 0.666054 0.686869 0.696970 0.665748 0.686869 0.707071 0.665442 0.686869 0.717172 0.665136 0.686869 0.727273 0.664830 0.686869 0.737374 0.664524 0.686869 0.747475 0.664218 0.686869 0.757576 0.663912 0.686869 0.767677 0.663606 0.686869 0.777778 0.663300 0.686869 0.787879 0.662994 0.686869 0.797980 0.662687 0.686869 0.808081 0.662381 0.686869 0.818182 0.662075 0.686869 0.828283 0.661769 0.686869 0.838384 0.661463 0.686869 0.848485 0.661157 0.686869 0.858586 0.660851 0.686869 0.868687 0.660545 0.686869 0.878788 0.660239 0.686869 0.888889 0.659933 0.686869 0.898990 0.659627 0.686869 0.909091 0.659320 0.686869 0.919192 0.659014 0.686869 0.929293 0.658708 0.686869 0.939394 0.658402 0.686869 0.949495 0.658096 0.686869 0.959596 0.657790 0.686869 0.969697 0.657484 0.686869 0.979798 0.657178 0.686869 0.989899 0.656872 0.686869 1.000000 0.656566 0.696970 0.000000 0.696970 0.696970 0.010101 0.696511 0.696970 0.020202 0.696051 0.696970 0.030303 0.695592 0.696970 0.040404 0.695133 0.696970 0.050505 0.694674 0.696970 0.060606 0.694215 0.696970 0.070707 0.693756 0.696970 0.080808 0.693297 0.696970 0.090909 0.692837 0.696970 0.101010 0.692378 0.696970 0.111111 0.691919 0.696970 0.121212 0.691460 0.696970 0.131313 0.691001 0.696970 0.141414 0.690542 0.696970 0.151515 0.690083 0.696970 0.161616 0.689624 0.696970 0.171717 0.689164 0.696970 0.181818 0.688705 0.696970 0.191919 0.688246 0.696970 0.202020 0.687787 0.696970 0.212121 0.687328 0.696970 0.222222 0.686869 0.696970 0.232323 0.686410 0.696970 0.242424 0.685950 0.696970 0.252525 0.685491 0.696970 0.262626 0.685032 0.696970 0.272727 0.684573 0.696970 0.282828 0.684114 0.696970 0.292929 0.683655 0.696970 0.303030 0.683196 0.696970 0.313131 0.682736 0.696970 0.323232 0.682277 0.696970 0.333333 0.681818 0.696970 0.343434 0.681359 0.696970 0.353535 0.680900 0.696970 0.363636 0.680441 0.696970 0.373737 0.679982 0.696970 0.383838 0.679522 0.696970 0.393939 0.679063 0.696970 0.404040 0.678604 0.696970 0.414141 0.678145 0.696970 0.424242 0.677686 0.696970 0.434343 0.677227 0.696970 0.444444 0.676768 0.696970 0.454545 0.676309 0.696970 0.464646 0.675849 0.696970 0.474747 0.675390 0.696970 0.484848 0.674931 0.696970 0.494949 0.674472 0.696970 0.505051 0.674013 0.696970 0.515152 0.673554 0.696970 0.525253 0.673095 0.696970 0.535354 0.672635 0.696970 0.545455 0.672176 0.696970 0.555556 0.671717 0.696970 0.565657 0.671258 0.696970 0.575758 0.670799 0.696970 0.585859 0.670340 0.696970 0.595960 0.669881 0.696970 0.606061 0.669421 0.696970 0.616162 0.668962 0.696970 0.626263 0.668503 0.696970 0.636364 0.668044 0.696970 0.646465 0.667585 0.696970 0.656566 0.667126 0.696970 0.666667 0.666667 0.696970 0.676768 0.666208 0.696970 0.686869 0.665748 0.696970 0.696970 0.665289 0.696970 0.707071 0.664830 0.696970 0.717172 0.664371 0.696970 0.727273 0.663912 0.696970 0.737374 0.663453 0.696970 0.747475 0.662994 0.696970 0.757576 0.662534 0.696970 0.767677 0.662075 0.696970 0.777778 0.661616 0.696970 0.787879 0.661157 0.696970 0.797980 0.660698 0.696970 0.808081 0.660239 0.696970 0.818182 0.659780 0.696970 0.828283 0.659320 0.696970 0.838384 0.658861 0.696970 0.848485 0.658402 0.696970 0.858586 0.657943 0.696970 0.868687 0.657484 0.696970 0.878788 0.657025 0.696970 0.888889 0.656566 0.696970 0.898990 0.656107 0.696970 0.909091 0.655647 0.696970 0.919192 0.655188 0.696970 0.929293 0.654729 0.696970 0.939394 0.654270 0.696970 0.949495 0.653811 0.696970 0.959596 0.653352 0.696970 0.969697 0.652893 0.696970 0.979798 0.652433 0.696970 0.989899 0.651974 0.696970 1.000000 0.651515 0.707071 0.000000 0.707071 0.707071 0.010101 0.706459 0.707071 0.020202 0.705846 0.707071 0.030303 0.705234 0.707071 0.040404 0.704622 0.707071 0.050505 0.704010 0.707071 0.060606 0.703398 0.707071 0.070707 0.702785 0.707071 0.080808 0.702173 0.707071 0.090909 0.701561 0.707071 0.101010 0.700949 0.707071 0.111111 0.700337 0.707071 0.121212 0.699725 0.707071 0.131313 0.699112 0.707071 0.141414 0.698500 0.707071 0.151515 0.697888 0.707071 0.161616 0.697276 0.707071 0.171717 0.696664 0.707071 0.181818 0.696051 0.707071 0.191919 0.695439 0.707071 0.202020 0.694827 0.707071 0.212121 0.694215 0.707071 0.222222 0.693603 0.707071 0.232323 0.692991 0.707071 0.242424 0.692378 0.707071 0.252525 0.691766 0.707071 0.262626 0.691154 0.707071 0.272727 0.690542 0.707071 0.282828 0.689930 0.707071 0.292929 0.689317 0.707071 0.303030 0.688705 0.707071 0.313131 0.688093 0.707071 0.323232 0.687481 0.707071 0.333333 0.686869 0.707071 0.343434 0.686257 0.707071 0.353535 0.685644 0.707071 0.363636 0.685032 0.707071 0.373737 0.684420 0.707071 0.383838 0.683808 0.707071 0.393939 0.683196 0.707071 0.404040 0.682583 0.707071 0.414141 0.681971 0.707071 0.424242 0.681359 0.707071 0.434343 0.680747 0.707071 0.444444 0.680135 0.707071 0.454545 0.679522 0.707071 0.464646 0.678910 0.707071 0.474747 0.678298 0.707071 0.484848 0.677686 0.707071 0.494949 0.677074 0.707071 0.505051 0.676462 0.707071 0.515152 0.675849 0.707071 0.525253 0.675237 0.707071 0.535354 0.674625 0.707071 0.545455 0.674013 0.707071 0.555556 0.673401 0.707071 0.565657 0.672788 0.707071 0.575758 0.672176 0.707071 0.585859 0.671564 0.707071 0.595960 0.670952 0.707071 0.606061 0.670340 0.707071 0.616162 0.669728 0.707071 0.626263 0.669115 0.707071 0.636364 0.668503 0.707071 0.646465 0.667891 0.707071 0.656566 0.667279 0.707071 0.666667 0.666667 0.707071 0.676768 0.666054 0.707071 0.686869 0.665442 0.707071 0.696970 0.664830 0.707071 0.707071 0.664218 0.707071 0.717172 0.663606 0.707071 0.727273 0.662994 0.707071 0.737374 0.662381 0.707071 0.747475 0.661769 0.707071 0.757576 0.661157 0.707071 0.767677 0.660545 0.707071 0.777778 0.659933 0.707071 0.787879 0.659320 0.707071 0.797980 0.658708 0.707071 0.808081 0.658096 0.707071 0.818182 0.657484 0.707071 0.828283 0.656872 0.707071 0.838384 0.656260 0.707071 0.848485 0.655647 0.707071 0.858586 0.655035 0.707071 0.868687 0.654423 0.707071 0.878788 0.653811 0.707071 0.888889 0.653199 0.707071 0.898990 0.652586 0.707071 0.909091 0.651974 0.707071 0.919192 0.651362 0.707071 0.929293 0.650750 0.707071 0.939394 0.650138 0.707071 0.949495 0.649526 0.707071 0.959596 0.648913 0.707071 0.969697 0.648301 0.707071 0.979798 0.647689 0.707071 0.989899 0.647077 0.707071 1.000000 0.646465 0.717172 0.000000 0.717172 0.717172 0.010101 0.716406 0.717172 0.020202 0.715641 0.717172 0.030303 0.714876 0.717172 0.040404 0.714111 0.717172 0.050505 0.713346 0.717172 0.060606 0.712580 0.717172 0.070707 0.711815 0.717172 0.080808 0.711050 0.717172 0.090909 0.710285 0.717172 0.101010 0.709519 0.717172 0.111111 0.708754 0.717172 0.121212 0.707989 0.717172 0.131313 0.707224 0.717172 0.141414 0.706459 0.717172 0.151515 0.705693 0.717172 0.161616 0.704928 0.717172 0.171717 0.704163 0.717172 0.181818 0.703398 0.717172 0.191919 0.702632 0.717172 0.202020 0.701867 0.717172 0.212121 0.701102 0.717172 0.222222 0.700337 0.717172 0.232323 0.699571 0.717172 0.242424 0.698806 0.717172 0.252525 0.698041 0.717172 0.262626 0.697276 0.717172 0.272727 0.696511 0.717172 0.282828 0.695745 0.717172 0.292929 0.694980 0.717172 0.303030 0.694215 0.717172 0.313131 0.693450 0.717172 0.323232 0.692684 0.717172 0.333333 0.691919 0.717172 0.343434 0.691154 0.717172 0.353535 0.690389 0.717172 0.363636 0.689624 0.717172 0.373737 0.688858 0.717172 0.383838 0.688093 0.717172 0.393939 0.687328 0.717172 0.404040 0.686563 0.717172 0.414141 0.685797 0.717172 0.424242 0.685032 0.717172 0.434343 0.684267 0.717172 0.444444 0.683502 0.717172 0.454545 0.682736 0.717172 0.464646 0.681971 0.717172 0.474747 0.681206 0.717172 0.484848 0.680441 0.717172 0.494949 0.679676 0.717172 0.505051 0.678910 0.717172 0.515152 0.678145 0.717172 0.525253 0.677380 0.717172 0.535354 0.676615 0.717172 0.545455 0.675849 0.717172 0.555556 0.675084 0.717172 0.565657 0.674319 0.717172 0.575758 0.673554 0.717172 0.585859 0.672788 0.717172 0.595960 0.672023 0.717172 0.606061 0.671258 0.717172 0.616162 0.670493 0.717172 0.626263 0.669728 0.717172 0.636364 0.668962 0.717172 0.646465 0.668197 0.717172 0.656566 0.667432 0.717172 0.666667 0.666667 0.717172 0.676768 0.665901 0.717172 0.686869 0.665136 0.717172 0.696970 0.664371 0.717172 0.707071 0.663606 0.717172 0.717172 0.662841 0.717172 0.727273 0.662075 0.717172 0.737374 0.661310 0.717172 0.747475 0.660545 0.717172 0.757576 0.659780 0.717172 0.767677 0.659014 0.717172 0.777778 0.658249 0.717172 0.787879 0.657484 0.717172 0.797980 0.656719 0.717172 0.808081 0.655953 0.717172 0.818182 0.655188 0.717172 0.828283 0.654423 0.717172 0.838384 0.653658 0.717172 0.848485 0.652893 0.717172 0.858586 0.652127 0.717172 0.868687 0.651362 0.717172 0.878788 0.650597 0.717172 0.888889 0.649832 0.717172 0.898990 0.649066 0.717172 0.909091 0.648301 0.717172 0.919192 0.647536 0.717172 0.929293 0.646771 0.717172 0.939394 0.646006 0.717172 0.949495 0.645240 0.717172 0.959596 0.644475 0.717172 0.969697 0.643710 0.717172 0.979798 0.642945 0.717172 0.989899 0.642179 0.717172 1.000000 0.641414 0.727273 0.000000 0.727273 0.727273 0.010101 0.726354 0.727273 0.020202 0.725436 0.727273 0.030303 0.724518 0.727273 0.040404 0.723600 0.727273 0.050505 0.722681 0.727273 0.060606 0.721763 0.727273 0.070707 0.720845 0.727273 0.080808 0.719927 0.727273 0.090909 0.719008 0.727273 0.101010 0.718090 0.727273 0.111111 0.717172 0.727273 0.121212 0.716253 0.727273 0.131313 0.715335 0.727273 0.141414 0.714417 0.727273 0.151515 0.713499 0.727273 0.161616 0.712580 0.727273 0.171717 0.711662 0.727273 0.181818 0.710744 0.727273 0.191919 0.709826 0.727273 0.202020 0.708907 0.727273 0.212121 0.707989 0.727273 0.222222 0.707071 0.727273 0.232323 0.706152 0.727273 0.242424 0.705234 0.727273 0.252525 0.704316 0.727273 0.262626 0.703398 0.727273 0.272727 0.702479 0.727273 0.282828 0.701561 0.727273 0.292929 0.700643 0.727273 0.303030 0.699725 0.727273 0.313131 0.698806 0.727273 0.323232 0.697888 0.727273 0.333333 0.696970 0.727273 0.343434 0.696051 0.727273 0.353535 0.695133 0.727273 0.363636 0.694215 0.727273 0.373737 0.693297 0.727273 0.383838 0.692378 0.727273 0.393939 0.691460 0.727273 0.404040 0.690542 0.727273 0.414141 0.689624 0.727273 0.424242 0.688705 0.727273 0.434343 0.687787 0.727273 0.444444 0.686869 0.727273 0.454545 0.685950 0.727273 0.464646 0.685032 0.727273 0.474747 0.684114 0.727273 0.484848 0.683196 0.727273 0.494949 0.682277 0.727273 0.505051 0.681359 0.727273 0.515152 0.680441 0.727273 0.525253 0.679522 0.727273 0.535354 0.678604 0.727273 0.545455 0.677686 0.727273 0.555556 0.676768 0.727273 0.565657 0.675849 0.727273 0.575758 0.674931 0.727273 0.585859 0.674013 0.727273 0.595960 0.673095 0.727273 0.606061 0.672176 0.727273 0.616162 0.671258 0.727273 0.626263 0.670340 0.727273 0.636364 0.669421 0.727273 0.646465 0.668503 0.727273 0.656566 0.667585 0.727273 0.666667 0.666667 0.727273 0.676768 0.665748 0.727273 0.686869 0.664830 0.727273 0.696970 0.663912 0.727273 0.707071 0.662994 0.727273 0.717172 0.662075 0.727273 0.727273 0.661157 0.727273 0.737374 0.660239 0.727273 0.747475 0.659320 0.727273 0.757576 0.658402 0.727273 0.767677 0.657484 0.727273 0.777778 0.656566 0.727273 0.787879 0.655647 0.727273 0.797980 0.654729 0.727273 0.808081 0.653811 0.727273 0.818182 0.652893 0.727273 0.828283 0.651974 0.727273 0.838384 0.651056 0.727273 0.848485 0.650138 0.727273 0.858586 0.649219 0.727273 0.868687 0.648301 0.727273 0.878788 0.647383 0.727273 0.888889 0.646465 0.727273 0.898990 0.645546 0.727273 0.909091 0.644628 0.727273 0.919192 0.643710 0.727273 0.929293 0.642792 0.727273 0.939394 0.641873 0.727273 0.949495 0.640955 0.727273 0.959596 0.640037 0.727273 0.969697 0.639118 0.727273 0.979798 0.638200 0.727273 0.989899 0.637282 0.727273 1.000000 0.636364 0.737374 0.000000 0.737374 0.737374 0.010101 0.736302 0.737374 0.020202 0.735231 0.737374 0.030303 0.734160 0.737374 0.040404 0.733088 0.737374 0.050505 0.732017 0.737374 0.060606 0.730946 0.737374 0.070707 0.729875 0.737374 0.080808 0.728803 0.737374 0.090909 0.727732 0.737374 0.101010 0.726661 0.737374 0.111111 0.725589 0.737374 0.121212 0.724518 0.737374 0.131313 0.723447 0.737374 0.141414 0.722375 0.737374 0.151515 0.721304 0.737374 0.161616 0.720233 0.737374 0.171717 0.719161 0.737374 0.181818 0.718090 0.737374 0.191919 0.717019 0.737374 0.202020 0.715947 0.737374 0.212121 0.714876 0.737374 0.222222 0.713805 0.737374 0.232323 0.712733 0.737374 0.242424 0.711662 0.737374 0.252525 0.710591 0.737374 0.262626 0.709519 0.737374 0.272727 0.708448 0.737374 0.282828 0.707377 0.737374 0.292929 0.706305 0.737374 0.303030 0.705234 0.737374 0.313131 0.704163 0.737374 0.323232 0.703092 0.737374 0.333333 0.702020 0.737374 0.343434 0.700949 0.737374 0.353535 0.699878 0.737374 0.363636 0.698806 0.737374 0.373737 0.697735 0.737374 0.383838 0.696664 0.737374 0.393939 0.695592 0.737374 0.404040 0.694521 0.737374 0.414141 0.693450 0.737374 0.424242 0.692378 0.737374 0.434343 0.691307 0.737374 0.444444 0.690236 0.737374 0.454545 0.689164 0.737374 0.464646 0.688093 0.737374 0.474747 0.687022 0.737374 0.484848 0.685950 0.737374 0.494949 0.684879 0.737374 0.505051 0.683808 0.737374 0.515152 0.682736 0.737374 0.525253 0.681665 0.737374 0.535354 0.680594 0.737374 0.545455 0.679522 0.737374 0.555556 0.678451 0.737374 0.565657 0.677380 0.737374 0.575758 0.676309 0.737374 0.585859 0.675237 0.737374 0.595960 0.674166 0.737374 0.606061 0.673095 0.737374 0.616162 0.672023 0.737374 0.626263 0.670952 0.737374 0.636364 0.669881 0.737374 0.646465 0.668809 0.737374 0.656566 0.667738 0.737374 0.666667 0.666667 0.737374 0.676768 0.665595 0.737374 0.686869 0.664524 0.737374 0.696970 0.663453 0.737374 0.707071 0.662381 0.737374 0.717172 0.661310 0.737374 0.727273 0.660239 0.737374 0.737374 0.659167 0.737374 0.747475 0.658096 0.737374 0.757576 0.657025 0.737374 0.767677 0.655953 0.737374 0.777778 0.654882 0.737374 0.787879 0.653811 0.737374 0.797980 0.652740 0.737374 0.808081 0.651668 0.737374 0.818182 0.650597 0.737374 0.828283 0.649526 0.737374 0.838384 0.648454 0.737374 0.848485 0.647383 0.737374 0.858586 0.646312 0.737374 0.868687 0.645240 0.737374 0.878788 0.644169 0.737374 0.888889 0.643098 0.737374 0.898990 0.642026 0.737374 0.909091 0.640955 0.737374 0.919192 0.639884 0.737374 0.929293 0.638812 0.737374 0.939394 0.637741 0.737374 0.949495 0.636670 0.737374 0.959596 0.635598 0.737374 0.969697 0.634527 0.737374 0.979798 0.633456 0.737374 0.989899 0.632384 0.737374 1.000000 0.631313 0.747475 0.000000 0.747475 0.747475 0.010101 0.746250 0.747475 0.020202 0.745026 0.747475 0.030303 0.743802 0.747475 0.040404 0.742577 0.747475 0.050505 0.741353 0.747475 0.060606 0.740129 0.747475 0.070707 0.738904 0.747475 0.080808 0.737680 0.747475 0.090909 0.736455 0.747475 0.101010 0.735231 0.747475 0.111111 0.734007 0.747475 0.121212 0.732782 0.747475 0.131313 0.731558 0.747475 0.141414 0.730334 0.747475 0.151515 0.729109 0.747475 0.161616 0.727885 0.747475 0.171717 0.726661 0.747475 0.181818 0.725436 0.747475 0.191919 0.724212 0.747475 0.202020 0.722987 0.747475 0.212121 0.721763 0.747475 0.222222 0.720539 0.747475 0.232323 0.719314 0.747475 0.242424 0.718090 0.747475 0.252525 0.716866 0.747475 0.262626 0.715641 0.747475 0.272727 0.714417 0.747475 0.282828 0.713193 0.747475 0.292929 0.711968 0.747475 0.303030 0.710744 0.747475 0.313131 0.709519 0.747475 0.323232 0.708295 0.747475 0.333333 0.707071 0.747475 0.343434 0.705846 0.747475 0.353535 0.704622 0.747475 0.363636 0.703398 0.747475 0.373737 0.702173 0.747475 0.383838 0.700949 0.747475 0.393939 0.699725 0.747475 0.404040 0.698500 0.747475 0.414141 0.697276 0.747475 0.424242 0.696051 0.747475 0.434343 0.694827 0.747475 0.444444 0.693603 0.747475 0.454545 0.692378 0.747475 0.464646 0.691154 0.747475 0.474747 0.689930 0.747475 0.484848 0.688705 0.747475 0.494949 0.687481 0.747475 0.505051 0.686257 0.747475 0.515152 0.685032 0.747475 0.525253 0.683808 0.747475 0.535354 0.682583 0.747475 0.545455 0.681359 0.747475 0.555556 0.680135 0.747475 0.565657 0.678910 0.747475 0.575758 0.677686 0.747475 0.585859 0.676462 0.747475 0.595960 0.675237 0.747475 0.606061 0.674013 0.747475 0.616162 0.672788 0.747475 0.626263 0.671564 0.747475 0.636364 0.670340 0.747475 0.646465 0.669115 0.747475 0.656566 0.667891 0.747475 0.666667 0.666667 0.747475 0.676768 0.665442 0.747475 0.686869 0.664218 0.747475 0.696970 0.662994 0.747475 0.707071 0.661769 0.747475 0.717172 0.660545 0.747475 0.727273 0.659320 0.747475 0.737374 0.658096 0.747475 0.747475 0.656872 0.747475 0.757576 0.655647 0.747475 0.767677 0.654423 0.747475 0.777778 0.653199 0.747475 0.787879 0.651974 0.747475 0.797980 0.650750 0.747475 0.808081 0.649526 0.747475 0.818182 0.648301 0.747475 0.828283 0.647077 0.747475 0.838384 0.645852 0.747475 0.848485 0.644628 0.747475 0.858586 0.643404 0.747475 0.868687 0.642179 0.747475 0.878788 0.640955 0.747475 0.888889 0.639731 0.747475 0.898990 0.638506 0.747475 0.909091 0.637282 0.747475 0.919192 0.636058 0.747475 0.929293 0.634833 0.747475 0.939394 0.633609 0.747475 0.949495 0.632384 0.747475 0.959596 0.631160 0.747475 0.969697 0.629936 0.747475 0.979798 0.628711 0.747475 0.989899 0.627487 0.747475 1.000000 0.626263 0.757576 0.000000 0.757576 0.757576 0.010101 0.756198 0.757576 0.020202 0.754821 0.757576 0.030303 0.753444 0.757576 0.040404 0.752066 0.757576 0.050505 0.750689 0.757576 0.060606 0.749311 0.757576 0.070707 0.747934 0.757576 0.080808 0.746556 0.757576 0.090909 0.745179 0.757576 0.101010 0.743802 0.757576 0.111111 0.742424 0.757576 0.121212 0.741047 0.757576 0.131313 0.739669 0.757576 0.141414 0.738292 0.757576 0.151515 0.736915 0.757576 0.161616 0.735537 0.757576 0.171717 0.734160 0.757576 0.181818 0.732782 0.757576 0.191919 0.731405 0.757576 0.202020 0.730028 0.757576 0.212121 0.728650 0.757576 0.222222 0.727273 0.757576 0.232323 0.725895 0.757576 0.242424 0.724518 0.757576 0.252525 0.723140 0.757576 0.262626 0.721763 0.757576 0.272727 0.720386 0.757576 0.282828 0.719008 0.757576 0.292929 0.717631 0.757576 0.303030 0.716253 0.757576 0.313131 0.714876 0.757576 0.323232 0.713499 0.757576 0.333333 0.712121 0.757576 0.343434 0.710744 0.757576 0.353535 0.709366 0.757576 0.363636 0.707989 0.757576 0.373737 0.706612 0.757576 0.383838 0.705234 0.757576 0.393939 0.703857 0.757576 0.404040 0.702479 0.757576 0.414141 0.701102 0.757576 0.424242 0.699725 0.757576 0.434343 0.698347 0.757576 0.444444 0.696970 0.757576 0.454545 0.695592 0.757576 0.464646 0.694215 0.757576 0.474747 0.692837 0.757576 0.484848 0.691460 0.757576 0.494949 0.690083 0.757576 0.505051 0.688705 0.757576 0.515152 0.687328 0.757576 0.525253 0.685950 0.757576 0.535354 0.684573 0.757576 0.545455 0.683196 0.757576 0.555556 0.681818 0.757576 0.565657 0.680441 0.757576 0.575758 0.679063 0.757576 0.585859 0.677686 0.757576 0.595960 0.676309 0.757576 0.606061 0.674931 0.757576 0.616162 0.673554 0.757576 0.626263 0.672176 0.757576 0.636364 0.670799 0.757576 0.646465 0.669421 0.757576 0.656566 0.668044 0.757576 0.666667 0.666667 0.757576 0.676768 0.665289 0.757576 0.686869 0.663912 0.757576 0.696970 0.662534 0.757576 0.707071 0.661157 0.757576 0.717172 0.659780 0.757576 0.727273 0.658402 0.757576 0.737374 0.657025 0.757576 0.747475 0.655647 0.757576 0.757576 0.654270 0.757576 0.767677 0.652893 0.757576 0.777778 0.651515 0.757576 0.787879 0.650138 0.757576 0.797980 0.648760 0.757576 0.808081 0.647383 0.757576 0.818182 0.646006 0.757576 0.828283 0.644628 0.757576 0.838384 0.643251 0.757576 0.848485 0.641873 0.757576 0.858586 0.640496 0.757576 0.868687 0.639118 0.757576 0.878788 0.637741 0.757576 0.888889 0.636364 0.757576 0.898990 0.634986 0.757576 0.909091 0.633609 0.757576 0.919192 0.632231 0.757576 0.929293 0.630854 0.757576 0.939394 0.629477 0.757576 0.949495 0.628099 0.757576 0.959596 0.626722 0.757576 0.969697 0.625344 0.757576 0.979798 0.623967 0.757576 0.989899 0.622590 0.757576 1.000000 0.621212 0.767677 0.000000 0.767677 0.767677 0.010101 0.766146 0.767677 0.020202 0.764616 0.767677 0.030303 0.763085 0.767677 0.040404 0.761555 0.767677 0.050505 0.760024 0.767677 0.060606 0.758494 0.767677 0.070707 0.756964 0.767677 0.080808 0.755433 0.767677 0.090909 0.753903 0.767677 0.101010 0.752372 0.767677 0.111111 0.750842 0.767677 0.121212 0.749311 0.767677 0.131313 0.747781 0.767677 0.141414 0.746250 0.767677 0.151515 0.744720 0.767677 0.161616 0.743189 0.767677 0.171717 0.741659 0.767677 0.181818 0.740129 0.767677 0.191919 0.738598 0.767677 0.202020 0.737068 0.767677 0.212121 0.735537 0.767677 0.222222 0.734007 0.767677 0.232323 0.732476 0.767677 0.242424 0.730946 0.767677 0.252525 0.729415 0.767677 0.262626 0.727885 0.767677 0.272727 0.726354 0.767677 0.282828 0.724824 0.767677 0.292929 0.723294 0.767677 0.303030 0.721763 0.767677 0.313131 0.720233 0.767677 0.323232 0.718702 0.767677 0.333333 0.717172 0.767677 0.343434 0.715641 0.767677 0.353535 0.714111 0.767677 0.363636 0.712580 0.767677 0.373737 0.711050 0.767677 0.383838 0.709519 0.767677 0.393939 0.707989 0.767677 0.404040 0.706459 0.767677 0.414141 0.704928 0.767677 0.424242 0.703398 0.767677 0.434343 0.701867 0.767677 0.444444 0.700337 0.767677 0.454545 0.698806 0.767677 0.464646 0.697276 0.767677 0.474747 0.695745 0.767677 0.484848 0.694215 0.767677 0.494949 0.692684 0.767677 0.505051 0.691154 0.767677 0.515152 0.689624 0.767677 0.525253 0.688093 0.767677 0.535354 0.686563 0.767677 0.545455 0.685032 0.767677 0.555556 0.683502 0.767677 0.565657 0.681971 0.767677 0.575758 0.680441 0.767677 0.585859 0.678910 0.767677 0.595960 0.677380 0.767677 0.606061 0.675849 0.767677 0.616162 0.674319 0.767677 0.626263 0.672788 0.767677 0.636364 0.671258 0.767677 0.646465 0.669728 0.767677 0.656566 0.668197 0.767677 0.666667 0.666667 0.767677 0.676768 0.665136 0.767677 0.686869 0.663606 0.767677 0.696970 0.662075 0.767677 0.707071 0.660545 0.767677 0.717172 0.659014 0.767677 0.727273 0.657484 0.767677 0.737374 0.655953 0.767677 0.747475 0.654423 0.767677 0.757576 0.652893 0.767677 0.767677 0.651362 0.767677 0.777778 0.649832 0.767677 0.787879 0.648301 0.767677 0.797980 0.646771 0.767677 0.808081 0.645240 0.767677 0.818182 0.643710 0.767677 0.828283 0.642179 0.767677 0.838384 0.640649 0.767677 0.848485 0.639118 0.767677 0.858586 0.637588 0.767677 0.868687 0.636058 0.767677 0.878788 0.634527 0.767677 0.888889 0.632997 0.767677 0.898990 0.631466 0.767677 0.909091 0.629936 0.767677 0.919192 0.628405 0.767677 0.929293 0.626875 0.767677 0.939394 0.625344 0.767677 0.949495 0.623814 0.767677 0.959596 0.622283 0.767677 0.969697 0.620753 0.767677 0.979798 0.619223 0.767677 0.989899 0.617692 0.767677 1.000000 0.616162 0.777778 0.000000 0.777778 0.777778 0.010101 0.776094 0.777778 0.020202 0.774411 0.777778 0.030303 0.772727 0.777778 0.040404 0.771044 0.777778 0.050505 0.769360 0.777778 0.060606 0.767677 0.777778 0.070707 0.765993 0.777778 0.080808 0.764310 0.777778 0.090909 0.762626 0.777778 0.101010 0.760943 0.777778 0.111111 0.759259 0.777778 0.121212 0.757576 0.777778 0.131313 0.755892 0.777778 0.141414 0.754209 0.777778 0.151515 0.752525 0.777778 0.161616 0.750842 0.777778 0.171717 0.749158 0.777778 0.181818 0.747475 0.777778 0.191919 0.745791 0.777778 0.202020 0.744108 0.777778 0.212121 0.742424 0.777778 0.222222 0.740741 0.777778 0.232323 0.739057 0.777778 0.242424 0.737374 0.777778 0.252525 0.735690 0.777778 0.262626 0.734007 0.777778 0.272727 0.732323 0.777778 0.282828 0.730640 0.777778 0.292929 0.728956 0.777778 0.303030 0.727273 0.777778 0.313131 0.725589 0.777778 0.323232 0.723906 0.777778 0.333333 0.722222 0.777778 0.343434 0.720539 0.777778 0.353535 0.718855 0.777778 0.363636 0.717172 0.777778 0.373737 0.715488 0.777778 0.383838 0.713805 0.777778 0.393939 0.712121 0.777778 0.404040 0.710438 0.777778 0.414141 0.708754 0.777778 0.424242 0.707071 0.777778 0.434343 0.705387 0.777778 0.444444 0.703704 0.777778 0.454545 0.702020 0.777778 0.464646 0.700337 0.777778 0.474747 0.698653 0.777778 0.484848 0.696970 0.777778 0.494949 0.695286 0.777778 0.505051 0.693603 0.777778 0.515152 0.691919 0.777778 0.525253 0.690236 0.777778 0.535354 0.688552 0.777778 0.545455 0.686869 0.777778 0.555556 0.685185 0.777778 0.565657 0.683502 0.777778 0.575758 0.681818 0.777778 0.585859 0.680135 0.777778 0.595960 0.678451 0.777778 0.606061 0.676768 0.777778 0.616162 0.675084 0.777778 0.626263 0.673401 0.777778 0.636364 0.671717 0.777778 0.646465 0.670034 0.777778 0.656566 0.668350 0.777778 0.666667 0.666667 0.777778 0.676768 0.664983 0.777778 0.686869 0.663300 0.777778 0.696970 0.661616 0.777778 0.707071 0.659933 0.777778 0.717172 0.658249 0.777778 0.727273 0.656566 0.777778 0.737374 0.654882 0.777778 0.747475 0.653199 0.777778 0.757576 0.651515 0.777778 0.767677 0.649832 0.777778 0.777778 0.648148 0.777778 0.787879 0.646465 0.777778 0.797980 0.644781 0.777778 0.808081 0.643098 0.777778 0.818182 0.641414 0.777778 0.828283 0.639731 0.777778 0.838384 0.638047 0.777778 0.848485 0.636364 0.777778 0.858586 0.634680 0.777778 0.868687 0.632997 0.777778 0.878788 0.631313 0.777778 0.888889 0.629630 0.777778 0.898990 0.627946 0.777778 0.909091 0.626263 0.777778 0.919192 0.624579 0.777778 0.929293 0.622896 0.777778 0.939394 0.621212 0.777778 0.949495 0.619529 0.777778 0.959596 0.617845 0.777778 0.969697 0.616162 0.777778 0.979798 0.614478 0.777778 0.989899 0.612795 0.777778 1.000000 0.611111 0.787879 0.000000 0.787879 0.787879 0.010101 0.786042 0.787879 0.020202 0.784206 0.787879 0.030303 0.782369 0.787879 0.040404 0.780533 0.787879 0.050505 0.778696 0.787879 0.060606 0.776860 0.787879 0.070707 0.775023 0.787879 0.080808 0.773186 0.787879 0.090909 0.771350 0.787879 0.101010 0.769513 0.787879 0.111111 0.767677 0.787879 0.121212 0.765840 0.787879 0.131313 0.764004 0.787879 0.141414 0.762167 0.787879 0.151515 0.760331 0.787879 0.161616 0.758494 0.787879 0.171717 0.756657 0.787879 0.181818 0.754821 0.787879 0.191919 0.752984 0.787879 0.202020 0.751148 0.787879 0.212121 0.749311 0.787879 0.222222 0.747475 0.787879 0.232323 0.745638 0.787879 0.242424 0.743802 0.787879 0.252525 0.741965 0.787879 0.262626 0.740129 0.787879 0.272727 0.738292 0.787879 0.282828 0.736455 0.787879 0.292929 0.734619 0.787879 0.303030 0.732782 0.787879 0.313131 0.730946 0.787879 0.323232 0.729109 0.787879 0.333333 0.727273 0.787879 0.343434 0.725436 0.787879 0.353535 0.723600 0.787879 0.363636 0.721763 0.787879 0.373737 0.719927 0.787879 0.383838 0.718090 0.787879 0.393939 0.716253 0.787879 0.404040 0.714417 0.787879 0.414141 0.712580 0.787879 0.424242 0.710744 0.787879 0.434343 0.708907 0.787879 0.444444 0.707071 0.787879 0.454545 0.705234 0.787879 0.464646 0.703398 0.787879 0.474747 0.701561 0.787879 0.484848 0.699725 0.787879 0.494949 0.697888 0.787879 0.505051 0.696051 0.787879 0.515152 0.694215 0.787879 0.525253 0.692378 0.787879 0.535354 0.690542 0.787879 0.545455 0.688705 0.787879 0.555556 0.686869 0.787879 0.565657 0.685032 0.787879 0.575758 0.683196 0.787879 0.585859 0.681359 0.787879 0.595960 0.679522 0.787879 0.606061 0.677686 0.787879 0.616162 0.675849 0.787879 0.626263 0.674013 0.787879 0.636364 0.672176 0.787879 0.646465 0.670340 0.787879 0.656566 0.668503 0.787879 0.666667 0.666667 0.787879 0.676768 0.664830 0.787879 0.686869 0.662994 0.787879 0.696970 0.661157 0.787879 0.707071 0.659320 0.787879 0.717172 0.657484 0.787879 0.727273 0.655647 0.787879 0.737374 0.653811 0.787879 0.747475 0.651974 0.787879 0.757576 0.650138 0.787879 0.767677 0.648301 0.787879 0.777778 0.646465 0.787879 0.787879 0.644628 0.787879 0.797980 0.642792 0.787879 0.808081 0.640955 0.787879 0.818182 0.639118 0.787879 0.828283 0.637282 0.787879 0.838384 0.635445 0.787879 0.848485 0.633609 0.787879 0.858586 0.631772 0.787879 0.868687 0.629936 0.787879 0.878788 0.628099 0.787879 0.888889 0.626263 0.787879 0.898990 0.624426 0.787879 0.909091 0.622590 0.787879 0.919192 0.620753 0.787879 0.929293 0.618916 0.787879 0.939394 0.617080 0.787879 0.949495 0.615243 0.787879 0.959596 0.613407 0.787879 0.969697 0.611570 0.787879 0.979798 0.609734 0.787879 0.989899 0.607897 0.787879 1.000000 0.606061 0.797980 0.000000 0.797980 0.797980 0.010101 0.795990 0.797980 0.020202 0.794001 0.797980 0.030303 0.792011 0.797980 0.040404 0.790021 0.797980 0.050505 0.788032 0.797980 0.060606 0.786042 0.797980 0.070707 0.784053 0.797980 0.080808 0.782063 0.797980 0.090909 0.780073 0.797980 0.101010 0.778084 0.797980 0.111111 0.776094 0.797980 0.121212 0.774105 0.797980 0.131313 0.772115 0.797980 0.141414 0.770125 0.797980 0.151515 0.768136 0.797980 0.161616 0.766146 0.797980 0.171717 0.764157 0.797980 0.181818 0.762167 0.797980 0.191919 0.760178 0.797980 0.202020 0.758188 0.797980 0.212121 0.756198 0.797980 0.222222 0.754209 0.797980 0.232323 0.752219 0.797980 0.242424 0.750230 0.797980 0.252525 0.748240 0.797980 0.262626 0.746250 0.797980 0.272727 0.744261 0.797980 0.282828 0.742271 0.797980 0.292929 0.740282 0.797980 0.303030 0.738292 0.797980 0.313131 0.736302 0.797980 0.323232 0.734313 0.797980 0.333333 0.732323 0.797980 0.343434 0.730334 0.797980 0.353535 0.728344 0.797980 0.363636 0.726354 0.797980 0.373737 0.724365 0.797980 0.383838 0.722375 0.797980 0.393939 0.720386 0.797980 0.404040 0.718396 0.797980 0.414141 0.716406 0.797980 0.424242 0.714417 0.797980 0.434343 0.712427 0.797980 0.444444 0.710438 0.797980 0.454545 0.708448 0.797980 0.464646 0.706459 0.797980 0.474747 0.704469 0.797980 0.484848 0.702479 0.797980 0.494949 0.700490 0.797980 0.505051 0.698500 0.797980 0.515152 0.696511 0.797980 0.525253 0.694521 0.797980 0.535354 0.692531 0.797980 0.545455 0.690542 0.797980 0.555556 0.688552 0.797980 0.565657 0.686563 0.797980 0.575758 0.684573 0.797980 0.585859 0.682583 0.797980 0.595960 0.680594 0.797980 0.606061 0.678604 0.797980 0.616162 0.676615 0.797980 0.626263 0.674625 0.797980 0.636364 0.672635 0.797980 0.646465 0.670646 0.797980 0.656566 0.668656 0.797980 0.666667 0.666667 0.797980 0.676768 0.664677 0.797980 0.686869 0.662687 0.797980 0.696970 0.660698 0.797980 0.707071 0.658708 0.797980 0.717172 0.656719 0.797980 0.727273 0.654729 0.797980 0.737374 0.652740 0.797980 0.747475 0.650750 0.797980 0.757576 0.648760 0.797980 0.767677 0.646771 0.797980 0.777778 0.644781 0.797980 0.787879 0.642792 0.797980 0.797980 0.640802 0.797980 0.808081 0.638812 0.797980 0.818182 0.636823 0.797980 0.828283 0.634833 0.797980 0.838384 0.632844 0.797980 0.848485 0.630854 0.797980 0.858586 0.628864 0.797980 0.868687 0.626875 0.797980 0.878788 0.624885 0.797980 0.888889 0.622896 0.797980 0.898990 0.620906 0.797980 0.909091 0.618916 0.797980 0.919192 0.616927 0.797980 0.929293 0.614937 0.797980 0.939394 0.612948 0.797980 0.949495 0.610958 0.797980 0.959596 0.608968 0.797980 0.969697 0.606979 0.797980 0.979798 0.604989 0.797980 0.989899 0.603000 0.797980 1.000000 0.601010 0.808081 0.000000 0.808081 0.808081 0.010101 0.805938 0.808081 0.020202 0.803796 0.808081 0.030303 0.801653 0.808081 0.040404 0.799510 0.808081 0.050505 0.797368 0.808081 0.060606 0.795225 0.808081 0.070707 0.793082 0.808081 0.080808 0.790940 0.808081 0.090909 0.788797 0.808081 0.101010 0.786654 0.808081 0.111111 0.784512 0.808081 0.121212 0.782369 0.808081 0.131313 0.780227 0.808081 0.141414 0.778084 0.808081 0.151515 0.775941 0.808081 0.161616 0.773799 0.808081 0.171717 0.771656 0.808081 0.181818 0.769513 0.808081 0.191919 0.767371 0.808081 0.202020 0.765228 0.808081 0.212121 0.763085 0.808081 0.222222 0.760943 0.808081 0.232323 0.758800 0.808081 0.242424 0.756657 0.808081 0.252525 0.754515 0.808081 0.262626 0.752372 0.808081 0.272727 0.750230 0.808081 0.282828 0.748087 0.808081 0.292929 0.745944 0.808081 0.303030 0.743802 0.808081 0.313131 0.741659 0.808081 0.323232 0.739516 0.808081 0.333333 0.737374 0.808081 0.343434 0.735231 0.808081 0.353535 0.733088 0.808081 0.363636 0.730946 0.808081 0.373737 0.728803 0.808081 0.383838 0.726661 0.808081 0.393939 0.724518 0.808081 0.404040 0.722375 0.808081 0.414141 0.720233 0.808081 0.424242 0.718090 0.808081 0.434343 0.715947 0.808081 0.444444 0.713805 0.808081 0.454545 0.711662 0.808081 0.464646 0.709519 0.808081 0.474747 0.707377 0.808081 0.484848 0.705234 0.808081 0.494949 0.703092 0.808081 0.505051 0.700949 0.808081 0.515152 0.698806 0.808081 0.525253 0.696664 0.808081 0.535354 0.694521 0.808081 0.545455 0.692378 0.808081 0.555556 0.690236 0.808081 0.565657 0.688093 0.808081 0.575758 0.685950 0.808081 0.585859 0.683808 0.808081 0.595960 0.681665 0.808081 0.606061 0.679522 0.808081 0.616162 0.677380 0.808081 0.626263 0.675237 0.808081 0.636364 0.673095 0.808081 0.646465 0.670952 0.808081 0.656566 0.668809 0.808081 0.666667 0.666667 0.808081 0.676768 0.664524 0.808081 0.686869 0.662381 0.808081 0.696970 0.660239 0.808081 0.707071 0.658096 0.808081 0.717172 0.655953 0.808081 0.727273 0.653811 0.808081 0.737374 0.651668 0.808081 0.747475 0.649526 0.808081 0.757576 0.647383 0.808081 0.767677 0.645240 0.808081 0.777778 0.643098 0.808081 0.787879 0.640955 0.808081 0.797980 0.638812 0.808081 0.808081 0.636670 0.808081 0.818182 0.634527 0.808081 0.828283 0.632384 0.808081 0.838384 0.630242 0.808081 0.848485 0.628099 0.808081 0.858586 0.625957 0.808081 0.868687 0.623814 0.808081 0.878788 0.621671 0.808081 0.888889 0.619529 0.808081 0.898990 0.617386 0.808081 0.909091 0.615243 0.808081 0.919192 0.613101 0.808081 0.929293 0.610958 0.808081 0.939394 0.608815 0.808081 0.949495 0.606673 0.808081 0.959596 0.604530 0.808081 0.969697 0.602388 0.808081 0.979798 0.600245 0.808081 0.989899 0.598102 0.808081 1.000000 0.595960 0.818182 0.000000 0.818182 0.818182 0.010101 0.815886 0.818182 0.020202 0.813590 0.818182 0.030303 0.811295 0.818182 0.040404 0.808999 0.818182 0.050505 0.806703 0.818182 0.060606 0.804408 0.818182 0.070707 0.802112 0.818182 0.080808 0.799816 0.818182 0.090909 0.797521 0.818182 0.101010 0.795225 0.818182 0.111111 0.792929 0.818182 0.121212 0.790634 0.818182 0.131313 0.788338 0.818182 0.141414 0.786042 0.818182 0.151515 0.783747 0.818182 0.161616 0.781451 0.818182 0.171717 0.779155 0.818182 0.181818 0.776860 0.818182 0.191919 0.774564 0.818182 0.202020 0.772268 0.818182 0.212121 0.769972 0.818182 0.222222 0.767677 0.818182 0.232323 0.765381 0.818182 0.242424 0.763085 0.818182 0.252525 0.760790 0.818182 0.262626 0.758494 0.818182 0.272727 0.756198 0.818182 0.282828 0.753903 0.818182 0.292929 0.751607 0.818182 0.303030 0.749311 0.818182 0.313131 0.747016 0.818182 0.323232 0.744720 0.818182 0.333333 0.742424 0.818182 0.343434 0.740129 0.818182 0.353535 0.737833 0.818182 0.363636 0.735537 0.818182 0.373737 0.733242 0.818182 0.383838 0.730946 0.818182 0.393939 0.728650 0.818182 0.404040 0.726354 0.818182 0.414141 0.724059 0.818182 0.424242 0.721763 0.818182 0.434343 0.719467 0.818182 0.444444 0.717172 0.818182 0.454545 0.714876 0.818182 0.464646 0.712580 0.818182 0.474747 0.710285 0.818182 0.484848 0.707989 0.818182 0.494949 0.705693 0.818182 0.505051 0.703398 0.818182 0.515152 0.701102 0.818182 0.525253 0.698806 0.818182 0.535354 0.696511 0.818182 0.545455 0.694215 0.818182 0.555556 0.691919 0.818182 0.565657 0.689624 0.818182 0.575758 0.687328 0.818182 0.585859 0.685032 0.818182 0.595960 0.682736 0.818182 0.606061 0.680441 0.818182 0.616162 0.678145 0.818182 0.626263 0.675849 0.818182 0.636364 0.673554 0.818182 0.646465 0.671258 0.818182 0.656566 0.668962 0.818182 0.666667 0.666667 0.818182 0.676768 0.664371 0.818182 0.686869 0.662075 0.818182 0.696970 0.659780 0.818182 0.707071 0.657484 0.818182 0.717172 0.655188 0.818182 0.727273 0.652893 0.818182 0.737374 0.650597 0.818182 0.747475 0.648301 0.818182 0.757576 0.646006 0.818182 0.767677 0.643710 0.818182 0.777778 0.641414 0.818182 0.787879 0.639118 0.818182 0.797980 0.636823 0.818182 0.808081 0.634527 0.818182 0.818182 0.632231 0.818182 0.828283 0.629936 0.818182 0.838384 0.627640 0.818182 0.848485 0.625344 0.818182 0.858586 0.623049 0.818182 0.868687 0.620753 0.818182 0.878788 0.618457 0.818182 0.888889 0.616162 0.818182 0.898990 0.613866 0.818182 0.909091 0.611570 0.818182 0.919192 0.609275 0.818182 0.929293 0.606979 0.818182 0.939394 0.604683 0.818182 0.949495 0.602388 0.818182 0.959596 0.600092 0.818182 0.969697 0.597796 0.818182 0.979798 0.595500 0.818182 0.989899 0.593205 0.818182 1.000000 0.590909 0.828283 0.000000 0.828283 0.828283 0.010101 0.825834 0.828283 0.020202 0.823385 0.828283 0.030303 0.820937 0.828283 0.040404 0.818488 0.828283 0.050505 0.816039 0.828283 0.060606 0.813590 0.828283 0.070707 0.811142 0.828283 0.080808 0.808693 0.828283 0.090909 0.806244 0.828283 0.101010 0.803796 0.828283 0.111111 0.801347 0.828283 0.121212 0.798898 0.828283 0.131313 0.796449 0.828283 0.141414 0.794001 0.828283 0.151515 0.791552 0.828283 0.161616 0.789103 0.828283 0.171717 0.786654 0.828283 0.181818 0.784206 0.828283 0.191919 0.781757 0.828283 0.202020 0.779308 0.828283 0.212121 0.776860 0.828283 0.222222 0.774411 0.828283 0.232323 0.771962 0.828283 0.242424 0.769513 0.828283 0.252525 0.767065 0.828283 0.262626 0.764616 0.828283 0.272727 0.762167 0.828283 0.282828 0.759718 0.828283 0.292929 0.757270 0.828283 0.303030 0.754821 0.828283 0.313131 0.752372 0.828283 0.323232 0.749923 0.828283 0.333333 0.747475 0.828283 0.343434 0.745026 0.828283 0.353535 0.742577 0.828283 0.363636 0.740129 0.828283 0.373737 0.737680 0.828283 0.383838 0.735231 0.828283 0.393939 0.732782 0.828283 0.404040 0.730334 0.828283 0.414141 0.727885 0.828283 0.424242 0.725436 0.828283 0.434343 0.722987 0.828283 0.444444 0.720539 0.828283 0.454545 0.718090 0.828283 0.464646 0.715641 0.828283 0.474747 0.713193 0.828283 0.484848 0.710744 0.828283 0.494949 0.708295 0.828283 0.505051 0.705846 0.828283 0.515152 0.703398 0.828283 0.525253 0.700949 0.828283 0.535354 0.698500 0.828283 0.545455 0.696051 0.828283 0.555556 0.693603 0.828283 0.565657 0.691154 0.828283 0.575758 0.688705 0.828283 0.585859 0.686257 0.828283 0.595960 0.683808 0.828283 0.606061 0.681359 0.828283 0.616162 0.678910 0.828283 0.626263 0.676462 0.828283 0.636364 0.674013 0.828283 0.646465 0.671564 0.828283 0.656566 0.669115 0.828283 0.666667 0.666667 0.828283 0.676768 0.664218 0.828283 0.686869 0.661769 0.828283 0.696970 0.659320 0.828283 0.707071 0.656872 0.828283 0.717172 0.654423 0.828283 0.727273 0.651974 0.828283 0.737374 0.649526 0.828283 0.747475 0.647077 0.828283 0.757576 0.644628 0.828283 0.767677 0.642179 0.828283 0.777778 0.639731 0.828283 0.787879 0.637282 0.828283 0.797980 0.634833 0.828283 0.808081 0.632384 0.828283 0.818182 0.629936 0.828283 0.828283 0.627487 0.828283 0.838384 0.625038 0.828283 0.848485 0.622590 0.828283 0.858586 0.620141 0.828283 0.868687 0.617692 0.828283 0.878788 0.615243 0.828283 0.888889 0.612795 0.828283 0.898990 0.610346 0.828283 0.909091 0.607897 0.828283 0.919192 0.605448 0.828283 0.929293 0.603000 0.828283 0.939394 0.600551 0.828283 0.949495 0.598102 0.828283 0.959596 0.595654 0.828283 0.969697 0.593205 0.828283 0.979798 0.590756 0.828283 0.989899 0.588307 0.828283 1.000000 0.585859 0.838384 0.000000 0.838384 0.838384 0.010101 0.835782 0.838384 0.020202 0.833180 0.838384 0.030303 0.830579 0.838384 0.040404 0.827977 0.838384 0.050505 0.825375 0.838384 0.060606 0.822773 0.838384 0.070707 0.820171 0.838384 0.080808 0.817570 0.838384 0.090909 0.814968 0.838384 0.101010 0.812366 0.838384 0.111111 0.809764 0.838384 0.121212 0.807163 0.838384 0.131313 0.804561 0.838384 0.141414 0.801959 0.838384 0.151515 0.799357 0.838384 0.161616 0.796755 0.838384 0.171717 0.794154 0.838384 0.181818 0.791552 0.838384 0.191919 0.788950 0.838384 0.202020 0.786348 0.838384 0.212121 0.783747 0.838384 0.222222 0.781145 0.838384 0.232323 0.778543 0.838384 0.242424 0.775941 0.838384 0.252525 0.773339 0.838384 0.262626 0.770738 0.838384 0.272727 0.768136 0.838384 0.282828 0.765534 0.838384 0.292929 0.762932 0.838384 0.303030 0.760331 0.838384 0.313131 0.757729 0.838384 0.323232 0.755127 0.838384 0.333333 0.752525 0.838384 0.343434 0.749923 0.838384 0.353535 0.747322 0.838384 0.363636 0.744720 0.838384 0.373737 0.742118 0.838384 0.383838 0.739516 0.838384 0.393939 0.736915 0.838384 0.404040 0.734313 0.838384 0.414141 0.731711 0.838384 0.424242 0.729109 0.838384 0.434343 0.726507 0.838384 0.444444 0.723906 0.838384 0.454545 0.721304 0.838384 0.464646 0.718702 0.838384 0.474747 0.716100 0.838384 0.484848 0.713499 0.838384 0.494949 0.710897 0.838384 0.505051 0.708295 0.838384 0.515152 0.705693 0.838384 0.525253 0.703092 0.838384 0.535354 0.700490 0.838384 0.545455 0.697888 0.838384 0.555556 0.695286 0.838384 0.565657 0.692684 0.838384 0.575758 0.690083 0.838384 0.585859 0.687481 0.838384 0.595960 0.684879 0.838384 0.606061 0.682277 0.838384 0.616162 0.679676 0.838384 0.626263 0.677074 0.838384 0.636364 0.674472 0.838384 0.646465 0.671870 0.838384 0.656566 0.669268 0.838384 0.666667 0.666667 0.838384 0.676768 0.664065 0.838384 0.686869 0.661463 0.838384 0.696970 0.658861 0.838384 0.707071 0.656260 0.838384 0.717172 0.653658 0.838384 0.727273 0.651056 0.838384 0.737374 0.648454 0.838384 0.747475 0.645852 0.838384 0.757576 0.643251 0.838384 0.767677 0.640649 0.838384 0.777778 0.638047 0.838384 0.787879 0.635445 0.838384 0.797980 0.632844 0.838384 0.808081 0.630242 0.838384 0.818182 0.627640 0.838384 0.828283 0.625038 0.838384 0.838384 0.622436 0.838384 0.848485 0.619835 0.838384 0.858586 0.617233 0.838384 0.868687 0.614631 0.838384 0.878788 0.612029 0.838384 0.888889 0.609428 0.838384 0.898990 0.606826 0.838384 0.909091 0.604224 0.838384 0.919192 0.601622 0.838384 0.929293 0.599021 0.838384 0.939394 0.596419 0.838384 0.949495 0.593817 0.838384 0.959596 0.591215 0.838384 0.969697 0.588613 0.838384 0.979798 0.586012 0.838384 0.989899 0.583410 0.838384 1.000000 0.580808 0.848485 0.000000 0.848485 0.848485 0.010101 0.845730 0.848485 0.020202 0.842975 0.848485 0.030303 0.840220 0.848485 0.040404 0.837466 0.848485 0.050505 0.834711 0.848485 0.060606 0.831956 0.848485 0.070707 0.829201 0.848485 0.080808 0.826446 0.848485 0.090909 0.823691 0.848485 0.101010 0.820937 0.848485 0.111111 0.818182 0.848485 0.121212 0.815427 0.848485 0.131313 0.812672 0.848485 0.141414 0.809917 0.848485 0.151515 0.807163 0.848485 0.161616 0.804408 0.848485 0.171717 0.801653 0.848485 0.181818 0.798898 0.848485 0.191919 0.796143 0.848485 0.202020 0.793388 0.848485 0.212121 0.790634 0.848485 0.222222 0.787879 0.848485 0.232323 0.785124 0.848485 0.242424 0.782369 0.848485 0.252525 0.779614 0.848485 0.262626 0.776860 0.848485 0.272727 0.774105 0.848485 0.282828 0.771350 0.848485 0.292929 0.768595 0.848485 0.303030 0.765840 0.848485 0.313131 0.763085 0.848485 0.323232 0.760331 0.848485 0.333333 0.757576 0.848485 0.343434 0.754821 0.848485 0.353535 0.752066 0.848485 0.363636 0.749311 0.848485 0.373737 0.746556 0.848485 0.383838 0.743802 0.848485 0.393939 0.741047 0.848485 0.404040 0.738292 0.848485 0.414141 0.735537 0.848485 0.424242 0.732782 0.848485 0.434343 0.730028 0.848485 0.444444 0.727273 0.848485 0.454545 0.724518 0.848485 0.464646 0.721763 0.848485 0.474747 0.719008 0.848485 0.484848 0.716253 0.848485 0.494949 0.713499 0.848485 0.505051 0.710744 0.848485 0.515152 0.707989 0.848485 0.525253 0.705234 0.848485 0.535354 0.702479 0.848485 0.545455 0.699725 0.848485 0.555556 0.696970 0.848485 0.565657 0.694215 0.848485 0.575758 0.691460 0.848485 0.585859 0.688705 0.848485 0.595960 0.685950 0.848485 0.606061 0.683196 0.848485 0.616162 0.680441 0.848485 0.626263 0.677686 0.848485 0.636364 0.674931 0.848485 0.646465 0.672176 0.848485 0.656566 0.669421 0.848485 0.666667 0.666667 0.848485 0.676768 0.663912 0.848485 0.686869 0.661157 0.848485 0.696970 0.658402 0.848485 0.707071 0.655647 0.848485 0.717172 0.652893 0.848485 0.727273 0.650138 0.848485 0.737374 0.647383 0.848485 0.747475 0.644628 0.848485 0.757576 0.641873 0.848485 0.767677 0.639118 0.848485 0.777778 0.636364 0.848485 0.787879 0.633609 0.848485 0.797980 0.630854 0.848485 0.808081 0.628099 0.848485 0.818182 0.625344 0.848485 0.828283 0.622590 0.848485 0.838384 0.619835 0.848485 0.848485 0.617080 0.848485 0.858586 0.614325 0.848485 0.868687 0.611570 0.848485 0.878788 0.608815 0.848485 0.888889 0.606061 0.848485 0.898990 0.603306 0.848485 0.909091 0.600551 0.848485 0.919192 0.597796 0.848485 0.929293 0.595041 0.848485 0.939394 0.592287 0.848485 0.949495 0.589532 0.848485 0.959596 0.586777 0.848485 0.969697 0.584022 0.848485 0.979798 0.581267 0.848485 0.989899 0.578512 0.848485 1.000000 0.575758 0.858586 0.000000 0.858586 0.858586 0.010101 0.855678 0.858586 0.020202 0.852770 0.858586 0.030303 0.849862 0.858586 0.040404 0.846954 0.858586 0.050505 0.844047 0.858586 0.060606 0.841139 0.858586 0.070707 0.838231 0.858586 0.080808 0.835323 0.858586 0.090909 0.832415 0.858586 0.101010 0.829507 0.858586 0.111111 0.826599 0.858586 0.121212 0.823691 0.858586 0.131313 0.820784 0.858586 0.141414 0.817876 0.858586 0.151515 0.814968 0.858586 0.161616 0.812060 0.858586 0.171717 0.809152 0.858586 0.181818 0.806244 0.858586 0.191919 0.803336 0.858586 0.202020 0.800429 0.858586 0.212121 0.797521 0.858586 0.222222 0.794613 0.858586 0.232323 0.791705 0.858586 0.242424 0.788797 0.858586 0.252525 0.785889 0.858586 0.262626 0.782981 0.858586 0.272727 0.780073 0.858586 0.282828 0.777166 0.858586 0.292929 0.774258 0.858586 0.303030 0.771350 0.858586 0.313131 0.768442 0.858586 0.323232 0.765534 0.858586 0.333333 0.762626 0.858586 0.343434 0.759718 0.858586 0.353535 0.756811 0.858586 0.363636 0.753903 0.858586 0.373737 0.750995 0.858586 0.383838 0.748087 0.858586 0.393939 0.745179 0.858586 0.404040 0.742271 0.858586 0.414141 0.739363 0.858586 0.424242 0.736455 0.858586 0.434343 0.733548 0.858586 0.444444 0.730640 0.858586 0.454545 0.727732 0.858586 0.464646 0.724824 0.858586 0.474747 0.721916 0.858586 0.484848 0.719008 0.858586 0.494949 0.716100 0.858586 0.505051 0.713193 0.858586 0.515152 0.710285 0.858586 0.525253 0.707377 0.858586 0.535354 0.704469 0.858586 0.545455 0.701561 0.858586 0.555556 0.698653 0.858586 0.565657 0.695745 0.858586 0.575758 0.692837 0.858586 0.585859 0.689930 0.858586 0.595960 0.687022 0.858586 0.606061 0.684114 0.858586 0.616162 0.681206 0.858586 0.626263 0.678298 0.858586 0.636364 0.675390 0.858586 0.646465 0.672482 0.858586 0.656566 0.669575 0.858586 0.666667 0.666667 0.858586 0.676768 0.663759 0.858586 0.686869 0.660851 0.858586 0.696970 0.657943 0.858586 0.707071 0.655035 0.858586 0.717172 0.652127 0.858586 0.727273 0.649219 0.858586 0.737374 0.646312 0.858586 0.747475 0.643404 0.858586 0.757576 0.640496 0.858586 0.767677 0.637588 0.858586 0.777778 0.634680 0.858586 0.787879 0.631772 0.858586 0.797980 0.628864 0.858586 0.808081 0.625957 0.858586 0.818182 0.623049 0.858586 0.828283 0.620141 0.858586 0.838384 0.617233 0.858586 0.848485 0.614325 0.858586 0.858586 0.611417 0.858586 0.868687 0.608509 0.858586 0.878788 0.605601 0.858586 0.888889 0.602694 0.858586 0.898990 0.599786 0.858586 0.909091 0.596878 0.858586 0.919192 0.593970 0.858586 0.929293 0.591062 0.858586 0.939394 0.588154 0.858586 0.949495 0.585246 0.858586 0.959596 0.582339 0.858586 0.969697 0.579431 0.858586 0.979798 0.576523 0.858586 0.989899 0.573615 0.858586 1.000000 0.570707 0.868687 0.000000 0.868687 0.868687 0.010101 0.865626 0.868687 0.020202 0.862565 0.868687 0.030303 0.859504 0.868687 0.040404 0.856443 0.868687 0.050505 0.853382 0.868687 0.060606 0.850321 0.868687 0.070707 0.847260 0.868687 0.080808 0.844200 0.868687 0.090909 0.841139 0.868687 0.101010 0.838078 0.868687 0.111111 0.835017 0.868687 0.121212 0.831956 0.868687 0.131313 0.828895 0.868687 0.141414 0.825834 0.868687 0.151515 0.822773 0.868687 0.161616 0.819712 0.868687 0.171717 0.816651 0.868687 0.181818 0.813590 0.868687 0.191919 0.810530 0.868687 0.202020 0.807469 0.868687 0.212121 0.804408 0.868687 0.222222 0.801347 0.868687 0.232323 0.798286 0.868687 0.242424 0.795225 0.868687 0.252525 0.792164 0.868687 0.262626 0.789103 0.868687 0.272727 0.786042 0.868687 0.282828 0.782981 0.868687 0.292929 0.779920 0.868687 0.303030 0.776860 0.868687 0.313131 0.773799 0.868687 0.323232 0.770738 0.868687 0.333333 0.767677 0.868687 0.343434 0.764616 0.868687 0.353535 0.761555 0.868687 0.363636 0.758494 0.868687 0.373737 0.755433 0.868687 0.383838 0.752372 0.868687 0.393939 0.749311 0.868687 0.404040 0.746250 0.868687 0.414141 0.743189 0.868687 0.424242 0.740129 0.868687 0.434343 0.737068 0.868687 0.444444 0.734007 0.868687 0.454545 0.730946 0.868687 0.464646 0.727885 0.868687 0.474747 0.724824 0.868687 0.484848 0.721763 0.868687 0.494949 0.718702 0.868687 0.505051 0.715641 0.868687 0.515152 0.712580 0.868687 0.525253 0.709519 0.868687 0.535354 0.706459 0.868687 0.545455 0.703398 0.868687 0.555556 0.700337 0.868687 0.565657 0.697276 0.868687 0.575758 0.694215 0.868687 0.585859 0.691154 0.868687 0.595960 0.688093 0.868687 0.606061 0.685032 0.868687 0.616162 0.681971 0.868687 0.626263 0.678910 0.868687 0.636364 0.675849 0.868687 0.646465 0.672788 0.868687 0.656566 0.669728 0.868687 0.666667 0.666667 0.868687 0.676768 0.663606 0.868687 0.686869 0.660545 0.868687 0.696970 0.657484 0.868687 0.707071 0.654423 0.868687 0.717172 0.651362 0.868687 0.727273 0.648301 0.868687 0.737374 0.645240 0.868687 0.747475 0.642179 0.868687 0.757576 0.639118 0.868687 0.767677 0.636058 0.868687 0.777778 0.632997 0.868687 0.787879 0.629936 0.868687 0.797980 0.626875 0.868687 0.808081 0.623814 0.868687 0.818182 0.620753 0.868687 0.828283 0.617692 0.868687 0.838384 0.614631 0.868687 0.848485 0.611570 0.868687 0.858586 0.608509 0.868687 0.868687 0.605448 0.868687 0.878788 0.602388 0.868687 0.888889 0.599327 0.868687 0.898990 0.596266 0.868687 0.909091 0.593205 0.868687 0.919192 0.590144 0.868687 0.929293 0.587083 0.868687 0.939394 0.584022 0.868687 0.949495 0.580961 0.868687 0.959596 0.577900 0.868687 0.969697 0.574839 0.868687 0.979798 0.571778 0.868687 0.989899 0.568717 0.868687 1.000000 0.565657 0.878788 0.000000 0.878788 0.878788 0.010101 0.875574 0.878788 0.020202 0.872360 0.878788 0.030303 0.869146 0.878788 0.040404 0.865932 0.878788 0.050505 0.862718 0.878788 0.060606 0.859504 0.878788 0.070707 0.856290 0.878788 0.080808 0.853076 0.878788 0.090909 0.849862 0.878788 0.101010 0.846648 0.878788 0.111111 0.843434 0.878788 0.121212 0.840220 0.878788 0.131313 0.837006 0.878788 0.141414 0.833792 0.878788 0.151515 0.830579 0.878788 0.161616 0.827365 0.878788 0.171717 0.824151 0.878788 0.181818 0.820937 0.878788 0.191919 0.817723 0.878788 0.202020 0.814509 0.878788 0.212121 0.811295 0.878788 0.222222 0.808081 0.878788 0.232323 0.804867 0.878788 0.242424 0.801653 0.878788 0.252525 0.798439 0.878788 0.262626 0.795225 0.878788 0.272727 0.792011 0.878788 0.282828 0.788797 0.878788 0.292929 0.785583 0.878788 0.303030 0.782369 0.878788 0.313131 0.779155 0.878788 0.323232 0.775941 0.878788 0.333333 0.772727 0.878788 0.343434 0.769513 0.878788 0.353535 0.766299 0.878788 0.363636 0.763085 0.878788 0.373737 0.759871 0.878788 0.383838 0.756657 0.878788 0.393939 0.753444 0.878788 0.404040 0.750230 0.878788 0.414141 0.747016 0.878788 0.424242 0.743802 0.878788 0.434343 0.740588 0.878788 0.444444 0.737374 0.878788 0.454545 0.734160 0.878788 0.464646 0.730946 0.878788 0.474747 0.727732 0.878788 0.484848 0.724518 0.878788 0.494949 0.721304 0.878788 0.505051 0.718090 0.878788 0.515152 0.714876 0.878788 0.525253 0.711662 0.878788 0.535354 0.708448 0.878788 0.545455 0.705234 0.878788 0.555556 0.702020 0.878788 0.565657 0.698806 0.878788 0.575758 0.695592 0.878788 0.585859 0.692378 0.878788 0.595960 0.689164 0.878788 0.606061 0.685950 0.878788 0.616162 0.682736 0.878788 0.626263 0.679522 0.878788 0.636364 0.676309 0.878788 0.646465 0.673095 0.878788 0.656566 0.669881 0.878788 0.666667 0.666667 0.878788 0.676768 0.663453 0.878788 0.686869 0.660239 0.878788 0.696970 0.657025 0.878788 0.707071 0.653811 0.878788 0.717172 0.650597 0.878788 0.727273 0.647383 0.878788 0.737374 0.644169 0.878788 0.747475 0.640955 0.878788 0.757576 0.637741 0.878788 0.767677 0.634527 0.878788 0.777778 0.631313 0.878788 0.787879 0.628099 0.878788 0.797980 0.624885 0.878788 0.808081 0.621671 0.878788 0.818182 0.618457 0.878788 0.828283 0.615243 0.878788 0.838384 0.612029 0.878788 0.848485 0.608815 0.878788 0.858586 0.605601 0.878788 0.868687 0.602388 0.878788 0.878788 0.599174 0.878788 0.888889 0.595960 0.878788 0.898990 0.592746 0.878788 0.909091 0.589532 0.878788 0.919192 0.586318 0.878788 0.929293 0.583104 0.878788 0.939394 0.579890 0.878788 0.949495 0.576676 0.878788 0.959596 0.573462 0.878788 0.969697 0.570248 0.878788 0.979798 0.567034 0.878788 0.989899 0.563820 0.878788 1.000000 0.560606 0.888889 0.000000 0.888889 0.888889 0.010101 0.885522 0.888889 0.020202 0.882155 0.888889 0.030303 0.878788 0.888889 0.040404 0.875421 0.888889 0.050505 0.872054 0.888889 0.060606 0.868687 0.888889 0.070707 0.865320 0.888889 0.080808 0.861953 0.888889 0.090909 0.858586 0.888889 0.101010 0.855219 0.888889 0.111111 0.851852 0.888889 0.121212 0.848485 0.888889 0.131313 0.845118 0.888889 0.141414 0.841751 0.888889 0.151515 0.838384 0.888889 0.161616 0.835017 0.888889 0.171717 0.831650 0.888889 0.181818 0.828283 0.888889 0.191919 0.824916 0.888889 0.202020 0.821549 0.888889 0.212121 0.818182 0.888889 0.222222 0.814815 0.888889 0.232323 0.811448 0.888889 0.242424 0.808081 0.888889 0.252525 0.804714 0.888889 0.262626 0.801347 0.888889 0.272727 0.797980 0.888889 0.282828 0.794613 0.888889 0.292929 0.791246 0.888889 0.303030 0.787879 0.888889 0.313131 0.784512 0.888889 0.323232 0.781145 0.888889 0.333333 0.777778 0.888889 0.343434 0.774411 0.888889 0.353535 0.771044 0.888889 0.363636 0.767677 0.888889 0.373737 0.764310 0.888889 0.383838 0.760943 0.888889 0.393939 0.757576 0.888889 0.404040 0.754209 0.888889 0.414141 0.750842 0.888889 0.424242 0.747475 0.888889 0.434343 0.744108 0.888889 0.444444 0.740741 0.888889 0.454545 0.737374 0.888889 0.464646 0.734007 0.888889 0.474747 0.730640 0.888889 0.484848 0.727273 0.888889 0.494949 0.723906 0.888889 0.505051 0.720539 0.888889 0.515152 0.717172 0.888889 0.525253 0.713805 0.888889 0.535354 0.710438 0.888889 0.545455 0.707071 0.888889 0.555556 0.703704 0.888889 0.565657 0.700337 0.888889 0.575758 0.696970 0.888889 0.585859 0.693603 0.888889 0.595960 0.690236 0.888889 0.606061 0.686869 0.888889 0.616162 0.683502 0.888889 0.626263 0.680135 0.888889 0.636364 0.676768 0.888889 0.646465 0.673401 0.888889 0.656566 0.670034 0.888889 0.666667 0.666667 0.888889 0.676768 0.663300 0.888889 0.686869 0.659933 0.888889 0.696970 0.656566 0.888889 0.707071 0.653199 0.888889 0.717172 0.649832 0.888889 0.727273 0.646465 0.888889 0.737374 0.643098 0.888889 0.747475 0.639731 0.888889 0.757576 0.636364 0.888889 0.767677 0.632997 0.888889 0.777778 0.629630 0.888889 0.787879 0.626263 0.888889 0.797980 0.622896 0.888889 0.808081 0.619529 0.888889 0.818182 0.616162 0.888889 0.828283 0.612795 0.888889 0.838384 0.609428 0.888889 0.848485 0.606061 0.888889 0.858586 0.602694 0.888889 0.868687 0.599327 0.888889 0.878788 0.595960 0.888889 0.888889 0.592593 0.888889 0.898990 0.589226 0.888889 0.909091 0.585859 0.888889 0.919192 0.582492 0.888889 0.929293 0.579125 0.888889 0.939394 0.575758 0.888889 0.949495 0.572391 0.888889 0.959596 0.569024 0.888889 0.969697 0.565657 0.888889 0.979798 0.562290 0.888889 0.989899 0.558923 0.888889 1.000000 0.555556 0.898990 0.000000 0.898990 0.898990 0.010101 0.895470 0.898990 0.020202 0.891950 0.898990 0.030303 0.888430 0.898990 0.040404 0.884910 0.898990 0.050505 0.881390 0.898990 0.060606 0.877870 0.898990 0.070707 0.874350 0.898990 0.080808 0.870830 0.898990 0.090909 0.867309 0.898990 0.101010 0.863789 0.898990 0.111111 0.860269 0.898990 0.121212 0.856749 0.898990 0.131313 0.853229 0.898990 0.141414 0.849709 0.898990 0.151515 0.846189 0.898990 0.161616 0.842669 0.898990 0.171717 0.839149 0.898990 0.181818 0.835629 0.898990 0.191919 0.832109 0.898990 0.202020 0.828589 0.898990 0.212121 0.825069 0.898990 0.222222 0.821549 0.898990 0.232323 0.818029 0.898990 0.242424 0.814509 0.898990 0.252525 0.810989 0.898990 0.262626 0.807469 0.898990 0.272727 0.803949 0.898990 0.282828 0.800429 0.898990 0.292929 0.796908 0.898990 0.303030 0.793388 0.898990 0.313131 0.789868 0.898990 0.323232 0.786348 0.898990 0.333333 0.782828 0.898990 0.343434 0.779308 0.898990 0.353535 0.775788 0.898990 0.363636 0.772268 0.898990 0.373737 0.768748 0.898990 0.383838 0.765228 0.898990 0.393939 0.761708 0.898990 0.404040 0.758188 0.898990 0.414141 0.754668 0.898990 0.424242 0.751148 0.898990 0.434343 0.747628 0.898990 0.444444 0.744108 0.898990 0.454545 0.740588 0.898990 0.464646 0.737068 0.898990 0.474747 0.733548 0.898990 0.484848 0.730028 0.898990 0.494949 0.726507 0.898990 0.505051 0.722987 0.898990 0.515152 0.719467 0.898990 0.525253 0.715947 0.898990 0.535354 0.712427 0.898990 0.545455 0.708907 0.898990 0.555556 0.705387 0.898990 0.565657 0.701867 0.898990 0.575758 0.698347 0.898990 0.585859 0.694827 0.898990 0.595960 0.691307 0.898990 0.606061 0.687787 0.898990 0.616162 0.684267 0.898990 0.626263 0.680747 0.898990 0.636364 0.677227 0.898990 0.646465 0.673707 0.898990 0.656566 0.670187 0.898990 0.666667 0.666667 0.898990 0.676768 0.663147 0.898990 0.686869 0.659627 0.898990 0.696970 0.656107 0.898990 0.707071 0.652586 0.898990 0.717172 0.649066 0.898990 0.727273 0.645546 0.898990 0.737374 0.642026 0.898990 0.747475 0.638506 0.898990 0.757576 0.634986 0.898990 0.767677 0.631466 0.898990 0.777778 0.627946 0.898990 0.787879 0.624426 0.898990 0.797980 0.620906 0.898990 0.808081 0.617386 0.898990 0.818182 0.613866 0.898990 0.828283 0.610346 0.898990 0.838384 0.606826 0.898990 0.848485 0.603306 0.898990 0.858586 0.599786 0.898990 0.868687 0.596266 0.898990 0.878788 0.592746 0.898990 0.888889 0.589226 0.898990 0.898990 0.585706 0.898990 0.909091 0.582185 0.898990 0.919192 0.578665 0.898990 0.929293 0.575145 0.898990 0.939394 0.571625 0.898990 0.949495 0.568105 0.898990 0.959596 0.564585 0.898990 0.969697 0.561065 0.898990 0.979798 0.557545 0.898990 0.989899 0.554025 0.898990 1.000000 0.550505 0.909091 0.000000 0.909091 0.909091 0.010101 0.905418 0.909091 0.020202 0.901745 0.909091 0.030303 0.898072 0.909091 0.040404 0.894399 0.909091 0.050505 0.890725 0.909091 0.060606 0.887052 0.909091 0.070707 0.883379 0.909091 0.080808 0.879706 0.909091 0.090909 0.876033 0.909091 0.101010 0.872360 0.909091 0.111111 0.868687 0.909091 0.121212 0.865014 0.909091 0.131313 0.861341 0.909091 0.141414 0.857668 0.909091 0.151515 0.853994 0.909091 0.161616 0.850321 0.909091 0.171717 0.846648 0.909091 0.181818 0.842975 0.909091 0.191919 0.839302 0.909091 0.202020 0.835629 0.909091 0.212121 0.831956 0.909091 0.222222 0.828283 0.909091 0.232323 0.824610 0.909091 0.242424 0.820937 0.909091 0.252525 0.817264 0.909091 0.262626 0.813590 0.909091 0.272727 0.809917 0.909091 0.282828 0.806244 0.909091 0.292929 0.802571 0.909091 0.303030 0.798898 0.909091 0.313131 0.795225 0.909091 0.323232 0.791552 0.909091 0.333333 0.787879 0.909091 0.343434 0.784206 0.909091 0.353535 0.780533 0.909091 0.363636 0.776860 0.909091 0.373737 0.773186 0.909091 0.383838 0.769513 0.909091 0.393939 0.765840 0.909091 0.404040 0.762167 0.909091 0.414141 0.758494 0.909091 0.424242 0.754821 0.909091 0.434343 0.751148 0.909091 0.444444 0.747475 0.909091 0.454545 0.743802 0.909091 0.464646 0.740129 0.909091 0.474747 0.736455 0.909091 0.484848 0.732782 0.909091 0.494949 0.729109 0.909091 0.505051 0.725436 0.909091 0.515152 0.721763 0.909091 0.525253 0.718090 0.909091 0.535354 0.714417 0.909091 0.545455 0.710744 0.909091 0.555556 0.707071 0.909091 0.565657 0.703398 0.909091 0.575758 0.699725 0.909091 0.585859 0.696051 0.909091 0.595960 0.692378 0.909091 0.606061 0.688705 0.909091 0.616162 0.685032 0.909091 0.626263 0.681359 0.909091 0.636364 0.677686 0.909091 0.646465 0.674013 0.909091 0.656566 0.670340 0.909091 0.666667 0.666667 0.909091 0.676768 0.662994 0.909091 0.686869 0.659320 0.909091 0.696970 0.655647 0.909091 0.707071 0.651974 0.909091 0.717172 0.648301 0.909091 0.727273 0.644628 0.909091 0.737374 0.640955 0.909091 0.747475 0.637282 0.909091 0.757576 0.633609 0.909091 0.767677 0.629936 0.909091 0.777778 0.626263 0.909091 0.787879 0.622590 0.909091 0.797980 0.618916 0.909091 0.808081 0.615243 0.909091 0.818182 0.611570 0.909091 0.828283 0.607897 0.909091 0.838384 0.604224 0.909091 0.848485 0.600551 0.909091 0.858586 0.596878 0.909091 0.868687 0.593205 0.909091 0.878788 0.589532 0.909091 0.888889 0.585859 0.909091 0.898990 0.582185 0.909091 0.909091 0.578512 0.909091 0.919192 0.574839 0.909091 0.929293 0.571166 0.909091 0.939394 0.567493 0.909091 0.949495 0.563820 0.909091 0.959596 0.560147 0.909091 0.969697 0.556474 0.909091 0.979798 0.552801 0.909091 0.989899 0.549128 0.909091 1.000000 0.545455 0.919192 0.000000 0.919192 0.919192 0.010101 0.915366 0.919192 0.020202 0.911540 0.919192 0.030303 0.907713 0.919192 0.040404 0.903887 0.919192 0.050505 0.900061 0.919192 0.060606 0.896235 0.919192 0.070707 0.892409 0.919192 0.080808 0.888583 0.919192 0.090909 0.884757 0.919192 0.101010 0.880931 0.919192 0.111111 0.877104 0.919192 0.121212 0.873278 0.919192 0.131313 0.869452 0.919192 0.141414 0.865626 0.919192 0.151515 0.861800 0.919192 0.161616 0.857974 0.919192 0.171717 0.854148 0.919192 0.181818 0.850321 0.919192 0.191919 0.846495 0.919192 0.202020 0.842669 0.919192 0.212121 0.838843 0.919192 0.222222 0.835017 0.919192 0.232323 0.831191 0.919192 0.242424 0.827365 0.919192 0.252525 0.823538 0.919192 0.262626 0.819712 0.919192 0.272727 0.815886 0.919192 0.282828 0.812060 0.919192 0.292929 0.808234 0.919192 0.303030 0.804408 0.919192 0.313131 0.800582 0.919192 0.323232 0.796755 0.919192 0.333333 0.792929 0.919192 0.343434 0.789103 0.919192 0.353535 0.785277 0.919192 0.363636 0.781451 0.919192 0.373737 0.777625 0.919192 0.383838 0.773799 0.919192 0.393939 0.769972 0.919192 0.404040 0.766146 0.919192 0.414141 0.762320 0.919192 0.424242 0.758494 0.919192 0.434343 0.754668 0.919192 0.444444 0.750842 0.919192 0.454545 0.747016 0.919192 0.464646 0.743189 0.919192 0.474747 0.739363 0.919192 0.484848 0.735537 0.919192 0.494949 0.731711 0.919192 0.505051 0.727885 0.919192 0.515152 0.724059 0.919192 0.525253 0.720233 0.919192 0.535354 0.716406 0.919192 0.545455 0.712580 0.919192 0.555556 0.708754 0.919192 0.565657 0.704928 0.919192 0.575758 0.701102 0.919192 0.585859 0.697276 0.919192 0.595960 0.693450 0.919192 0.606061 0.689624 0.919192 0.616162 0.685797 0.919192 0.626263 0.681971 0.919192 0.636364 0.678145 0.919192 0.646465 0.674319 0.919192 0.656566 0.670493 0.919192 0.666667 0.666667 0.919192 0.676768 0.662841 0.919192 0.686869 0.659014 0.919192 0.696970 0.655188 0.919192 0.707071 0.651362 0.919192 0.717172 0.647536 0.919192 0.727273 0.643710 0.919192 0.737374 0.639884 0.919192 0.747475 0.636058 0.919192 0.757576 0.632231 0.919192 0.767677 0.628405 0.919192 0.777778 0.624579 0.919192 0.787879 0.620753 0.919192 0.797980 0.616927 0.919192 0.808081 0.613101 0.919192 0.818182 0.609275 0.919192 0.828283 0.605448 0.919192 0.838384 0.601622 0.919192 0.848485 0.597796 0.919192 0.858586 0.593970 0.919192 0.868687 0.590144 0.919192 0.878788 0.586318 0.919192 0.888889 0.582492 0.919192 0.898990 0.578665 0.919192 0.909091 0.574839 0.919192 0.919192 0.571013 0.919192 0.929293 0.567187 0.919192 0.939394 0.563361 0.919192 0.949495 0.559535 0.919192 0.959596 0.555709 0.919192 0.969697 0.551882 0.919192 0.979798 0.548056 0.919192 0.989899 0.544230 0.919192 1.000000 0.540404 0.929293 0.000000 0.929293 0.929293 0.010101 0.925314 0.929293 0.020202 0.921335 0.929293 0.030303 0.917355 0.929293 0.040404 0.913376 0.929293 0.050505 0.909397 0.929293 0.060606 0.905418 0.929293 0.070707 0.901439 0.929293 0.080808 0.897459 0.929293 0.090909 0.893480 0.929293 0.101010 0.889501 0.929293 0.111111 0.885522 0.929293 0.121212 0.881543 0.929293 0.131313 0.877564 0.929293 0.141414 0.873584 0.929293 0.151515 0.869605 0.929293 0.161616 0.865626 0.929293 0.171717 0.861647 0.929293 0.181818 0.857668 0.929293 0.191919 0.853688 0.929293 0.202020 0.849709 0.929293 0.212121 0.845730 0.929293 0.222222 0.841751 0.929293 0.232323 0.837772 0.929293 0.242424 0.833792 0.929293 0.252525 0.829813 0.929293 0.262626 0.825834 0.929293 0.272727 0.821855 0.929293 0.282828 0.817876 0.929293 0.292929 0.813897 0.929293 0.303030 0.809917 0.929293 0.313131 0.805938 0.929293 0.323232 0.801959 0.929293 0.333333 0.797980 0.929293 0.343434 0.794001 0.929293 0.353535 0.790021 0.929293 0.363636 0.786042 0.929293 0.373737 0.782063 0.929293 0.383838 0.778084 0.929293 0.393939 0.774105 0.929293 0.404040 0.770125 0.929293 0.414141 0.766146 0.929293 0.424242 0.762167 0.929293 0.434343 0.758188 0.929293 0.444444 0.754209 0.929293 0.454545 0.750230 0.929293 0.464646 0.746250 0.929293 0.474747 0.742271 0.929293 0.484848 0.738292 0.929293 0.494949 0.734313 0.929293 0.505051 0.730334 0.929293 0.515152 0.726354 0.929293 0.525253 0.722375 0.929293 0.535354 0.718396 0.929293 0.545455 0.714417 0.929293 0.555556 0.710438 0.929293 0.565657 0.706459 0.929293 0.575758 0.702479 0.929293 0.585859 0.698500 0.929293 0.595960 0.694521 0.929293 0.606061 0.690542 0.929293 0.616162 0.686563 0.929293 0.626263 0.682583 0.929293 0.636364 0.678604 0.929293 0.646465 0.674625 0.929293 0.656566 0.670646 0.929293 0.666667 0.666667 0.929293 0.676768 0.662687 0.929293 0.686869 0.658708 0.929293 0.696970 0.654729 0.929293 0.707071 0.650750 0.929293 0.717172 0.646771 0.929293 0.727273 0.642792 0.929293 0.737374 0.638812 0.929293 0.747475 0.634833 0.929293 0.757576 0.630854 0.929293 0.767677 0.626875 0.929293 0.777778 0.622896 0.929293 0.787879 0.618916 0.929293 0.797980 0.614937 0.929293 0.808081 0.610958 0.929293 0.818182 0.606979 0.929293 0.828283 0.603000 0.929293 0.838384 0.599021 0.929293 0.848485 0.595041 0.929293 0.858586 0.591062 0.929293 0.868687 0.587083 0.929293 0.878788 0.583104 0.929293 0.888889 0.579125 0.929293 0.898990 0.575145 0.929293 0.909091 0.571166 0.929293 0.919192 0.567187 0.929293 0.929293 0.563208 0.929293 0.939394 0.559229 0.929293 0.949495 0.555249 0.929293 0.959596 0.551270 0.929293 0.969697 0.547291 0.929293 0.979798 0.543312 0.929293 0.989899 0.539333 0.929293 1.000000 0.535354 0.939394 0.000000 0.939394 0.939394 0.010101 0.935262 0.939394 0.020202 0.931129 0.939394 0.030303 0.926997 0.939394 0.040404 0.922865 0.939394 0.050505 0.918733 0.939394 0.060606 0.914601 0.939394 0.070707 0.910468 0.939394 0.080808 0.906336 0.939394 0.090909 0.902204 0.939394 0.101010 0.898072 0.939394 0.111111 0.893939 0.939394 0.121212 0.889807 0.939394 0.131313 0.885675 0.939394 0.141414 0.881543 0.939394 0.151515 0.877410 0.939394 0.161616 0.873278 0.939394 0.171717 0.869146 0.939394 0.181818 0.865014 0.939394 0.191919 0.860882 0.939394 0.202020 0.856749 0.939394 0.212121 0.852617 0.939394 0.222222 0.848485 0.939394 0.232323 0.844353 0.939394 0.242424 0.840220 0.939394 0.252525 0.836088 0.939394 0.262626 0.831956 0.939394 0.272727 0.827824 0.939394 0.282828 0.823691 0.939394 0.292929 0.819559 0.939394 0.303030 0.815427 0.939394 0.313131 0.811295 0.939394 0.323232 0.807163 0.939394 0.333333 0.803030 0.939394 0.343434 0.798898 0.939394 0.353535 0.794766 0.939394 0.363636 0.790634 0.939394 0.373737 0.786501 0.939394 0.383838 0.782369 0.939394 0.393939 0.778237 0.939394 0.404040 0.774105 0.939394 0.414141 0.769972 0.939394 0.424242 0.765840 0.939394 0.434343 0.761708 0.939394 0.444444 0.757576 0.939394 0.454545 0.753444 0.939394 0.464646 0.749311 0.939394 0.474747 0.745179 0.939394 0.484848 0.741047 0.939394 0.494949 0.736915 0.939394 0.505051 0.732782 0.939394 0.515152 0.728650 0.939394 0.525253 0.724518 0.939394 0.535354 0.720386 0.939394 0.545455 0.716253 0.939394 0.555556 0.712121 0.939394 0.565657 0.707989 0.939394 0.575758 0.703857 0.939394 0.585859 0.699725 0.939394 0.595960 0.695592 0.939394 0.606061 0.691460 0.939394 0.616162 0.687328 0.939394 0.626263 0.683196 0.939394 0.636364 0.679063 0.939394 0.646465 0.674931 0.939394 0.656566 0.670799 0.939394 0.666667 0.666667 0.939394 0.676768 0.662534 0.939394 0.686869 0.658402 0.939394 0.696970 0.654270 0.939394 0.707071 0.650138 0.939394 0.717172 0.646006 0.939394 0.727273 0.641873 0.939394 0.737374 0.637741 0.939394 0.747475 0.633609 0.939394 0.757576 0.629477 0.939394 0.767677 0.625344 0.939394 0.777778 0.621212 0.939394 0.787879 0.617080 0.939394 0.797980 0.612948 0.939394 0.808081 0.608815 0.939394 0.818182 0.604683 0.939394 0.828283 0.600551 0.939394 0.838384 0.596419 0.939394 0.848485 0.592287 0.939394 0.858586 0.588154 0.939394 0.868687 0.584022 0.939394 0.878788 0.579890 0.939394 0.888889 0.575758 0.939394 0.898990 0.571625 0.939394 0.909091 0.567493 0.939394 0.919192 0.563361 0.939394 0.929293 0.559229 0.939394 0.939394 0.555096 0.939394 0.949495 0.550964 0.939394 0.959596 0.546832 0.939394 0.969697 0.542700 0.939394 0.979798 0.538567 0.939394 0.989899 0.534435 0.939394 1.000000 0.530303 0.949495 0.000000 0.949495 0.949495 0.010101 0.945210 0.949495 0.020202 0.940924 0.949495 0.030303 0.936639 0.949495 0.040404 0.932354 0.949495 0.050505 0.928069 0.949495 0.060606 0.923783 0.949495 0.070707 0.919498 0.949495 0.080808 0.915213 0.949495 0.090909 0.910927 0.949495 0.101010 0.906642 0.949495 0.111111 0.902357 0.949495 0.121212 0.898072 0.949495 0.131313 0.893786 0.949495 0.141414 0.889501 0.949495 0.151515 0.885216 0.949495 0.161616 0.880931 0.949495 0.171717 0.876645 0.949495 0.181818 0.872360 0.949495 0.191919 0.868075 0.949495 0.202020 0.863789 0.949495 0.212121 0.859504 0.949495 0.222222 0.855219 0.949495 0.232323 0.850934 0.949495 0.242424 0.846648 0.949495 0.252525 0.842363 0.949495 0.262626 0.838078 0.949495 0.272727 0.833792 0.949495 0.282828 0.829507 0.949495 0.292929 0.825222 0.949495 0.303030 0.820937 0.949495 0.313131 0.816651 0.949495 0.323232 0.812366 0.949495 0.333333 0.808081 0.949495 0.343434 0.803796 0.949495 0.353535 0.799510 0.949495 0.363636 0.795225 0.949495 0.373737 0.790940 0.949495 0.383838 0.786654 0.949495 0.393939 0.782369 0.949495 0.404040 0.778084 0.949495 0.414141 0.773799 0.949495 0.424242 0.769513 0.949495 0.434343 0.765228 0.949495 0.444444 0.760943 0.949495 0.454545 0.756657 0.949495 0.464646 0.752372 0.949495 0.474747 0.748087 0.949495 0.484848 0.743802 0.949495 0.494949 0.739516 0.949495 0.505051 0.735231 0.949495 0.515152 0.730946 0.949495 0.525253 0.726661 0.949495 0.535354 0.722375 0.949495 0.545455 0.718090 0.949495 0.555556 0.713805 0.949495 0.565657 0.709519 0.949495 0.575758 0.705234 0.949495 0.585859 0.700949 0.949495 0.595960 0.696664 0.949495 0.606061 0.692378 0.949495 0.616162 0.688093 0.949495 0.626263 0.683808 0.949495 0.636364 0.679522 0.949495 0.646465 0.675237 0.949495 0.656566 0.670952 0.949495 0.666667 0.666667 0.949495 0.676768 0.662381 0.949495 0.686869 0.658096 0.949495 0.696970 0.653811 0.949495 0.707071 0.649526 0.949495 0.717172 0.645240 0.949495 0.727273 0.640955 0.949495 0.737374 0.636670 0.949495 0.747475 0.632384 0.949495 0.757576 0.628099 0.949495 0.767677 0.623814 0.949495 0.777778 0.619529 0.949495 0.787879 0.615243 0.949495 0.797980 0.610958 0.949495 0.808081 0.606673 0.949495 0.818182 0.602388 0.949495 0.828283 0.598102 0.949495 0.838384 0.593817 0.949495 0.848485 0.589532 0.949495 0.858586 0.585246 0.949495 0.868687 0.580961 0.949495 0.878788 0.576676 0.949495 0.888889 0.572391 0.949495 0.898990 0.568105 0.949495 0.909091 0.563820 0.949495 0.919192 0.559535 0.949495 0.929293 0.555249 0.949495 0.939394 0.550964 0.949495 0.949495 0.546679 0.949495 0.959596 0.542394 0.949495 0.969697 0.538108 0.949495 0.979798 0.533823 0.949495 0.989899 0.529538 0.949495 1.000000 0.525253 0.959596 0.000000 0.959596 0.959596 0.010101 0.955158 0.959596 0.020202 0.950719 0.959596 0.030303 0.946281 0.959596 0.040404 0.941843 0.959596 0.050505 0.937404 0.959596 0.060606 0.932966 0.959596 0.070707 0.928528 0.959596 0.080808 0.924089 0.959596 0.090909 0.919651 0.959596 0.101010 0.915213 0.959596 0.111111 0.910774 0.959596 0.121212 0.906336 0.959596 0.131313 0.901898 0.959596 0.141414 0.897459 0.959596 0.151515 0.893021 0.959596 0.161616 0.888583 0.959596 0.171717 0.884144 0.959596 0.181818 0.879706 0.959596 0.191919 0.875268 0.959596 0.202020 0.870830 0.959596 0.212121 0.866391 0.959596 0.222222 0.861953 0.959596 0.232323 0.857515 0.959596 0.242424 0.853076 0.959596 0.252525 0.848638 0.959596 0.262626 0.844200 0.959596 0.272727 0.839761 0.959596 0.282828 0.835323 0.959596 0.292929 0.830885 0.959596 0.303030 0.826446 0.959596 0.313131 0.822008 0.959596 0.323232 0.817570 0.959596 0.333333 0.813131 0.959596 0.343434 0.808693 0.959596 0.353535 0.804255 0.959596 0.363636 0.799816 0.959596 0.373737 0.795378 0.959596 0.383838 0.790940 0.959596 0.393939 0.786501 0.959596 0.404040 0.782063 0.959596 0.414141 0.777625 0.959596 0.424242 0.773186 0.959596 0.434343 0.768748 0.959596 0.444444 0.764310 0.959596 0.454545 0.759871 0.959596 0.464646 0.755433 0.959596 0.474747 0.750995 0.959596 0.484848 0.746556 0.959596 0.494949 0.742118 0.959596 0.505051 0.737680 0.959596 0.515152 0.733242 0.959596 0.525253 0.728803 0.959596 0.535354 0.724365 0.959596 0.545455 0.719927 0.959596 0.555556 0.715488 0.959596 0.565657 0.711050 0.959596 0.575758 0.706612 0.959596 0.585859 0.702173 0.959596 0.595960 0.697735 0.959596 0.606061 0.693297 0.959596 0.616162 0.688858 0.959596 0.626263 0.684420 0.959596 0.636364 0.679982 0.959596 0.646465 0.675543 0.959596 0.656566 0.671105 0.959596 0.666667 0.666667 0.959596 0.676768 0.662228 0.959596 0.686869 0.657790 0.959596 0.696970 0.653352 0.959596 0.707071 0.648913 0.959596 0.717172 0.644475 0.959596 0.727273 0.640037 0.959596 0.737374 0.635598 0.959596 0.747475 0.631160 0.959596 0.757576 0.626722 0.959596 0.767677 0.622283 0.959596 0.777778 0.617845 0.959596 0.787879 0.613407 0.959596 0.797980 0.608968 0.959596 0.808081 0.604530 0.959596 0.818182 0.600092 0.959596 0.828283 0.595654 0.959596 0.838384 0.591215 0.959596 0.848485 0.586777 0.959596 0.858586 0.582339 0.959596 0.868687 0.577900 0.959596 0.878788 0.573462 0.959596 0.888889 0.569024 0.959596 0.898990 0.564585 0.959596 0.909091 0.560147 0.959596 0.919192 0.555709 0.959596 0.929293 0.551270 0.959596 0.939394 0.546832 0.959596 0.949495 0.542394 0.959596 0.959596 0.537955 0.959596 0.969697 0.533517 0.959596 0.979798 0.529079 0.959596 0.989899 0.524640 0.959596 1.000000 0.520202 0.969697 0.000000 0.969697 0.969697 0.010101 0.965106 0.969697 0.020202 0.960514 0.969697 0.030303 0.955923 0.969697 0.040404 0.951331 0.969697 0.050505 0.946740 0.969697 0.060606 0.942149 0.969697 0.070707 0.937557 0.969697 0.080808 0.932966 0.969697 0.090909 0.928375 0.969697 0.101010 0.923783 0.969697 0.111111 0.919192 0.969697 0.121212 0.914601 0.969697 0.131313 0.910009 0.969697 0.141414 0.905418 0.969697 0.151515 0.900826 0.969697 0.161616 0.896235 0.969697 0.171717 0.891644 0.969697 0.181818 0.887052 0.969697 0.191919 0.882461 0.969697 0.202020 0.877870 0.969697 0.212121 0.873278 0.969697 0.222222 0.868687 0.969697 0.232323 0.864096 0.969697 0.242424 0.859504 0.969697 0.252525 0.854913 0.969697 0.262626 0.850321 0.969697 0.272727 0.845730 0.969697 0.282828 0.841139 0.969697 0.292929 0.836547 0.969697 0.303030 0.831956 0.969697 0.313131 0.827365 0.969697 0.323232 0.822773 0.969697 0.333333 0.818182 0.969697 0.343434 0.813590 0.969697 0.353535 0.808999 0.969697 0.363636 0.804408 0.969697 0.373737 0.799816 0.969697 0.383838 0.795225 0.969697 0.393939 0.790634 0.969697 0.404040 0.786042 0.969697 0.414141 0.781451 0.969697 0.424242 0.776860 0.969697 0.434343 0.772268 0.969697 0.444444 0.767677 0.969697 0.454545 0.763085 0.969697 0.464646 0.758494 0.969697 0.474747 0.753903 0.969697 0.484848 0.749311 0.969697 0.494949 0.744720 0.969697 0.505051 0.740129 0.969697 0.515152 0.735537 0.969697 0.525253 0.730946 0.969697 0.535354 0.726354 0.969697 0.545455 0.721763 0.969697 0.555556 0.717172 0.969697 0.565657 0.712580 0.969697 0.575758 0.707989 0.969697 0.585859 0.703398 0.969697 0.595960 0.698806 0.969697 0.606061 0.694215 0.969697 0.616162 0.689624 0.969697 0.626263 0.685032 0.969697 0.636364 0.680441 0.969697 0.646465 0.675849 0.969697 0.656566 0.671258 0.969697 0.666667 0.666667 0.969697 0.676768 0.662075 0.969697 0.686869 0.657484 0.969697 0.696970 0.652893 0.969697 0.707071 0.648301 0.969697 0.717172 0.643710 0.969697 0.727273 0.639118 0.969697 0.737374 0.634527 0.969697 0.747475 0.629936 0.969697 0.757576 0.625344 0.969697 0.767677 0.620753 0.969697 0.777778 0.616162 0.969697 0.787879 0.611570 0.969697 0.797980 0.606979 0.969697 0.808081 0.602388 0.969697 0.818182 0.597796 0.969697 0.828283 0.593205 0.969697 0.838384 0.588613 0.969697 0.848485 0.584022 0.969697 0.858586 0.579431 0.969697 0.868687 0.574839 0.969697 0.878788 0.570248 0.969697 0.888889 0.565657 0.969697 0.898990 0.561065 0.969697 0.909091 0.556474 0.969697 0.919192 0.551882 0.969697 0.929293 0.547291 0.969697 0.939394 0.542700 0.969697 0.949495 0.538108 0.969697 0.959596 0.533517 0.969697 0.969697 0.528926 0.969697 0.979798 0.524334 0.969697 0.989899 0.519743 0.969697 1.000000 0.515152 0.979798 0.000000 0.979798 0.979798 0.010101 0.975054 0.979798 0.020202 0.970309 0.979798 0.030303 0.965565 0.979798 0.040404 0.960820 0.979798 0.050505 0.956076 0.979798 0.060606 0.951331 0.979798 0.070707 0.946587 0.979798 0.080808 0.941843 0.979798 0.090909 0.937098 0.979798 0.101010 0.932354 0.979798 0.111111 0.927609 0.979798 0.121212 0.922865 0.979798 0.131313 0.918121 0.979798 0.141414 0.913376 0.979798 0.151515 0.908632 0.979798 0.161616 0.903887 0.979798 0.171717 0.899143 0.979798 0.181818 0.894399 0.979798 0.191919 0.889654 0.979798 0.202020 0.884910 0.979798 0.212121 0.880165 0.979798 0.222222 0.875421 0.979798 0.232323 0.870676 0.979798 0.242424 0.865932 0.979798 0.252525 0.861188 0.979798 0.262626 0.856443 0.979798 0.272727 0.851699 0.979798 0.282828 0.846954 0.979798 0.292929 0.842210 0.979798 0.303030 0.837466 0.979798 0.313131 0.832721 0.979798 0.323232 0.827977 0.979798 0.333333 0.823232 0.979798 0.343434 0.818488 0.979798 0.353535 0.813743 0.979798 0.363636 0.808999 0.979798 0.373737 0.804255 0.979798 0.383838 0.799510 0.979798 0.393939 0.794766 0.979798 0.404040 0.790021 0.979798 0.414141 0.785277 0.979798 0.424242 0.780533 0.979798 0.434343 0.775788 0.979798 0.444444 0.771044 0.979798 0.454545 0.766299 0.979798 0.464646 0.761555 0.979798 0.474747 0.756811 0.979798 0.484848 0.752066 0.979798 0.494949 0.747322 0.979798 0.505051 0.742577 0.979798 0.515152 0.737833 0.979798 0.525253 0.733088 0.979798 0.535354 0.728344 0.979798 0.545455 0.723600 0.979798 0.555556 0.718855 0.979798 0.565657 0.714111 0.979798 0.575758 0.709366 0.979798 0.585859 0.704622 0.979798 0.595960 0.699878 0.979798 0.606061 0.695133 0.979798 0.616162 0.690389 0.979798 0.626263 0.685644 0.979798 0.636364 0.680900 0.979798 0.646465 0.676155 0.979798 0.656566 0.671411 0.979798 0.666667 0.666667 0.979798 0.676768 0.661922 0.979798 0.686869 0.657178 0.979798 0.696970 0.652433 0.979798 0.707071 0.647689 0.979798 0.717172 0.642945 0.979798 0.727273 0.638200 0.979798 0.737374 0.633456 0.979798 0.747475 0.628711 0.979798 0.757576 0.623967 0.979798 0.767677 0.619223 0.979798 0.777778 0.614478 0.979798 0.787879 0.609734 0.979798 0.797980 0.604989 0.979798 0.808081 0.600245 0.979798 0.818182 0.595500 0.979798 0.828283 0.590756 0.979798 0.838384 0.586012 0.979798 0.848485 0.581267 0.979798 0.858586 0.576523 0.979798 0.868687 0.571778 0.979798 0.878788 0.567034 0.979798 0.888889 0.562290 0.979798 0.898990 0.557545 0.979798 0.909091 0.552801 0.979798 0.919192 0.548056 0.979798 0.929293 0.543312 0.979798 0.939394 0.538567 0.979798 0.949495 0.533823 0.979798 0.959596 0.529079 0.979798 0.969697 0.524334 0.979798 0.979798 0.519590 0.979798 0.989899 0.514845 0.979798 1.000000 0.510101 0.989899 0.000000 0.989899 0.989899 0.010101 0.985002 0.989899 0.020202 0.980104 0.989899 0.030303 0.975207 0.989899 0.040404 0.970309 0.989899 0.050505 0.965412 0.989899 0.060606 0.960514 0.989899 0.070707 0.955617 0.989899 0.080808 0.950719 0.989899 0.090909 0.945822 0.989899 0.101010 0.940924 0.989899 0.111111 0.936027 0.989899 0.121212 0.931129 0.989899 0.131313 0.926232 0.989899 0.141414 0.921335 0.989899 0.151515 0.916437 0.989899 0.161616 0.911540 0.989899 0.171717 0.906642 0.989899 0.181818 0.901745 0.989899 0.191919 0.896847 0.989899 0.202020 0.891950 0.989899 0.212121 0.887052 0.989899 0.222222 0.882155 0.989899 0.232323 0.877257 0.989899 0.242424 0.872360 0.989899 0.252525 0.867463 0.989899 0.262626 0.862565 0.989899 0.272727 0.857668 0.989899 0.282828 0.852770 0.989899 0.292929 0.847873 0.989899 0.303030 0.842975 0.989899 0.313131 0.838078 0.989899 0.323232 0.833180 0.989899 0.333333 0.828283 0.989899 0.343434 0.823385 0.989899 0.353535 0.818488 0.989899 0.363636 0.813590 0.989899 0.373737 0.808693 0.989899 0.383838 0.803796 0.989899 0.393939 0.798898 0.989899 0.404040 0.794001 0.989899 0.414141 0.789103 0.989899 0.424242 0.784206 0.989899 0.434343 0.779308 0.989899 0.444444 0.774411 0.989899 0.454545 0.769513 0.989899 0.464646 0.764616 0.989899 0.474747 0.759718 0.989899 0.484848 0.754821 0.989899 0.494949 0.749923 0.989899 0.505051 0.745026 0.989899 0.515152 0.740129 0.989899 0.525253 0.735231 0.989899 0.535354 0.730334 0.989899 0.545455 0.725436 0.989899 0.555556 0.720539 0.989899 0.565657 0.715641 0.989899 0.575758 0.710744 0.989899 0.585859 0.705846 0.989899 0.595960 0.700949 0.989899 0.606061 0.696051 0.989899 0.616162 0.691154 0.989899 0.626263 0.686257 0.989899 0.636364 0.681359 0.989899 0.646465 0.676462 0.989899 0.656566 0.671564 0.989899 0.666667 0.666667 0.989899 0.676768 0.661769 0.989899 0.686869 0.656872 0.989899 0.696970 0.651974 0.989899 0.707071 0.647077 0.989899 0.717172 0.642179 0.989899 0.727273 0.637282 0.989899 0.737374 0.632384 0.989899 0.747475 0.627487 0.989899 0.757576 0.622590 0.989899 0.767677 0.617692 0.989899 0.777778 0.612795 0.989899 0.787879 0.607897 0.989899 0.797980 0.603000 0.989899 0.808081 0.598102 0.989899 0.818182 0.593205 0.989899 0.828283 0.588307 0.989899 0.838384 0.583410 0.989899 0.848485 0.578512 0.989899 0.858586 0.573615 0.989899 0.868687 0.568717 0.989899 0.878788 0.563820 0.989899 0.888889 0.558923 0.989899 0.898990 0.554025 0.989899 0.909091 0.549128 0.989899 0.919192 0.544230 0.989899 0.929293 0.539333 0.989899 0.939394 0.534435 0.989899 0.949495 0.529538 0.989899 0.959596 0.524640 0.989899 0.969697 0.519743 0.989899 0.979798 0.514845 0.989899 0.989899 0.509948 0.989899 1.000000 0.505051 1.000000 0.000000 1.000000 1.000000 0.010101 0.994949 1.000000 0.020202 0.989899 1.000000 0.030303 0.984848 1.000000 0.040404 0.979798 1.000000 0.050505 0.974747 1.000000 0.060606 0.969697 1.000000 0.070707 0.964646 1.000000 0.080808 0.959596 1.000000 0.090909 0.954545 1.000000 0.101010 0.949495 1.000000 0.111111 0.944444 1.000000 0.121212 0.939394 1.000000 0.131313 0.934343 1.000000 0.141414 0.929293 1.000000 0.151515 0.924242 1.000000 0.161616 0.919192 1.000000 0.171717 0.914141 1.000000 0.181818 0.909091 1.000000 0.191919 0.904040 1.000000 0.202020 0.898990 1.000000 0.212121 0.893939 1.000000 0.222222 0.888889 1.000000 0.232323 0.883838 1.000000 0.242424 0.878788 1.000000 0.252525 0.873737 1.000000 0.262626 0.868687 1.000000 0.272727 0.863636 1.000000 0.282828 0.858586 1.000000 0.292929 0.853535 1.000000 0.303030 0.848485 1.000000 0.313131 0.843434 1.000000 0.323232 0.838384 1.000000 0.333333 0.833333 1.000000 0.343434 0.828283 1.000000 0.353535 0.823232 1.000000 0.363636 0.818182 1.000000 0.373737 0.813131 1.000000 0.383838 0.808081 1.000000 0.393939 0.803030 1.000000 0.404040 0.797980 1.000000 0.414141 0.792929 1.000000 0.424242 0.787879 1.000000 0.434343 0.782828 1.000000 0.444444 0.777778 1.000000 0.454545 0.772727 1.000000 0.464646 0.767677 1.000000 0.474747 0.762626 1.000000 0.484848 0.757576 1.000000 0.494949 0.752525 1.000000 0.505051 0.747475 1.000000 0.515152 0.742424 1.000000 0.525253 0.737374 1.000000 0.535354 0.732323 1.000000 0.545455 0.727273 1.000000 0.555556 0.722222 1.000000 0.565657 0.717172 1.000000 0.575758 0.712121 1.000000 0.585859 0.707071 1.000000 0.595960 0.702020 1.000000 0.606061 0.696970 1.000000 0.616162 0.691919 1.000000 0.626263 0.686869 1.000000 0.636364 0.681818 1.000000 0.646465 0.676768 1.000000 0.656566 0.671717 1.000000 0.666667 0.666667 1.000000 0.676768 0.661616 1.000000 0.686869 0.656566 1.000000 0.696970 0.651515 1.000000 0.707071 0.646465 1.000000 0.717172 0.641414 1.000000 0.727273 0.636364 1.000000 0.737374 0.631313 1.000000 0.747475 0.626263 1.000000 0.757576 0.621212 1.000000 0.767677 0.616162 1.000000 0.777778 0.611111 1.000000 0.787879 0.606061 1.000000 0.797980 0.601010 1.000000 0.808081 0.595960 1.000000 0.818182 0.590909 1.000000 0.828283 0.585859 1.000000 0.838384 0.580808 1.000000 0.848485 0.575758 1.000000 0.858586 0.570707 1.000000 0.868687 0.565657 1.000000 0.878788 0.560606 1.000000 0.888889 0.555556 1.000000 0.898990 0.550505 1.000000 0.909091 0.545455 1.000000 0.919192 0.540404 1.000000 0.929293 0.535354 1.000000 0.939394 0.530303 1.000000 0.949495 0.525253 1.000000 0.959596 0.520202 1.000000 0.969697 0.515152 1.000000 0.979798 0.510101 1.000000 0.989899 0.505051 1.000000 1.000000 0.500000 gsl-doc-2.3/doc/examples/bspline.txt0000664000175000017500000001473512620432462015555 0ustar eddedd#m=0,S=0 0.000000 1.013392 0.075377 0.980953 0.150754 1.136930 0.226131 1.022649 0.301508 1.018952 0.376884 0.781034 0.452261 0.653645 0.527638 0.763919 0.603015 0.772400 0.678392 0.792524 0.753769 0.674983 0.829146 0.541142 0.904523 0.526895 0.979899 0.514283 1.055276 0.480481 1.130653 0.359657 1.206030 0.296027 1.281407 0.251224 1.356784 0.173015 1.432161 0.109840 1.507538 0.057700 1.582915 -0.009964 1.658291 -0.071887 1.733668 -0.123842 1.809045 -0.185449 1.884422 -0.257174 1.959799 -0.313225 2.035176 -0.337965 2.110553 -0.410140 2.185930 -0.532190 2.261307 -0.497535 2.336683 -0.534430 2.412060 -0.577618 2.487437 -0.461417 2.562814 -0.685286 2.638191 -0.670396 2.713568 -0.677885 2.788945 -0.760828 2.864322 -0.836176 2.939698 -0.701519 3.015075 -0.820581 3.090452 -0.864657 3.165829 -0.675148 3.241206 -0.674258 3.316583 -0.853122 3.391960 -0.627814 3.467337 -0.786064 3.542714 -0.735333 3.618090 -0.595610 3.693467 -0.570664 3.768844 -0.625037 3.844221 -0.505355 3.919598 -0.479103 3.994975 -0.476144 4.070352 -0.420115 4.145729 -0.357678 4.221106 -0.351235 4.296482 -0.263275 4.371859 -0.231913 4.447236 -0.141524 4.522613 -0.117161 4.597990 -0.074501 4.673367 -0.024253 4.748744 0.021384 4.824121 0.059326 4.899497 0.133528 4.974874 0.164376 5.050251 0.230545 5.125628 0.257040 5.201005 0.262619 5.276382 0.356921 5.351759 0.320297 5.427136 0.410395 5.502513 0.376859 5.577889 0.432169 5.653266 0.527822 5.728643 0.498471 5.804020 0.662444 5.879397 0.602791 5.954774 0.613485 6.030151 0.565095 6.105528 0.478371 6.180905 0.553815 6.256281 0.559066 6.331658 0.405827 6.407035 0.490786 6.482412 0.401802 6.557789 0.449565 6.633166 0.461542 6.708543 0.427638 6.783920 0.453343 6.859296 0.405652 6.934673 0.331105 7.010050 0.335669 7.085427 0.342361 7.160804 0.348337 7.236181 0.333673 7.311558 0.251268 7.386935 0.219000 7.462312 0.204136 7.537688 0.154734 7.613065 0.106188 7.688442 0.079925 7.763819 0.049781 7.839196 0.008202 7.914573 -0.026424 7.989950 -0.056430 8.065327 -0.081651 8.140704 -0.107899 8.216080 -0.149809 8.291457 -0.212280 8.366834 -0.184227 8.442211 -0.213536 8.517588 -0.259030 8.592965 -0.290374 8.668342 -0.377034 8.743719 -0.335464 8.819095 -0.352989 8.894472 -0.328890 8.969849 -0.429577 9.045226 -0.362269 9.120603 -0.456158 9.195980 -0.404115 9.271357 -0.351878 9.346734 -0.402716 9.422111 -0.376668 9.497487 -0.420820 9.572864 -0.429693 9.648241 -0.401090 9.723618 -0.347126 9.798995 -0.369382 9.874372 -0.314223 9.949749 -0.302814 10.025126 -0.325928 10.100503 -0.289654 10.175879 -0.252184 10.251256 -0.254930 10.326633 -0.210489 10.402010 -0.198464 10.477387 -0.182488 10.552764 -0.191308 10.628141 -0.115893 10.703518 -0.092357 10.778894 -0.086082 10.854271 -0.054768 10.929648 -0.022839 11.005025 0.003120 11.080402 0.027484 11.155779 0.039650 11.231156 0.068622 11.306533 0.098587 11.381910 0.120223 11.457286 0.139761 11.532663 0.163363 11.608040 0.192581 11.683417 0.184073 11.758794 0.212051 11.834171 0.224144 11.909548 0.241003 11.984925 0.286442 12.060302 0.226233 12.135678 0.296165 12.211055 0.247044 12.286432 0.298468 12.361809 0.293579 12.437186 0.294012 12.512563 0.306141 12.587940 0.277510 12.663317 0.285759 12.738693 0.302944 12.814070 0.257310 12.889447 0.243150 12.964824 0.218764 13.040201 0.264436 13.115578 0.221957 13.190955 0.196140 13.266332 0.228542 13.341709 0.156622 13.417085 0.192438 13.492462 0.156691 13.567839 0.144335 13.643216 0.148104 13.718593 0.117823 13.793970 0.082832 13.869347 0.062686 13.944724 0.040703 14.020101 0.026491 14.095477 0.010098 14.170854 -0.007478 14.246231 -0.029452 14.321608 -0.042866 14.396985 -0.057775 14.472362 -0.071364 14.547739 -0.098028 14.623116 -0.130422 14.698492 -0.133196 14.773869 -0.131368 14.849246 -0.152986 14.924623 -0.156311 15.000000 -0.163284 #m=1,S=0 0.000000 1.020318 0.100000 1.001004 0.200000 0.971769 0.300000 0.933425 0.400000 0.886787 0.500000 0.832667 0.600000 0.771879 0.700000 0.705235 0.800000 0.633550 0.900000 0.557635 1.000000 0.478304 1.100000 0.396370 1.200000 0.312647 1.300000 0.227948 1.400000 0.143085 1.500000 0.058872 1.600000 -0.023878 1.700000 -0.104354 1.800000 -0.181913 1.900000 -0.256170 2.000000 -0.326761 2.100000 -0.393322 2.200000 -0.455491 2.300000 -0.512905 2.400000 -0.565199 2.500000 -0.612011 2.600000 -0.652978 2.700000 -0.687736 2.800000 -0.715922 2.900000 -0.737172 3.000000 -0.751124 3.100000 -0.757414 3.200000 -0.755680 3.300000 -0.745556 3.400000 -0.726738 3.500000 -0.699577 3.600000 -0.664851 3.700000 -0.623345 3.800000 -0.575842 3.900000 -0.523128 4.000000 -0.465986 4.100000 -0.405202 4.200000 -0.341560 4.300000 -0.275845 4.400000 -0.208840 4.500000 -0.141331 4.600000 -0.074102 4.700000 -0.007938 4.800000 0.056378 4.900000 0.118059 5.000000 0.176323 5.100000 0.230505 5.200000 0.280423 5.300000 0.326019 5.400000 0.367230 5.500000 0.403998 5.600000 0.436261 5.700000 0.463960 5.800000 0.487034 5.900000 0.505422 6.000000 0.519064 6.100000 0.527901 6.200000 0.531871 6.300000 0.530914 6.400000 0.524970 6.500000 0.513979 6.600000 0.497880 6.700000 0.476616 6.800000 0.450349 6.900000 0.419577 7.000000 0.384827 7.100000 0.346626 7.200000 0.305503 7.300000 0.261983 7.400000 0.216596 7.500000 0.169867 7.600000 0.122325 7.700000 0.074497 7.800000 0.026910 7.900000 -0.019908 8.000000 -0.065431 8.100000 -0.109130 8.200000 -0.150478 8.300000 -0.188949 8.400000 -0.224041 8.500000 -0.255567 8.600000 -0.283542 8.700000 -0.307985 8.800000 -0.328913 8.900000 -0.346344 9.000000 -0.360298 9.100000 -0.370791 9.200000 -0.377843 9.300000 -0.381471 9.400000 -0.381694 9.500000 -0.378529 9.600000 -0.371996 9.700000 -0.362111 9.800000 -0.348894 9.900000 -0.332363 10.000000 -0.312535 10.100000 -0.289491 10.200000 -0.263558 10.300000 -0.235124 10.400000 -0.204580 10.500000 -0.172313 10.600000 -0.138713 10.700000 -0.104170 10.800000 -0.069070 10.900000 -0.033805 11.000000 0.001238 11.100000 0.035668 11.200000 0.069098 11.300000 0.101139 11.400000 0.131400 11.500000 0.159494 11.600000 0.185031 11.700000 0.207625 11.800000 0.227067 11.900000 0.243418 12.000000 0.256764 12.100000 0.267192 12.200000 0.274787 12.300000 0.279636 12.400000 0.281823 12.500000 0.281436 12.600000 0.278560 12.700000 0.273281 12.800000 0.265685 12.900000 0.255858 13.000000 0.243886 13.100000 0.229854 13.200000 0.213850 13.300000 0.195957 13.400000 0.176273 13.500000 0.155000 13.600000 0.132411 13.700000 0.108780 13.800000 0.084383 13.900000 0.059492 14.000000 0.034382 14.100000 0.009328 14.200000 -0.015397 14.300000 -0.039517 14.400000 -0.062760 14.500000 -0.084850 14.600000 -0.105514 14.700000 -0.124477 14.800000 -0.141465 14.900000 -0.156204 15.000000 -0.168419 gsl-doc-2.3/doc/examples/block.txt0000664000175000017500000000006512620026734015203 0ustar eddeddlength of block = 100 block data address = 0x804b0d8 gsl-doc-2.3/doc/examples/demo_fn.h0000664000175000017500000000035312616241167015134 0ustar eddeddstruct 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); gsl-doc-2.3/doc/examples/monte.c0000664000175000017500000000527012620170035014633 0ustar eddedd#include #include #include #include #include #include /* 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) { (void)(dim); /* avoid unused parameter warnings */ (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 = %.2g 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, gsl_monte_vegas_chisq (s)); } while (fabs (gsl_monte_vegas_chisq (s) - 1.0) > 0.5); display_results ("vegas final", res, err); gsl_monte_vegas_free (s); } gsl_rng_free (r); return 0; } gsl-doc-2.3/doc/examples/const.c0000664000175000017500000000110112616157443014641 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/rquantile.txt0000664000175000017500000000045312620026734016116 0ustar eddeddThe dataset is 0.00645272, 0.0074002, 0.0120706, 0.0207256, 0.0227282, ... 0.25 quartile: exact = 0.75766, estimated = 0.75580, error = -2.450209e-03 0.50 quartile: exact = 1.17508, estimated = 1.17438, error = -5.995912e-04 0.75 quartile: exact = 1.65347, estimated = 1.65696, error = 2.110571e-03 gsl-doc-2.3/doc/examples/combination.txt0000664000175000017500000000024212620026734016410 0ustar eddeddAll 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 } gsl-doc-2.3/doc/examples/qrng.c0000664000175000017500000000044412616157443014473 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/ieee.c0000664000175000017500000000057312616157443014436 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/fft.txt0000664000175000017500000001663712620431646014706 0ustar eddedd0 1.000000e+00 0.000000e+00 1 1.000000e+00 0.000000e+00 2 1.000000e+00 0.000000e+00 3 1.000000e+00 0.000000e+00 4 1.000000e+00 0.000000e+00 5 1.000000e+00 0.000000e+00 6 1.000000e+00 0.000000e+00 7 1.000000e+00 0.000000e+00 8 1.000000e+00 0.000000e+00 9 1.000000e+00 0.000000e+00 10 1.000000e+00 0.000000e+00 11 0.000000e+00 0.000000e+00 12 0.000000e+00 0.000000e+00 13 0.000000e+00 0.000000e+00 14 0.000000e+00 0.000000e+00 15 0.000000e+00 0.000000e+00 16 0.000000e+00 0.000000e+00 17 0.000000e+00 0.000000e+00 18 0.000000e+00 0.000000e+00 19 0.000000e+00 0.000000e+00 20 0.000000e+00 0.000000e+00 21 0.000000e+00 0.000000e+00 22 0.000000e+00 0.000000e+00 23 0.000000e+00 0.000000e+00 24 0.000000e+00 0.000000e+00 25 0.000000e+00 0.000000e+00 26 0.000000e+00 0.000000e+00 27 0.000000e+00 0.000000e+00 28 0.000000e+00 0.000000e+00 29 0.000000e+00 0.000000e+00 30 0.000000e+00 0.000000e+00 31 0.000000e+00 0.000000e+00 32 0.000000e+00 0.000000e+00 33 0.000000e+00 0.000000e+00 34 0.000000e+00 0.000000e+00 35 0.000000e+00 0.000000e+00 36 0.000000e+00 0.000000e+00 37 0.000000e+00 0.000000e+00 38 0.000000e+00 0.000000e+00 39 0.000000e+00 0.000000e+00 40 0.000000e+00 0.000000e+00 41 0.000000e+00 0.000000e+00 42 0.000000e+00 0.000000e+00 43 0.000000e+00 0.000000e+00 44 0.000000e+00 0.000000e+00 45 0.000000e+00 0.000000e+00 46 0.000000e+00 0.000000e+00 47 0.000000e+00 0.000000e+00 48 0.000000e+00 0.000000e+00 49 0.000000e+00 0.000000e+00 50 0.000000e+00 0.000000e+00 51 0.000000e+00 0.000000e+00 52 0.000000e+00 0.000000e+00 53 0.000000e+00 0.000000e+00 54 0.000000e+00 0.000000e+00 55 0.000000e+00 0.000000e+00 56 0.000000e+00 0.000000e+00 57 0.000000e+00 0.000000e+00 58 0.000000e+00 0.000000e+00 59 0.000000e+00 0.000000e+00 60 0.000000e+00 0.000000e+00 61 0.000000e+00 0.000000e+00 62 0.000000e+00 0.000000e+00 63 0.000000e+00 0.000000e+00 64 0.000000e+00 0.000000e+00 65 0.000000e+00 0.000000e+00 66 0.000000e+00 0.000000e+00 67 0.000000e+00 0.000000e+00 68 0.000000e+00 0.000000e+00 69 0.000000e+00 0.000000e+00 70 0.000000e+00 0.000000e+00 71 0.000000e+00 0.000000e+00 72 0.000000e+00 0.000000e+00 73 0.000000e+00 0.000000e+00 74 0.000000e+00 0.000000e+00 75 0.000000e+00 0.000000e+00 76 0.000000e+00 0.000000e+00 77 0.000000e+00 0.000000e+00 78 0.000000e+00 0.000000e+00 79 0.000000e+00 0.000000e+00 80 0.000000e+00 0.000000e+00 81 0.000000e+00 0.000000e+00 82 0.000000e+00 0.000000e+00 83 0.000000e+00 0.000000e+00 84 0.000000e+00 0.000000e+00 85 0.000000e+00 0.000000e+00 86 0.000000e+00 0.000000e+00 87 0.000000e+00 0.000000e+00 88 0.000000e+00 0.000000e+00 89 0.000000e+00 0.000000e+00 90 0.000000e+00 0.000000e+00 91 0.000000e+00 0.000000e+00 92 0.000000e+00 0.000000e+00 93 0.000000e+00 0.000000e+00 94 0.000000e+00 0.000000e+00 95 0.000000e+00 0.000000e+00 96 0.000000e+00 0.000000e+00 97 0.000000e+00 0.000000e+00 98 0.000000e+00 0.000000e+00 99 0.000000e+00 0.000000e+00 100 0.000000e+00 0.000000e+00 101 0.000000e+00 0.000000e+00 102 0.000000e+00 0.000000e+00 103 0.000000e+00 0.000000e+00 104 0.000000e+00 0.000000e+00 105 0.000000e+00 0.000000e+00 106 0.000000e+00 0.000000e+00 107 0.000000e+00 0.000000e+00 108 0.000000e+00 0.000000e+00 109 0.000000e+00 0.000000e+00 110 0.000000e+00 0.000000e+00 111 0.000000e+00 0.000000e+00 112 0.000000e+00 0.000000e+00 113 0.000000e+00 0.000000e+00 114 0.000000e+00 0.000000e+00 115 0.000000e+00 0.000000e+00 116 0.000000e+00 0.000000e+00 117 0.000000e+00 0.000000e+00 118 1.000000e+00 0.000000e+00 119 1.000000e+00 0.000000e+00 120 1.000000e+00 0.000000e+00 121 1.000000e+00 0.000000e+00 122 1.000000e+00 0.000000e+00 123 1.000000e+00 0.000000e+00 124 1.000000e+00 0.000000e+00 125 1.000000e+00 0.000000e+00 126 1.000000e+00 0.000000e+00 127 1.000000e+00 0.000000e+00 0 1.856155e+00 0.000000e+00 1 1.775235e+00 1.177569e-16 2 1.545075e+00 0.000000e+00 3 1.201145e+00 2.453269e-17 4 7.952850e-01 -4.906539e-17 5 3.863025e-01 -6.869155e-17 6 2.955767e-02 -4.906539e-18 7 -2.324518e-01 -9.813078e-18 8 -3.767087e-01 2.943923e-17 9 -4.023202e-01 -5.151866e-17 10 -3.288421e-01 -1.226635e-17 11 -1.908223e-01 -3.679904e-17 12 -2.984509e-02 -5.397193e-17 13 1.141877e-01 -1.054906e-16 14 2.107341e-01 -1.496494e-16 15 2.437478e-01 -2.526868e-16 16 2.133883e-01 9.813078e-18 17 1.341899e-01 -3.618572e-17 18 3.033355e-02 -4.906539e-18 19 -7.075117e-02 -5.887847e-17 20 -1.449419e-01 2.453269e-18 21 -1.766837e-01 -1.226635e-17 22 -1.618772e-01 -9.813078e-18 23 -1.079124e-01 1.471962e-17 24 -3.103786e-02 3.925231e-17 25 4.815112e-02 2.698596e-17 26 1.099404e-01 2.759928e-17 27 1.401760e-01 -2.943923e-17 28 1.333280e-01 7.359808e-18 29 9.330968e-02 -1.079439e-16 30 3.198024e-02 -1.557826e-16 31 -3.418842e-02 -1.711155e-16 32 -8.838835e-02 0.000000e+00 33 -1.176209e-01 1.103971e-17 34 -1.157154e-01 5.642520e-17 35 -8.454075e-02 -1.717289e-17 36 -3.319203e-02 3.679904e-17 37 2.456534e-02 -1.226635e-17 38 7.390118e-02 -5.519856e-18 39 1.026526e-01 -1.226635e-18 40 1.042612e-01 9.813078e-18 41 7.921898e-02 -1.717289e-17 42 3.471627e-02 7.359808e-18 43 -1.736727e-02 -2.207943e-17 44 -6.358048e-02 -5.397193e-17 45 -9.232361e-02 -6.133174e-17 46 -9.671760e-02 -7.114481e-17 47 -7.621953e-02 -6.133174e-17 48 -3.661165e-02 0.000000e+00 49 1.159674e-02 -3.066587e-18 50 5.592184e-02 -4.906539e-18 51 8.510068e-02 -3.679904e-18 52 9.192081e-02 -4.906539e-18 53 7.498108e-02 -2.453269e-18 54 3.895842e-02 1.962616e-17 55 -6.664175e-03 -4.906539e-18 56 -5.006798e-02 0.000000e+00 57 -8.013033e-02 -2.207943e-17 58 -8.924785e-02 1.471962e-17 59 -7.524106e-02 9.813078e-18 60 -4.186758e-02 3.925231e-17 61 2.175052e-03 5.887847e-17 62 4.549549e-02 6.869155e-17 63 7.692872e-02 7.359808e-17 64 8.838835e-02 0.000000e+00 65 7.692872e-02 -1.962616e-17 66 4.549549e-02 -1.962616e-17 67 2.175052e-03 4.906539e-18 68 -4.186758e-02 9.813078e-18 69 -7.524106e-02 9.813078e-18 70 -8.924785e-02 1.471962e-17 71 -8.013033e-02 0.000000e+00 72 -5.006798e-02 -9.813078e-18 73 -6.664175e-03 7.359808e-18 74 3.895842e-02 7.359808e-18 75 7.498108e-02 2.453269e-18 76 9.192081e-02 4.906539e-18 77 8.510068e-02 -1.226635e-17 78 5.592184e-02 -2.207943e-17 79 1.159674e-02 -5.642520e-17 80 -3.661165e-02 -9.813078e-18 81 -7.621953e-02 -3.618572e-17 82 -9.671760e-02 -2.453269e-17 83 -9.232361e-02 -2.943923e-17 84 -6.358048e-02 1.717289e-17 85 -1.736727e-02 -2.453269e-18 86 3.471627e-02 9.813078e-18 87 7.921898e-02 -4.906539e-18 88 1.042612e-01 0.000000e+00 89 1.026526e-01 -2.453269e-18 90 7.390118e-02 1.839952e-18 91 2.456534e-02 9.813078e-18 92 -3.319203e-02 -4.661212e-17 93 -8.454075e-02 9.813078e-18 94 -1.157154e-01 3.802568e-17 95 -1.176209e-01 7.298477e-17 96 -8.838835e-02 0.000000e+00 97 -3.418842e-02 -6.991818e-17 98 3.198024e-02 -7.605135e-17 99 9.330968e-02 7.359808e-18 100 1.333280e-01 -3.679904e-17 101 1.401760e-01 3.189250e-17 102 1.099404e-01 1.533293e-17 103 4.815112e-02 -4.783875e-17 104 -3.103786e-02 -2.943923e-17 105 -1.079124e-01 -2.698596e-17 106 -1.618772e-01 1.717289e-17 107 -1.766837e-01 -2.453269e-18 108 -1.449419e-01 6.378501e-17 109 -7.075117e-02 1.005840e-16 110 3.033355e-02 1.251167e-16 111 1.341899e-01 2.134344e-16 112 2.133883e-01 0.000000e+00 113 2.437478e-01 3.618572e-17 114 2.107341e-01 -4.906539e-18 115 1.141877e-01 3.311914e-17 116 -2.984509e-02 2.453269e-17 117 -1.908223e-01 -2.207943e-17 118 -3.288421e-01 3.925231e-17 119 -4.023202e-01 -2.453269e-17 120 -3.767087e-01 -3.925231e-17 121 -2.324518e-01 8.586443e-17 122 2.955767e-02 1.471962e-17 123 3.863025e-01 1.079439e-16 124 7.952850e-01 3.925231e-17 125 1.201145e+00 1.962616e-16 126 1.545075e+00 8.831770e-17 127 1.775235e+00 2.600466e-16 gsl-doc-2.3/doc/examples/stat.c0000664000175000017500000000121212616157443014471 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/ode-initval-low-level.c0000664000175000017500000000153212616300064017627 0ustar eddeddint main (void) { const gsl_odeiv2_step_type * T = gsl_odeiv2_step_rk8pd; gsl_odeiv2_step * s = gsl_odeiv2_step_alloc (T, 2); gsl_odeiv2_control * c = gsl_odeiv2_control_y_new (1e-6, 0.0); gsl_odeiv2_evolve * e = gsl_odeiv2_evolve_alloc (2); double mu = 10; gsl_odeiv2_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_odeiv2_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_odeiv2_evolve_free (e); gsl_odeiv2_control_free (c); gsl_odeiv2_step_free (s); return 0; } gsl-doc-2.3/doc/examples/permshuffle.txt0000664000175000017500000000017312620441006016422 0ustar eddeddinitial permutation: 0 1 2 3 4 5 6 7 8 9 random permutation: 0 5 4 3 7 8 6 2 1 9 inverse permutation: 0 8 7 3 2 1 6 4 5 9 gsl-doc-2.3/doc/examples/interp2d.c0000664000175000017500000000273212616157443015255 0ustar eddedd#include #include #include #include #include int main() { const gsl_interp2d_type *T = gsl_interp2d_bilinear; const size_t N = 100; /* number of points to interpolate */ const double xa[] = { 0.0, 1.0 }; /* define unit square */ const double ya[] = { 0.0, 1.0 }; const size_t nx = sizeof(xa) / sizeof(double); /* x grid points */ const size_t ny = sizeof(ya) / sizeof(double); /* y grid points */ double *za = malloc(nx * ny * sizeof(double)); gsl_spline2d *spline = gsl_spline2d_alloc(T, nx, ny); gsl_interp_accel *xacc = gsl_interp_accel_alloc(); gsl_interp_accel *yacc = gsl_interp_accel_alloc(); size_t i, j; /* set z grid values */ gsl_spline2d_set(spline, za, 0, 0, 0.0); gsl_spline2d_set(spline, za, 0, 1, 1.0); gsl_spline2d_set(spline, za, 1, 1, 0.5); gsl_spline2d_set(spline, za, 1, 0, 1.0); /* initialize interpolation */ gsl_spline2d_init(spline, xa, ya, za, nx, ny); /* interpolate N values in x and y and print out grid for plotting */ for (i = 0; i < N; ++i) { double xi = i / (N - 1.0); for (j = 0; j < N; ++j) { double yj = j / (N - 1.0); double zij = gsl_spline2d_eval(spline, xi, yj, xacc, yacc); printf("%f %f %f\n", xi, yj, zij); } printf("\n"); } gsl_spline2d_free(spline); gsl_interp_accel_free(xacc); gsl_interp_accel_free(yacc); free(za); return 0; } gsl-doc-2.3/doc/examples/dwt.c0000664000175000017500000000212412620170544014307 0ustar eddedd#include #include #include #include int main (int argc, char **argv) { (void)(argc); /* avoid unused parameter warning */ 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; } gsl-doc-2.3/doc/examples/specfun.c0000664000175000017500000000041412616157443015164 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/specfun_e.c0000664000175000017500000000070412616157443015472 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/vectorview.txt0000664000175000017500000000047712620026734016315 0ustar eddeddmatrix 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 gsl-doc-2.3/doc/examples/rngunif.txt0000664000175000017500000000012012620026734015551 0ustar eddedd0.99974 0.16291 0.28262 0.94720 0.23166 0.48497 0.95748 0.74431 0.54004 0.73995 gsl-doc-2.3/doc/examples/matrix.c0000664000175000017500000000066512616157443015035 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/largefit2.txt0000644000175000017500000010737612753406273016012 0ustar eddedd0.000000 1.013392 0.002000 1.057114 0.004000 1.006672 0.006000 1.005092 0.008000 1.034198 0.010000 0.999146 0.012000 0.972324 0.014000 1.091945 0.016000 1.027780 0.018000 0.997921 0.020000 0.911458 0.022000 1.176001 0.024000 1.249657 0.026001 0.873918 0.028001 0.996930 0.030001 1.168647 0.032001 1.042424 0.034001 0.956186 0.036001 1.032493 0.038001 1.016478 0.040001 0.916054 0.042001 1.160628 0.044001 1.129574 0.046001 1.134291 0.048001 1.103102 0.050001 1.067503 0.052001 1.242134 0.054001 1.210027 0.056001 1.286558 0.058001 1.167437 0.060001 1.270989 0.062001 1.238484 0.064001 1.247879 0.066001 1.318323 0.068001 1.290329 0.070001 1.076233 0.072001 1.364227 0.074001 1.331892 0.076002 1.644310 0.078002 1.272358 0.080002 1.444683 0.082002 1.379124 0.084002 1.681307 0.086002 1.662120 0.088002 1.616803 0.090002 1.563115 0.092002 1.980689 0.094002 1.605972 0.096002 1.714268 0.098002 1.721501 0.100002 1.835777 0.102002 1.843517 0.104002 1.874658 0.106002 1.839987 0.108002 2.096691 0.110002 1.874711 0.112002 2.227526 0.114002 2.198516 0.116002 2.531939 0.118002 2.440293 0.120002 2.474498 0.122002 1.886756 0.124002 2.395872 0.126003 2.424067 0.128003 2.533481 0.130003 2.920822 0.132003 2.639199 0.134003 2.178261 0.136003 2.563181 0.138003 2.330377 0.140003 2.482197 0.142003 2.944214 0.144003 2.375046 0.146003 2.706059 0.148003 2.644492 0.150003 2.344976 0.152003 2.700872 0.154003 3.176028 0.156003 2.982176 0.158003 2.663030 0.160003 2.816813 0.162003 2.245545 0.164003 2.257987 0.166003 2.447319 0.168003 2.955995 0.170003 2.754546 0.172003 3.082176 0.174003 2.488766 0.176004 2.452559 0.178004 2.407845 0.180004 2.795500 0.182004 2.230950 0.184004 2.287802 0.186004 2.460347 0.188004 2.083690 0.190004 2.204919 0.192004 2.696174 0.194004 2.395705 0.196004 2.178485 0.198004 2.307372 0.200004 2.255902 0.202004 1.987918 0.204004 1.887785 0.206004 2.075691 0.208004 1.686572 0.210004 1.982841 0.212004 2.020780 0.214004 1.649430 0.216004 1.963334 0.218004 1.816612 0.220004 2.047502 0.222004 1.570563 0.224004 1.573427 0.226005 1.335974 0.228005 1.378628 0.230005 1.628469 0.232005 1.620938 0.234005 1.216537 0.236005 1.638633 0.238005 1.554498 0.240005 1.391226 0.242005 1.431787 0.244005 1.263934 0.246005 1.425465 0.248005 1.105883 0.250005 1.265657 0.252005 1.168639 0.254005 1.242218 0.256005 1.245104 0.258005 1.108120 0.260005 1.211894 0.262005 1.078647 0.264005 1.057431 0.266005 1.108110 0.268005 1.266898 0.270005 1.100118 0.272005 0.990081 0.274005 1.023601 0.276006 1.238272 0.278006 1.145608 0.280006 1.064366 0.282006 1.025441 0.284006 1.121463 0.286006 0.977097 0.288006 1.032786 0.290006 1.166776 0.292006 1.089725 0.294006 1.048237 0.296006 0.994855 0.298006 0.981623 0.300006 0.964743 0.302006 1.170996 0.304006 0.909883 0.306006 1.060783 0.308006 1.066695 0.310006 1.235120 0.312006 0.983080 0.314006 0.818831 0.316006 1.173228 0.318006 1.052397 0.320006 0.958336 0.322006 1.063317 0.324006 1.045760 0.326007 0.918851 0.328007 0.828151 0.330007 0.922930 0.332007 0.960096 0.334007 0.837558 0.336007 1.093800 0.338007 0.822421 0.340007 0.982303 0.342007 0.857034 0.344007 0.929809 0.346007 1.098484 0.348007 0.912742 0.350007 0.877250 0.352007 0.875453 0.354007 0.842108 0.356007 0.885992 0.358007 0.906674 0.360007 0.948593 0.362007 0.826321 0.364007 0.794805 0.366007 0.799018 0.368007 0.762520 0.370007 0.854828 0.372007 0.913891 0.374007 0.900230 0.376008 0.764344 0.378008 0.893758 0.380008 0.843119 0.382008 0.637597 0.384008 0.732940 0.386008 0.632072 0.388008 0.820424 0.390008 0.653834 0.392008 0.723423 0.394008 0.668586 0.396008 0.587775 0.398008 0.638778 0.400008 0.675101 0.402008 0.679205 0.404008 0.558361 0.406008 0.669089 0.408008 0.659724 0.410008 0.599887 0.412008 0.691995 0.414008 0.577313 0.416008 0.483322 0.418008 0.536498 0.420008 0.504125 0.422008 0.548830 0.424008 0.493233 0.426009 0.477806 0.428009 0.407442 0.430009 0.503880 0.432009 0.460940 0.434009 0.469029 0.436009 0.501596 0.438009 0.405411 0.440009 0.418834 0.442009 0.478496 0.444009 0.420672 0.446009 0.447649 0.448009 0.375458 0.450009 0.400451 0.452009 0.373357 0.454009 0.434920 0.456009 0.422812 0.458009 0.340769 0.460009 0.414966 0.462009 0.369741 0.464009 0.385961 0.466009 0.366010 0.468009 0.353909 0.470009 0.320795 0.472009 0.422465 0.474009 0.402222 0.476010 0.335765 0.478010 0.409413 0.480010 0.384967 0.482010 0.381460 0.484010 0.357884 0.486010 0.423619 0.488010 0.450770 0.490010 0.421563 0.492010 0.386944 0.494010 0.434098 0.496010 0.414335 0.498010 0.373130 0.500010 0.494584 0.502010 0.399168 0.504010 0.327445 0.506010 0.414090 0.508010 0.548788 0.510010 0.413589 0.512010 0.415560 0.514010 0.402811 0.516010 0.467932 0.518010 0.447742 0.520010 0.514848 0.522010 0.545292 0.524010 0.585226 0.526011 0.481420 0.528011 0.542183 0.530011 0.566527 0.532011 0.639324 0.534011 0.665601 0.536011 0.728721 0.538011 0.628460 0.540011 0.745176 0.542011 0.629362 0.544011 0.755605 0.546011 0.730199 0.548011 0.538527 0.550011 0.716283 0.552011 0.653197 0.554011 0.750977 0.556011 0.751317 0.558011 0.669732 0.560011 0.890732 0.562011 0.801524 0.564011 0.896916 0.566011 0.728432 0.568011 0.873384 0.570011 0.915557 0.572011 0.801362 0.574011 0.939248 0.576012 0.841058 0.578012 0.982556 0.580012 0.801244 0.582012 0.944939 0.584012 0.849316 0.586012 1.044572 0.588012 0.991711 0.590012 0.775179 0.592012 0.900808 0.594012 1.054818 0.596012 0.949419 0.598012 1.055190 0.600012 0.960703 0.602012 0.994899 0.604012 0.942069 0.606012 0.782694 0.608012 0.862081 0.610012 0.972296 0.612012 1.084091 0.614012 0.859938 0.616012 0.945606 0.618012 0.991509 0.620012 1.135856 0.622012 1.113732 0.624012 1.075624 0.626013 1.136413 0.628013 0.989279 0.630013 0.986572 0.632013 0.963125 0.634013 0.976137 0.636013 1.133298 0.638013 0.942319 0.640013 1.061070 0.642013 1.010832 0.644013 1.017137 0.646013 1.033211 0.648013 1.023089 0.650013 1.207996 0.652013 1.029256 0.654013 0.894798 0.656013 1.034056 0.658013 1.023175 0.660013 0.972134 0.662013 1.000921 0.664013 1.059754 0.666013 1.205824 0.668013 1.291515 0.670013 1.253979 0.672013 1.021328 0.674013 1.099351 0.676014 1.250217 0.678014 1.053546 0.680014 1.240934 0.682014 1.132546 0.684014 1.207390 0.686014 1.143019 0.688014 1.187569 0.690014 1.117158 0.692014 1.017676 0.694014 1.148909 0.696014 1.307952 0.698014 1.134271 0.700014 1.339668 0.702014 1.360803 0.704014 1.209263 0.706014 1.643307 0.708014 1.482189 0.710014 1.620002 0.712014 1.531291 0.714014 1.508616 0.716014 1.551789 0.718014 1.820704 0.720014 1.190510 0.722014 1.871826 0.724014 1.808171 0.726015 1.639588 0.728015 1.896243 0.730015 1.814870 0.732015 2.268629 0.734015 1.860003 0.736015 1.909307 0.738015 2.091058 0.740015 2.307699 0.742015 1.724754 0.744015 2.136682 0.746015 2.482358 0.748015 2.739133 0.750015 2.183903 0.752015 2.505655 0.754015 2.256298 0.756015 2.232645 0.758015 2.418358 0.760015 2.743980 0.762015 2.490451 0.764015 2.591839 0.766015 2.890467 0.768015 2.441939 0.770015 2.795238 0.772015 2.882743 0.774015 2.704971 0.776016 2.864923 0.778016 2.931144 0.780016 2.595133 0.782016 2.778879 0.784016 2.588524 0.786016 2.424629 0.788016 3.490356 0.790016 2.725991 0.792016 2.819722 0.794016 2.795897 0.796016 2.278287 0.798016 2.709274 0.800016 2.864658 0.802016 2.495316 0.804016 2.481585 0.806016 2.761135 0.808016 2.443268 0.810016 2.565330 0.812016 2.160156 0.814016 2.817464 0.816016 2.687451 0.818016 2.225290 0.820016 2.234668 0.822016 2.366997 0.824016 1.801739 0.826017 1.999203 0.828017 2.121902 0.830017 1.658141 0.832017 2.048377 0.834017 1.987455 0.836017 2.056994 0.838017 1.748644 0.840017 2.035117 0.842017 1.991255 0.844017 1.933487 0.846017 1.927148 0.848017 1.526116 0.850017 1.825349 0.852017 1.448218 0.854017 1.266984 0.856017 1.574851 0.858017 1.569314 0.860017 1.461266 0.862017 1.241627 0.864017 1.385409 0.866017 1.438944 0.868017 1.458593 0.870017 1.045023 0.872017 1.156637 0.874017 1.231397 0.876018 1.060101 0.878018 1.208137 0.880018 1.297885 0.882018 1.261846 0.884018 1.073377 0.886018 1.146843 0.888018 1.110004 0.890018 1.142169 0.892018 1.091117 0.894018 1.018172 0.896018 1.325115 0.898018 1.055748 0.900018 0.984488 0.902018 0.967879 0.904018 0.961651 0.906018 1.085517 0.908018 0.924754 0.910018 1.080906 0.912018 0.949908 0.914018 1.084287 0.916018 1.115371 0.918018 1.150677 0.920018 1.197850 0.922018 0.909476 0.924018 0.920649 0.926019 1.061322 0.928019 0.867733 0.930019 1.122616 0.932019 0.730512 0.934019 1.068192 0.936019 1.051183 0.938019 0.939787 0.940019 0.793864 0.942019 0.954387 0.944019 0.949134 0.946019 0.950377 0.948019 0.837390 0.950019 0.920521 0.952019 1.038896 0.954019 1.054405 0.956019 0.800492 0.958019 1.108765 0.960019 1.029235 0.962019 0.886213 0.964019 1.086449 0.966019 0.845174 0.968019 0.825587 0.970019 0.979444 0.972019 0.801748 0.974019 1.027216 0.976020 1.065852 0.978020 0.918422 0.980020 1.073070 0.982020 0.794571 0.984020 1.009434 0.986020 0.789657 0.988020 1.017966 0.990020 0.877302 0.992020 1.009978 0.994020 0.872902 0.996020 0.866302 0.998020 0.851322 3.049679424205e+02 2.259835726033e+02 4.582825874915e-01 2.680463954339e+02 2.141625880951e+02 5.231740188551e-01 2.355948285412e+02 2.030649087681e+02 5.890884464064e-01 2.070720747634e+02 1.929847787351e+02 6.548268076391e-01 1.820024845720e+02 1.841072060161e+02 7.193815491988e-01 1.599679938893e+02 1.765119161116e+02 7.819322821113e-01 1.406011523916e+02 1.701896640168e+02 8.418163499861e-01 1.235789958554e+02 1.650602877714e+02 8.985336544077e-01 1.086176603596e+02 1.609890697240e+02 9.518223955972e-01 9.546764852977e+01 1.578034068101e+02 1.001803566519e+00 8.390966888471e+01 1.553114384423e+02 1.049166704959e+00 7.375097889990e+01 1.533208888884e+02 1.095369478520e+00 6.482217080569e+01 1.516545543003e+02 1.142835180762e+00 5.697434651904e+01 1.501600821886e+02 1.195128756643e+00 5.007663459779e+01 1.487142619106e+02 1.257054974652e+00 4.401400780969e+01 1.472238754460e+02 1.334559527277e+00 3.868536492180e+01 1.456254596505e+02 1.434275177416e+00 3.400184472188e+01 1.438854289541e+02 1.562623610255e+00 2.988534415606e+01 1.420005556014e+02 1.724596948917e+00 2.626721587113e+01 1.399974024973e+02 1.922589454722e+00 2.308712344143e+01 1.379285302548e+02 2.155726253457e+00 2.029203518998e+01 1.358637352439e+02 2.419978906549e+00 1.783533982465e+01 1.338764658641e+02 2.709110562615e+00 1.567606914154e+01 1.320282596578e+02 3.016297482822e+00 1.377821483337e+01 1.303559182938e+02 3.336147029939e+00 1.211012800981e+01 1.288656178663e+02 3.666761776237e+00 1.064399141598e+01 1.275352277273e+02 4.011506063370e+00 9.355355547988e+00 1.263226219087e+02 4.380226295606e+00 8.222730929480e+00 1.251758562191e+02 4.789832968191e+00 7.227229750040e+00 1.240414585308e+02 5.264340172168e+00 6.352250889373e+00 1.228688803423e+02 5.834649703649e+00 5.583203074639e+00 1.216111234489e+02 6.538466669693e+00 4.907261554294e+00 1.202229496636e+02 7.420551016472e+00 4.313154230704e+00 1.186587305709e+02 8.532950836315e+00 3.790973685020e+00 1.168719533463e+02 9.934207301729e+00 3.332011959648e+00 1.148178006003e+02 1.168632231592e+01 2.928615343100e+00 1.124592892136e+02 1.384882214885e+01 2.574056735603e+00 1.097764132560e+02 1.647021807289e+01 2.262423467019e+00 1.067766702154e+02 1.957804508552e+01 1.988518696314e+00 1.035042389902e+02 2.316931526695e+01 1.747774748288e+00 1.000441263405e+02 2.720379867731e+01 1.536176942372e+00 9.651751550744e+01 3.160290211673e+01 1.350196643238e+00 9.306632436152e+01 3.625646867326e+01 1.186732416773e+00 8.982894691955e+01 4.103808359877e+01 1.043058310116e+00 8.691391183585e+01 4.582676062570e+01 9.167783932792e-01 8.438070050596e+01 5.053038948883e+01 8.057868042778e-01 8.223470407157e+01 5.510530773189e+01 7.082326314713e-01 8.043702331377e+01 5.956711649011e+01 6.224890474974e-01 7.892357938800e+01 6.398958416973e+01 5.471261800648e-01 7.762560078773e+01 6.849028056538e+01 4.808872671990e-01 7.648531883774e+01 7.320362439154e+01 4.226676992988e-01 7.546418427863e+01 7.824535039656e+01 3.714965985086e-01 7.454378223531e+01 8.367705422653e+01 3.265206282203e-01 7.372122857792e+01 8.948281171216e+01 2.869897627095e-01 7.300159914866e+01 9.556798423928e+01 2.522447795993e-01 7.239018973299e+01 1.017823565619e+02 2.217062665734e-01 7.188699034993e+01 1.079600203842e+02 1.948649590132e-01 7.148458809107e+01 1.139628834504e+02 1.712732474282e-01 7.116922187338e+01 1.197157695454e+02 1.505377130561e-01 7.092365340987e+01 1.252264459579e+02 1.323125671547e-01 7.073032520221e+01 1.305894207317e+02 1.162938845799e-01 7.057376516914e+01 1.359754401985e+02 1.022145354861e-01 7.044186488844e+01 1.416096903477e+02 8.983973063048e-02 7.032612844923e+01 1.477431961358e+02 7.896310599444e-02 7.022118277132e+01 1.546258673032e+02 6.940328142717e-02 7.012386456067e+01 1.624950613229e+02 6.100083592454e-02 7.003217179598e+01 1.715957508969e+02 5.361564910151e-02 6.994433015584e+01 1.822423835322e+02 4.712456452454e-02 6.985815866212e+01 1.949179608667e+02 4.141933593721e-02 6.977081093619e+01 2.103878858382e+02 3.640482213021e-02 6.967884969909e+01 2.297913717301e+02 3.199740035286e-02 6.957853426728e+01 2.546684078657e+02 2.812357180813e-02 6.946618683456e+01 2.868951226109e+02 2.471873597619e-02 6.933853021627e+01 3.285416801955e+02 2.172611332691e-02 6.919291616778e+01 3.817194980868e+02 1.909579845621e-02 6.902736812910e+01 4.485119002619e+02 1.678392785646e-02 6.884035987401e+01 5.310659202446e+02 1.475194844232e-02 6.863027944213e+01 6.318835512218e+02 1.296597463394e-02 6.839461346375e+01 7.543092624425e+02 1.139622327623e-02 6.812901417531e+01 9.031585111281e+02 1.001651697063e-02 6.782651456142e+01 1.085359927714e+03 8.803847537122e-03 6.747716659000e+01 1.310418952090e+03 7.737992326490e-03 6.706828588715e+01 1.590506790044e+03 6.801176984534e-03 6.658536327462e+01 1.940059864352e+03 5.977779044391e-03 6.601363178470e+01 2.374889252061e+03 5.254067404042e-03 6.534026945891e+01 2.910855638793e+03 4.617973344485e-03 6.455719732250e+01 3.562138386906e+03 4.058889270048e-03 6.366428932867e+01 4.339102681606e+03 3.567491814604e-03 6.267248832862e+01 5.245859720167e+03 3.135586363782e-03 6.160588907903e+01 6.277853533189e+03 2.755970400406e-03 6.050155242530e+01 7.420104055499e+03 2.422313394281e-03 5.940602862165e+01 8.646904275189e+03 2.129051233368e-03 5.836855639358e+01 9.923613104847e+03 1.871293435858e-03 5.743244640608e+01 1.121063715501e+04 1.644741595788e-03 5.662739636684e+01 1.246893675602e+04 1.445617702215e-03 5.596542477358e+01 1.366581501745e+04 1.270601136561e-03 5.544155166517e+01 1.477969701783e+04 1.116773297502e-03 5.503826835667e+01 1.580309946444e+04 9.815689299551e-04 5.473156687373e+01 1.674369511751e+04 8.627333465155e-04 5.449640043827e+01 1.762385046111e+04 7.582848279681e-04 5.431042986004e+01 1.847900635574e+04 6.664815758530e-04 5.415593441138e+01 1.935484503417e+04 5.857926659852e-04 5.402033332951e+01 2.030270337697e+04 5.148725185431e-04 5.389585865836e+01 2.137270142245e+04 4.525384589871e-04 5.377876456271e+01 2.260501851422e+04 3.977509956095e-04 5.366827635539e+01 2.402150709753e+04 3.495964848212e-04 5.356539678304e+01 2.562124943888e+04 3.072718951013e-04 5.347170769179e+01 2.738330307216e+04 2.700714155276e-04 5.338835905032e+01 2.927752258345e+04 2.373746855730e-04 5.331543087285e+01 3.128147567889e+04 2.086364498842e-04 5.325174979972e+01 3.339987703278e+04 1.833774655255e-04 5.319509292624e+01 3.568305894010e+04 1.611765100547e-04 5.314260887537e+01 3.824166167882e+04 1.416633571578e-04 5.309128027256e+01 4.125447176857e+04 1.245126027012e-04 5.303831969727e+01 4.496484882641e+04 1.094382382465e-04 5.298147262353e+01 4.966040333759e+04 9.618888153220e-05 5.291924900503e+01 5.563383515992e+04 8.454358438755e-05 5.285110689565e+01 6.313071752292e+04 7.430814816890e-05 5.277757941862e+01 7.229717397212e+04 6.531188527540e-05 5.270029563775e+01 8.314068461487e+04 5.740477273813e-05 5.262182638889e+01 9.551210236273e+04 5.045495041555e-05 5.254531378210e+01 1.091125928936e+05 4.434652207489e-05 5.247392203016e+01 1.235271215048e+05 3.897762268998e-05 5.241024302340e+01 1.382828041506e+05 3.425871972545e-05 5.235583933623e+01 1.529245504406e+05 3.011112007939e-05 5.231106435988e+01 1.670954150499e+05 2.646565778586e-05 5.227518193852e+01 1.806094911526e+05 2.326154059335e-05 5.224668972485e+01 1.935119799947e+05 2.044533618452e-05 5.222369908601e+01 2.061305143217e+05 1.797008113114e-05 5.220425083049e+01 2.191280230144e+05 1.579449772533e-05 5.218651154871e+01 2.335655557254e+05 1.388230562649e-05 5.216885414581e+01 2.509716911627e+05 1.220161684523e-05 5.214985583332e+01 2.733973324070e+05 1.072440397463e-05 5.212824939940e+01 3.034255308554e+05 9.426032801221e-06 5.210285127069e+01 3.441286227233e+05 8.284851501294e-06 5.207247405350e+01 3.990242380564e+05 7.281829571992e-06 5.203581896811e+01 4.721336506966e+05 6.400240475916e-06 5.199133865623e+01 5.682316956516e+05 5.625382706993e-06 5.193706450555e+01 6.933025701832e+05 4.944334626053e-06 5.187040273270e+01 8.551440096070e+05 4.345738977722e-06 5.178791397898e+01 1.064035103089e+06 3.819613495208e-06 5.168509532479e+01 1.333397492723e+06 3.357184434584e-06 5.155617973127e+01 1.680418230300e+06 2.950740262582e-06 5.139396237027e+01 2.126640761294e+06 2.593503057958e-06 5.118966656947e+01 2.698536351414e+06 2.279515481906e-06 5.093288121229e+01 3.428020357099e+06 2.003541432621e-06 5.061163611976e+01 4.352780805349e+06 1.760978727319e-06 5.021272592245e+01 5.516163242910e+06 1.547782355572e-06 4.972243530928e+01 6.966230762767e+06 1.360397024141e-06 4.912784091228e+01 8.753521489096e+06 1.195697868392e-06 4.841883568674e+01 1.092701093981e+07 1.050938341606e-06 4.759089389166e+01 1.352794387497e+07 9.237044131753e-07 4.664832218953e+01 1.658164028060e+07 8.118743118798e-07 4.560732261099e+01 2.008816503830e+07 7.135831429282e-07 4.449773910327e+01 2.401376999151e+07 6.271917887047e-07 4.336215166050e+01 2.828587218909e+07 5.512595746088e-07 4.225139784199e+01 3.279438219587e+07 4.845202441592e-07 4.121682990561e+01 3.740090786786e+07 4.258608427195e-07 4.030127349128e+01 4.195485557181e+07 3.743031577071e-07 3.953173297308e+01 4.631278202120e+07 3.289874057797e-07 3.891642339257e+01 5.035599138393e+07 2.891578949660e-07 3.844676343210e+01 5.400216182414e+07 2.541504226369e-07 3.810280148913e+01 5.720924257908e+07 2.233811991685e-07 3.785954274835e+01 5.997258460255e+07 1.963371125817e-07 3.769210926731e+01 6.231799311050e+07 1.725671718139e-07 3.757885546304e+01 6.429372180437e+07 1.516749859274e-07 3.750258812543e+01 6.596375020163e+07 1.333121538371e-07 3.745051689113e+01 6.740362385498e+07 1.171724543240e-07 3.741358003337e+01 6.869911719292e+07 1.029867394468e-07 3.738560108985e+01 6.994710253322e+07 9.051844619181e-08 3.736252106902e+01 7.125718563003e+07 7.955965151425e-08 3.734179686937e+01 7.275186740938e+07 6.992760498403e-08 3.732196707845e+01 7.456253628416e+07 6.146168121320e-08 3.730234421251e+01 7.681932313605e+07 5.402070124404e-08 3.728278048869e+01 7.963573818349e+07 4.748057822849e-08 3.726346243053e+01 8.309395524530e+07 4.173224813812e-08 3.724471192961e+01 8.724121987765e+07 3.667985099677e-08 3.722679910599e+01 9.210837630022e+07 3.223913230585e-08 3.720979199425e+01 9.775638111824e+07 2.833603800423e-08 3.719346822868e+01 1.043487916304e+08 2.490547953214e-08 3.717729492105e+01 1.122419448656e+08 2.189024840499e-08 3.716045855081e+01 1.220806229921e+08 1.924006219650e-08 3.714191300791e+01 1.348824173316e+08 1.691072602177e-08 3.712041695171e+01 1.520889847190e+08 1.486339553702e-08 3.709454560502e+01 1.755672020785e+08 1.306392916575e-08 3.706267739824e+01 2.075689433456e+08 1.148231874895e-08 3.702296679654e+01 2.506905659759e+08 1.009218912470e-08 3.697332095515e+01 3.078742741709e+08 8.870358292231e-09 3.691140209812e+01 3.824534649951e+08 7.796450825514e-09 3.683468187906e+01 4.781999433549e+08 6.852558089779e-09 3.674057841140e+01 5.993131653022e+08 6.022939594530e-09 3.662670799804e+01 7.502945321952e+08 5.293760502879e-09 3.649127521517e+01 9.356581119542e+08 4.652860919823e-09 3.633359756823e+01 1.159442820756e+09 4.089553112091e-09 3.615470633857e+01 1.424521991192e+09 3.594443277976e-09 3.595788592371e+01 1.731766078313e+09 3.159274894948e-09 3.574893609636e+01 2.079201726433e+09 2.776791032705e-09 3.553592108066e+01 2.461399457379e+09 2.440613335560e-09 3.532827065242e+01 2.869359696485e+09 2.145135656071e-09 3.513533667002e+01 3.291094515703e+09 3.049679424205e+02 2.259835726033e+02 4.582825874915e-01 2.580143967012e+02 2.107917110746e+02 5.426082927241e-01 2.182899237760e+02 1.969684354706e+02 6.280418497061e-01 1.846815194475e+02 1.850487061133e+02 7.121585522137e-01 1.562475401313e+02 1.752656274770e+02 7.930682981603e-01 1.321913197927e+02 1.675964837258e+02 8.693421204564e-01 1.118388488795e+02 1.618268821054e+02 9.400558583882e-01 9.461988985585e+01 1.576110875095e+02 1.005149540682e+00 8.005200023099e+01 1.545371696057e+02 1.066046743531e+00 6.772701543772e+01 1.521942914640e+02 1.126373406299e+00 5.729961283748e+01 1.502241872559e+02 1.192658486550e+00 4.847763643658e+01 1.483466628748e+02 1.274825221439e+00 4.101391123083e+01 1.463656702668e+02 1.385929772224e+00 3.469931783187e+01 1.441690985792e+02 1.540301316776e+00 2.935693333953e+01 1.417297421472e+02 1.749806092407e+00 2.483707429862e+01 1.391041033590e+02 2.019585643005e+00 2.101310285311e+01 1.364177628998e+02 2.345735002147e+00 1.777787859417e+01 1.338283415434e+02 2.716599205799e+00 1.504075668969e+01 1.314720392843e+02 3.117640207549e+00 1.272504818840e+01 1.294169569152e+02 3.538511961844e+00 1.076587134131e+01 1.276471559312e+02 3.980317715907e+00 9.108333738442e+00 1.260812049620e+02 4.461112370318e+00 7.705994327879e+00 1.246070234525e+02 5.018597491481e+00 6.519562225819e+00 1.231104890422e+02 5.710329194894e+00 5.515795860705e+00 1.214867211134e+02 6.613138593918e+00 4.666571607597e+00 1.196368388221e+02 7.823580755521e+00 3.948095817681e+00 1.174610443004e+02 9.458350960490e+00 3.340238165469e+00 1.148598056939e+02 1.164917560198e+01 2.825967635357e+00 1.117502412693e+02 1.452604760013e+01 2.390875344951e+00 1.080972264270e+02 1.818796364880e+01 2.022770835581e+00 1.039503446808e+02 2.266732295247e+01 1.711340518826e+00 9.946934383099e+01 2.789962785978e+01 1.447858709380e+00 9.491587394605e+01 3.371400985489e+01 1.224943147940e+00 9.059756018016e+01 3.985883912724e+01 1.036348164336e+00 8.677789061808e+01 4.606460668162e+01 8.767896857335e-01 8.359646347455e+01 5.212653786163e+01 7.417971869529e-01 8.104571911451e+01 5.797568302676e+01 6.275884348605e-01 7.901219010388e+01 6.370905876257e+01 5.309635173847e-01 7.734832525030e+01 6.956172344971e+01 4.492151880655e-01 7.593296422152e+01 7.581897226351e+01 3.800530141556e-01 7.469915091790e+01 8.268988116780e+01 3.215392030504e-01 7.362996788669e+01 9.019565601143e+01 2.720343090240e-01 7.273474094259e+01 9.813916665329e+01 2.301512990768e-01 7.202192463254e+01 1.061832261122e+02 1.947166909085e-01 7.148248866532e+01 1.139975843316e+02 1.647376741754e-01 7.108865833154e+01 1.213999943425e+02 1.393742938322e-01 7.080299585605e+01 1.284368825002e+02 1.179159161890e-01 7.058920502254e+01 1.353897398723e+02 9.976131830610e-02 7.041904289990e+01 1.427184814670e+02 8.440184287099e-02 7.027423887434e+01 1.509648598701e+02 7.140714658724e-02 7.014478571731e+01 1.606625767605e+02 6.041314277373e-02 7.002547201602e+01 1.723360934395e+02 5.111180034816e-02 6.991233631353e+01 1.866698902479e+02 4.324251338182e-02 6.980030144257e+01 2.048512607612e+02 3.658479941695e-02 6.968249354276e+01 2.289602472619e+02 3.095212196757e-02 6.955090952728e+01 2.621794592607e+02 2.618666412181e-02 6.939767543500e+01 3.086242096507e+02 2.215490681210e-02 6.921620850188e+01 3.728421070701e+02 1.874388786482e-02 6.900177043142e+01 4.593858154564e+02 1.585803701495e-02 6.875094124020e+01 5.729767296634e+02 1.341649820897e-02 6.845968368576e+01 7.195640314556e+02 1.135086417200e-02 6.812026175427e+01 9.082478531752e+02 9.603259766031e-03 6.771817256197e+01 1.153588955293e+03 8.124720438586e-03 6.723070460904e+01 1.477311918389e+03 6.873820329080e-03 6.662828151778e+01 1.908279926652e+03 5.815511594968e-03 6.587892354475e+01 2.480185026957e+03 4.920142437842e-03 6.495574734126e+01 3.227081011554e+03 4.162626316419e-03 6.384720900213e+01 4.176967938403e+03 3.521739069356e-03 6.256865185603e+01 5.343610016092e+03 2.979524254605e-03 6.117107240471e+01 6.717761704343e+03 2.520790044052e-03 5.974038296860e+01 8.260991136084e+03 2.132683577376e-03 5.838168094622e+01 9.906593124929e+03 1.804330849347e-03 5.719097351245e+01 1.157044754920e+04 1.526532040872e-03 5.622731665128e+01 1.316986820656e+04 1.291503757557e-03 5.550068025654e+01 1.464383902609e+04 1.092660953800e-03 5.498030660407e+01 1.596756996356e+04 9.244324323271e-04 5.461483823207e+01 1.715835023547e+04 7.821047498462e-04 5.435156904376e+01 1.827395545075e+04 6.616901553228e-04 5.414797212023e+01 1.940534856590e+04 5.598148607808e-04 5.397562114610e+01 2.066231255729e+04 4.736245141778e-04 5.381940468664e+01 2.214936214812e+04 4.007042258887e-04 5.367450654534e+01 2.393457955958e+04 3.390109080900e-04 5.354229985126e+01 2.602639663440e+04 2.868160313236e-04 5.342604724619e+01 2.837817555207e+04 2.426571943885e-04 5.332736508149e+01 3.092967785648e+04 2.052971506396e-04 5.324459080968e+01 3.367054173808e+04 1.736891426893e-04 5.317299906526e+01 3.671050569139e+04 1.469475742560e-04 5.310630424053e+01 4.032974244152e+04 1.243231974398e-04 5.303819740723e+01 4.499743271301e+04 1.051821202216e-04 5.296362103615e+01 5.132199424049e+04 8.898804601339e-05 5.287975482181e+01 5.991429886061e+04 7.528724764817e-05 5.278641293981e+01 7.122146357710e+04 6.369585480710e-05 5.268658738576e+01 8.532818479701e+04 5.388909870323e-05 5.258592744926e+01 1.018857103170e+05 4.559221267760e-05 5.249113326898e+01 1.201705707293e+05 3.857273375988e-05 5.240863762809e+01 1.391467466499e+05 3.263398949798e-05 5.234177351724e+01 1.578504886232e+05 2.760958756991e-05 5.229076495765e+01 1.755532601109e+05 2.335875378730e-05 5.225329742770e+01 1.920099678601e+05 1.976238787030e-05 5.222562200334e+01 2.076530752312e+05 1.671972648424e-05 5.220315733218e+01 2.239381257502e+05 1.414552004253e-05 5.218315775742e+01 2.429197584341e+05 1.196764417542e-05 5.216240796147e+01 2.684093632441e+05 1.012507894223e-05 5.213794233797e+01 3.046802204850e+05 8.566199168660e-06 5.210910669969e+01 3.577988367371e+05 7.247328007599e-06 5.207584536028e+01 4.301821112814e+05 6.131513196879e-06 5.203088670405e+01 5.412010475005e+05 5.187491727169e-06 5.183122774103e+01 9.969792728200e+05 4.388813911898e-06 5.190699188272e+01 9.893521774544e+05 3.713102317328e-06 5.190798847671e+01 9.961181134401e+05 3.141424789410e-06 5.182411236510e+01 1.341532374497e+06 2.657764010829e-06 5.147839905729e+01 2.509821409081e+06 2.248568726226e-06 5.046109021201e+01 5.732483448678e+06 1.902374061791e-06 5.184220134806e+01 2.005716766290e+06 1.609480301297e-06 5.187119094759e+01 1.692576367374e+06 1.361681118499e-06 5.186791358945e+01 1.721948981712e+06 1.152033651473e-06 5.186832227990e+01 1.719877644338e+06 9.746639768273e-07 5.186808539121e+01 1.767622829488e+06 8.246025335369e-07 5.187135128498e+01 1.773673814186e+06 6.976448852957e-07 5.186817629358e+01 1.780216661561e+06 5.902339202035e-07 5.187107789658e+01 1.795770998166e+06 4.993601872550e-07 5.186433526457e+01 1.795350920380e+06 4.224775772450e-07 5.186090336890e+01 1.814290881152e+06 3.574319856293e-07 5.186090336890e+01 1.814290881152e+06 3.024009586119e-07 5.186039910453e+01 1.853208087651e+06 2.558426314545e-07 5.186039910453e+01 1.853208087651e+06 2.164525283584e-07 5.186039910453e+01 1.853208087651e+06 1.831270135332e-07 5.186039910453e+01 1.853208087651e+06 1.549323694204e-07 5.186039910453e+01 1.853208087651e+06 1.310786357025e-07 5.186039910453e+01 1.853208087651e+06 1.108974761176e-07 5.186039910453e+01 1.853208087651e+06 9.382345294742e-08 5.186039910453e+01 1.853208087651e+06 7.937818452824e-08 5.186039910453e+01 1.853208087651e+06 6.715694190588e-08 5.186039910453e+01 1.853208087651e+06 5.681730910015e-08 5.186039910453e+01 1.853208087651e+06 4.806958926013e-08 5.186039910453e+01 1.853208087651e+06 4.066868790926e-08 5.186039910453e+01 1.853208087651e+06 3.440724586412e-08 5.186039910453e+01 1.853208087651e+06 2.910982942443e-08 5.186039910453e+01 1.853208087651e+06 2.462801505433e-08 5.186039910453e+01 1.853208087651e+06 2.083623083710e-08 5.186039910453e+01 1.853208087651e+06 1.762823818888e-08 5.186039910453e+01 1.853208087651e+06 1.491415525550e-08 5.186039910453e+01 1.853208087651e+06 1.261793859385e-08 5.186039910453e+01 1.853208087651e+06 1.067525257923e-08 5.186039910453e+01 1.853208087651e+06 9.031666843409e-09 5.186039910453e+01 1.853208087651e+06 7.641131239281e-09 5.186039910453e+01 1.853208087651e+06 6.464685603247e-09 5.186039910453e+01 1.853208087651e+06 5.469368165539e-09 5.186039910453e+01 1.853208087651e+06 4.627292024099e-09 5.186039910453e+01 1.853208087651e+06 3.914863806610e-09 5.186039910453e+01 1.853208087651e+06 3.312122629063e-09 5.186039910453e+01 1.853208087651e+06 2.802180829747e-09 5.186039910453e+01 1.853208087651e+06 2.370750809073e-09 5.186039910453e+01 1.853208087651e+06 2.005744718205e-09 5.186039910453e+01 1.853208087651e+06 1.696935780518e-09 5.186039910453e+01 1.853208087651e+06 1.435671756763e-09 5.186039910453e+01 1.853208087651e+06 1.214632525773e-09 5.186039910453e+01 1.853208087651e+06 1.027624988593e-09 5.186039910453e+01 1.853208087651e+06 8.694095496150e-10 5.186039910453e+01 1.853208087651e+06 7.355533130786e-10 5.186039910453e+01 1.853208087651e+06 6.223058817568e-10 5.186039910453e+01 1.853208087651e+06 5.264942779582e-10 5.186039910453e+01 1.853208087651e+06 4.454340427254e-10 5.186039910453e+01 1.853208087651e+06 3.768540223992e-10 5.186039910453e+01 1.853208087651e+06 3.188327352115e-10 5.186039910453e+01 1.853208087651e+06 2.697445350199e-10 5.186039910453e+01 1.853208087651e+06 2.282140637938e-10 5.186039910453e+01 1.853208087651e+06 1.930777166975e-10 5.186039910453e+01 1.853208087651e+06 1.633510400954e-10 5.186039910453e+01 1.853208087651e+06 1.382011490329e-10 5.186039910453e+01 1.853208087651e+06 1.169233913838e-10 5.186039910453e+01 1.853208087651e+06 9.892160483726e-11 5.186039910453e+01 1.853208087651e+06 8.369141356375e-11 5.186039910453e+01 1.853208087651e+06 7.080609656325e-11 5.186039910453e+01 1.853208087651e+06 5.990463175419e-11 5.186039910453e+01 1.853208087651e+06 5.068158082121e-11 5.186039910453e+01 1.853208087651e+06 4.287853141435e-11 5.186039910453e+01 1.853208087651e+06 3.627685692634e-11 5.186039910453e+01 1.853208087651e+06 3.069159099076e-11 5.186039910453e+01 1.853208087651e+06 2.596624507622e-11 5.186039910453e+01 1.853208087651e+06 2.196842397520e-11 5.186039910453e+01 1.853208087651e+06 1.858611634209e-11 5.186039910453e+01 1.853208087651e+06 1.572455634832e-11 5.186039910453e+01 1.853208087651e+06 1.330356852397e-11 5.186039910453e+01 1.853208087651e+06 1.125532139360e-11 5.186039910453e+01 1.853208087651e+06 9.522426967234e-12 5.186039910453e+01 1.853208087651e+06 8.056332838073e-12 5.186039910453e+01 1.853208087651e+06 6.815961836321e-12 5.186039910453e+01 1.853208087651e+06 5.766561125012e-12 5.186039910453e+01 1.853208087651e+06 4.878728491596e-12 5.186039910453e+01 1.853208087651e+06 4.127588553857e-12 5.186039910453e+01 1.853208087651e+06 3.492095798993e-12 5.186039910453e+01 1.853208087651e+06 2.954444928371e-12 5.186039910453e+01 1.853208087651e+06 2.499571986912e-12 5.186039910453e+01 1.853208087651e+06 2.114732299715e-12 5.186039910453e+01 1.853208087651e+06 1.789143390499e-12 5.186039910453e+01 1.853208087651e+06 1.513682877117e-12 5.186039910453e+01 1.853208087651e+06 1.280632879759e-12 5.186039910453e+01 1.853208087651e+06 1.083463780633e-12 5.186039910453e+01 1.853208087651e+06 0.000000 1.000000e+00 1.320696e+00 1.561410e+00 0.010000 1.000996e+00 1.052953e+00 1.045781e+00 0.020000 1.007872e+00 8.988771e-01 8.083334e-01 0.030000 1.026144e+00 8.543474e-01 7.678692e-01 0.040000 1.060833e+00 9.048302e-01 8.597155e-01 0.050000 1.116496e+00 1.030102e+00 1.033247e+00 0.060000 1.197241e+00 1.207755e+00 1.249664e+00 0.070000 1.306512e+00 1.415701e+00 1.480016e+00 0.080000 1.446506e+00 1.633851e+00 1.703452e+00 0.090000 1.617126e+00 1.845151e+00 1.905692e+00 0.100000 1.814524e+00 2.036098e+00 2.077696e+00 0.110000 2.029607e+00 2.196880e+00 2.214522e+00 0.120000 2.247143e+00 2.321225e+00 2.314354e+00 0.130000 2.446382e+00 2.406059e+00 2.377688e+00 0.140000 2.603824e+00 2.451050e+00 2.406653e+00 0.150000 2.697981e+00 2.458079e+00 2.404465e+00 0.160000 2.714808e+00 2.430697e+00 2.374983e+00 0.170000 2.651704e+00 2.373608e+00 2.322369e+00 0.180000 2.518282e+00 2.292186e+00 2.250825e+00 0.190000 2.333563e+00 2.192052e+00 2.164408e+00 0.200000 2.120871e+00 2.078735e+00 2.066892e+00 0.210000 1.902566e+00 1.957391e+00 1.961695e+00 0.220000 1.696364e+00 1.832606e+00 1.851827e+00 0.230000 1.513870e+00 1.708267e+00 1.739883e+00 0.240000 1.360947e+00 1.587501e+00 1.628049e+00 0.250000 1.239061e+00 1.472656e+00 1.518125e+00 0.260000 1.146817e+00 1.365347e+00 1.411564e+00 0.270000 1.081190e+00 1.266515e+00 1.309507e+00 0.280000 1.038307e+00 1.176531e+00 1.212831e+00 0.290000 1.013789e+00 1.095299e+00 1.122183e+00 0.300000 1.002814e+00 1.022375e+00 1.038023e+00 0.310000 1.000072e+00 9.570805e-01 9.606555e-01 0.320000 9.998011e-01 8.986103e-01 8.902566e-01 0.330000 9.960824e-01 8.461235e-01 8.268962e-01 0.340000 9.834513e-01 7.988224e-01 7.705551e-01 0.350000 9.577548e-01 7.560100e-01 7.211372e-01 0.360000 9.169922e-01 7.171291e-01 6.784768e-01 0.370000 8.617940e-01 6.817822e-01 6.423447e-01 0.380000 7.952798e-01 6.497336e-01 6.124505e-01 0.390000 7.222899e-01 6.208967e-01 5.884460e-01 0.400000 6.482631e-01 5.953087e-01 5.699278e-01 0.410000 5.781627e-01 5.730971e-01 5.564420e-01 0.420000 5.157735e-01 5.544402e-01 5.474905e-01 0.430000 4.634795e-01 5.395280e-01 5.425407e-01 0.440000 4.224349e-01 5.285235e-01 5.410380e-01 0.450000 3.929418e-01 5.215305e-01 5.424213e-01 0.460000 3.748639e-01 5.185692e-01 5.461420e-01 0.470000 3.679641e-01 5.195620e-01 5.516852e-01 0.480000 3.721204e-01 5.243302e-01 5.585935e-01 0.490000 3.874083e-01 5.326029e-01 5.664907e-01 0.500000 4.140514e-01 5.440364e-01 5.751059e-01 0.510000 4.522382e-01 5.582450e-01 5.842963e-01 0.520000 5.018122e-01 5.748387e-01 5.940669e-01 0.530000 5.618693e-01 5.934668e-01 6.045855e-01 0.540000 6.303577e-01 6.138641e-01 6.161926e-01 0.550000 7.038367e-01 6.358952e-01 6.294037e-01 0.560000 7.775882e-01 6.595946e-01 6.449037e-01 0.570000 8.462014e-01 6.851967e-01 6.635316e-01 0.580000 9.045780e-01 7.131548e-01 6.862563e-01 0.590000 9.490803e-01 7.441439e-01 7.141411e-01 0.600000 9.784214e-01 7.790452e-01 7.482988e-01 0.610000 9.939735e-01 8.189122e-01 7.898381e-01 0.620000 9.994265e-01 8.649154e-01 8.398003e-01 0.630000 1.000005e+00 9.182684e-01 8.990911e-01 0.640000 1.001584e+00 9.801360e-01 9.684065e-01 0.650000 1.010005e+00 1.051528e+00 1.048158e+00 0.660000 1.030699e+00 1.133185e+00 1.138401e+00 0.670000 1.068607e+00 1.225456e+00 1.238764e+00 0.680000 1.128215e+00 1.328188e+00 1.348390e+00 0.690000 1.213540e+00 1.440615e+00 1.465895e+00 0.700000 1.327870e+00 1.561279e+00 1.589337e+00 0.710000 1.473103e+00 1.687976e+00 1.716210e+00 0.720000 1.648620e+00 1.817733e+00 1.843471e+00 0.730000 1.849790e+00 1.946844e+00 1.967584e+00 0.740000 2.066518e+00 2.070947e+00 2.084608e+00 0.750000 2.282551e+00 2.185163e+00 2.190315e+00 0.760000 2.476419e+00 2.284296e+00 2.280342e+00 0.770000 2.624586e+00 2.363084e+00 2.350381e+00 0.780000 2.706446e+00 2.416507e+00 2.396395e+00 0.790000 2.709671e+00 2.440138e+00 2.414867e+00 0.800000 2.633762e+00 2.430512e+00 2.403061e+00 0.810000 2.490197e+00 2.385512e+00 2.359293e+00 0.820000 2.299110e+00 2.304722e+00 2.283198e+00 0.830000 2.084002e+00 2.189740e+00 2.175969e+00 0.840000 1.866653e+00 2.044391e+00 2.040558e+00 0.850000 1.663794e+00 1.874817e+00 1.881798e+00 0.860000 1.486002e+00 1.689399e+00 1.706439e+00 0.870000 1.338291e+00 1.498464e+00 1.523040e+00 0.880000 1.221545e+00 1.313751e+00 1.341704e+00 0.890000 1.134018e+00 1.147597e+00 1.173601e+00 0.900000 1.072503e+00 1.011844e+00 1.030238e+00 0.910000 1.033025e+00 9.164632e-01 9.224422e-01 0.920000 1.011135e+00 8.679496e-01 8.589928e-01 0.930000 1.001930e+00 8.675563e-01 8.448692e-01 0.940000 1.000015e+00 9.095173e-01 8.790638e-01 0.950000 9.995757e-01 9.794604e-01 9.519200e-01 0.960000 9.947162e-01 1.053310e+00 1.041957e+00 0.970000 9.801295e-01 1.097087e+00 1.112156e+00 0.980000 9.519710e-01 1.068153e+00 1.105690e+00 0.990000 9.086638e-01 9.186056e-01 9.411008e-01 gsl-doc-2.3/doc/examples/cblas.c0000664000175000017500000000111012616157443014577 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/nlfit2.c0000644000175000017500000001016012737536472014723 0ustar eddedd#include #include #include #include #include #include int func_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 100.0 * (x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); return GSL_SUCCESS; } int func_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); gsl_matrix_set(J, 0, 0, -200.0*x1); gsl_matrix_set(J, 0, 1, 100.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 1, 1, 0.0); return GSL_SUCCESS; } int func_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); gsl_vector_set(fvv, 0, -200.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector * x = gsl_multifit_nlinear_position(w); /* print out current location */ printf("%f %f\n", gsl_vector_get(x, 0), gsl_vector_get(x, 1)); } void solve_system(gsl_vector *x0, gsl_multifit_nlinear_fdf *fdf, gsl_multifit_nlinear_parameters *params) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multifit_nlinear_workspace *work = gsl_multifit_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multifit_nlinear_residual(work); gsl_vector * x = gsl_multifit_nlinear_position(work); int info; double chisq0, chisq, rcond; /* initialize solver */ gsl_multifit_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, callback, NULL, &info, work); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* store cond(J(x)) */ gsl_multifit_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "NITER = %zu\n", gsl_multifit_nlinear_niter(work)); fprintf(stderr, "NFEV = %zu\n", fdf->nevalf); fprintf(stderr, "NJEV = %zu\n", fdf->nevaldf); fprintf(stderr, "NAEV = %zu\n", fdf->nevalfvv); fprintf(stderr, "initial cost = %.12e\n", chisq0); fprintf(stderr, "final cost = %.12e\n", chisq); fprintf(stderr, "final x = (%.12e, %.12e)\n", gsl_vector_get(x, 0), gsl_vector_get(x, 1)); fprintf(stderr, "final cond(J) = %.12e\n", 1.0 / rcond); printf("\n\n"); gsl_multifit_nlinear_free(work); } int main (void) { const size_t n = 2; const size_t p = 2; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); /* print map of Phi(x1, x2) */ { double x1, x2, chisq; double *f1 = gsl_vector_ptr(f, 0); double *f2 = gsl_vector_ptr(f, 1); for (x1 = -1.2; x1 < 1.3; x1 += 0.1) { for (x2 = -0.5; x2 < 2.1; x2 += 0.1) { gsl_vector_set(x, 0, x1); gsl_vector_set(x, 1, x2); func_f(x, NULL, f); chisq = (*f1) * (*f1) + (*f2) * (*f2); printf("%f %f %f\n", x1, x2, chisq); } printf("\n"); } printf("\n\n"); } /* define function to be minimized */ fdf.f = func_f; fdf.df = func_df; fdf.fvv = func_fvv; fdf.n = n; fdf.p = p; fdf.params = NULL; /* starting point */ gsl_vector_set(x, 0, -0.5); gsl_vector_set(x, 1, 1.75); fprintf(stderr, "=== Solving system without acceleration ===\n"); fdf_params.trs = gsl_multifit_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fprintf(stderr, "=== Solving system with acceleration ===\n"); fdf_params.trs = gsl_multifit_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); return 0; } gsl-doc-2.3/doc/examples/qrng.txt0000664000175000017500000004000012620441254015047 0ustar eddedd0.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 0.18750 0.31250 0.68750 0.81250 0.93750 0.06250 0.43750 0.56250 0.31250 0.18750 0.81250 0.68750 0.56250 0.43750 0.06250 0.93750 0.09375 0.46875 0.59375 0.96875 0.84375 0.21875 0.34375 0.71875 0.46875 0.09375 0.96875 0.59375 0.71875 0.34375 0.21875 0.84375 0.15625 0.15625 0.65625 0.65625 0.90625 0.40625 0.40625 0.90625 0.28125 0.28125 0.78125 0.78125 0.53125 0.03125 0.03125 0.53125 0.04688 0.26562 0.54688 0.76562 0.79688 0.01562 0.29688 0.51562 0.42188 0.14062 0.92188 0.64062 0.67188 0.39062 0.17188 0.89062 0.23438 0.07812 0.73438 0.57812 0.98438 0.32812 0.48438 0.82812 0.35938 0.45312 0.85938 0.95312 0.60938 0.20312 0.10938 0.70312 0.07812 0.23438 0.57812 0.73438 0.82812 0.48438 0.32812 0.98438 0.45312 0.35938 0.95312 0.85938 0.70312 0.10938 0.20312 0.60938 0.14062 0.42188 0.64062 0.92188 0.89062 0.17188 0.39062 0.67188 0.26562 0.04688 0.76562 0.54688 0.51562 0.29688 0.01562 0.79688 0.02344 0.39844 0.52344 0.89844 0.77344 0.14844 0.27344 0.64844 0.39844 0.02344 0.89844 0.52344 0.64844 0.27344 0.14844 0.77344 0.21094 0.21094 0.71094 0.71094 0.96094 0.46094 0.46094 0.96094 0.33594 0.33594 0.83594 0.83594 0.58594 0.08594 0.08594 0.58594 0.11719 0.11719 0.61719 0.61719 0.86719 0.36719 0.36719 0.86719 0.49219 0.49219 0.99219 0.99219 0.74219 0.24219 0.24219 0.74219 0.17969 0.30469 0.67969 0.80469 0.92969 0.05469 0.42969 0.55469 0.30469 0.17969 0.80469 0.67969 0.55469 0.42969 0.05469 0.92969 0.03906 0.13281 0.53906 0.63281 0.78906 0.38281 0.28906 0.88281 0.41406 0.25781 0.91406 0.75781 0.66406 0.00781 0.16406 0.50781 0.22656 0.44531 0.72656 0.94531 0.97656 0.19531 0.47656 0.69531 0.35156 0.07031 0.85156 0.57031 0.60156 0.32031 0.10156 0.82031 0.07031 0.35156 0.57031 0.85156 0.82031 0.10156 0.32031 0.60156 0.44531 0.22656 0.94531 0.72656 0.69531 0.47656 0.19531 0.97656 0.13281 0.03906 0.63281 0.53906 0.88281 0.28906 0.38281 0.78906 0.25781 0.41406 0.75781 0.91406 0.50781 0.16406 0.00781 0.66406 0.01172 0.33203 0.51172 0.83203 0.76172 0.08203 0.26172 0.58203 0.38672 0.20703 0.88672 0.70703 0.63672 0.45703 0.13672 0.95703 0.19922 0.01953 0.69922 0.51953 0.94922 0.26953 0.44922 0.76953 0.32422 0.39453 0.82422 0.89453 0.57422 0.14453 0.07422 0.64453 0.10547 0.17578 0.60547 0.67578 0.85547 0.42578 0.35547 0.92578 0.48047 0.30078 0.98047 0.80078 0.73047 0.05078 0.23047 0.55078 0.16797 0.48828 0.66797 0.98828 0.91797 0.23828 0.41797 0.73828 0.29297 0.11328 0.79297 0.61328 0.54297 0.36328 0.04297 0.86328 0.05859 0.06641 0.55859 0.56641 0.80859 0.31641 0.30859 0.81641 0.43359 0.44141 0.93359 0.94141 0.68359 0.19141 0.18359 0.69141 0.24609 0.25391 0.74609 0.75391 0.99609 0.00391 0.49609 0.50391 0.37109 0.12891 0.87109 0.62891 0.62109 0.37891 0.12109 0.87891 0.08984 0.41016 0.58984 0.91016 0.83984 0.16016 0.33984 0.66016 0.46484 0.03516 0.96484 0.53516 0.71484 0.28516 0.21484 0.78516 0.15234 0.22266 0.65234 0.72266 0.90234 0.47266 0.40234 0.97266 0.27734 0.34766 0.77734 0.84766 0.52734 0.09766 0.02734 0.59766 0.01953 0.19922 0.51953 0.69922 0.76953 0.44922 0.26953 0.94922 0.39453 0.32422 0.89453 0.82422 0.64453 0.07422 0.14453 0.57422 0.20703 0.38672 0.70703 0.88672 0.95703 0.13672 0.45703 0.63672 0.33203 0.01172 0.83203 0.51172 0.58203 0.26172 0.08203 0.76172 0.11328 0.29297 0.61328 0.79297 0.86328 0.04297 0.36328 0.54297 0.48828 0.16797 0.98828 0.66797 0.73828 0.41797 0.23828 0.91797 0.17578 0.10547 0.67578 0.60547 0.92578 0.35547 0.42578 0.85547 0.30078 0.48047 0.80078 0.98047 0.55078 0.23047 0.05078 0.73047 0.03516 0.46484 0.53516 0.96484 0.78516 0.21484 0.28516 0.71484 0.41016 0.08984 0.91016 0.58984 0.66016 0.33984 0.16016 0.83984 0.22266 0.15234 0.72266 0.65234 0.97266 0.40234 0.47266 0.90234 0.34766 0.27734 0.84766 0.77734 0.59766 0.02734 0.09766 0.52734 0.06641 0.05859 0.56641 0.55859 0.81641 0.30859 0.31641 0.80859 0.44141 0.43359 0.94141 0.93359 0.69141 0.18359 0.19141 0.68359 0.12891 0.37109 0.62891 0.87109 0.87891 0.12109 0.37891 0.62109 0.25391 0.24609 0.75391 0.74609 0.50391 0.49609 0.00391 0.99609 0.00586 0.49805 0.50586 0.99805 0.75586 0.24805 0.25586 0.74805 0.38086 0.12305 0.88086 0.62305 0.63086 0.37305 0.13086 0.87305 0.19336 0.18555 0.69336 0.68555 0.94336 0.43555 0.44336 0.93555 0.31836 0.31055 0.81836 0.81055 0.56836 0.06055 0.06836 0.56055 0.09961 0.02930 0.59961 0.52930 0.84961 0.27930 0.34961 0.77930 0.47461 0.40430 0.97461 0.90430 0.72461 0.15430 0.22461 0.65430 0.16211 0.34180 0.66211 0.84180 0.91211 0.09180 0.41211 0.59180 0.28711 0.21680 0.78711 0.71680 0.53711 0.46680 0.03711 0.96680 0.05273 0.23242 0.55273 0.73242 0.80273 0.48242 0.30273 0.98242 0.42773 0.35742 0.92773 0.85742 0.67773 0.10742 0.17773 0.60742 0.24023 0.41992 0.74023 0.91992 0.99023 0.16992 0.49023 0.66992 0.36523 0.04492 0.86523 0.54492 0.61523 0.29492 0.11523 0.79492 0.08398 0.26367 0.58398 0.76367 0.83398 0.01367 0.33398 0.51367 0.45898 0.13867 0.95898 0.63867 0.70898 0.38867 0.20898 0.88867 0.14648 0.07617 0.64648 0.57617 0.89648 0.32617 0.39648 0.82617 0.27148 0.45117 0.77148 0.95117 0.52148 0.20117 0.02148 0.70117 0.02930 0.09961 0.52930 0.59961 0.77930 0.34961 0.27930 0.84961 0.40430 0.47461 0.90430 0.97461 0.65430 0.22461 0.15430 0.72461 0.21680 0.28711 0.71680 0.78711 0.96680 0.03711 0.46680 0.53711 0.34180 0.16211 0.84180 0.66211 0.59180 0.41211 0.09180 0.91211 0.12305 0.38086 0.62305 0.88086 0.87305 0.13086 0.37305 0.63086 0.49805 0.00586 0.99805 0.50586 0.74805 0.25586 0.24805 0.75586 0.18555 0.19336 0.68555 0.69336 0.93555 0.44336 0.43555 0.94336 0.31055 0.31836 0.81055 0.81836 0.56055 0.06836 0.06055 0.56836 0.04492 0.36523 0.54492 0.86523 0.79492 0.11523 0.29492 0.61523 0.41992 0.24023 0.91992 0.74023 0.66992 0.49023 0.16992 0.99023 0.23242 0.05273 0.73242 0.55273 0.98242 0.30273 0.48242 0.80273 0.35742 0.42773 0.85742 0.92773 0.60742 0.17773 0.10742 0.67773 0.07617 0.14648 0.57617 0.64648 0.82617 0.39648 0.32617 0.89648 0.45117 0.27148 0.95117 0.77148 0.70117 0.02148 0.20117 0.52148 0.13867 0.45898 0.63867 0.95898 0.88867 0.20898 0.38867 0.70898 0.26367 0.08398 0.76367 0.58398 0.51367 0.33398 0.01367 0.83398 0.00977 0.16602 0.50977 0.66602 0.75977 0.41602 0.25977 0.91602 0.38477 0.29102 0.88477 0.79102 0.63477 0.04102 0.13477 0.54102 0.19727 0.47852 0.69727 0.97852 0.94727 0.22852 0.44727 0.72852 0.32227 0.10352 0.82227 0.60352 0.57227 0.35352 0.07227 0.85352 0.10352 0.32227 0.60352 0.82227 0.85352 0.07227 0.35352 0.57227 0.47852 0.19727 0.97852 0.69727 0.72852 0.44727 0.22852 0.94727 0.16602 0.00977 0.66602 0.50977 0.91602 0.25977 0.41602 0.75977 0.29102 0.38477 0.79102 0.88477 0.54102 0.13477 0.04102 0.63477 0.05664 0.43164 0.55664 0.93164 0.80664 0.18164 0.30664 0.68164 0.43164 0.05664 0.93164 0.55664 0.68164 0.30664 0.18164 0.80664 0.24414 0.24414 0.74414 0.74414 0.99414 0.49414 0.49414 0.99414 0.36914 0.36914 0.86914 0.86914 0.61914 0.11914 0.11914 0.61914 0.08789 0.08789 0.58789 0.58789 0.83789 0.33789 0.33789 0.83789 0.46289 0.46289 0.96289 0.96289 0.71289 0.21289 0.21289 0.71289 0.15039 0.27539 0.65039 0.77539 0.90039 0.02539 0.40039 0.52539 0.27539 0.15039 0.77539 0.65039 0.52539 0.40039 0.02539 0.90039 0.01758 0.29883 0.51758 0.79883 0.76758 0.04883 0.26758 0.54883 0.39258 0.17383 0.89258 0.67383 0.64258 0.42383 0.14258 0.92383 0.20508 0.11133 0.70508 0.61133 0.95508 0.36133 0.45508 0.86133 0.33008 0.48633 0.83008 0.98633 0.58008 0.23633 0.08008 0.73633 0.11133 0.20508 0.61133 0.70508 0.86133 0.45508 0.36133 0.95508 0.48633 0.33008 0.98633 0.83008 0.73633 0.08008 0.23633 0.58008 0.17383 0.39258 0.67383 0.89258 0.92383 0.14258 0.42383 0.64258 0.29883 0.01758 0.79883 0.51758 0.54883 0.26758 0.04883 0.76758 0.03320 0.03320 0.53320 0.53320 0.78320 0.28320 0.28320 0.78320 0.40820 0.40820 0.90820 0.90820 0.65820 0.15820 0.15820 0.65820 0.22070 0.34570 0.72070 0.84570 0.97070 0.09570 0.47070 0.59570 0.34570 0.22070 0.84570 0.72070 0.59570 0.47070 0.09570 0.97070 0.06445 0.43945 0.56445 0.93945 0.81445 0.18945 0.31445 0.68945 0.43945 0.06445 0.93945 0.56445 0.68945 0.31445 0.18945 0.81445 0.12695 0.12695 0.62695 0.62695 0.87695 0.37695 0.37695 0.87695 0.25195 0.25195 0.75195 0.75195 0.50195 0.00195 0.00195 0.50195 0.00293 0.25098 0.50293 0.75098 0.75293 0.00098 0.25293 0.50098 0.37793 0.12598 0.87793 0.62598 0.62793 0.37598 0.12793 0.87598 0.19043 0.06348 0.69043 0.56348 0.94043 0.31348 0.44043 0.81348 0.31543 0.43848 0.81543 0.93848 0.56543 0.18848 0.06543 0.68848 0.09668 0.21973 0.59668 0.71973 0.84668 0.46973 0.34668 0.96973 0.47168 0.34473 0.97168 0.84473 0.72168 0.09473 0.22168 0.59473 0.15918 0.40723 0.65918 0.90723 0.90918 0.15723 0.40918 0.65723 0.28418 0.03223 0.78418 0.53223 0.53418 0.28223 0.03418 0.78223 0.04980 0.01660 0.54980 0.51660 0.79980 0.26660 0.29980 0.76660 0.42480 0.39160 0.92480 0.89160 0.67480 0.14160 0.17480 0.64160 0.23730 0.32910 0.73730 0.82910 0.98730 0.07910 0.48730 0.57910 0.36230 0.20410 0.86230 0.70410 0.61230 0.45410 0.11230 0.95410 0.08105 0.48535 0.58105 0.98535 0.83105 0.23535 0.33105 0.73535 0.45605 0.11035 0.95605 0.61035 0.70605 0.36035 0.20605 0.86035 0.14355 0.17285 0.64355 0.67285 0.89355 0.42285 0.39355 0.92285 0.26855 0.29785 0.76855 0.79785 0.51855 0.04785 0.01855 0.54785 0.02637 0.14941 0.52637 0.64941 0.77637 0.39941 0.27637 0.89941 0.40137 0.27441 0.90137 0.77441 0.65137 0.02441 0.15137 0.52441 0.21387 0.46191 0.71387 0.96191 0.96387 0.21191 0.46387 0.71191 0.33887 0.08691 0.83887 0.58691 0.58887 0.33691 0.08887 0.83691 0.12012 0.36816 0.62012 0.86816 0.87012 0.11816 0.37012 0.61816 0.49512 0.24316 0.99512 0.74316 0.74512 0.49316 0.24512 0.99316 0.18262 0.05566 0.68262 0.55566 0.93262 0.30566 0.43262 0.80566 0.30762 0.43066 0.80762 0.93066 0.55762 0.18066 0.05762 0.68066 0.04199 0.38379 0.54199 0.88379 0.79199 0.13379 0.29199 0.63379 0.41699 0.00879 0.91699 0.50879 0.66699 0.25879 0.16699 0.75879 0.22949 0.19629 0.72949 0.69629 0.97949 0.44629 0.47949 0.94629 0.35449 0.32129 0.85449 0.82129 0.60449 0.07129 0.10449 0.57129 0.07324 0.10254 0.57324 0.60254 0.82324 0.35254 0.32324 0.85254 0.44824 0.47754 0.94824 0.97754 0.69824 0.22754 0.19824 0.72754 0.13574 0.29004 0.63574 0.79004 0.88574 0.04004 0.38574 0.54004 0.26074 0.16504 0.76074 0.66504 0.51074 0.41504 0.01074 0.91504 0.01465 0.08301 0.51465 0.58301 0.76465 0.33301 0.26465 0.83301 0.38965 0.45801 0.88965 0.95801 0.63965 0.20801 0.13965 0.70801 0.20215 0.27051 0.70215 0.77051 0.95215 0.02051 0.45215 0.52051 0.32715 0.14551 0.82715 0.64551 0.57715 0.39551 0.07715 0.89551 0.10840 0.42676 0.60840 0.92676 0.85840 0.17676 0.35840 0.67676 0.48340 0.05176 0.98340 0.55176 0.73340 0.30176 0.23340 0.80176 0.17090 0.23926 0.67090 0.73926 0.92090 0.48926 0.42090 0.98926 0.29590 0.36426 0.79590 0.86426 0.54590 0.11426 0.04590 0.61426 0.06152 0.31738 0.56152 0.81738 0.81152 0.06738 0.31152 0.56738 0.43652 0.19238 0.93652 0.69238 0.68652 0.44238 0.18652 0.94238 0.24902 0.00488 0.74902 0.50488 0.99902 0.25488 0.49902 0.75488 0.37402 0.37988 0.87402 0.87988 0.62402 0.12988 0.12402 0.62988 0.09277 0.16113 0.59277 0.66113 0.84277 0.41113 0.34277 0.91113 0.46777 0.28613 0.96777 0.78613 0.71777 0.03613 0.21777 0.53613 0.15527 0.47363 0.65527 0.97363 0.90527 0.22363 0.40527 0.72363 0.28027 0.09863 0.78027 0.59863 0.53027 0.34863 0.03027 0.84863 0.02246 0.45020 0.52246 0.95020 0.77246 0.20020 0.27246 0.70020 0.39746 0.07520 0.89746 0.57520 0.64746 0.32520 0.14746 0.82520 0.20996 0.13770 0.70996 0.63770 0.95996 0.38770 0.45996 0.88770 0.33496 0.26270 0.83496 0.76270 0.58496 0.01270 0.08496 0.51270 0.11621 0.04395 0.61621 0.54395 0.86621 0.29395 0.36621 0.79395 0.49121 0.41895 0.99121 0.91895 0.74121 0.16895 0.24121 0.66895 0.17871 0.35645 0.67871 0.85645 0.92871 0.10645 0.42871 0.60645 0.30371 0.23145 0.80371 0.73145 0.55371 0.48145 0.05371 0.98145 0.03809 0.21582 0.53809 0.71582 0.78809 0.46582 0.28809 0.96582 0.41309 0.34082 0.91309 0.84082 0.66309 0.09082 0.16309 0.59082 0.22559 0.40332 0.72559 0.90332 0.97559 0.15332 0.47559 0.65332 0.35059 0.02832 0.85059 0.52832 0.60059 0.27832 0.10059 0.77832 0.06934 0.30957 0.56934 0.80957 0.81934 0.05957 0.31934 0.55957 0.44434 0.18457 0.94434 0.68457 0.69434 0.43457 0.19434 0.93457 0.13184 0.12207 0.63184 0.62207 0.88184 0.37207 0.38184 0.87207 0.25684 0.49707 0.75684 0.99707 0.50684 0.24707 0.00684 0.74707 0.00488 0.24902 0.50488 0.74902 0.75488 0.49902 0.25488 0.99902 0.37988 0.37402 0.87988 0.87402 0.62988 0.12402 0.12988 0.62402 0.19238 0.43652 0.69238 0.93652 0.94238 0.18652 0.44238 0.68652 0.31738 0.06152 0.81738 0.56152 0.56738 0.31152 0.06738 0.81152 0.09863 0.28027 0.59863 0.78027 0.84863 0.03027 0.34863 0.53027 0.47363 0.15527 0.97363 0.65527 0.72363 0.40527 0.22363 0.90527 0.16113 0.09277 0.66113 0.59277 0.91113 0.34277 0.41113 0.84277 0.28613 0.46777 0.78613 0.96777 0.53613 0.21777 0.03613 0.71777 0.05176 0.48340 0.55176 0.98340 0.80176 0.23340 0.30176 0.73340 0.42676 0.10840 0.92676 0.60840 0.67676 0.35840 0.17676 0.85840 0.23926 0.17090 0.73926 0.67090 0.98926 0.42090 0.48926 0.92090 0.36426 0.29590 0.86426 0.79590 0.61426 0.04590 0.11426 0.54590 0.08301 0.01465 0.58301 0.51465 0.83301 0.26465 0.33301 0.76465 0.45801 0.38965 0.95801 0.88965 0.70801 0.13965 0.20801 0.63965 0.14551 0.32715 0.64551 0.82715 0.89551 0.07715 0.39551 0.57715 0.27051 0.20215 0.77051 0.70215 0.52051 0.45215 0.02051 0.95215 0.02832 0.35059 0.52832 0.85059 0.77832 0.10059 0.27832 0.60059 0.40332 0.22559 0.90332 0.72559 0.65332 0.47559 0.15332 0.97559 0.21582 0.03809 0.71582 0.53809 0.96582 0.28809 0.46582 0.78809 0.34082 0.41309 0.84082 0.91309 0.59082 0.16309 0.09082 0.66309 0.12207 0.13184 0.62207 0.63184 0.87207 0.38184 0.37207 0.88184 0.49707 0.25684 0.99707 0.75684 0.74707 0.00684 0.24707 0.50684 0.18457 0.44434 0.68457 0.94434 0.93457 0.19434 0.43457 0.69434 0.30957 0.06934 0.80957 0.56934 0.55957 0.31934 0.05957 0.81934 0.04395 0.11621 0.54395 0.61621 0.79395 0.36621 0.29395 0.86621 0.41895 0.49121 0.91895 0.99121 0.66895 0.24121 0.16895 0.74121 0.23145 0.30371 0.73145 0.80371 0.98145 0.05371 0.48145 0.55371 0.35645 0.17871 0.85645 0.67871 0.60645 0.42871 0.10645 0.92871 0.07520 0.39746 0.57520 0.89746 0.82520 0.14746 0.32520 0.64746 0.45020 0.02246 0.95020 0.52246 0.70020 0.27246 0.20020 0.77246 0.13770 0.20996 0.63770 0.70996 0.88770 0.45996 0.38770 0.95996 0.26270 0.33496 0.76270 0.83496 0.51270 0.08496 0.01270 0.58496 0.00879 0.41699 0.50879 0.91699 0.75879 0.16699 0.25879 0.66699 0.38379 0.04199 0.88379 0.54199 0.63379 0.29199 0.13379 0.79199 0.19629 0.22949 0.69629 0.72949 0.94629 0.47949 0.44629 0.97949 0.32129 0.35449 0.82129 0.85449 0.57129 0.10449 0.07129 0.60449 0.10254 0.07324 0.60254 0.57324 0.85254 0.32324 0.35254 0.82324 0.47754 0.44824 0.97754 0.94824 0.72754 0.19824 0.22754 0.69824 0.16504 0.26074 0.66504 0.76074 0.91504 0.01074 0.41504 0.51074 0.29004 0.13574 0.79004 0.63574 0.54004 0.38574 0.04004 0.88574 0.05566 0.18262 0.55566 0.68262 0.80566 0.43262 0.30566 0.93262 0.43066 0.30762 0.93066 0.80762 0.68066 0.05762 0.18066 0.55762 0.24316 0.49512 0.74316 0.99512 0.99316 0.24512 0.49316 0.74512 0.36816 0.12012 0.86816 0.62012 0.61816 0.37012 0.11816 0.87012 0.08691 0.33887 0.58691 0.83887 0.83691 0.08887 0.33691 0.58887 0.46191 0.21387 0.96191 0.71387 0.71191 0.46387 0.21191 0.96387 0.14941 0.02637 0.64941 0.52637 0.89941 0.27637 0.39941 0.77637 0.27441 0.40137 0.77441 0.90137 0.52441 0.15137 0.02441 0.65137 0.01660 0.04980 0.51660 0.54980 0.76660 0.29980 0.26660 0.79980 0.39160 0.42480 0.89160 0.92480 0.64160 0.17480 0.14160 0.67480 0.20410 0.36230 0.70410 0.86230 0.95410 0.11230 0.45410 0.61230 0.32910 0.23730 0.82910 0.73730 0.57910 0.48730 0.07910 0.98730 0.11035 0.45605 0.61035 0.95605 0.86035 0.20605 0.36035 0.70605 0.48535 0.08105 0.98535 0.58105 0.73535 0.33105 0.23535 0.83105 0.17285 0.14355 0.67285 0.64355 0.92285 0.39355 0.42285 0.89355 0.29785 0.26855 0.79785 0.76855 0.54785 0.01855 0.04785 0.51855 0.03223 0.28418 0.53223 0.78418 0.78223 0.03418 0.28223 0.53418 0.40723 0.15918 0.90723 0.65918 0.65723 0.40918 0.15723 0.90918 0.21973 0.09668 0.71973 0.59668 0.96973 0.34668 0.46973 0.84668 0.34473 0.47168 0.84473 0.97168 0.59473 0.22168 0.09473 0.72168 0.06348 0.19043 0.56348 0.69043 0.81348 0.44043 0.31348 0.94043 0.43848 0.31543 0.93848 0.81543 0.68848 0.06543 0.18848 0.56543 0.12598 0.37793 0.62598 0.87793 0.87598 0.12793 0.37598 0.62793 0.25098 0.00293 0.75098 0.50293 0.50098 0.25293 0.00098 0.75293 0.00146 0.37646 gsl-doc-2.3/doc/examples/cdf.c0000664000175000017500000000061512616157443014260 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/Makefile.am0000644000175000017500000000452413004361416015402 0ustar eddedd## Process this file with automake to produce Makefile.in check_PROGRAMS = blas block cblas cdf cheb combination multiset const diff eigen fft fftmr fftreal fitting fitting2 fitting3 fitreg fitreg2 histogram histogram2d ieee ieeeround integration interp interp2d intro linalglu largefit matrix matrixw min monte ntupler ntuplew ode-initval permseq permshuffle polyroots qrng randpoisson randwalk rng rngunif robfit rootnewt roots siman sortsmall specfun specfun_e rstat rquantile stat statsort sum vector vectorr vectorview vectorw dwt nlfit nlfit2 nlfit3 nlfit4 interpp eigen_nonsymm bspline poisson interp_compare spmatrix examples_src = blas.c block.c cblas.c cdf.c cheb.c combination.c multiset.c const.c demo_fn.c diff.c eigen.c fft.c fftmr.c fftreal.c fitting.c fitting2.c fitting3.c fitreg.c fitreg2.c histogram.c histogram2d.c ieee.c ieeeround.c integration.c interp.c interp2d.c intro.c linalglu.c largefit.c matrix.c matrixw.c min.c monte.c ntupler.c ntuplew.c ode-initval.c odefixed.c permseq.c permshuffle.c polyroots.c qrng.c randpoisson.c randwalk.c rng.c rngunif.c robfit.c rootnewt.c roots.c siman.c sortsmall.c specfun.c specfun_e.c rstat.c rquantile.c stat.c statsort.c sum.c vector.c vectorr.c vectorview.c vectorw.c demo_fn.h dwt.c nlfit.c nlfit2.c nlfit3.c interpp.c eigen_nonsymm.c bspline.c multimin.c multiminfn.c nmsimplex.c ode-initval-low-level.c poisson.c interp_compare.c spmatrix.c examples_txt = blas.txt block.txt bspline.txt cblas.txt cdf.txt cheb.txt combination.txt const.txt diff.txt dwt.txt eigen_nonsymm.txt eigen.txt fftmr.txt fftreal.txt fft.txt fitreg.txt fitreg2.txt fitting2.txt fitting.txt histogram2d.txt ieeeround.txt ieee.txt integration.txt interp2d.txt interp_compare.txt interpp.txt interp.txt intro.txt largefit.txt largefit2.txt linalglu.txt matrix.txt matrixw.txt min.txt monte.txt multimin.txt multiset.txt nlfit.txt nlfit2.txt nlfit3.txt nmsimplex.txt ntuple.txt ode-initval.txt permseq.txt permshuffle.txt poisson.txt polyroots.txt qrng.txt randpoisson2.txt randpoisson.txt randwalk.txt rng.txt rngunif.txt rngunif2.txt robfit.txt rootnewt.txt roots.txt rquantile.txt rstat.txt siman.txt sortsmall.txt specfun.txt specfun_e.txt spmatrix.txt statsort.txt stat.txt sum.txt vectorr.txt vectorview.txt dist_noinst_DATA = $(examples_src) $(examples_txt) LDADD = ../../libgsl.la ../../cblas/libgslcblas.la AM_DEFAULT_SOURCE_EXT = .c gsl-doc-2.3/doc/examples/interp_compare.txt0000664000175000017500000000662212620026734017125 0ustar eddedd7.99 0 8.09 2.76429e-05 8.19 0.0437498 8.7 0.169183 9.2 0.469428 10 0.94374 12 0.998636 15 0.999919 20 0.999994 7.99 0 0 0 8.1101 0.00610446 0.00744955 0.00331374 8.2302 0.0614194 0.0555643 0.0585695 8.3503 0.0977872 0.077852 0.0890428 8.4704 0.119747 0.0939162 0.109376 8.5905 0.140403 0.120807 0.133115 8.7106 0.172856 0.175411 0.173766 8.8307 0.226073 0.246775 0.235226 8.9508 0.296298 0.319125 0.309035 9.0709 0.377336 0.391778 0.387772 9.191 0.462995 0.464047 0.464021 9.3111 0.54776 0.537332 0.542831 9.4312 0.629514 0.612947 0.632609 9.5513 0.707207 0.688966 0.724776 9.6714 0.779786 0.76345 0.810671 9.7915 0.846198 0.834458 0.881632 9.9116 0.905394 0.900051 0.928998 10.0317 0.956324 0.958173 0.945466 10.1518 0.998494 1.0054 0.951748 10.2719 1.03243 1.04165 0.957624 10.392 1.05878 1.06799 0.963098 10.5121 1.07819 1.08551 0.96817 10.6322 1.0913 1.09528 0.972843 10.7523 1.09875 1.09837 0.97712 10.8724 1.10119 1.09586 0.981003 10.9925 1.09925 1.08883 0.984493 11.1126 1.09359 1.07836 0.987594 11.2327 1.08484 1.06552 0.990307 11.3528 1.07366 1.05138 0.992634 11.4729 1.06067 1.03704 0.994578 11.593 1.04654 1.02355 0.996142 11.7131 1.03189 1.012 0.997326 11.8332 1.01737 1.00347 0.998134 11.9533 1.00363 0.999027 0.998568 12.0734 0.991283 0.998669 0.998698 12.1935 0.980549 0.998727 0.998796 12.3136 0.971356 0.998787 0.998889 12.4337 0.963625 0.99885 0.998979 12.5538 0.957277 0.998914 0.999063 12.6739 0.952232 0.99898 0.999144 12.794 0.94841 0.999047 0.999221 12.9141 0.945733 0.999114 0.999293 13.0342 0.944121 0.999182 0.999361 13.1543 0.943493 0.999249 0.999425 13.2744 0.943772 0.999316 0.999485 13.3945 0.944877 0.999381 0.999541 13.5146 0.946729 0.999445 0.999593 13.6347 0.949248 0.999507 0.999641 13.7548 0.952355 0.999566 0.999685 13.8749 0.955971 0.999622 0.999725 13.995 0.960016 0.999674 0.999762 14.1151 0.964411 0.999723 0.999794 14.2352 0.969075 0.999767 0.999823 14.3553 0.973931 0.999807 0.999848 14.4754 0.978897 0.999841 0.999869 14.5955 0.983896 0.99987 0.999887 14.7156 0.988847 0.999893 0.9999 14.8357 0.99367 0.999909 0.999911 14.9558 0.998288 0.999918 0.999917 15.0759 1.00262 0.999921 0.999921 15.196 1.00665 0.999925 0.999925 15.3161 1.01037 0.999929 0.999928 15.4362 1.0138 0.999935 0.999931 15.5563 1.01694 0.999941 0.999934 15.6764 1.01979 0.999949 0.999937 15.7965 1.02238 0.999956 0.999939 15.9166 1.0247 0.999965 0.999942 16.0367 1.02677 0.999974 0.999944 16.1568 1.02858 0.999983 0.999947 16.2769 1.03015 0.999993 0.999949 16.397 1.03149 1 0.999951 16.5171 1.0326 1.00001 0.999953 16.6372 1.03349 1.00002 0.999955 16.7573 1.03417 1.00003 0.999956 16.8774 1.03464 1.00004 0.999958 16.9975 1.03492 1.00005 0.99996 17.1176 1.035 1.00006 0.999961 17.2377 1.03491 1.00007 0.999963 17.3578 1.03464 1.00008 0.999964 17.4779 1.03421 1.00009 0.999966 17.598 1.03361 1.0001 0.999967 17.7181 1.03287 1.0001 0.999968 17.8382 1.03198 1.00011 0.99997 17.9583 1.03095 1.00011 0.999971 18.0784 1.0298 1.00012 0.999972 18.1985 1.02852 1.00012 0.999973 18.3186 1.02713 1.00012 0.999974 18.4387 1.02563 1.00013 0.999976 18.5588 1.02404 1.00012 0.999977 18.6789 1.02236 1.00012 0.999978 18.799 1.02059 1.00012 0.999979 18.9191 1.01875 1.00012 0.999981 19.0392 1.01683 1.00011 0.999982 19.1593 1.01486 1.0001 0.999983 19.2794 1.01284 1.00009 0.999985 19.3995 1.01076 1.00008 0.999986 19.5196 1.00866 1.00007 0.999987 19.6397 1.00652 1.00005 0.999989 19.7598 1.00436 1.00004 0.999991 19.8799 1.00218 1.00002 0.999992 20 0.999994 0.999994 0.999994 gsl-doc-2.3/doc/examples/cblas.txt0000664000175000017500000000004412620026734015172 0ustar eddedd[ 367.76, 368.12 674.06, 674.72 ] gsl-doc-2.3/doc/examples/fitreg2.c0000644000175000017500000001102213004361675015052 0ustar eddedd#include #include #include #include #include static int hilbert_matrix(gsl_matrix * m) { const size_t N = m->size1; const size_t M = m->size2; size_t i, j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { gsl_matrix_set(m, i, j, 1.0/(i+j+1.0)); } } return GSL_SUCCESS; } int main() { const size_t n = 10; /* number of observations */ const size_t p = 8; /* number of model parameters */ size_t i; gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); /* construct Hilbert matrix and rhs vector */ hilbert_matrix(X); { double val = 1.0; for (i = 0; i < n; ++i) { gsl_vector_set(y, i, val); val *= -1.0; } } { const size_t npoints = 200; /* number of points on L-curve and GCV curve */ gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_vector *c = gsl_vector_alloc(p); /* OLS solution */ gsl_vector *c_lcurve = gsl_vector_alloc(p); /* regularized solution (L-curve) */ gsl_vector *c_gcv = gsl_vector_alloc(p); /* regularized solution (GCV) */ gsl_vector *reg_param = gsl_vector_alloc(npoints); gsl_vector *rho = gsl_vector_alloc(npoints); /* residual norms */ gsl_vector *eta = gsl_vector_alloc(npoints); /* solution norms */ gsl_vector *G = gsl_vector_alloc(npoints); /* GCV function values */ double lambda_l; /* optimal regularization parameter (L-curve) */ double lambda_gcv; /* optimal regularization parameter (GCV) */ double G_gcv; /* G(lambda_gcv) */ size_t reg_idx; /* index of optimal lambda */ double rcond; /* reciprocal condition number of X */ double chisq, rnorm, snorm; /* compute SVD of X */ gsl_multifit_linear_svd(X, w); rcond = gsl_multifit_linear_rcond(w); fprintf(stderr, "matrix condition number = %e\n", 1.0 / rcond); /* unregularized (standard) least squares fit, lambda = 0 */ gsl_multifit_linear_solve(0.0, X, y, c, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0); fprintf(stderr, "=== Unregularized fit ===\n"); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate L-curve and find its corner */ gsl_multifit_linear_lcurve(y, reg_param, rho, eta, w); gsl_multifit_linear_lcorner(rho, eta, ®_idx); /* store optimal regularization parameter */ lambda_l = gsl_vector_get(reg_param, reg_idx); /* regularize with lambda_l */ gsl_multifit_linear_solve(lambda_l, X, y, c_lcurve, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_l * snorm, 2.0); fprintf(stderr, "=== Regularized fit (L-curve) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_l); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate GCV curve and find its minimum */ gsl_multifit_linear_gcv(y, reg_param, G, &lambda_gcv, &G_gcv, w); /* regularize with lambda_gcv */ gsl_multifit_linear_solve(lambda_gcv, X, y, c_gcv, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_gcv * snorm, 2.0); fprintf(stderr, "=== Regularized fit (GCV) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_gcv); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* output L-curve and GCV curve */ for (i = 0; i < npoints; ++i) { printf("%e %e %e %e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i), gsl_vector_get(G, i)); } /* output L-curve corner point */ printf("\n\n%f %f\n", gsl_vector_get(rho, reg_idx), gsl_vector_get(eta, reg_idx)); /* output GCV curve corner minimum */ printf("\n\n%e %e\n", lambda_gcv, G_gcv); gsl_multifit_linear_free(w); gsl_vector_free(c); gsl_vector_free(c_lcurve); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); gsl_vector_free(G); } gsl_matrix_free(X); gsl_vector_free(y); return 0; } gsl-doc-2.3/doc/examples/combination.c0000664000175000017500000000073412616157443016030 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/min.txt0000664000175000017500000000077612620437424014707 0ustar eddeddusing brent method iter [ lower, upper] min err err(est) 0 [0.0000000, 6.0000000] 2.0000000 -1.1415927 6.0000000 1 [2.0000000, 6.0000000] 3.5278640 +0.3862713 4.0000000 2 [2.0000000, 3.5278640] 3.1748217 +0.0332290 1.5278640 3 [2.0000000, 3.1748217] 3.1264576 -0.0151351 1.1748217 4 [3.1264576, 3.1748217] 3.1414743 -0.0001183 0.0483641 5 [3.1414743, 3.1748217] 3.1415930 +0.0000004 0.0333474 Converged: 6 [3.1414743, 3.1415930] 3.1415927 +0.0000000 0.0001187 gsl-doc-2.3/doc/examples/siman.c0000664000175000017500000000302712620170405014617 0ustar eddedd#include #include #include #include /* 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(void) { 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; } gsl-doc-2.3/doc/examples/const.txt0000664000175000017500000000012312620026734015232 0ustar eddeddlight travel time from Earth to Mars: minimum = 4.3 minutes maximum = 21.0 minutes gsl-doc-2.3/doc/examples/randpoisson.c0000664000175000017500000000112312616157443016056 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/diff.txt0000664000175000017500000000022612620430442015013 0ustar eddeddf(x) = x^(3/2) x = 2.0 f'(x) = 2.1213203120 +/- 0.0000005006 exact = 2.1213203436 x = 0.0 f'(x) = 0.0000000160 +/- 0.0000000339 exact = 0.0000000000 gsl-doc-2.3/doc/examples/eigen_nonsymm.c0000664000175000017500000000250612616157443016374 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/nlfit.c0000644000175000017500000001226012771456163014640 0ustar eddedd#include #include #include #include #include #include #include #include /* number of data points to fit */ #define N 40 struct data { size_t n; double * y; }; 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 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]); } return GSL_SUCCESS; } int expb_df (const gsl_vector * x, void *data, gsl_matrix * J) { size_t n = ((struct data *)data)->n; 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 e = exp(-lambda * t); gsl_matrix_set (J, i, 0, e); gsl_matrix_set (J, i, 1, -t * A * e); gsl_matrix_set (J, i, 2, 1.0); } return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector *f = gsl_multifit_nlinear_residual(w); gsl_vector *x = gsl_multifit_nlinear_position(w); double rcond; /* compute reciprocal condition number of J(x) */ gsl_multifit_nlinear_rcond(&rcond, w); fprintf(stderr, "iter %2zu: A = %.4f, lambda = %.4f, b = %.4f, cond(J) = %8.4f, |f(x)| = %.4f\n", iter, gsl_vector_get(x, 0), gsl_vector_get(x, 1), gsl_vector_get(x, 2), 1.0 / rcond, gsl_blas_dnrm2(f)); } int main (void) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; gsl_multifit_nlinear_workspace *w; gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); const size_t n = N; const size_t p = 3; gsl_vector *f; gsl_matrix *J; gsl_matrix *covar = gsl_matrix_alloc (p, p); double y[N], weights[N]; struct data d = { n, y }; double x_init[3] = { 1.0, 1.0, 0.0 }; /* starting values */ gsl_vector_view x = gsl_vector_view_array (x_init, p); gsl_vector_view wts = gsl_vector_view_array(weights, n); gsl_rng * r; double chisq, chisq0; int status, info; size_t i; const double xtol = 1e-8; const double gtol = 1e-8; const double ftol = 0.0; gsl_rng_env_setup(); r = gsl_rng_alloc(gsl_rng_default); /* define the function to be minimized */ fdf.f = expb_f; fdf.df = expb_df; /* set to NULL for finite-difference Jacobian */ fdf.fvv = NULL; /* not using geodesic acceleration */ fdf.n = n; fdf.p = p; fdf.params = &d; /* this is the data to be fitted */ for (i = 0; i < n; i++) { double t = i; double yi = 1.0 + 5 * exp (-0.1 * t); double si = 0.1 * yi; double dy = gsl_ran_gaussian(r, si); weights[i] = 1.0 / (si * si); y[i] = yi + dy; printf ("data: %zu %g %g\n", i, y[i], si); }; /* allocate workspace with default parameters */ w = gsl_multifit_nlinear_alloc (T, &fdf_params, n, p); /* initialize solver with starting point and weights */ gsl_multifit_nlinear_winit (&x.vector, &wts.vector, &fdf, w); /* compute initial cost function */ f = gsl_multifit_nlinear_residual(w); gsl_blas_ddot(f, f, &chisq0); /* solve the system with a maximum of 20 iterations */ status = gsl_multifit_nlinear_driver(20, xtol, gtol, ftol, callback, NULL, &info, w); /* compute covariance of best fit parameters */ J = gsl_multifit_nlinear_jac(w); gsl_multifit_nlinear_covar (J, 0.0, covar); /* compute final cost */ gsl_blas_ddot(f, f, &chisq); #define FIT(i) gsl_vector_get(w->x, i) #define ERR(i) sqrt(gsl_matrix_get(covar,i,i)) fprintf(stderr, "summary from method '%s/%s'\n", gsl_multifit_nlinear_name(w), gsl_multifit_nlinear_trs_name(w)); fprintf(stderr, "number of iterations: %zu\n", gsl_multifit_nlinear_niter(w)); fprintf(stderr, "function evaluations: %zu\n", fdf.nevalf); fprintf(stderr, "Jacobian evaluations: %zu\n", fdf.nevaldf); fprintf(stderr, "reason for stopping: %s\n", (info == 1) ? "small step size" : "small gradient"); fprintf(stderr, "initial |f(x)| = %f\n", sqrt(chisq0)); fprintf(stderr, "final |f(x)| = %f\n", sqrt(chisq)); { double dof = n - p; double c = GSL_MAX_DBL(1, sqrt(chisq / dof)); fprintf(stderr, "chisq/dof = %g\n", chisq / dof); fprintf (stderr, "A = %.5f +/- %.5f\n", FIT(0), c*ERR(0)); fprintf (stderr, "lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1)); fprintf (stderr, "b = %.5f +/- %.5f\n", FIT(2), c*ERR(2)); } fprintf (stderr, "status = %s\n", gsl_strerror (status)); gsl_multifit_nlinear_free (w); gsl_matrix_free (covar); gsl_rng_free (r); return 0; } gsl-doc-2.3/doc/examples/matrix.txt0000664000175000017500000000073212620437055015420 0ustar eddeddm(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(2,0) = 200.23 m(2,1) = 201.23 m(2,2) = 202.23 m(3,0) = 300.23 m(3,1) = 301.23 m(3,2) = 302.23 m(4,0) = 400.23 m(4,1) = 401.23 m(4,2) = 402.23 m(5,0) = 500.23 m(5,1) = 501.23 m(5,2) = 502.23 m(6,0) = 600.23 m(6,1) = 601.23 m(6,2) = 602.23 m(7,0) = 700.23 m(7,1) = 701.23 m(7,2) = 702.23 m(8,0) = 800.23 m(8,1) = 801.23 m(8,2) = 802.23 m(9,0) = 900.23 m(9,1) = 901.23 m(9,2) = 902.23 gsl-doc-2.3/doc/examples/monte.txt0000664000175000017500000000103012620437540015225 0ustar eddeddplain ================== result = 1.412209 sigma = 0.013436 exact = 1.393204 error = 0.019005 = 1.4 sigma miser ================== result = 1.391322 sigma = 0.003461 exact = 1.393204 error = -0.001882 = 0.54 sigma vegas warm-up ================== result = 1.392673 sigma = 0.003410 exact = 1.393204 error = -0.000531 = 0.16 sigma converging... result = 1.393281 sigma = 0.000362 chisq/dof = 1.5 vegas final ================== result = 1.393281 sigma = 0.000362 exact = 1.393204 error = 0.000077 = 0.21 sigma gsl-doc-2.3/doc/examples/fitreg.c0000644000175000017500000001171713004361416014774 0ustar eddedd#include #include #include #include #include #include int main() { const size_t n = 1000; /* number of observations */ const size_t p = 2; /* number of model parameters */ size_t i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); for (i = 0; i < n; ++i) { /* generate first random variable u */ double ui = 5.0 * gsl_ran_gaussian(r, 1.0); /* set v = u + noise */ double vi = ui + gsl_ran_gaussian(r, 0.001); /* set y = u + v + noise */ double yi = ui + vi + gsl_ran_gaussian(r, 1.0); /* since u =~ v, the matrix X is ill-conditioned */ gsl_matrix_set(X, i, 0, ui); gsl_matrix_set(X, i, 1, vi); /* rhs vector */ gsl_vector_set(y, i, yi); } { const size_t npoints = 200; /* number of points on L-curve and GCV curve */ gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_vector *c = gsl_vector_alloc(p); /* OLS solution */ gsl_vector *c_lcurve = gsl_vector_alloc(p); /* regularized solution (L-curve) */ gsl_vector *c_gcv = gsl_vector_alloc(p); /* regularized solution (GCV) */ gsl_vector *reg_param = gsl_vector_alloc(npoints); gsl_vector *rho = gsl_vector_alloc(npoints); /* residual norms */ gsl_vector *eta = gsl_vector_alloc(npoints); /* solution norms */ gsl_vector *G = gsl_vector_alloc(npoints); /* GCV function values */ double lambda_l; /* optimal regularization parameter (L-curve) */ double lambda_gcv; /* optimal regularization parameter (GCV) */ double G_gcv; /* G(lambda_gcv) */ size_t reg_idx; /* index of optimal lambda */ double rcond; /* reciprocal condition number of X */ double chisq, rnorm, snorm; /* compute SVD of X */ gsl_multifit_linear_svd(X, w); rcond = gsl_multifit_linear_rcond(w); fprintf(stderr, "matrix condition number = %e\n", 1.0 / rcond); /* unregularized (standard) least squares fit, lambda = 0 */ gsl_multifit_linear_solve(0.0, X, y, c, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0); fprintf(stderr, "=== Unregularized fit ===\n"); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c, 0), gsl_vector_get(c, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate L-curve and find its corner */ gsl_multifit_linear_lcurve(y, reg_param, rho, eta, w); gsl_multifit_linear_lcorner(rho, eta, ®_idx); /* store optimal regularization parameter */ lambda_l = gsl_vector_get(reg_param, reg_idx); /* regularize with lambda_l */ gsl_multifit_linear_solve(lambda_l, X, y, c_lcurve, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_l * snorm, 2.0); fprintf(stderr, "=== Regularized fit (L-curve) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_l); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c_lcurve, 0), gsl_vector_get(c_lcurve, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate GCV curve and find its minimum */ gsl_multifit_linear_gcv(y, reg_param, G, &lambda_gcv, &G_gcv, w); /* regularize with lambda_gcv */ gsl_multifit_linear_solve(lambda_gcv, X, y, c_gcv, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_gcv * snorm, 2.0); fprintf(stderr, "=== Regularized fit (GCV) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_gcv); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c_gcv, 0), gsl_vector_get(c_gcv, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* output L-curve and GCV curve */ for (i = 0; i < npoints; ++i) { printf("%e %e %e %e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i), gsl_vector_get(G, i)); } /* output L-curve corner point */ printf("\n\n%f %f\n", gsl_vector_get(rho, reg_idx), gsl_vector_get(eta, reg_idx)); /* output GCV curve corner minimum */ printf("\n\n%e %e\n", lambda_gcv, G_gcv); gsl_multifit_linear_free(w); gsl_vector_free(c); gsl_vector_free(c_lcurve); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); gsl_vector_free(G); } gsl_rng_free(r); gsl_matrix_free(X); gsl_vector_free(y); return 0; } gsl-doc-2.3/doc/examples/rng.c0000664000175000017500000000060712616157443014313 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/specfun_e.txt0000664000175000017500000000016212620443741016057 0ustar eddeddstatus = success J0(5.0) = -0.177596771314338264 +/- 0.000000000000000193 exact = -0.177596771314338292 gsl-doc-2.3/doc/examples/interp.txt0000664000175000017500000002722612620435452015423 0ustar eddedd#m=0,S=2 0 1 1.42074 1.5403 2.45465 1.34636 3.07056 2.08887 3.6216 3.04234 4.52054 5.9912 5.86029 5.87204 7.32849 7.30059 8.49468 8.39186 9.20606 9.77669 #m=1,S=0 0 1 0.01 1.00699 0.02 1.01397 0.03 1.02096 0.04 1.02794 0.05 1.03492 0.06 1.04189 0.07 1.04886 0.08 1.05582 0.09 1.06278 0.1 1.06972 0.11 1.07666 0.12 1.08358 0.13 1.0905 0.14 1.0974 0.15 1.10429 0.16 1.11116 0.17 1.11802 0.18 1.12487 0.19 1.13169 0.2 1.1385 0.21 1.14529 0.22 1.15206 0.23 1.15881 0.24 1.16553 0.25 1.17224 0.26 1.17892 0.27 1.18557 0.28 1.1922 0.29 1.19881 0.3 1.20538 0.31 1.21193 0.32 1.21845 0.33 1.22494 0.34 1.23139 0.35 1.23782 0.36 1.24421 0.37 1.25057 0.38 1.25689 0.39 1.26317 0.4 1.26942 0.41 1.27564 0.42 1.28181 0.43 1.28794 0.44 1.29403 0.45 1.30008 0.46 1.30609 0.47 1.31206 0.48 1.31798 0.49 1.32385 0.5 1.32968 0.51 1.33546 0.52 1.34119 0.53 1.34688 0.54 1.35251 0.55 1.35809 0.56 1.36362 0.57 1.3691 0.58 1.37452 0.59 1.37989 0.6 1.3852 0.61 1.39046 0.62 1.39565 0.63 1.40079 0.64 1.40587 0.65 1.41089 0.66 1.41585 0.67 1.42074 0.68 1.42557 0.69 1.43034 0.7 1.43504 0.71 1.43968 0.72 1.44424 0.73 1.44874 0.74 1.45317 0.75 1.45754 0.76 1.46182 0.77 1.46604 0.78 1.47019 0.79 1.47426 0.8 1.47825 0.81 1.48217 0.82 1.48602 0.83 1.48978 0.84 1.49347 0.85 1.49708 0.86 1.50061 0.87 1.50405 0.88 1.50742 0.89 1.5107 0.9 1.51389 0.91 1.517 0.92 1.52003 0.93 1.52297 0.94 1.52582 0.95 1.52858 0.96 1.53125 0.97 1.53383 0.98 1.53631 0.99 1.53871 1 1.54101 1.01 1.54322 1.02 1.54533 1.03 1.54734 1.04 1.54926 1.05 1.55108 1.06 1.5528 1.07 1.55442 1.08 1.55593 1.09 1.55735 1.1 1.55866 1.11 1.55987 1.12 1.56097 1.13 1.56197 1.14 1.56286 1.15 1.56364 1.16 1.56431 1.17 1.56488 1.18 1.56533 1.19 1.56567 1.2 1.5659 1.21 1.56601 1.22 1.56601 1.23 1.5659 1.24 1.56566 1.25 1.56531 1.26 1.56485 1.27 1.56426 1.28 1.56355 1.29 1.56272 1.3 1.56177 1.31 1.5607 1.32 1.5595 1.33 1.55818 1.34 1.55673 1.35 1.55515 1.36 1.55345 1.37 1.55162 1.38 1.54965 1.39 1.54756 1.4 1.54534 1.41 1.54298 1.42 1.54049 1.43 1.53787 1.44 1.53511 1.45 1.53223 1.46 1.52923 1.47 1.52611 1.48 1.52287 1.49 1.51953 1.5 1.51608 1.51 1.51254 1.52 1.50889 1.53 1.50516 1.54 1.50133 1.55 1.49742 1.56 1.49344 1.57 1.48938 1.58 1.48525 1.59 1.48105 1.6 1.47679 1.61 1.47247 1.62 1.4681 1.63 1.46368 1.64 1.45922 1.65 1.45471 1.66 1.45017 1.67 1.4456 1.68 1.441 1.69 1.43638 1.7 1.43173 1.71 1.42708 1.72 1.42241 1.73 1.41774 1.74 1.41306 1.75 1.40839 1.76 1.40372 1.77 1.39907 1.78 1.39443 1.79 1.38981 1.8 1.38521 1.81 1.38064 1.82 1.37611 1.83 1.37161 1.84 1.36715 1.85 1.36274 1.86 1.35838 1.87 1.35407 1.88 1.34982 1.89 1.34563 1.9 1.34151 1.91 1.33746 1.92 1.33349 1.93 1.32959 1.94 1.32578 1.95 1.32206 1.96 1.31843 1.97 1.3149 1.98 1.31147 1.99 1.30814 2 1.30493 2.01 1.30182 2.02 1.29884 2.03 1.29598 2.04 1.29325 2.05 1.29064 2.06 1.28817 2.07 1.28585 2.08 1.28366 2.09 1.28163 2.1 1.27975 2.11 1.27802 2.12 1.27646 2.13 1.27506 2.14 1.27383 2.15 1.27277 2.16 1.2719 2.17 1.2712 2.18 1.2707 2.19 1.27038 2.2 1.27026 2.21 1.27034 2.22 1.27063 2.23 1.27112 2.24 1.27183 2.25 1.27275 2.26 1.27389 2.27 1.27526 2.28 1.27686 2.29 1.27869 2.3 1.28077 2.31 1.28308 2.32 1.28564 2.33 1.28846 2.34 1.29153 2.35 1.29486 2.36 1.29845 2.37 1.30231 2.38 1.30644 2.39 1.31086 2.4 1.31555 2.41 1.32053 2.42 1.3258 2.43 1.33136 2.44 1.33722 2.45 1.34339 2.46 1.34986 2.47 1.35663 2.48 1.36371 2.49 1.37108 2.5 1.37874 2.51 1.38668 2.52 1.39489 2.53 1.40337 2.54 1.41212 2.55 1.42112 2.56 1.43037 2.57 1.43986 2.58 1.44959 2.59 1.45955 2.6 1.46974 2.61 1.48015 2.62 1.49077 2.63 1.50159 2.64 1.51262 2.65 1.52384 2.66 1.53525 2.67 1.54684 2.68 1.5586 2.69 1.57054 2.7 1.58263 2.71 1.59489 2.72 1.60729 2.73 1.61984 2.74 1.63253 2.75 1.64535 2.76 1.65829 2.77 1.67136 2.78 1.68454 2.79 1.69782 2.8 1.71121 2.81 1.72469 2.82 1.73826 2.83 1.75191 2.84 1.76564 2.85 1.77943 2.86 1.7933 2.87 1.80722 2.88 1.82119 2.89 1.8352 2.9 1.84925 2.91 1.86334 2.92 1.87745 2.93 1.89159 2.94 1.90573 2.95 1.91989 2.96 1.93405 2.97 1.9482 2.98 1.96234 2.99 1.97646 3 1.99057 3.01 2.00464 3.02 2.01867 3.03 2.03267 3.04 2.04661 3.05 2.06051 3.06 2.07434 3.07 2.0881 3.08 2.1018 3.09 2.11543 3.1 2.12901 3.11 2.14254 3.12 2.15605 3.13 2.16954 3.14 2.18303 3.15 2.19651 3.16 2.21002 3.17 2.22354 3.18 2.23711 3.19 2.25072 3.2 2.26439 3.21 2.27813 3.22 2.29195 3.23 2.30586 3.24 2.31988 3.25 2.33401 3.26 2.34826 3.27 2.36266 3.28 2.37719 3.29 2.39189 3.3 2.40676 3.31 2.42181 3.32 2.43704 3.33 2.45249 3.34 2.46814 3.35 2.48402 3.36 2.50014 3.37 2.5165 3.38 2.53312 3.39 2.55001 3.4 2.56718 3.41 2.58464 3.42 2.6024 3.43 2.62047 3.44 2.63887 3.45 2.65761 3.46 2.67669 3.47 2.69613 3.48 2.71593 3.49 2.73612 3.5 2.7567 3.51 2.77768 3.52 2.79907 3.53 2.82088 3.54 2.84313 3.55 2.86583 3.56 2.88898 3.57 2.9126 3.58 2.9367 3.59 2.96129 3.6 2.98638 3.61 3.01199 3.62 3.03811 3.63 3.06477 3.64 3.09196 3.65 3.11965 3.66 3.14785 3.67 3.17653 3.68 3.20568 3.69 3.23529 3.7 3.26534 3.71 3.29583 3.72 3.32674 3.73 3.35806 3.74 3.38977 3.75 3.42185 3.76 3.45431 3.77 3.48712 3.78 3.52026 3.79 3.55374 3.8 3.58753 3.81 3.62162 3.82 3.656 3.83 3.69065 3.84 3.72556 3.85 3.76072 3.86 3.79612 3.87 3.83174 3.88 3.86756 3.89 3.90358 3.9 3.93979 3.91 3.97616 3.92 4.01269 3.93 4.04936 3.94 4.08616 3.95 4.12307 3.96 4.16009 3.97 4.1972 3.98 4.23438 3.99 4.27163 4 4.30892 4.01 4.34626 4.02 4.38361 4.03 4.42098 4.04 4.45835 4.05 4.4957 4.06 4.53302 4.07 4.5703 4.08 4.60752 4.09 4.64467 4.1 4.68174 4.11 4.71872 4.12 4.75559 4.13 4.79233 4.14 4.82895 4.15 4.86541 4.16 4.90171 4.17 4.93784 4.18 4.97378 4.19 5.00953 4.2 5.04505 4.21 5.08035 4.22 5.11541 4.23 5.15022 4.24 5.18476 4.25 5.21902 4.26 5.25299 4.27 5.28665 4.28 5.31999 4.29 5.353 4.3 5.38566 4.31 5.41796 4.32 5.44989 4.33 5.48144 4.34 5.51259 4.35 5.54332 4.36 5.57364 4.37 5.60351 4.38 5.63293 4.39 5.66189 4.4 5.69037 4.41 5.71835 4.42 5.74584 4.43 5.77281 4.44 5.79924 4.45 5.82514 4.46 5.85047 4.47 5.87524 4.48 5.89942 4.49 5.92301 4.5 5.94598 4.51 5.96834 4.52 5.99005 4.53 6.01112 4.54 6.03155 4.55 6.05134 4.56 6.07051 4.57 6.08905 4.58 6.10697 4.59 6.12429 4.6 6.14101 4.61 6.15713 4.62 6.17267 4.63 6.18763 4.64 6.20202 4.65 6.21584 4.66 6.22911 4.67 6.24182 4.68 6.25399 4.69 6.26562 4.7 6.27673 4.71 6.28731 4.72 6.29738 4.73 6.30693 4.74 6.31599 4.75 6.32456 4.76 6.33263 4.77 6.34023 4.78 6.34736 4.79 6.35402 4.8 6.36022 4.81 6.36597 4.82 6.37128 4.83 6.37615 4.84 6.38059 4.85 6.38461 4.86 6.38821 4.87 6.3914 4.88 6.39419 4.89 6.39659 4.9 6.3986 4.91 6.40024 4.92 6.40149 4.93 6.40239 4.94 6.40292 4.95 6.4031 4.96 6.40294 4.97 6.40244 4.98 6.40162 4.99 6.40046 5 6.399 5.01 6.39722 5.02 6.39514 5.03 6.39277 5.04 6.39011 5.05 6.38717 5.06 6.38396 5.07 6.38048 5.08 6.37674 5.09 6.37275 5.1 6.36852 5.11 6.36404 5.12 6.35934 5.13 6.35441 5.14 6.34927 5.15 6.34392 5.16 6.33837 5.17 6.33262 5.18 6.32668 5.19 6.32057 5.2 6.31428 5.21 6.30782 5.22 6.3012 5.23 6.29444 5.24 6.28752 5.25 6.28047 5.26 6.27329 5.27 6.26598 5.28 6.25856 5.29 6.25103 5.3 6.2434 5.31 6.23567 5.32 6.22785 5.33 6.21995 5.34 6.21198 5.35 6.20394 5.36 6.19584 5.37 6.18769 5.38 6.17949 5.39 6.17126 5.4 6.16299 5.41 6.1547 5.42 6.14639 5.43 6.13807 5.44 6.12975 5.45 6.12144 5.46 6.11313 5.47 6.10485 5.48 6.09659 5.49 6.08836 5.5 6.08017 5.51 6.07203 5.52 6.06395 5.53 6.05592 5.54 6.04797 5.55 6.04009 5.56 6.03229 5.57 6.02458 5.58 6.01697 5.59 6.00946 5.6 6.00207 5.61 5.99479 5.62 5.98764 5.63 5.98062 5.64 5.97374 5.65 5.967 5.66 5.96042 5.67 5.954 5.68 5.94775 5.69 5.94168 5.7 5.93578 5.71 5.93008 5.72 5.92457 5.73 5.91927 5.74 5.91418 5.75 5.9093 5.76 5.90465 5.77 5.90023 5.78 5.89605 5.79 5.89212 5.8 5.88844 5.81 5.88502 5.82 5.88187 5.83 5.879 5.84 5.8764 5.85 5.8741 5.86 5.87209 5.87 5.87038 5.88 5.86898 5.89 5.86787 5.9 5.86705 5.91 5.86653 5.92 5.8663 5.93 5.86635 5.94 5.86668 5.95 5.8673 5.96 5.86819 5.97 5.86935 5.98 5.87079 5.99 5.87249 6 5.87446 6.01 5.87669 6.02 5.87918 6.03 5.88193 6.04 5.88492 6.05 5.88817 6.06 5.89167 6.07 5.89541 6.08 5.89939 6.09 5.9036 6.1 5.90806 6.11 5.91274 6.12 5.91766 6.13 5.9228 6.14 5.92816 6.15 5.93374 6.16 5.93955 6.17 5.94556 6.18 5.95179 6.19 5.95822 6.2 5.96486 6.21 5.9717 6.22 5.97875 6.23 5.98598 6.24 5.99342 6.25 6.00104 6.26 6.00885 6.27 6.01684 6.28 6.02502 6.29 6.03337 6.3 6.0419 6.31 6.0506 6.32 6.05947 6.33 6.06851 6.34 6.07771 6.35 6.08707 6.36 6.09659 6.37 6.10627 6.38 6.11609 6.39 6.12607 6.4 6.13619 6.41 6.14645 6.42 6.15686 6.43 6.1674 6.44 6.17807 6.45 6.18887 6.46 6.19981 6.47 6.21086 6.48 6.22204 6.49 6.23334 6.5 6.24475 6.51 6.25628 6.52 6.26792 6.53 6.27966 6.54 6.29151 6.55 6.30346 6.56 6.31551 6.57 6.32765 6.58 6.33988 6.59 6.35221 6.6 6.36462 6.61 6.37711 6.62 6.38968 6.63 6.40233 6.64 6.41506 6.65 6.42786 6.66 6.44072 6.67 6.45365 6.68 6.46664 6.69 6.47969 6.7 6.4928 6.71 6.50596 6.72 6.51917 6.73 6.53243 6.74 6.54574 6.75 6.55908 6.76 6.57246 6.77 6.58588 6.78 6.59933 6.79 6.61282 6.8 6.62632 6.81 6.63986 6.82 6.65341 6.83 6.66698 6.84 6.68056 6.85 6.69416 6.86 6.70776 6.87 6.72137 6.88 6.73499 6.89 6.7486 6.9 6.76221 6.91 6.77581 6.92 6.78941 6.93 6.80299 6.94 6.81656 6.95 6.83011 6.96 6.84364 6.97 6.85714 6.98 6.87062 6.99 6.88407 7 6.89748 7.01 6.91086 7.02 6.9242 7.03 6.9375 7.04 6.95075 7.05 6.96396 7.06 6.97711 7.07 6.99021 7.08 7.00326 7.09 7.01624 7.1 7.02916 7.11 7.04202 7.12 7.0548 7.13 7.06752 7.14 7.08016 7.15 7.09272 7.16 7.10521 7.17 7.1176 7.18 7.12992 7.19 7.14214 7.2 7.15427 7.21 7.1663 7.22 7.17824 7.23 7.19008 7.24 7.20181 7.25 7.21343 7.26 7.22494 7.27 7.23634 7.28 7.24762 7.29 7.25879 7.3 7.26983 7.31 7.28075 7.32 7.29153 7.33 7.30219 7.34 7.31271 7.35 7.32311 7.36 7.33337 7.37 7.34351 7.38 7.35353 7.39 7.36343 7.4 7.37322 7.41 7.38289 7.42 7.39245 7.43 7.40191 7.44 7.41125 7.45 7.4205 7.46 7.42965 7.47 7.43871 7.48 7.44767 7.49 7.45654 7.5 7.46532 7.51 7.47402 7.52 7.48264 7.53 7.49118 7.54 7.49964 7.55 7.50803 7.56 7.51635 7.57 7.52461 7.58 7.5328 7.59 7.54093 7.6 7.549 7.61 7.55702 7.62 7.56498 7.63 7.57289 7.64 7.58076 7.65 7.58858 7.66 7.59637 7.67 7.60411 7.68 7.61182 7.69 7.6195 7.7 7.62715 7.71 7.63477 7.72 7.64237 7.73 7.64994 7.74 7.6575 7.75 7.66505 7.76 7.67258 7.77 7.6801 7.78 7.68762 7.79 7.69513 7.8 7.70265 7.81 7.71016 7.82 7.71768 7.83 7.72521 7.84 7.73275 7.85 7.74031 7.86 7.74788 7.87 7.75547 7.88 7.76308 7.89 7.77072 7.9 7.77839 7.91 7.78609 7.92 7.79382 7.93 7.80159 7.94 7.8094 7.95 7.81725 7.96 7.82515 7.97 7.8331 7.98 7.8411 7.99 7.84915 8 7.85726 8.01 7.86543 8.02 7.87367 8.03 7.88197 8.04 7.89034 8.05 7.89878 8.06 7.90729 8.07 7.91588 8.08 7.92456 8.09 7.93331 8.1 7.94216 8.11 7.95109 8.12 7.96011 8.13 7.96923 8.14 7.97844 8.15 7.98776 8.16 7.99718 8.17 8.00671 8.18 8.01634 8.19 8.02609 8.2 8.03596 8.21 8.04594 8.22 8.05604 8.23 8.06626 8.24 8.07662 8.25 8.0871 8.26 8.09771 8.27 8.10846 8.28 8.11935 8.29 8.13038 8.3 8.14155 8.31 8.15287 8.32 8.16434 8.33 8.17596 8.34 8.18774 8.35 8.19967 8.36 8.21177 8.37 8.22403 8.38 8.23646 8.39 8.24906 8.4 8.26183 8.41 8.27478 8.42 8.2879 8.43 8.30121 8.44 8.3147 8.45 8.32838 8.46 8.34225 8.47 8.35631 8.48 8.37057 8.49 8.38502 8.5 8.39968 8.51 8.41454 8.52 8.4296 8.53 8.44485 8.54 8.4603 8.55 8.47594 8.56 8.49176 8.57 8.50777 8.58 8.52396 8.59 8.54033 8.6 8.55688 8.61 8.57359 8.62 8.59048 8.63 8.60754 8.64 8.62476 8.65 8.64214 8.66 8.65968 8.67 8.67737 8.68 8.69522 8.69 8.71322 8.7 8.73137 8.71 8.74966 8.72 8.76809 8.73 8.78666 8.74 8.80537 8.75 8.82421 8.76 8.84318 8.77 8.86228 8.78 8.8815 8.79 8.90085 8.8 8.92031 8.81 8.93989 8.82 8.95958 8.83 8.97938 8.84 8.99929 8.85 9.0193 8.86 9.03942 8.87 9.05963 8.88 9.07994 8.89 9.10035 8.9 9.12084 8.91 9.14142 8.92 9.16208 8.93 9.18283 8.94 9.20366 8.95 9.22456 8.96 9.24553 8.97 9.26658 8.98 9.28769 8.99 9.30887 9 9.33011 9.01 9.3514 9.02 9.37276 9.03 9.39416 9.04 9.41562 9.05 9.43712 9.06 9.45867 9.07 9.48026 9.08 9.50189 9.09 9.52356 9.1 9.54526 9.11 9.56698 9.12 9.58874 9.13 9.61052 9.14 9.63232 9.15 9.65414 9.16 9.67598 9.17 9.69783 9.18 9.71969 9.19 9.74156 9.2 9.76343 gsl-doc-2.3/doc/examples/polyroots.c0000664000175000017500000000072112616157443015574 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/randpoisson.txt0000664000175000017500000000002512620026734016444 0ustar eddedd 2 5 5 2 1 0 3 4 1 1 gsl-doc-2.3/doc/examples/statsort.txt0000664000175000017500000000024612620444135015774 0ustar eddeddOriginal 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 gsl-doc-2.3/doc/examples/rngunif2.txt0000664000175000017500000000012012620442502015626 0ustar eddedd0.33050 0.86631 0.32982 0.67620 0.53391 0.06457 0.16847 0.70229 0.04371 0.86374 gsl-doc-2.3/doc/examples/fftmr.c0000664000175000017500000000231312620167656014641 0ustar eddedd#include #include #include #include #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 < (int) wavetable->nf; i++) { printf ("# factor %d: %zu\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; } gsl-doc-2.3/doc/examples/vector.c0000664000175000017500000000054612616157443015031 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/nmsimplex.c0000664000175000017500000000255212616157443015542 0ustar eddeddint main(void) { double par[5] = {1.0, 2.0, 10.0, 20.0, 30.0}; const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex2; gsl_multimin_fminimizer *s = NULL; gsl_vector *ss, *x; gsl_multimin_function minex_func; size_t iter = 0; int status; double size; /* Starting point */ x = gsl_vector_alloc (2); gsl_vector_set (x, 0, 5.0); gsl_vector_set (x, 1, 7.0); /* Set initial step sizes to 1 */ ss = gsl_vector_alloc (2); gsl_vector_set_all (ss, 1.0); /* Initialize method and iterate */ minex_func.n = 2; minex_func.f = my_f; minex_func.params = par; s = gsl_multimin_fminimizer_alloc (T, 2); 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 %10.3e %10.3e f() = %7.3f size = %.3f\n", iter, gsl_vector_get (s->x, 0), gsl_vector_get (s->x, 1), s->fval, size); } while (status == GSL_CONTINUE && iter < 100); gsl_vector_free(x); gsl_vector_free(ss); gsl_multimin_fminimizer_free (s); return status; } gsl-doc-2.3/doc/examples/interpp.txt0000664000175000017500000000305512620435703015574 0ustar eddedd#m=0,S=5 0 0.15 0.1 0.7 0.27 -0.1 0.3 0.15 #m=1,S=0 0 0.15 0.003 0.178463 0.006 0.206683 0.009 0.234613 0.012 0.262204 0.015 0.28941 0.018 0.316182 0.021 0.342474 0.024 0.368236 0.027 0.393423 0.03 0.417986 0.033 0.441878 0.036 0.465051 0.039 0.487458 0.042 0.50905 0.045 0.529781 0.048 0.549603 0.051 0.568468 0.054 0.586329 0.057 0.603138 0.06 0.618847 0.063 0.633409 0.066 0.646777 0.069 0.658902 0.072 0.669737 0.075 0.679235 0.078 0.687348 0.081 0.694029 0.084 0.699229 0.087 0.702901 0.09 0.704998 0.093 0.705472 0.096 0.704276 0.099 0.701362 0.102 0.696687 0.105 0.690283 0.108 0.682225 0.111 0.672587 0.114 0.661448 0.117 0.648882 0.12 0.634965 0.123 0.619775 0.126 0.603387 0.129 0.585877 0.132 0.567321 0.135 0.547796 0.138 0.527377 0.141 0.506141 0.144 0.484164 0.147 0.461522 0.15 0.43829 0.153 0.414546 0.156 0.390366 0.159 0.365824 0.162 0.340999 0.165 0.315964 0.168 0.290798 0.171 0.265576 0.174 0.240373 0.177 0.215267 0.18 0.190333 0.183 0.165648 0.186 0.141287 0.189 0.117326 0.192 0.0938429 0.195 0.0709122 0.198 0.0486106 0.201 0.0270141 0.204 0.00619895 0.207 -0.0137588 0.21 -0.0327831 0.213 -0.0507978 0.216 -0.0677266 0.219 -0.0834936 0.222 -0.0980226 0.225 -0.111237 0.228 -0.123062 0.231 -0.13342 0.234 -0.142236 0.237 -0.149433 0.24 -0.154935 0.243 -0.158667 0.246 -0.160551 0.249 -0.160512 0.252 -0.158475 0.255 -0.154361 0.258 -0.148096 0.261 -0.139604 0.264 -0.128808 0.267 -0.115632 0.27 -0.1 0.273 -0.0818941 0.276 -0.0615288 0.279 -0.0391769 0.282 -0.0151111 0.285 0.0103957 0.288 0.0370709 0.291 0.0646417 0.294 0.0928353 0.297 0.121379 0.3 0.15 gsl-doc-2.3/doc/examples/matrixw.c0000664000175000017500000000145112616157443015216 0ustar eddedd#include #include 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); } gsl-doc-2.3/doc/examples/fft.c0000664000175000017500000000136512616157443014306 0ustar eddedd#include #include #include #include #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; } gsl-doc-2.3/doc/examples/sum.txt0000664000175000017500000000042712620444224014715 0ustar eddeddterm-by-term sum = 1.5961632439130233 using 20 terms term-by-term sum = 1.5759958390005426 using 13 terms exact value = 1.6449340668482264 accelerated sum = 1.6449340669228176 using 13 terms estimated error = 0.0000000000888360 actual error = 0.0000000000745912 gsl-doc-2.3/doc/examples/fitting2.txt0000664000175000017500000000126312620435042015634 0ustar eddedd0.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 0.7 1.93249 +/- 0.201375 0.8 2.5107 +/- 0.222554 0.9 2.45078 +/- 0.24596 1 2.24949 +/- 0.271828 1.1 3.08955 +/- 0.300417 1.2 3.82315 +/- 0.332012 1.3 4.26766 +/- 0.36693 1.4 3.2597 +/- 0.40552 1.5 4.98914 +/- 0.448169 1.6 4.14527 +/- 0.495303 1.7 5.22382 +/- 0.547395 1.8 6.3838 +/- 0.604965 1.9 6.00277 +/- 0.668589 # 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 gsl-doc-2.3/doc/examples/spmatrix.txt0000644000175000017500000000126212737536472015774 0ustar eddeddprinting all matrix elements: A(0,0) = 0 A(0,1) = 0 A(0,2) = 3.1 A(0,3) = 4.6 A(1,0) = 1 A(1,1) = 0 A(1,2) = 7.2 A(1,3) = 0 A(2,0) = 0 A(2,1) = 0 A(2,2) = 0 A(2,3) = 0 A(3,0) = 2.1 A(3,1) = 2.9 A(3,2) = 0 A(3,3) = 8.5 A(4,0) = 4.1 A(4,1) = 0 A(4,2) = 0 A(4,3) = 0 matrix in triplet format (i,j,Aij): %%MatrixMarket matrix coordinate real general 5 4 8 1 3 3.1 1 4 4.6 2 1 1.0 2 3 7.2 4 1 2.1 4 2 2.9 4 4 8.5 5 1 4.1 matrix in compressed column format: i = [ 1, 3, 4, 3, 0, 1, 0, 3, ] p = [ 0, 3, 4, 6, 8, ] d = [ 1, 2.1, 4.1, 2.9, 3.1, 7.2, 4.6, 8.5, ] matrix in compressed row format: i = [ 2, 3, 0, 2, 0, 1, 3, 0, ] p = [ 0, 2, 4, 4, 7, 8, ] d = [ 3.1, 4.6, 1, 7.2, 2.1, 2.9, 8.5, 4.1, ] gsl-doc-2.3/doc/examples/integration.c0000664000175000017500000000150212620167715016041 0ustar eddedd#include #include #include 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 = α 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 = %zu\n", w->size); gsl_integration_workspace_free (w); return 0; } gsl-doc-2.3/doc/examples/multiminfn.c0000664000175000017500000000153212616157443015705 0ustar eddedd/* Paraboloid centered on (p[0],p[1]), with scale factors (p[2],p[3]) and minimum p[4] */ double my_f (const gsl_vector *v, void *params) { double x, y; double *p = (double *)params; x = gsl_vector_get(v, 0); y = gsl_vector_get(v, 1); return p[2] * (x - p[0]) * (x - p[0]) + p[3] * (y - p[1]) * (y - p[1]) + p[4]; } /* 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 *p = (double *)params; x = gsl_vector_get(v, 0); y = gsl_vector_get(v, 1); gsl_vector_set(df, 0, 2.0 * p[2] * (x - p[0])); gsl_vector_set(df, 1, 2.0 * p[3] * (y - p[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); } gsl-doc-2.3/doc/examples/vectorr.c0000664000175000017500000000052512616157443015210 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/blas.c0000664000175000017500000000127012616157443014443 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/cdf.txt0000664000175000017500000000016012620026734014641 0ustar eddeddprob(x < 2.000000) = 0.977250 prob(x > 2.000000) = 0.022750 Pinv(0.977250) = 2.000000 Qinv(0.022750) = 2.000000 gsl-doc-2.3/doc/examples/ode-initval.c0000664000175000017500000000264512620170145015731 0ustar eddedd#include #include #include #include int func (double t, const double y[], double f[], void *params) { (void)(t); /* avoid unused parameter warning */ 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) { (void)(t); /* avoid unused parameter warning */ 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) { double mu = 10; gsl_odeiv2_system sys = {func, jac, 2, &mu}; gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd, 1e-6, 1e-6, 0.0); int i; double t = 0.0, t1 = 100.0; double y[2] = { 1.0, 0.0 }; for (i = 1; i <= 100; i++) { double ti = i * t1 / 100.0; int status = gsl_odeiv2_driver_apply (d, &t, ti, y); if (status != GSL_SUCCESS) { printf ("error, return value=%d\n", status); break; } printf ("%.5e %.5e %.5e\n", t, y[0], y[1]); } gsl_odeiv2_driver_free (d); return 0; } gsl-doc-2.3/doc/examples/permshuffle.c0000664000175000017500000000155112616157443016044 0ustar eddedd#include #include #include #include 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; } gsl-doc-2.3/doc/examples/rquantile.c0000664000175000017500000000377012616157443015535 0ustar eddedd#include #include #include #include #include #include #include int main(void) { const size_t N = 10000; double *data = malloc(N * sizeof(double)); gsl_rstat_quantile_workspace *work_25 = gsl_rstat_quantile_alloc(0.25); gsl_rstat_quantile_workspace *work_50 = gsl_rstat_quantile_alloc(0.5); gsl_rstat_quantile_workspace *work_75 = gsl_rstat_quantile_alloc(0.75); gsl_rng *r = gsl_rng_alloc(gsl_rng_default); double exact_p25, exact_p50, exact_p75; double val_p25, val_p50, val_p75; size_t i; /* add data to quantile accumulators; also store data for exact * comparisons */ for (i = 0; i < N; ++i) { data[i] = gsl_ran_rayleigh(r, 1.0); gsl_rstat_quantile_add(data[i], work_25); gsl_rstat_quantile_add(data[i], work_50); gsl_rstat_quantile_add(data[i], work_75); } /* exact values */ gsl_sort(data, 1, N); exact_p25 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.25); exact_p50 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.5); exact_p75 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.75); /* estimated values */ val_p25 = gsl_rstat_quantile_get(work_25); val_p50 = gsl_rstat_quantile_get(work_50); val_p75 = gsl_rstat_quantile_get(work_75); printf ("The dataset is %g, %g, %g, %g, %g, ...\n", data[0], data[1], data[2], data[3], data[4]); printf ("0.25 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p25, val_p25, (val_p25 - exact_p25) / exact_p25); printf ("0.50 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p50, val_p50, (val_p50 - exact_p50) / exact_p50); printf ("0.75 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n", exact_p75, val_p75, (val_p75 - exact_p75) / exact_p75); gsl_rstat_quantile_free(work_25); gsl_rstat_quantile_free(work_50); gsl_rstat_quantile_free(work_75); gsl_rng_free(r); free(data); return 0; } gsl-doc-2.3/doc/examples/robfit.txt0000664000175000017500000000655312620442720015403 0ustar eddedd-5 -2.37026 -2.87902 -2.10098 -4.89899 -3.06063 -2.73364 -1.98182 -4.79798 -2.79445 -2.58825 -1.86266 -4.69697 -1.9834 -2.44287 -1.7435 -4.59596 -2.55248 -2.29749 -1.62435 -4.49495 -2.1527 -2.1521 -1.50519 -4.39394 -1.53374 -2.00672 -1.38603 -4.29293 -1.60044 -1.86134 -1.26687 -4.19192 -1.65824 -1.71596 -1.14772 -4.09091 -1.31187 -1.57057 -1.02856 -3.9899 -1.14541 -1.42519 -0.909399 -3.88889 -1.10025 -1.27981 -0.790242 -3.78788 -1.29679 -1.13443 -0.671084 -3.68687 -0.661557 -0.989042 -0.551926 -3.58586 -0.799823 -0.843659 -0.432768 -3.48485 -1.00446 -0.698277 -0.31361 -3.38384 -0.551036 -0.552894 -0.194452 -3.28283 -0.487787 -0.407511 -0.0752942 -3.18182 -0.511969 -0.262128 0.0438637 -3.08081 -0.373981 -0.116746 0.163022 -2.9798 -0.410372 0.0286373 0.282179 -2.87879 0.0392968 0.17402 0.401337 -2.77778 0.0463711 0.319403 0.520495 -2.67677 0.942404 0.464786 0.639653 -2.57576 0.725083 0.610168 0.758811 -2.47475 1.18992 0.755551 0.877969 -2.37374 1.10364 0.900934 0.997127 -2.27273 1.08316 1.04632 1.11628 -2.17172 1.29164 1.1917 1.23544 -2.07071 1.05976 1.33708 1.3546 -1.9697 1.32046 1.48247 1.47376 -1.86869 1.28781 1.62785 1.59292 -1.76768 1.37979 1.77323 1.71207 -1.66667 2.11146 1.91861 1.83123 -1.56566 2.33522 2.064 1.95039 -1.46465 2.39339 2.20938 2.06955 -1.36364 2.61661 2.35476 2.18871 -1.26263 2.14877 2.50014 2.30786 -1.16162 2.89492 2.64553 2.42702 -1.06061 2.44993 2.79091 2.54618 -0.959596 2.61783 2.93629 2.66534 -0.858586 3.13745 3.08168 2.7845 -0.757576 2.9893 3.22706 2.90365 -0.656566 3.21689 3.37244 3.02281 -0.555556 3.15762 3.51782 3.14197 -0.454545 3.34903 3.66321 3.26113 -0.353535 3.91475 3.80859 3.38028 -0.252525 3.59616 3.95397 3.49944 -0.151515 3.95244 4.09936 3.6186 -0.0505051 4.69839 4.24474 3.73776 0.0505051 4.18035 4.39012 3.85692 0.151515 4.53154 4.5355 3.97607 0.252525 4.38689 4.68089 4.09523 0.353535 4.79302 4.82627 4.21439 0.454545 5.22604 4.97165 4.33355 0.555556 4.85623 5.11704 4.45271 0.656566 5.27284 5.26242 4.57186 0.757576 5.02382 5.4078 4.69102 0.858586 5.43625 5.55318 4.81018 0.959596 5.7776 5.69857 4.92934 1.06061 5.60029 5.84395 5.0485 1.16162 6.07538 5.98933 5.16765 1.26263 6.4516 6.13471 5.28681 1.36364 6.22326 6.2801 5.40597 1.46465 6.16455 6.42548 5.52513 1.56566 6.61031 6.57086 5.64428 1.66667 6.9245 6.71625 5.76344 1.76768 7.12074 6.86163 5.8826 1.86869 7.28779 7.00701 6.00176 1.9697 7.2146 7.15239 6.12092 2.07071 6.97263 7.29778 6.24007 2.17172 7.36772 7.44316 6.35923 2.27273 7.27067 7.58854 6.47839 2.37374 7.75846 7.73393 6.59755 2.47475 7.94306 7.87931 6.71671 2.57576 8.03409 8.02469 6.83586 2.67677 8.53885 8.17007 6.95502 2.77778 8.53239 8.31546 7.07418 2.87879 9.03468 8.46084 7.19334 2.9798 8.57114 8.60622 7.31249 3.08081 9.17798 8.7516 7.43165 3.18182 8.63444 8.89699 7.55081 3.28283 9.38419 9.04237 7.66997 3.38384 9.61631 9.18775 7.78913 3.48485 9.32413 9.33314 7.90828 3.58586 9.70145 9.47852 8.02744 3.68687 9.57266 9.6239 8.1466 3.78788 9.41859 9.76928 8.26576 3.88889 10.132 9.91467 8.38492 3.9899 10.2327 10.0601 8.50407 4.09091 10.3107 10.2054 8.62323 4.19192 10.6821 10.3508 8.74239 4.29293 10.2493 10.4962 8.86155 4.39394 10.2935 10.6416 8.98071 4.49495 10.7085 10.787 9.09986 4.59596 10.6658 10.9323 9.21902 4.69697 10.9327 11.0777 9.33818 4.7 -8.3 11.0821 9.34175 3.5 -6.7 9.35494 7.92616 4.1 -6 10.2185 8.63396 # best fit: Y = 4.31743 + 1.43929 X # covariance matrix: # [ +4.01177e-03, +1.15955e-05 # +1.15955e-05, +4.83755e-04 gsl-doc-2.3/doc/examples/poisson.txt0000644000175000017500000001077612620441111015601 0ustar eddedd0.010101 3.173059613385e-02 3.172793349807e-02 0.020202 6.342924224708e-02 6.342391965656e-02 0.030303 9.506402049003e-02 9.505604330418e-02 0.040404 1.266030773226e-01 1.265924535737e-01 0.050505 1.580146555880e-01 1.580013959733e-01 0.060606 1.892671264895e-01 1.892512443604e-01 0.070707 2.203290214381e-01 2.203105327865e-01 0.080808 2.511690637386e-01 2.511479871811e-01 0.090909 2.817562000827e-01 2.817325568414e-01 0.101010 3.120596318167e-01 3.120334456985e-01 0.111111 3.420488459536e-01 3.420201433257e-01 0.121212 3.716936458969e-01 3.716624556603e-01 0.131313 4.009641818459e-01 4.009305354066e-01 0.141414 4.298309808521e-01 4.297949120892e-01 0.151515 4.582649764957e-01 4.582265217274e-01 0.161616 4.862375381535e-01 4.861967361005e-01 0.171717 5.137204998270e-01 5.136773915734e-01 0.181818 5.406861885033e-01 5.406408174556e-01 0.191919 5.671074520199e-01 5.670598638628e-01 0.202020 5.929576864038e-01 5.929079290546e-01 0.212121 6.182108626605e-01 6.181589862206e-01 0.222222 6.428415529819e-01 6.427876096865e-01 0.232323 6.668249563509e-01 6.667690005163e-01 0.242424 6.901369235131e-01 6.900790114821e-01 0.252525 7.127539812937e-01 7.126941713789e-01 0.262626 7.346533562328e-01 7.345917086575e-01 0.272727 7.558129975160e-01 7.557495743543e-01 0.282828 7.762115991782e-01 7.761464642918e-01 0.292929 7.958286215568e-01 7.957618405308e-01 0.303030 8.146443119729e-01 8.145759520503e-01 0.313131 8.326397246213e-01 8.325698546348e-01 0.323232 8.497967396468e-01 8.497254299495e-01 0.333333 8.660980813897e-01 8.660254037844e-01 0.343434 8.815273357807e-01 8.814533634476e-01 0.353535 8.960689668683e-01 8.959937742913e-01 0.363636 9.097083324629e-01 9.096319953545e-01 0.373737 9.224316988793e-01 9.223542941046e-01 0.383838 9.342262547662e-01 9.341478602651e-01 0.393939 9.450801240055e-01 9.450008187147e-01 0.404040 9.549823776709e-01 9.549022414441e-01 0.414141 9.639230450324e-01 9.638421585599e-01 0.424242 9.718931235958e-01 9.718115683235e-01 0.434343 9.788845881676e-01 9.788024462148e-01 0.444444 9.848903989356e-01 9.848077530122e-01 0.454545 9.899045085574e-01 9.898214418809e-01 0.464646 9.939218682498e-01 9.938384644613e-01 0.474747 9.969384328719e-01 9.968547759519e-01 0.484848 9.989511649991e-01 9.988673391830e-01 0.494949 9.999580379805e-01 9.998741276739e-01 0.505051 9.999580379805e-01 9.998741276739e-01 0.515152 9.989511649991e-01 9.988673391830e-01 0.525253 9.969384328719e-01 9.968547759519e-01 0.535354 9.939218682498e-01 9.938384644613e-01 0.545455 9.899045085574e-01 9.898214418809e-01 0.555556 9.848903989356e-01 9.848077530122e-01 0.565657 9.788845881676e-01 9.788024462148e-01 0.575758 9.718931235958e-01 9.718115683235e-01 0.585859 9.639230450324e-01 9.638421585599e-01 0.595960 9.549823776709e-01 9.549022414441e-01 0.606061 9.450801240055e-01 9.450008187147e-01 0.616162 9.342262547662e-01 9.341478602651e-01 0.626263 9.224316988793e-01 9.223542941046e-01 0.636364 9.097083324629e-01 9.096319953545e-01 0.646465 8.960689668683e-01 8.959937742913e-01 0.656566 8.815273357807e-01 8.814533634476e-01 0.666667 8.660980813897e-01 8.660254037844e-01 0.676768 8.497967396468e-01 8.497254299495e-01 0.686869 8.326397246213e-01 8.325698546348e-01 0.696970 8.146443119729e-01 8.145759520503e-01 0.707071 7.958286215568e-01 7.957618405308e-01 0.717172 7.762115991782e-01 7.761464642918e-01 0.727273 7.558129975160e-01 7.557495743543e-01 0.737374 7.346533562328e-01 7.345917086575e-01 0.747475 7.127539812937e-01 7.126941713789e-01 0.757576 6.901369235131e-01 6.900790114821e-01 0.767677 6.668249563509e-01 6.667690005163e-01 0.777778 6.428415529819e-01 6.427876096865e-01 0.787879 6.182108626605e-01 6.181589862206e-01 0.797980 5.929576864038e-01 5.929079290546e-01 0.808081 5.671074520199e-01 5.670598638628e-01 0.818182 5.406861885033e-01 5.406408174556e-01 0.828283 5.137204998270e-01 5.136773915734e-01 0.838384 4.862375381535e-01 4.861967361005e-01 0.848485 4.582649764957e-01 4.582265217274e-01 0.858586 4.298309808521e-01 4.297949120892e-01 0.868687 4.009641818459e-01 4.009305354066e-01 0.878788 3.716936458969e-01 3.716624556603e-01 0.888889 3.420488459536e-01 3.420201433257e-01 0.898990 3.120596318167e-01 3.120334456985e-01 0.909091 2.817562000827e-01 2.817325568414e-01 0.919192 2.511690637386e-01 2.511479871811e-01 0.929293 2.203290214381e-01 2.203105327865e-01 0.939394 1.892671264895e-01 1.892512443604e-01 0.949495 1.580146555880e-01 1.580013959733e-01 0.959596 1.266030773226e-01 1.265924535737e-01 0.969697 9.506402049003e-02 9.505604330418e-02 0.979798 6.342924224708e-02 6.342391965656e-02 0.989899 3.173059613385e-02 3.172793349807e-02 gsl-doc-2.3/doc/examples/blas.txt0000664000175000017500000000004412620426452015030 0ustar eddedd[ 367.76, 368.12 674.06, 674.72 ] gsl-doc-2.3/doc/examples/statsort.c0000664000175000017500000000175012616157443015410 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/polyroots.txt0000664000175000017500000000036512620441234016162 0ustar eddeddz0 = -0.809016994374947673 +0.587785252292473359 z1 = -0.809016994374947673 -0.587785252292473359 z2 = +0.309016994374947507 +0.951056516295152976 z3 = +0.309016994374947507 -0.951056516295152976 z4 = +0.999999999999999889 +0.000000000000000000 gsl-doc-2.3/doc/examples/largefit.txt0000644000175000017500000010737612753406252015725 0ustar eddedd0.000000 1.013392 0.002000 1.057114 0.004000 1.006672 0.006000 1.005092 0.008000 1.034198 0.010000 0.999146 0.012000 0.972324 0.014000 1.091945 0.016000 1.027780 0.018000 0.997921 0.020000 0.911458 0.022000 1.176001 0.024000 1.249657 0.026001 0.873918 0.028001 0.996930 0.030001 1.168647 0.032001 1.042424 0.034001 0.956186 0.036001 1.032493 0.038001 1.016478 0.040001 0.916054 0.042001 1.160628 0.044001 1.129574 0.046001 1.134291 0.048001 1.103102 0.050001 1.067503 0.052001 1.242134 0.054001 1.210027 0.056001 1.286558 0.058001 1.167437 0.060001 1.270989 0.062001 1.238484 0.064001 1.247879 0.066001 1.318323 0.068001 1.290329 0.070001 1.076233 0.072001 1.364227 0.074001 1.331892 0.076002 1.644310 0.078002 1.272358 0.080002 1.444683 0.082002 1.379124 0.084002 1.681307 0.086002 1.662120 0.088002 1.616803 0.090002 1.563115 0.092002 1.980689 0.094002 1.605972 0.096002 1.714268 0.098002 1.721501 0.100002 1.835777 0.102002 1.843517 0.104002 1.874658 0.106002 1.839987 0.108002 2.096691 0.110002 1.874711 0.112002 2.227526 0.114002 2.198516 0.116002 2.531939 0.118002 2.440293 0.120002 2.474498 0.122002 1.886756 0.124002 2.395872 0.126003 2.424067 0.128003 2.533481 0.130003 2.920822 0.132003 2.639199 0.134003 2.178261 0.136003 2.563181 0.138003 2.330377 0.140003 2.482197 0.142003 2.944214 0.144003 2.375046 0.146003 2.706059 0.148003 2.644492 0.150003 2.344976 0.152003 2.700872 0.154003 3.176028 0.156003 2.982176 0.158003 2.663030 0.160003 2.816813 0.162003 2.245545 0.164003 2.257987 0.166003 2.447319 0.168003 2.955995 0.170003 2.754546 0.172003 3.082176 0.174003 2.488766 0.176004 2.452559 0.178004 2.407845 0.180004 2.795500 0.182004 2.230950 0.184004 2.287802 0.186004 2.460347 0.188004 2.083690 0.190004 2.204919 0.192004 2.696174 0.194004 2.395705 0.196004 2.178485 0.198004 2.307372 0.200004 2.255902 0.202004 1.987918 0.204004 1.887785 0.206004 2.075691 0.208004 1.686572 0.210004 1.982841 0.212004 2.020780 0.214004 1.649430 0.216004 1.963334 0.218004 1.816612 0.220004 2.047502 0.222004 1.570563 0.224004 1.573427 0.226005 1.335974 0.228005 1.378628 0.230005 1.628469 0.232005 1.620938 0.234005 1.216537 0.236005 1.638633 0.238005 1.554498 0.240005 1.391226 0.242005 1.431787 0.244005 1.263934 0.246005 1.425465 0.248005 1.105883 0.250005 1.265657 0.252005 1.168639 0.254005 1.242218 0.256005 1.245104 0.258005 1.108120 0.260005 1.211894 0.262005 1.078647 0.264005 1.057431 0.266005 1.108110 0.268005 1.266898 0.270005 1.100118 0.272005 0.990081 0.274005 1.023601 0.276006 1.238272 0.278006 1.145608 0.280006 1.064366 0.282006 1.025441 0.284006 1.121463 0.286006 0.977097 0.288006 1.032786 0.290006 1.166776 0.292006 1.089725 0.294006 1.048237 0.296006 0.994855 0.298006 0.981623 0.300006 0.964743 0.302006 1.170996 0.304006 0.909883 0.306006 1.060783 0.308006 1.066695 0.310006 1.235120 0.312006 0.983080 0.314006 0.818831 0.316006 1.173228 0.318006 1.052397 0.320006 0.958336 0.322006 1.063317 0.324006 1.045760 0.326007 0.918851 0.328007 0.828151 0.330007 0.922930 0.332007 0.960096 0.334007 0.837558 0.336007 1.093800 0.338007 0.822421 0.340007 0.982303 0.342007 0.857034 0.344007 0.929809 0.346007 1.098484 0.348007 0.912742 0.350007 0.877250 0.352007 0.875453 0.354007 0.842108 0.356007 0.885992 0.358007 0.906674 0.360007 0.948593 0.362007 0.826321 0.364007 0.794805 0.366007 0.799018 0.368007 0.762520 0.370007 0.854828 0.372007 0.913891 0.374007 0.900230 0.376008 0.764344 0.378008 0.893758 0.380008 0.843119 0.382008 0.637597 0.384008 0.732940 0.386008 0.632072 0.388008 0.820424 0.390008 0.653834 0.392008 0.723423 0.394008 0.668586 0.396008 0.587775 0.398008 0.638778 0.400008 0.675101 0.402008 0.679205 0.404008 0.558361 0.406008 0.669089 0.408008 0.659724 0.410008 0.599887 0.412008 0.691995 0.414008 0.577313 0.416008 0.483322 0.418008 0.536498 0.420008 0.504125 0.422008 0.548830 0.424008 0.493233 0.426009 0.477806 0.428009 0.407442 0.430009 0.503880 0.432009 0.460940 0.434009 0.469029 0.436009 0.501596 0.438009 0.405411 0.440009 0.418834 0.442009 0.478496 0.444009 0.420672 0.446009 0.447649 0.448009 0.375458 0.450009 0.400451 0.452009 0.373357 0.454009 0.434920 0.456009 0.422812 0.458009 0.340769 0.460009 0.414966 0.462009 0.369741 0.464009 0.385961 0.466009 0.366010 0.468009 0.353909 0.470009 0.320795 0.472009 0.422465 0.474009 0.402222 0.476010 0.335765 0.478010 0.409413 0.480010 0.384967 0.482010 0.381460 0.484010 0.357884 0.486010 0.423619 0.488010 0.450770 0.490010 0.421563 0.492010 0.386944 0.494010 0.434098 0.496010 0.414335 0.498010 0.373130 0.500010 0.494584 0.502010 0.399168 0.504010 0.327445 0.506010 0.414090 0.508010 0.548788 0.510010 0.413589 0.512010 0.415560 0.514010 0.402811 0.516010 0.467932 0.518010 0.447742 0.520010 0.514848 0.522010 0.545292 0.524010 0.585226 0.526011 0.481420 0.528011 0.542183 0.530011 0.566527 0.532011 0.639324 0.534011 0.665601 0.536011 0.728721 0.538011 0.628460 0.540011 0.745176 0.542011 0.629362 0.544011 0.755605 0.546011 0.730199 0.548011 0.538527 0.550011 0.716283 0.552011 0.653197 0.554011 0.750977 0.556011 0.751317 0.558011 0.669732 0.560011 0.890732 0.562011 0.801524 0.564011 0.896916 0.566011 0.728432 0.568011 0.873384 0.570011 0.915557 0.572011 0.801362 0.574011 0.939248 0.576012 0.841058 0.578012 0.982556 0.580012 0.801244 0.582012 0.944939 0.584012 0.849316 0.586012 1.044572 0.588012 0.991711 0.590012 0.775179 0.592012 0.900808 0.594012 1.054818 0.596012 0.949419 0.598012 1.055190 0.600012 0.960703 0.602012 0.994899 0.604012 0.942069 0.606012 0.782694 0.608012 0.862081 0.610012 0.972296 0.612012 1.084091 0.614012 0.859938 0.616012 0.945606 0.618012 0.991509 0.620012 1.135856 0.622012 1.113732 0.624012 1.075624 0.626013 1.136413 0.628013 0.989279 0.630013 0.986572 0.632013 0.963125 0.634013 0.976137 0.636013 1.133298 0.638013 0.942319 0.640013 1.061070 0.642013 1.010832 0.644013 1.017137 0.646013 1.033211 0.648013 1.023089 0.650013 1.207996 0.652013 1.029256 0.654013 0.894798 0.656013 1.034056 0.658013 1.023175 0.660013 0.972134 0.662013 1.000921 0.664013 1.059754 0.666013 1.205824 0.668013 1.291515 0.670013 1.253979 0.672013 1.021328 0.674013 1.099351 0.676014 1.250217 0.678014 1.053546 0.680014 1.240934 0.682014 1.132546 0.684014 1.207390 0.686014 1.143019 0.688014 1.187569 0.690014 1.117158 0.692014 1.017676 0.694014 1.148909 0.696014 1.307952 0.698014 1.134271 0.700014 1.339668 0.702014 1.360803 0.704014 1.209263 0.706014 1.643307 0.708014 1.482189 0.710014 1.620002 0.712014 1.531291 0.714014 1.508616 0.716014 1.551789 0.718014 1.820704 0.720014 1.190510 0.722014 1.871826 0.724014 1.808171 0.726015 1.639588 0.728015 1.896243 0.730015 1.814870 0.732015 2.268629 0.734015 1.860003 0.736015 1.909307 0.738015 2.091058 0.740015 2.307699 0.742015 1.724754 0.744015 2.136682 0.746015 2.482358 0.748015 2.739133 0.750015 2.183903 0.752015 2.505655 0.754015 2.256298 0.756015 2.232645 0.758015 2.418358 0.760015 2.743980 0.762015 2.490451 0.764015 2.591839 0.766015 2.890467 0.768015 2.441939 0.770015 2.795238 0.772015 2.882743 0.774015 2.704971 0.776016 2.864923 0.778016 2.931144 0.780016 2.595133 0.782016 2.778879 0.784016 2.588524 0.786016 2.424629 0.788016 3.490356 0.790016 2.725991 0.792016 2.819722 0.794016 2.795897 0.796016 2.278287 0.798016 2.709274 0.800016 2.864658 0.802016 2.495316 0.804016 2.481585 0.806016 2.761135 0.808016 2.443268 0.810016 2.565330 0.812016 2.160156 0.814016 2.817464 0.816016 2.687451 0.818016 2.225290 0.820016 2.234668 0.822016 2.366997 0.824016 1.801739 0.826017 1.999203 0.828017 2.121902 0.830017 1.658141 0.832017 2.048377 0.834017 1.987455 0.836017 2.056994 0.838017 1.748644 0.840017 2.035117 0.842017 1.991255 0.844017 1.933487 0.846017 1.927148 0.848017 1.526116 0.850017 1.825349 0.852017 1.448218 0.854017 1.266984 0.856017 1.574851 0.858017 1.569314 0.860017 1.461266 0.862017 1.241627 0.864017 1.385409 0.866017 1.438944 0.868017 1.458593 0.870017 1.045023 0.872017 1.156637 0.874017 1.231397 0.876018 1.060101 0.878018 1.208137 0.880018 1.297885 0.882018 1.261846 0.884018 1.073377 0.886018 1.146843 0.888018 1.110004 0.890018 1.142169 0.892018 1.091117 0.894018 1.018172 0.896018 1.325115 0.898018 1.055748 0.900018 0.984488 0.902018 0.967879 0.904018 0.961651 0.906018 1.085517 0.908018 0.924754 0.910018 1.080906 0.912018 0.949908 0.914018 1.084287 0.916018 1.115371 0.918018 1.150677 0.920018 1.197850 0.922018 0.909476 0.924018 0.920649 0.926019 1.061322 0.928019 0.867733 0.930019 1.122616 0.932019 0.730512 0.934019 1.068192 0.936019 1.051183 0.938019 0.939787 0.940019 0.793864 0.942019 0.954387 0.944019 0.949134 0.946019 0.950377 0.948019 0.837390 0.950019 0.920521 0.952019 1.038896 0.954019 1.054405 0.956019 0.800492 0.958019 1.108765 0.960019 1.029235 0.962019 0.886213 0.964019 1.086449 0.966019 0.845174 0.968019 0.825587 0.970019 0.979444 0.972019 0.801748 0.974019 1.027216 0.976020 1.065852 0.978020 0.918422 0.980020 1.073070 0.982020 0.794571 0.984020 1.009434 0.986020 0.789657 0.988020 1.017966 0.990020 0.877302 0.992020 1.009978 0.994020 0.872902 0.996020 0.866302 0.998020 0.851322 3.049679424205e+02 2.259835726033e+02 4.582825874915e-01 2.680463954339e+02 2.141625880951e+02 5.231740188551e-01 2.355948285412e+02 2.030649087681e+02 5.890884464064e-01 2.070720747634e+02 1.929847787351e+02 6.548268076391e-01 1.820024845720e+02 1.841072060161e+02 7.193815491988e-01 1.599679938893e+02 1.765119161116e+02 7.819322821113e-01 1.406011523916e+02 1.701896640168e+02 8.418163499861e-01 1.235789958554e+02 1.650602877714e+02 8.985336544077e-01 1.086176603596e+02 1.609890697240e+02 9.518223955972e-01 9.546764852977e+01 1.578034068101e+02 1.001803566519e+00 8.390966888471e+01 1.553114384423e+02 1.049166704959e+00 7.375097889990e+01 1.533208888884e+02 1.095369478520e+00 6.482217080569e+01 1.516545543003e+02 1.142835180762e+00 5.697434651904e+01 1.501600821886e+02 1.195128756643e+00 5.007663459779e+01 1.487142619106e+02 1.257054974652e+00 4.401400780969e+01 1.472238754460e+02 1.334559527277e+00 3.868536492180e+01 1.456254596505e+02 1.434275177416e+00 3.400184472188e+01 1.438854289541e+02 1.562623610255e+00 2.988534415606e+01 1.420005556014e+02 1.724596948917e+00 2.626721587113e+01 1.399974024973e+02 1.922589454722e+00 2.308712344143e+01 1.379285302548e+02 2.155726253457e+00 2.029203518998e+01 1.358637352439e+02 2.419978906549e+00 1.783533982465e+01 1.338764658641e+02 2.709110562615e+00 1.567606914154e+01 1.320282596578e+02 3.016297482822e+00 1.377821483337e+01 1.303559182938e+02 3.336147029939e+00 1.211012800981e+01 1.288656178663e+02 3.666761776237e+00 1.064399141598e+01 1.275352277273e+02 4.011506063370e+00 9.355355547988e+00 1.263226219087e+02 4.380226295606e+00 8.222730929480e+00 1.251758562191e+02 4.789832968191e+00 7.227229750040e+00 1.240414585308e+02 5.264340172168e+00 6.352250889373e+00 1.228688803423e+02 5.834649703649e+00 5.583203074639e+00 1.216111234489e+02 6.538466669693e+00 4.907261554294e+00 1.202229496636e+02 7.420551016472e+00 4.313154230704e+00 1.186587305709e+02 8.532950836315e+00 3.790973685020e+00 1.168719533463e+02 9.934207301729e+00 3.332011959648e+00 1.148178006003e+02 1.168632231592e+01 2.928615343100e+00 1.124592892136e+02 1.384882214885e+01 2.574056735603e+00 1.097764132560e+02 1.647021807289e+01 2.262423467019e+00 1.067766702154e+02 1.957804508552e+01 1.988518696314e+00 1.035042389902e+02 2.316931526695e+01 1.747774748288e+00 1.000441263405e+02 2.720379867731e+01 1.536176942372e+00 9.651751550744e+01 3.160290211673e+01 1.350196643238e+00 9.306632436152e+01 3.625646867326e+01 1.186732416773e+00 8.982894691955e+01 4.103808359877e+01 1.043058310116e+00 8.691391183585e+01 4.582676062570e+01 9.167783932792e-01 8.438070050596e+01 5.053038948883e+01 8.057868042778e-01 8.223470407157e+01 5.510530773189e+01 7.082326314713e-01 8.043702331377e+01 5.956711649011e+01 6.224890474974e-01 7.892357938800e+01 6.398958416973e+01 5.471261800648e-01 7.762560078773e+01 6.849028056538e+01 4.808872671990e-01 7.648531883774e+01 7.320362439154e+01 4.226676992988e-01 7.546418427863e+01 7.824535039656e+01 3.714965985086e-01 7.454378223531e+01 8.367705422653e+01 3.265206282203e-01 7.372122857792e+01 8.948281171216e+01 2.869897627095e-01 7.300159914866e+01 9.556798423928e+01 2.522447795993e-01 7.239018973299e+01 1.017823565619e+02 2.217062665734e-01 7.188699034993e+01 1.079600203842e+02 1.948649590132e-01 7.148458809107e+01 1.139628834504e+02 1.712732474282e-01 7.116922187338e+01 1.197157695454e+02 1.505377130561e-01 7.092365340987e+01 1.252264459579e+02 1.323125671547e-01 7.073032520221e+01 1.305894207317e+02 1.162938845799e-01 7.057376516914e+01 1.359754401985e+02 1.022145354861e-01 7.044186488844e+01 1.416096903477e+02 8.983973063048e-02 7.032612844923e+01 1.477431961358e+02 7.896310599444e-02 7.022118277132e+01 1.546258673032e+02 6.940328142717e-02 7.012386456067e+01 1.624950613229e+02 6.100083592454e-02 7.003217179598e+01 1.715957508969e+02 5.361564910151e-02 6.994433015584e+01 1.822423835322e+02 4.712456452454e-02 6.985815866212e+01 1.949179608667e+02 4.141933593721e-02 6.977081093619e+01 2.103878858382e+02 3.640482213021e-02 6.967884969909e+01 2.297913717301e+02 3.199740035286e-02 6.957853426728e+01 2.546684078657e+02 2.812357180813e-02 6.946618683456e+01 2.868951226109e+02 2.471873597619e-02 6.933853021627e+01 3.285416801955e+02 2.172611332691e-02 6.919291616778e+01 3.817194980868e+02 1.909579845621e-02 6.902736812910e+01 4.485119002619e+02 1.678392785646e-02 6.884035987401e+01 5.310659202446e+02 1.475194844232e-02 6.863027944213e+01 6.318835512218e+02 1.296597463394e-02 6.839461346375e+01 7.543092624425e+02 1.139622327623e-02 6.812901417531e+01 9.031585111281e+02 1.001651697063e-02 6.782651456142e+01 1.085359927714e+03 8.803847537122e-03 6.747716659000e+01 1.310418952090e+03 7.737992326490e-03 6.706828588715e+01 1.590506790044e+03 6.801176984534e-03 6.658536327462e+01 1.940059864352e+03 5.977779044391e-03 6.601363178470e+01 2.374889252061e+03 5.254067404042e-03 6.534026945891e+01 2.910855638793e+03 4.617973344485e-03 6.455719732250e+01 3.562138386906e+03 4.058889270048e-03 6.366428932867e+01 4.339102681606e+03 3.567491814604e-03 6.267248832862e+01 5.245859720167e+03 3.135586363782e-03 6.160588907903e+01 6.277853533189e+03 2.755970400406e-03 6.050155242530e+01 7.420104055499e+03 2.422313394281e-03 5.940602862165e+01 8.646904275189e+03 2.129051233368e-03 5.836855639358e+01 9.923613104847e+03 1.871293435858e-03 5.743244640608e+01 1.121063715501e+04 1.644741595788e-03 5.662739636684e+01 1.246893675602e+04 1.445617702215e-03 5.596542477358e+01 1.366581501745e+04 1.270601136561e-03 5.544155166517e+01 1.477969701783e+04 1.116773297502e-03 5.503826835667e+01 1.580309946444e+04 9.815689299551e-04 5.473156687373e+01 1.674369511751e+04 8.627333465155e-04 5.449640043827e+01 1.762385046111e+04 7.582848279681e-04 5.431042986004e+01 1.847900635574e+04 6.664815758530e-04 5.415593441138e+01 1.935484503417e+04 5.857926659852e-04 5.402033332951e+01 2.030270337697e+04 5.148725185431e-04 5.389585865836e+01 2.137270142245e+04 4.525384589871e-04 5.377876456271e+01 2.260501851422e+04 3.977509956095e-04 5.366827635539e+01 2.402150709753e+04 3.495964848212e-04 5.356539678304e+01 2.562124943888e+04 3.072718951013e-04 5.347170769179e+01 2.738330307216e+04 2.700714155276e-04 5.338835905032e+01 2.927752258345e+04 2.373746855730e-04 5.331543087285e+01 3.128147567889e+04 2.086364498842e-04 5.325174979972e+01 3.339987703278e+04 1.833774655255e-04 5.319509292624e+01 3.568305894010e+04 1.611765100547e-04 5.314260887537e+01 3.824166167882e+04 1.416633571578e-04 5.309128027256e+01 4.125447176857e+04 1.245126027012e-04 5.303831969727e+01 4.496484882641e+04 1.094382382465e-04 5.298147262353e+01 4.966040333759e+04 9.618888153220e-05 5.291924900503e+01 5.563383515992e+04 8.454358438755e-05 5.285110689565e+01 6.313071752292e+04 7.430814816890e-05 5.277757941862e+01 7.229717397212e+04 6.531188527540e-05 5.270029563775e+01 8.314068461487e+04 5.740477273813e-05 5.262182638889e+01 9.551210236273e+04 5.045495041555e-05 5.254531378210e+01 1.091125928936e+05 4.434652207489e-05 5.247392203016e+01 1.235271215048e+05 3.897762268998e-05 5.241024302340e+01 1.382828041506e+05 3.425871972545e-05 5.235583933623e+01 1.529245504406e+05 3.011112007939e-05 5.231106435988e+01 1.670954150499e+05 2.646565778586e-05 5.227518193852e+01 1.806094911526e+05 2.326154059335e-05 5.224668972485e+01 1.935119799947e+05 2.044533618452e-05 5.222369908601e+01 2.061305143217e+05 1.797008113114e-05 5.220425083049e+01 2.191280230144e+05 1.579449772533e-05 5.218651154871e+01 2.335655557254e+05 1.388230562649e-05 5.216885414581e+01 2.509716911627e+05 1.220161684523e-05 5.214985583332e+01 2.733973324070e+05 1.072440397463e-05 5.212824939940e+01 3.034255308554e+05 9.426032801221e-06 5.210285127069e+01 3.441286227233e+05 8.284851501294e-06 5.207247405350e+01 3.990242380564e+05 7.281829571992e-06 5.203581896811e+01 4.721336506966e+05 6.400240475916e-06 5.199133865623e+01 5.682316956516e+05 5.625382706993e-06 5.193706450555e+01 6.933025701832e+05 4.944334626053e-06 5.187040273270e+01 8.551440096070e+05 4.345738977722e-06 5.178791397898e+01 1.064035103089e+06 3.819613495208e-06 5.168509532479e+01 1.333397492723e+06 3.357184434584e-06 5.155617973127e+01 1.680418230300e+06 2.950740262582e-06 5.139396237027e+01 2.126640761294e+06 2.593503057958e-06 5.118966656947e+01 2.698536351414e+06 2.279515481906e-06 5.093288121229e+01 3.428020357099e+06 2.003541432621e-06 5.061163611976e+01 4.352780805349e+06 1.760978727319e-06 5.021272592245e+01 5.516163242910e+06 1.547782355572e-06 4.972243530928e+01 6.966230762767e+06 1.360397024141e-06 4.912784091228e+01 8.753521489096e+06 1.195697868392e-06 4.841883568674e+01 1.092701093981e+07 1.050938341606e-06 4.759089389166e+01 1.352794387497e+07 9.237044131753e-07 4.664832218953e+01 1.658164028060e+07 8.118743118798e-07 4.560732261099e+01 2.008816503830e+07 7.135831429282e-07 4.449773910327e+01 2.401376999151e+07 6.271917887047e-07 4.336215166050e+01 2.828587218909e+07 5.512595746088e-07 4.225139784199e+01 3.279438219587e+07 4.845202441592e-07 4.121682990561e+01 3.740090786786e+07 4.258608427195e-07 4.030127349128e+01 4.195485557181e+07 3.743031577071e-07 3.953173297308e+01 4.631278202120e+07 3.289874057797e-07 3.891642339257e+01 5.035599138393e+07 2.891578949660e-07 3.844676343210e+01 5.400216182414e+07 2.541504226369e-07 3.810280148913e+01 5.720924257908e+07 2.233811991685e-07 3.785954274835e+01 5.997258460255e+07 1.963371125817e-07 3.769210926731e+01 6.231799311050e+07 1.725671718139e-07 3.757885546304e+01 6.429372180437e+07 1.516749859274e-07 3.750258812543e+01 6.596375020163e+07 1.333121538371e-07 3.745051689113e+01 6.740362385498e+07 1.171724543240e-07 3.741358003337e+01 6.869911719292e+07 1.029867394468e-07 3.738560108985e+01 6.994710253322e+07 9.051844619181e-08 3.736252106902e+01 7.125718563003e+07 7.955965151425e-08 3.734179686937e+01 7.275186740938e+07 6.992760498403e-08 3.732196707845e+01 7.456253628416e+07 6.146168121320e-08 3.730234421251e+01 7.681932313605e+07 5.402070124404e-08 3.728278048869e+01 7.963573818349e+07 4.748057822849e-08 3.726346243053e+01 8.309395524530e+07 4.173224813812e-08 3.724471192961e+01 8.724121987765e+07 3.667985099677e-08 3.722679910599e+01 9.210837630022e+07 3.223913230585e-08 3.720979199425e+01 9.775638111824e+07 2.833603800423e-08 3.719346822868e+01 1.043487916304e+08 2.490547953214e-08 3.717729492105e+01 1.122419448656e+08 2.189024840499e-08 3.716045855081e+01 1.220806229921e+08 1.924006219650e-08 3.714191300791e+01 1.348824173316e+08 1.691072602177e-08 3.712041695171e+01 1.520889847190e+08 1.486339553702e-08 3.709454560502e+01 1.755672020785e+08 1.306392916575e-08 3.706267739824e+01 2.075689433456e+08 1.148231874895e-08 3.702296679654e+01 2.506905659759e+08 1.009218912470e-08 3.697332095515e+01 3.078742741709e+08 8.870358292231e-09 3.691140209812e+01 3.824534649951e+08 7.796450825514e-09 3.683468187906e+01 4.781999433549e+08 6.852558089779e-09 3.674057841140e+01 5.993131653022e+08 6.022939594530e-09 3.662670799804e+01 7.502945321952e+08 5.293760502879e-09 3.649127521517e+01 9.356581119542e+08 4.652860919823e-09 3.633359756823e+01 1.159442820756e+09 4.089553112091e-09 3.615470633857e+01 1.424521991192e+09 3.594443277976e-09 3.595788592371e+01 1.731766078313e+09 3.159274894948e-09 3.574893609636e+01 2.079201726433e+09 2.776791032705e-09 3.553592108066e+01 2.461399457379e+09 2.440613335560e-09 3.532827065242e+01 2.869359696485e+09 2.145135656071e-09 3.513533667002e+01 3.291094515703e+09 3.049679424205e+02 2.259835726033e+02 4.582825874915e-01 2.580143967012e+02 2.107917110746e+02 5.426082927241e-01 2.182899237760e+02 1.969684354706e+02 6.280418497061e-01 1.846815194475e+02 1.850487061133e+02 7.121585522137e-01 1.562475401313e+02 1.752656274770e+02 7.930682981603e-01 1.321913197927e+02 1.675964837258e+02 8.693421204564e-01 1.118388488795e+02 1.618268821054e+02 9.400558583882e-01 9.461988985585e+01 1.576110875095e+02 1.005149540682e+00 8.005200023099e+01 1.545371696057e+02 1.066046743531e+00 6.772701543772e+01 1.521942914640e+02 1.126373406299e+00 5.729961283748e+01 1.502241872559e+02 1.192658486550e+00 4.847763643658e+01 1.483466628748e+02 1.274825221439e+00 4.101391123083e+01 1.463656702668e+02 1.385929772224e+00 3.469931783187e+01 1.441690985792e+02 1.540301316776e+00 2.935693333953e+01 1.417297421472e+02 1.749806092407e+00 2.483707429862e+01 1.391041033590e+02 2.019585643005e+00 2.101310285311e+01 1.364177628998e+02 2.345735002147e+00 1.777787859417e+01 1.338283415434e+02 2.716599205799e+00 1.504075668969e+01 1.314720392843e+02 3.117640207549e+00 1.272504818840e+01 1.294169569152e+02 3.538511961844e+00 1.076587134131e+01 1.276471559312e+02 3.980317715907e+00 9.108333738442e+00 1.260812049620e+02 4.461112370318e+00 7.705994327879e+00 1.246070234525e+02 5.018597491481e+00 6.519562225819e+00 1.231104890422e+02 5.710329194894e+00 5.515795860705e+00 1.214867211134e+02 6.613138593918e+00 4.666571607597e+00 1.196368388221e+02 7.823580755521e+00 3.948095817681e+00 1.174610443004e+02 9.458350960490e+00 3.340238165469e+00 1.148598056939e+02 1.164917560198e+01 2.825967635357e+00 1.117502412693e+02 1.452604760013e+01 2.390875344951e+00 1.080972264270e+02 1.818796364880e+01 2.022770835581e+00 1.039503446808e+02 2.266732295247e+01 1.711340518826e+00 9.946934383099e+01 2.789962785978e+01 1.447858709380e+00 9.491587394605e+01 3.371400985489e+01 1.224943147940e+00 9.059756018016e+01 3.985883912724e+01 1.036348164336e+00 8.677789061808e+01 4.606460668162e+01 8.767896857335e-01 8.359646347455e+01 5.212653786163e+01 7.417971869529e-01 8.104571911451e+01 5.797568302676e+01 6.275884348605e-01 7.901219010388e+01 6.370905876257e+01 5.309635173847e-01 7.734832525030e+01 6.956172344971e+01 4.492151880655e-01 7.593296422152e+01 7.581897226351e+01 3.800530141556e-01 7.469915091790e+01 8.268988116780e+01 3.215392030504e-01 7.362996788669e+01 9.019565601143e+01 2.720343090240e-01 7.273474094259e+01 9.813916665329e+01 2.301512990768e-01 7.202192463254e+01 1.061832261122e+02 1.947166909085e-01 7.148248866532e+01 1.139975843316e+02 1.647376741754e-01 7.108865833154e+01 1.213999943425e+02 1.393742938322e-01 7.080299585605e+01 1.284368825002e+02 1.179159161890e-01 7.058920502254e+01 1.353897398723e+02 9.976131830610e-02 7.041904289990e+01 1.427184814670e+02 8.440184287099e-02 7.027423887434e+01 1.509648598701e+02 7.140714658724e-02 7.014478571731e+01 1.606625767605e+02 6.041314277373e-02 7.002547201602e+01 1.723360934395e+02 5.111180034816e-02 6.991233631353e+01 1.866698902479e+02 4.324251338182e-02 6.980030144257e+01 2.048512607612e+02 3.658479941695e-02 6.968249354276e+01 2.289602472619e+02 3.095212196757e-02 6.955090952728e+01 2.621794592607e+02 2.618666412181e-02 6.939767543500e+01 3.086242096507e+02 2.215490681210e-02 6.921620850188e+01 3.728421070701e+02 1.874388786482e-02 6.900177043142e+01 4.593858154564e+02 1.585803701495e-02 6.875094124020e+01 5.729767296634e+02 1.341649820897e-02 6.845968368576e+01 7.195640314556e+02 1.135086417200e-02 6.812026175427e+01 9.082478531752e+02 9.603259766031e-03 6.771817256197e+01 1.153588955293e+03 8.124720438586e-03 6.723070460904e+01 1.477311918389e+03 6.873820329080e-03 6.662828151778e+01 1.908279926652e+03 5.815511594968e-03 6.587892354475e+01 2.480185026957e+03 4.920142437842e-03 6.495574734126e+01 3.227081011554e+03 4.162626316419e-03 6.384720900213e+01 4.176967938403e+03 3.521739069356e-03 6.256865185603e+01 5.343610016092e+03 2.979524254605e-03 6.117107240471e+01 6.717761704343e+03 2.520790044052e-03 5.974038296860e+01 8.260991136084e+03 2.132683577376e-03 5.838168094622e+01 9.906593124929e+03 1.804330849347e-03 5.719097351245e+01 1.157044754920e+04 1.526532040872e-03 5.622731665128e+01 1.316986820656e+04 1.291503757557e-03 5.550068025654e+01 1.464383902609e+04 1.092660953800e-03 5.498030660407e+01 1.596756996356e+04 9.244324323271e-04 5.461483823207e+01 1.715835023547e+04 7.821047498462e-04 5.435156904376e+01 1.827395545075e+04 6.616901553228e-04 5.414797212023e+01 1.940534856590e+04 5.598148607808e-04 5.397562114610e+01 2.066231255729e+04 4.736245141778e-04 5.381940468664e+01 2.214936214812e+04 4.007042258887e-04 5.367450654534e+01 2.393457955958e+04 3.390109080900e-04 5.354229985126e+01 2.602639663440e+04 2.868160313236e-04 5.342604724619e+01 2.837817555207e+04 2.426571943885e-04 5.332736508149e+01 3.092967785648e+04 2.052971506396e-04 5.324459080968e+01 3.367054173808e+04 1.736891426893e-04 5.317299906526e+01 3.671050569139e+04 1.469475742560e-04 5.310630424053e+01 4.032974244152e+04 1.243231974398e-04 5.303819740723e+01 4.499743271301e+04 1.051821202216e-04 5.296362103615e+01 5.132199424049e+04 8.898804601339e-05 5.287975482181e+01 5.991429886061e+04 7.528724764817e-05 5.278641293981e+01 7.122146357710e+04 6.369585480710e-05 5.268658738576e+01 8.532818479701e+04 5.388909870323e-05 5.258592744926e+01 1.018857103170e+05 4.559221267760e-05 5.249113326898e+01 1.201705707293e+05 3.857273375988e-05 5.240863762809e+01 1.391467466499e+05 3.263398949798e-05 5.234177351724e+01 1.578504886232e+05 2.760958756991e-05 5.229076495765e+01 1.755532601109e+05 2.335875378730e-05 5.225329742770e+01 1.920099678601e+05 1.976238787030e-05 5.222562200334e+01 2.076530752312e+05 1.671972648424e-05 5.220315733218e+01 2.239381257502e+05 1.414552004253e-05 5.218315775742e+01 2.429197584341e+05 1.196764417542e-05 5.216240796147e+01 2.684093632441e+05 1.012507894223e-05 5.213794233797e+01 3.046802204850e+05 8.566199168660e-06 5.210910669969e+01 3.577988367371e+05 7.247328007599e-06 5.207584536028e+01 4.301821112814e+05 6.131513196879e-06 5.203088670405e+01 5.412010475005e+05 5.187491727169e-06 5.183122774103e+01 9.969792728200e+05 4.388813911898e-06 5.190699188272e+01 9.893521774544e+05 3.713102317328e-06 5.190798847671e+01 9.961181134401e+05 3.141424789410e-06 5.182411236510e+01 1.341532374497e+06 2.657764010829e-06 5.147839905729e+01 2.509821409081e+06 2.248568726226e-06 5.046109021201e+01 5.732483448678e+06 1.902374061791e-06 5.184220134806e+01 2.005716766290e+06 1.609480301297e-06 5.187119094759e+01 1.692576367374e+06 1.361681118499e-06 5.186791358945e+01 1.721948981712e+06 1.152033651473e-06 5.186832227990e+01 1.719877644338e+06 9.746639768273e-07 5.186808539121e+01 1.767622829488e+06 8.246025335369e-07 5.187135128498e+01 1.773673814186e+06 6.976448852957e-07 5.186817629358e+01 1.780216661561e+06 5.902339202035e-07 5.187107789658e+01 1.795770998166e+06 4.993601872550e-07 5.186433526457e+01 1.795350920380e+06 4.224775772450e-07 5.186090336890e+01 1.814290881152e+06 3.574319856293e-07 5.186090336890e+01 1.814290881152e+06 3.024009586119e-07 5.186039910453e+01 1.853208087651e+06 2.558426314545e-07 5.186039910453e+01 1.853208087651e+06 2.164525283584e-07 5.186039910453e+01 1.853208087651e+06 1.831270135332e-07 5.186039910453e+01 1.853208087651e+06 1.549323694204e-07 5.186039910453e+01 1.853208087651e+06 1.310786357025e-07 5.186039910453e+01 1.853208087651e+06 1.108974761176e-07 5.186039910453e+01 1.853208087651e+06 9.382345294742e-08 5.186039910453e+01 1.853208087651e+06 7.937818452824e-08 5.186039910453e+01 1.853208087651e+06 6.715694190588e-08 5.186039910453e+01 1.853208087651e+06 5.681730910015e-08 5.186039910453e+01 1.853208087651e+06 4.806958926013e-08 5.186039910453e+01 1.853208087651e+06 4.066868790926e-08 5.186039910453e+01 1.853208087651e+06 3.440724586412e-08 5.186039910453e+01 1.853208087651e+06 2.910982942443e-08 5.186039910453e+01 1.853208087651e+06 2.462801505433e-08 5.186039910453e+01 1.853208087651e+06 2.083623083710e-08 5.186039910453e+01 1.853208087651e+06 1.762823818888e-08 5.186039910453e+01 1.853208087651e+06 1.491415525550e-08 5.186039910453e+01 1.853208087651e+06 1.261793859385e-08 5.186039910453e+01 1.853208087651e+06 1.067525257923e-08 5.186039910453e+01 1.853208087651e+06 9.031666843409e-09 5.186039910453e+01 1.853208087651e+06 7.641131239281e-09 5.186039910453e+01 1.853208087651e+06 6.464685603247e-09 5.186039910453e+01 1.853208087651e+06 5.469368165539e-09 5.186039910453e+01 1.853208087651e+06 4.627292024099e-09 5.186039910453e+01 1.853208087651e+06 3.914863806610e-09 5.186039910453e+01 1.853208087651e+06 3.312122629063e-09 5.186039910453e+01 1.853208087651e+06 2.802180829747e-09 5.186039910453e+01 1.853208087651e+06 2.370750809073e-09 5.186039910453e+01 1.853208087651e+06 2.005744718205e-09 5.186039910453e+01 1.853208087651e+06 1.696935780518e-09 5.186039910453e+01 1.853208087651e+06 1.435671756763e-09 5.186039910453e+01 1.853208087651e+06 1.214632525773e-09 5.186039910453e+01 1.853208087651e+06 1.027624988593e-09 5.186039910453e+01 1.853208087651e+06 8.694095496150e-10 5.186039910453e+01 1.853208087651e+06 7.355533130786e-10 5.186039910453e+01 1.853208087651e+06 6.223058817568e-10 5.186039910453e+01 1.853208087651e+06 5.264942779582e-10 5.186039910453e+01 1.853208087651e+06 4.454340427254e-10 5.186039910453e+01 1.853208087651e+06 3.768540223992e-10 5.186039910453e+01 1.853208087651e+06 3.188327352115e-10 5.186039910453e+01 1.853208087651e+06 2.697445350199e-10 5.186039910453e+01 1.853208087651e+06 2.282140637938e-10 5.186039910453e+01 1.853208087651e+06 1.930777166975e-10 5.186039910453e+01 1.853208087651e+06 1.633510400954e-10 5.186039910453e+01 1.853208087651e+06 1.382011490329e-10 5.186039910453e+01 1.853208087651e+06 1.169233913838e-10 5.186039910453e+01 1.853208087651e+06 9.892160483726e-11 5.186039910453e+01 1.853208087651e+06 8.369141356375e-11 5.186039910453e+01 1.853208087651e+06 7.080609656325e-11 5.186039910453e+01 1.853208087651e+06 5.990463175419e-11 5.186039910453e+01 1.853208087651e+06 5.068158082121e-11 5.186039910453e+01 1.853208087651e+06 4.287853141435e-11 5.186039910453e+01 1.853208087651e+06 3.627685692634e-11 5.186039910453e+01 1.853208087651e+06 3.069159099076e-11 5.186039910453e+01 1.853208087651e+06 2.596624507622e-11 5.186039910453e+01 1.853208087651e+06 2.196842397520e-11 5.186039910453e+01 1.853208087651e+06 1.858611634209e-11 5.186039910453e+01 1.853208087651e+06 1.572455634832e-11 5.186039910453e+01 1.853208087651e+06 1.330356852397e-11 5.186039910453e+01 1.853208087651e+06 1.125532139360e-11 5.186039910453e+01 1.853208087651e+06 9.522426967234e-12 5.186039910453e+01 1.853208087651e+06 8.056332838073e-12 5.186039910453e+01 1.853208087651e+06 6.815961836321e-12 5.186039910453e+01 1.853208087651e+06 5.766561125012e-12 5.186039910453e+01 1.853208087651e+06 4.878728491596e-12 5.186039910453e+01 1.853208087651e+06 4.127588553857e-12 5.186039910453e+01 1.853208087651e+06 3.492095798993e-12 5.186039910453e+01 1.853208087651e+06 2.954444928371e-12 5.186039910453e+01 1.853208087651e+06 2.499571986912e-12 5.186039910453e+01 1.853208087651e+06 2.114732299715e-12 5.186039910453e+01 1.853208087651e+06 1.789143390499e-12 5.186039910453e+01 1.853208087651e+06 1.513682877117e-12 5.186039910453e+01 1.853208087651e+06 1.280632879759e-12 5.186039910453e+01 1.853208087651e+06 1.083463780633e-12 5.186039910453e+01 1.853208087651e+06 0.000000 1.000000e+00 1.106435e+00 1.564761e+00 0.010000 1.000996e+00 9.643174e-01 1.046171e+00 0.020000 1.007872e+00 9.985518e-01 8.072637e-01 0.030000 1.026144e+00 1.055627e+00 7.663715e-01 0.040000 1.060833e+00 1.095438e+00 8.584341e-01 0.050000 1.116496e+00 1.129109e+00 1.032520e+00 0.060000 1.197241e+00 1.182450e+00 1.249602e+00 0.070000 1.306512e+00 1.276822e+00 1.480568e+00 0.080000 1.446506e+00 1.421306e+00 1.704470e+00 0.090000 1.617126e+00 1.611688e+00 1.906976e+00 0.100000 1.814524e+00 1.833147e+00 2.079037e+00 0.110000 2.029607e+00 2.064484e+00 2.215728e+00 0.120000 2.247143e+00 2.282520e+00 2.315273e+00 0.130000 2.446382e+00 2.465879e+00 2.378215e+00 0.140000 2.603824e+00 2.597737e+00 2.406738e+00 0.150000 2.697981e+00 2.667444e+00 2.404107e+00 0.160000 2.714808e+00 2.671077e+00 2.374229e+00 0.170000 2.651704e+00 2.611102e+00 2.321300e+00 0.180000 2.518282e+00 2.495385e+00 2.249549e+00 0.190000 2.333563e+00 2.335779e+00 2.163044e+00 0.200000 2.120871e+00 2.146524e+00 2.065565e+00 0.210000 1.902566e+00 1.942651e+00 1.960518e+00 0.220000 1.696364e+00 1.738537e+00 1.850899e+00 0.230000 1.513870e+00 1.546724e+00 1.739278e+00 0.240000 1.360947e+00 1.377063e+00 1.627814e+00 0.250000 1.239061e+00 1.236213e+00 1.518278e+00 0.260000 1.146817e+00 1.127472e+00 1.412091e+00 0.270000 1.081190e+00 1.050925e+00 1.310369e+00 0.280000 1.038307e+00 1.003833e+00 1.213964e+00 0.290000 1.013789e+00 9.812211e-01 1.123505e+00 0.300000 1.002814e+00 9.765745e-01 1.039440e+00 0.310000 1.000072e+00 9.825851e-01 9.620688e-01 0.320000 9.998011e-01 9.918822e-01 8.915680e-01 0.330000 9.960824e-01 9.976926e-01 8.280159e-01 0.340000 9.834513e-01 9.943849e-01 7.714069e-01 0.350000 9.577548e-01 9.778718e-01 7.216631e-01 0.360000 9.169922e-01 9.458505e-01 6.786410e-01 0.370000 8.617940e-01 8.978799e-01 6.421348e-01 0.380000 7.952798e-01 8.353015e-01 6.118786e-01 0.390000 7.222899e-01 7.610231e-01 5.875475e-01 0.400000 6.482631e-01 6.791917e-01 5.687590e-01 0.410000 5.781627e-01 5.947875e-01 5.550766e-01 0.420000 5.157735e-01 5.131735e-01 5.460150e-01 0.430000 4.634795e-01 4.396378e-01 5.410488e-01 0.440000 4.224349e-01 3.789614e-01 5.396247e-01 0.450000 3.929418e-01 3.350427e-01 5.411772e-01 0.460000 3.748639e-01 3.106037e-01 5.451478e-01 0.470000 3.679641e-01 3.069960e-01 5.510064e-01 0.480000 3.721204e-01 3.241182e-01 5.582759e-01 0.490000 3.874083e-01 3.604473e-01 5.665579e-01 0.500000 4.140514e-01 4.131796e-01 5.755570e-01 0.510000 4.522382e-01 4.784692e-01 5.851062e-01 0.520000 5.018122e-01 5.517453e-01 5.951866e-01 0.530000 5.618693e-01 6.280851e-01 6.059456e-01 0.540000 6.303577e-01 7.026157e-01 6.177069e-01 0.550000 7.038367e-01 7.709139e-01 6.309742e-01 0.560000 7.775882e-01 8.293771e-01 6.464270e-01 0.570000 8.462014e-01 8.755360e-01 6.649054e-01 0.580000 9.045780e-01 9.082848e-01 6.873860e-01 0.590000 9.490803e-01 9.280111e-01 7.149463e-01 0.600000 9.784214e-01 9.366110e-01 7.487197e-01 0.610000 9.939735e-01 9.373849e-01 7.898396e-01 0.620000 9.994265e-01 9.348157e-01 8.393758e-01 0.630000 1.000005e+00 9.342404e-01 8.982640e-01 0.640000 1.001584e+00 9.414336e-01 9.672299e-01 0.650000 1.010005e+00 9.621283e-01 1.046713e+00 0.660000 1.030699e+00 1.001506e+00 1.136789e+00 0.670000 1.068607e+00 1.063689e+00 1.237105e+00 0.680000 1.128215e+00 1.151285e+00 1.346812e+00 0.690000 1.213540e+00 1.264999e+00 1.464524e+00 0.700000 1.327870e+00 1.403374e+00 1.588287e+00 0.710000 1.473103e+00 1.562677e+00 1.715577e+00 0.720000 1.648620e+00 1.736952e+00 1.843317e+00 0.730000 1.849790e+00 1.918257e+00 1.967934e+00 0.740000 2.066518e+00 2.097091e+00 2.085446e+00 0.750000 2.282551e+00 2.262978e+00 2.191578e+00 0.760000 2.476419e+00 2.405206e+00 2.281925e+00 0.770000 2.624586e+00 2.513653e+00 2.352140e+00 0.780000 2.706446e+00 2.579667e+00 2.398161e+00 0.790000 2.709671e+00 2.596905e+00 2.416458e+00 0.800000 2.633762e+00 2.562085e+00 2.404298e+00 0.810000 2.490197e+00 2.475547e+00 2.360025e+00 0.820000 2.299110e+00 2.341554e+00 2.283317e+00 0.830000 2.084002e+00 2.168269e+00 2.175433e+00 0.840000 1.866653e+00 1.967353e+00 2.039403e+00 0.850000 1.663794e+00 1.753153e+00 1.880148e+00 0.860000 1.486002e+00 1.541503e+00 1.704501e+00 0.870000 1.338291e+00 1.348178e+00 1.521091e+00 0.880000 1.221545e+00 1.187118e+00 1.340059e+00 0.890000 1.134018e+00 1.068574e+00 1.172570e+00 0.900000 1.072503e+00 9.974043e-01 1.030068e+00 0.910000 1.033025e+00 9.717928e-01 9.232463e-01 0.920000 1.011135e+00 9.827288e-01 8.606868e-01 0.930000 1.001930e+00 1.014601e+00 8.471216e-01 0.940000 1.000015e+00 1.047279e+00 8.812897e-01 0.950000 9.995757e-01 1.060013e+00 9.533524e-01 0.960000 9.947162e-01 1.037401e+00 1.041848e+00 0.970000 9.801295e-01 9.774923e-01 1.110176e+00 0.980000 9.519710e-01 9.018439e-01 1.102617e+00 0.990000 9.086638e-01 8.669304e-01 9.399196e-01 gsl-doc-2.3/doc/examples/roots.c0000664000175000017500000000254012616157443014671 0ustar eddedd#include #include #include #include #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 = ¶ms; 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; } gsl-doc-2.3/doc/examples/rng.txt0000664000175000017500000000007212620026734014675 0ustar eddeddgenerator type: mt19937 seed = 0 first value = 4293858116 gsl-doc-2.3/doc/examples/nlfit.txt0000664000175000017500000000177612620437775015252 0ustar eddedddata: 0 6.08035 0.6 data: 1 5.47552 0.552419 data: 2 5.94654 0.509365 data: 3 5.0492 0.470409 data: 4 4.78568 0.43516 data: 5 3.51748 0.403265 data: 6 2.84671 0.374406 data: 7 3.24634 0.348293 data: 8 3.23395 0.324664 data: 9 3.30385 0.303285 data: 10 2.83439 0.28394 data: 11 2.31891 0.266436 data: 12 2.33858 0.250597 data: 13 2.40559 0.236266 data: 14 2.41856 0.223298 data: 15 1.99966 0.211565 data: 16 1.88127 0.200948 data: 17 1.91477 0.191342 data: 18 1.70415 0.182649 data: 19 1.60316 0.174784 data: 20 1.77937 0.167668 data: 21 1.55302 0.161228 data: 22 1.50903 0.155402 data: 23 1.36364 0.150129 data: 24 1.36873 0.145359 data: 25 1.41954 0.141042 data: 26 1.37778 0.137137 data: 27 1.23573 0.133603 data: 28 1.28524 0.130405 data: 29 1.46327 0.127512 data: 30 1.22315 0.124894 data: 31 1.1933 0.122525 data: 32 1.18717 0.120381 data: 33 0.883172 0.118442 data: 34 1.23424 0.116687 data: 35 1.14683 0.115099 data: 36 1.11091 0.113662 data: 37 1.20396 0.112362 data: 38 1.28722 0.111185 data: 39 1.05801 0.110121 gsl-doc-2.3/doc/examples/rstat.c0000644000175000017500000000310612774420036014651 0ustar eddedd#include #include int main(void) { double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6}; double mean, variance, largest, smallest, sd, rms, sd_mean, median, skew, kurtosis; gsl_rstat_workspace *rstat_p = gsl_rstat_alloc(); size_t i, n; /* add data to rstat accumulator */ for (i = 0; i < 5; ++i) gsl_rstat_add(data[i], rstat_p); mean = gsl_rstat_mean(rstat_p); variance = gsl_rstat_variance(rstat_p); largest = gsl_rstat_max(rstat_p); smallest = gsl_rstat_min(rstat_p); median = gsl_rstat_median(rstat_p); sd = gsl_rstat_sd(rstat_p); sd_mean = gsl_rstat_sd_mean(rstat_p); skew = gsl_rstat_skew(rstat_p); rms = gsl_rstat_rms(rstat_p); kurtosis = gsl_rstat_kurtosis(rstat_p); n = gsl_rstat_n(rstat_p); 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); printf( "The median is %g\n", median); printf( "The standard deviation is %g\n", sd); printf( "The root mean square is %g\n", rms); printf( "The standard devation of the mean is %g\n", sd_mean); printf( "The skew is %g\n", skew); printf( "The kurtosis %g\n", kurtosis); printf( "There are %zu items in the accumulator\n", n); gsl_rstat_reset(rstat_p); n = gsl_rstat_n(rstat_p); printf( "There are %zu items in the accumulator\n", n); gsl_rstat_free(rstat_p); return 0; } gsl-doc-2.3/doc/examples/nlfit3.c0000644000175000017500000001236312756651577014740 0ustar eddedd#include #include #include #include #include #include /* parameters to model */ struct model_params { double a1; double a2; double a3; double a4; double a5; }; /* Branin function */ int func_f (const gsl_vector * x, void *params, gsl_vector * f) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double f1 = x2 + par->a1 * x1 * x1 + par->a2 * x1 + par->a3; double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * cos(x1)); gsl_vector_set(f, 0, f1); gsl_vector_set(f, 1, f2); return GSL_SUCCESS; } int func_df (const gsl_vector * x, void *params, gsl_matrix * J) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * cos(x1)); gsl_matrix_set(J, 0, 0, 2.0 * par->a1 * x1 + par->a2); gsl_matrix_set(J, 0, 1, 1.0); gsl_matrix_set(J, 1, 0, -0.5 * par->a4 / f2 * (1.0 - par->a5) * sin(x1)); gsl_matrix_set(J, 1, 1, 0.0); return GSL_SUCCESS; } int func_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double v1 = gsl_vector_get(v, 0); double c = cos(x1); double s = sin(x1); double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * c); double t = 0.5 * par->a4 * (1.0 - par->a5) / f2; gsl_vector_set(fvv, 0, 2.0 * par->a1 * v1 * v1); gsl_vector_set(fvv, 1, -t * (c + s*s/f2) * v1 * v1); return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector * x = gsl_multifit_nlinear_position(w); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); /* print out current location */ printf("%f %f\n", x1, x2); } void solve_system(gsl_vector *x0, gsl_multifit_nlinear_fdf *fdf, gsl_multifit_nlinear_parameters *params) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multifit_nlinear_workspace *work = gsl_multifit_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multifit_nlinear_residual(work); gsl_vector * x = gsl_multifit_nlinear_position(work); int info; double chisq0, chisq, rcond; printf("# %s/%s\n", gsl_multifit_nlinear_name(work), gsl_multifit_nlinear_trs_name(work)); /* initialize solver */ gsl_multifit_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, callback, NULL, &info, work); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* store cond(J(x)) */ gsl_multifit_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "%-25s %-6zu %-5zu %-5zu %-13.4e %-12.4e %-13.4e (%.2e, %.2e)\n", gsl_multifit_nlinear_trs_name(work), gsl_multifit_nlinear_niter(work), fdf->nevalf, fdf->nevaldf, chisq0, chisq, 1.0 / rcond, gsl_vector_get(x, 0), gsl_vector_get(x, 1)); printf("\n\n"); gsl_multifit_nlinear_free(work); } int main (void) { const size_t n = 2; const size_t p = 2; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); struct model_params params; params.a1 = -5.1 / (4.0 * M_PI * M_PI); params.a2 = 5.0 / M_PI; params.a3 = -6.0; params.a4 = 10.0; params.a5 = 1.0 / (8.0 * M_PI); /* print map of Phi(x1, x2) */ { double x1, x2, chisq; for (x1 = -5.0; x1 < 15.0; x1 += 0.1) { for (x2 = -5.0; x2 < 15.0; x2 += 0.1) { gsl_vector_set(x, 0, x1); gsl_vector_set(x, 1, x2); func_f(x, ¶ms, f); gsl_blas_ddot(f, f, &chisq); printf("%f %f %f\n", x1, x2, chisq); } printf("\n"); } printf("\n\n"); } /* define function to be minimized */ fdf.f = func_f; fdf.df = func_df; fdf.fvv = func_fvv; fdf.n = n; fdf.p = p; fdf.params = ¶ms; /* starting point */ gsl_vector_set(x, 0, 6.0); gsl_vector_set(x, 1, 14.5); fprintf(stderr, "%-25s %-6s %-5s %-5s %-13s %-12s %-13s %-15s\n", "Method", "NITER", "NFEV", "NJEV", "Initial Cost", "Final cost", "Final cond(J)", "Final x"); fdf_params.trs = gsl_multifit_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_dogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_ddogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_subspace2D; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); return 0; } gsl-doc-2.3/doc/examples/sum.c0000664000175000017500000000175012620170476014325 0ustar eddedd#include #include #include #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 %zu terms\n", w->sum_plain, w->terms_used); printf ("exact value = % .16f\n", zeta_2); printf ("accelerated sum = % .16f using %zu 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; } gsl-doc-2.3/doc/examples/ntupler.c0000664000175000017500000000250112620444540015201 0ustar eddedd#include #include #include 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) { (void)(params); /* avoid unused parameter warning */ 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; } gsl-doc-2.3/doc/examples/histogram.c0000664000175000017500000000134112616157443015516 0ustar eddedd#include #include #include 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); } gsl-doc-2.3/doc/examples/vectorw.c0000664000175000017500000000053412616157443015215 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/sortsmall.txt0000664000175000017500000000022612620026734016130 0ustar eddedd5 smallest values from 100000 0: 0.000003489200025797 1: 0.000008199829608202 2: 0.000008953968062997 3: 0.000010712770745158 4: 0.000033531803637743 gsl-doc-2.3/doc/examples/fitting.txt0000664000175000017500000002235512620433616015564 0ustar eddedd# best fit: Y = -106.6 + 0.06 X # covariance matrix: # [ 39602, -19.9 # -19.9, 0.01] # chisq = 0.8 data: 1970 12 3.16228 data: 1980 11 2.23607 data: 1990 14 1.82574 data: 2000 13 1.58114 fit: 1961 11.06 hi : 1961 14.1276 lo : 1961 7.99243 fit: 1961.3 11.078 hi : 1961.3 14.1172 lo : 1961.3 8.03877 fit: 1961.6 11.096 hi : 1961.6 14.1069 lo : 1961.6 8.08509 fit: 1961.9 11.114 hi : 1961.9 14.0966 lo : 1961.9 8.13137 fit: 1962.2 11.132 hi : 1962.2 14.0864 lo : 1962.2 8.17761 fit: 1962.5 11.15 hi : 1962.5 14.0762 lo : 1962.5 8.22383 fit: 1962.8 11.168 hi : 1962.8 14.066 lo : 1962.8 8.27 fit: 1963.1 11.186 hi : 1963.1 14.0559 lo : 1963.1 8.31614 fit: 1963.4 11.204 hi : 1963.4 14.0458 lo : 1963.4 8.36224 fit: 1963.7 11.222 hi : 1963.7 14.0357 lo : 1963.7 8.4083 fit: 1964 11.24 hi : 1964 14.0257 lo : 1964 8.45432 fit: 1964.3 11.258 hi : 1964.3 14.0157 lo : 1964.3 8.5003 fit: 1964.6 11.276 hi : 1964.6 14.0058 lo : 1964.6 8.54624 fit: 1964.9 11.294 hi : 1964.9 13.9959 lo : 1964.9 8.59213 fit: 1965.2 11.312 hi : 1965.2 13.986 lo : 1965.2 8.63798 fit: 1965.5 11.33 hi : 1965.5 13.9762 lo : 1965.5 8.68378 fit: 1965.8 11.348 hi : 1965.8 13.9665 lo : 1965.8 8.72953 fit: 1966.1 11.366 hi : 1966.1 13.9568 lo : 1966.1 8.77523 fit: 1966.4 11.384 hi : 1966.4 13.9471 lo : 1966.4 8.82088 fit: 1966.7 11.402 hi : 1966.7 13.9375 lo : 1966.7 8.86647 fit: 1967 11.42 hi : 1967 13.928 lo : 1967 8.91201 fit: 1967.3 11.438 hi : 1967.3 13.9185 lo : 1967.3 8.9575 fit: 1967.6 11.456 hi : 1967.6 13.9091 lo : 1967.6 9.00292 fit: 1967.9 11.474 hi : 1967.9 13.8997 lo : 1967.9 9.04828 fit: 1968.2 11.492 hi : 1968.2 13.8904 lo : 1968.2 9.09358 fit: 1968.5 11.51 hi : 1968.5 13.8812 lo : 1968.5 9.13882 fit: 1968.8 11.528 hi : 1968.8 13.872 lo : 1968.8 9.18399 fit: 1969.1 11.546 hi : 1969.1 13.8629 lo : 1969.1 9.22908 fit: 1969.4 11.564 hi : 1969.4 13.8539 lo : 1969.4 9.27411 fit: 1969.7 11.582 hi : 1969.7 13.8449 lo : 1969.7 9.31906 fit: 1970 11.6 hi : 1970 13.8361 lo : 1970 9.36393 fit: 1970.3 11.618 hi : 1970.3 13.8273 lo : 1970.3 9.40872 fit: 1970.6 11.636 hi : 1970.6 13.8186 lo : 1970.6 9.45343 fit: 1970.9 11.654 hi : 1970.9 13.8099 lo : 1970.9 9.49805 fit: 1971.2 11.672 hi : 1971.2 13.8014 lo : 1971.2 9.54259 fit: 1971.5 11.69 hi : 1971.5 13.793 lo : 1971.5 9.58703 fit: 1971.8 11.708 hi : 1971.8 13.7846 lo : 1971.8 9.63137 fit: 1972.1 11.726 hi : 1972.1 13.7764 lo : 1972.1 9.67561 fit: 1972.4 11.744 hi : 1972.4 13.7683 lo : 1972.4 9.71975 fit: 1972.7 11.762 hi : 1972.7 13.7602 lo : 1972.7 9.76378 fit: 1973 11.78 hi : 1973 13.7523 lo : 1973 9.80769 fit: 1973.3 11.798 hi : 1973.3 13.7445 lo : 1973.3 9.85149 fit: 1973.6 11.816 hi : 1973.6 13.7368 lo : 1973.6 9.89517 fit: 1973.9 11.834 hi : 1973.9 13.7293 lo : 1973.9 9.93872 fit: 1974.2 11.852 hi : 1974.2 13.7219 lo : 1974.2 9.98213 fit: 1974.5 11.87 hi : 1974.5 13.7146 lo : 1974.5 10.0254 fit: 1974.8 11.888 hi : 1974.8 13.7075 lo : 1974.8 10.0685 fit: 1975.1 11.906 hi : 1975.1 13.7005 lo : 1975.1 10.1115 fit: 1975.4 11.924 hi : 1975.4 13.6936 lo : 1975.4 10.1544 fit: 1975.7 11.942 hi : 1975.7 13.687 lo : 1975.7 10.197 fit: 1976 11.96 hi : 1976 13.6805 lo : 1976 10.2395 fit: 1976.3 11.978 hi : 1976.3 13.6741 lo : 1976.3 10.2819 fit: 1976.6 11.996 hi : 1976.6 13.668 lo : 1976.6 10.324 fit: 1976.9 12.014 hi : 1976.9 13.6621 lo : 1976.9 10.3659 fit: 1977.2 12.032 hi : 1977.2 13.6563 lo : 1977.2 10.4077 fit: 1977.5 12.05 hi : 1977.5 13.6508 lo : 1977.5 10.4492 fit: 1977.8 12.068 hi : 1977.8 13.6455 lo : 1977.8 10.4905 fit: 1978.1 12.086 hi : 1978.1 13.6404 lo : 1978.1 10.5316 fit: 1978.4 12.104 hi : 1978.4 13.6355 lo : 1978.4 10.5725 fit: 1978.7 12.122 hi : 1978.7 13.6309 lo : 1978.7 10.6131 fit: 1979 12.14 hi : 1979 13.6266 lo : 1979 10.6534 fit: 1979.3 12.158 hi : 1979.3 13.6225 lo : 1979.3 10.6935 fit: 1979.6 12.176 hi : 1979.6 13.6188 lo : 1979.6 10.7332 fit: 1979.9 12.194 hi : 1979.9 13.6153 lo : 1979.9 10.7727 fit: 1980.2 12.212 hi : 1980.2 13.6121 lo : 1980.2 10.8119 fit: 1980.5 12.23 hi : 1980.5 13.6093 lo : 1980.5 10.8507 fit: 1980.8 12.248 hi : 1980.8 13.6068 lo : 1980.8 10.8892 fit: 1981.1 12.266 hi : 1981.1 13.6047 lo : 1981.1 10.9273 fit: 1981.4 12.284 hi : 1981.4 13.6029 lo : 1981.4 10.9651 fit: 1981.7 12.302 hi : 1981.7 13.6016 lo : 1981.7 11.0024 fit: 1982 12.32 hi : 1982 13.6006 lo : 1982 11.0394 fit: 1982.3 12.338 hi : 1982.3 13.6001 lo : 1982.3 11.0759 fit: 1982.6 12.356 hi : 1982.6 13.6 lo : 1982.6 11.112 fit: 1982.9 12.374 hi : 1982.9 13.6004 lo : 1982.9 11.1476 fit: 1983.2 12.392 hi : 1983.2 13.6013 lo : 1983.2 11.1827 fit: 1983.5 12.41 hi : 1983.5 13.6027 lo : 1983.5 11.2173 fit: 1983.8 12.428 hi : 1983.8 13.6046 lo : 1983.8 11.2514 fit: 1984.1 12.446 hi : 1984.1 13.6071 lo : 1984.1 11.2849 fit: 1984.4 12.464 hi : 1984.4 13.6101 lo : 1984.4 11.3179 fit: 1984.7 12.482 hi : 1984.7 13.6138 lo : 1984.7 11.3502 fit: 1985 12.5 hi : 1985 13.618 lo : 1985 11.382 fit: 1985.3 12.518 hi : 1985.3 13.6229 lo : 1985.3 11.4131 fit: 1985.6 12.536 hi : 1985.6 13.6285 lo : 1985.6 11.4435 fit: 1985.9 12.554 hi : 1985.9 13.6348 lo : 1985.9 11.4732 fit: 1986.2 12.572 hi : 1986.2 13.6418 lo : 1986.2 11.5022 fit: 1986.5 12.59 hi : 1986.5 13.6495 lo : 1986.5 11.5305 fit: 1986.8 12.608 hi : 1986.8 13.658 lo : 1986.8 11.558 fit: 1987.1 12.626 hi : 1987.1 13.6672 lo : 1987.1 11.5848 fit: 1987.4 12.644 hi : 1987.4 13.6772 lo : 1987.4 11.6108 fit: 1987.7 12.662 hi : 1987.7 13.6881 lo : 1987.7 11.6359 fit: 1988 12.68 hi : 1988 13.6998 lo : 1988 11.6602 fit: 1988.3 12.698 hi : 1988.3 13.7123 lo : 1988.3 11.6837 fit: 1988.6 12.716 hi : 1988.6 13.7258 lo : 1988.6 11.7062 fit: 1988.9 12.734 hi : 1988.9 13.74 lo : 1988.9 11.728 fit: 1989.2 12.752 hi : 1989.2 13.7552 lo : 1989.2 11.7488 fit: 1989.5 12.77 hi : 1989.5 13.7712 lo : 1989.5 11.7688 fit: 1989.8 12.788 hi : 1989.8 13.7882 lo : 1989.8 11.7878 fit: 1990.1 12.806 hi : 1990.1 13.806 lo : 1990.1 11.806 fit: 1990.4 12.824 hi : 1990.4 13.8248 lo : 1990.4 11.8232 fit: 1990.7 12.842 hi : 1990.7 13.8444 lo : 1990.7 11.8396 fit: 1991 12.86 hi : 1991 13.865 lo : 1991 11.855 fit: 1991.3 12.878 hi : 1991.3 13.8864 lo : 1991.3 11.8696 fit: 1991.6 12.896 hi : 1991.6 13.9087 lo : 1991.6 11.8833 fit: 1991.9 12.914 hi : 1991.9 13.9319 lo : 1991.9 11.8961 fit: 1992.2 12.932 hi : 1992.2 13.9559 lo : 1992.2 11.9081 fit: 1992.5 12.95 hi : 1992.5 13.9808 lo : 1992.5 11.9192 fit: 1992.8 12.968 hi : 1992.8 14.0065 lo : 1992.8 11.9295 fit: 1993.1 12.986 hi : 1993.1 14.0329 lo : 1993.1 11.9391 fit: 1993.4 13.004 hi : 1993.4 14.0602 lo : 1993.4 11.9478 fit: 1993.7 13.022 hi : 1993.7 14.0883 lo : 1993.7 11.9557 fit: 1994 13.04 hi : 1994 14.117 lo : 1994 11.963 fit: 1994.3 13.058 hi : 1994.3 14.1465 lo : 1994.3 11.9695 fit: 1994.6 13.076 hi : 1994.6 14.1767 lo : 1994.6 11.9753 fit: 1994.9 13.094 hi : 1994.9 14.2076 lo : 1994.9 11.9804 fit: 1995.2 13.112 hi : 1995.2 14.2391 lo : 1995.2 11.9849 fit: 1995.5 13.13 hi : 1995.5 14.2713 lo : 1995.5 11.9887 fit: 1995.8 13.148 hi : 1995.8 14.304 lo : 1995.8 11.992 fit: 1996.1 13.166 hi : 1996.1 14.3374 lo : 1996.1 11.9946 fit: 1996.4 13.184 hi : 1996.4 14.3713 lo : 1996.4 11.9967 fit: 1996.7 13.202 hi : 1996.7 14.4057 lo : 1996.7 11.9983 fit: 1997 13.22 hi : 1997 14.4407 lo : 1997 11.9993 fit: 1997.3 13.238 hi : 1997.3 14.4761 lo : 1997.3 11.9999 fit: 1997.6 13.256 hi : 1997.6 14.512 lo : 1997.6 12 fit: 1997.9 13.274 hi : 1997.9 14.5484 lo : 1997.9 11.9996 fit: 1998.2 13.292 hi : 1998.2 14.5852 lo : 1998.2 11.9988 fit: 1998.5 13.31 hi : 1998.5 14.6224 lo : 1998.5 11.9976 fit: 1998.8 13.328 hi : 1998.8 14.6601 lo : 1998.8 11.9959 fit: 1999.1 13.346 hi : 1999.1 14.6981 lo : 1999.1 11.9939 fit: 1999.4 13.364 hi : 1999.4 14.7364 lo : 1999.4 11.9916 fit: 1999.7 13.382 hi : 1999.7 14.7752 lo : 1999.7 11.9888 fit: 2000 13.4 hi : 2000 14.8142 lo : 2000 11.9858 fit: 2000.3 13.418 hi : 2000.3 14.8536 lo : 2000.3 11.9824 fit: 2000.6 13.436 hi : 2000.6 14.8933 lo : 2000.6 11.9787 fit: 2000.9 13.454 hi : 2000.9 14.9332 lo : 2000.9 11.9748 fit: 2001.2 13.472 hi : 2001.2 14.9735 lo : 2001.2 11.9705 fit: 2001.5 13.49 hi : 2001.5 15.014 lo : 2001.5 11.966 fit: 2001.8 13.508 hi : 2001.8 15.0547 lo : 2001.8 11.9613 fit: 2002.1 13.526 hi : 2002.1 15.0957 lo : 2002.1 11.9563 fit: 2002.4 13.544 hi : 2002.4 15.137 lo : 2002.4 11.951 fit: 2002.7 13.562 hi : 2002.7 15.1784 lo : 2002.7 11.9456 fit: 2003 13.58 hi : 2003 15.2201 lo : 2003 11.9399 fit: 2003.3 13.598 hi : 2003.3 15.262 lo : 2003.3 11.934 fit: 2003.6 13.616 hi : 2003.6 15.3041 lo : 2003.6 11.9279 fit: 2003.9 13.634 hi : 2003.9 15.3463 lo : 2003.9 11.9217 fit: 2004.2 13.652 hi : 2004.2 15.3888 lo : 2004.2 11.9152 fit: 2004.5 13.67 hi : 2004.5 15.4314 lo : 2004.5 11.9086 fit: 2004.8 13.688 hi : 2004.8 15.4742 lo : 2004.8 11.9018 fit: 2005.1 13.706 hi : 2005.1 15.5171 lo : 2005.1 11.8949 fit: 2005.4 13.724 hi : 2005.4 15.5602 lo : 2005.4 11.8878 fit: 2005.7 13.742 hi : 2005.7 15.6034 lo : 2005.7 11.8806 fit: 2006 13.76 hi : 2006 15.6468 lo : 2006 11.8732 fit: 2006.3 13.778 hi : 2006.3 15.6903 lo : 2006.3 11.8657 fit: 2006.6 13.796 hi : 2006.6 15.7339 lo : 2006.6 11.8581 fit: 2006.9 13.814 hi : 2006.9 15.7777 lo : 2006.9 11.8503 fit: 2007.2 13.832 hi : 2007.2 15.8216 lo : 2007.2 11.8424 fit: 2007.5 13.85 hi : 2007.5 15.8656 lo : 2007.5 11.8344 fit: 2007.8 13.868 hi : 2007.8 15.9097 lo : 2007.8 11.8263 fit: 2008.1 13.886 hi : 2008.1 15.9539 lo : 2008.1 11.8181 fit: 2008.4 13.904 hi : 2008.4 15.9982 lo : 2008.4 11.8098 fit: 2008.7 13.922 hi : 2008.7 16.0426 lo : 2008.7 11.8014 gsl-doc-2.3/doc/examples/histogram2d.txt0000664000175000017500000004253712620435153016345 0ustar eddedd0.899966 0.116291 0.80674 0.19472 0.800115 0.148497 0.894472 0.174431 0.840206 0.173995 0.868793 0.165864 0.811033 0.18044 0.837557 0.116857 0.831819 0.139231 0.788168 0.921319 0.319718 0.333354 0.752394 0.994372 0.845391 0.18983 0.856523 0.149861 0.842882 0.118228 0.808548 0.111741 0.340896 0.364813 0.864304 0.163713 0.862805 0.109958 0.860905 0.110781 0.384008 0.35024 0.770114 0.928891 0.354064 0.312812 0.841158 0.108232 0.807978 0.189162 0.795253 0.943185 0.391476 0.340039 0.859303 0.117067 0.827307 0.104534 0.810469 0.150618 0.737134 0.951103 0.866302 0.136599 0.709051 0.946011 0.851619 0.16776 0.860766 0.147854 0.35857 0.333873 0.361889 0.343654 0.831708 0.141925 0.87108 0.162461 0.897457 0.137043 0.878006 0.114081 0.866731 0.182974 0.820844 0.162196 0.815071 0.104617 0.849699 0.156737 0.834856 0.17238 0.393958 0.30423 0.810402 0.112164 0.801469 0.138106 0.827217 0.15998 0.853795 0.143263 0.842276 0.171684 0.853507 0.168578 0.362503 0.312293 0.337048 0.382007 0.381601 0.331575 0.734737 0.914223 0.856376 0.168519 0.748303 0.943634 0.89538 0.186816 0.385072 0.348444 0.818705 0.190048 0.732254 0.967964 0.850974 0.198366 0.827293 0.180474 0.89933 0.154155 0.803268 0.163895 0.844868 0.125872 0.749071 0.944566 0.397023 0.399672 0.379145 0.365154 0.318067 0.338998 0.877629 0.128381 0.849326 0.123641 0.823407 0.167771 0.880126 0.164926 0.352899 0.312083 0.832296 0.177788 0.831357 0.194334 0.897504 0.133455 0.763468 0.934284 0.854961 0.168276 0.849292 0.109993 0.869613 0.173558 0.801348 0.126318 0.894913 0.14234 0.813688 0.100025 0.882949 0.100375 0.7156 0.901182 0.848839 0.172997 0.849797 0.196577 0.834623 0.152989 0.830009 0.171303 0.845395 0.16828 0.89401 0.102366 0.806414 0.186953 0.808913 0.131955 0.809124 0.194111 0.880257 0.175335 0.839972 0.140848 0.776083 0.907614 0.807692 0.101978 0.801362 0.138462 0.829138 0.137398 0.827225 0.11179 0.874706 0.116489 0.806729 0.117269 0.89166 0.168095 0.386903 0.325476 0.821928 0.136924 0.864427 0.127784 0.860164 0.150035 0.376964 0.31513 0.858588 0.172067 0.897354 0.169678 0.842437 0.168082 0.894196 0.159821 0.870159 0.19136 0.855665 0.167097 0.845164 0.195304 0.7118 0.933506 0.893737 0.110966 0.850509 0.195682 0.898082 0.107074 0.835303 0.168072 0.841932 0.158701 0.859911 0.146265 0.844653 0.107289 0.852975 0.138776 0.787248 0.900223 0.834435 0.119132 0.314472 0.390359 0.866022 0.144453 0.824301 0.176086 0.826908 0.119098 0.845025 0.113269 0.811317 0.148692 0.892082 0.193395 0.347879 0.361244 0.836917 0.162466 0.384919 0.364521 0.387197 0.365293 0.804477 0.138181 0.846728 0.16697 0.842063 0.10195 0.739651 0.999118 0.844578 0.163776 0.847331 0.151524 0.81299 0.139674 0.884916 0.177149 0.84788 0.102473 0.307968 0.369845 0.804579 0.17367 0.899996 0.174979 0.833044 0.18237 0.850961 0.190251 0.336728 0.373908 0.818903 0.10368 0.870906 0.183735 0.814861 0.108184 0.789408 0.915248 0.822153 0.153161 0.875522 0.104078 0.376628 0.357519 0.878207 0.120464 0.801034 0.199693 0.803617 0.189206 0.880092 0.130658 0.321686 0.370642 0.7517 0.950898 0.314004 0.367273 0.875763 0.180728 0.832598 0.153752 0.87151 0.133585 0.860904 0.142586 0.877281 0.194561 0.842129 0.17105 0.819187 0.164834 0.329687 0.315548 0.885096 0.172157 0.895017 0.14303 0.38582 0.343933 0.830734 0.141008 0.806036 0.127851 0.894101 0.180436 0.895906 0.199972 0.893131 0.124855 0.304358 0.344473 0.857626 0.149648 0.313656 0.383176 0.370555 0.309315 0.885727 0.144595 0.887898 0.155404 0.868726 0.181555 0.839286 0.105514 0.335091 0.389919 0.39549 0.348265 0.343747 0.328116 0.89127 0.150732 0.843385 0.180071 0.853965 0.130922 0.331074 0.325197 0.862805 0.167099 0.848687 0.114827 0.873383 0.166528 0.881059 0.181053 0.346244 0.306879 0.885761 0.175805 0.345702 0.385209 0.870796 0.16849 0.800492 0.146158 0.891737 0.166495 0.829758 0.188782 0.844701 0.103017 0.869756 0.134548 0.849186 0.121754 0.853689 0.157139 0.8743 0.196234 0.82223 0.199655 0.866973 0.144841 0.821452 0.112339 0.83924 0.183338 0.889298 0.182561 0.827969 0.126714 0.856372 0.176686 0.856576 0.150396 0.87857 0.162241 0.82948 0.155498 0.817556 0.16563 0.889215 0.127605 0.378789 0.396618 0.860667 0.144355 0.851925 0.136835 0.800965 0.130027 0.862343 0.104747 0.834028 0.108125 0.379311 0.39931 0.816162 0.176486 0.887533 0.139611 0.876228 0.134897 0.804605 0.13675 0.867801 0.15878 0.833625 0.167347 0.812678 0.185395 0.878209 0.115959 0.811913 0.195017 0.361995 0.323102 0.881879 0.135963 0.89803 0.103198 0.877724 0.151681 0.833623 0.196398 0.894817 0.168182 0.881902 0.145583 0.813211 0.105915 0.828792 0.121735 0.814929 0.154997 0.811291 0.189298 0.833706 0.125648 0.89597 0.191064 0.794733 0.932783 0.807271 0.114252 0.364533 0.319233 0.810089 0.187142 0.820849 0.178866 0.761061 0.998648 0.884772 0.110986 0.816057 0.155574 0.859791 0.164382 0.817204 0.107886 0.761067 0.971697 0.866766 0.176764 0.801908 0.166801 0.885309 0.136685 0.839102 0.150284 0.810891 0.162254 0.312938 0.367636 0.825876 0.123284 0.898391 0.130657 0.834303 0.174861 0.88594 0.104529 0.825583 0.122698 0.832929 0.116465 0.358375 0.338426 0.315493 0.332973 0.83906 0.147668 0.884073 0.14555 0.834649 0.139618 0.885196 0.173607 0.370796 0.339792 0.879535 0.18262 0.891765 0.124559 0.85316 0.149334 0.347742 0.378014 0.327373 0.370112 0.892268 0.170055 0.870979 0.119274 0.304501 0.384298 0.889512 0.124208 0.747131 0.973508 0.713879 0.999031 0.89777 0.165717 0.312203 0.37596 0.816484 0.150902 0.866057 0.156792 0.807577 0.141502 0.897537 0.136588 0.837324 0.184421 0.895856 0.125889 0.83218 0.143734 0.819322 0.120308 0.841607 0.125554 0.841513 0.187048 0.80136 0.115711 0.783739 0.911628 0.867372 0.115829 0.831926 0.154533 0.884267 0.101714 0.840588 0.131802 0.872545 0.187172 0.866004 0.109233 0.809182 0.16371 0.844303 0.171281 0.853758 0.123048 0.89632 0.196616 0.807945 0.117529 0.810675 0.198465 0.843891 0.184447 0.393882 0.345994 0.849027 0.118412 0.814565 0.160643 0.878966 0.118619 0.319678 0.330739 0.381436 0.327039 0.883641 0.137051 0.88625 0.1408 0.884644 0.164795 0.800808 0.152881 0.808185 0.109432 0.89149 0.112168 0.815459 0.106703 0.853486 0.169245 0.81354 0.137424 0.810805 0.153874 0.364085 0.349051 0.812736 0.170973 0.884621 0.1393 0.881052 0.146378 0.838517 0.149331 0.804812 0.158308 0.337278 0.395934 0.870284 0.104272 0.834796 0.105229 0.843002 0.196036 0.850576 0.152863 0.860771 0.118616 0.84202 0.166612 0.399275 0.394875 0.742874 0.958051 0.880633 0.110687 0.857862 0.179605 0.855494 0.100935 0.768148 0.963642 0.324867 0.367771 0.858129 0.167168 0.821521 0.16616 0.852337 0.196212 0.899052 0.109934 0.344131 0.342601 0.893116 0.170833 0.830686 0.104484 0.867316 0.167837 0.774198 0.939849 0.893978 0.10289 0.89165 0.184693 0.856159 0.186791 0.854807 0.14528 0.80968 0.135203 0.806354 0.123605 0.317552 0.365206 0.86256 0.161993 0.381535 0.345279 0.889903 0.112084 0.822495 0.126029 0.87125 0.166784 0.317413 0.349133 0.888958 0.170403 0.851666 0.157834 0.85179 0.173041 0.853371 0.146371 0.849858 0.125447 0.875129 0.122898 0.828562 0.187424 0.763606 0.952371 0.382237 0.35794 0.804045 0.120777 0.841869 0.18514 0.836767 0.155826 0.856599 0.199897 0.731756 0.911674 0.344477 0.362271 0.810883 0.188983 0.874842 0.142992 0.83821 0.145268 0.851997 0.156659 0.894652 0.190805 0.861117 0.137703 0.858894 0.119809 0.850262 0.141373 0.877066 0.175558 0.861403 0.136429 0.876572 0.175158 0.3317 0.352857 0.850177 0.127094 0.874109 0.123517 0.887492 0.12588 0.748737 0.901241 0.880944 0.162101 0.881262 0.114011 0.883449 0.170884 0.360217 0.302075 0.871743 0.103008 0.835599 0.108162 0.870554 0.187258 0.884404 0.188352 0.883416 0.145872 0.887299 0.15479 0.336392 0.359118 0.843312 0.177613 0.808424 0.104085 0.821814 0.128227 0.874873 0.150716 0.85946 0.149466 0.829091 0.142148 0.325514 0.30912 0.821196 0.113537 0.895925 0.181168 0.812376 0.1962 0.365183 0.310292 0.809944 0.133368 0.881536 0.152292 0.850015 0.198156 0.873673 0.119881 0.829372 0.157097 0.779381 0.968643 0.806218 0.117974 0.821675 0.116286 0.874341 0.108365 0.852975 0.123086 0.845412 0.186429 0.891256 0.182139 0.832477 0.163637 0.735961 0.94692 0.810206 0.166881 0.863904 0.157486 0.838621 0.180923 0.898295 0.132386 0.848832 0.175956 0.872826 0.106993 0.841561 0.10093 0.872002 0.168904 0.895266 0.151644 0.816433 0.148234 0.825895 0.199631 0.848153 0.1785 0.89617 0.148785 0.361702 0.397933 0.378571 0.363026 0.752522 0.921308 0.309489 0.336667 0.814213 0.172179 0.817779 0.102103 0.385597 0.358676 0.865369 0.186364 0.389047 0.305243 0.822809 0.124166 0.831419 0.187222 0.829114 0.107158 0.810828 0.149282 0.866424 0.169478 0.897773 0.131975 0.874546 0.105347 0.867 0.130347 0.360503 0.393453 0.867093 0.110005 0.863639 0.121075 0.895203 0.174919 0.866151 0.151007 0.35674 0.365002 0.353537 0.372692 0.83924 0.174931 0.881965 0.10347 0.36053 0.365526 0.894737 0.148706 0.881786 0.108479 0.86341 0.185092 0.876455 0.171627 0.823069 0.163659 0.838099 0.137204 0.815945 0.159805 0.363366 0.327635 0.830124 0.16268 0.717562 0.929106 0.819273 0.189725 0.889623 0.188949 0.829135 0.144268 0.836247 0.137433 0.822904 0.19765 0.81784 0.11125 0.801468 0.169538 0.89537 0.191735 0.336984 0.365184 0.889404 0.106429 0.89432 0.146251 0.829836 0.125841 0.825965 0.129243 0.866793 0.107128 0.728253 0.943304 0.807663 0.154252 0.854678 0.197385 0.742775 0.942044 0.891946 0.172129 0.811272 0.173145 0.897055 0.102304 0.803476 0.176486 0.82882 0.179162 0.79981 0.933256 0.820002 0.169783 0.325439 0.34104 0.89168 0.144097 0.837094 0.110958 0.73852 0.948742 0.80801 0.161061 0.892927 0.126314 0.89878 0.12125 0.886638 0.121405 0.805034 0.145919 0.87593 0.108601 0.880843 0.178815 0.877678 0.120557 0.369679 0.385181 0.391426 0.368508 0.854451 0.149913 0.817572 0.192036 0.76975 0.962605 0.815622 0.181443 0.839968 0.197315 0.857016 0.196723 0.373833 0.344159 0.316118 0.32969 0.811795 0.167347 0.830065 0.19898 0.833357 0.111303 0.314904 0.368326 0.819208 0.149162 0.866229 0.107569 0.874317 0.1308 0.302638 0.311626 0.860183 0.117928 0.359574 0.335186 0.866013 0.151279 0.863533 0.182445 0.300713 0.380895 0.814188 0.159962 0.827448 0.144729 0.804141 0.141768 0.805786 0.142367 0.887465 0.162925 0.843153 0.190503 0.870828 0.121444 0.840672 0.168627 0.301934 0.318779 0.856546 0.174779 0.839502 0.172994 0.847336 0.146206 0.88028 0.106257 0.866252 0.155547 0.37095 0.344299 0.871458 0.199763 0.803762 0.12719 0.826329 0.175 0.893337 0.192424 0.817331 0.144659 0.832914 0.160164 0.815635 0.122196 0.885821 0.185214 0.316989 0.31792 0.870953 0.177478 0.832255 0.111237 0.844802 0.133626 0.837412 0.10615 0.759292 0.918901 0.815619 0.121267 0.378633 0.314083 0.839548 0.157009 0.828274 0.107626 0.83284 0.187813 0.890613 0.116485 0.810089 0.153584 0.814939 0.179072 0.800258 0.177972 0.895225 0.169157 0.73314 0.931236 0.848721 0.133783 0.81551 0.11701 0.868687 0.176634 0.896957 0.113196 0.389054 0.38854 0.812717 0.132332 0.87371 0.177684 0.33352 0.382369 0.846023 0.101822 0.344 0.356494 0.304544 0.366331 0.832386 0.189727 0.704722 0.910009 0.310869 0.342362 0.871299 0.116465 0.837278 0.10274 0.338403 0.365092 0.783904 0.940099 0.399713 0.306701 0.889798 0.120483 0.824056 0.108129 0.844994 0.107482 0.848904 0.112933 0.826871 0.152845 0.89664 0.12968 0.85261 0.11861 0.89598 0.12436 0.876881 0.109845 0.899763 0.139582 0.856317 0.154608 0.39 0.379794 0.329216 0.382024 0.818369 0.159607 0.867544 0.151943 0.816073 0.15709 0.808482 0.193333 0.361735 0.349184 0.811246 0.196906 0.377963 0.354646 0.876862 0.139507 0.801098 0.176761 0.839471 0.117372 0.370493 0.351441 0.831857 0.157395 0.892061 0.174507 0.879924 0.184602 0.814486 0.116701 0.880326 0.198282 0.329637 0.377028 0.800409 0.173463 0.858756 0.146521 0.770298 0.909789 0.89663 0.16985 0.822317 0.151358 0.863366 0.159056 0.837438 0.109562 0.375746 0.371853 0.863035 0.13597 0.341681 0.344239 0.837191 0.102117 0.857518 0.130338 0.877843 0.198342 0.831355 0.149361 0.833199 0.194458 0.861883 0.18576 0.383883 0.394117 0.80223 0.194725 0.836584 0.109057 0.830883 0.11098 0.34931 0.343051 0.87322 0.119193 0.801568 0.179643 0.83499 0.189089 0.883306 0.162157 0.855331 0.136167 0.827353 0.15642 0.835304 0.196587 0.81356 0.178226 0.855351 0.126984 0.336538 0.32047 0.871382 0.106942 0.807136 0.126974 0.719391 0.978292 0.896613 0.177678 0.392088 0.384363 0.859672 0.100289 0.814092 0.181898 0.313111 0.317176 0.833546 0.171589 0.886529 0.191697 0.858925 0.121079 0.818901 0.161709 0.384935 0.369578 0.364446 0.35636 0.805596 0.123281 0.821475 0.167794 0.842239 0.167674 0.845516 0.162248 0.325251 0.341913 0.872824 0.158441 0.885137 0.111048 0.720571 0.994662 0.889353 0.109002 0.805082 0.101511 0.893938 0.185086 0.811223 0.12091 0.897962 0.121979 0.842313 0.106499 0.888678 0.140187 0.829431 0.162015 0.800891 0.139997 0.841009 0.11087 0.85185 0.102892 0.810698 0.199516 0.730386 0.903186 0.817545 0.106374 0.841119 0.10445 0.892531 0.166033 0.855301 0.155058 0.848869 0.160545 0.837631 0.114136 0.811895 0.182398 0.348722 0.383998 0.887236 0.158492 0.815834 0.160024 0.894654 0.124858 0.83974 0.110182 0.891484 0.160042 0.879151 0.186509 0.357824 0.385019 0.815063 0.11887 0.759898 0.948135 0.821577 0.195292 0.715555 0.920154 0.863761 0.161641 0.304333 0.334237 0.881743 0.164423 0.306421 0.340543 0.865609 0.145499 0.821731 0.149971 0.885233 0.163874 0.813339 0.114897 0.874204 0.122921 0.889057 0.154288 0.871624 0.14409 0.869097 0.136601 0.807429 0.191712 0.345041 0.321563 0.83931 0.163284 0.842468 0.106195 0.396883 0.305262 0.894628 0.128521 0.886603 0.167256 0.831638 0.157452 0.840055 0.196995 0.896967 0.135328 0.844651 0.109273 0.804906 0.123718 0.829203 0.108781 0.859297 0.133713 0.8879 0.124796 0.805 0.115723 0.87793 0.136908 0.822777 0.18758 0.852614 0.123744 0.885222 0.123751 0.817925 0.116679 0.309115 0.378005 0.857027 0.112186 0.350599 0.311118 0.854424 0.185159 0.863059 0.187469 0.339618 0.392343 0.396734 0.305498 0.849875 0.159409 0.734899 0.92365 0.87443 0.198857 0.82217 0.12192 0.841567 0.140441 0.833852 0.135251 0.72093 0.930449 0.80088 0.163544 0.8089 0.102041 0.879216 0.126808 0.801086 0.174111 0.896652 0.129354 0.883714 0.189499 0.372874 0.342523 0.862953 0.173727 0.357003 0.392382 0.899427 0.132473 0.84053 0.107673 0.876139 0.15687 0.313842 0.393008 0.872346 0.171484 0.779851 0.9059 0.819865 0.166208 0.810167 0.104493 0.316024 0.358873 0.862212 0.194171 0.804558 0.151345 0.875668 0.151805 0.874691 0.150023 0.316198 0.321145 0.839726 0.129373 0.847198 0.139909 0.846986 0.184295 0.781493 0.959652 0.304141 0.391514 0.855865 0.176878 0.882039 0.152038 0.842595 0.125085 0.863633 0.123826 0.818991 0.169564 0.827721 0.181941 0.323965 0.341294 0.848177 0.155645 0.839904 0.128129 0.893658 0.14229 0.84368 0.141728 0.815819 0.19684 0.875087 0.19956 0.885086 0.142388 0.882871 0.116048 0.783763 0.974167 0.89856 0.167246 0.710974 0.977611 0.846421 0.192404 0.871532 0.151592 0.73495 0.926971 0.728067 0.993653 0.883032 0.177956 0.898197 0.151945 0.868946 0.167706 0.832313 0.199476 0.814887 0.138395 0.345664 0.300573 0.881858 0.111975 0.890711 0.183273 0.862358 0.160852 0.87707 0.168116 0.801645 0.169858 0.804203 0.143015 0.845769 0.170608 0.392847 0.346741 0.85175 0.119732 0.875177 0.117237 0.879914 0.112512 0.829533 0.143015 0.837703 0.142995 0.898297 0.192427 0.832538 0.170702 0.38302 0.344929 0.805033 0.170622 0.859109 0.115442 0.854626 0.116947 0.891335 0.17453 0.3722 0.3248 0.384064 0.358592 0.311068 0.316408 0.849568 0.172909 0.851721 0.12168 0.818386 0.100143 0.818008 0.126522 0.834449 0.171644 0.882466 0.142316 0.853358 0.102178 0.853925 0.136591 0.808353 0.155302 0.876852 0.15125 0.8433 0.113038 0.806072 0.179906 0.827626 0.103574 0.804642 0.146007 0.844456 0.105955 0.3178 0.327756 0.81962 0.183569 0.845153 0.135188 0.867568 0.193784 0.344677 0.31555 0.868502 0.139399 0.869761 0.182259 0.840942 0.12611 0.823803 0.198989 0.866021 0.189405 0.830472 0.176892 0.852984 0.122694 0.726376 0.945389 0.389562 0.387719 0.751666 0.93967 0.860234 0.138943 0.867301 0.160167 0.365457 0.379815 0.820076 0.106114 0.853005 0.187446 0.806597 0.166647 0.859759 0.127026 0.8194 0.154785 0.7781 0.903768 0.896834 0.162089 0.826042 0.135529 0.855017 0.140164 0.858975 0.160018 0.877841 0.120589 0.804365 0.140328 0.857401 0.100001 0.381695 0.394184 0.880224 0.128239 0.86796 0.164248 0.82237 0.138774 0.362795 0.369231 0.826243 0.121746 0.852736 0.117037 0.823795 0.16244 0.309912 0.37166 0.815552 0.11289 0.891685 0.137729 0.840182 0.119087 0.873933 0.121337 0.88245 0.10173 0.838509 0.19346 0.872295 0.148754 0.831451 0.116719 0.85136 0.107784 0.803645 0.131614 0.877537 0.103931 0.833487 0.175673 0.837578 0.152661 0.846693 0.126021 0.881463 0.100271 0.88044 0.154582 0.834019 0.181083 0.323731 0.370423 0.807529 0.136034 0.851471 0.155154 0.86134 0.152341 0.892364 0.192783 0.879169 0.168451 0.829042 0.142818 0.887935 0.192168 0.878671 0.177224 0.773011 0.936844 0.824737 0.193255 0.841652 0.171013 0.853776 0.19503 0.840213 0.147429 0.778386 0.940366 0.896618 0.180843 0.814105 0.145469 0.874934 0.143933 0.813603 0.117846 0.876049 0.153262 0.884423 0.126604 0.870341 0.199748 0.85078 0.145573 0.898638 0.129449 0.385363 0.39931 0.891271 0.17511 0.854424 0.176049 0.843832 0.182309 0.898589 0.13482 0.892447 0.144832 0.390647 0.310097 0.37252 0.327555 0.814935 0.170354 0.812245 0.113686 0.870132 0.134055 0.310231 0.383543 0.885627 0.144317 0.861609 0.139202 0.868226 0.172905 0.301905 0.314431 0.726291 0.961717 0.896298 0.153264 0.839346 0.162739 0.862207 0.117241 0.884096 0.134364 0.888349 0.164626 0.832364 0.119022 0.889722 0.194606 0.363968 0.305376 0.819101 0.199337 0.72635 0.914251 0.870371 0.157249 0.802227 0.14205 0.338385 0.327053 0.885202 0.105487 0.723888 0.934808 0.876837 0.170572 0.808673 0.161296 0.858623 0.187924 0.823542 0.176925 0.373642 0.39793 0.821952 0.198513 0.713005 0.998107 0.872504 0.153095 0.777351 0.918793 0.815999 0.163651 gsl-doc-2.3/doc/examples/eigen_nonsymm.txt0000664000175000017500000000074012620431436016757 0ustar eddeddeigenvalue = -6.41391 + 0i eigenvector = 0.0998822 + 0i 0.111251 + 0i -0.292501 + 0i -0.944505 + 0i eigenvalue = 5.54555 + 3.08545i eigenvector = 0.0430757 + 0.00968662i -0.0709124 + 0.138917i 0.516595 + -0.0160059i 0.839574 + 0.0413888i eigenvalue = 5.54555 + -3.08545i eigenvector = 0.0430757 + -0.00968662i -0.0709124 + -0.138917i 0.516595 + 0.0160059i 0.839574 + -0.0413888i eigenvalue = 2.3228 + 0i eigenvector = -0.144933 + 0i 0.356601 + 0i 0.919369 + 0i 0.0811836 + 0i gsl-doc-2.3/doc/examples/siman.txt0000664000175000017500000057253212620443551015235 0ustar eddedd#-iter #-evals temperature position energy 0 1001 0.008 1.3507 -0.868361 -0.872837 1 2001 0.00797607 1.37079 -0.871175 -0.87287 2 3001 0.00795222 1.38039 -0.864303 -0.87287 3 4001 0.00792843 1.36375 -0.87286 -0.872871 4 5001 0.00790472 0.61174 -0.845934 -0.872871 5 6001 0.00788107 1.40147 -0.831327 -0.872871 6 7001 0.0078575 1.35283 -0.869778 -0.872871 7 8001 0.007834 1.3638 -0.872858 -0.872871 8 9001 0.00781057 1.36943 -0.871721 -0.872871 9 10001 0.0077872 1.38445 -0.859842 -0.872871 10 11001 0.00776391 1.34438 -0.862599 -0.872871 11 12001 0.00774069 0.601995 -0.848928 -0.872871 12 13001 0.00771754 1.37681 -0.86748 -0.872871 13 14001 0.00769445 1.3528 -0.869761 -0.872871 14 15001 0.00767144 1.34345 -0.861549 -0.872871 15 16001 0.0076485 1.34485 -0.86311 -0.872871 16 17001 0.00762562 1.35505 -0.870971 -0.872871 17 18001 0.00760281 1.3606 -0.872685 -0.872871 18 19001 0.00758007 0.603733 -0.84879 -0.872871 19 20001 0.0075574 1.37855 -0.866026 -0.872871 20 21001 0.00753479 1.36968 -0.871629 -0.872871 21 22001 0.00751226 1.36059 -0.872684 -0.872871 22 23001 0.00748979 1.34605 -0.864345 -0.872871 23 24001 0.00746738 1.36367 -0.872863 -0.872871 24 25001 0.00744505 1.36304 -0.872871 -0.872871 25 26001 0.00742278 0.613129 -0.845066 -0.872871 26 27001 0.00740058 1.36855 -0.872021 -0.872871 27 28001 0.00737844 1.37322 -0.86993 -0.872871 28 29001 0.00735638 1.36499 -0.872771 -0.872871 29 30001 0.00733437 1.35743 -0.871925 -0.872871 30 31001 0.00731243 1.35513 -0.871008 -0.872871 31 32001 0.00729056 1.37978 -0.864895 -0.872871 32 33001 0.00726876 1.35101 -0.868582 -0.872871 33 34001 0.00724702 1.34567 -0.863959 -0.872871 34 35001 0.00722534 1.37749 -0.866933 -0.872871 35 36001 0.00720373 1.36842 -0.872061 -0.872871 36 37001 0.00718218 1.3651 -0.872759 -0.872871 37 38001 0.0071607 1.34729 -0.865547 -0.872871 38 39001 0.00713928 1.36695 -0.872448 -0.872871 39 40001 0.00711793 1.36643 -0.872556 -0.872871 40 41001 0.00709664 1.35418 -0.870539 -0.872871 41 42001 0.00707541 0.594794 -0.847683 -0.872871 42 43001 0.00705425 1.35379 -0.87033 -0.872871 43 44001 0.00703315 1.36793 -0.872204 -0.872871 44 45001 0.00701211 1.36258 -0.872863 -0.872871 45 46001 0.00699114 1.36767 -0.872274 -0.872871 46 47001 0.00697023 1.39137 -0.85014 -0.872871 47 48001 0.00694938 1.38381 -0.860609 -0.872871 48 49001 0.0069286 1.37191 -0.870645 -0.872871 49 50001 0.00690787 1.36438 -0.872826 -0.872871 50 51001 0.00688721 1.36643 -0.872556 -0.872871 51 52001 0.00686661 1.34557 -0.863864 -0.872871 52 53001 0.00684607 1.35271 -0.869704 -0.872871 53 54001 0.0068256 1.35461 -0.870755 -0.872871 54 55001 0.00680518 1.34705 -0.865317 -0.872871 55 56001 0.00678483 1.34555 -0.863844 -0.872871 56 57001 0.00676453 1.3544 -0.870651 -0.872871 57 58001 0.0067443 1.37319 -0.869947 -0.872871 58 59001 0.00672413 1.37289 -0.87012 -0.872871 59 60001 0.00670401 1.36561 -0.872692 -0.872871 60 61001 0.00668396 1.36889 -0.871909 -0.872871 61 62001 0.00666397 1.3717 -0.870748 -0.872871 62 63001 0.00664404 1.38076 -0.86394 -0.872871 63 64001 0.00662417 1.33705 -0.852963 -0.872871 64 65001 0.00660435 1.37052 -0.871291 -0.872871 65 66001 0.0065846 1.38734 -0.856103 -0.872871 66 67001 0.0065649 1.3718 -0.870701 -0.872871 67 68001 0.00654527 1.34896 -0.867008 -0.872871 68 69001 0.00652569 1.35488 -0.870887 -0.872871 69 70001 0.00650617 1.37107 -0.871048 -0.872871 70 71001 0.00648671 1.36726 -0.872376 -0.872871 71 72001 0.00646731 1.36707 -0.872421 -0.872871 72 73001 0.00644797 1.34789 -0.86609 -0.872871 73 74001 0.00642868 1.3705 -0.8713 -0.872871 74 75001 0.00640945 1.37711 -0.867239 -0.872871 75 76001 0.00639028 1.35185 -0.869158 -0.872871 76 77001 0.00637117 0.616273 -0.842692 -0.872871 77 78001 0.00635211 1.35411 -0.870502 -0.872871 78 79001 0.00633311 1.36347 -0.872868 -0.872871 79 80001 0.00631417 1.36476 -0.872794 -0.872871 80 81001 0.00629528 1.3997 -0.835005 -0.872871 81 82001 0.00627645 1.38277 -0.861803 -0.872871 82 83001 0.00625768 1.37485 -0.868909 -0.872871 83 84001 0.00623896 1.35295 -0.869852 -0.872871 84 85001 0.0062203 1.35708 -0.871806 -0.872871 85 86001 0.0062017 1.3662 -0.872597 -0.872871 86 87001 0.00618315 1.37209 -0.870549 -0.872871 87 88001 0.00616466 1.35771 -0.872016 -0.872871 88 89001 0.00614622 1.35419 -0.87054 -0.872871 89 90001 0.00612783 1.35902 -0.872379 -0.872871 90 91001 0.0061095 1.37822 -0.866319 -0.872871 91 92001 0.00609123 1.37957 -0.865102 -0.872871 92 93001 0.00607301 1.35634 -0.87153 -0.872871 93 94001 0.00605485 1.37988 -0.8648 -0.872871 94 95001 0.00603674 1.37147 -0.870862 -0.872871 95 96001 0.00601868 1.34329 -0.861361 -0.872871 96 97001 0.00600068 1.37891 -0.865705 -0.872871 97 98001 0.00598273 1.36987 -0.871556 -0.872871 98 99001 0.00596484 1.38152 -0.863159 -0.872871 99 100001 0.005947 1.37272 -0.870212 -0.872871 100 101001 0.00592921 1.38517 -0.858957 -0.872871 101 102001 0.00591147 1.36958 -0.871666 -0.872871 102 103001 0.00589379 1.35112 -0.868666 -0.872871 103 104001 0.00587616 1.35983 -0.872554 -0.872871 104 105001 0.00585859 1.34827 -0.866422 -0.872871 105 106001 0.00584106 1.36394 -0.872852 -0.872871 106 107001 0.00582359 1.35721 -0.87185 -0.872871 107 108001 0.00580618 1.37301 -0.870054 -0.872871 108 109001 0.00578881 1.35705 -0.871794 -0.872871 109 110001 0.00577149 1.36788 -0.872218 -0.872871 110 111001 0.00575423 1.35034 -0.8681 -0.872871 111 112001 0.00573702 1.38082 -0.86388 -0.872871 112 113001 0.00571986 1.3645 -0.872817 -0.872871 113 114001 0.00570275 1.36162 -0.872805 -0.872871 114 115001 0.0056857 1.37579 -0.868252 -0.872871 115 116001 0.00566869 1.37627 -0.867897 -0.872871 116 117001 0.00565173 1.37343 -0.869809 -0.872871 117 118001 0.00563483 1.36924 -0.871792 -0.872871 118 119001 0.00561798 1.36836 -0.87208 -0.872871 119 120001 0.00560117 1.37157 -0.87081 -0.872871 120 121001 0.00558442 1.35632 -0.871522 -0.872871 121 122001 0.00556772 1.35976 -0.872541 -0.872871 122 123001 0.00555106 1.38023 -0.864462 -0.872871 123 124001 0.00553446 1.38095 -0.863748 -0.872871 124 125001 0.00551791 1.36894 -0.871894 -0.872871 125 126001 0.0055014 1.3784 -0.866157 -0.872871 126 127001 0.00548495 1.37446 -0.869164 -0.872871 127 128001 0.00546854 1.33953 -0.856572 -0.872871 128 129001 0.00545218 1.36883 -0.871932 -0.872871 129 130001 0.00543588 1.35546 -0.871156 -0.872871 130 131001 0.00541962 1.35448 -0.870693 -0.872871 131 132001 0.00540341 1.38166 -0.863013 -0.872871 132 133001 0.00538725 1.36231 -0.872852 -0.872871 133 134001 0.00537113 1.35093 -0.868532 -0.872871 134 135001 0.00535507 1.36347 -0.872868 -0.872871 135 136001 0.00533905 1.36546 -0.872714 -0.872871 136 137001 0.00532308 1.3565 -0.871593 -0.872871 137 138001 0.00530716 1.36342 -0.872869 -0.872871 138 139001 0.00529129 1.37767 -0.866785 -0.872871 139 140001 0.00527546 1.35735 -0.8719 -0.872871 140 141001 0.00525968 1.35466 -0.870779 -0.872871 141 142001 0.00524395 1.36762 -0.872288 -0.872871 142 143001 0.00522826 1.34728 -0.865538 -0.872871 143 144001 0.00521263 1.36686 -0.872469 -0.872871 144 145001 0.00519703 1.3457 -0.863996 -0.872871 145 146001 0.00518149 1.36457 -0.872811 -0.872871 146 147001 0.00516599 1.36191 -0.872828 -0.872871 147 148001 0.00515054 1.35299 -0.869874 -0.872871 148 149001 0.00513514 1.37083 -0.871156 -0.872871 149 150001 0.00511978 1.36041 -0.872656 -0.872871 150 151001 0.00510446 1.36889 -0.87191 -0.872871 151 152001 0.0050892 1.35861 -0.872278 -0.872871 152 153001 0.00507397 1.37867 -0.865921 -0.872871 153 154001 0.0050588 1.35613 -0.871444 -0.872871 154 155001 0.00504367 1.36702 -0.872434 -0.872871 155 156001 0.00502858 1.36367 -0.872863 -0.872871 156 157001 0.00501354 1.33862 -0.855295 -0.872871 157 158001 0.00499854 1.36721 -0.872388 -0.872871 158 159001 0.00498359 1.37434 -0.869244 -0.872871 159 160001 0.00496869 1.3711 -0.871035 -0.872871 160 161001 0.00495383 1.37796 -0.866542 -0.872871 161 162001 0.00493901 1.35155 -0.868962 -0.872871 162 163001 0.00492424 1.36935 -0.871751 -0.872871 163 164001 0.00490951 1.37406 -0.869424 -0.872871 164 165001 0.00489482 1.37 -0.871508 -0.872871 165 166001 0.00488018 1.36735 -0.872355 -0.872871 166 167001 0.00486559 1.37326 -0.869909 -0.872871 167 168001 0.00485103 1.33658 -0.852239 -0.872871 168 169001 0.00483652 1.36361 -0.872864 -0.872871 169 170001 0.00482206 1.37817 -0.866362 -0.872871 170 171001 0.00480763 1.36476 -0.872794 -0.872871 171 172001 0.00479325 1.3458 -0.864091 -0.872871 172 173001 0.00477892 1.36734 -0.872358 -0.872871 173 174001 0.00476462 1.34898 -0.867027 -0.872871 174 175001 0.00475037 1.35619 -0.871468 -0.872871 175 176001 0.00473616 1.38367 -0.860772 -0.872871 176 177001 0.004722 1.36996 -0.871522 -0.872871 177 178001 0.00470787 1.34626 -0.864555 -0.872871 178 179001 0.00469379 1.34821 -0.866372 -0.872871 179 180001 0.00467975 1.38758 -0.855774 -0.872871 180 181001 0.00466576 1.34724 -0.865497 -0.872871 181 182001 0.0046518 1.35349 -0.870165 -0.872871 182 183001 0.00463789 1.36837 -0.872075 -0.872871 183 184001 0.00462402 1.37752 -0.866909 -0.872871 184 185001 0.00461018 1.35046 -0.868189 -0.872871 185 186001 0.0045964 1.36951 -0.871694 -0.872871 186 187001 0.00458265 1.35783 -0.872054 -0.872871 187 188001 0.00456894 1.37784 -0.866644 -0.872871 188 189001 0.00455527 1.34244 -0.860352 -0.872871 189 190001 0.00454165 1.3553 -0.871086 -0.872871 190 191001 0.00452807 1.37205 -0.87057 -0.872871 191 192001 0.00451452 1.35714 -0.871827 -0.872871 192 193001 0.00450102 1.36194 -0.87283 -0.872871 193 194001 0.00448756 1.36681 -0.872478 -0.872871 194 195001 0.00447413 1.35001 -0.867852 -0.872871 195 196001 0.00446075 1.36337 -0.87287 -0.872871 196 197001 0.00444741 1.36626 -0.872587 -0.872871 197 198001 0.00443411 1.36089 -0.872725 -0.872871 198 199001 0.00442084 1.36872 -0.871966 -0.872871 199 200001 0.00440762 1.36137 -0.872781 -0.872871 200 201001 0.00439444 1.37496 -0.868831 -0.872871 201 202001 0.00438129 1.37225 -0.870468 -0.872871 202 203001 0.00436819 1.35427 -0.870583 -0.872871 203 204001 0.00435512 1.36808 -0.87216 -0.872871 204 205001 0.0043421 1.35467 -0.870788 -0.872871 205 206001 0.00432911 1.37245 -0.870362 -0.872871 206 207001 0.00431616 1.37061 -0.871253 -0.872871 207 208001 0.00430325 1.35811 -0.872138 -0.872871 208 209001 0.00429038 1.35285 -0.869791 -0.872871 209 210001 0.00427755 1.35997 -0.872582 -0.872871 210 211001 0.00426475 1.36263 -0.872864 -0.872871 211 212001 0.004252 1.3777 -0.866761 -0.872871 212 213001 0.00423928 1.36066 -0.872695 -0.872871 213 214001 0.0042266 1.36446 -0.87282 -0.872871 214 215001 0.00421396 1.36274 -0.872867 -0.872871 215 216001 0.00420136 1.36139 -0.872783 -0.872871 216 217001 0.00418879 0.600455 -0.848907 -0.872871 217 218001 0.00417626 1.3655 -0.872708 -0.872871 218 219001 0.00416377 1.35761 -0.871983 -0.872871 219 220001 0.00415131 1.35207 -0.869303 -0.872871 220 221001 0.0041389 1.37308 -0.870012 -0.872871 221 222001 0.00412652 0.604398 -0.848692 -0.872871 222 223001 0.00411418 1.35878 -0.872322 -0.872871 223 224001 0.00410187 1.35973 -0.872536 -0.872871 224 225001 0.0040896 1.34116 -0.858756 -0.872871 225 226001 0.00407737 1.36912 -0.871832 -0.872871 226 227001 0.00406517 1.36083 -0.872718 -0.872871 227 228001 0.00405301 1.35755 -0.871965 -0.872871 228 229001 0.00404089 1.36452 -0.872816 -0.872871 229 230001 0.00402881 1.34913 -0.867153 -0.872871 230 231001 0.00401676 1.37163 -0.870783 -0.872871 231 232001 0.00400474 1.36975 -0.871601 -0.872871 232 233001 0.00399276 1.36343 -0.872869 -0.872871 233 234001 0.00398082 1.38015 -0.864542 -0.872871 234 235001 0.00396891 1.36349 -0.872867 -0.872871 235 236001 0.00395704 1.37645 -0.86776 -0.872871 236 237001 0.00394521 1.36781 -0.872236 -0.872871 237 238001 0.00393341 1.36205 -0.872837 -0.872871 238 239001 0.00392164 1.35652 -0.871598 -0.872871 239 240001 0.00390991 1.3626 -0.872863 -0.872871 240 241001 0.00389822 1.36858 -0.872011 -0.872871 241 242001 0.00388656 1.36371 -0.872861 -0.872871 242 243001 0.00387493 1.36043 -0.872659 -0.872871 243 244001 0.00386334 1.35087 -0.868488 -0.872871 244 245001 0.00385179 1.35152 -0.868938 -0.872871 245 246001 0.00384027 1.36402 -0.872848 -0.872871 246 247001 0.00382878 1.366 -0.872632 -0.872871 247 248001 0.00381733 1.36967 -0.871634 -0.872871 248 249001 0.00380591 1.36207 -0.872838 -0.872871 249 250001 0.00379453 1.36612 -0.872611 -0.872871 250 251001 0.00378318 1.36431 -0.872831 -0.872871 251 252001 0.00377186 1.36101 -0.872741 -0.872871 252 253001 0.00376058 1.3605 -0.872671 -0.872871 253 254001 0.00374933 1.36757 -0.872301 -0.872871 254 255001 0.00373812 1.35845 -0.872233 -0.872871 255 256001 0.00372694 1.36429 -0.872832 -0.872871 256 257001 0.00371579 1.34785 -0.866052 -0.872871 257 258001 0.00370468 1.36754 -0.872307 -0.872871 258 259001 0.00369359 1.36264 -0.872864 -0.872871 259 260001 0.00368255 1.37189 -0.870654 -0.872871 260 261001 0.00367153 1.37913 -0.865504 -0.872871 261 262001 0.00366055 1.3585 -0.872247 -0.872871 262 263001 0.0036496 1.35574 -0.871279 -0.872871 263 264001 0.00363869 1.35072 -0.86838 -0.872871 264 265001 0.0036278 1.36427 -0.872833 -0.872871 265 266001 0.00361695 1.3643 -0.872832 -0.872871 266 267001 0.00360613 1.35975 -0.87254 -0.872871 267 268001 0.00359535 1.35908 -0.872395 -0.872871 268 269001 0.00358459 1.36747 -0.872326 -0.872871 269 270001 0.00357387 1.36209 -0.87284 -0.872871 270 271001 0.00356318 1.3685 -0.872035 -0.872871 271 272001 0.00355252 1.36348 -0.872868 -0.872871 272 273001 0.0035419 1.36101 -0.87274 -0.872871 273 274001 0.00353131 1.36915 -0.871821 -0.872871 274 275001 0.00352074 1.36716 -0.8724 -0.872871 275 276001 0.00351021 1.36475 -0.872795 -0.872871 276 277001 0.00349971 1.36847 -0.872046 -0.872871 277 278001 0.00348925 1.3609 -0.872726 -0.872871 278 279001 0.00347881 1.36209 -0.87284 -0.872871 279 280001 0.0034684 1.36487 -0.872784 -0.872871 280 281001 0.00345803 1.36245 -0.872858 -0.872871 281 282001 0.00344769 1.34269 -0.860654 -0.872871 282 283001 0.00343737 1.36668 -0.872507 -0.872871 283 284001 0.00342709 1.35441 -0.870653 -0.872871 284 285001 0.00341684 1.34053 -0.857935 -0.872871 285 286001 0.00340662 1.36165 -0.872808 -0.872871 286 287001 0.00339643 1.37413 -0.86938 -0.872871 287 288001 0.00338627 1.36601 -0.87263 -0.872871 288 289001 0.00337615 1.35865 -0.872288 -0.872871 289 290001 0.00336605 1.36106 -0.872746 -0.872871 290 291001 0.00335598 1.37665 -0.867603 -0.872871 291 292001 0.00334594 1.35901 -0.872377 -0.872871 292 293001 0.00333593 1.35115 -0.868684 -0.872871 293 294001 0.00332596 1.36462 -0.872807 -0.872871 294 295001 0.00331601 1.36175 -0.872816 -0.872871 295 296001 0.00330609 1.36041 -0.872656 -0.872871 296 297001 0.0032962 1.36403 -0.872848 -0.872871 297 298001 0.00328634 1.35409 -0.870487 -0.872871 298 299001 0.00327651 1.36861 -0.872 -0.872871 299 300001 0.00326671 1.36051 -0.872671 -0.872871 300 301001 0.00325694 1.36871 -0.87197 -0.872871 301 302001 0.0032472 1.3616 -0.872803 -0.872871 302 303001 0.00323749 1.3669 -0.872458 -0.872871 303 304001 0.0032278 1.36647 -0.872548 -0.872871 304 305001 0.00321815 1.36554 -0.872703 -0.872871 305 306001 0.00320852 1.3593 -0.872445 -0.872871 306 307001 0.00319893 1.38291 -0.861649 -0.872871 307 308001 0.00318936 1.37155 -0.870824 -0.872871 308 309001 0.00317982 1.35609 -0.871427 -0.872871 309 310001 0.00317031 1.35635 -0.871533 -0.872871 310 311001 0.00316083 1.36805 -0.87217 -0.872871 311 312001 0.00315137 1.37938 -0.865279 -0.872871 312 313001 0.00314195 1.34956 -0.867498 -0.872871 313 314001 0.00313255 1.36637 -0.872567 -0.872871 314 315001 0.00312318 1.36095 -0.872733 -0.872871 315 316001 0.00311384 1.36249 -0.872859 -0.872871 316 317001 0.00310452 1.36363 -0.872864 -0.872871 317 318001 0.00309524 1.35647 -0.871581 -0.872871 318 319001 0.00308598 1.34571 -0.864007 -0.872871 319 320001 0.00307675 1.35461 -0.870758 -0.872871 320 321001 0.00306755 1.36393 -0.872853 -0.872871 321 322001 0.00305837 1.36118 -0.872761 -0.872871 322 323001 0.00304923 1.35368 -0.87027 -0.872871 323 324001 0.00304011 1.37103 -0.871068 -0.872871 324 325001 0.00303101 1.37314 -0.869978 -0.872871 325 326001 0.00302195 1.36879 -0.871942 -0.872871 326 327001 0.00301291 1.34159 -0.859304 -0.872871 327 328001 0.0030039 1.36714 -0.872406 -0.872871 328 329001 0.00299491 1.36767 -0.872273 -0.872871 329 330001 0.00298595 1.35963 -0.872516 -0.872871 330 331001 0.00297702 1.36921 -0.8718 -0.872871 331 332001 0.00296812 1.35815 -0.87215 -0.872871 332 333001 0.00295924 1.35581 -0.871313 -0.872871 333 334001 0.00295039 1.36319 -0.872871 -0.872871 334 335001 0.00294156 1.35885 -0.872339 -0.872871 335 336001 0.00293277 1.37292 -0.870101 -0.872871 336 337001 0.00292399 1.36824 -0.872114 -0.872871 337 338001 0.00291525 1.36924 -0.871791 -0.872871 338 339001 0.00290653 1.36079 -0.872712 -0.872871 339 340001 0.00289784 1.35188 -0.86918 -0.872871 340 341001 0.00288917 1.35845 -0.872233 -0.872871 341 342001 0.00288053 1.35184 -0.869155 -0.872871 342 343001 0.00287191 1.37069 -0.871219 -0.872871 343 344001 0.00286332 1.36534 -0.87273 -0.872871 344 345001 0.00285476 1.36339 -0.872869 -0.872871 345 346001 0.00284622 1.34957 -0.867503 -0.872871 346 347001 0.0028377 1.36435 -0.872828 -0.872871 347 348001 0.00282922 1.36561 -0.872693 -0.872871 348 349001 0.00282075 1.34822 -0.86638 -0.872871 349 350001 0.00281232 1.35894 -0.87236 -0.872871 350 351001 0.00280391 1.37104 -0.871063 -0.872871 351 352001 0.00279552 1.35846 -0.872235 -0.872871 352 353001 0.00278716 1.36966 -0.871638 -0.872871 353 354001 0.00277882 1.35813 -0.872145 -0.872871 354 355001 0.00277051 1.36289 -0.87287 -0.872871 355 356001 0.00276222 1.35734 -0.871895 -0.872871 356 357001 0.00275396 1.3575 -0.87195 -0.872871 357 358001 0.00274572 1.3584 -0.872221 -0.872871 358 359001 0.00273751 1.3591 -0.872398 -0.872871 359 360001 0.00272932 1.36881 -0.871937 -0.872871 360 361001 0.00272116 1.3541 -0.870494 -0.872871 361 362001 0.00271302 1.37306 -0.870025 -0.872871 362 363001 0.00270491 1.36662 -0.872519 -0.872871 363 364001 0.00269682 1.36343 -0.872869 -0.872871 364 365001 0.00268875 1.37472 -0.868994 -0.872871 365 366001 0.00268071 1.36041 -0.872656 -0.872871 366 367001 0.00267269 1.3676 -0.872293 -0.872871 367 368001 0.0026647 1.35906 -0.872391 -0.872871 368 369001 0.00265673 1.35233 -0.869467 -0.872871 369 370001 0.00264878 1.36062 -0.872689 -0.872871 370 371001 0.00264086 1.36286 -0.872869 -0.872871 371 372001 0.00263296 1.35729 -0.871879 -0.872871 372 373001 0.00262508 1.35858 -0.87227 -0.872871 373 374001 0.00261723 1.37122 -0.87098 -0.872871 374 375001 0.0026094 1.35803 -0.872113 -0.872871 375 376001 0.0026016 1.36793 -0.872204 -0.872871 376 377001 0.00259382 1.37147 -0.870863 -0.872871 377 378001 0.00258606 1.36211 -0.872841 -0.872871 378 379001 0.00257832 1.36328 -0.872871 -0.872871 379 380001 0.00257061 1.35359 -0.87022 -0.872871 380 381001 0.00256292 1.367 -0.872438 -0.872871 381 382001 0.00255526 1.35373 -0.870296 -0.872871 382 383001 0.00254761 1.36303 -0.872871 -0.872871 383 384001 0.00253999 1.3633 -0.87287 -0.872871 384 385001 0.0025324 1.36557 -0.872698 -0.872871 385 386001 0.00252482 1.36821 -0.872123 -0.872871 386 387001 0.00251727 1.36262 -0.872864 -0.872871 387 388001 0.00250974 1.36021 -0.872624 -0.872871 388 389001 0.00250223 1.3663 -0.87258 -0.872871 389 390001 0.00249475 1.3582 -0.872163 -0.872871 390 391001 0.00248729 1.36916 -0.871817 -0.872871 391 392001 0.00247985 1.3652 -0.872747 -0.872871 392 393001 0.00247243 1.35635 -0.871532 -0.872871 393 394001 0.00246504 1.3656 -0.872695 -0.872871 394 395001 0.00245766 1.37178 -0.870707 -0.872871 395 396001 0.00245031 1.367 -0.872436 -0.872871 396 397001 0.00244298 1.36534 -0.87273 -0.872871 397 398001 0.00243568 1.36641 -0.87256 -0.872871 398 399001 0.00242839 1.36502 -0.872768 -0.872871 399 400001 0.00242113 1.3695 -0.871696 -0.872871 400 401001 0.00241389 1.36242 -0.872857 -0.872871 401 402001 0.00240667 1.36178 -0.872818 -0.872871 402 403001 0.00239947 1.36304 -0.872871 -0.872871 403 404001 0.00239229 1.36687 -0.872466 -0.872871 404 405001 0.00238514 1.35853 -0.872255 -0.872871 405 406001 0.002378 1.35999 -0.872585 -0.872871 406 407001 0.00237089 1.36968 -0.871628 -0.872871 407 408001 0.0023638 1.35955 -0.872499 -0.872871 408 409001 0.00235673 1.36998 -0.871515 -0.872871 409 410001 0.00234968 1.36547 -0.872713 -0.872871 410 411001 0.00234265 1.35463 -0.870767 -0.872871 411 412001 0.00233564 1.36503 -0.872767 -0.872871 412 413001 0.00232866 1.36648 -0.872546 -0.872871 413 414001 0.00232169 1.36683 -0.872475 -0.872871 414 415001 0.00231475 1.36674 -0.872493 -0.872871 415 416001 0.00230782 1.35824 -0.872174 -0.872871 416 417001 0.00230092 1.36944 -0.87172 -0.872871 417 418001 0.00229404 1.36587 -0.872653 -0.872871 418 419001 0.00228718 1.36152 -0.872796 -0.872871 419 420001 0.00228034 1.37223 -0.87048 -0.872871 420 421001 0.00227352 1.35744 -0.87193 -0.872871 421 422001 0.00226672 1.36376 -0.87286 -0.872871 422 423001 0.00225994 1.35723 -0.871858 -0.872871 423 424001 0.00225318 1.36273 -0.872867 -0.872871 424 425001 0.00224644 1.34229 -0.860172 -0.872871 425 426001 0.00223972 1.36341 -0.872869 -0.872871 426 427001 0.00223302 1.35882 -0.872332 -0.872871 427 428001 0.00222634 1.3738 -0.869586 -0.872871 428 429001 0.00221968 1.36062 -0.872689 -0.872871 429 430001 0.00221304 1.36108 -0.872749 -0.872871 430 431001 0.00220642 1.35994 -0.872576 -0.872871 431 432001 0.00219982 1.36885 -0.871925 -0.872871 432 433001 0.00219324 1.36229 -0.872851 -0.872871 433 434001 0.00218668 1.35676 -0.871691 -0.872871 434 435001 0.00218014 1.35708 -0.871807 -0.872871 435 436001 0.00217362 1.36478 -0.872792 -0.872871 436 437001 0.00216712 1.36736 -0.872352 -0.872871 437 438001 0.00216064 1.36322 -0.872871 -0.872871 438 439001 0.00215418 1.35076 -0.868408 -0.872871 439 440001 0.00214773 1.37074 -0.871197 -0.872871 440 441001 0.00214131 1.3573 -0.871883 -0.872871 441 442001 0.0021349 1.36093 -0.872731 -0.872871 442 443001 0.00212852 1.35681 -0.87171 -0.872871 443 444001 0.00212215 1.35607 -0.871418 -0.872871 444 445001 0.00211581 1.37319 -0.86995 -0.872871 445 446001 0.00210948 1.36296 -0.87287 -0.872871 446 447001 0.00210317 1.36916 -0.87182 -0.872871 447 448001 0.00209688 1.38194 -0.862709 -0.872871 448 449001 0.00209061 1.37269 -0.870233 -0.872871 449 450001 0.00208435 1.36146 -0.872791 -0.872871 450 451001 0.00207812 1.35221 -0.869396 -0.872871 451 452001 0.0020719 1.36202 -0.872835 -0.872871 452 453001 0.0020657 1.3605 -0.87267 -0.872871 453 454001 0.00205953 1.35976 -0.87254 -0.872871 454 455001 0.00205337 1.36948 -0.871703 -0.872871 455 456001 0.00204722 1.35624 -0.871489 -0.872871 456 457001 0.0020411 1.36128 -0.872772 -0.872871 457 458001 0.002035 1.37114 -0.871017 -0.872871 458 459001 0.00202891 1.35722 -0.871853 -0.872871 459 460001 0.00202284 1.36133 -0.872777 -0.872871 460 461001 0.00201679 1.35651 -0.871594 -0.872871 461 462001 0.00201076 1.37495 -0.868842 -0.872871 462 463001 0.00200474 1.36967 -0.871632 -0.872871 463 464001 0.00199875 1.36456 -0.872812 -0.872871 464 465001 0.00199277 1.36506 -0.872763 -0.872871 465 466001 0.00198681 1.3579 -0.872076 -0.872871 466 467001 0.00198087 1.35926 -0.872436 -0.872871 467 468001 0.00197494 1.3684 -0.872068 -0.872871 468 469001 0.00196903 1.36255 -0.872861 -0.872871 469 470001 0.00196315 1.3599 -0.872568 -0.872871 470 471001 0.00195727 1.37334 -0.86986 -0.872871 471 472001 0.00195142 1.35974 -0.872536 -0.872871 472 473001 0.00194558 1.35682 -0.871711 -0.872871 473 474001 0.00193976 1.367 -0.872437 -0.872871 474 475001 0.00193396 1.35525 -0.871063 -0.872871 475 476001 0.00192818 1.36734 -0.872357 -0.872871 476 477001 0.00192241 1.3531 -0.86994 -0.872871 477 478001 0.00191666 1.36192 -0.872829 -0.872871 478 479001 0.00191093 1.35485 -0.870875 -0.872871 479 480001 0.00190521 1.35417 -0.870532 -0.872871 480 481001 0.00189951 1.36015 -0.872613 -0.872871 481 482001 0.00189383 1.36068 -0.872697 -0.872871 482 483001 0.00188817 1.37158 -0.870808 -0.872871 483 484001 0.00188252 1.36887 -0.871919 -0.872871 484 485001 0.00187689 1.35996 -0.872579 -0.872871 485 486001 0.00187127 1.37107 -0.871049 -0.872871 486 487001 0.00186568 1.36997 -0.871517 -0.872871 487 488001 0.0018601 1.36937 -0.871743 -0.872871 488 489001 0.00185453 1.36417 -0.87284 -0.872871 489 490001 0.00184899 1.36969 -0.871627 -0.872871 490 491001 0.00184346 1.3664 -0.872562 -0.872871 491 492001 0.00183794 1.35847 -0.872239 -0.872871 492 493001 0.00183244 1.35724 -0.87186 -0.872871 493 494001 0.00182696 1.36995 -0.871525 -0.872871 494 495001 0.0018215 1.36546 -0.872714 -0.872871 495 496001 0.00181605 1.36061 -0.872686 -0.872871 496 497001 0.00181062 1.36768 -0.872272 -0.872871 497 498001 0.0018052 1.36436 -0.872827 -0.872871 498 499001 0.0017998 1.36797 -0.872193 -0.872871 499 500001 0.00179442 1.35838 -0.872215 -0.872871 500 501001 0.00178905 1.35469 -0.870796 -0.872871 501 502001 0.0017837 1.3623 -0.872851 -0.872871 502 503001 0.00177837 1.37334 -0.869861 -0.872871 503 504001 0.00177305 1.35608 -0.871426 -0.872871 504 505001 0.00176775 1.36054 -0.872676 -0.872871 505 506001 0.00176246 1.36229 -0.872851 -0.872871 506 507001 0.00175719 1.35876 -0.872316 -0.872871 507 508001 0.00175193 1.3588 -0.872326 -0.872871 508 509001 0.00174669 1.36077 -0.87271 -0.872871 509 510001 0.00174147 1.35534 -0.871104 -0.872871 510 511001 0.00173626 1.36767 -0.872275 -0.872871 511 512001 0.00173106 1.36506 -0.872763 -0.872871 512 513001 0.00172589 1.37553 -0.868436 -0.872871 513 514001 0.00172072 1.36152 -0.872796 -0.872871 514 515001 0.00171558 1.36445 -0.872821 -0.872871 515 516001 0.00171045 1.37093 -0.87111 -0.872871 516 517001 0.00170533 1.36191 -0.872828 -0.872871 517 518001 0.00170023 1.3592 -0.872421 -0.872871 518 519001 0.00169514 1.37028 -0.871394 -0.872871 519 520001 0.00169007 1.36369 -0.872862 -0.872871 520 521001 0.00168502 1.36131 -0.872775 -0.872871 521 522001 0.00167998 1.3701 -0.871467 -0.872871 522 523001 0.00167495 1.3617 -0.872812 -0.872871 523 524001 0.00166994 1.364 -0.872849 -0.872871 524 525001 0.00166495 1.36182 -0.872822 -0.872871 525 526001 0.00165997 1.35741 -0.871921 -0.872871 526 527001 0.001655 1.36783 -0.872232 -0.872871 527 528001 0.00165005 1.37589 -0.868174 -0.872871 528 529001 0.00164512 1.36191 -0.872828 -0.872871 529 530001 0.0016402 1.36505 -0.872765 -0.872871 530 531001 0.00163529 1.36189 -0.872827 -0.872871 531 532001 0.0016304 1.37241 -0.870383 -0.872871 532 533001 0.00162552 1.36016 -0.872614 -0.872871 533 534001 0.00162066 1.35598 -0.871383 -0.872871 534 535001 0.00161582 1.36102 -0.872742 -0.872871 535 536001 0.00161098 1.36105 -0.872745 -0.872871 536 537001 0.00160616 1.37132 -0.870931 -0.872871 537 538001 0.00160136 1.36178 -0.872818 -0.872871 538 539001 0.00159657 1.36101 -0.872741 -0.872871 539 540001 0.00159179 1.3514 -0.868857 -0.872871 540 541001 0.00158703 1.35059 -0.868281 -0.872871 541 542001 0.00158229 1.36146 -0.87279 -0.872871 542 543001 0.00157755 1.3644 -0.872825 -0.872871 543 544001 0.00157284 1.36709 -0.872418 -0.872871 544 545001 0.00156813 1.36591 -0.872647 -0.872871 545 546001 0.00156344 1.35839 -0.872216 -0.872871 546 547001 0.00155876 1.3643 -0.872831 -0.872871 547 548001 0.0015541 1.36053 -0.872675 -0.872871 548 549001 0.00154945 1.3635 -0.872867 -0.872871 549 550001 0.00154482 1.35505 -0.870968 -0.872871 550 551001 0.0015402 1.36611 -0.872613 -0.872871 551 552001 0.00153559 1.35797 -0.872096 -0.872871 552 553001 0.001531 1.35848 -0.872241 -0.872871 553 554001 0.00152642 1.37049 -0.871304 -0.872871 554 555001 0.00152185 1.36536 -0.872727 -0.872871 555 556001 0.0015173 1.3616 -0.872803 -0.872871 556 557001 0.00151276 1.3575 -0.871948 -0.872871 557 558001 0.00150824 1.3654 -0.872722 -0.872871 558 559001 0.00150373 1.36713 -0.872406 -0.872871 559 560001 0.00149923 1.36467 -0.872802 -0.872871 560 561001 0.00149475 1.37246 -0.870359 -0.872871 561 562001 0.00149028 1.36 -0.872587 -0.872871 562 563001 0.00148582 1.36101 -0.87274 -0.872871 563 564001 0.00148137 1.36336 -0.87287 -0.872871 564 565001 0.00147694 1.37169 -0.870753 -0.872871 565 566001 0.00147253 1.36314 -0.872871 -0.872871 566 567001 0.00146812 1.36512 -0.872757 -0.872871 567 568001 0.00146373 1.36534 -0.87273 -0.872871 568 569001 0.00145935 1.36425 -0.872835 -0.872871 569 570001 0.00145499 1.36591 -0.872647 -0.872871 570 571001 0.00145064 1.36356 -0.872866 -0.872871 571 572001 0.0014463 1.36166 -0.872808 -0.872871 572 573001 0.00144197 1.37086 -0.871142 -0.872871 573 574001 0.00143766 1.36407 -0.872846 -0.872871 574 575001 0.00143336 1.36241 -0.872856 -0.872871 575 576001 0.00142907 1.36366 -0.872863 -0.872871 576 577001 0.0014248 1.36099 -0.872738 -0.872871 577 578001 0.00142053 1.36255 -0.872862 -0.872871 578 579001 0.00141629 1.36556 -0.872701 -0.872871 579 580001 0.00141205 1.36467 -0.872803 -0.872871 580 581001 0.00140783 1.36248 -0.872859 -0.872871 581 582001 0.00140361 1.36518 -0.87275 -0.872871 582 583001 0.00139942 1.36438 -0.872826 -0.872871 583 584001 0.00139523 1.35489 -0.870893 -0.872871 584 585001 0.00139106 1.37375 -0.869615 -0.872871 585 586001 0.0013869 1.36305 -0.872871 -0.872871 586 587001 0.00138275 1.3626 -0.872863 -0.872871 587 588001 0.00137861 1.35603 -0.871402 -0.872871 588 589001 0.00137449 1.3666 -0.872523 -0.872871 589 590001 0.00137038 1.3674 -0.872344 -0.872871 590 591001 0.00136628 1.36803 -0.872176 -0.872871 591 592001 0.00136219 1.35847 -0.872241 -0.872871 592 593001 0.00135812 1.36606 -0.872623 -0.872871 593 594001 0.00135406 1.36121 -0.872765 -0.872871 594 595001 0.00135001 1.36789 -0.872214 -0.872871 595 596001 0.00134597 1.36256 -0.872862 -0.872871 596 597001 0.00134194 1.37111 -0.871032 -0.872871 597 598001 0.00133793 1.36379 -0.872859 -0.872871 598 599001 0.00133393 1.35218 -0.869374 -0.872871 599 600001 0.00132994 1.35903 -0.872382 -0.872871 600 601001 0.00132596 1.36535 -0.872729 -0.872871 601 602001 0.00132199 1.35313 -0.869955 -0.872871 602 603001 0.00131804 1.36631 -0.872578 -0.872871 603 604001 0.0013141 1.35686 -0.871726 -0.872871 604 605001 0.00131017 1.35392 -0.870401 -0.872871 605 606001 0.00130625 1.35453 -0.870717 -0.872871 606 607001 0.00130234 1.3581 -0.872136 -0.872871 607 608001 0.00129845 1.36816 -0.87214 -0.872871 608 609001 0.00129456 1.36221 -0.872847 -0.872871 609 610001 0.00129069 1.36332 -0.87287 -0.872871 610 611001 0.00128683 1.3673 -0.872367 -0.872871 611 612001 0.00128298 1.36123 -0.872767 -0.872871 612 613001 0.00127914 1.36295 -0.87287 -0.872871 613 614001 0.00127532 1.35909 -0.872396 -0.872871 614 615001 0.0012715 1.36361 -0.872864 -0.872871 615 616001 0.0012677 1.37071 -0.871209 -0.872871 616 617001 0.00126391 1.36319 -0.872871 -0.872871 617 618001 0.00126013 1.36313 -0.872871 -0.872871 618 619001 0.00125636 1.36924 -0.871791 -0.872871 619 620001 0.0012526 1.35652 -0.871598 -0.872871 620 621001 0.00124885 1.36422 -0.872837 -0.872871 621 622001 0.00124512 1.36763 -0.872284 -0.872871 622 623001 0.00124139 1.37126 -0.870962 -0.872871 623 624001 0.00123768 1.36319 -0.872871 -0.872871 624 625001 0.00123398 1.36594 -0.872642 -0.872871 625 626001 0.00123029 1.36094 -0.872732 -0.872871 626 627001 0.00122661 1.35974 -0.872537 -0.872871 627 628001 0.00122294 1.36172 -0.872813 -0.872871 628 629001 0.00121928 1.36462 -0.872807 -0.872871 629 630001 0.00121563 1.36037 -0.87265 -0.872871 630 631001 0.001212 1.35818 -0.872157 -0.872871 631 632001 0.00120837 1.35545 -0.871154 -0.872871 632 633001 0.00120476 1.35413 -0.87051 -0.872871 633 634001 0.00120116 1.35937 -0.87246 -0.872871 634 635001 0.00119756 1.35932 -0.872449 -0.872871 635 636001 0.00119398 1.36742 -0.872338 -0.872871 636 637001 0.00119041 1.35626 -0.871498 -0.872871 637 638001 0.00118685 1.36757 -0.872299 -0.872871 638 639001 0.0011833 1.36882 -0.871932 -0.872871 639 640001 0.00117976 1.35882 -0.872332 -0.872871 640 641001 0.00117623 1.35949 -0.872486 -0.872871 641 642001 0.00117271 1.36847 -0.872044 -0.872871 642 643001 0.00116921 1.36486 -0.872784 -0.872871 643 644001 0.00116571 1.36733 -0.872361 -0.872871 644 645001 0.00116222 1.35384 -0.870357 -0.872871 645 646001 0.00115875 1.36427 -0.872833 -0.872871 646 647001 0.00115528 1.36758 -0.872296 -0.872871 647 648001 0.00115182 1.36076 -0.872708 -0.872871 648 649001 0.00114838 1.36452 -0.872815 -0.872871 649 650001 0.00114494 1.35918 -0.872418 -0.872871 650 651001 0.00114152 1.36823 -0.872119 -0.872871 651 652001 0.00113811 1.36347 -0.872868 -0.872871 652 653001 0.0011347 1.3697 -0.871621 -0.872871 653 654001 0.00113131 1.3619 -0.872827 -0.872871 654 655001 0.00112792 1.3665 -0.872541 -0.872871 655 656001 0.00112455 1.36215 -0.872843 -0.872871 656 657001 0.00112119 1.36463 -0.872806 -0.872871 657 658001 0.00111783 1.36283 -0.872869 -0.872871 658 659001 0.00111449 1.35811 -0.872138 -0.872871 659 660001 0.00111116 1.36891 -0.871904 -0.872871 660 661001 0.00110783 1.35995 -0.872577 -0.872871 661 662001 0.00110452 1.36238 -0.872855 -0.872871 662 663001 0.00110122 1.36286 -0.872869 -0.872871 663 664001 0.00109792 1.36694 -0.872449 -0.872871 664 665001 0.00109464 1.36139 -0.872783 -0.872871 665 666001 0.00109136 1.3604 -0.872655 -0.872871 666 667001 0.0010881 1.35803 -0.872114 -0.872871 667 668001 0.00108484 1.36366 -0.872863 -0.872871 668 669001 0.0010816 1.36379 -0.872859 -0.872871 669 670001 0.00107837 1.36165 -0.872807 -0.872871 670 671001 0.00107514 1.36086 -0.872721 -0.872871 671 672001 0.00107192 1.36679 -0.872484 -0.872871 672 673001 0.00106872 1.35909 -0.872397 -0.872871 673 674001 0.00106552 1.36562 -0.872692 -0.872871 674 675001 0.00106233 1.37245 -0.870359 -0.872871 675 676001 0.00105916 1.3625 -0.87286 -0.872871 676 677001 0.00105599 1.3582 -0.872163 -0.872871 677 678001 0.00105283 1.36365 -0.872864 -0.872871 678 679001 0.00104968 1.35899 -0.872372 -0.872871 679 680001 0.00104654 1.36224 -0.872848 -0.872871 680 681001 0.00104341 1.36048 -0.872667 -0.872871 681 682001 0.00104029 1.36562 -0.872691 -0.872871 682 683001 0.00103718 1.36453 -0.872814 -0.872871 683 684001 0.00103408 1.35992 -0.872572 -0.872871 684 685001 0.00103098 1.36693 -0.872453 -0.872871 685 686001 0.0010279 1.36254 -0.872861 -0.872871 686 687001 0.00102483 1.36824 -0.872115 -0.872871 687 688001 0.00102176 1.35755 -0.871965 -0.872871 688 689001 0.0010187 1.36406 -0.872846 -0.872871 689 690001 0.00101566 1.36389 -0.872854 -0.872871 690 691001 0.00101262 1.36461 -0.872808 -0.872871 691 692001 0.00100959 1.35533 -0.871099 -0.872871 692 693001 0.00100657 1.36532 -0.872731 -0.872871 693 694001 0.00100356 1.36156 -0.8728 -0.872871 694 695001 0.00100056 1.36411 -0.872844 -0.872871 695 696001 0.000997566 1.35819 -0.87216 -0.872871 696 697001 0.000994582 1.36309 -0.872871 -0.872871 697 698001 0.000991607 1.36442 -0.872823 -0.872871 698 699001 0.000988641 1.36261 -0.872863 -0.872871 699 700001 0.000985684 1.36147 -0.872791 -0.872871 700 701001 0.000982736 1.35507 -0.870978 -0.872871 701 702001 0.000979797 1.36101 -0.872741 -0.872871 702 703001 0.000976866 1.36711 -0.872413 -0.872871 703 704001 0.000973944 1.36502 -0.872767 -0.872871 704 705001 0.000971031 1.36334 -0.87287 -0.872871 705 706001 0.000968127 1.36524 -0.872742 -0.872871 706 707001 0.000965231 1.36328 -0.872871 -0.872871 707 708001 0.000962344 1.35354 -0.870189 -0.872871 708 709001 0.000959466 1.36114 -0.872757 -0.872871 709 710001 0.000956596 1.3637 -0.872862 -0.872871 710 711001 0.000953735 1.35535 -0.871109 -0.872871 711 712001 0.000950882 1.36995 -0.871525 -0.872871 712 713001 0.000948038 1.36615 -0.872606 -0.872871 713 714001 0.000945202 1.36559 -0.872696 -0.872871 714 715001 0.000942375 1.36517 -0.872751 -0.872871 715 716001 0.000939556 1.371 -0.87108 -0.872871 716 717001 0.000936746 1.3632 -0.872871 -0.872871 717 718001 0.000933944 1.35744 -0.871928 -0.872871 718 719001 0.000931151 1.36004 -0.872593 -0.872871 719 720001 0.000928366 1.36458 -0.87281 -0.872871 720 721001 0.000925589 1.36931 -0.871766 -0.872871 721 722001 0.000922821 1.36014 -0.872611 -0.872871 722 723001 0.00092006 1.35872 -0.872304 -0.872871 723 724001 0.000917308 1.36377 -0.872859 -0.872871 724 725001 0.000914565 1.35852 -0.872252 -0.872871 725 726001 0.000911829 1.36911 -0.871837 -0.872871 726 727001 0.000909102 1.36687 -0.872467 -0.872871 727 728001 0.000906383 1.35309 -0.869931 -0.872871 728 729001 0.000903672 1.37063 -0.871242 -0.872871 729 730001 0.000900969 1.36644 -0.872554 -0.872871 730 731001 0.000898274 1.36738 -0.872349 -0.872871 731 732001 0.000895587 1.36226 -0.872849 -0.872871 732 733001 0.000892909 1.36152 -0.872796 -0.872871 733 734001 0.000890238 1.36796 -0.872196 -0.872871 734 735001 0.000887575 1.36851 -0.872034 -0.872871 735 736001 0.00088492 1.36574 -0.872674 -0.872871 736 737001 0.000882274 1.35826 -0.872181 -0.872871 737 738001 0.000879635 1.35813 -0.872145 -0.872871 738 739001 0.000877004 1.36273 -0.872867 -0.872871 739 740001 0.000874381 1.36833 -0.872089 -0.872871 740 741001 0.000871765 1.35915 -0.87241 -0.872871 741 742001 0.000869158 1.35948 -0.872483 -0.872871 742 743001 0.000866558 1.35829 -0.872188 -0.872871 743 744001 0.000863966 1.36289 -0.87287 -0.872871 744 745001 0.000861382 1.36202 -0.872836 -0.872871 745 746001 0.000858806 1.36155 -0.872798 -0.872871 746 747001 0.000856237 1.37042 -0.871334 -0.872871 747 748001 0.000853676 1.36189 -0.872826 -0.872871 748 749001 0.000851123 1.36451 -0.872816 -0.872871 749 750001 0.000848577 1.36106 -0.872746 -0.872871 750 751001 0.000846039 1.36355 -0.872866 -0.872871 751 752001 0.000843508 1.36382 -0.872858 -0.872871 752 753001 0.000840985 1.36166 -0.872808 -0.872871 753 754001 0.00083847 1.36154 -0.872797 -0.872871 754 755001 0.000835962 1.35798 -0.872101 -0.872871 755 756001 0.000833462 1.36525 -0.872741 -0.872871 756 757001 0.000830969 1.36833 -0.872088 -0.872871 757 758001 0.000828483 1.36298 -0.872871 -0.872871 758 759001 0.000826005 1.36331 -0.87287 -0.872871 759 760001 0.000823535 1.36146 -0.87279 -0.872871 760 761001 0.000821071 1.3542 -0.870547 -0.872871 761 762001 0.000818615 1.36001 -0.872588 -0.872871 762 763001 0.000816167 1.35866 -0.872289 -0.872871 763 764001 0.000813726 1.35784 -0.872056 -0.872871 764 765001 0.000811292 1.35984 -0.872556 -0.872871 765 766001 0.000808865 1.36139 -0.872783 -0.872871 766 767001 0.000806446 1.3684 -0.872068 -0.872871 767 768001 0.000804034 1.36663 -0.872516 -0.872871 768 769001 0.000801629 1.36485 -0.872786 -0.872871 769 770001 0.000799231 1.36366 -0.872863 -0.872871 770 771001 0.000796841 1.36585 -0.872656 -0.872871 771 772001 0.000794457 1.36478 -0.872792 -0.872871 772 773001 0.000792081 1.36449 -0.872818 -0.872871 773 774001 0.000789712 1.3625 -0.87286 -0.872871 774 775001 0.00078735 1.35714 -0.871826 -0.872871 775 776001 0.000784995 1.35575 -0.871287 -0.872871 776 777001 0.000782647 1.36554 -0.872702 -0.872871 777 778001 0.000780306 1.36192 -0.872828 -0.872871 778 779001 0.000777972 1.36058 -0.872682 -0.872871 779 780001 0.000775645 1.36158 -0.872802 -0.872871 780 781001 0.000773325 1.35714 -0.871828 -0.872871 781 782001 0.000771012 1.35913 -0.872406 -0.872871 782 783001 0.000768706 1.37067 -0.871226 -0.872871 783 784001 0.000766407 1.36358 -0.872865 -0.872871 784 785001 0.000764115 1.37209 -0.87055 -0.872871 785 786001 0.000761829 1.36342 -0.872869 -0.872871 786 787001 0.00075955 1.36347 -0.872868 -0.872871 787 788001 0.000757279 1.36002 -0.87259 -0.872871 788 789001 0.000755014 1.36031 -0.87264 -0.872871 789 790001 0.000752755 1.3633 -0.87287 -0.872871 790 791001 0.000750504 1.35722 -0.871855 -0.872871 791 792001 0.000748259 1.36779 -0.872242 -0.872871 792 793001 0.000746021 1.36131 -0.872775 -0.872871 793 794001 0.00074379 1.35909 -0.872396 -0.872871 794 795001 0.000741565 1.36358 -0.872865 -0.872871 795 796001 0.000739347 1.36943 -0.871724 -0.872871 796 797001 0.000737135 1.35745 -0.871933 -0.872871 797 798001 0.000734931 1.36768 -0.872271 -0.872871 798 799001 0.000732732 1.35962 -0.872513 -0.872871 799 800001 0.000730541 1.36914 -0.871825 -0.872871 800 801001 0.000728356 1.36705 -0.872426 -0.872871 801 802001 0.000726177 1.36543 -0.872717 -0.872871 802 803001 0.000724005 1.3659 -0.872649 -0.872871 803 804001 0.00072184 1.35906 -0.87239 -0.872871 804 805001 0.000719681 1.36344 -0.872868 -0.872871 805 806001 0.000717528 1.36602 -0.872628 -0.872871 806 807001 0.000715382 1.36774 -0.872256 -0.872871 807 808001 0.000713242 1.3632 -0.872871 -0.872871 808 809001 0.000711109 1.36476 -0.872794 -0.872871 809 810001 0.000708982 1.36415 -0.872841 -0.872871 810 811001 0.000706861 1.36339 -0.872869 -0.872871 811 812001 0.000704747 1.36324 -0.872871 -0.872871 812 813001 0.000702639 1.36142 -0.872786 -0.872871 813 814001 0.000700538 1.35976 -0.872541 -0.872871 814 815001 0.000698442 1.36461 -0.872808 -0.872871 815 816001 0.000696353 1.3652 -0.872747 -0.872871 816 817001 0.00069427 1.35712 -0.871819 -0.872871 817 818001 0.000692194 1.36273 -0.872867 -0.872871 818 819001 0.000690123 1.36259 -0.872863 -0.872871 819 820001 0.000688059 1.36756 -0.872303 -0.872871 820 821001 0.000686001 1.36319 -0.872871 -0.872871 821 822001 0.000683949 1.36672 -0.872497 -0.872871 822 823001 0.000681904 1.36774 -0.872257 -0.872871 823 824001 0.000679864 1.36625 -0.872588 -0.872871 824 825001 0.000677831 1.35879 -0.872323 -0.872871 825 826001 0.000675803 1.35983 -0.872554 -0.872871 826 827001 0.000673782 1.36623 -0.872592 -0.872871 827 828001 0.000671767 1.36211 -0.872841 -0.872871 828 829001 0.000669757 1.36048 -0.872667 -0.872871 829 830001 0.000667754 1.36969 -0.871627 -0.872871 830 831001 0.000665757 1.36714 -0.872406 -0.872871 831 832001 0.000663765 1.35992 -0.872572 -0.872871 832 833001 0.00066178 1.36301 -0.872871 -0.872871 833 834001 0.000659801 1.36734 -0.872358 -0.872871 834 835001 0.000657827 1.36353 -0.872867 -0.872871 835 836001 0.00065586 1.36274 -0.872867 -0.872871 836 837001 0.000653898 1.36681 -0.872479 -0.872871 837 838001 0.000651942 1.36606 -0.872622 -0.872871 838 839001 0.000649992 1.36215 -0.872843 -0.872871 839 840001 0.000648048 1.36247 -0.872859 -0.872871 840 841001 0.00064611 1.36049 -0.872668 -0.872871 841 842001 0.000644177 1.36752 -0.872312 -0.872871 842 843001 0.00064225 1.35992 -0.872571 -0.872871 843 844001 0.000640329 1.36357 -0.872866 -0.872871 844 845001 0.000638414 1.36056 -0.872679 -0.872871 845 846001 0.000636505 1.35748 -0.871941 -0.872871 846 847001 0.000634601 1.36902 -0.871867 -0.872871 847 848001 0.000632703 1.36376 -0.87286 -0.872871 848 849001 0.00063081 1.37013 -0.871455 -0.872871 849 850001 0.000628924 1.36757 -0.872301 -0.872871 850 851001 0.000627042 1.36152 -0.872796 -0.872871 851 852001 0.000625167 1.36131 -0.872774 -0.872871 852 853001 0.000623297 1.3603 -0.872638 -0.872871 853 854001 0.000621433 1.35714 -0.871827 -0.872871 854 855001 0.000619574 1.36582 -0.872661 -0.872871 855 856001 0.000617721 1.36807 -0.872164 -0.872871 856 857001 0.000615873 1.36099 -0.872738 -0.872871 857 858001 0.000614031 1.3713 -0.870942 -0.872871 858 859001 0.000612195 1.36258 -0.872862 -0.872871 859 860001 0.000610363 1.35747 -0.87194 -0.872871 860 861001 0.000608538 1.36144 -0.872788 -0.872871 861 862001 0.000606718 1.35959 -0.872507 -0.872871 862 863001 0.000604903 1.35959 -0.872507 -0.872871 863 864001 0.000603094 1.3621 -0.87284 -0.872871 864 865001 0.00060129 1.36425 -0.872835 -0.872871 865 866001 0.000599491 1.35953 -0.872494 -0.872871 866 867001 0.000597698 1.35934 -0.872455 -0.872871 867 868001 0.000595911 1.36376 -0.87286 -0.872871 868 869001 0.000594128 1.36274 -0.872867 -0.872871 869 870001 0.000592351 1.36081 -0.872715 -0.872871 870 871001 0.000590579 1.36426 -0.872834 -0.872871 871 872001 0.000588813 1.3656 -0.872695 -0.872871 872 873001 0.000587052 1.36599 -0.872634 -0.872871 873 874001 0.000585296 1.37014 -0.871448 -0.872871 874 875001 0.000583545 1.36366 -0.872863 -0.872871 875 876001 0.0005818 1.36094 -0.872732 -0.872871 876 877001 0.00058006 1.36571 -0.872679 -0.872871 877 878001 0.000578325 1.36001 -0.872588 -0.872871 878 879001 0.000576595 1.36311 -0.872871 -0.872871 879 880001 0.00057487 1.35965 -0.872518 -0.872871 880 881001 0.000573151 1.36703 -0.87243 -0.872871 881 882001 0.000571437 1.36317 -0.872871 -0.872871 882 883001 0.000569727 1.36463 -0.872806 -0.872871 883 884001 0.000568023 1.36304 -0.872871 -0.872871 884 885001 0.000566324 1.36445 -0.87282 -0.872871 885 886001 0.00056463 1.3674 -0.872343 -0.872871 886 887001 0.000562942 1.36924 -0.87179 -0.872871 887 888001 0.000561258 1.36122 -0.872766 -0.872871 888 889001 0.000559579 1.36427 -0.872833 -0.872871 889 890001 0.000557905 1.36101 -0.872741 -0.872871 890 891001 0.000556237 1.35674 -0.871681 -0.872871 891 892001 0.000554573 1.36364 -0.872864 -0.872871 892 893001 0.000552914 1.3638 -0.872858 -0.872871 893 894001 0.00055126 1.36486 -0.872785 -0.872871 894 895001 0.000549612 1.36618 -0.872602 -0.872871 895 896001 0.000547968 1.36431 -0.872831 -0.872871 896 897001 0.000546329 1.36147 -0.872791 -0.872871 897 898001 0.000544695 1.36441 -0.872824 -0.872871 898 899001 0.000543065 1.37013 -0.871455 -0.872871 899 900001 0.000541441 1.35838 -0.872216 -0.872871 900 901001 0.000539822 1.36367 -0.872863 -0.872871 901 902001 0.000538207 1.36321 -0.872871 -0.872871 902 903001 0.000536597 1.36206 -0.872838 -0.872871 903 904001 0.000534992 1.36764 -0.872282 -0.872871 904 905001 0.000533392 1.35984 -0.872556 -0.872871 905 906001 0.000531797 1.36195 -0.87283 -0.872871 906 907001 0.000530206 1.3631 -0.872871 -0.872871 907 908001 0.00052862 1.3579 -0.872076 -0.872871 908 909001 0.000527039 1.36618 -0.872601 -0.872871 909 910001 0.000525463 1.35773 -0.872022 -0.872871 910 911001 0.000523891 1.3673 -0.872368 -0.872871 911 912001 0.000522324 1.3631 -0.872871 -0.872871 912 913001 0.000520762 1.36224 -0.872848 -0.872871 913 914001 0.000519204 1.36509 -0.87276 -0.872871 914 915001 0.000517651 1.36441 -0.872824 -0.872871 915 916001 0.000516103 1.36586 -0.872655 -0.872871 916 917001 0.000514559 1.36662 -0.872518 -0.872871 917 918001 0.00051302 1.36347 -0.872868 -0.872871 918 919001 0.000511486 1.36132 -0.872777 -0.872871 919 920001 0.000509956 1.36319 -0.872871 -0.872871 920 921001 0.000508431 1.36335 -0.87287 -0.872871 921 922001 0.00050691 1.3679 -0.872212 -0.872871 922 923001 0.000505394 1.3644 -0.872824 -0.872871 923 924001 0.000503882 1.36273 -0.872867 -0.872871 924 925001 0.000502375 1.36403 -0.872848 -0.872871 925 926001 0.000500872 1.36403 -0.872848 -0.872871 926 927001 0.000499374 1.36403 -0.872848 -0.872871 927 928001 0.00049788 1.36778 -0.872244 -0.872871 928 929001 0.000496391 1.36273 -0.872867 -0.872871 929 930001 0.000494907 1.36245 -0.872858 -0.872871 930 931001 0.000493426 1.36307 -0.872871 -0.872871 931 932001 0.00049195 1.35921 -0.872424 -0.872871 932 933001 0.000490479 1.36139 -0.872784 -0.872871 933 934001 0.000489012 1.36502 -0.872767 -0.872871 934 935001 0.000487549 1.36033 -0.872643 -0.872871 935 936001 0.000486091 1.36587 -0.872653 -0.872871 936 937001 0.000484637 1.36311 -0.872871 -0.872871 937 938001 0.000483188 1.36373 -0.872861 -0.872871 938 939001 0.000481742 1.36313 -0.872871 -0.872871 939 940001 0.000480301 1.36032 -0.872642 -0.872871 940 941001 0.000478865 1.36913 -0.87183 -0.872871 941 942001 0.000477433 1.36294 -0.87287 -0.872871 942 943001 0.000476005 1.36495 -0.872775 -0.872871 943 944001 0.000474581 1.36691 -0.872457 -0.872871 944 945001 0.000473161 1.36686 -0.872468 -0.872871 945 946001 0.000471746 1.36688 -0.872463 -0.872871 946 947001 0.000470335 1.36308 -0.872871 -0.872871 947 948001 0.000468928 1.36482 -0.872789 -0.872871 948 949001 0.000467526 1.36195 -0.872831 -0.872871 949 950001 0.000466127 1.36542 -0.872719 -0.872871 950 951001 0.000464733 1.36673 -0.872495 -0.872871 951 952001 0.000463343 1.36435 -0.872828 -0.872871 952 953001 0.000461957 1.36421 -0.872837 -0.872871 953 954001 0.000460575 1.36126 -0.87277 -0.872871 954 955001 0.000459198 1.3603 -0.872639 -0.872871 955 956001 0.000457824 1.36138 -0.872782 -0.872871 956 957001 0.000456455 1.36434 -0.872829 -0.872871 957 958001 0.00045509 1.36263 -0.872864 -0.872871 958 959001 0.000453729 1.3647 -0.8728 -0.872871 959 960001 0.000452371 1.35968 -0.872524 -0.872871 960 961001 0.000451018 1.35798 -0.872098 -0.872871 961 962001 0.000449669 1.36319 -0.872871 -0.872871 962 963001 0.000448324 1.36422 -0.872837 -0.872871 963 964001 0.000446983 1.36203 -0.872836 -0.872871 964 965001 0.000445647 1.36043 -0.872659 -0.872871 965 966001 0.000444314 1.36729 -0.872371 -0.872871 966 967001 0.000442985 1.37151 -0.870844 -0.872871 967 968001 0.00044166 1.36535 -0.872728 -0.872871 968 969001 0.000440339 1.36535 -0.872728 -0.872871 969 970001 0.000439022 1.363 -0.872871 -0.872871 970 971001 0.000437708 1.36594 -0.872642 -0.872871 971 972001 0.000436399 1.36311 -0.872871 -0.872871 972 973001 0.000435094 1.36419 -0.872839 -0.872871 973 974001 0.000433793 1.36258 -0.872862 -0.872871 974 975001 0.000432495 1.36318 -0.872871 -0.872871 975 976001 0.000431202 1.3573 -0.871881 -0.872871 976 977001 0.000429912 1.36288 -0.872869 -0.872871 977 978001 0.000428626 1.36275 -0.872867 -0.872871 978 979001 0.000427344 1.36272 -0.872866 -0.872871 979 980001 0.000426066 1.36116 -0.872759 -0.872871 980 981001 0.000424791 1.36125 -0.872768 -0.872871 981 982001 0.000423521 1.36465 -0.872804 -0.872871 982 983001 0.000422254 1.36249 -0.872859 -0.872871 983 984001 0.000420991 1.36692 -0.872455 -0.872871 984 985001 0.000419732 1.36214 -0.872843 -0.872871 985 986001 0.000418476 1.36129 -0.872772 -0.872871 986 987001 0.000417225 1.36434 -0.872828 -0.872871 987 988001 0.000415977 1.36606 -0.872622 -0.872871 988 989001 0.000414733 1.36031 -0.87264 -0.872871 989 990001 0.000413492 1.36632 -0.872576 -0.872871 990 991001 0.000412255 1.36248 -0.872859 -0.872871 991 992001 0.000411022 1.36208 -0.872839 -0.872871 992 993001 0.000409793 1.36041 -0.872656 -0.872871 993 994001 0.000408567 1.36633 -0.872574 -0.872871 994 995001 0.000407345 1.36787 -0.87222 -0.872871 995 996001 0.000406127 1.36254 -0.872861 -0.872871 996 997001 0.000404912 1.36359 -0.872865 -0.872871 997 998001 0.000403701 1.36359 -0.872865 -0.872871 998 999001 0.000402493 1.36816 -0.872137 -0.872871 999 1000001 0.00040129 1.3633 -0.87287 -0.872871 1000 1001001 0.000400089 1.36013 -0.872609 -0.872871 1001 1002001 0.000398893 1.35879 -0.872324 -0.872871 1002 1003001 0.0003977 1.35898 -0.872371 -0.872871 1003 1004001 0.00039651 1.36044 -0.872661 -0.872871 1004 1005001 0.000395324 1.36323 -0.872871 -0.872871 1005 1006001 0.000394142 1.36405 -0.872846 -0.872871 1006 1007001 0.000392963 1.36426 -0.872834 -0.872871 1007 1008001 0.000391787 1.36273 -0.872867 -0.872871 1008 1009001 0.000390616 1.36387 -0.872855 -0.872871 1009 1010001 0.000389447 1.36545 -0.872716 -0.872871 1010 1011001 0.000388282 1.36385 -0.872856 -0.872871 1011 1012001 0.000387121 1.36801 -0.872182 -0.872871 1012 1013001 0.000385963 1.36536 -0.872727 -0.872871 1013 1014001 0.000384809 1.36579 -0.872667 -0.872871 1014 1015001 0.000383658 1.3632 -0.872871 -0.872871 1015 1016001 0.00038251 1.36117 -0.87276 -0.872871 1016 1017001 0.000381366 1.36095 -0.872733 -0.872871 1017 1018001 0.000380225 1.3664 -0.872562 -0.872871 1018 1019001 0.000379088 1.36417 -0.87284 -0.872871 1019 1020001 0.000377954 1.36178 -0.872819 -0.872871 1020 1021001 0.000376824 1.36634 -0.872572 -0.872871 1021 1022001 0.000375697 1.36589 -0.87265 -0.872871 1022 1023001 0.000374573 1.36425 -0.872835 -0.872871 1023 1024001 0.000373453 1.36156 -0.8728 -0.872871 1024 1025001 0.000372336 1.36708 -0.87242 -0.872871 1025 1026001 0.000371222 1.3598 -0.872548 -0.872871 1026 1027001 0.000370112 1.36262 -0.872864 -0.872871 1027 1028001 0.000369005 1.36378 -0.872859 -0.872871 1028 1029001 0.000367901 1.36519 -0.872748 -0.872871 1029 1030001 0.0003668 1.36515 -0.872753 -0.872871 1030 1031001 0.000365703 1.3601 -0.872605 -0.872871 1031 1032001 0.00036461 1.36379 -0.872859 -0.872871 1032 1033001 0.000363519 1.36076 -0.872707 -0.872871 1033 1034001 0.000362432 1.36056 -0.872679 -0.872871 1034 1035001 0.000361348 1.36597 -0.872637 -0.872871 1035 1036001 0.000360267 1.3597 -0.87253 -0.872871 1036 1037001 0.000359189 1.36519 -0.872748 -0.872871 1037 1038001 0.000358115 1.36388 -0.872855 -0.872871 1038 1039001 0.000357044 1.3585 -0.872247 -0.872871 1039 1040001 0.000355976 1.35857 -0.872266 -0.872871 1040 1041001 0.000354911 1.36244 -0.872857 -0.872871 1041 1042001 0.00035385 1.36827 -0.872106 -0.872871 1042 1043001 0.000352791 1.36311 -0.872871 -0.872871 1043 1044001 0.000351736 1.3575 -0.871947 -0.872871 1044 1045001 0.000350684 1.36111 -0.872753 -0.872871 1045 1046001 0.000349635 1.35875 -0.872312 -0.872871 1046 1047001 0.000348589 1.36477 -0.872793 -0.872871 1047 1048001 0.000347547 1.36178 -0.872819 -0.872871 1048 1049001 0.000346507 1.36469 -0.872801 -0.872871 1049 1050001 0.000345471 1.36429 -0.872832 -0.872871 1050 1051001 0.000344437 1.36506 -0.872764 -0.872871 1051 1052001 0.000343407 1.36387 -0.872855 -0.872871 1052 1053001 0.00034238 1.36509 -0.87276 -0.872871 1053 1054001 0.000341356 1.36212 -0.872842 -0.872871 1054 1055001 0.000340335 1.3641 -0.872844 -0.872871 1055 1056001 0.000339317 1.36357 -0.872865 -0.872871 1056 1057001 0.000338302 1.36211 -0.872841 -0.872871 1057 1058001 0.00033729 1.36118 -0.87276 -0.872871 1058 1059001 0.000336281 1.36303 -0.872871 -0.872871 1059 1060001 0.000335276 1.36268 -0.872865 -0.872871 1060 1061001 0.000334273 1.36276 -0.872867 -0.872871 1061 1062001 0.000333273 1.36395 -0.872852 -0.872871 1062 1063001 0.000332276 1.36104 -0.872744 -0.872871 1063 1064001 0.000331282 1.36124 -0.872768 -0.872871 1064 1065001 0.000330291 1.36263 -0.872864 -0.872871 1065 1066001 0.000329303 1.36263 -0.872864 -0.872871 1066 1067001 0.000328319 1.36364 -0.872864 -0.872871 1067 1068001 0.000327337 1.36353 -0.872867 -0.872871 1068 1069001 0.000326357 1.36353 -0.872867 -0.872871 1069 1070001 0.000325381 1.36344 -0.872868 -0.872871 1070 1071001 0.000324408 1.36344 -0.872868 -0.872871 1071 1072001 0.000323438 1.36076 -0.872708 -0.872871 1072 1073001 0.00032247 1.36184 -0.872823 -0.872871 1073 1074001 0.000321506 1.36232 -0.872852 -0.872871 1074 1075001 0.000320544 1.35925 -0.872434 -0.872871 1075 1076001 0.000319585 1.3654 -0.872721 -0.872871 1076 1077001 0.00031863 1.36145 -0.872789 -0.872871 1077 1078001 0.000317677 1.36502 -0.872767 -0.872871 1078 1079001 0.000316726 1.3666 -0.872523 -0.872871 1079 1080001 0.000315779 1.36509 -0.872759 -0.872871 1080 1081001 0.000314835 1.36518 -0.87275 -0.872871 1081 1082001 0.000313893 1.35987 -0.872561 -0.872871 1082 1083001 0.000312954 1.36265 -0.872865 -0.872871 1083 1084001 0.000312018 1.36598 -0.872636 -0.872871 1084 1085001 0.000311085 1.36197 -0.872832 -0.872871 1085 1086001 0.000310154 1.36223 -0.872848 -0.872871 1086 1087001 0.000309227 1.36379 -0.872858 -0.872871 1087 1088001 0.000308302 1.36122 -0.872765 -0.872871 1088 1089001 0.000307379 1.36289 -0.87287 -0.872871 1089 1090001 0.00030646 1.36249 -0.872859 -0.872871 1090 1091001 0.000305543 1.3649 -0.87278 -0.872871 1091 1092001 0.00030463 1.36049 -0.872668 -0.872871 1092 1093001 0.000303718 1.36541 -0.872721 -0.872871 1093 1094001 0.00030281 1.35666 -0.871652 -0.872871 1094 1095001 0.000301904 1.36574 -0.872674 -0.872871 1095 1096001 0.000301001 1.3633 -0.87287 -0.872871 1096 1097001 0.000300101 1.3633 -0.87287 -0.872871 1097 1098001 0.000299203 1.3657 -0.87268 -0.872871 1098 1099001 0.000298308 1.36507 -0.872762 -0.872871 1099 1100001 0.000297416 1.36082 -0.872716 -0.872871 1100 1101001 0.000296527 1.36307 -0.872871 -0.872871 1101 1102001 0.00029564 1.36425 -0.872835 -0.872871 1102 1103001 0.000294755 1.36425 -0.872835 -0.872871 1103 1104001 0.000293874 1.36421 -0.872838 -0.872871 1104 1105001 0.000292995 1.36228 -0.87285 -0.872871 1105 1106001 0.000292118 1.36313 -0.872871 -0.872871 1106 1107001 0.000291245 1.36313 -0.872871 -0.872871 1107 1108001 0.000290374 1.36321 -0.872871 -0.872871 1108 1109001 0.000289505 1.36226 -0.872849 -0.872871 1109 1110001 0.000288639 1.36669 -0.872505 -0.872871 1110 1111001 0.000287776 1.36429 -0.872832 -0.872871 1111 1112001 0.000286915 1.36429 -0.872832 -0.872871 1112 1113001 0.000286057 1.36187 -0.872825 -0.872871 1113 1114001 0.000285201 1.36514 -0.872754 -0.872871 1114 1115001 0.000284348 1.36682 -0.872476 -0.872871 1115 1116001 0.000283498 1.3648 -0.872791 -0.872871 1116 1117001 0.00028265 1.36239 -0.872855 -0.872871 1117 1118001 0.000281804 1.36613 -0.87261 -0.872871 1118 1119001 0.000280962 1.36275 -0.872867 -0.872871 1119 1120001 0.000280121 1.35968 -0.872526 -0.872871 1120 1121001 0.000279283 1.36144 -0.872789 -0.872871 1121 1122001 0.000278448 1.36665 -0.872511 -0.872871 1122 1123001 0.000277615 1.362 -0.872834 -0.872871 1123 1124001 0.000276785 1.36083 -0.872717 -0.872871 1124 1125001 0.000275957 1.36152 -0.872796 -0.872871 1125 1126001 0.000275132 1.36342 -0.872869 -0.872871 1126 1127001 0.000274309 1.36342 -0.872869 -0.872871 1127 1128001 0.000273488 1.36302 -0.872871 -0.872871 1128 1129001 0.00027267 1.36542 -0.872719 -0.872871 1129 1130001 0.000271855 1.36216 -0.872844 -0.872871 1130 1131001 0.000271041 1.36054 -0.872677 -0.872871 1131 1132001 0.000270231 1.36195 -0.87283 -0.872871 1132 1133001 0.000269422 1.36134 -0.872778 -0.872871 1133 1134001 0.000268617 1.36384 -0.872857 -0.872871 1134 1135001 0.000267813 1.36486 -0.872785 -0.872871 1135 1136001 0.000267012 1.36064 -0.872691 -0.872871 1136 1137001 0.000266214 1.36517 -0.87275 -0.872871 1137 1138001 0.000265417 1.36247 -0.872858 -0.872871 1138 1139001 0.000264623 1.36396 -0.872851 -0.872871 1139 1140001 0.000263832 1.36327 -0.872871 -0.872871 1140 1141001 0.000263043 1.36402 -0.872848 -0.872871 1141 1142001 0.000262256 1.36091 -0.872729 -0.872871 1142 1143001 0.000261472 1.36273 -0.872867 -0.872871 1143 1144001 0.00026069 1.36598 -0.872636 -0.872871 1144 1145001 0.00025991 1.36567 -0.872683 -0.872871 1145 1146001 0.000259132 1.36193 -0.872829 -0.872871 1146 1147001 0.000258357 1.36305 -0.872871 -0.872871 1147 1148001 0.000257585 1.36212 -0.872842 -0.872871 1148 1149001 0.000256814 1.36845 -0.872051 -0.872871 1149 1150001 0.000256046 1.363 -0.872871 -0.872871 1150 1151001 0.00025528 1.36597 -0.872638 -0.872871 1151 1152001 0.000254517 1.36242 -0.872857 -0.872871 1152 1153001 0.000253755 1.36525 -0.872741 -0.872871 1153 1154001 0.000252996 1.36314 -0.872871 -0.872871 1154 1155001 0.00025224 1.36199 -0.872834 -0.872871 1155 1156001 0.000251485 1.36559 -0.872696 -0.872871 1156 1157001 0.000250733 1.35875 -0.872312 -0.872871 1157 1158001 0.000249983 1.3637 -0.872862 -0.872871 1158 1159001 0.000249235 1.36209 -0.87284 -0.872871 1159 1160001 0.00024849 1.36342 -0.872869 -0.872871 1160 1161001 0.000247747 1.36327 -0.872871 -0.872871 1161 1162001 0.000247006 1.36327 -0.872871 -0.872871 1162 1163001 0.000246267 1.36413 -0.872842 -0.872871 1163 1164001 0.00024553 1.36413 -0.872842 -0.872871 1164 1165001 0.000244796 1.36066 -0.872693 -0.872871 1165 1166001 0.000244064 1.36152 -0.872796 -0.872871 1166 1167001 0.000243334 1.36421 -0.872838 -0.872871 1167 1168001 0.000242606 1.36114 -0.872756 -0.872871 1168 1169001 0.00024188 1.36162 -0.872805 -0.872871 1169 1170001 0.000241157 1.3643 -0.872832 -0.872871 1170 1171001 0.000240435 1.36674 -0.872493 -0.872871 1171 1172001 0.000239716 1.36533 -0.872731 -0.872871 1172 1173001 0.000238999 1.36003 -0.872591 -0.872871 1173 1174001 0.000238284 1.364 -0.872849 -0.872871 1174 1175001 0.000237572 1.36194 -0.87283 -0.872871 1175 1176001 0.000236861 1.36088 -0.872724 -0.872871 1176 1177001 0.000236153 1.36086 -0.872721 -0.872871 1177 1178001 0.000235446 1.36304 -0.872871 -0.872871 1178 1179001 0.000234742 1.36291 -0.87287 -0.872871 1179 1180001 0.00023404 1.36018 -0.872617 -0.872871 1180 1181001 0.00023334 1.36241 -0.872856 -0.872871 1181 1182001 0.000232642 1.36353 -0.872867 -0.872871 1182 1183001 0.000231946 1.36371 -0.872862 -0.872871 1183 1184001 0.000231252 1.36204 -0.872837 -0.872871 1184 1185001 0.000230561 1.36075 -0.872706 -0.872871 1185 1186001 0.000229871 1.36376 -0.87286 -0.872871 1186 1187001 0.000229184 1.36404 -0.872847 -0.872871 1187 1188001 0.000228498 1.36574 -0.872673 -0.872871 1188 1189001 0.000227815 1.36355 -0.872866 -0.872871 1189 1190001 0.000227133 1.36263 -0.872864 -0.872871 1190 1191001 0.000226454 1.36204 -0.872837 -0.872871 1191 1192001 0.000225777 1.36124 -0.872767 -0.872871 1192 1193001 0.000225101 1.36353 -0.872867 -0.872871 1193 1194001 0.000224428 1.36287 -0.872869 -0.872871 1194 1195001 0.000223757 1.36312 -0.872871 -0.872871 1195 1196001 0.000223087 1.36312 -0.872871 -0.872871 1196 1197001 0.00022242 1.36327 -0.872871 -0.872871 1197 1198001 0.000221755 1.35818 -0.872157 -0.872871 1198 1199001 0.000221092 1.36099 -0.872738 -0.872871 1199 1200001 0.00022043 1.36115 -0.872757 -0.872871 1200 1201001 0.000219771 1.36272 -0.872866 -0.872871 1201 1202001 0.000219114 1.36362 -0.872864 -0.872871 1202 1203001 0.000218458 1.36236 -0.872854 -0.872871 1203 1204001 0.000217805 1.36236 -0.872854 -0.872871 1204 1205001 0.000217153 1.36277 -0.872868 -0.872871 1205 1206001 0.000216504 1.36343 -0.872869 -0.872871 1206 1207001 0.000215856 1.36177 -0.872817 -0.872871 1207 1208001 0.000215211 1.36386 -0.872856 -0.872871 1208 1209001 0.000214567 1.35774 -0.872027 -0.872871 1209 1210001 0.000213925 1.36105 -0.872746 -0.872871 1210 1211001 0.000213285 1.36053 -0.872674 -0.872871 1211 1212001 0.000212647 1.36532 -0.872732 -0.872871 1212 1213001 0.000212011 1.36071 -0.872701 -0.872871 1213 1214001 0.000211377 1.36262 -0.872864 -0.872871 1214 1215001 0.000210745 1.36305 -0.872871 -0.872871 1215 1216001 0.000210115 1.36039 -0.872653 -0.872871 1216 1217001 0.000209486 1.3639 -0.872854 -0.872871 1217 1218001 0.00020886 1.36313 -0.872871 -0.872871 1218 1219001 0.000208235 1.365 -0.872769 -0.872871 1219 1220001 0.000207612 1.36007 -0.872599 -0.872871 1220 1221001 0.000206991 1.36285 -0.872869 -0.872871 1221 1222001 0.000206372 1.35941 -0.87247 -0.872871 1222 1223001 0.000205755 1.36246 -0.872858 -0.872871 1223 1224001 0.000205139 1.36378 -0.872859 -0.872871 1224 1225001 0.000204526 1.36333 -0.87287 -0.872871 1225 1226001 0.000203914 1.36148 -0.872792 -0.872871 1226 1227001 0.000203304 1.36399 -0.87285 -0.872871 1227 1228001 0.000202696 1.36454 -0.872813 -0.872871 1228 1229001 0.00020209 1.36454 -0.872813 -0.872871 1229 1230001 0.000201485 1.36379 -0.872859 -0.872871 1230 1231001 0.000200883 1.36541 -0.87272 -0.872871 1231 1232001 0.000200282 1.36195 -0.872831 -0.872871 1232 1233001 0.000199683 1.36454 -0.872814 -0.872871 1233 1234001 0.000199085 1.36088 -0.872724 -0.872871 1234 1235001 0.00019849 1.36711 -0.872413 -0.872871 1235 1236001 0.000197896 1.36318 -0.872871 -0.872871 1236 1237001 0.000197304 1.36106 -0.872747 -0.872871 1237 1238001 0.000196714 1.36243 -0.872857 -0.872871 1238 1239001 0.000196126 1.36449 -0.872817 -0.872871 1239 1240001 0.000195539 1.36371 -0.872862 -0.872871 1240 1241001 0.000194954 1.36435 -0.872828 -0.872871 1241 1242001 0.000194371 1.36108 -0.872749 -0.872871 1242 1243001 0.00019379 1.3638 -0.872858 -0.872871 1243 1244001 0.00019321 1.3638 -0.872858 -0.872871 1244 1245001 0.000192632 1.36265 -0.872865 -0.872871 1245 1246001 0.000192056 1.36265 -0.872865 -0.872871 1246 1247001 0.000191482 1.36129 -0.872773 -0.872871 1247 1248001 0.000190909 1.36326 -0.872871 -0.872871 1248 1249001 0.000190338 1.36251 -0.87286 -0.872871 1249 1250001 0.000189769 1.36188 -0.872826 -0.872871 1250 1251001 0.000189201 1.36573 -0.872675 -0.872871 1251 1252001 0.000188635 1.36535 -0.872728 -0.872871 1252 1253001 0.000188071 1.36517 -0.872751 -0.872871 1253 1254001 0.000187508 1.35986 -0.872561 -0.872871 1254 1255001 0.000186948 1.36587 -0.872654 -0.872871 1255 1256001 0.000186388 1.36403 -0.872848 -0.872871 1256 1257001 0.000185831 1.36395 -0.872852 -0.872871 1257 1258001 0.000185275 1.36394 -0.872852 -0.872871 1258 1259001 0.000184721 1.36436 -0.872827 -0.872871 1259 1260001 0.000184168 1.36185 -0.872824 -0.872871 1260 1261001 0.000183618 1.36533 -0.872731 -0.872871 1261 1262001 0.000183068 1.3601 -0.872605 -0.872871 1262 1263001 0.000182521 1.36157 -0.8728 -0.872871 1263 1264001 0.000181975 1.36622 -0.872594 -0.872871 1264 1265001 0.000181431 1.36129 -0.872773 -0.872871 1265 1266001 0.000180888 1.36437 -0.872826 -0.872871 1266 1267001 0.000180347 1.36559 -0.872695 -0.872871 1267 1268001 0.000179808 1.36277 -0.872868 -0.872871 1268 1269001 0.00017927 1.3639 -0.872854 -0.872871 1269 1270001 0.000178734 1.36488 -0.872782 -0.872871 1270 1271001 0.000178199 1.36525 -0.872741 -0.872871 1271 1272001 0.000177666 1.36439 -0.872825 -0.872871 1272 1273001 0.000177135 1.36046 -0.872663 -0.872871 1273 1274001 0.000176605 1.36604 -0.872626 -0.872871 1274 1275001 0.000176076 1.36069 -0.872699 -0.872871 1275 1276001 0.00017555 1.36593 -0.872645 -0.872871 1276 1277001 0.000175025 1.36241 -0.872856 -0.872871 1277 1278001 0.000174501 1.36433 -0.87283 -0.872871 1278 1279001 0.000173979 1.36277 -0.872867 -0.872871 1279 1280001 0.000173459 1.36141 -0.872786 -0.872871 1280 1281001 0.00017294 1.36141 -0.872786 -0.872871 1281 1282001 0.000172423 1.36196 -0.872832 -0.872871 1282 1283001 0.000171907 1.36385 -0.872856 -0.872871 1283 1284001 0.000171393 1.36543 -0.872718 -0.872871 1284 1285001 0.00017088 1.36273 -0.872867 -0.872871 1285 1286001 0.000170369 1.36432 -0.87283 -0.872871 1286 1287001 0.00016986 1.36313 -0.872871 -0.872871 1287 1288001 0.000169352 1.36313 -0.872871 -0.872871 1288 1289001 0.000168845 1.36381 -0.872858 -0.872871 1289 1290001 0.00016834 1.36428 -0.872833 -0.872871 1290 1291001 0.000167836 1.36108 -0.872749 -0.872871 1291 1292001 0.000167334 1.36157 -0.872801 -0.872871 1292 1293001 0.000166834 1.36326 -0.872871 -0.872871 1293 1294001 0.000166335 1.36184 -0.872823 -0.872871 1294 1295001 0.000165837 1.36134 -0.872778 -0.872871 1295 1296001 0.000165341 1.3613 -0.872773 -0.872871 1296 1297001 0.000164847 1.36622 -0.872594 -0.872871 1297 1298001 0.000164354 1.36601 -0.872631 -0.872871 1298 1299001 0.000163862 1.36472 -0.872798 -0.872871 1299 1300001 0.000163372 1.36451 -0.872816 -0.872871 1300 1301001 0.000162883 1.36274 -0.872867 -0.872871 1301 1302001 0.000162396 1.36295 -0.87287 -0.872871 1302 1303001 0.000161911 1.36295 -0.87287 -0.872871 1303 1304001 0.000161426 1.36295 -0.87287 -0.872871 1304 1305001 0.000160943 1.36334 -0.87287 -0.872871 1305 1306001 0.000160462 1.36047 -0.872665 -0.872871 1306 1307001 0.000159982 1.36395 -0.872852 -0.872871 1307 1308001 0.000159504 1.36443 -0.872822 -0.872871 1308 1309001 0.000159027 1.36019 -0.87262 -0.872871 1309 1310001 0.000158551 1.36581 -0.872662 -0.872871 1310 1311001 0.000158077 1.36156 -0.8728 -0.872871 1311 1312001 0.000157604 1.36375 -0.87286 -0.872871 1312 1313001 0.000157132 1.36249 -0.872859 -0.872871 1313 1314001 0.000156662 1.36183 -0.872822 -0.872871 1314 1315001 0.000156194 1.36183 -0.872822 -0.872871 1315 1316001 0.000155727 1.36316 -0.872871 -0.872871 1316 1317001 0.000155261 1.36551 -0.872707 -0.872871 1317 1318001 0.000154797 1.36077 -0.872709 -0.872871 1318 1319001 0.000154334 1.36087 -0.872722 -0.872871 1319 1320001 0.000153872 1.3611 -0.872751 -0.872871 1320 1321001 0.000153412 1.36292 -0.87287 -0.872871 1321 1322001 0.000152953 1.36482 -0.872788 -0.872871 1322 1323001 0.000152495 1.36422 -0.872837 -0.872871 1323 1324001 0.000152039 1.36306 -0.872871 -0.872871 1324 1325001 0.000151584 1.36082 -0.872716 -0.872871 1325 1326001 0.000151131 1.36112 -0.872754 -0.872871 1326 1327001 0.000150679 1.3655 -0.872708 -0.872871 1327 1328001 0.000150228 1.36332 -0.87287 -0.872871 1328 1329001 0.000149779 1.36193 -0.872829 -0.872871 1329 1330001 0.000149331 1.36357 -0.872866 -0.872871 1330 1331001 0.000148884 1.36316 -0.872871 -0.872871 1331 1332001 0.000148439 1.36316 -0.872871 -0.872871 1332 1333001 0.000147995 1.36585 -0.872657 -0.872871 1333 1334001 0.000147552 1.36395 -0.872852 -0.872871 1334 1335001 0.000147111 1.3645 -0.872817 -0.872871 1335 1336001 0.000146671 1.3643 -0.872832 -0.872871 1336 1337001 0.000146232 1.3643 -0.872832 -0.872871 1337 1338001 0.000145795 1.36099 -0.872738 -0.872871 1338 1339001 0.000145359 1.36385 -0.872856 -0.872871 1339 1340001 0.000144924 1.36648 -0.872545 -0.872871 1340 1341001 0.000144491 1.3633 -0.87287 -0.872871 1341 1342001 0.000144058 1.36315 -0.872871 -0.872871 1342 1343001 0.000143628 1.36289 -0.87287 -0.872871 1343 1344001 0.000143198 1.36289 -0.87287 -0.872871 1344 1345001 0.00014277 1.36306 -0.872871 -0.872871 1345 1346001 0.000142343 1.36054 -0.872676 -0.872871 1346 1347001 0.000141917 1.36207 -0.872838 -0.872871 1347 1348001 0.000141492 1.36325 -0.872871 -0.872871 1348 1349001 0.000141069 1.36319 -0.872871 -0.872871 1349 1350001 0.000140647 1.36417 -0.87284 -0.872871 1350 1351001 0.000140227 1.36038 -0.872652 -0.872871 1351 1352001 0.000139807 1.36471 -0.872799 -0.872871 1352 1353001 0.000139389 1.36525 -0.872741 -0.872871 1353 1354001 0.000138972 1.36271 -0.872866 -0.872871 1354 1355001 0.000138556 1.36357 -0.872865 -0.872871 1355 1356001 0.000138142 1.36357 -0.872865 -0.872871 1356 1357001 0.000137729 1.36207 -0.872839 -0.872871 1357 1358001 0.000137317 1.36483 -0.872787 -0.872871 1358 1359001 0.000136906 1.36332 -0.87287 -0.872871 1359 1360001 0.000136497 1.3629 -0.87287 -0.872871 1360 1361001 0.000136088 1.36303 -0.872871 -0.872871 1361 1362001 0.000135681 1.36463 -0.872806 -0.872871 1362 1363001 0.000135276 1.36443 -0.872822 -0.872871 1363 1364001 0.000134871 1.36249 -0.872859 -0.872871 1364 1365001 0.000134468 1.36518 -0.872749 -0.872871 1365 1366001 0.000134065 1.36495 -0.872775 -0.872871 1366 1367001 0.000133664 1.36495 -0.872775 -0.872871 1367 1368001 0.000133265 1.36077 -0.872709 -0.872871 1368 1369001 0.000132866 1.36077 -0.872709 -0.872871 1369 1370001 0.000132469 1.35985 -0.872558 -0.872871 1370 1371001 0.000132072 1.36582 -0.872662 -0.872871 1371 1372001 0.000131677 1.36433 -0.87283 -0.872871 1372 1373001 0.000131283 1.36097 -0.872736 -0.872871 1373 1374001 0.000130891 1.36239 -0.872855 -0.872871 1374 1375001 0.000130499 1.36405 -0.872847 -0.872871 1375 1376001 0.000130109 1.36405 -0.872847 -0.872871 1376 1377001 0.00012972 1.36392 -0.872853 -0.872871 1377 1378001 0.000129332 1.36751 -0.872314 -0.872871 1378 1379001 0.000128945 1.3611 -0.872751 -0.872871 1379 1380001 0.000128559 1.36289 -0.87287 -0.872871 1380 1381001 0.000128175 1.36344 -0.872868 -0.872871 1381 1382001 0.000127791 1.36387 -0.872855 -0.872871 1382 1383001 0.000127409 1.36198 -0.872833 -0.872871 1383 1384001 0.000127028 1.36384 -0.872857 -0.872871 1384 1385001 0.000126648 1.36381 -0.872858 -0.872871 1385 1386001 0.000126269 1.36215 -0.872843 -0.872871 1386 1387001 0.000125892 1.36341 -0.872869 -0.872871 1387 1388001 0.000125515 1.36191 -0.872828 -0.872871 1388 1389001 0.00012514 1.36308 -0.872871 -0.872871 1389 1390001 0.000124765 1.36397 -0.872851 -0.872871 1390 1391001 0.000124392 1.3629 -0.87287 -0.872871 1391 1392001 0.00012402 1.36201 -0.872835 -0.872871 1392 1393001 0.000123649 1.36683 -0.872475 -0.872871 1393 1394001 0.000123279 1.36143 -0.872787 -0.872871 1394 1395001 0.000122911 1.36307 -0.872871 -0.872871 1395 1396001 0.000122543 1.36316 -0.872871 -0.872871 1396 1397001 0.000122176 1.36449 -0.872818 -0.872871 1397 1398001 0.000121811 1.36427 -0.872834 -0.872871 1398 1399001 0.000121447 1.36353 -0.872867 -0.872871 1399 1400001 0.000121083 1.36355 -0.872866 -0.872871 1400 1401001 0.000120721 1.36205 -0.872837 -0.872871 1401 1402001 0.00012036 1.36638 -0.872565 -0.872871 1402 1403001 0.00012 1.36348 -0.872868 -0.872871 1403 1404001 0.000119641 1.36397 -0.872851 -0.872871 1404 1405001 0.000119283 1.36674 -0.872494 -0.872871 1405 1406001 0.000118927 1.36498 -0.872772 -0.872871 1406 1407001 0.000118571 1.36344 -0.872868 -0.872871 1407 1408001 0.000118216 1.36435 -0.872828 -0.872871 1408 1409001 0.000117863 1.36231 -0.872852 -0.872871 1409 1410001 0.00011751 1.36336 -0.87287 -0.872871 1410 1411001 0.000117159 1.36315 -0.872871 -0.872871 1411 1412001 0.000116808 1.36342 -0.872869 -0.872871 1412 1413001 0.000116459 1.36342 -0.872869 -0.872871 1413 1414001 0.000116111 1.3616 -0.872803 -0.872871 1414 1415001 0.000115763 1.35987 -0.872562 -0.872871 1415 1416001 0.000115417 1.36143 -0.872787 -0.872871 1416 1417001 0.000115072 1.36143 -0.872787 -0.872871 1417 1418001 0.000114728 1.36502 -0.872768 -0.872871 1418 1419001 0.000114384 1.36475 -0.872795 -0.872871 1419 1420001 0.000114042 1.36312 -0.872871 -0.872871 1420 1421001 0.000113701 1.36321 -0.872871 -0.872871 1421 1422001 0.000113361 1.36107 -0.872747 -0.872871 1422 1423001 0.000113022 1.36489 -0.872781 -0.872871 1423 1424001 0.000112684 1.36157 -0.872801 -0.872871 1424 1425001 0.000112347 1.36157 -0.872801 -0.872871 1425 1426001 0.000112011 1.36157 -0.872801 -0.872871 1426 1427001 0.000111676 1.36337 -0.87287 -0.872871 1427 1428001 0.000111342 1.36337 -0.87287 -0.872871 1428 1429001 0.000111009 1.36347 -0.872868 -0.872871 1429 1430001 0.000110677 1.36187 -0.872825 -0.872871 1430 1431001 0.000110346 1.36187 -0.872825 -0.872871 1431 1432001 0.000110016 1.36232 -0.872852 -0.872871 1432 1433001 0.000109687 1.36352 -0.872867 -0.872871 1433 1434001 0.000109359 1.3654 -0.872721 -0.872871 1434 1435001 0.000109032 1.36327 -0.872871 -0.872871 1435 1436001 0.000108705 1.36223 -0.872848 -0.872871 1436 1437001 0.00010838 1.36236 -0.872854 -0.872871 1437 1438001 0.000108056 1.36517 -0.872751 -0.872871 1438 1439001 0.000107733 1.36446 -0.87282 -0.872871 1439 1440001 0.000107411 1.36303 -0.872871 -0.872871 1440 1441001 0.000107089 1.36189 -0.872826 -0.872871 1441 1442001 0.000106769 1.36197 -0.872832 -0.872871 1442 1443001 0.00010645 1.36237 -0.872854 -0.872871 1443 1444001 0.000106131 1.36377 -0.872859 -0.872871 1444 1445001 0.000105814 1.36511 -0.872758 -0.872871 1445 1446001 0.000105497 1.36363 -0.872864 -0.872871 1446 1447001 0.000105182 1.36221 -0.872846 -0.872871 1447 1448001 0.000104867 1.36383 -0.872857 -0.872871 1448 1449001 0.000104554 1.36199 -0.872833 -0.872871 1449 1450001 0.000104241 1.36227 -0.87285 -0.872871 1450 1451001 0.000103929 1.36427 -0.872833 -0.872871 1451 1452001 0.000103618 1.36425 -0.872835 -0.872871 1452 1453001 0.000103308 1.3646 -0.872808 -0.872871 1453 1454001 0.000102999 1.35945 -0.872478 -0.872871 1454 1455001 0.000102691 1.36169 -0.872811 -0.872871 1455 1456001 0.000102384 1.36339 -0.872869 -0.872871 1456 1457001 0.000102078 1.36297 -0.87287 -0.872871 1457 1458001 0.000101773 1.36265 -0.872864 -0.872871 1458 1459001 0.000101468 1.36336 -0.87287 -0.872871 1459 1460001 0.000101165 1.36456 -0.872812 -0.872871 1460 1461001 0.000100862 1.36253 -0.872861 -0.872871 1461 1462001 0.00010056 1.36166 -0.872808 -0.872871 1462 1463001 0.00010026 1.36242 -0.872856 -0.872871 1463 1464001 9.99597e-05 1.36165 -0.872808 -0.872871 1464 1465001 9.96607e-05 1.36419 -0.872838 -0.872871 1465 1466001 9.93626e-05 1.36332 -0.87287 -0.872871 1466 1467001 9.90654e-05 1.36213 -0.872842 -0.872871 1467 1468001 9.87691e-05 1.36424 -0.872836 -0.872871 1468 1469001 9.84737e-05 1.36424 -0.872836 -0.872871 1469 1470001 9.81792e-05 1.36368 -0.872863 -0.872871 1470 1471001 9.78855e-05 1.36368 -0.872863 -0.872871 1471 1472001 9.75927e-05 1.36368 -0.872863 -0.872871 1472 1473001 9.73008e-05 1.36339 -0.872869 -0.872871 1473 1474001 9.70098e-05 1.36159 -0.872802 -0.872871 1474 1475001 9.67196e-05 1.36167 -0.872809 -0.872871 1475 1476001 9.64304e-05 1.36167 -0.872809 -0.872871 1476 1477001 9.61419e-05 1.36231 -0.872852 -0.872871 1477 1478001 9.58544e-05 1.36215 -0.872843 -0.872871 1478 1479001 9.55677e-05 1.36291 -0.87287 -0.872871 1479 1480001 9.52818e-05 1.36174 -0.872815 -0.872871 1480 1481001 9.49968e-05 1.36431 -0.872831 -0.872871 1481 1482001 9.47127e-05 1.36368 -0.872862 -0.872871 1482 1483001 9.44294e-05 1.36327 -0.872871 -0.872871 1483 1484001 9.4147e-05 1.36119 -0.872762 -0.872871 1484 1485001 9.38654e-05 1.36149 -0.872793 -0.872871 1485 1486001 9.35846e-05 1.36354 -0.872866 -0.872871 1486 1487001 9.33047e-05 1.36354 -0.872866 -0.872871 1487 1488001 9.30256e-05 1.36395 -0.872852 -0.872871 1488 1489001 9.27474e-05 1.36256 -0.872862 -0.872871 1489 1490001 9.247e-05 1.36502 -0.872768 -0.872871 1490 1491001 9.21934e-05 1.36081 -0.872714 -0.872871 1491 1492001 9.19176e-05 1.36533 -0.872731 -0.872871 1492 1493001 9.16427e-05 1.36374 -0.872861 -0.872871 1493 1494001 9.13686e-05 1.36354 -0.872866 -0.872871 1494 1495001 9.10953e-05 1.36354 -0.872866 -0.872871 1495 1496001 9.08228e-05 1.36238 -0.872855 -0.872871 1496 1497001 9.05512e-05 1.36416 -0.872841 -0.872871 1497 1498001 9.02804e-05 1.36416 -0.872841 -0.872871 1498 1499001 9.00103e-05 1.3644 -0.872825 -0.872871 1499 1500001 8.97411e-05 1.36689 -0.872461 -0.872871 1500 1501001 8.94727e-05 1.36263 -0.872864 -0.872871 1501 1502001 8.92051e-05 1.36387 -0.872855 -0.872871 1502 1503001 8.89383e-05 1.36387 -0.872855 -0.872871 1503 1504001 8.86722e-05 1.3626 -0.872863 -0.872871 1504 1505001 8.8407e-05 1.3626 -0.872863 -0.872871 1505 1506001 8.81426e-05 1.36317 -0.872871 -0.872871 1506 1507001 8.78789e-05 1.36331 -0.87287 -0.872871 1507 1508001 8.76161e-05 1.36331 -0.87287 -0.872871 1508 1509001 8.7354e-05 1.3635 -0.872867 -0.872871 1509 1510001 8.70928e-05 1.36244 -0.872857 -0.872871 1510 1511001 8.68323e-05 1.36353 -0.872867 -0.872871 1511 1512001 8.65725e-05 1.36407 -0.872845 -0.872871 1512 1513001 8.63136e-05 1.36461 -0.872808 -0.872871 1513 1514001 8.60554e-05 1.36553 -0.872705 -0.872871 1514 1515001 8.5798e-05 1.36138 -0.872783 -0.872871 1515 1516001 8.55414e-05 1.36443 -0.872822 -0.872871 1516 1517001 8.52856e-05 1.36273 -0.872867 -0.872871 1517 1518001 8.50305e-05 1.36376 -0.87286 -0.872871 1518 1519001 8.47761e-05 1.36346 -0.872868 -0.872871 1519 1520001 8.45226e-05 1.36404 -0.872847 -0.872871 1520 1521001 8.42698e-05 1.36374 -0.872861 -0.872871 1521 1522001 8.40177e-05 1.36313 -0.872871 -0.872871 1522 1523001 8.37664e-05 1.36437 -0.872827 -0.872871 1523 1524001 8.35159e-05 1.36437 -0.872827 -0.872871 1524 1525001 8.32661e-05 1.36232 -0.872852 -0.872871 1525 1526001 8.3017e-05 1.36437 -0.872826 -0.872871 1526 1527001 8.27687e-05 1.36254 -0.872861 -0.872871 1527 1528001 8.25211e-05 1.36264 -0.872864 -0.872871 1528 1529001 8.22743e-05 1.36377 -0.872859 -0.872871 1529 1530001 8.20282e-05 1.36143 -0.872787 -0.872871 1530 1531001 8.17829e-05 1.36241 -0.872856 -0.872871 1531 1532001 8.15383e-05 1.36552 -0.872706 -0.872871 1532 1533001 8.12944e-05 1.36189 -0.872826 -0.872871 1533 1534001 8.10512e-05 1.36325 -0.872871 -0.872871 1534 1535001 8.08088e-05 1.36337 -0.872869 -0.872871 1535 1536001 8.05671e-05 1.36337 -0.872869 -0.872871 1536 1537001 8.03261e-05 1.36337 -0.872869 -0.872871 1537 1538001 8.00859e-05 1.36414 -0.872842 -0.872871 1538 1539001 7.98463e-05 1.36355 -0.872866 -0.872871 1539 1540001 7.96075e-05 1.36355 -0.872866 -0.872871 1540 1541001 7.93694e-05 1.36372 -0.872861 -0.872871 1541 1542001 7.9132e-05 1.3621 -0.87284 -0.872871 1542 1543001 7.88953e-05 1.36443 -0.872822 -0.872871 1543 1544001 7.86593e-05 1.36295 -0.87287 -0.872871 1544 1545001 7.84241e-05 1.36128 -0.872772 -0.872871 1545 1546001 7.81895e-05 1.364 -0.872849 -0.872871 1546 1547001 7.79556e-05 1.3649 -0.87278 -0.872871 1547 1548001 7.77225e-05 1.36311 -0.872871 -0.872871 1548 1549001 7.749e-05 1.36095 -0.872733 -0.872871 1549 1550001 7.72582e-05 1.36508 -0.872761 -0.872871 1550 1551001 7.70271e-05 1.36479 -0.872792 -0.872871 1551 1552001 7.67968e-05 1.3613 -0.872774 -0.872871 1552 1553001 7.65671e-05 1.36154 -0.872798 -0.872871 1553 1554001 7.6338e-05 1.36432 -0.87283 -0.872871 1554 1555001 7.61097e-05 1.36244 -0.872857 -0.872871 1555 1556001 7.58821e-05 1.36252 -0.87286 -0.872871 1556 1557001 7.56551e-05 1.36272 -0.872866 -0.872871 1557 1558001 7.54288e-05 1.36272 -0.872866 -0.872871 1558 1559001 7.52032e-05 1.36088 -0.872724 -0.872871 1559 1560001 7.49783e-05 1.36562 -0.872692 -0.872871 1560 1561001 7.4754e-05 1.36259 -0.872863 -0.872871 1561 1562001 7.45304e-05 1.36259 -0.872863 -0.872871 1562 1563001 7.43075e-05 1.36166 -0.872808 -0.872871 1563 1564001 7.40852e-05 1.36219 -0.872845 -0.872871 1564 1565001 7.38636e-05 1.36264 -0.872864 -0.872871 1565 1566001 7.36427e-05 1.36414 -0.872842 -0.872871 1566 1567001 7.34225e-05 1.36185 -0.872824 -0.872871 1567 1568001 7.32028e-05 1.36353 -0.872867 -0.872871 1568 1569001 7.29839e-05 1.36233 -0.872853 -0.872871 1569 1570001 7.27656e-05 1.3626 -0.872863 -0.872871 1570 1571001 7.25479e-05 1.36337 -0.87287 -0.872871 1571 1572001 7.2331e-05 1.36337 -0.87287 -0.872871 1572 1573001 7.21146e-05 1.36227 -0.87285 -0.872871 1573 1574001 7.18989e-05 1.36429 -0.872832 -0.872871 1574 1575001 7.16839e-05 1.36295 -0.87287 -0.872871 1575 1576001 7.14695e-05 1.3617 -0.872812 -0.872871 1576 1577001 7.12557e-05 1.3617 -0.872812 -0.872871 1577 1578001 7.10426e-05 1.36253 -0.872861 -0.872871 1578 1579001 7.08301e-05 1.36317 -0.872871 -0.872871 1579 1580001 7.06182e-05 1.36317 -0.872871 -0.872871 1580 1581001 7.0407e-05 1.36317 -0.872871 -0.872871 1581 1582001 7.01964e-05 1.36508 -0.872761 -0.872871 1582 1583001 6.99864e-05 1.36508 -0.872761 -0.872871 1583 1584001 6.97771e-05 1.36511 -0.872757 -0.872871 1584 1585001 6.95684e-05 1.36413 -0.872842 -0.872871 1585 1586001 6.93603e-05 1.36323 -0.872871 -0.872871 1586 1587001 6.91529e-05 1.36205 -0.872838 -0.872871 1587 1588001 6.8946e-05 1.3646 -0.872809 -0.872871 1588 1589001 6.87398e-05 1.36411 -0.872843 -0.872871 1589 1590001 6.85342e-05 1.36117 -0.872759 -0.872871 1590 1591001 6.83292e-05 1.36388 -0.872855 -0.872871 1591 1592001 6.81248e-05 1.36388 -0.872855 -0.872871 1592 1593001 6.79211e-05 1.36109 -0.87275 -0.872871 1593 1594001 6.77179e-05 1.36221 -0.872847 -0.872871 1594 1595001 6.75154e-05 1.36394 -0.872852 -0.872871 1595 1596001 6.73134e-05 1.3643 -0.872832 -0.872871 1596 1597001 6.71121e-05 1.36331 -0.87287 -0.872871 1597 1598001 6.69114e-05 1.36299 -0.872871 -0.872871 1598 1599001 6.67112e-05 1.36357 -0.872866 -0.872871 1599 1600001 6.65117e-05 1.36118 -0.872761 -0.872871 1600 1601001 6.63128e-05 1.36215 -0.872843 -0.872871 1601 1602001 6.61144e-05 1.36454 -0.872813 -0.872871 1602 1603001 6.59167e-05 1.36454 -0.872813 -0.872871 1603 1604001 6.57195e-05 1.36327 -0.872871 -0.872871 1604 1605001 6.55229e-05 1.36276 -0.872867 -0.872871 1605 1606001 6.5327e-05 1.36437 -0.872827 -0.872871 1606 1607001 6.51316e-05 1.36351 -0.872867 -0.872871 1607 1608001 6.49368e-05 1.3652 -0.872746 -0.872871 1608 1609001 6.47425e-05 1.36478 -0.872793 -0.872871 1609 1610001 6.45489e-05 1.36478 -0.872793 -0.872871 1610 1611001 6.43558e-05 1.36363 -0.872864 -0.872871 1611 1612001 6.41633e-05 1.36478 -0.872792 -0.872871 1612 1613001 6.39714e-05 1.36159 -0.872803 -0.872871 1613 1614001 6.37801e-05 1.36422 -0.872837 -0.872871 1614 1615001 6.35893e-05 1.36446 -0.87282 -0.872871 1615 1616001 6.33991e-05 1.36227 -0.87285 -0.872871 1616 1617001 6.32095e-05 1.3645 -0.872817 -0.872871 1617 1618001 6.30204e-05 1.36347 -0.872868 -0.872871 1618 1619001 6.28319e-05 1.36263 -0.872864 -0.872871 1619 1620001 6.2644e-05 1.36142 -0.872787 -0.872871 1620 1621001 6.24566e-05 1.36507 -0.872762 -0.872871 1621 1622001 6.22698e-05 1.36191 -0.872828 -0.872871 1622 1623001 6.20836e-05 1.36178 -0.872819 -0.872871 1623 1624001 6.18979e-05 1.36178 -0.872819 -0.872871 1624 1625001 6.17127e-05 1.36176 -0.872817 -0.872871 1625 1626001 6.15281e-05 1.36306 -0.872871 -0.872871 1626 1627001 6.13441e-05 1.36405 -0.872847 -0.872871 1627 1628001 6.11606e-05 1.36405 -0.872847 -0.872871 1628 1629001 6.09777e-05 1.36325 -0.872871 -0.872871 1629 1630001 6.07953e-05 1.36238 -0.872855 -0.872871 1630 1631001 6.06135e-05 1.36382 -0.872857 -0.872871 1631 1632001 6.04322e-05 1.36066 -0.872694 -0.872871 1632 1633001 6.02514e-05 1.36505 -0.872764 -0.872871 1633 1634001 6.00712e-05 1.36302 -0.872871 -0.872871 1634 1635001 5.98915e-05 1.36302 -0.872871 -0.872871 1635 1636001 5.97124e-05 1.36486 -0.872784 -0.872871 1636 1637001 5.95338e-05 1.36253 -0.872861 -0.872871 1637 1638001 5.93557e-05 1.36246 -0.872858 -0.872871 1638 1639001 5.91782e-05 1.36127 -0.872771 -0.872871 1639 1640001 5.90012e-05 1.36127 -0.872771 -0.872871 1640 1641001 5.88247e-05 1.36262 -0.872864 -0.872871 1641 1642001 5.86488e-05 1.36386 -0.872856 -0.872871 1642 1643001 5.84733e-05 1.3639 -0.872854 -0.872871 1643 1644001 5.82985e-05 1.36272 -0.872866 -0.872871 1644 1645001 5.81241e-05 1.36272 -0.872866 -0.872871 1645 1646001 5.79502e-05 1.36253 -0.872861 -0.872871 1646 1647001 5.77769e-05 1.36253 -0.872861 -0.872871 1647 1648001 5.76041e-05 1.36344 -0.872868 -0.872871 1648 1649001 5.74318e-05 1.36348 -0.872868 -0.872871 1649 1650001 5.726e-05 1.36348 -0.872868 -0.872871 1650 1651001 5.70887e-05 1.36327 -0.872871 -0.872871 1651 1652001 5.6918e-05 1.36283 -0.872869 -0.872871 1652 1653001 5.67477e-05 1.36283 -0.872869 -0.872871 1653 1654001 5.6578e-05 1.36395 -0.872852 -0.872871 1654 1655001 5.64088e-05 1.36395 -0.872852 -0.872871 1655 1656001 5.62401e-05 1.36375 -0.87286 -0.872871 1656 1657001 5.60719e-05 1.36375 -0.87286 -0.872871 1657 1658001 5.59041e-05 1.36189 -0.872827 -0.872871 1658 1659001 5.57369e-05 1.36168 -0.87281 -0.872871 1659 1660001 5.55702e-05 1.36105 -0.872746 -0.872871 1660 1661001 5.5404e-05 1.36105 -0.872746 -0.872871 1661 1662001 5.52383e-05 1.36256 -0.872862 -0.872871 1662 1663001 5.50731e-05 1.36298 -0.872871 -0.872871 1663 1664001 5.49083e-05 1.36419 -0.872839 -0.872871 1664 1665001 5.47441e-05 1.36419 -0.872839 -0.872871 1665 1666001 5.45804e-05 1.36348 -0.872868 -0.872871 1666 1667001 5.44171e-05 1.36175 -0.872816 -0.872871 1667 1668001 5.42544e-05 1.36401 -0.872849 -0.872871 1668 1669001 5.40921e-05 1.36186 -0.872824 -0.872871 1669 1670001 5.39303e-05 1.36365 -0.872864 -0.872871 1670 1671001 5.3769e-05 1.36365 -0.872864 -0.872871 1671 1672001 5.36082e-05 1.36231 -0.872852 -0.872871 1672 1673001 5.34478e-05 1.36327 -0.872871 -0.872871 1673 1674001 5.3288e-05 1.36299 -0.872871 -0.872871 1674 1675001 5.31286e-05 1.36269 -0.872866 -0.872871 1675 1676001 5.29697e-05 1.36158 -0.872802 -0.872871 1676 1677001 5.28112e-05 1.36316 -0.872871 -0.872871 1677 1678001 5.26533e-05 1.36292 -0.87287 -0.872871 1678 1679001 5.24958e-05 1.3623 -0.872851 -0.872871 1679 1680001 5.23388e-05 1.36274 -0.872867 -0.872871 1680 1681001 5.21822e-05 1.361 -0.872739 -0.872871 1681 1682001 5.20261e-05 1.3629 -0.87287 -0.872871 1682 1683001 5.18705e-05 1.36335 -0.87287 -0.872871 1683 1684001 5.17154e-05 1.36304 -0.872871 -0.872871 1684 1685001 5.15607e-05 1.36304 -0.872871 -0.872871 1685 1686001 5.14065e-05 1.36304 -0.872871 -0.872871 1686 1687001 5.12527e-05 1.36319 -0.872871 -0.872871 1687 1688001 5.10994e-05 1.3634 -0.872869 -0.872871 1688 1689001 5.09466e-05 1.36572 -0.872677 -0.872871 1689 1690001 5.07942e-05 1.3641 -0.872844 -0.872871 1690 1691001 5.06423e-05 1.36262 -0.872864 -0.872871 1691 1692001 5.04908e-05 1.362 -0.872834 -0.872871 1692 1693001 5.03398e-05 1.362 -0.872834 -0.872871 1693 1694001 5.01892e-05 1.36451 -0.872816 -0.872871 1694 1695001 5.00391e-05 1.36458 -0.87281 -0.872871 1695 1696001 4.98894e-05 1.36206 -0.872838 -0.872871 1696 1697001 4.97402e-05 1.36201 -0.872835 -0.872871 1697 1698001 4.95914e-05 1.36201 -0.872835 -0.872871 1698 1699001 4.94431e-05 1.36201 -0.872835 -0.872871 1699 1700001 4.92952e-05 1.36201 -0.872835 -0.872871 1700 1701001 4.91478e-05 1.36251 -0.87286 -0.872871 1701 1702001 4.90008e-05 1.3634 -0.872869 -0.872871 1702 1703001 4.88542e-05 1.36247 -0.872858 -0.872871 1703 1704001 4.87081e-05 1.36469 -0.872801 -0.872871 1704 1705001 4.85624e-05 1.36194 -0.87283 -0.872871 1705 1706001 4.84171e-05 1.36335 -0.87287 -0.872871 1706 1707001 4.82723e-05 1.3626 -0.872863 -0.872871 1707 1708001 4.81279e-05 1.3636 -0.872865 -0.872871 1708 1709001 4.7984e-05 1.36352 -0.872867 -0.872871 1709 1710001 4.78405e-05 1.36368 -0.872863 -0.872871 1710 1711001 4.76974e-05 1.36368 -0.872863 -0.872871 1711 1712001 4.75547e-05 1.36392 -0.872853 -0.872871 1712 1713001 4.74125e-05 1.36269 -0.872866 -0.872871 1713 1714001 4.72707e-05 1.36269 -0.872866 -0.872871 1714 1715001 4.71293e-05 1.36339 -0.872869 -0.872871 1715 1716001 4.69883e-05 1.3627 -0.872866 -0.872871 1716 1717001 4.68478e-05 1.36275 -0.872867 -0.872871 1717 1718001 4.67076e-05 1.36303 -0.872871 -0.872871 1718 1719001 4.65679e-05 1.36517 -0.872751 -0.872871 1719 1720001 4.64287e-05 1.36192 -0.872828 -0.872871 1720 1721001 4.62898e-05 1.3632 -0.872871 -0.872871 1721 1722001 4.61513e-05 1.36169 -0.872811 -0.872871 1722 1723001 4.60133e-05 1.36366 -0.872863 -0.872871 1723 1724001 4.58757e-05 1.36353 -0.872867 -0.872871 1724 1725001 4.57385e-05 1.36326 -0.872871 -0.872871 1725 1726001 4.56016e-05 1.36326 -0.872871 -0.872871 1726 1727001 4.54653e-05 1.3627 -0.872866 -0.872871 1727 1728001 4.53293e-05 1.36245 -0.872858 -0.872871 1728 1729001 4.51937e-05 1.36278 -0.872868 -0.872871 1729 1730001 4.50585e-05 1.36278 -0.872868 -0.872871 1730 1731001 4.49237e-05 1.36278 -0.872868 -0.872871 1731 1732001 4.47894e-05 1.36278 -0.872868 -0.872871 1732 1733001 4.46554e-05 1.36311 -0.872871 -0.872871 1733 1734001 4.45218e-05 1.36374 -0.87286 -0.872871 1734 1735001 4.43887e-05 1.36374 -0.87286 -0.872871 1735 1736001 4.42559e-05 1.36482 -0.872789 -0.872871 1736 1737001 4.41235e-05 1.36324 -0.872871 -0.872871 1737 1738001 4.39916e-05 1.36187 -0.872825 -0.872871 1738 1739001 4.386e-05 1.36322 -0.872871 -0.872871 1739 1740001 4.37288e-05 1.36291 -0.87287 -0.872871 1740 1741001 4.3598e-05 1.36215 -0.872843 -0.872871 1741 1742001 4.34676e-05 1.36215 -0.872843 -0.872871 1742 1743001 4.33376e-05 1.36215 -0.872843 -0.872871 1743 1744001 4.3208e-05 1.36209 -0.87284 -0.872871 1744 1745001 4.30787e-05 1.36306 -0.872871 -0.872871 1745 1746001 4.29499e-05 1.36295 -0.87287 -0.872871 1746 1747001 4.28214e-05 1.36295 -0.87287 -0.872871 1747 1748001 4.26933e-05 1.36317 -0.872871 -0.872871 1748 1749001 4.25656e-05 1.36276 -0.872867 -0.872871 1749 1750001 4.24383e-05 1.36276 -0.872867 -0.872871 1750 1751001 4.23114e-05 1.36312 -0.872871 -0.872871 1751 1752001 4.21848e-05 1.36299 -0.872871 -0.872871 1752 1753001 4.20587e-05 1.36355 -0.872866 -0.872871 1753 1754001 4.19329e-05 1.36355 -0.872866 -0.872871 1754 1755001 4.18074e-05 1.36274 -0.872867 -0.872871 1755 1756001 4.16824e-05 1.36211 -0.872841 -0.872871 1756 1757001 4.15577e-05 1.36315 -0.872871 -0.872871 1757 1758001 4.14334e-05 1.3631 -0.872871 -0.872871 1758 1759001 4.13095e-05 1.3631 -0.872871 -0.872871 1759 1760001 4.11859e-05 1.36393 -0.872853 -0.872871 1760 1761001 4.10627e-05 1.36264 -0.872864 -0.872871 1761 1762001 4.09399e-05 1.36296 -0.87287 -0.872871 1762 1763001 4.08175e-05 1.36296 -0.87287 -0.872871 1763 1764001 4.06954e-05 1.36296 -0.87287 -0.872871 1764 1765001 4.05737e-05 1.36353 -0.872866 -0.872871 1765 1766001 4.04523e-05 1.36163 -0.872806 -0.872871 1766 1767001 4.03313e-05 1.36213 -0.872842 -0.872871 1767 1768001 4.02107e-05 1.36216 -0.872844 -0.872871 1768 1769001 4.00904e-05 1.36221 -0.872847 -0.872871 1769 1770001 3.99705e-05 1.36197 -0.872832 -0.872871 1770 1771001 3.98509e-05 1.36197 -0.872832 -0.872871 1771 1772001 3.97317e-05 1.36279 -0.872868 -0.872871 1772 1773001 3.96129e-05 1.36279 -0.872868 -0.872871 1773 1774001 3.94944e-05 1.36382 -0.872858 -0.872871 1774 1775001 3.93763e-05 1.3622 -0.872846 -0.872871 1775 1776001 3.92585e-05 1.363 -0.872871 -0.872871 1776 1777001 3.91411e-05 1.363 -0.872871 -0.872871 1777 1778001 3.9024e-05 1.36098 -0.872737 -0.872871 1778 1779001 3.89073e-05 1.36324 -0.872871 -0.872871 1779 1780001 3.87909e-05 1.36239 -0.872855 -0.872871 1780 1781001 3.86749e-05 1.36239 -0.872855 -0.872871 1781 1782001 3.85592e-05 1.36239 -0.872855 -0.872871 1782 1783001 3.84439e-05 1.36344 -0.872868 -0.872871 1783 1784001 3.83289e-05 1.36394 -0.872852 -0.872871 1784 1785001 3.82143e-05 1.36386 -0.872856 -0.872871 1785 1786001 3.81e-05 1.36386 -0.872856 -0.872871 1786 1787001 3.7986e-05 1.36386 -0.872856 -0.872871 1787 1788001 3.78724e-05 1.36214 -0.872843 -0.872871 1788 1789001 3.77591e-05 1.3631 -0.872871 -0.872871 1789 1790001 3.76462e-05 1.3631 -0.872871 -0.872871 1790 1791001 3.75336e-05 1.36225 -0.872849 -0.872871 1791 1792001 3.74213e-05 1.36225 -0.872849 -0.872871 1792 1793001 3.73094e-05 1.3635 -0.872867 -0.872871 1793 1794001 3.71978e-05 1.36278 -0.872868 -0.872871 1794 1795001 3.70865e-05 1.36359 -0.872865 -0.872871 1795 1796001 3.69756e-05 1.36359 -0.872865 -0.872871 1796 1797001 3.6865e-05 1.36359 -0.872865 -0.872871 1797 1798001 3.67547e-05 1.36302 -0.872871 -0.872871 1798 1799001 3.66448e-05 1.36176 -0.872817 -0.872871 1799 1800001 3.65352e-05 1.36336 -0.87287 -0.872871 1800 1801001 3.64259e-05 1.36313 -0.872871 -0.872871 1801 1802001 3.6317e-05 1.3621 -0.87284 -0.872871 1802 1803001 3.62083e-05 1.36376 -0.87286 -0.872871 1803 1804001 3.61e-05 1.36346 -0.872868 -0.872871 1804 1805001 3.59921e-05 1.36409 -0.872845 -0.872871 1805 1806001 3.58844e-05 1.36209 -0.87284 -0.872871 1806 1807001 3.57771e-05 1.36332 -0.87287 -0.872871 1807 1808001 3.56701e-05 1.36332 -0.87287 -0.872871 1808 1809001 3.55634e-05 1.3637 -0.872862 -0.872871 1809 1810001 3.5457e-05 1.36253 -0.872861 -0.872871 1810 1811001 3.5351e-05 1.36253 -0.872861 -0.872871 1811 1812001 3.52452e-05 1.36201 -0.872835 -0.872871 1812 1813001 3.51398e-05 1.36285 -0.872869 -0.872871 1813 1814001 3.50347e-05 1.36368 -0.872863 -0.872871 1814 1815001 3.49299e-05 1.36345 -0.872868 -0.872871 1815 1816001 3.48254e-05 1.36261 -0.872863 -0.872871 1816 1817001 3.47213e-05 1.36369 -0.872862 -0.872871 1817 1818001 3.46174e-05 1.36369 -0.872862 -0.872871 1818 1819001 3.45139e-05 1.36445 -0.87282 -0.872871 1819 1820001 3.44106e-05 1.36378 -0.872859 -0.872871 1820 1821001 3.43077e-05 1.36394 -0.872852 -0.872871 1821 1822001 3.42051e-05 1.36394 -0.872852 -0.872871 1822 1823001 3.41028e-05 1.36347 -0.872868 -0.872871 1823 1824001 3.40008e-05 1.36311 -0.872871 -0.872871 1824 1825001 3.38991e-05 1.36246 -0.872858 -0.872871 1825 1826001 3.37977e-05 1.36266 -0.872865 -0.872871 1826 1827001 3.36966e-05 1.3624 -0.872856 -0.872871 1827 1828001 3.35958e-05 1.3624 -0.872856 -0.872871 1828 1829001 3.34953e-05 1.36332 -0.87287 -0.872871 1829 1830001 3.33952e-05 1.36332 -0.87287 -0.872871 1830 1831001 3.32953e-05 1.36332 -0.87287 -0.872871 1831 1832001 3.31957e-05 1.36332 -0.87287 -0.872871 1832 1833001 3.30964e-05 1.36398 -0.87285 -0.872871 1833 1834001 3.29974e-05 1.36359 -0.872865 -0.872871 1834 1835001 3.28987e-05 1.36334 -0.87287 -0.872871 1835 1836001 3.28003e-05 1.36244 -0.872857 -0.872871 1836 1837001 3.27022e-05 1.36358 -0.872865 -0.872871 1837 1838001 3.26044e-05 1.36358 -0.872865 -0.872871 1838 1839001 3.25069e-05 1.36406 -0.872846 -0.872871 1839 1840001 3.24096e-05 1.36267 -0.872865 -0.872871 1840 1841001 3.23127e-05 1.36463 -0.872806 -0.872871 1841 1842001 3.22161e-05 1.36425 -0.872835 -0.872871 1842 1843001 3.21197e-05 1.36411 -0.872843 -0.872871 1843 1844001 3.20236e-05 1.36211 -0.872841 -0.872871 1844 1845001 3.19278e-05 1.36369 -0.872862 -0.872871 1845 1846001 3.18323e-05 1.3632 -0.872871 -0.872871 1846 1847001 3.17371e-05 1.3632 -0.872871 -0.872871 1847 1848001 3.16422e-05 1.36343 -0.872869 -0.872871 1848 1849001 3.15476e-05 1.36185 -0.872823 -0.872871 1849 1850001 3.14532e-05 1.36438 -0.872826 -0.872871 1850 1851001 3.13591e-05 1.36316 -0.872871 -0.872871 1851 1852001 3.12653e-05 1.36359 -0.872865 -0.872871 1852 1853001 3.11718e-05 1.36264 -0.872864 -0.872871 1853 1854001 3.10786e-05 1.36348 -0.872868 -0.872871 1854 1855001 3.09856e-05 1.36348 -0.872868 -0.872871 1855 1856001 3.08929e-05 1.3637 -0.872862 -0.872871 1856 1857001 3.08005e-05 1.36327 -0.872871 -0.872871 1857 1858001 3.07084e-05 1.36426 -0.872834 -0.872871 1858 1859001 3.06166e-05 1.36322 -0.872871 -0.872871 1859 1860001 3.0525e-05 1.3629 -0.87287 -0.872871 1860 1861001 3.04337e-05 1.3629 -0.87287 -0.872871 1861 1862001 3.03427e-05 1.36321 -0.872871 -0.872871 1862 1863001 3.02519e-05 1.36252 -0.87286 -0.872871 1863 1864001 3.01614e-05 1.36339 -0.872869 -0.872871 1864 1865001 3.00712e-05 1.36339 -0.872869 -0.872871 1865 1866001 2.99813e-05 1.36339 -0.872869 -0.872871 1866 1867001 2.98916e-05 1.36339 -0.872869 -0.872871 1867 1868001 2.98022e-05 1.36143 -0.872787 -0.872871 1868 1869001 2.9713e-05 1.36473 -0.872797 -0.872871 1869 1870001 2.96242e-05 1.36473 -0.872797 -0.872871 1870 1871001 2.95356e-05 1.3629 -0.87287 -0.872871 1871 1872001 2.94472e-05 1.36281 -0.872868 -0.872871 1872 1873001 2.93591e-05 1.36313 -0.872871 -0.872871 1873 1874001 2.92713e-05 1.36354 -0.872866 -0.872871 1874 1875001 2.91838e-05 1.36354 -0.872866 -0.872871 1875 1876001 2.90965e-05 1.3639 -0.872854 -0.872871 1876 1877001 2.90095e-05 1.36339 -0.872869 -0.872871 1877 1878001 2.89227e-05 1.36168 -0.87281 -0.872871 1878 1879001 2.88362e-05 1.36312 -0.872871 -0.872871 1879 1880001 2.87499e-05 1.36406 -0.872846 -0.872871 1880 1881001 2.86639e-05 1.3622 -0.872846 -0.872871 1881 1882001 2.85782e-05 1.3622 -0.872846 -0.872871 1882 1883001 2.84927e-05 1.3622 -0.872846 -0.872871 1883 1884001 2.84075e-05 1.36263 -0.872864 -0.872871 1884 1885001 2.83225e-05 1.36356 -0.872866 -0.872871 1885 1886001 2.82378e-05 1.36356 -0.872866 -0.872871 1886 1887001 2.81534e-05 1.36384 -0.872857 -0.872871 1887 1888001 2.80692e-05 1.36384 -0.872857 -0.872871 1888 1889001 2.79852e-05 1.36346 -0.872868 -0.872871 1889 1890001 2.79015e-05 1.36346 -0.872868 -0.872871 1890 1891001 2.7818e-05 1.36331 -0.87287 -0.872871 1891 1892001 2.77348e-05 1.36331 -0.87287 -0.872871 1892 1893001 2.76519e-05 1.36331 -0.87287 -0.872871 1893 1894001 2.75692e-05 1.3627 -0.872866 -0.872871 1894 1895001 2.74867e-05 1.36355 -0.872866 -0.872871 1895 1896001 2.74045e-05 1.36355 -0.872866 -0.872871 1896 1897001 2.73225e-05 1.36283 -0.872869 -0.872871 1897 1898001 2.72408e-05 1.36174 -0.872815 -0.872871 1898 1899001 2.71593e-05 1.36234 -0.872853 -0.872871 1899 1900001 2.70781e-05 1.36234 -0.872853 -0.872871 1900 1901001 2.69971e-05 1.3623 -0.872851 -0.872871 1901 1902001 2.69164e-05 1.36299 -0.872871 -0.872871 1902 1903001 2.68359e-05 1.36263 -0.872864 -0.872871 1903 1904001 2.67556e-05 1.36254 -0.872861 -0.872871 1904 1905001 2.66756e-05 1.36254 -0.872861 -0.872871 1905 1906001 2.65958e-05 1.36194 -0.87283 -0.872871 1906 1907001 2.65162e-05 1.36194 -0.87283 -0.872871 1907 1908001 2.64369e-05 1.3635 -0.872867 -0.872871 1908 1909001 2.63578e-05 1.36316 -0.872871 -0.872871 1909 1910001 2.6279e-05 1.36316 -0.872871 -0.872871 1910 1911001 2.62004e-05 1.36316 -0.872871 -0.872871 1911 1912001 2.6122e-05 1.36316 -0.872871 -0.872871 1912 1913001 2.60439e-05 1.363 -0.872871 -0.872871 1913 1914001 2.5966e-05 1.36462 -0.872806 -0.872871 1914 1915001 2.58883e-05 1.3637 -0.872862 -0.872871 1915 1916001 2.58109e-05 1.36303 -0.872871 -0.872871 1916 1917001 2.57337e-05 1.36299 -0.872871 -0.872871 1917 1918001 2.56567e-05 1.36299 -0.872871 -0.872871 1918 1919001 2.558e-05 1.36299 -0.872871 -0.872871 1919 1920001 2.55035e-05 1.36331 -0.87287 -0.872871 1920 1921001 2.54272e-05 1.36333 -0.87287 -0.872871 1921 1922001 2.53511e-05 1.36371 -0.872861 -0.872871 1922 1923001 2.52753e-05 1.36377 -0.872859 -0.872871 1923 1924001 2.51997e-05 1.36377 -0.872859 -0.872871 1924 1925001 2.51244e-05 1.36377 -0.872859 -0.872871 1925 1926001 2.50492e-05 1.36289 -0.87287 -0.872871 1926 1927001 2.49743e-05 1.36289 -0.87287 -0.872871 1927 1928001 2.48996e-05 1.36289 -0.87287 -0.872871 1928 1929001 2.48251e-05 1.36348 -0.872868 -0.872871 1929 1930001 2.47509e-05 1.36348 -0.872868 -0.872871 1930 1931001 2.46768e-05 1.36323 -0.872871 -0.872871 1931 1932001 2.4603e-05 1.36344 -0.872868 -0.872871 1932 1933001 2.45294e-05 1.36315 -0.872871 -0.872871 1933 1934001 2.44561e-05 1.36358 -0.872865 -0.872871 1934 1935001 2.43829e-05 1.36358 -0.872865 -0.872871 1935 1936001 2.431e-05 1.36254 -0.872861 -0.872871 1936 1937001 2.42373e-05 1.36299 -0.872871 -0.872871 1937 1938001 2.41648e-05 1.36335 -0.87287 -0.872871 1938 1939001 2.40925e-05 1.36274 -0.872867 -0.872871 1939 1940001 2.40204e-05 1.36274 -0.872867 -0.872871 1940 1941001 2.39486e-05 1.36274 -0.872867 -0.872871 1941 1942001 2.3877e-05 1.36274 -0.872867 -0.872871 1942 1943001 2.38055e-05 1.36274 -0.872867 -0.872871 1943 1944001 2.37343e-05 1.36287 -0.872869 -0.872871 1944 1945001 2.36633e-05 1.36345 -0.872868 -0.872871 1945 1946001 2.35926e-05 1.36224 -0.872848 -0.872871 1946 1947001 2.3522e-05 1.36224 -0.872848 -0.872871 1947 1948001 2.34516e-05 1.36417 -0.87284 -0.872871 1948 1949001 2.33815e-05 1.36173 -0.872815 -0.872871 1949 1950001 2.33116e-05 1.36173 -0.872815 -0.872871 1950 1951001 2.32418e-05 1.36345 -0.872868 -0.872871 1951 1952001 2.31723e-05 1.36286 -0.872869 -0.872871 1952 1953001 2.3103e-05 1.36286 -0.872869 -0.872871 1953 1954001 2.30339e-05 1.36286 -0.872869 -0.872871 1954 1955001 2.2965e-05 1.36286 -0.872869 -0.872871 1955 1956001 2.28963e-05 1.36385 -0.872856 -0.872871 1956 1957001 2.28278e-05 1.36256 -0.872862 -0.872871 1957 1958001 2.27596e-05 1.36256 -0.872862 -0.872871 1958 1959001 2.26915e-05 1.36256 -0.872862 -0.872871 1959 1960001 2.26236e-05 1.36256 -0.872862 -0.872871 1960 1961001 2.2556e-05 1.36357 -0.872866 -0.872871 1961 1962001 2.24885e-05 1.36282 -0.872868 -0.872871 1962 1963001 2.24212e-05 1.36282 -0.872868 -0.872871 1963 1964001 2.23542e-05 1.36373 -0.872861 -0.872871 1964 1965001 2.22873e-05 1.36382 -0.872857 -0.872871 1965 1966001 2.22206e-05 1.36305 -0.872871 -0.872871 1966 1967001 2.21542e-05 1.36346 -0.872868 -0.872871 1967 1968001 2.20879e-05 1.36285 -0.872869 -0.872871 1968 1969001 2.20219e-05 1.36317 -0.872871 -0.872871 1969 1970001 2.1956e-05 1.36291 -0.87287 -0.872871 1970 1971001 2.18903e-05 1.36308 -0.872871 -0.872871 1971 1972001 2.18248e-05 1.36197 -0.872832 -0.872871 1972 1973001 2.17596e-05 1.36323 -0.872871 -0.872871 1973 1974001 2.16945e-05 1.36323 -0.872871 -0.872871 1974 1975001 2.16296e-05 1.36324 -0.872871 -0.872871 1975 1976001 2.15649e-05 1.36323 -0.872871 -0.872871 1976 1977001 2.15004e-05 1.36323 -0.872871 -0.872871 1977 1978001 2.14361e-05 1.36378 -0.872859 -0.872871 1978 1979001 2.1372e-05 1.36314 -0.872871 -0.872871 1979 1980001 2.1308e-05 1.36327 -0.872871 -0.872871 1980 1981001 2.12443e-05 1.3631 -0.872871 -0.872871 1981 1982001 2.11808e-05 1.3631 -0.872871 -0.872871 1982 1983001 2.11174e-05 1.36334 -0.87287 -0.872871 1983 1984001 2.10543e-05 1.36334 -0.87287 -0.872871 1984 1985001 2.09913e-05 1.36334 -0.87287 -0.872871 1985 1986001 2.09285e-05 1.36258 -0.872862 -0.872871 1986 1987001 2.08659e-05 1.36258 -0.872862 -0.872871 1987 1988001 2.08035e-05 1.36258 -0.872862 -0.872871 1988 1989001 2.07413e-05 1.36258 -0.872862 -0.872871 1989 1990001 2.06792e-05 1.36367 -0.872863 -0.872871 1990 1991001 2.06174e-05 1.3623 -0.872851 -0.872871 1991 1992001 2.05557e-05 1.36308 -0.872871 -0.872871 1992 1993001 2.04942e-05 1.36234 -0.872853 -0.872871 1993 1994001 2.04329e-05 1.36272 -0.872866 -0.872871 1994 1995001 2.03718e-05 1.36272 -0.872866 -0.872871 1995 1996001 2.03109e-05 1.36272 -0.872866 -0.872871 1996 1997001 2.02501e-05 1.36272 -0.872866 -0.872871 1997 1998001 2.01896e-05 1.36272 -0.872866 -0.872871 1998 1999001 2.01292e-05 1.36226 -0.872849 -0.872871 1999 2000001 2.0069e-05 1.36315 -0.872871 -0.872871 2000 2001001 2.00089e-05 1.36315 -0.872871 -0.872871 2001 2002001 1.99491e-05 1.36315 -0.872871 -0.872871 2002 2003001 1.98894e-05 1.36347 -0.872868 -0.872871 2003 2004001 1.98299e-05 1.36275 -0.872867 -0.872871 2004 2005001 1.97706e-05 1.36275 -0.872867 -0.872871 2005 2006001 1.97115e-05 1.36255 -0.872862 -0.872871 2006 2007001 1.96525e-05 1.36276 -0.872867 -0.872871 2007 2008001 1.95937e-05 1.36276 -0.872867 -0.872871 2008 2009001 1.95351e-05 1.36332 -0.87287 -0.872871 2009 2010001 1.94767e-05 1.36332 -0.87287 -0.872871 2010 2011001 1.94185e-05 1.36332 -0.87287 -0.872871 2011 2012001 1.93604e-05 1.36361 -0.872864 -0.872871 2012 2013001 1.93025e-05 1.36361 -0.872864 -0.872871 2013 2014001 1.92447e-05 1.36361 -0.872864 -0.872871 2014 2015001 1.91872e-05 1.36268 -0.872865 -0.872871 2015 2016001 1.91298e-05 1.36268 -0.872865 -0.872871 2016 2017001 1.90726e-05 1.36385 -0.872856 -0.872871 2017 2018001 1.90155e-05 1.36385 -0.872856 -0.872871 2018 2019001 1.89586e-05 1.36347 -0.872868 -0.872871 2019 2020001 1.89019e-05 1.36315 -0.872871 -0.872871 2020 2021001 1.88454e-05 1.36315 -0.872871 -0.872871 2021 2022001 1.8789e-05 1.36315 -0.872871 -0.872871 2022 2023001 1.87328e-05 1.36275 -0.872867 -0.872871 2023 2024001 1.86768e-05 1.36285 -0.872869 -0.872871 2024 2025001 1.86209e-05 1.36192 -0.872829 -0.872871 2025 2026001 1.85652e-05 1.36271 -0.872866 -0.872871 2026 2027001 1.85097e-05 1.3624 -0.872856 -0.872871 2027 2028001 1.84544e-05 1.36254 -0.872861 -0.872871 2028 2029001 1.83992e-05 1.3622 -0.872846 -0.872871 2029 2030001 1.83441e-05 1.36245 -0.872858 -0.872871 2030 2031001 1.82893e-05 1.36363 -0.872864 -0.872871 2031 2032001 1.82345e-05 1.36347 -0.872868 -0.872871 2032 2033001 1.818e-05 1.36254 -0.872861 -0.872871 2033 2034001 1.81256e-05 1.36237 -0.872854 -0.872871 2034 2035001 1.80714e-05 1.36237 -0.872854 -0.872871 2035 2036001 1.80174e-05 1.36248 -0.872859 -0.872871 2036 2037001 1.79635e-05 1.36257 -0.872862 -0.872871 2037 2038001 1.79097e-05 1.36346 -0.872868 -0.872871 2038 2039001 1.78562e-05 1.36346 -0.872868 -0.872871 2039 2040001 1.78028e-05 1.36346 -0.872868 -0.872871 2040 2041001 1.77495e-05 1.36346 -0.872868 -0.872871 2041 2042001 1.76964e-05 1.36346 -0.872868 -0.872871 2042 2043001 1.76435e-05 1.36346 -0.872868 -0.872871 2043 2044001 1.75907e-05 1.36334 -0.87287 -0.872871 2044 2045001 1.75381e-05 1.36334 -0.87287 -0.872871 2045 2046001 1.74857e-05 1.3637 -0.872862 -0.872871 2046 2047001 1.74334e-05 1.3637 -0.872862 -0.872871 2047 2048001 1.73812e-05 1.3637 -0.872862 -0.872871 2048 2049001 1.73292e-05 1.3637 -0.872862 -0.872871 2049 2050001 1.72774e-05 1.36239 -0.872855 -0.872871 2050 2051001 1.72257e-05 1.36375 -0.87286 -0.872871 2051 2052001 1.71742e-05 1.36282 -0.872868 -0.872871 2052 2053001 1.71228e-05 1.36282 -0.872868 -0.872871 2053 2054001 1.70716e-05 1.36282 -0.872868 -0.872871 2054 2055001 1.70205e-05 1.36282 -0.872868 -0.872871 2055 2056001 1.69696e-05 1.36282 -0.872868 -0.872871 2056 2057001 1.69189e-05 1.36282 -0.872868 -0.872871 2057 2058001 1.68683e-05 1.36282 -0.872868 -0.872871 2058 2059001 1.68178e-05 1.36282 -0.872868 -0.872871 2059 2060001 1.67675e-05 1.36282 -0.872868 -0.872871 2060 2061001 1.67174e-05 1.36282 -0.872868 -0.872871 2061 2062001 1.66674e-05 1.36282 -0.872868 -0.872871 2062 2063001 1.66175e-05 1.36309 -0.872871 -0.872871 2063 2064001 1.65678e-05 1.36247 -0.872858 -0.872871 2064 2065001 1.65183e-05 1.36233 -0.872853 -0.872871 2065 2066001 1.64689e-05 1.3627 -0.872866 -0.872871 2066 2067001 1.64196e-05 1.3627 -0.872866 -0.872871 2067 2068001 1.63705e-05 1.3627 -0.872866 -0.872871 2068 2069001 1.63215e-05 1.3627 -0.872866 -0.872871 2069 2070001 1.62727e-05 1.3625 -0.87286 -0.872871 2070 2071001 1.6224e-05 1.36342 -0.872869 -0.872871 2071 2072001 1.61755e-05 1.36214 -0.872843 -0.872871 2072 2073001 1.61271e-05 1.36301 -0.872871 -0.872871 2073 2074001 1.60789e-05 1.36368 -0.872862 -0.872871 2074 2075001 1.60308e-05 1.36337 -0.872869 -0.872871 2075 2076001 1.59828e-05 1.36337 -0.872869 -0.872871 2076 2077001 1.5935e-05 1.36337 -0.872869 -0.872871 2077 2078001 1.58874e-05 1.36317 -0.872871 -0.872871 2078 2079001 1.58399e-05 1.36423 -0.872836 -0.872871 2079 2080001 1.57925e-05 1.3621 -0.872841 -0.872871 2080 2081001 1.57452e-05 1.36254 -0.872861 -0.872871 2081 2082001 1.56981e-05 1.36257 -0.872862 -0.872871 2082 2083001 1.56512e-05 1.36257 -0.872862 -0.872871 2083 2084001 1.56044e-05 1.36257 -0.872862 -0.872871 2084 2085001 1.55577e-05 1.36257 -0.872862 -0.872871 2085 2086001 1.55112e-05 1.36257 -0.872862 -0.872871 2086 2087001 1.54648e-05 1.36337 -0.87287 -0.872871 2087 2088001 1.54185e-05 1.36241 -0.872856 -0.872871 2088 2089001 1.53724e-05 1.36241 -0.872856 -0.872871 2089 2090001 1.53264e-05 1.3627 -0.872866 -0.872871 2090 2091001 1.52806e-05 1.3627 -0.872866 -0.872871 2091 2092001 1.52349e-05 1.3627 -0.872866 -0.872871 2092 2093001 1.51893e-05 1.3636 -0.872865 -0.872871 2093 2094001 1.51439e-05 1.36265 -0.872865 -0.872871 2094 2095001 1.50986e-05 1.36265 -0.872865 -0.872871 2095 2096001 1.50534e-05 1.36265 -0.872865 -0.872871 2096 2097001 1.50084e-05 1.36265 -0.872865 -0.872871 2097 2098001 1.49635e-05 1.36265 -0.872865 -0.872871 2098 2099001 1.49188e-05 1.36368 -0.872863 -0.872871 2099 2100001 1.48741e-05 1.36315 -0.872871 -0.872871 2100 2101001 1.48296e-05 1.36315 -0.872871 -0.872871 2101 2102001 1.47853e-05 1.36315 -0.872871 -0.872871 2102 2103001 1.47411e-05 1.36315 -0.872871 -0.872871 2103 2104001 1.4697e-05 1.36315 -0.872871 -0.872871 2104 2105001 1.4653e-05 1.36315 -0.872871 -0.872871 2105 2106001 1.46092e-05 1.36315 -0.872871 -0.872871 2106 2107001 1.45655e-05 1.36315 -0.872871 -0.872871 2107 2108001 1.45219e-05 1.36315 -0.872871 -0.872871 2108 2109001 1.44785e-05 1.36276 -0.872867 -0.872871 2109 2110001 1.44352e-05 1.36359 -0.872865 -0.872871 2110 2111001 1.4392e-05 1.36345 -0.872868 -0.872871 2111 2112001 1.4349e-05 1.36345 -0.872868 -0.872871 2112 2113001 1.4306e-05 1.36238 -0.872855 -0.872871 2113 2114001 1.42633e-05 1.36273 -0.872867 -0.872871 2114 2115001 1.42206e-05 1.36274 -0.872867 -0.872871 2115 2116001 1.41781e-05 1.36274 -0.872867 -0.872871 2116 2117001 1.41356e-05 1.36274 -0.872867 -0.872871 2117 2118001 1.40934e-05 1.36274 -0.872867 -0.872871 2118 2119001 1.40512e-05 1.36365 -0.872863 -0.872871 2119 2120001 1.40092e-05 1.36235 -0.872854 -0.872871 2120 2121001 1.39673e-05 1.36235 -0.872854 -0.872871 2121 2122001 1.39255e-05 1.36235 -0.872854 -0.872871 2122 2123001 1.38839e-05 1.36235 -0.872854 -0.872871 2123 2124001 1.38423e-05 1.3631 -0.872871 -0.872871 2124 2125001 1.38009e-05 1.3631 -0.872871 -0.872871 2125 2126001 1.37596e-05 1.36287 -0.872869 -0.872871 2126 2127001 1.37185e-05 1.36232 -0.872852 -0.872871 2127 2128001 1.36775e-05 1.36261 -0.872863 -0.872871 2128 2129001 1.36366e-05 1.36317 -0.872871 -0.872871 2129 2130001 1.35958e-05 1.36317 -0.872871 -0.872871 2130 2131001 1.35551e-05 1.36329 -0.87287 -0.872871 2131 2132001 1.35146e-05 1.36256 -0.872862 -0.872871 2132 2133001 1.34741e-05 1.36256 -0.872862 -0.872871 2133 2134001 1.34338e-05 1.36256 -0.872862 -0.872871 2134 2135001 1.33936e-05 1.36256 -0.872862 -0.872871 2135 2136001 1.33536e-05 1.36256 -0.872862 -0.872871 2136 2137001 1.33136e-05 1.3631 -0.872871 -0.872871 2137 2138001 1.32738e-05 1.3631 -0.872871 -0.872871 2138 2139001 1.32341e-05 1.36292 -0.87287 -0.872871 2139 2140001 1.31945e-05 1.36331 -0.87287 -0.872871 2140 2141001 1.31551e-05 1.36239 -0.872855 -0.872871 2141 2142001 1.31157e-05 1.36239 -0.872855 -0.872871 2142 2143001 1.30765e-05 1.36317 -0.872871 -0.872871 2143 2144001 1.30374e-05 1.36299 -0.872871 -0.872871 2144 2145001 1.29984e-05 1.36299 -0.872871 -0.872871 2145 2146001 1.29595e-05 1.36335 -0.87287 -0.872871 2146 2147001 1.29208e-05 1.36335 -0.87287 -0.872871 2147 2148001 1.28821e-05 1.36334 -0.87287 -0.872871 2148 2149001 1.28436e-05 1.36303 -0.872871 -0.872871 2149 2150001 1.28052e-05 1.36337 -0.87287 -0.872871 2150 2151001 1.27669e-05 1.36274 -0.872867 -0.872871 2151 2152001 1.27287e-05 1.36327 -0.872871 -0.872871 2152 2153001 1.26906e-05 1.36327 -0.872871 -0.872871 2153 2154001 1.26526e-05 1.36291 -0.87287 -0.872871 2154 2155001 1.26148e-05 1.36291 -0.87287 -0.872871 2155 2156001 1.25771e-05 1.36291 -0.87287 -0.872871 2156 2157001 1.25394e-05 1.36291 -0.87287 -0.872871 2157 2158001 1.25019e-05 1.36291 -0.87287 -0.872871 2158 2159001 1.24645e-05 1.36236 -0.872854 -0.872871 2159 2160001 1.24273e-05 1.36232 -0.872852 -0.872871 2160 2161001 1.23901e-05 1.36253 -0.872861 -0.872871 2161 2162001 1.2353e-05 1.36186 -0.872824 -0.872871 2162 2163001 1.23161e-05 1.36239 -0.872855 -0.872871 2163 2164001 1.22793e-05 1.36239 -0.872855 -0.872871 2164 2165001 1.22425e-05 1.36239 -0.872855 -0.872871 2165 2166001 1.22059e-05 1.36239 -0.872855 -0.872871 2166 2167001 1.21694e-05 1.36273 -0.872867 -0.872871 2167 2168001 1.2133e-05 1.36273 -0.872867 -0.872871 2168 2169001 1.20967e-05 1.36346 -0.872868 -0.872871 2169 2170001 1.20605e-05 1.36346 -0.872868 -0.872871 2170 2171001 1.20245e-05 1.36341 -0.872869 -0.872871 2171 2172001 1.19885e-05 1.36341 -0.872869 -0.872871 2172 2173001 1.19526e-05 1.36341 -0.872869 -0.872871 2173 2174001 1.19169e-05 1.36313 -0.872871 -0.872871 2174 2175001 1.18812e-05 1.36238 -0.872855 -0.872871 2175 2176001 1.18457e-05 1.36302 -0.872871 -0.872871 2176 2177001 1.18103e-05 1.36302 -0.872871 -0.872871 2177 2178001 1.17749e-05 1.36271 -0.872866 -0.872871 2178 2179001 1.17397e-05 1.36271 -0.872866 -0.872871 2179 2180001 1.17046e-05 1.36271 -0.872866 -0.872871 2180 2181001 1.16696e-05 1.36263 -0.872864 -0.872871 2181 2182001 1.16347e-05 1.36263 -0.872864 -0.872871 2182 2183001 1.15999e-05 1.36292 -0.87287 -0.872871 2183 2184001 1.15652e-05 1.36274 -0.872867 -0.872871 2184 2185001 1.15306e-05 1.36274 -0.872867 -0.872871 2185 2186001 1.14961e-05 1.36384 -0.872857 -0.872871 2186 2187001 1.14617e-05 1.36384 -0.872857 -0.872871 2187 2188001 1.14275e-05 1.36395 -0.872852 -0.872871 2188 2189001 1.13933e-05 1.36273 -0.872867 -0.872871 2189 2190001 1.13592e-05 1.36273 -0.872867 -0.872871 2190 2191001 1.13252e-05 1.36273 -0.872867 -0.872871 2191 2192001 1.12913e-05 1.36273 -0.872867 -0.872871 2192 2193001 1.12576e-05 1.36322 -0.872871 -0.872871 2193 2194001 1.12239e-05 1.36322 -0.872871 -0.872871 2194 2195001 1.11903e-05 1.36281 -0.872868 -0.872871 2195 2196001 1.11569e-05 1.36314 -0.872871 -0.872871 2196 2197001 1.11235e-05 1.36344 -0.872868 -0.872871 2197 2198001 1.10902e-05 1.36316 -0.872871 -0.872871 2198 2199001 1.1057e-05 1.36316 -0.872871 -0.872871 2199 2200001 1.1024e-05 1.36316 -0.872871 -0.872871 2200 2201001 1.0991e-05 1.36316 -0.872871 -0.872871 2201 2202001 1.09581e-05 1.36316 -0.872871 -0.872871 2202 2203001 1.09254e-05 1.36287 -0.872869 -0.872871 2203 2204001 1.08927e-05 1.36287 -0.872869 -0.872871 2204 2205001 1.08601e-05 1.36287 -0.872869 -0.872871 2205 2206001 1.08276e-05 1.36287 -0.872869 -0.872871 2206 2207001 1.07952e-05 1.36287 -0.872869 -0.872871 2207 2208001 1.07629e-05 1.36218 -0.872845 -0.872871 2208 2209001 1.07307e-05 1.36203 -0.872836 -0.872871 2209 2210001 1.06986e-05 1.36339 -0.872869 -0.872871 2210 2211001 1.06666e-05 1.36339 -0.872869 -0.872871 2211 2212001 1.06347e-05 1.36339 -0.872869 -0.872871 2212 2213001 1.06029e-05 1.36279 -0.872868 -0.872871 2213 2214001 1.05712e-05 1.36279 -0.872868 -0.872871 2214 2215001 1.05396e-05 1.36279 -0.872868 -0.872871 2215 2216001 1.05081e-05 1.36304 -0.872871 -0.872871 2216 2217001 1.04766e-05 1.36337 -0.87287 -0.872871 2217 2218001 1.04453e-05 1.36337 -0.87287 -0.872871 2218 2219001 1.04141e-05 1.36374 -0.87286 -0.872871 2219 2220001 1.03829e-05 1.36374 -0.87286 -0.872871 2220 2221001 1.03519e-05 1.36371 -0.872861 -0.872871 2221 2222001 1.03209e-05 1.36273 -0.872867 -0.872871 2222 2223001 1.029e-05 1.36299 -0.872871 -0.872871 2223 2224001 1.02593e-05 1.36348 -0.872868 -0.872871 2224 2225001 1.02286e-05 1.36252 -0.87286 -0.872871 2225 2226001 1.0198e-05 1.36252 -0.87286 -0.872871 2226 2227001 1.01675e-05 1.36252 -0.87286 -0.872871 2227 2228001 1.01371e-05 1.36226 -0.872849 -0.872871 2228 2229001 1.01067e-05 1.36369 -0.872862 -0.872871 2229 2230001 1.00765e-05 1.36369 -0.872862 -0.872871 2230 2231001 1.00464e-05 1.36369 -0.872862 -0.872871 2231 2232001 1.00163e-05 1.36369 -0.872862 -0.872871 2232 2233001 9.98637e-06 1.36369 -0.872862 -0.872871 2233 2234001 9.9565e-06 1.3633 -0.87287 -0.872871 2234 2235001 9.92672e-06 1.3633 -0.87287 -0.872871 2235 2236001 9.89703e-06 1.36289 -0.87287 -0.872871 2236 2237001 9.86742e-06 1.36351 -0.872867 -0.872871 2237 2238001 9.83791e-06 1.36323 -0.872871 -0.872871 2238 2239001 9.80848e-06 1.36323 -0.872871 -0.872871 2239 2240001 9.77915e-06 1.36323 -0.872871 -0.872871 2240 2241001 9.7499e-06 1.36356 -0.872866 -0.872871 2241 2242001 9.72073e-06 1.36284 -0.872869 -0.872871 2242 2243001 9.69166e-06 1.36284 -0.872869 -0.872871 2243 2244001 9.66267e-06 1.36307 -0.872871 -0.872871 2244 2245001 9.63377e-06 1.36307 -0.872871 -0.872871 2245 2246001 9.60496e-06 1.36307 -0.872871 -0.872871 2246 2247001 9.57623e-06 1.36337 -0.87287 -0.872871 2247 2248001 9.54758e-06 1.36337 -0.87287 -0.872871 2248 2249001 9.51903e-06 1.36305 -0.872871 -0.872871 2249 2250001 9.49056e-06 1.36305 -0.872871 -0.872871 2250 2251001 9.46217e-06 1.36317 -0.872871 -0.872871 2251 2252001 9.43387e-06 1.36317 -0.872871 -0.872871 2252 2253001 9.40565e-06 1.36317 -0.872871 -0.872871 2253 2254001 9.37752e-06 1.36339 -0.872869 -0.872871 2254 2255001 9.34947e-06 1.36385 -0.872856 -0.872871 2255 2256001 9.3215e-06 1.36429 -0.872832 -0.872871 2256 2257001 9.29362e-06 1.36398 -0.87285 -0.872871 2257 2258001 9.26583e-06 1.36398 -0.87285 -0.872871 2258 2259001 9.23811e-06 1.36398 -0.87285 -0.872871 2259 2260001 9.21048e-06 1.36258 -0.872862 -0.872871 2260 2261001 9.18293e-06 1.36258 -0.872862 -0.872871 2261 2262001 9.15547e-06 1.36258 -0.872862 -0.872871 2262 2263001 9.12808e-06 1.3631 -0.872871 -0.872871 2263 2264001 9.10078e-06 1.36306 -0.872871 -0.872871 2264 2265001 9.07356e-06 1.36306 -0.872871 -0.872871 2265 2266001 9.04642e-06 1.36306 -0.872871 -0.872871 2266 2267001 9.01936e-06 1.36306 -0.872871 -0.872871 2267 2268001 8.99238e-06 1.36335 -0.87287 -0.872871 2268 2269001 8.96549e-06 1.36335 -0.87287 -0.872871 2269 2270001 8.93867e-06 1.36341 -0.872869 -0.872871 2270 2271001 8.91194e-06 1.36278 -0.872868 -0.872871 2271 2272001 8.88528e-06 1.36379 -0.872859 -0.872871 2272 2273001 8.8587e-06 1.36379 -0.872859 -0.872871 2273 2274001 8.83221e-06 1.36379 -0.872859 -0.872871 2274 2275001 8.80579e-06 1.3636 -0.872865 -0.872871 2275 2276001 8.77945e-06 1.36336 -0.87287 -0.872871 2276 2277001 8.75319e-06 1.36318 -0.872871 -0.872871 2277 2278001 8.72701e-06 1.36318 -0.872871 -0.872871 2278 2279001 8.70091e-06 1.36372 -0.872861 -0.872871 2279 2280001 8.67488e-06 1.36332 -0.87287 -0.872871 2280 2281001 8.64894e-06 1.36332 -0.87287 -0.872871 2281 2282001 8.62307e-06 1.36332 -0.87287 -0.872871 2282 2283001 8.59728e-06 1.36332 -0.87287 -0.872871 2283 2284001 8.57156e-06 1.36332 -0.87287 -0.872871 2284 2285001 8.54592e-06 1.36332 -0.87287 -0.872871 2285 2286001 8.52036e-06 1.36332 -0.87287 -0.872871 2286 2287001 8.49488e-06 1.36332 -0.87287 -0.872871 2287 2288001 8.46947e-06 1.36258 -0.872862 -0.872871 2288 2289001 8.44414e-06 1.36258 -0.872862 -0.872871 2289 2290001 8.41888e-06 1.36258 -0.872862 -0.872871 2290 2291001 8.3937e-06 1.36258 -0.872862 -0.872871 2291 2292001 8.36859e-06 1.36355 -0.872866 -0.872871 2292 2293001 8.34356e-06 1.36355 -0.872866 -0.872871 2293 2294001 8.31861e-06 1.36326 -0.872871 -0.872871 2294 2295001 8.29373e-06 1.36383 -0.872857 -0.872871 2295 2296001 8.26892e-06 1.36339 -0.872869 -0.872871 2296 2297001 8.24419e-06 1.36339 -0.872869 -0.872871 2297 2298001 8.21953e-06 1.36339 -0.872869 -0.872871 2298 2299001 8.19494e-06 1.3628 -0.872868 -0.872871 2299 2300001 8.17043e-06 1.36324 -0.872871 -0.872871 2300 2301001 8.14599e-06 1.36324 -0.872871 -0.872871 2301 2302001 8.12163e-06 1.36324 -0.872871 -0.872871 2302 2303001 8.09734e-06 1.36346 -0.872868 -0.872871 2303 2304001 8.07312e-06 1.36346 -0.872868 -0.872871 2304 2305001 8.04897e-06 1.36346 -0.872868 -0.872871 2305 2306001 8.0249e-06 1.36346 -0.872868 -0.872871 2306 2307001 8.00089e-06 1.36295 -0.87287 -0.872871 2307 2308001 7.97696e-06 1.36297 -0.87287 -0.872871 2308 2309001 7.9531e-06 1.36297 -0.87287 -0.872871 2309 2310001 7.92931e-06 1.36322 -0.872871 -0.872871 2310 2311001 7.9056e-06 1.36284 -0.872869 -0.872871 2311 2312001 7.88195e-06 1.36284 -0.872869 -0.872871 2312 2313001 7.85838e-06 1.36284 -0.872869 -0.872871 2313 2314001 7.83487e-06 1.36285 -0.872869 -0.872871 2314 2315001 7.81144e-06 1.36302 -0.872871 -0.872871 2315 2316001 7.78807e-06 1.36302 -0.872871 -0.872871 2316 2317001 7.76478e-06 1.3635 -0.872867 -0.872871 2317 2318001 7.74155e-06 1.3635 -0.872867 -0.872871 2318 2319001 7.7184e-06 1.3635 -0.872867 -0.872871 2319 2320001 7.69531e-06 1.3635 -0.872867 -0.872871 2320 2321001 7.6723e-06 1.3635 -0.872867 -0.872871 2321 2322001 7.64935e-06 1.3635 -0.872867 -0.872871 2322 2323001 7.62647e-06 1.36326 -0.872871 -0.872871 2323 2324001 7.60366e-06 1.36351 -0.872867 -0.872871 2324 2325001 7.58092e-06 1.36351 -0.872867 -0.872871 2325 2326001 7.55824e-06 1.36319 -0.872871 -0.872871 2326 2327001 7.53563e-06 1.36319 -0.872871 -0.872871 2327 2328001 7.51309e-06 1.36319 -0.872871 -0.872871 2328 2329001 7.49062e-06 1.36319 -0.872871 -0.872871 2329 2330001 7.46822e-06 1.36267 -0.872865 -0.872871 2330 2331001 7.44588e-06 1.36267 -0.872865 -0.872871 2331 2332001 7.42361e-06 1.36256 -0.872862 -0.872871 2332 2333001 7.40141e-06 1.36256 -0.872862 -0.872871 2333 2334001 7.37927e-06 1.36256 -0.872862 -0.872871 2334 2335001 7.3572e-06 1.36322 -0.872871 -0.872871 2335 2336001 7.33519e-06 1.36322 -0.872871 -0.872871 2336 2337001 7.31325e-06 1.36296 -0.87287 -0.872871 2337 2338001 7.29138e-06 1.36228 -0.87285 -0.872871 2338 2339001 7.26957e-06 1.36212 -0.872841 -0.872871 2339 2340001 7.24782e-06 1.36212 -0.872841 -0.872871 2340 2341001 7.22615e-06 1.36349 -0.872867 -0.872871 2341 2342001 7.20453e-06 1.36349 -0.872867 -0.872871 2342 2343001 7.18298e-06 1.36349 -0.872867 -0.872871 2343 2344001 7.1615e-06 1.36349 -0.872867 -0.872871 2344 2345001 7.14008e-06 1.36325 -0.872871 -0.872871 2345 2346001 7.11872e-06 1.36263 -0.872864 -0.872871 2346 2347001 7.09743e-06 1.36346 -0.872868 -0.872871 2347 2348001 7.0762e-06 1.36254 -0.872861 -0.872871 2348 2349001 7.05504e-06 1.36274 -0.872867 -0.872871 2349 2350001 7.03393e-06 1.363 -0.872871 -0.872871 2350 2351001 7.0129e-06 1.363 -0.872871 -0.872871 2351 2352001 6.99192e-06 1.363 -0.872871 -0.872871 2352 2353001 6.97101e-06 1.36302 -0.872871 -0.872871 2353 2354001 6.95016e-06 1.36312 -0.872871 -0.872871 2354 2355001 6.92937e-06 1.36312 -0.872871 -0.872871 2355 2356001 6.90864e-06 1.36312 -0.872871 -0.872871 2356 2357001 6.88798e-06 1.36294 -0.87287 -0.872871 2357 2358001 6.86738e-06 1.36294 -0.87287 -0.872871 2358 2359001 6.84684e-06 1.36295 -0.87287 -0.872871 2359 2360001 6.82636e-06 1.36295 -0.87287 -0.872871 2360 2361001 6.80594e-06 1.36295 -0.87287 -0.872871 2361 2362001 6.78558e-06 1.36295 -0.87287 -0.872871 2362 2363001 6.76529e-06 1.36295 -0.87287 -0.872871 2363 2364001 6.74505e-06 1.36295 -0.87287 -0.872871 2364 2365001 6.72488e-06 1.3627 -0.872866 -0.872871 2365 2366001 6.70476e-06 1.36351 -0.872867 -0.872871 2366 2367001 6.68471e-06 1.36302 -0.872871 -0.872871 2367 2368001 6.66471e-06 1.36302 -0.872871 -0.872871 2368 2369001 6.64478e-06 1.36302 -0.872871 -0.872871 2369 2370001 6.62491e-06 1.36302 -0.872871 -0.872871 2370 2371001 6.60509e-06 1.36302 -0.872871 -0.872871 2371 2372001 6.58533e-06 1.36306 -0.872871 -0.872871 2372 2373001 6.56564e-06 1.36306 -0.872871 -0.872871 2373 2374001 6.546e-06 1.36323 -0.872871 -0.872871 2374 2375001 6.52642e-06 1.36323 -0.872871 -0.872871 2375 2376001 6.5069e-06 1.36323 -0.872871 -0.872871 2376 2377001 6.48744e-06 1.36323 -0.872871 -0.872871 2377 2378001 6.46803e-06 1.36323 -0.872871 -0.872871 2378 2379001 6.44869e-06 1.36323 -0.872871 -0.872871 2379 2380001 6.4294e-06 1.36323 -0.872871 -0.872871 2380 2381001 6.41017e-06 1.36305 -0.872871 -0.872871 2381 2382001 6.39099e-06 1.36305 -0.872871 -0.872871 2382 2383001 6.37188e-06 1.36305 -0.872871 -0.872871 2383 2384001 6.35282e-06 1.36305 -0.872871 -0.872871 2384 2385001 6.33382e-06 1.36305 -0.872871 -0.872871 2385 2386001 6.31487e-06 1.36305 -0.872871 -0.872871 2386 2387001 6.29599e-06 1.36305 -0.872871 -0.872871 2387 2388001 6.27716e-06 1.36383 -0.872857 -0.872871 2388 2389001 6.25838e-06 1.36383 -0.872857 -0.872871 2389 2390001 6.23966e-06 1.3627 -0.872866 -0.872871 2390 2391001 6.221e-06 1.36353 -0.872867 -0.872871 2391 2392001 6.20239e-06 1.36353 -0.872867 -0.872871 2392 2393001 6.18384e-06 1.36353 -0.872867 -0.872871 2393 2394001 6.16534e-06 1.36353 -0.872867 -0.872871 2394 2395001 6.1469e-06 1.36353 -0.872867 -0.872871 2395 2396001 6.12852e-06 1.36349 -0.872867 -0.872871 2396 2397001 6.11019e-06 1.36305 -0.872871 -0.872871 2397 2398001 6.09191e-06 1.36305 -0.872871 -0.872871 2398 2399001 6.07369e-06 1.36305 -0.872871 -0.872871 2399 2400001 6.05552e-06 1.36323 -0.872871 -0.872871 2400 2401001 6.03741e-06 1.36323 -0.872871 -0.872871 2401 2402001 6.01935e-06 1.36323 -0.872871 -0.872871 2402 2403001 6.00135e-06 1.36311 -0.872871 -0.872871 2403 2404001 5.9834e-06 1.36311 -0.872871 -0.872871 2404 2405001 5.9655e-06 1.36311 -0.872871 -0.872871 2405 2406001 5.94766e-06 1.36311 -0.872871 -0.872871 2406 2407001 5.92987e-06 1.36318 -0.872871 -0.872871 2407 2408001 5.91213e-06 1.36318 -0.872871 -0.872871 2408 2409001 5.89445e-06 1.36351 -0.872867 -0.872871 2409 2410001 5.87682e-06 1.36265 -0.872865 -0.872871 2410 2411001 5.85924e-06 1.36265 -0.872865 -0.872871 2411 2412001 5.84172e-06 1.36299 -0.872871 -0.872871 2412 2413001 5.82424e-06 1.36299 -0.872871 -0.872871 2413 2414001 5.80682e-06 1.36299 -0.872871 -0.872871 2414 2415001 5.78945e-06 1.36299 -0.872871 -0.872871 2415 2416001 5.77214e-06 1.36299 -0.872871 -0.872871 2416 2417001 5.75487e-06 1.36328 -0.872871 -0.872871 2417 2418001 5.73766e-06 1.3629 -0.87287 -0.872871 2418 2419001 5.7205e-06 1.3629 -0.87287 -0.872871 2419 2420001 5.70339e-06 1.3627 -0.872866 -0.872871 2420 2421001 5.68633e-06 1.36367 -0.872863 -0.872871 2421 2422001 5.66932e-06 1.36367 -0.872863 -0.872871 2422 2423001 5.65237e-06 1.36367 -0.872863 -0.872871 2423 2424001 5.63546e-06 1.36277 -0.872867 -0.872871 2424 2425001 5.6186e-06 1.36277 -0.872867 -0.872871 2425 2426001 5.6018e-06 1.36311 -0.872871 -0.872871 2426 2427001 5.58504e-06 1.36311 -0.872871 -0.872871 2427 2428001 5.56834e-06 1.36366 -0.872863 -0.872871 2428 2429001 5.55168e-06 1.36295 -0.87287 -0.872871 2429 2430001 5.53508e-06 1.36295 -0.87287 -0.872871 2430 2431001 5.51852e-06 1.36295 -0.87287 -0.872871 2431 2432001 5.50202e-06 1.36319 -0.872871 -0.872871 2432 2433001 5.48556e-06 1.36319 -0.872871 -0.872871 2433 2434001 5.46915e-06 1.36312 -0.872871 -0.872871 2434 2435001 5.45279e-06 1.36243 -0.872857 -0.872871 2435 2436001 5.43648e-06 1.36268 -0.872865 -0.872871 2436 2437001 5.42022e-06 1.36329 -0.872871 -0.872871 2437 2438001 5.40401e-06 1.36292 -0.87287 -0.872871 2438 2439001 5.38785e-06 1.36261 -0.872863 -0.872871 2439 2440001 5.37173e-06 1.36261 -0.872863 -0.872871 2440 2441001 5.35567e-06 1.36261 -0.872863 -0.872871 2441 2442001 5.33965e-06 1.36319 -0.872871 -0.872871 2442 2443001 5.32368e-06 1.36319 -0.872871 -0.872871 2443 2444001 5.30775e-06 1.36319 -0.872871 -0.872871 2444 2445001 5.29188e-06 1.36267 -0.872865 -0.872871 2445 2446001 5.27605e-06 1.36272 -0.872866 -0.872871 2446 2447001 5.26027e-06 1.36297 -0.872871 -0.872871 2447 2448001 5.24453e-06 1.36297 -0.872871 -0.872871 2448 2449001 5.22885e-06 1.36322 -0.872871 -0.872871 2449 2450001 5.21321e-06 1.36322 -0.872871 -0.872871 2450 2451001 5.19761e-06 1.36322 -0.872871 -0.872871 2451 2452001 5.18207e-06 1.36322 -0.872871 -0.872871 2452 2453001 5.16657e-06 1.36322 -0.872871 -0.872871 2453 2454001 5.15112e-06 1.36316 -0.872871 -0.872871 2454 2455001 5.13571e-06 1.36294 -0.87287 -0.872871 2455 2456001 5.12035e-06 1.36323 -0.872871 -0.872871 2456 2457001 5.10503e-06 1.36293 -0.87287 -0.872871 2457 2458001 5.08976e-06 1.36293 -0.87287 -0.872871 2458 2459001 5.07454e-06 1.36288 -0.872869 -0.872871 2459 2460001 5.05936e-06 1.36288 -0.872869 -0.872871 2460 2461001 5.04423e-06 1.36288 -0.872869 -0.872871 2461 2462001 5.02914e-06 1.36288 -0.872869 -0.872871 2462 2463001 5.0141e-06 1.36319 -0.872871 -0.872871 2463 2464001 4.9991e-06 1.36331 -0.87287 -0.872871 2464 2465001 4.98415e-06 1.36331 -0.87287 -0.872871 2465 2466001 4.96924e-06 1.36331 -0.87287 -0.872871 2466 2467001 4.95438e-06 1.36285 -0.872869 -0.872871 2467 2468001 4.93956e-06 1.36341 -0.872869 -0.872871 2468 2469001 4.92479e-06 1.36341 -0.872869 -0.872871 2469 2470001 4.91006e-06 1.36341 -0.872869 -0.872871 2470 2471001 4.89537e-06 1.3631 -0.872871 -0.872871 2471 2472001 4.88073e-06 1.36282 -0.872868 -0.872871 2472 2473001 4.86613e-06 1.36282 -0.872868 -0.872871 2473 2474001 4.85157e-06 1.36295 -0.87287 -0.872871 2474 2475001 4.83706e-06 1.36315 -0.872871 -0.872871 2475 2476001 4.82259e-06 1.36315 -0.872871 -0.872871 2476 2477001 4.80817e-06 1.36315 -0.872871 -0.872871 2477 2478001 4.79379e-06 1.36315 -0.872871 -0.872871 2478 2479001 4.77945e-06 1.36315 -0.872871 -0.872871 2479 2480001 4.76515e-06 1.36322 -0.872871 -0.872871 2480 2481001 4.7509e-06 1.36322 -0.872871 -0.872871 2481 2482001 4.73669e-06 1.36322 -0.872871 -0.872871 2482 2483001 4.72252e-06 1.36313 -0.872871 -0.872871 2483 2484001 4.7084e-06 1.36355 -0.872866 -0.872871 2484 2485001 4.69432e-06 1.36355 -0.872866 -0.872871 2485 2486001 4.68028e-06 1.36355 -0.872866 -0.872871 2486 2487001 4.66628e-06 1.36278 -0.872868 -0.872871 2487 2488001 4.65232e-06 1.36311 -0.872871 -0.872871 2488 2489001 4.6384e-06 1.36288 -0.872869 -0.872871 2489 2490001 4.62453e-06 1.36288 -0.872869 -0.872871 2490 2491001 4.6107e-06 1.36288 -0.872869 -0.872871 2491 2492001 4.59691e-06 1.36288 -0.872869 -0.872871 2492 2493001 4.58316e-06 1.36288 -0.872869 -0.872871 2493 2494001 4.56945e-06 1.36288 -0.872869 -0.872871 2494 2495001 4.55578e-06 1.36361 -0.872864 -0.872871 2495 2496001 4.54216e-06 1.36361 -0.872864 -0.872871 2496 2497001 4.52857e-06 1.36361 -0.872864 -0.872871 2497 2498001 4.51503e-06 1.36336 -0.87287 -0.872871 2498 2499001 4.50152e-06 1.36337 -0.87287 -0.872871 2499 2500001 4.48806e-06 1.36337 -0.87287 -0.872871 2500 2501001 4.47463e-06 1.36337 -0.87287 -0.872871 2501 2502001 4.46125e-06 1.36337 -0.87287 -0.872871 2502 2503001 4.44791e-06 1.36337 -0.87287 -0.872871 2503 2504001 4.4346e-06 1.36337 -0.87287 -0.872871 2504 2505001 4.42134e-06 1.36337 -0.87287 -0.872871 2505 2506001 4.40811e-06 1.36337 -0.87287 -0.872871 2506 2507001 4.39493e-06 1.36337 -0.87287 -0.872871 2507 2508001 4.38178e-06 1.36337 -0.87287 -0.872871 2508 2509001 4.36868e-06 1.36288 -0.872869 -0.872871 2509 2510001 4.35561e-06 1.36288 -0.872869 -0.872871 2510 2511001 4.34258e-06 1.36288 -0.872869 -0.872871 2511 2512001 4.32959e-06 1.36288 -0.872869 -0.872871 2512 2513001 4.31664e-06 1.36323 -0.872871 -0.872871 2513 2514001 4.30373e-06 1.36323 -0.872871 -0.872871 2514 2515001 4.29086e-06 1.36323 -0.872871 -0.872871 2515 2516001 4.27803e-06 1.36337 -0.87287 -0.872871 2516 2517001 4.26523e-06 1.36337 -0.87287 -0.872871 2517 2518001 4.25247e-06 1.36322 -0.872871 -0.872871 2518 2519001 4.23975e-06 1.36332 -0.87287 -0.872871 2519 2520001 4.22707e-06 1.36332 -0.87287 -0.872871 2520 2521001 4.21443e-06 1.36357 -0.872866 -0.872871 2521 2522001 4.20182e-06 1.36357 -0.872866 -0.872871 2522 2523001 4.18926e-06 1.36357 -0.872866 -0.872871 2523 2524001 4.17673e-06 1.36357 -0.872866 -0.872871 2524 2525001 4.16423e-06 1.36292 -0.87287 -0.872871 2525 2526001 4.15178e-06 1.36311 -0.872871 -0.872871 2526 2527001 4.13936e-06 1.36342 -0.872869 -0.872871 2527 2528001 4.12698e-06 1.36342 -0.872869 -0.872871 2528 2529001 4.11463e-06 1.36342 -0.872869 -0.872871 2529 2530001 4.10233e-06 1.36342 -0.872869 -0.872871 2530 2531001 4.09006e-06 1.36342 -0.872869 -0.872871 2531 2532001 4.07782e-06 1.36342 -0.872869 -0.872871 2532 2533001 4.06563e-06 1.36348 -0.872868 -0.872871 2533 2534001 4.05347e-06 1.36293 -0.87287 -0.872871 2534 2535001 4.04134e-06 1.36293 -0.87287 -0.872871 2535 2536001 4.02926e-06 1.36293 -0.87287 -0.872871 2536 2537001 4.0172e-06 1.36293 -0.87287 -0.872871 2537 2538001 4.00519e-06 1.36342 -0.872869 -0.872871 2538 2539001 3.99321e-06 1.36342 -0.872869 -0.872871 2539 2540001 3.98126e-06 1.36342 -0.872869 -0.872871 2540 2541001 3.96936e-06 1.36342 -0.872869 -0.872871 2541 2542001 3.95748e-06 1.36342 -0.872869 -0.872871 2542 2543001 3.94565e-06 1.36342 -0.872869 -0.872871 2543 2544001 3.93385e-06 1.36342 -0.872869 -0.872871 2544 2545001 3.92208e-06 1.36351 -0.872867 -0.872871 2545 2546001 3.91035e-06 1.36351 -0.872867 -0.872871 2546 2547001 3.89865e-06 1.36351 -0.872867 -0.872871 2547 2548001 3.88699e-06 1.36351 -0.872867 -0.872871 2548 2549001 3.87537e-06 1.36351 -0.872867 -0.872871 2549 2550001 3.86377e-06 1.3627 -0.872866 -0.872871 2550 2551001 3.85222e-06 1.3627 -0.872866 -0.872871 2551 2552001 3.8407e-06 1.36323 -0.872871 -0.872871 2552 2553001 3.82921e-06 1.36327 -0.872871 -0.872871 2553 2554001 3.81775e-06 1.36327 -0.872871 -0.872871 2554 2555001 3.80634e-06 1.36327 -0.872871 -0.872871 2555 2556001 3.79495e-06 1.36327 -0.872871 -0.872871 2556 2557001 3.7836e-06 1.36327 -0.872871 -0.872871 2557 2558001 3.77228e-06 1.36327 -0.872871 -0.872871 2558 2559001 3.761e-06 1.36322 -0.872871 -0.872871 2559 2560001 3.74975e-06 1.36322 -0.872871 -0.872871 2560 2561001 3.73854e-06 1.36286 -0.872869 -0.872871 2561 2562001 3.72735e-06 1.36286 -0.872869 -0.872871 2562 2563001 3.7162e-06 1.36286 -0.872869 -0.872871 2563 2564001 3.70509e-06 1.36286 -0.872869 -0.872871 2564 2565001 3.69401e-06 1.36286 -0.872869 -0.872871 2565 2566001 3.68296e-06 1.36286 -0.872869 -0.872871 2566 2567001 3.67194e-06 1.36286 -0.872869 -0.872871 2567 2568001 3.66096e-06 1.36286 -0.872869 -0.872871 2568 2569001 3.65001e-06 1.36286 -0.872869 -0.872871 2569 2570001 3.63909e-06 1.36286 -0.872869 -0.872871 2570 2571001 3.62821e-06 1.36286 -0.872869 -0.872871 2571 2572001 3.61736e-06 1.36286 -0.872869 -0.872871 2572 2573001 3.60654e-06 1.36286 -0.872869 -0.872871 2573 2574001 3.59575e-06 1.36286 -0.872869 -0.872871 2574 2575001 3.58499e-06 1.36306 -0.872871 -0.872871 2575 2576001 3.57427e-06 1.36311 -0.872871 -0.872871 2576 2577001 3.56358e-06 1.36311 -0.872871 -0.872871 2577 2578001 3.55292e-06 1.36311 -0.872871 -0.872871 2578 2579001 3.54229e-06 1.36311 -0.872871 -0.872871 2579 2580001 3.5317e-06 1.36311 -0.872871 -0.872871 2580 2581001 3.52114e-06 1.36311 -0.872871 -0.872871 2581 2582001 3.5106e-06 1.36311 -0.872871 -0.872871 2582 2583001 3.5001e-06 1.36311 -0.872871 -0.872871 2583 2584001 3.48963e-06 1.36311 -0.872871 -0.872871 2584 2585001 3.4792e-06 1.36342 -0.872869 -0.872871 2585 2586001 3.46879e-06 1.36342 -0.872869 -0.872871 2586 2587001 3.45842e-06 1.36342 -0.872869 -0.872871 2587 2588001 3.44807e-06 1.36336 -0.87287 -0.872871 2588 2589001 3.43776e-06 1.3631 -0.872871 -0.872871 2589 2590001 3.42748e-06 1.3631 -0.872871 -0.872871 2590 2591001 3.41722e-06 1.3631 -0.872871 -0.872871 2591 2592001 3.407e-06 1.3631 -0.872871 -0.872871 2592 2593001 3.39681e-06 1.3631 -0.872871 -0.872871 2593 2594001 3.38665e-06 1.36282 -0.872868 -0.872871 2594 2595001 3.37652e-06 1.36282 -0.872868 -0.872871 2595 2596001 3.36642e-06 1.36282 -0.872868 -0.872871 2596 2597001 3.35635e-06 1.36282 -0.872868 -0.872871 2597 2598001 3.34632e-06 1.36282 -0.872868 -0.872871 2598 2599001 3.33631e-06 1.36282 -0.872868 -0.872871 2599 2600001 3.32633e-06 1.36282 -0.872868 -0.872871 2600 2601001 3.31638e-06 1.36337 -0.872869 -0.872871 2601 2602001 3.30646e-06 1.36337 -0.872869 -0.872871 2602 2603001 3.29657e-06 1.36337 -0.872869 -0.872871 2603 2604001 3.28671e-06 1.36337 -0.872869 -0.872871 2604 2605001 3.27688e-06 1.36337 -0.872869 -0.872871 2605 2606001 3.26708e-06 1.36337 -0.872869 -0.872871 2606 2607001 3.25731e-06 1.36337 -0.872869 -0.872871 2607 2608001 3.24756e-06 1.36337 -0.872869 -0.872871 2608 2609001 3.23785e-06 1.36337 -0.872869 -0.872871 2609 2610001 3.22817e-06 1.36337 -0.872869 -0.872871 2610 2611001 3.21851e-06 1.36279 -0.872868 -0.872871 2611 2612001 3.20888e-06 1.3633 -0.87287 -0.872871 2612 2613001 3.19929e-06 1.3633 -0.87287 -0.872871 2613 2614001 3.18972e-06 1.3633 -0.87287 -0.872871 2614 2615001 3.18018e-06 1.36287 -0.872869 -0.872871 2615 2616001 3.17066e-06 1.36322 -0.872871 -0.872871 2616 2617001 3.16118e-06 1.36309 -0.872871 -0.872871 2617 2618001 3.15172e-06 1.36309 -0.872871 -0.872871 2618 2619001 3.1423e-06 1.36309 -0.872871 -0.872871 2619 2620001 3.1329e-06 1.36309 -0.872871 -0.872871 2620 2621001 3.12353e-06 1.36309 -0.872871 -0.872871 2621 2622001 3.11419e-06 1.36309 -0.872871 -0.872871 2622 2623001 3.10487e-06 1.36309 -0.872871 -0.872871 2623 2624001 3.09558e-06 1.36309 -0.872871 -0.872871 2624 2625001 3.08633e-06 1.36309 -0.872871 -0.872871 2625 2626001 3.07709e-06 1.36309 -0.872871 -0.872871 2626 2627001 3.06789e-06 1.36309 -0.872871 -0.872871 2627 2628001 3.05871e-06 1.36309 -0.872871 -0.872871 2628 2629001 3.04957e-06 1.36309 -0.872871 -0.872871 2629 2630001 3.04044e-06 1.36309 -0.872871 -0.872871 2630 2631001 3.03135e-06 1.36309 -0.872871 -0.872871 2631 2632001 3.02228e-06 1.36309 -0.872871 -0.872871 2632 2633001 3.01324e-06 1.36309 -0.872871 -0.872871 2633 2634001 3.00423e-06 1.36309 -0.872871 -0.872871 2634 2635001 2.99525e-06 1.36309 -0.872871 -0.872871 2635 2636001 2.98629e-06 1.36309 -0.872871 -0.872871 2636 2637001 2.97735e-06 1.36309 -0.872871 -0.872871 2637 2638001 2.96845e-06 1.36309 -0.872871 -0.872871 2638 2639001 2.95957e-06 1.36309 -0.872871 -0.872871 2639 2640001 2.95072e-06 1.36311 -0.872871 -0.872871 2640 2641001 2.94189e-06 1.36311 -0.872871 -0.872871 2641 2642001 2.93309e-06 1.36311 -0.872871 -0.872871 2642 2643001 2.92432e-06 1.36299 -0.872871 -0.872871 2643 2644001 2.91557e-06 1.36299 -0.872871 -0.872871 2644 2645001 2.90685e-06 1.36299 -0.872871 -0.872871 2645 2646001 2.89816e-06 1.36299 -0.872871 -0.872871 2646 2647001 2.88949e-06 1.36299 -0.872871 -0.872871 2647 2648001 2.88085e-06 1.36328 -0.872871 -0.872871 2648 2649001 2.87223e-06 1.36328 -0.872871 -0.872871 2649 2650001 2.86364e-06 1.36328 -0.872871 -0.872871 2650 2651001 2.85507e-06 1.36356 -0.872866 -0.872871 2651 2652001 2.84654e-06 1.36356 -0.872866 -0.872871 2652 2653001 2.83802e-06 1.36356 -0.872866 -0.872871 2653 2654001 2.82953e-06 1.36356 -0.872866 -0.872871 2654 2655001 2.82107e-06 1.36345 -0.872868 -0.872871 2655 2656001 2.81263e-06 1.36345 -0.872868 -0.872871 2656 2657001 2.80422e-06 1.36345 -0.872868 -0.872871 2657 2658001 2.79583e-06 1.36345 -0.872868 -0.872871 2658 2659001 2.78747e-06 1.36345 -0.872868 -0.872871 2659 2660001 2.77913e-06 1.36296 -0.87287 -0.872871 2660 2661001 2.77082e-06 1.36296 -0.87287 -0.872871 2661 2662001 2.76253e-06 1.36289 -0.872869 -0.872871 2662 2663001 2.75427e-06 1.36289 -0.872869 -0.872871 2663 2664001 2.74603e-06 1.36289 -0.872869 -0.872871 2664 2665001 2.73782e-06 1.36289 -0.872869 -0.872871 2665 2666001 2.72963e-06 1.36289 -0.872869 -0.872871 2666 2667001 2.72146e-06 1.36306 -0.872871 -0.872871 2667 2668001 2.71332e-06 1.363 -0.872871 -0.872871 2668 2669001 2.70521e-06 1.36303 -0.872871 -0.872871 2669 2670001 2.69712e-06 1.36303 -0.872871 -0.872871 2670 2671001 2.68905e-06 1.36315 -0.872871 -0.872871 2671 2672001 2.68101e-06 1.36315 -0.872871 -0.872871 2672 2673001 2.67299e-06 1.36314 -0.872871 -0.872871 2673 2674001 2.66499e-06 1.36314 -0.872871 -0.872871 2674 2675001 2.65702e-06 1.36293 -0.87287 -0.872871 2675 2676001 2.64907e-06 1.36348 -0.872868 -0.872871 2676 2677001 2.64115e-06 1.36348 -0.872868 -0.872871 2677 2678001 2.63325e-06 1.36305 -0.872871 -0.872871 2678 2679001 2.62538e-06 1.36305 -0.872871 -0.872871 2679 2680001 2.61752e-06 1.36305 -0.872871 -0.872871 2680 2681001 2.60969e-06 1.36305 -0.872871 -0.872871 2681 2682001 2.60189e-06 1.36326 -0.872871 -0.872871 2682 2683001 2.59411e-06 1.36358 -0.872865 -0.872871 2683 2684001 2.58635e-06 1.36358 -0.872865 -0.872871 2684 2685001 2.57861e-06 1.36266 -0.872865 -0.872871 2685 2686001 2.5709e-06 1.36266 -0.872865 -0.872871 2686 2687001 2.56321e-06 1.36266 -0.872865 -0.872871 2687 2688001 2.55554e-06 1.36317 -0.872871 -0.872871 2688 2689001 2.5479e-06 1.36317 -0.872871 -0.872871 2689 2690001 2.54028e-06 1.36317 -0.872871 -0.872871 2690 2691001 2.53268e-06 1.36317 -0.872871 -0.872871 2691 2692001 2.5251e-06 1.36317 -0.872871 -0.872871 2692 2693001 2.51755e-06 1.36317 -0.872871 -0.872871 2693 2694001 2.51002e-06 1.36317 -0.872871 -0.872871 2694 2695001 2.50251e-06 1.36317 -0.872871 -0.872871 2695 2696001 2.49503e-06 1.36317 -0.872871 -0.872871 2696 2697001 2.48757e-06 1.36317 -0.872871 -0.872871 2697 2698001 2.48013e-06 1.36294 -0.87287 -0.872871 2698 2699001 2.47271e-06 1.36322 -0.872871 -0.872871 2699 2700001 2.46531e-06 1.36322 -0.872871 -0.872871 2700 2701001 2.45794e-06 1.36322 -0.872871 -0.872871 2701 2702001 2.45059e-06 1.36322 -0.872871 -0.872871 2702 2703001 2.44326e-06 1.36322 -0.872871 -0.872871 2703 2704001 2.43595e-06 1.36322 -0.872871 -0.872871 2704 2705001 2.42866e-06 1.36322 -0.872871 -0.872871 2705 2706001 2.4214e-06 1.36301 -0.872871 -0.872871 2706 2707001 2.41416e-06 1.36301 -0.872871 -0.872871 2707 2708001 2.40693e-06 1.36301 -0.872871 -0.872871 2708 2709001 2.39974e-06 1.36301 -0.872871 -0.872871 2709 2710001 2.39256e-06 1.36328 -0.872871 -0.872871 2710 2711001 2.3854e-06 1.36298 -0.872871 -0.872871 2711 2712001 2.37827e-06 1.36298 -0.872871 -0.872871 2712 2713001 2.37115e-06 1.36298 -0.872871 -0.872871 2713 2714001 2.36406e-06 1.36298 -0.872871 -0.872871 2714 2715001 2.35699e-06 1.36298 -0.872871 -0.872871 2715 2716001 2.34994e-06 1.36298 -0.872871 -0.872871 2716 2717001 2.34291e-06 1.36298 -0.872871 -0.872871 2717 2718001 2.3359e-06 1.36291 -0.87287 -0.872871 2718 2719001 2.32892e-06 1.36308 -0.872871 -0.872871 2719 2720001 2.32195e-06 1.36327 -0.872871 -0.872871 2720 2721001 2.31501e-06 1.36327 -0.872871 -0.872871 2721 2722001 2.30808e-06 1.36327 -0.872871 -0.872871 2722 2723001 2.30118e-06 1.36336 -0.87287 -0.872871 2723 2724001 2.2943e-06 1.36337 -0.87287 -0.872871 2724 2725001 2.28743e-06 1.36309 -0.872871 -0.872871 2725 2726001 2.28059e-06 1.36309 -0.872871 -0.872871 2726 2727001 2.27377e-06 1.36324 -0.872871 -0.872871 2727 2728001 2.26697e-06 1.36324 -0.872871 -0.872871 2728 2729001 2.26019e-06 1.36268 -0.872865 -0.872871 2729 2730001 2.25343e-06 1.36305 -0.872871 -0.872871 2730 2731001 2.24669e-06 1.36305 -0.872871 -0.872871 2731 2732001 2.23997e-06 1.36305 -0.872871 -0.872871 2732 2733001 2.23327e-06 1.36305 -0.872871 -0.872871 2733 2734001 2.22659e-06 1.36305 -0.872871 -0.872871 2734 2735001 2.21993e-06 1.36305 -0.872871 -0.872871 2735 2736001 2.21329e-06 1.36305 -0.872871 -0.872871 2736 2737001 2.20667e-06 1.36323 -0.872871 -0.872871 2737 2738001 2.20007e-06 1.36323 -0.872871 -0.872871 2738 2739001 2.19349e-06 1.36323 -0.872871 -0.872871 2739 2740001 2.18693e-06 1.36294 -0.87287 -0.872871 2740 2741001 2.18039e-06 1.36294 -0.87287 -0.872871 2741 2742001 2.17387e-06 1.36294 -0.87287 -0.872871 2742 2743001 2.16736e-06 1.36294 -0.87287 -0.872871 2743 2744001 2.16088e-06 1.3629 -0.87287 -0.872871 2744 2745001 2.15442e-06 1.36279 -0.872868 -0.872871 2745 2746001 2.14797e-06 1.36279 -0.872868 -0.872871 2746 2747001 2.14155e-06 1.36281 -0.872868 -0.872871 2747 2748001 2.13514e-06 1.36281 -0.872868 -0.872871 2748 2749001 2.12876e-06 1.36281 -0.872868 -0.872871 2749 2750001 2.12239e-06 1.36281 -0.872868 -0.872871 2750 2751001 2.11604e-06 1.36281 -0.872868 -0.872871 2751 2752001 2.10971e-06 1.36281 -0.872868 -0.872871 2752 2753001 2.1034e-06 1.36286 -0.872869 -0.872871 2753 2754001 2.09711e-06 1.36286 -0.872869 -0.872871 2754 2755001 2.09084e-06 1.36286 -0.872869 -0.872871 2755 2756001 2.08458e-06 1.36309 -0.872871 -0.872871 2756 2757001 2.07835e-06 1.36309 -0.872871 -0.872871 2757 2758001 2.07213e-06 1.36338 -0.872869 -0.872871 2758 2759001 2.06594e-06 1.36344 -0.872868 -0.872871 2759 2760001 2.05976e-06 1.36317 -0.872871 -0.872871 2760 2761001 2.0536e-06 1.36317 -0.872871 -0.872871 2761 2762001 2.04745e-06 1.36326 -0.872871 -0.872871 2762 2763001 2.04133e-06 1.36326 -0.872871 -0.872871 2763 2764001 2.03522e-06 1.36317 -0.872871 -0.872871 2764 2765001 2.02914e-06 1.36317 -0.872871 -0.872871 2765 2766001 2.02307e-06 1.36317 -0.872871 -0.872871 2766 2767001 2.01702e-06 1.36328 -0.872871 -0.872871 2767 2768001 2.01098e-06 1.36323 -0.872871 -0.872871 2768 2769001 2.00497e-06 1.36323 -0.872871 -0.872871 gsl-doc-2.3/doc/examples/cheb.txt0000664000175000017500000110336212620430016015007 0ustar eddedd0 0.25 0.228925 0.256331 0.0001 0.25 0.229373 0.25432 0.0002 0.25 0.229818 0.252531 0.0003 0.25 0.23026 0.250949 0.0004 0.25 0.230698 0.249561 0.0005 0.25 0.231134 0.248353 0.0006 0.25 0.231567 0.247312 0.0007 0.25 0.231997 0.246425 0.0008 0.25 0.232423 0.245683 0.0009 0.25 0.232847 0.245073 0.001 0.25 0.233268 0.244585 0.0011 0.25 0.233686 0.24421 0.0012 0.25 0.234101 0.243938 0.0013 0.25 0.234513 0.24376 0.0014 0.25 0.234922 0.243667 0.0015 0.25 0.235328 0.243653 0.0016 0.25 0.235731 0.243709 0.0017 0.25 0.236132 0.243829 0.0018 0.25 0.236529 0.244006 0.0019 0.25 0.236924 0.244233 0.002 0.25 0.237316 0.244505 0.0021 0.25 0.237705 0.244815 0.0022 0.25 0.238091 0.24516 0.0023 0.25 0.238474 0.245534 0.0024 0.25 0.238855 0.245932 0.0025 0.25 0.239232 0.246351 0.0026 0.25 0.239607 0.246786 0.0027 0.25 0.23998 0.247233 0.0028 0.25 0.240349 0.247689 0.0029 0.25 0.240716 0.248152 0.003 0.25 0.24108 0.248617 0.0031 0.25 0.241441 0.249083 0.0032 0.25 0.2418 0.249546 0.0033 0.25 0.242155 0.250005 0.0034 0.25 0.242509 0.250457 0.0035 0.25 0.242859 0.2509 0.0036 0.25 0.243207 0.251333 0.0037 0.25 0.243552 0.251754 0.0038 0.25 0.243894 0.252162 0.0039 0.25 0.244234 0.252555 0.004 0.25 0.244571 0.252932 0.0041 0.25 0.244906 0.253293 0.0042 0.25 0.245238 0.253635 0.0043 0.25 0.245567 0.25396 0.0044 0.25 0.245894 0.254265 0.0045 0.25 0.246218 0.254551 0.0046 0.25 0.24654 0.254816 0.0047 0.25 0.246859 0.255062 0.0048 0.25 0.247176 0.255287 0.0049 0.25 0.24749 0.255491 0.005 0.25 0.247801 0.255674 0.0051 0.25 0.24811 0.255837 0.0052 0.25 0.248417 0.255978 0.0053 0.25 0.248721 0.2561 0.0054 0.25 0.249022 0.2562 0.0055 0.25 0.249321 0.256281 0.0056 0.25 0.249618 0.256342 0.0057 0.25 0.249912 0.256383 0.0058 0.25 0.250204 0.256405 0.0059 0.25 0.250493 0.256408 0.006 0.25 0.25078 0.256393 0.0061 0.25 0.251064 0.25636 0.0062 0.25 0.251346 0.25631 0.0063 0.25 0.251626 0.256243 0.0064 0.25 0.251903 0.256159 0.0065 0.25 0.252178 0.256061 0.0066 0.25 0.252451 0.255947 0.0067 0.25 0.252721 0.255819 0.0068 0.25 0.252989 0.255677 0.0069 0.25 0.253254 0.255522 0.007 0.25 0.253517 0.255354 0.0071 0.25 0.253778 0.255175 0.0072 0.25 0.254037 0.254985 0.0073 0.25 0.254293 0.254784 0.0074 0.25 0.254547 0.254573 0.0075 0.25 0.254799 0.254354 0.0076 0.25 0.255048 0.254126 0.0077 0.25 0.255296 0.25389 0.0078 0.25 0.255541 0.253647 0.0079 0.25 0.255783 0.253397 0.008 0.25 0.256024 0.253142 0.0081 0.25 0.256262 0.252882 0.0082 0.25 0.256498 0.252617 0.0083 0.25 0.256732 0.252348 0.0084 0.25 0.256964 0.252076 0.0085 0.25 0.257194 0.251801 0.0086 0.25 0.257421 0.251524 0.0087 0.25 0.257646 0.251245 0.0088 0.25 0.257869 0.250966 0.0089 0.25 0.25809 0.250686 0.009 0.25 0.258309 0.250407 0.0091 0.25 0.258526 0.250128 0.0092 0.25 0.25874 0.24985 0.0093 0.25 0.258953 0.249573 0.0094 0.25 0.259163 0.249299 0.0095 0.25 0.259371 0.249028 0.0096 0.25 0.259578 0.248759 0.0097 0.25 0.259782 0.248494 0.0098 0.25 0.259984 0.248233 0.0099 0.25 0.260184 0.247976 0.01 0.25 0.260382 0.247724 0.0101 0.25 0.260578 0.247477 0.0102 0.25 0.260772 0.247235 0.0103 0.25 0.260964 0.246999 0.0104 0.25 0.261154 0.246768 0.0105 0.25 0.261342 0.246544 0.0106 0.25 0.261528 0.246327 0.0107 0.25 0.261712 0.246116 0.0108 0.25 0.261894 0.245912 0.0109 0.25 0.262074 0.245716 0.011 0.25 0.262253 0.245527 0.0111 0.25 0.262429 0.245346 0.0112 0.25 0.262603 0.245172 0.0113 0.25 0.262775 0.245007 0.0114 0.25 0.262946 0.244849 0.0115 0.25 0.263114 0.2447 0.0116 0.25 0.263281 0.24456 0.0117 0.25 0.263446 0.244427 0.0118 0.25 0.263609 0.244304 0.0119 0.25 0.26377 0.244189 0.012 0.25 0.263929 0.244083 0.0121 0.25 0.264086 0.243985 0.0122 0.25 0.264242 0.243896 0.0123 0.25 0.264396 0.243817 0.0124 0.25 0.264547 0.243746 0.0125 0.25 0.264697 0.243683 0.0126 0.25 0.264846 0.24363 0.0127 0.25 0.264992 0.243585 0.0128 0.25 0.265137 0.243549 0.0129 0.25 0.26528 0.243522 0.013 0.25 0.265421 0.243504 0.0131 0.25 0.26556 0.243493 0.0132 0.25 0.265697 0.243492 0.0133 0.25 0.265833 0.243499 0.0134 0.25 0.265967 0.243514 0.0135 0.25 0.2661 0.243537 0.0136 0.25 0.26623 0.243568 0.0137 0.25 0.266359 0.243608 0.0138 0.25 0.266486 0.243655 0.0139 0.25 0.266612 0.243709 0.014 0.25 0.266735 0.243772 0.0141 0.25 0.266857 0.243841 0.0142 0.25 0.266978 0.243918 0.0143 0.25 0.267097 0.244002 0.0144 0.25 0.267214 0.244093 0.0145 0.25 0.267329 0.244191 0.0146 0.25 0.267443 0.244295 0.0147 0.25 0.267555 0.244405 0.0148 0.25 0.267666 0.244522 0.0149 0.25 0.267774 0.244644 0.015 0.25 0.267882 0.244772 0.0151 0.25 0.267987 0.244906 0.0152 0.25 0.268092 0.245045 0.0153 0.25 0.268194 0.24519 0.0154 0.25 0.268295 0.245339 0.0155 0.25 0.268394 0.245493 0.0156 0.25 0.268492 0.245652 0.0157 0.25 0.268588 0.245815 0.0158 0.25 0.268683 0.245982 0.0159 0.25 0.268776 0.246153 0.016 0.25 0.268868 0.246327 0.0161 0.25 0.268958 0.246505 0.0162 0.25 0.269046 0.246687 0.0163 0.25 0.269133 0.246871 0.0164 0.25 0.269219 0.247058 0.0165 0.25 0.269303 0.247248 0.0166 0.25 0.269386 0.24744 0.0167 0.25 0.269467 0.247634 0.0168 0.25 0.269546 0.24783 0.0169 0.25 0.269624 0.248028 0.017 0.25 0.269701 0.248227 0.0171 0.25 0.269776 0.248428 0.0172 0.25 0.26985 0.248629 0.0173 0.25 0.269922 0.248832 0.0174 0.25 0.269993 0.249035 0.0175 0.25 0.270063 0.249239 0.0176 0.25 0.270131 0.249443 0.0177 0.25 0.270198 0.249647 0.0178 0.25 0.270263 0.249851 0.0179 0.25 0.270327 0.250054 0.018 0.25 0.270389 0.250257 0.0181 0.25 0.27045 0.25046 0.0182 0.25 0.27051 0.250661 0.0183 0.25 0.270568 0.250862 0.0184 0.25 0.270625 0.251061 0.0185 0.25 0.270681 0.251258 0.0186 0.25 0.270735 0.251454 0.0187 0.25 0.270788 0.251649 0.0188 0.25 0.27084 0.251841 0.0189 0.25 0.27089 0.252031 0.019 0.25 0.27094 0.252219 0.0191 0.25 0.270987 0.252405 0.0192 0.25 0.271034 0.252588 0.0193 0.25 0.271079 0.252768 0.0194 0.25 0.271123 0.252946 0.0195 0.25 0.271165 0.25312 0.0196 0.25 0.271207 0.253292 0.0197 0.25 0.271247 0.25346 0.0198 0.25 0.271285 0.253625 0.0199 0.25 0.271323 0.253786 0.02 0.25 0.271359 0.253944 0.0201 0.25 0.271394 0.254098 0.0202 0.25 0.271428 0.254249 0.0203 0.25 0.271461 0.254395 0.0204 0.25 0.271492 0.254538 0.0205 0.25 0.271522 0.254676 0.0206 0.25 0.271551 0.25481 0.0207 0.25 0.271579 0.25494 0.0208 0.25 0.271605 0.255066 0.0209 0.25 0.271631 0.255187 0.021 0.25 0.271655 0.255303 0.0211 0.25 0.271678 0.255416 0.0212 0.25 0.2717 0.255523 0.0213 0.25 0.271721 0.255626 0.0214 0.25 0.27174 0.255724 0.0215 0.25 0.271759 0.255817 0.0216 0.25 0.271776 0.255906 0.0217 0.25 0.271792 0.25599 0.0218 0.25 0.271807 0.256068 0.0219 0.25 0.271821 0.256142 0.022 0.25 0.271834 0.256211 0.0221 0.25 0.271846 0.256275 0.0222 0.25 0.271856 0.256334 0.0223 0.25 0.271866 0.256388 0.0224 0.25 0.271874 0.256437 0.0225 0.25 0.271881 0.256481 0.0226 0.25 0.271888 0.25652 0.0227 0.25 0.271893 0.256554 0.0228 0.25 0.271897 0.256583 0.0229 0.25 0.2719 0.256607 0.023 0.25 0.271902 0.256625 0.0231 0.25 0.271903 0.256639 0.0232 0.25 0.271903 0.256648 0.0233 0.25 0.271902 0.256652 0.0234 0.25 0.2719 0.256651 0.0235 0.25 0.271897 0.256646 0.0236 0.25 0.271893 0.256635 0.0237 0.25 0.271888 0.256619 0.0238 0.25 0.271881 0.256599 0.0239 0.25 0.271874 0.256574 0.024 0.25 0.271866 0.256545 0.0241 0.25 0.271857 0.25651 0.0242 0.25 0.271847 0.256471 0.0243 0.25 0.271836 0.256428 0.0244 0.25 0.271824 0.25638 0.0245 0.25 0.271811 0.256328 0.0246 0.25 0.271797 0.256271 0.0247 0.25 0.271782 0.25621 0.0248 0.25 0.271766 0.256145 0.0249 0.25 0.27175 0.256075 0.025 0.25 0.271732 0.256002 0.0251 0.25 0.271713 0.255924 0.0252 0.25 0.271694 0.255843 0.0253 0.25 0.271673 0.255757 0.0254 0.25 0.271652 0.255668 0.0255 0.25 0.27163 0.255575 0.0256 0.25 0.271607 0.255479 0.0257 0.25 0.271583 0.255379 0.0258 0.25 0.271558 0.255275 0.0259 0.25 0.271532 0.255169 0.026 0.25 0.271506 0.255058 0.0261 0.25 0.271478 0.254945 0.0262 0.25 0.27145 0.254829 0.0263 0.25 0.27142 0.254709 0.0264 0.25 0.27139 0.254587 0.0265 0.25 0.27136 0.254462 0.0266 0.25 0.271328 0.254334 0.0267 0.25 0.271295 0.254203 0.0268 0.25 0.271262 0.25407 0.0269 0.25 0.271228 0.253935 0.027 0.25 0.271193 0.253797 0.0271 0.25 0.271157 0.253657 0.0272 0.25 0.27112 0.253514 0.0273 0.25 0.271083 0.25337 0.0274 0.25 0.271044 0.253224 0.0275 0.25 0.271005 0.253076 0.0276 0.25 0.270966 0.252926 0.0277 0.25 0.270925 0.252775 0.0278 0.25 0.270884 0.252622 0.0279 0.25 0.270842 0.252467 0.028 0.25 0.270799 0.252312 0.0281 0.25 0.270755 0.252155 0.0282 0.25 0.270711 0.251997 0.0283 0.25 0.270666 0.251837 0.0284 0.25 0.27062 0.251677 0.0285 0.25 0.270573 0.251517 0.0286 0.25 0.270526 0.251355 0.0287 0.25 0.270478 0.251193 0.0288 0.25 0.270429 0.25103 0.0289 0.25 0.270379 0.250867 0.029 0.25 0.270329 0.250704 0.0291 0.25 0.270278 0.25054 0.0292 0.25 0.270227 0.250376 0.0293 0.25 0.270174 0.250213 0.0294 0.25 0.270122 0.250049 0.0295 0.25 0.270068 0.249886 0.0296 0.25 0.270013 0.249722 0.0297 0.25 0.269958 0.249559 0.0298 0.25 0.269903 0.249397 0.0299 0.25 0.269846 0.249235 0.03 0.25 0.269789 0.249074 0.0301 0.25 0.269732 0.248913 0.0302 0.25 0.269673 0.248753 0.0303 0.25 0.269615 0.248595 0.0304 0.25 0.269555 0.248437 0.0305 0.25 0.269495 0.24828 0.0306 0.25 0.269434 0.248124 0.0307 0.25 0.269372 0.24797 0.0308 0.25 0.26931 0.247817 0.0309 0.25 0.269248 0.247665 0.031 0.25 0.269184 0.247515 0.0311 0.25 0.26912 0.247366 0.0312 0.25 0.269056 0.247219 0.0313 0.25 0.268991 0.247074 0.0314 0.25 0.268925 0.246931 0.0315 0.25 0.268859 0.246789 0.0316 0.25 0.268792 0.246649 0.0317 0.25 0.268724 0.246512 0.0318 0.25 0.268656 0.246376 0.0319 0.25 0.268588 0.246242 0.032 0.25 0.268519 0.246111 0.0321 0.25 0.268449 0.245982 0.0322 0.25 0.268379 0.245855 0.0323 0.25 0.268308 0.245731 0.0324 0.25 0.268236 0.245609 0.0325 0.25 0.268165 0.245489 0.0326 0.25 0.268092 0.245372 0.0327 0.25 0.268019 0.245258 0.0328 0.25 0.267946 0.245146 0.0329 0.25 0.267872 0.245037 0.033 0.25 0.267797 0.24493 0.0331 0.25 0.267722 0.244827 0.0332 0.25 0.267647 0.244726 0.0333 0.25 0.267571 0.244628 0.0334 0.25 0.267494 0.244533 0.0335 0.25 0.267417 0.244441 0.0336 0.25 0.267339 0.244352 0.0337 0.25 0.267261 0.244266 0.0338 0.25 0.267183 0.244183 0.0339 0.25 0.267104 0.244103 0.034 0.25 0.267024 0.244026 0.0341 0.25 0.266945 0.243952 0.0342 0.25 0.266864 0.243881 0.0343 0.25 0.266783 0.243814 0.0344 0.25 0.266702 0.24375 0.0345 0.25 0.26662 0.243689 0.0346 0.25 0.266538 0.243631 0.0347 0.25 0.266455 0.243576 0.0348 0.25 0.266372 0.243525 0.0349 0.25 0.266289 0.243477 0.035 0.25 0.266205 0.243433 0.0351 0.25 0.266121 0.243391 0.0352 0.25 0.266036 0.243353 0.0353 0.25 0.265951 0.243318 0.0354 0.25 0.265865 0.243287 0.0355 0.25 0.265779 0.243259 0.0356 0.25 0.265692 0.243234 0.0357 0.25 0.265606 0.243213 0.0358 0.25 0.265518 0.243195 0.0359 0.25 0.265431 0.24318 0.036 0.25 0.265343 0.243169 0.0361 0.25 0.265254 0.243161 0.0362 0.25 0.265165 0.243156 0.0363 0.25 0.265076 0.243154 0.0364 0.25 0.264987 0.243156 0.0365 0.25 0.264897 0.243161 0.0366 0.25 0.264807 0.243169 0.0367 0.25 0.264716 0.243181 0.0368 0.25 0.264625 0.243196 0.0369 0.25 0.264534 0.243214 0.037 0.25 0.264442 0.243235 0.0371 0.25 0.26435 0.243259 0.0372 0.25 0.264257 0.243287 0.0373 0.25 0.264165 0.243318 0.0374 0.25 0.264072 0.243351 0.0375 0.25 0.263978 0.243388 0.0376 0.25 0.263885 0.243428 0.0377 0.25 0.263791 0.243471 0.0378 0.25 0.263696 0.243517 0.0379 0.25 0.263601 0.243566 0.038 0.25 0.263506 0.243617 0.0381 0.25 0.263411 0.243672 0.0382 0.25 0.263316 0.24373 0.0383 0.25 0.26322 0.24379 0.0384 0.25 0.263123 0.243853 0.0385 0.25 0.263027 0.243919 0.0386 0.25 0.26293 0.243987 0.0387 0.25 0.262833 0.244059 0.0388 0.25 0.262736 0.244132 0.0389 0.25 0.262638 0.244209 0.039 0.25 0.26254 0.244288 0.0391 0.25 0.262442 0.244369 0.0392 0.25 0.262344 0.244453 0.0393 0.25 0.262245 0.244539 0.0394 0.25 0.262146 0.244628 0.0395 0.25 0.262047 0.244719 0.0396 0.25 0.261947 0.244812 0.0397 0.25 0.261847 0.244908 0.0398 0.25 0.261747 0.245006 0.0399 0.25 0.261647 0.245105 0.04 0.25 0.261547 0.245207 0.0401 0.25 0.261446 0.245311 0.0402 0.25 0.261345 0.245417 0.0403 0.25 0.261244 0.245525 0.0404 0.25 0.261143 0.245634 0.0405 0.25 0.261041 0.245746 0.0406 0.25 0.260939 0.245859 0.0407 0.25 0.260837 0.245974 0.0408 0.25 0.260735 0.24609 0.0409 0.25 0.260632 0.246208 0.041 0.25 0.26053 0.246328 0.0411 0.25 0.260427 0.246449 0.0412 0.25 0.260324 0.246572 0.0413 0.25 0.26022 0.246696 0.0414 0.25 0.260117 0.246821 0.0415 0.25 0.260013 0.246948 0.0416 0.25 0.259909 0.247075 0.0417 0.25 0.259805 0.247204 0.0418 0.25 0.259701 0.247334 0.0419 0.25 0.259597 0.247465 0.042 0.25 0.259492 0.247597 0.0421 0.25 0.259387 0.24773 0.0422 0.25 0.259282 0.247864 0.0423 0.25 0.259177 0.247998 0.0424 0.25 0.259072 0.248133 0.0425 0.25 0.258967 0.248269 0.0426 0.25 0.258861 0.248406 0.0427 0.25 0.258755 0.248543 0.0428 0.25 0.25865 0.248681 0.0429 0.25 0.258544 0.248819 0.043 0.25 0.258437 0.248957 0.0431 0.25 0.258331 0.249096 0.0432 0.25 0.258225 0.249235 0.0433 0.25 0.258118 0.249374 0.0434 0.25 0.258012 0.249514 0.0435 0.25 0.257905 0.249653 0.0436 0.25 0.257798 0.249793 0.0437 0.25 0.257691 0.249933 0.0438 0.25 0.257584 0.250072 0.0439 0.25 0.257476 0.250212 0.044 0.25 0.257369 0.250351 0.0441 0.25 0.257261 0.25049 0.0442 0.25 0.257154 0.250629 0.0443 0.25 0.257046 0.250767 0.0444 0.25 0.256938 0.250905 0.0445 0.25 0.25683 0.251043 0.0446 0.25 0.256722 0.25118 0.0447 0.25 0.256614 0.251316 0.0448 0.25 0.256506 0.251452 0.0449 0.25 0.256398 0.251588 0.045 0.25 0.256289 0.251722 0.0451 0.25 0.256181 0.251856 0.0452 0.25 0.256072 0.251989 0.0453 0.25 0.255964 0.252121 0.0454 0.25 0.255855 0.252253 0.0455 0.25 0.255746 0.252383 0.0456 0.25 0.255638 0.252512 0.0457 0.25 0.255529 0.252641 0.0458 0.25 0.25542 0.252768 0.0459 0.25 0.255311 0.252894 0.046 0.25 0.255202 0.253019 0.0461 0.25 0.255093 0.253142 0.0462 0.25 0.254983 0.253265 0.0463 0.25 0.254874 0.253386 0.0464 0.25 0.254765 0.253505 0.0465 0.25 0.254656 0.253624 0.0466 0.25 0.254546 0.253741 0.0467 0.25 0.254437 0.253856 0.0468 0.25 0.254327 0.25397 0.0469 0.25 0.254218 0.254082 0.047 0.25 0.254109 0.254193 0.0471 0.25 0.253999 0.254302 0.0472 0.25 0.25389 0.254409 0.0473 0.25 0.25378 0.254515 0.0474 0.25 0.25367 0.254619 0.0475 0.25 0.253561 0.254721 0.0476 0.25 0.253451 0.254822 0.0477 0.25 0.253342 0.25492 0.0478 0.25 0.253232 0.255017 0.0479 0.25 0.253122 0.255112 0.048 0.25 0.253013 0.255204 0.0481 0.25 0.252903 0.255295 0.0482 0.25 0.252793 0.255384 0.0483 0.25 0.252684 0.255471 0.0484 0.25 0.252574 0.255556 0.0485 0.25 0.252465 0.255639 0.0486 0.25 0.252355 0.255719 0.0487 0.25 0.252245 0.255798 0.0488 0.25 0.252136 0.255874 0.0489 0.25 0.252026 0.255948 0.049 0.25 0.251917 0.25602 0.0491 0.25 0.251807 0.25609 0.0492 0.25 0.251698 0.256158 0.0493 0.25 0.251588 0.256223 0.0494 0.25 0.251479 0.256286 0.0495 0.25 0.251369 0.256347 0.0496 0.25 0.25126 0.256406 0.0497 0.25 0.251151 0.256462 0.0498 0.25 0.251041 0.256516 0.0499 0.25 0.250932 0.256567 0.05 0.25 0.250823 0.256617 0.0501 0.25 0.250713 0.256663 0.0502 0.25 0.250604 0.256708 0.0503 0.25 0.250495 0.25675 0.0504 0.25 0.250386 0.25679 0.0505 0.25 0.250277 0.256827 0.0506 0.25 0.250168 0.256862 0.0507 0.25 0.250059 0.256894 0.0508 0.25 0.249951 0.256924 0.0509 0.25 0.249842 0.256952 0.051 0.25 0.249733 0.256977 0.0511 0.25 0.249625 0.257 0.0512 0.25 0.249516 0.25702 0.0513 0.25 0.249407 0.257038 0.0514 0.25 0.249299 0.257053 0.0515 0.25 0.249191 0.257066 0.0516 0.25 0.249082 0.257077 0.0517 0.25 0.248974 0.257085 0.0518 0.25 0.248866 0.257091 0.0519 0.25 0.248758 0.257094 0.052 0.25 0.24865 0.257095 0.0521 0.25 0.248542 0.257093 0.0522 0.25 0.248435 0.257089 0.0523 0.25 0.248327 0.257083 0.0524 0.25 0.248219 0.257074 0.0525 0.25 0.248112 0.257063 0.0526 0.25 0.248005 0.25705 0.0527 0.25 0.247897 0.257034 0.0528 0.25 0.24779 0.257015 0.0529 0.25 0.247683 0.256995 0.053 0.25 0.247576 0.256972 0.0531 0.25 0.247469 0.256947 0.0532 0.25 0.247362 0.256919 0.0533 0.25 0.247256 0.256889 0.0534 0.25 0.247149 0.256857 0.0535 0.25 0.247043 0.256822 0.0536 0.25 0.246937 0.256786 0.0537 0.25 0.24683 0.256747 0.0538 0.25 0.246724 0.256706 0.0539 0.25 0.246618 0.256662 0.054 0.25 0.246513 0.256617 0.0541 0.25 0.246407 0.256569 0.0542 0.25 0.246301 0.256519 0.0543 0.25 0.246196 0.256468 0.0544 0.25 0.246091 0.256414 0.0545 0.25 0.245985 0.256357 0.0546 0.25 0.24588 0.256299 0.0547 0.25 0.245775 0.256239 0.0548 0.25 0.245671 0.256177 0.0549 0.25 0.245566 0.256113 0.055 0.25 0.245462 0.256047 0.0551 0.25 0.245357 0.255979 0.0552 0.25 0.245253 0.255909 0.0553 0.25 0.245149 0.255837 0.0554 0.25 0.245045 0.255763 0.0555 0.25 0.244941 0.255688 0.0556 0.25 0.244838 0.255611 0.0557 0.25 0.244734 0.255532 0.0558 0.25 0.244631 0.255451 0.0559 0.25 0.244528 0.255368 0.056 0.25 0.244425 0.255284 0.0561 0.25 0.244322 0.255198 0.0562 0.25 0.244219 0.255111 0.0563 0.25 0.244117 0.255022 0.0564 0.25 0.244015 0.254931 0.0565 0.25 0.243912 0.254839 0.0566 0.25 0.24381 0.254746 0.0567 0.25 0.243709 0.254651 0.0568 0.25 0.243607 0.254554 0.0569 0.25 0.243506 0.254457 0.057 0.25 0.243404 0.254357 0.0571 0.25 0.243303 0.254257 0.0572 0.25 0.243202 0.254155 0.0573 0.25 0.243101 0.254052 0.0574 0.25 0.243001 0.253948 0.0575 0.25 0.2429 0.253842 0.0576 0.25 0.2428 0.253735 0.0577 0.25 0.2427 0.253628 0.0578 0.25 0.2426 0.253519 0.0579 0.25 0.242501 0.253409 0.058 0.25 0.242401 0.253298 0.0581 0.25 0.242302 0.253186 0.0582 0.25 0.242203 0.253073 0.0583 0.25 0.242104 0.252959 0.0584 0.25 0.242005 0.252845 0.0585 0.25 0.241907 0.252729 0.0586 0.25 0.241809 0.252613 0.0587 0.25 0.24171 0.252496 0.0588 0.25 0.241613 0.252379 0.0589 0.25 0.241515 0.25226 0.059 0.25 0.241417 0.252141 0.0591 0.25 0.24132 0.252021 0.0592 0.25 0.241223 0.251901 0.0593 0.25 0.241126 0.25178 0.0594 0.25 0.24103 0.251659 0.0595 0.25 0.240933 0.251537 0.0596 0.25 0.240837 0.251415 0.0597 0.25 0.240741 0.251293 0.0598 0.25 0.240645 0.25117 0.0599 0.25 0.240549 0.251047 0.06 0.25 0.240454 0.250923 0.0601 0.25 0.240359 0.2508 0.0602 0.25 0.240264 0.250676 0.0603 0.25 0.240169 0.250552 0.0604 0.25 0.240075 0.250427 0.0605 0.25 0.23998 0.250303 0.0606 0.25 0.239886 0.250179 0.0607 0.25 0.239793 0.250055 0.0608 0.25 0.239699 0.24993 0.0609 0.25 0.239606 0.249806 0.061 0.25 0.239513 0.249682 0.0611 0.25 0.23942 0.249558 0.0612 0.25 0.239327 0.249434 0.0613 0.25 0.239235 0.24931 0.0614 0.25 0.239142 0.249187 0.0615 0.25 0.23905 0.249064 0.0616 0.25 0.238959 0.248941 0.0617 0.25 0.238867 0.248818 0.0618 0.25 0.238776 0.248696 0.0619 0.25 0.238685 0.248574 0.062 0.25 0.238594 0.248453 0.0621 0.25 0.238504 0.248332 0.0622 0.25 0.238413 0.248212 0.0623 0.25 0.238323 0.248092 0.0624 0.25 0.238234 0.247973 0.0625 0.25 0.238144 0.247855 0.0626 0.25 0.238055 0.247737 0.0627 0.25 0.237966 0.247619 0.0628 0.25 0.237877 0.247503 0.0629 0.25 0.237789 0.247387 0.063 0.25 0.2377 0.247272 0.0631 0.25 0.237612 0.247158 0.0632 0.25 0.237524 0.247045 0.0633 0.25 0.237437 0.246932 0.0634 0.25 0.23735 0.246821 0.0635 0.25 0.237263 0.24671 0.0636 0.25 0.237176 0.2466 0.0637 0.25 0.237089 0.246492 0.0638 0.25 0.237003 0.246384 0.0639 0.25 0.236917 0.246277 0.064 0.25 0.236832 0.246172 0.0641 0.25 0.236746 0.246067 0.0642 0.25 0.236661 0.245964 0.0643 0.25 0.236576 0.245862 0.0644 0.25 0.236492 0.245761 0.0645 0.25 0.236407 0.245661 0.0646 0.25 0.236323 0.245562 0.0647 0.25 0.236239 0.245465 0.0648 0.25 0.236156 0.245369 0.0649 0.25 0.236072 0.245274 0.065 0.25 0.235989 0.245181 0.0651 0.25 0.235907 0.245089 0.0652 0.25 0.235824 0.244998 0.0653 0.25 0.235742 0.244909 0.0654 0.25 0.23566 0.244821 0.0655 0.25 0.235579 0.244735 0.0656 0.25 0.235497 0.24465 0.0657 0.25 0.235416 0.244566 0.0658 0.25 0.235335 0.244484 0.0659 0.25 0.235255 0.244404 0.066 0.25 0.235175 0.244325 0.0661 0.25 0.235095 0.244248 0.0662 0.25 0.235015 0.244172 0.0663 0.25 0.234936 0.244098 0.0664 0.25 0.234857 0.244026 0.0665 0.25 0.234778 0.243955 0.0666 0.25 0.234699 0.243885 0.0667 0.25 0.234621 0.243818 0.0668 0.25 0.234543 0.243752 0.0669 0.25 0.234465 0.243688 0.067 0.25 0.234388 0.243625 0.0671 0.25 0.234311 0.243565 0.0672 0.25 0.234234 0.243506 0.0673 0.25 0.234158 0.243448 0.0674 0.25 0.234081 0.243393 0.0675 0.25 0.234006 0.243339 0.0676 0.25 0.23393 0.243287 0.0677 0.25 0.233855 0.243237 0.0678 0.25 0.23378 0.243189 0.0679 0.25 0.233705 0.243142 0.068 0.25 0.23363 0.243098 0.0681 0.25 0.233556 0.243055 0.0682 0.25 0.233482 0.243014 0.0683 0.25 0.233409 0.242975 0.0684 0.25 0.233336 0.242938 0.0685 0.25 0.233263 0.242902 0.0686 0.25 0.23319 0.242869 0.0687 0.25 0.233118 0.242837 0.0688 0.25 0.233046 0.242807 0.0689 0.25 0.232974 0.24278 0.069 0.25 0.232903 0.242754 0.0691 0.25 0.232832 0.24273 0.0692 0.25 0.232761 0.242707 0.0693 0.25 0.23269 0.242687 0.0694 0.25 0.23262 0.242669 0.0695 0.25 0.23255 0.242652 0.0696 0.25 0.232481 0.242638 0.0697 0.25 0.232411 0.242625 0.0698 0.25 0.232342 0.242615 0.0699 0.25 0.232274 0.242606 0.07 0.25 0.232205 0.242599 0.0701 0.25 0.232137 0.242594 0.0702 0.25 0.23207 0.242591 0.0703 0.25 0.232002 0.24259 0.0704 0.25 0.231935 0.242591 0.0705 0.25 0.231868 0.242593 0.0706 0.25 0.231802 0.242598 0.0707 0.25 0.231736 0.242604 0.0708 0.25 0.23167 0.242613 0.0709 0.25 0.231604 0.242623 0.071 0.25 0.231539 0.242635 0.0711 0.25 0.231474 0.242649 0.0712 0.25 0.23141 0.242665 0.0713 0.25 0.231345 0.242683 0.0714 0.25 0.231281 0.242702 0.0715 0.25 0.231218 0.242724 0.0716 0.25 0.231154 0.242747 0.0717 0.25 0.231091 0.242772 0.0718 0.25 0.231029 0.242799 0.0719 0.25 0.230966 0.242828 0.072 0.25 0.230904 0.242858 0.0721 0.25 0.230843 0.24289 0.0722 0.25 0.230781 0.242925 0.0723 0.25 0.23072 0.24296 0.0724 0.25 0.230659 0.242998 0.0725 0.25 0.230599 0.243037 0.0726 0.25 0.230539 0.243078 0.0727 0.25 0.230479 0.243121 0.0728 0.25 0.23042 0.243166 0.0729 0.25 0.23036 0.243212 0.073 0.25 0.230302 0.24326 0.0731 0.25 0.230243 0.243309 0.0732 0.25 0.230185 0.243361 0.0733 0.25 0.230127 0.243414 0.0734 0.25 0.23007 0.243468 0.0735 0.25 0.230013 0.243524 0.0736 0.25 0.229956 0.243582 0.0737 0.25 0.229899 0.243641 0.0738 0.25 0.229843 0.243702 0.0739 0.25 0.229787 0.243764 0.074 0.25 0.229732 0.243828 0.0741 0.25 0.229676 0.243893 0.0742 0.25 0.229621 0.24396 0.0743 0.25 0.229567 0.244029 0.0744 0.25 0.229513 0.244098 0.0745 0.25 0.229459 0.24417 0.0746 0.25 0.229405 0.244242 0.0747 0.25 0.229352 0.244316 0.0748 0.25 0.229299 0.244392 0.0749 0.25 0.229247 0.244468 0.075 0.25 0.229194 0.244546 0.0751 0.25 0.229142 0.244626 0.0752 0.25 0.229091 0.244706 0.0753 0.25 0.22904 0.244788 0.0754 0.25 0.228989 0.244872 0.0755 0.25 0.228938 0.244956 0.0756 0.25 0.228888 0.245042 0.0757 0.25 0.228838 0.245128 0.0758 0.25 0.228788 0.245216 0.0759 0.25 0.228739 0.245305 0.076 0.25 0.22869 0.245396 0.0761 0.25 0.228642 0.245487 0.0762 0.25 0.228593 0.245579 0.0763 0.25 0.228546 0.245673 0.0764 0.25 0.228498 0.245767 0.0765 0.25 0.228451 0.245862 0.0766 0.25 0.228404 0.245959 0.0767 0.25 0.228357 0.246056 0.0768 0.25 0.228311 0.246154 0.0769 0.25 0.228265 0.246254 0.077 0.25 0.22822 0.246354 0.0771 0.25 0.228174 0.246455 0.0772 0.25 0.22813 0.246556 0.0773 0.25 0.228085 0.246659 0.0774 0.25 0.228041 0.246762 0.0775 0.25 0.227997 0.246866 0.0776 0.25 0.227953 0.246971 0.0777 0.25 0.22791 0.247077 0.0778 0.25 0.227867 0.247183 0.0779 0.25 0.227825 0.247289 0.078 0.25 0.227783 0.247397 0.0781 0.25 0.227741 0.247505 0.0782 0.25 0.227699 0.247614 0.0783 0.25 0.227658 0.247723 0.0784 0.25 0.227617 0.247832 0.0785 0.25 0.227577 0.247943 0.0786 0.25 0.227537 0.248053 0.0787 0.25 0.227497 0.248164 0.0788 0.25 0.227458 0.248276 0.0789 0.25 0.227418 0.248388 0.079 0.25 0.22738 0.2485 0.0791 0.25 0.227341 0.248612 0.0792 0.25 0.227303 0.248725 0.0793 0.25 0.227265 0.248839 0.0794 0.25 0.227228 0.248952 0.0795 0.25 0.227191 0.249066 0.0796 0.25 0.227154 0.24918 0.0797 0.25 0.227118 0.249294 0.0798 0.25 0.227082 0.249408 0.0799 0.25 0.227046 0.249522 0.08 0.25 0.22701 0.249637 0.0801 0.25 0.226975 0.249751 0.0802 0.25 0.226941 0.249866 0.0803 0.25 0.226906 0.24998 0.0804 0.25 0.226872 0.250095 0.0805 0.25 0.226839 0.250209 0.0806 0.25 0.226805 0.250324 0.0807 0.25 0.226772 0.250438 0.0808 0.25 0.22674 0.250553 0.0809 0.25 0.226707 0.250667 0.081 0.25 0.226675 0.250781 0.0811 0.25 0.226644 0.250895 0.0812 0.25 0.226612 0.251008 0.0813 0.25 0.226581 0.251122 0.0814 0.25 0.226551 0.251235 0.0815 0.25 0.22652 0.251347 0.0816 0.25 0.22649 0.25146 0.0817 0.25 0.226461 0.251572 0.0818 0.25 0.226432 0.251684 0.0819 0.25 0.226403 0.251796 0.082 0.25 0.226374 0.251907 0.0821 0.25 0.226346 0.252017 0.0822 0.25 0.226318 0.252127 0.0823 0.25 0.22629 0.252237 0.0824 0.25 0.226263 0.252346 0.0825 0.25 0.226236 0.252455 0.0826 0.25 0.22621 0.252563 0.0827 0.25 0.226183 0.25267 0.0828 0.25 0.226158 0.252777 0.0829 0.25 0.226132 0.252884 0.083 0.25 0.226107 0.252989 0.0831 0.25 0.226082 0.253094 0.0832 0.25 0.226058 0.253199 0.0833 0.25 0.226033 0.253302 0.0834 0.25 0.22601 0.253405 0.0835 0.25 0.225986 0.253507 0.0836 0.25 0.225963 0.253609 0.0837 0.25 0.22594 0.253709 0.0838 0.25 0.225918 0.253809 0.0839 0.25 0.225895 0.253908 0.084 0.25 0.225874 0.254006 0.0841 0.25 0.225852 0.254103 0.0842 0.25 0.225831 0.254199 0.0843 0.25 0.22581 0.254295 0.0844 0.25 0.22579 0.254389 0.0845 0.25 0.22577 0.254483 0.0846 0.25 0.22575 0.254575 0.0847 0.25 0.225731 0.254666 0.0848 0.25 0.225711 0.254757 0.0849 0.25 0.225693 0.254846 0.085 0.25 0.225674 0.254935 0.0851 0.25 0.225656 0.255022 0.0852 0.25 0.225638 0.255108 0.0853 0.25 0.225621 0.255193 0.0854 0.25 0.225604 0.255277 0.0855 0.25 0.225587 0.25536 0.0856 0.25 0.225571 0.255442 0.0857 0.25 0.225555 0.255523 0.0858 0.25 0.225539 0.255602 0.0859 0.25 0.225524 0.25568 0.086 0.25 0.225509 0.255757 0.0861 0.25 0.225494 0.255833 0.0862 0.25 0.225479 0.255907 0.0863 0.25 0.225465 0.25598 0.0864 0.25 0.225452 0.256052 0.0865 0.25 0.225438 0.256123 0.0866 0.25 0.225425 0.256192 0.0867 0.25 0.225412 0.25626 0.0868 0.25 0.2254 0.256327 0.0869 0.25 0.225388 0.256392 0.087 0.25 0.225376 0.256456 0.0871 0.25 0.225365 0.256519 0.0872 0.25 0.225354 0.25658 0.0873 0.25 0.225343 0.25664 0.0874 0.25 0.225333 0.256698 0.0875 0.25 0.225323 0.256755 0.0876 0.25 0.225313 0.256811 0.0877 0.25 0.225304 0.256865 0.0878 0.25 0.225295 0.256918 0.0879 0.25 0.225286 0.256969 0.088 0.25 0.225277 0.257019 0.0881 0.25 0.225269 0.257067 0.0882 0.25 0.225262 0.257114 0.0883 0.25 0.225254 0.25716 0.0884 0.25 0.225247 0.257204 0.0885 0.25 0.22524 0.257246 0.0886 0.25 0.225234 0.257287 0.0887 0.25 0.225228 0.257326 0.0888 0.25 0.225222 0.257364 0.0889 0.25 0.225217 0.2574 0.089 0.25 0.225212 0.257435 0.0891 0.25 0.225207 0.257468 0.0892 0.25 0.225202 0.2575 0.0893 0.25 0.225198 0.25753 0.0894 0.25 0.225194 0.257559 0.0895 0.25 0.225191 0.257586 0.0896 0.25 0.225188 0.257611 0.0897 0.25 0.225185 0.257635 0.0898 0.25 0.225182 0.257658 0.0899 0.25 0.22518 0.257678 0.09 0.25 0.225178 0.257698 0.0901 0.25 0.225177 0.257715 0.0902 0.25 0.225176 0.257731 0.0903 0.25 0.225175 0.257746 0.0904 0.25 0.225174 0.257759 0.0905 0.25 0.225174 0.25777 0.0906 0.25 0.225174 0.25778 0.0907 0.25 0.225175 0.257788 0.0908 0.25 0.225175 0.257794 0.0909 0.25 0.225176 0.257799 0.091 0.25 0.225178 0.257802 0.0911 0.25 0.225179 0.257804 0.0912 0.25 0.225182 0.257804 0.0913 0.25 0.225184 0.257803 0.0914 0.25 0.225187 0.2578 0.0915 0.25 0.22519 0.257795 0.0916 0.25 0.225193 0.257789 0.0917 0.25 0.225196 0.257782 0.0918 0.25 0.2252 0.257772 0.0919 0.25 0.225205 0.257761 0.092 0.25 0.225209 0.257749 0.0921 0.25 0.225214 0.257735 0.0922 0.25 0.225219 0.25772 0.0923 0.25 0.225225 0.257702 0.0924 0.25 0.225231 0.257684 0.0925 0.25 0.225237 0.257664 0.0926 0.25 0.225243 0.257642 0.0927 0.25 0.22525 0.257619 0.0928 0.25 0.225257 0.257594 0.0929 0.25 0.225265 0.257568 0.093 0.25 0.225272 0.25754 0.0931 0.25 0.22528 0.257511 0.0932 0.25 0.225289 0.25748 0.0933 0.25 0.225297 0.257448 0.0934 0.25 0.225306 0.257414 0.0935 0.25 0.225316 0.257379 0.0936 0.25 0.225325 0.257342 0.0937 0.25 0.225335 0.257304 0.0938 0.25 0.225345 0.257264 0.0939 0.25 0.225356 0.257223 0.094 0.25 0.225367 0.257181 0.0941 0.25 0.225378 0.257137 0.0942 0.25 0.225389 0.257092 0.0943 0.25 0.225401 0.257045 0.0944 0.25 0.225413 0.256997 0.0945 0.25 0.225426 0.256948 0.0946 0.25 0.225438 0.256897 0.0947 0.25 0.225451 0.256845 0.0948 0.25 0.225465 0.256791 0.0949 0.25 0.225478 0.256736 0.095 0.25 0.225492 0.25668 0.0951 0.25 0.225506 0.256623 0.0952 0.25 0.225521 0.256564 0.0953 0.25 0.225536 0.256504 0.0954 0.25 0.225551 0.256443 0.0955 0.25 0.225566 0.25638 0.0956 0.25 0.225582 0.256316 0.0957 0.25 0.225598 0.256251 0.0958 0.25 0.225614 0.256185 0.0959 0.25 0.225631 0.256118 0.096 0.25 0.225648 0.256049 0.0961 0.25 0.225665 0.255979 0.0962 0.25 0.225683 0.255908 0.0963 0.25 0.225701 0.255836 0.0964 0.25 0.225719 0.255763 0.0965 0.25 0.225737 0.255689 0.0966 0.25 0.225756 0.255613 0.0967 0.25 0.225775 0.255537 0.0968 0.25 0.225794 0.255459 0.0969 0.25 0.225814 0.25538 0.097 0.25 0.225834 0.255301 0.0971 0.25 0.225854 0.25522 0.0972 0.25 0.225875 0.255138 0.0973 0.25 0.225895 0.255055 0.0974 0.25 0.225916 0.254972 0.0975 0.25 0.225938 0.254887 0.0976 0.25 0.225959 0.254801 0.0977 0.25 0.225981 0.254715 0.0978 0.25 0.226004 0.254627 0.0979 0.25 0.226026 0.254539 0.098 0.25 0.226049 0.25445 0.0981 0.25 0.226072 0.25436 0.0982 0.25 0.226096 0.254269 0.0983 0.25 0.226119 0.254177 0.0984 0.25 0.226143 0.254085 0.0985 0.25 0.226168 0.253992 0.0986 0.25 0.226192 0.253898 0.0987 0.25 0.226217 0.253803 0.0988 0.25 0.226242 0.253708 0.0989 0.25 0.226268 0.253611 0.099 0.25 0.226293 0.253514 0.0991 0.25 0.226319 0.253417 0.0992 0.25 0.226346 0.253319 0.0993 0.25 0.226372 0.25322 0.0994 0.25 0.226399 0.25312 0.0995 0.25 0.226426 0.25302 0.0996 0.25 0.226453 0.25292 0.0997 0.25 0.226481 0.252819 0.0998 0.25 0.226509 0.252717 0.0999 0.25 0.226537 0.252615 0.1 0.25 0.226566 0.252512 0.1001 0.25 0.226595 0.252409 0.1002 0.25 0.226624 0.252305 0.1003 0.25 0.226653 0.252201 0.1004 0.25 0.226683 0.252097 0.1005 0.25 0.226713 0.251992 0.1006 0.25 0.226743 0.251887 0.1007 0.25 0.226773 0.251781 0.1008 0.25 0.226804 0.251675 0.1009 0.25 0.226835 0.251569 0.101 0.25 0.226866 0.251462 0.1011 0.25 0.226898 0.251355 0.1012 0.25 0.22693 0.251248 0.1013 0.25 0.226962 0.251141 0.1014 0.25 0.226994 0.251033 0.1015 0.25 0.227027 0.250925 0.1016 0.25 0.22706 0.250817 0.1017 0.25 0.227093 0.250709 0.1018 0.25 0.227126 0.250601 0.1019 0.25 0.22716 0.250493 0.102 0.25 0.227194 0.250384 0.1021 0.25 0.227228 0.250276 0.1022 0.25 0.227263 0.250167 0.1023 0.25 0.227297 0.250058 0.1024 0.25 0.227332 0.24995 0.1025 0.25 0.227368 0.249841 0.1026 0.25 0.227403 0.249732 0.1027 0.25 0.227439 0.249624 0.1028 0.25 0.227475 0.249515 0.1029 0.25 0.227512 0.249406 0.103 0.25 0.227548 0.249298 0.1031 0.25 0.227585 0.24919 0.1032 0.25 0.227622 0.249082 0.1033 0.25 0.22766 0.248974 0.1034 0.25 0.227697 0.248866 0.1035 0.25 0.227735 0.248758 0.1036 0.25 0.227773 0.248651 0.1037 0.25 0.227812 0.248544 0.1038 0.25 0.22785 0.248437 0.1039 0.25 0.227889 0.24833 0.104 0.25 0.227928 0.248224 0.1041 0.25 0.227968 0.248118 0.1042 0.25 0.228008 0.248012 0.1043 0.25 0.228048 0.247907 0.1044 0.25 0.228088 0.247802 0.1045 0.25 0.228128 0.247697 0.1046 0.25 0.228169 0.247593 0.1047 0.25 0.22821 0.247489 0.1048 0.25 0.228251 0.247386 0.1049 0.25 0.228292 0.247283 0.105 0.25 0.228334 0.24718 0.1051 0.25 0.228376 0.247078 0.1052 0.25 0.228418 0.246977 0.1053 0.25 0.228461 0.246876 0.1054 0.25 0.228503 0.246776 0.1055 0.25 0.228546 0.246676 0.1056 0.25 0.228589 0.246577 0.1057 0.25 0.228633 0.246478 0.1058 0.25 0.228677 0.24638 0.1059 0.25 0.22872 0.246283 0.106 0.25 0.228765 0.246186 0.1061 0.25 0.228809 0.24609 0.1062 0.25 0.228854 0.245995 0.1063 0.25 0.228898 0.2459 0.1064 0.25 0.228944 0.245806 0.1065 0.25 0.228989 0.245713 0.1066 0.25 0.229034 0.24562 0.1067 0.25 0.22908 0.245528 0.1068 0.25 0.229126 0.245438 0.1069 0.25 0.229173 0.245347 0.107 0.25 0.229219 0.245258 0.1071 0.25 0.229266 0.24517 0.1072 0.25 0.229313 0.245082 0.1073 0.25 0.22936 0.244995 0.1074 0.25 0.229407 0.244909 0.1075 0.25 0.229455 0.244824 0.1076 0.25 0.229503 0.24474 0.1077 0.25 0.229551 0.244657 0.1078 0.25 0.2296 0.244574 0.1079 0.25 0.229648 0.244493 0.108 0.25 0.229697 0.244412 0.1081 0.25 0.229746 0.244333 0.1082 0.25 0.229795 0.244254 0.1083 0.25 0.229845 0.244177 0.1084 0.25 0.229895 0.2441 0.1085 0.25 0.229945 0.244025 0.1086 0.25 0.229995 0.24395 0.1087 0.25 0.230045 0.243877 0.1088 0.25 0.230096 0.243804 0.1089 0.25 0.230147 0.243733 0.109 0.25 0.230198 0.243663 0.1091 0.25 0.230249 0.243594 0.1092 0.25 0.2303 0.243526 0.1093 0.25 0.230352 0.243459 0.1094 0.25 0.230404 0.243393 0.1095 0.25 0.230456 0.243328 0.1096 0.25 0.230509 0.243265 0.1097 0.25 0.230561 0.243202 0.1098 0.25 0.230614 0.243141 0.1099 0.25 0.230667 0.243081 0.11 0.25 0.23072 0.243022 0.1101 0.25 0.230774 0.242964 0.1102 0.25 0.230827 0.242908 0.1103 0.25 0.230881 0.242852 0.1104 0.25 0.230935 0.242798 0.1105 0.25 0.23099 0.242745 0.1106 0.25 0.231044 0.242694 0.1107 0.25 0.231099 0.242643 0.1108 0.25 0.231154 0.242594 0.1109 0.25 0.231209 0.242546 0.111 0.25 0.231264 0.2425 0.1111 0.25 0.23132 0.242454 0.1112 0.25 0.231376 0.24241 0.1113 0.25 0.231432 0.242367 0.1114 0.25 0.231488 0.242326 0.1115 0.25 0.231544 0.242286 0.1116 0.25 0.231601 0.242247 0.1117 0.25 0.231657 0.242209 0.1118 0.25 0.231714 0.242173 0.1119 0.25 0.231771 0.242138 0.112 0.25 0.231829 0.242104 0.1121 0.25 0.231886 0.242072 0.1122 0.25 0.231944 0.242041 0.1123 0.25 0.232002 0.242011 0.1124 0.25 0.23206 0.241983 0.1125 0.25 0.232119 0.241956 0.1126 0.25 0.232177 0.241931 0.1127 0.25 0.232236 0.241906 0.1128 0.25 0.232295 0.241883 0.1129 0.25 0.232354 0.241862 0.113 0.25 0.232413 0.241842 0.1131 0.25 0.232473 0.241823 0.1132 0.25 0.232532 0.241805 0.1133 0.25 0.232592 0.241789 0.1134 0.25 0.232652 0.241775 0.1135 0.25 0.232713 0.241761 0.1136 0.25 0.232773 0.241749 0.1137 0.25 0.232834 0.241739 0.1138 0.25 0.232895 0.24173 0.1139 0.25 0.232956 0.241722 0.114 0.25 0.233017 0.241715 0.1141 0.25 0.233078 0.24171 0.1142 0.25 0.23314 0.241706 0.1143 0.25 0.233202 0.241704 0.1144 0.25 0.233263 0.241703 0.1145 0.25 0.233326 0.241704 0.1146 0.25 0.233388 0.241705 0.1147 0.25 0.23345 0.241709 0.1148 0.25 0.233513 0.241713 0.1149 0.25 0.233576 0.241719 0.115 0.25 0.233639 0.241726 0.1151 0.25 0.233702 0.241735 0.1152 0.25 0.233765 0.241745 0.1153 0.25 0.233829 0.241756 0.1154 0.25 0.233893 0.241769 0.1155 0.25 0.233956 0.241783 0.1156 0.25 0.23402 0.241799 0.1157 0.25 0.234085 0.241816 0.1158 0.25 0.234149 0.241834 0.1159 0.25 0.234214 0.241853 0.116 0.25 0.234278 0.241874 0.1161 0.25 0.234343 0.241896 0.1162 0.25 0.234408 0.24192 0.1163 0.25 0.234474 0.241944 0.1164 0.25 0.234539 0.241971 0.1165 0.25 0.234605 0.241998 0.1166 0.25 0.23467 0.242027 0.1167 0.25 0.234736 0.242057 0.1168 0.25 0.234802 0.242088 0.1169 0.25 0.234868 0.242121 0.117 0.25 0.234935 0.242155 0.1171 0.25 0.235001 0.24219 0.1172 0.25 0.235068 0.242227 0.1173 0.25 0.235135 0.242264 0.1174 0.25 0.235202 0.242304 0.1175 0.25 0.235269 0.242344 0.1176 0.25 0.235337 0.242385 0.1177 0.25 0.235404 0.242428 0.1178 0.25 0.235472 0.242472 0.1179 0.25 0.23554 0.242517 0.118 0.25 0.235608 0.242564 0.1181 0.25 0.235676 0.242612 0.1182 0.25 0.235744 0.24266 0.1183 0.25 0.235812 0.24271 0.1184 0.25 0.235881 0.242762 0.1185 0.25 0.23595 0.242814 0.1186 0.25 0.236019 0.242868 0.1187 0.25 0.236088 0.242922 0.1188 0.25 0.236157 0.242978 0.1189 0.25 0.236226 0.243035 0.119 0.25 0.236296 0.243094 0.1191 0.25 0.236365 0.243153 0.1192 0.25 0.236435 0.243213 0.1193 0.25 0.236505 0.243275 0.1194 0.25 0.236575 0.243337 0.1195 0.25 0.236645 0.243401 0.1196 0.25 0.236715 0.243466 0.1197 0.25 0.236786 0.243531 0.1198 0.25 0.236856 0.243598 0.1199 0.25 0.236927 0.243666 0.12 0.25 0.236998 0.243735 0.1201 0.25 0.237069 0.243805 0.1202 0.25 0.23714 0.243876 0.1203 0.25 0.237212 0.243947 0.1204 0.25 0.237283 0.24402 0.1205 0.25 0.237355 0.244094 0.1206 0.25 0.237426 0.244169 0.1207 0.25 0.237498 0.244245 0.1208 0.25 0.23757 0.244321 0.1209 0.25 0.237642 0.244399 0.121 0.25 0.237715 0.244477 0.1211 0.25 0.237787 0.244556 0.1212 0.25 0.23786 0.244637 0.1213 0.25 0.237932 0.244718 0.1214 0.25 0.238005 0.244799 0.1215 0.25 0.238078 0.244882 0.1216 0.25 0.238151 0.244966 0.1217 0.25 0.238224 0.24505 0.1218 0.25 0.238297 0.245135 0.1219 0.25 0.238371 0.245221 0.122 0.25 0.238444 0.245308 0.1221 0.25 0.238518 0.245395 0.1222 0.25 0.238592 0.245484 0.1223 0.25 0.238665 0.245573 0.1224 0.25 0.238739 0.245662 0.1225 0.25 0.238814 0.245752 0.1226 0.25 0.238888 0.245843 0.1227 0.25 0.238962 0.245935 0.1228 0.25 0.239037 0.246027 0.1229 0.25 0.239111 0.24612 0.123 0.25 0.239186 0.246214 0.1231 0.25 0.239261 0.246308 0.1232 0.25 0.239336 0.246403 0.1233 0.25 0.239411 0.246498 0.1234 0.25 0.239486 0.246594 0.1235 0.25 0.239561 0.246691 0.1236 0.25 0.239637 0.246788 0.1237 0.25 0.239712 0.246885 0.1238 0.25 0.239788 0.246983 0.1239 0.25 0.239864 0.247082 0.124 0.25 0.239939 0.247181 0.1241 0.25 0.240015 0.24728 0.1242 0.25 0.240091 0.24738 0.1243 0.25 0.240168 0.247481 0.1244 0.25 0.240244 0.247581 0.1245 0.25 0.24032 0.247683 0.1246 0.25 0.240397 0.247784 0.1247 0.25 0.240473 0.247886 0.1248 0.25 0.24055 0.247988 0.1249 0.25 0.240627 0.248091 0.125 0.25 0.240704 0.248194 0.1251 0.25 0.240781 0.248297 0.1252 0.25 0.240858 0.2484 0.1253 0.25 0.240935 0.248504 0.1254 0.25 0.241012 0.248608 0.1255 0.25 0.241089 0.248712 0.1256 0.25 0.241167 0.248817 0.1257 0.25 0.241245 0.248921 0.1258 0.25 0.241322 0.249026 0.1259 0.25 0.2414 0.249131 0.126 0.25 0.241478 0.249236 0.1261 0.25 0.241556 0.249341 0.1262 0.25 0.241634 0.249447 0.1263 0.25 0.241712 0.249552 0.1264 0.25 0.24179 0.249658 0.1265 0.25 0.241868 0.249764 0.1266 0.25 0.241947 0.249869 0.1267 0.25 0.242025 0.249975 0.1268 0.25 0.242104 0.250081 0.1269 0.25 0.242182 0.250187 0.127 0.25 0.242261 0.250293 0.1271 0.25 0.24234 0.250399 0.1272 0.25 0.242419 0.250504 0.1273 0.25 0.242498 0.25061 0.1274 0.25 0.242577 0.250716 0.1275 0.25 0.242656 0.250821 0.1276 0.25 0.242735 0.250927 0.1277 0.25 0.242815 0.251032 0.1278 0.25 0.242894 0.251137 0.1279 0.25 0.242973 0.251242 0.128 0.25 0.243053 0.251347 0.1281 0.25 0.243133 0.251452 0.1282 0.25 0.243212 0.251556 0.1283 0.25 0.243292 0.251661 0.1284 0.25 0.243372 0.251765 0.1285 0.25 0.243452 0.251869 0.1286 0.25 0.243532 0.251972 0.1287 0.25 0.243612 0.252076 0.1288 0.25 0.243692 0.252179 0.1289 0.25 0.243772 0.252281 0.129 0.25 0.243853 0.252384 0.1291 0.25 0.243933 0.252486 0.1292 0.25 0.244013 0.252588 0.1293 0.25 0.244094 0.252689 0.1294 0.25 0.244174 0.25279 0.1295 0.25 0.244255 0.252891 0.1296 0.25 0.244336 0.252991 0.1297 0.25 0.244416 0.253091 0.1298 0.25 0.244497 0.25319 0.1299 0.25 0.244578 0.253289 0.13 0.25 0.244659 0.253387 0.1301 0.25 0.24474 0.253485 0.1302 0.25 0.244821 0.253583 0.1303 0.25 0.244902 0.25368 0.1304 0.25 0.244983 0.253776 0.1305 0.25 0.245065 0.253872 0.1306 0.25 0.245146 0.253967 0.1307 0.25 0.245227 0.254062 0.1308 0.25 0.245309 0.254156 0.1309 0.25 0.24539 0.25425 0.131 0.25 0.245472 0.254343 0.1311 0.25 0.245553 0.254435 0.1312 0.25 0.245635 0.254527 0.1313 0.25 0.245717 0.254618 0.1314 0.25 0.245798 0.254709 0.1315 0.25 0.24588 0.254798 0.1316 0.25 0.245962 0.254888 0.1317 0.25 0.246044 0.254976 0.1318 0.25 0.246126 0.255064 0.1319 0.25 0.246208 0.255151 0.132 0.25 0.24629 0.255237 0.1321 0.25 0.246372 0.255322 0.1322 0.25 0.246454 0.255407 0.1323 0.25 0.246536 0.255491 0.1324 0.25 0.246618 0.255574 0.1325 0.25 0.246701 0.255657 0.1326 0.25 0.246783 0.255738 0.1327 0.25 0.246865 0.255819 0.1328 0.25 0.246948 0.255899 0.1329 0.25 0.24703 0.255978 0.133 0.25 0.247113 0.256056 0.1331 0.25 0.247195 0.256134 0.1332 0.25 0.247278 0.25621 0.1333 0.25 0.24736 0.256286 0.1334 0.25 0.247443 0.25636 0.1335 0.25 0.247526 0.256434 0.1336 0.25 0.247608 0.256507 0.1337 0.25 0.247691 0.256579 0.1338 0.25 0.247774 0.25665 0.1339 0.25 0.247857 0.25672 0.134 0.25 0.247939 0.256789 0.1341 0.25 0.248022 0.256858 0.1342 0.25 0.248105 0.256925 0.1343 0.25 0.248188 0.256991 0.1344 0.25 0.248271 0.257056 0.1345 0.25 0.248354 0.25712 0.1346 0.25 0.248437 0.257184 0.1347 0.25 0.24852 0.257246 0.1348 0.25 0.248603 0.257307 0.1349 0.25 0.248686 0.257367 0.135 0.25 0.248769 0.257426 0.1351 0.25 0.248852 0.257484 0.1352 0.25 0.248936 0.257541 0.1353 0.25 0.249019 0.257597 0.1354 0.25 0.249102 0.257652 0.1355 0.25 0.249185 0.257706 0.1356 0.25 0.249268 0.257758 0.1357 0.25 0.249352 0.25781 0.1358 0.25 0.249435 0.25786 0.1359 0.25 0.249518 0.25791 0.136 0.25 0.249602 0.257958 0.1361 0.25 0.249685 0.258005 0.1362 0.25 0.249768 0.258051 0.1363 0.25 0.249852 0.258096 0.1364 0.25 0.249935 0.258139 0.1365 0.25 0.250018 0.258182 0.1366 0.25 0.250102 0.258223 0.1367 0.25 0.250185 0.258263 0.1368 0.25 0.250269 0.258302 0.1369 0.25 0.250352 0.25834 0.137 0.25 0.250436 0.258377 0.1371 0.25 0.250519 0.258412 0.1372 0.25 0.250603 0.258447 0.1373 0.25 0.250686 0.25848 0.1374 0.25 0.25077 0.258512 0.1375 0.25 0.250853 0.258543 0.1376 0.25 0.250937 0.258572 0.1377 0.25 0.25102 0.258601 0.1378 0.25 0.251104 0.258628 0.1379 0.25 0.251187 0.258654 0.138 0.25 0.251271 0.258678 0.1381 0.25 0.251354 0.258702 0.1382 0.25 0.251438 0.258724 0.1383 0.25 0.251521 0.258745 0.1384 0.25 0.251605 0.258765 0.1385 0.25 0.251688 0.258783 0.1386 0.25 0.251772 0.258801 0.1387 0.25 0.251855 0.258817 0.1388 0.25 0.251939 0.258832 0.1389 0.25 0.252023 0.258845 0.139 0.25 0.252106 0.258858 0.1391 0.25 0.25219 0.258869 0.1392 0.25 0.252273 0.258879 0.1393 0.25 0.252357 0.258888 0.1394 0.25 0.25244 0.258895 0.1395 0.25 0.252524 0.258901 0.1396 0.25 0.252607 0.258906 0.1397 0.25 0.252691 0.25891 0.1398 0.25 0.252774 0.258912 0.1399 0.25 0.252858 0.258914 0.14 0.25 0.252941 0.258914 0.1401 0.25 0.253024 0.258912 0.1402 0.25 0.253108 0.25891 0.1403 0.25 0.253191 0.258906 0.1404 0.25 0.253275 0.258901 0.1405 0.25 0.253358 0.258895 0.1406 0.25 0.253441 0.258887 0.1407 0.25 0.253525 0.258879 0.1408 0.25 0.253608 0.258869 0.1409 0.25 0.253691 0.258857 0.141 0.25 0.253775 0.258845 0.1411 0.25 0.253858 0.258831 0.1412 0.25 0.253941 0.258817 0.1413 0.25 0.254025 0.2588 0.1414 0.25 0.254108 0.258783 0.1415 0.25 0.254191 0.258765 0.1416 0.25 0.254274 0.258745 0.1417 0.25 0.254357 0.258724 0.1418 0.25 0.254441 0.258702 0.1419 0.25 0.254524 0.258678 0.142 0.25 0.254607 0.258654 0.1421 0.25 0.25469 0.258628 0.1422 0.25 0.254773 0.258601 0.1423 0.25 0.254856 0.258573 0.1424 0.25 0.254939 0.258543 0.1425 0.25 0.255022 0.258513 0.1426 0.25 0.255105 0.258481 0.1427 0.25 0.255188 0.258448 0.1428 0.25 0.255271 0.258414 0.1429 0.25 0.255353 0.258379 0.143 0.25 0.255436 0.258342 0.1431 0.25 0.255519 0.258305 0.1432 0.25 0.255602 0.258266 0.1433 0.25 0.255684 0.258226 0.1434 0.25 0.255767 0.258185 0.1435 0.25 0.25585 0.258143 0.1436 0.25 0.255932 0.2581 0.1437 0.25 0.256015 0.258055 0.1438 0.25 0.256098 0.25801 0.1439 0.25 0.25618 0.257963 0.144 0.25 0.256263 0.257916 0.1441 0.25 0.256345 0.257867 0.1442 0.25 0.256427 0.257817 0.1443 0.25 0.25651 0.257766 0.1444 0.25 0.256592 0.257714 0.1445 0.25 0.256674 0.257661 0.1446 0.25 0.256757 0.257607 0.1447 0.25 0.256839 0.257551 0.1448 0.25 0.256921 0.257495 0.1449 0.25 0.257003 0.257438 0.145 0.25 0.257085 0.25738 0.1451 0.25 0.257167 0.25732 0.1452 0.25 0.257249 0.25726 0.1453 0.25 0.257331 0.257199 0.1454 0.25 0.257413 0.257136 0.1455 0.25 0.257495 0.257073 0.1456 0.25 0.257576 0.257009 0.1457 0.25 0.257658 0.256943 0.1458 0.25 0.25774 0.256877 0.1459 0.25 0.257821 0.25681 0.146 0.25 0.257903 0.256742 0.1461 0.25 0.257984 0.256673 0.1462 0.25 0.258066 0.256603 0.1463 0.25 0.258147 0.256532 0.1464 0.25 0.258229 0.25646 0.1465 0.25 0.25831 0.256388 0.1466 0.25 0.258391 0.256314 0.1467 0.25 0.258472 0.25624 0.1468 0.25 0.258554 0.256165 0.1469 0.25 0.258635 0.256088 0.147 0.25 0.258716 0.256012 0.1471 0.25 0.258797 0.255934 0.1472 0.25 0.258878 0.255855 0.1473 0.25 0.258958 0.255776 0.1474 0.25 0.259039 0.255696 0.1475 0.25 0.25912 0.255615 0.1476 0.25 0.259201 0.255533 0.1477 0.25 0.259281 0.25545 0.1478 0.25 0.259362 0.255367 0.1479 0.25 0.259442 0.255283 0.148 0.25 0.259523 0.255198 0.1481 0.25 0.259603 0.255113 0.1482 0.25 0.259683 0.255026 0.1483 0.25 0.259764 0.25494 0.1484 0.25 0.259844 0.254852 0.1485 0.25 0.259924 0.254764 0.1486 0.25 0.260004 0.254675 0.1487 0.25 0.260084 0.254585 0.1488 0.25 0.260164 0.254495 0.1489 0.25 0.260244 0.254404 0.149 0.25 0.260323 0.254313 0.1491 0.25 0.260403 0.254221 0.1492 0.25 0.260483 0.254128 0.1493 0.25 0.260562 0.254035 0.1494 0.25 0.260642 0.253941 0.1495 0.25 0.260721 0.253847 0.1496 0.25 0.2608 0.253752 0.1497 0.25 0.26088 0.253657 0.1498 0.25 0.260959 0.253561 0.1499 0.25 0.261038 0.253465 0.15 0.25 0.261117 0.253368 0.1501 0.25 0.261196 0.25327 0.1502 0.25 0.261275 0.253172 0.1503 0.25 0.261353 0.253074 0.1504 0.25 0.261432 0.252975 0.1505 0.25 0.261511 0.252876 0.1506 0.25 0.261589 0.252777 0.1507 0.25 0.261668 0.252677 0.1508 0.25 0.261746 0.252577 0.1509 0.25 0.261825 0.252476 0.151 0.25 0.261903 0.252375 0.1511 0.25 0.261981 0.252273 0.1512 0.25 0.262059 0.252172 0.1513 0.25 0.262137 0.25207 0.1514 0.25 0.262215 0.251967 0.1515 0.25 0.262293 0.251865 0.1516 0.25 0.26237 0.251762 0.1517 0.25 0.262448 0.251659 0.1518 0.25 0.262526 0.251555 0.1519 0.25 0.262603 0.251452 0.152 0.25 0.26268 0.251348 0.1521 0.25 0.262758 0.251244 0.1522 0.25 0.262835 0.251139 0.1523 0.25 0.262912 0.251035 0.1524 0.25 0.262989 0.25093 0.1525 0.25 0.263066 0.250825 0.1526 0.25 0.263143 0.25072 0.1527 0.25 0.26322 0.250615 0.1528 0.25 0.263296 0.25051 0.1529 0.25 0.263373 0.250405 0.153 0.25 0.263449 0.250299 0.1531 0.25 0.263526 0.250194 0.1532 0.25 0.263602 0.250088 0.1533 0.25 0.263678 0.249983 0.1534 0.25 0.263754 0.249877 0.1535 0.25 0.26383 0.249772 0.1536 0.25 0.263906 0.249666 0.1537 0.25 0.263982 0.24956 0.1538 0.25 0.264058 0.249455 0.1539 0.25 0.264133 0.249349 0.154 0.25 0.264209 0.249244 0.1541 0.25 0.264284 0.249138 0.1542 0.25 0.264359 0.249033 0.1543 0.25 0.264435 0.248928 0.1544 0.25 0.26451 0.248822 0.1545 0.25 0.264585 0.248717 0.1546 0.25 0.26466 0.248612 0.1547 0.25 0.264734 0.248508 0.1548 0.25 0.264809 0.248403 0.1549 0.25 0.264884 0.248298 0.155 0.25 0.264958 0.248194 0.1551 0.25 0.265032 0.24809 0.1552 0.25 0.265107 0.247986 0.1553 0.25 0.265181 0.247882 0.1554 0.25 0.265255 0.247779 0.1555 0.25 0.265329 0.247676 0.1556 0.25 0.265403 0.247573 0.1557 0.25 0.265476 0.24747 0.1558 0.25 0.26555 0.247368 0.1559 0.25 0.265624 0.247266 0.156 0.25 0.265697 0.247164 0.1561 0.25 0.26577 0.247063 0.1562 0.25 0.265844 0.246962 0.1563 0.25 0.265917 0.246861 0.1564 0.25 0.26599 0.24676 0.1565 0.25 0.266062 0.24666 0.1566 0.25 0.266135 0.246561 0.1567 0.25 0.266208 0.246462 0.1568 0.25 0.26628 0.246363 0.1569 0.25 0.266353 0.246265 0.157 0.25 0.266425 0.246167 0.1571 0.25 0.266497 0.246069 0.1572 0.25 0.266569 0.245972 0.1573 0.25 0.266641 0.245876 0.1574 0.25 0.266713 0.24578 0.1575 0.25 0.266785 0.245684 0.1576 0.25 0.266856 0.245589 0.1577 0.25 0.266928 0.245495 0.1578 0.25 0.266999 0.245401 0.1579 0.25 0.26707 0.245307 0.158 0.25 0.267141 0.245214 0.1581 0.25 0.267212 0.245122 0.1582 0.25 0.267283 0.24503 0.1583 0.25 0.267354 0.244939 0.1584 0.25 0.267424 0.244849 0.1585 0.25 0.267495 0.244759 0.1586 0.25 0.267565 0.24467 0.1587 0.25 0.267635 0.244581 0.1588 0.25 0.267706 0.244493 0.1589 0.25 0.267776 0.244406 0.159 0.25 0.267845 0.244319 0.1591 0.25 0.267915 0.244233 0.1592 0.25 0.267985 0.244148 0.1593 0.25 0.268054 0.244063 0.1594 0.25 0.268124 0.243979 0.1595 0.25 0.268193 0.243896 0.1596 0.25 0.268262 0.243814 0.1597 0.25 0.268331 0.243732 0.1598 0.25 0.2684 0.243651 0.1599 0.25 0.268468 0.243571 0.16 0.25 0.268537 0.243492 0.1601 0.25 0.268605 0.243413 0.1602 0.25 0.268674 0.243336 0.1603 0.25 0.268742 0.243259 0.1604 0.25 0.26881 0.243183 0.1605 0.25 0.268878 0.243107 0.1606 0.25 0.268946 0.243033 0.1607 0.25 0.269013 0.242959 0.1608 0.25 0.269081 0.242886 0.1609 0.25 0.269148 0.242814 0.161 0.25 0.269216 0.242743 0.1611 0.25 0.269283 0.242673 0.1612 0.25 0.26935 0.242604 0.1613 0.25 0.269416 0.242535 0.1614 0.25 0.269483 0.242468 0.1615 0.25 0.26955 0.242401 0.1616 0.25 0.269616 0.242336 0.1617 0.25 0.269682 0.242271 0.1618 0.25 0.269749 0.242207 0.1619 0.25 0.269815 0.242144 0.162 0.25 0.26988 0.242082 0.1621 0.25 0.269946 0.242021 0.1622 0.25 0.270012 0.241961 0.1623 0.25 0.270077 0.241902 0.1624 0.25 0.270143 0.241844 0.1625 0.25 0.270208 0.241787 0.1626 0.25 0.270273 0.241731 0.1627 0.25 0.270338 0.241676 0.1628 0.25 0.270402 0.241622 0.1629 0.25 0.270467 0.241569 0.163 0.25 0.270531 0.241516 0.1631 0.25 0.270596 0.241465 0.1632 0.25 0.27066 0.241415 0.1633 0.25 0.270724 0.241366 0.1634 0.25 0.270788 0.241319 0.1635 0.25 0.270851 0.241272 0.1636 0.25 0.270915 0.241226 0.1637 0.25 0.270978 0.241181 0.1638 0.25 0.271042 0.241137 0.1639 0.25 0.271105 0.241095 0.164 0.25 0.271168 0.241053 0.1641 0.25 0.271231 0.241013 0.1642 0.25 0.271293 0.240973 0.1643 0.25 0.271356 0.240935 0.1644 0.25 0.271418 0.240898 0.1645 0.25 0.27148 0.240862 0.1646 0.25 0.271542 0.240827 0.1647 0.25 0.271604 0.240793 0.1648 0.25 0.271666 0.24076 0.1649 0.25 0.271728 0.240729 0.165 0.25 0.271789 0.240698 0.1651 0.25 0.271851 0.240669 0.1652 0.25 0.271912 0.24064 0.1653 0.25 0.271973 0.240613 0.1654 0.25 0.272034 0.240587 0.1655 0.25 0.272094 0.240562 0.1656 0.25 0.272155 0.240539 0.1657 0.25 0.272215 0.240516 0.1658 0.25 0.272275 0.240494 0.1659 0.25 0.272335 0.240474 0.166 0.25 0.272395 0.240455 0.1661 0.25 0.272455 0.240437 0.1662 0.25 0.272515 0.24042 0.1663 0.25 0.272574 0.240404 0.1664 0.25 0.272633 0.24039 0.1665 0.25 0.272693 0.240376 0.1666 0.25 0.272752 0.240364 0.1667 0.25 0.27281 0.240353 0.1668 0.25 0.272869 0.240343 0.1669 0.25 0.272927 0.240334 0.167 0.25 0.272986 0.240327 0.1671 0.25 0.273044 0.24032 0.1672 0.25 0.273102 0.240315 0.1673 0.25 0.27316 0.240311 0.1674 0.25 0.273217 0.240308 0.1675 0.25 0.273275 0.240306 0.1676 0.25 0.273332 0.240306 0.1677 0.25 0.273389 0.240306 0.1678 0.25 0.273446 0.240308 0.1679 0.25 0.273503 0.240311 0.168 0.25 0.27356 0.240315 0.1681 0.25 0.273616 0.24032 0.1682 0.25 0.273673 0.240327 0.1683 0.25 0.273729 0.240334 0.1684 0.25 0.273785 0.240343 0.1685 0.25 0.273841 0.240353 0.1686 0.25 0.273897 0.240364 0.1687 0.25 0.273952 0.240376 0.1688 0.25 0.274007 0.24039 0.1689 0.25 0.274063 0.240404 0.169 0.25 0.274118 0.24042 0.1691 0.25 0.274172 0.240437 0.1692 0.25 0.274227 0.240455 0.1693 0.25 0.274282 0.240474 0.1694 0.25 0.274336 0.240494 0.1695 0.25 0.27439 0.240516 0.1696 0.25 0.274444 0.240538 0.1697 0.25 0.274498 0.240562 0.1698 0.25 0.274552 0.240587 0.1699 0.25 0.274605 0.240613 0.17 0.25 0.274658 0.24064 0.1701 0.25 0.274711 0.240668 0.1702 0.25 0.274764 0.240698 0.1703 0.25 0.274817 0.240728 0.1704 0.25 0.27487 0.24076 0.1705 0.25 0.274922 0.240792 0.1706 0.25 0.274974 0.240826 0.1707 0.25 0.275027 0.240861 0.1708 0.25 0.275078 0.240897 0.1709 0.25 0.27513 0.240934 0.171 0.25 0.275182 0.240972 0.1711 0.25 0.275233 0.241012 0.1712 0.25 0.275284 0.241052 0.1713 0.25 0.275335 0.241093 0.1714 0.25 0.275386 0.241136 0.1715 0.25 0.275437 0.241179 0.1716 0.25 0.275487 0.241224 0.1717 0.25 0.275538 0.24127 0.1718 0.25 0.275588 0.241317 0.1719 0.25 0.275638 0.241364 0.172 0.25 0.275687 0.241413 0.1721 0.25 0.275737 0.241463 0.1722 0.25 0.275787 0.241514 0.1723 0.25 0.275836 0.241566 0.1724 0.25 0.275885 0.241619 0.1725 0.25 0.275934 0.241673 0.1726 0.25 0.275982 0.241728 0.1727 0.25 0.276031 0.241784 0.1728 0.25 0.276079 0.24184 0.1729 0.25 0.276127 0.241898 0.173 0.25 0.276175 0.241957 0.1731 0.25 0.276223 0.242017 0.1732 0.25 0.276271 0.242078 0.1733 0.25 0.276318 0.24214 0.1734 0.25 0.276365 0.242202 0.1735 0.25 0.276412 0.242266 0.1736 0.25 0.276459 0.242331 0.1737 0.25 0.276506 0.242396 0.1738 0.25 0.276552 0.242463 0.1739 0.25 0.276599 0.24253 0.174 0.25 0.276645 0.242598 0.1741 0.25 0.276691 0.242667 0.1742 0.25 0.276737 0.242737 0.1743 0.25 0.276782 0.242808 0.1744 0.25 0.276827 0.24288 0.1745 0.25 0.276873 0.242953 0.1746 0.25 0.276918 0.243026 0.1747 0.25 0.276962 0.2431 0.1748 0.25 0.277007 0.243176 0.1749 0.25 0.277052 0.243252 0.175 0.25 0.277096 0.243328 0.1751 0.25 0.27714 0.243406 0.1752 0.25 0.277184 0.243484 0.1753 0.25 0.277227 0.243564 0.1754 0.25 0.277271 0.243644 0.1755 0.25 0.277314 0.243724 0.1756 0.25 0.277357 0.243806 0.1757 0.25 0.2774 0.243888 0.1758 0.25 0.277443 0.243971 0.1759 0.25 0.277486 0.244055 0.176 0.25 0.277528 0.244139 0.1761 0.25 0.27757 0.244225 0.1762 0.25 0.277612 0.244311 0.1763 0.25 0.277654 0.244397 0.1764 0.25 0.277695 0.244484 0.1765 0.25 0.277737 0.244572 0.1766 0.25 0.277778 0.244661 0.1767 0.25 0.277819 0.24475 0.1768 0.25 0.27786 0.24484 0.1769 0.25 0.2779 0.244931 0.177 0.25 0.277941 0.245022 0.1771 0.25 0.277981 0.245114 0.1772 0.25 0.278021 0.245206 0.1773 0.25 0.278061 0.245299 0.1774 0.25 0.278101 0.245393 0.1775 0.25 0.27814 0.245487 0.1776 0.25 0.278179 0.245582 0.1777 0.25 0.278218 0.245677 0.1778 0.25 0.278257 0.245773 0.1779 0.25 0.278296 0.245869 0.178 0.25 0.278334 0.245966 0.1781 0.25 0.278373 0.246063 0.1782 0.25 0.278411 0.246161 0.1783 0.25 0.278448 0.246259 0.1784 0.25 0.278486 0.246358 0.1785 0.25 0.278524 0.246457 0.1786 0.25 0.278561 0.246557 0.1787 0.25 0.278598 0.246657 0.1788 0.25 0.278635 0.246758 0.1789 0.25 0.278672 0.246859 0.179 0.25 0.278708 0.24696 0.1791 0.25 0.278744 0.247062 0.1792 0.25 0.27878 0.247164 0.1793 0.25 0.278816 0.247266 0.1794 0.25 0.278852 0.247369 0.1795 0.25 0.278887 0.247473 0.1796 0.25 0.278923 0.247576 0.1797 0.25 0.278958 0.24768 0.1798 0.25 0.278993 0.247784 0.1799 0.25 0.279027 0.247889 0.18 0.25 0.279062 0.247994 0.1801 0.25 0.279096 0.248099 0.1802 0.25 0.27913 0.248204 0.1803 0.25 0.279164 0.248309 0.1804 0.25 0.279198 0.248415 0.1805 0.25 0.279231 0.248521 0.1806 0.25 0.279265 0.248628 0.1807 0.25 0.279298 0.248734 0.1808 0.25 0.279331 0.248841 0.1809 0.25 0.279363 0.248947 0.181 0.25 0.279396 0.249054 0.1811 0.25 0.279428 0.249162 0.1812 0.25 0.27946 0.249269 0.1813 0.25 0.279492 0.249376 0.1814 0.25 0.279523 0.249484 0.1815 0.25 0.279555 0.249592 0.1816 0.25 0.279586 0.249699 0.1817 0.25 0.279617 0.249807 0.1818 0.25 0.279648 0.249915 0.1819 0.25 0.279679 0.250023 0.182 0.25 0.279709 0.250131 0.1821 0.25 0.279739 0.250239 0.1822 0.25 0.279769 0.250347 0.1823 0.25 0.279799 0.250455 0.1824 0.25 0.279829 0.250563 0.1825 0.25 0.279858 0.250671 0.1826 0.25 0.279887 0.250779 0.1827 0.25 0.279916 0.250887 0.1828 0.25 0.279945 0.250995 0.1829 0.25 0.279974 0.251103 0.183 0.25 0.280002 0.251211 0.1831 0.25 0.28003 0.251318 0.1832 0.25 0.280058 0.251426 0.1833 0.25 0.280086 0.251534 0.1834 0.25 0.280113 0.251641 0.1835 0.25 0.280141 0.251748 0.1836 0.25 0.280168 0.251855 0.1837 0.25 0.280195 0.251962 0.1838 0.25 0.280221 0.252069 0.1839 0.25 0.280248 0.252175 0.184 0.25 0.280274 0.252282 0.1841 0.25 0.2803 0.252388 0.1842 0.25 0.280326 0.252494 0.1843 0.25 0.280352 0.2526 0.1844 0.25 0.280377 0.252705 0.1845 0.25 0.280402 0.25281 0.1846 0.25 0.280427 0.252915 0.1847 0.25 0.280452 0.25302 0.1848 0.25 0.280477 0.253124 0.1849 0.25 0.280501 0.253229 0.185 0.25 0.280525 0.253332 0.1851 0.25 0.280549 0.253436 0.1852 0.25 0.280573 0.253539 0.1853 0.25 0.280596 0.253642 0.1854 0.25 0.28062 0.253744 0.1855 0.25 0.280643 0.253846 0.1856 0.25 0.280666 0.253948 0.1857 0.25 0.280689 0.254049 0.1858 0.25 0.280711 0.25415 0.1859 0.25 0.280733 0.25425 0.186 0.25 0.280755 0.254351 0.1861 0.25 0.280777 0.25445 0.1862 0.25 0.280799 0.254549 0.1863 0.25 0.28082 0.254648 0.1864 0.25 0.280842 0.254746 0.1865 0.25 0.280863 0.254844 0.1866 0.25 0.280883 0.254941 0.1867 0.25 0.280904 0.255038 0.1868 0.25 0.280924 0.255134 0.1869 0.25 0.280944 0.25523 0.187 0.25 0.280964 0.255325 0.1871 0.25 0.280984 0.25542 0.1872 0.25 0.281004 0.255514 0.1873 0.25 0.281023 0.255607 0.1874 0.25 0.281042 0.2557 0.1875 0.25 0.281061 0.255793 0.1876 0.25 0.281079 0.255884 0.1877 0.25 0.281098 0.255976 0.1878 0.25 0.281116 0.256066 0.1879 0.25 0.281134 0.256156 0.188 0.25 0.281152 0.256245 0.1881 0.25 0.28117 0.256334 0.1882 0.25 0.281187 0.256422 0.1883 0.25 0.281204 0.256509 0.1884 0.25 0.281221 0.256596 0.1885 0.25 0.281238 0.256682 0.1886 0.25 0.281254 0.256767 0.1887 0.25 0.281271 0.256852 0.1888 0.25 0.281287 0.256936 0.1889 0.25 0.281303 0.257019 0.189 0.25 0.281318 0.257101 0.1891 0.25 0.281334 0.257183 0.1892 0.25 0.281349 0.257264 0.1893 0.25 0.281364 0.257344 0.1894 0.25 0.281379 0.257423 0.1895 0.25 0.281393 0.257502 0.1896 0.25 0.281408 0.25758 0.1897 0.25 0.281422 0.257657 0.1898 0.25 0.281436 0.257733 0.1899 0.25 0.281449 0.257808 0.19 0.25 0.281463 0.257883 0.1901 0.25 0.281476 0.257957 0.1902 0.25 0.281489 0.25803 0.1903 0.25 0.281502 0.258102 0.1904 0.25 0.281515 0.258173 0.1905 0.25 0.281527 0.258244 0.1906 0.25 0.281539 0.258313 0.1907 0.25 0.281551 0.258382 0.1908 0.25 0.281563 0.25845 0.1909 0.25 0.281574 0.258517 0.191 0.25 0.281586 0.258583 0.1911 0.25 0.281597 0.258648 0.1912 0.25 0.281608 0.258712 0.1913 0.25 0.281618 0.258775 0.1914 0.25 0.281629 0.258838 0.1915 0.25 0.281639 0.258899 0.1916 0.25 0.281649 0.25896 0.1917 0.25 0.281659 0.259019 0.1918 0.25 0.281669 0.259078 0.1919 0.25 0.281678 0.259135 0.192 0.25 0.281687 0.259192 0.1921 0.25 0.281696 0.259248 0.1922 0.25 0.281705 0.259303 0.1923 0.25 0.281713 0.259356 0.1924 0.25 0.281722 0.259409 0.1925 0.25 0.28173 0.259461 0.1926 0.25 0.281737 0.259512 0.1927 0.25 0.281745 0.259562 0.1928 0.25 0.281752 0.25961 0.1929 0.25 0.28176 0.259658 0.193 0.25 0.281767 0.259705 0.1931 0.25 0.281773 0.259751 0.1932 0.25 0.28178 0.259795 0.1933 0.25 0.281786 0.259839 0.1934 0.25 0.281792 0.259882 0.1935 0.25 0.281798 0.259923 0.1936 0.25 0.281804 0.259964 0.1937 0.25 0.281809 0.260003 0.1938 0.25 0.281814 0.260042 0.1939 0.25 0.281819 0.260079 0.194 0.25 0.281824 0.260115 0.1941 0.25 0.281829 0.260151 0.1942 0.25 0.281833 0.260185 0.1943 0.25 0.281837 0.260218 0.1944 0.25 0.281841 0.26025 0.1945 0.25 0.281845 0.260281 0.1946 0.25 0.281848 0.260311 0.1947 0.25 0.281852 0.260339 0.1948 0.25 0.281855 0.260367 0.1949 0.25 0.281857 0.260394 0.195 0.25 0.28186 0.260419 0.1951 0.25 0.281862 0.260443 0.1952 0.25 0.281865 0.260467 0.1953 0.25 0.281867 0.260489 0.1954 0.25 0.281868 0.26051 0.1955 0.25 0.28187 0.26053 0.1956 0.25 0.281871 0.260548 0.1957 0.25 0.281872 0.260566 0.1958 0.25 0.281873 0.260583 0.1959 0.25 0.281874 0.260598 0.196 0.25 0.281874 0.260613 0.1961 0.25 0.281874 0.260626 0.1962 0.25 0.281874 0.260638 0.1963 0.25 0.281874 0.260649 0.1964 0.25 0.281873 0.260659 0.1965 0.25 0.281873 0.260667 0.1966 0.25 0.281872 0.260675 0.1967 0.25 0.281871 0.260681 0.1968 0.25 0.281869 0.260686 0.1969 0.25 0.281868 0.260691 0.197 0.25 0.281866 0.260694 0.1971 0.25 0.281864 0.260696 0.1972 0.25 0.281862 0.260696 0.1973 0.25 0.281859 0.260696 0.1974 0.25 0.281857 0.260694 0.1975 0.25 0.281854 0.260692 0.1976 0.25 0.281851 0.260688 0.1977 0.25 0.281847 0.260683 0.1978 0.25 0.281844 0.260677 0.1979 0.25 0.28184 0.26067 0.198 0.25 0.281836 0.260661 0.1981 0.25 0.281832 0.260652 0.1982 0.25 0.281828 0.260641 0.1983 0.25 0.281823 0.26063 0.1984 0.25 0.281818 0.260617 0.1985 0.25 0.281813 0.260603 0.1986 0.25 0.281808 0.260588 0.1987 0.25 0.281802 0.260572 0.1988 0.25 0.281796 0.260554 0.1989 0.25 0.28179 0.260536 0.199 0.25 0.281784 0.260516 0.1991 0.25 0.281778 0.260495 0.1992 0.25 0.281771 0.260474 0.1993 0.25 0.281765 0.260451 0.1994 0.25 0.281757 0.260427 0.1995 0.25 0.28175 0.260401 0.1996 0.25 0.281743 0.260375 0.1997 0.25 0.281735 0.260348 0.1998 0.25 0.281727 0.260319 0.1999 0.25 0.281719 0.26029 0.2 0.25 0.281711 0.260259 0.2001 0.25 0.281702 0.260227 0.2002 0.25 0.281693 0.260194 0.2003 0.25 0.281684 0.26016 0.2004 0.25 0.281675 0.260125 0.2005 0.25 0.281666 0.260089 0.2006 0.25 0.281656 0.260052 0.2007 0.25 0.281646 0.260014 0.2008 0.25 0.281636 0.259974 0.2009 0.25 0.281626 0.259934 0.201 0.25 0.281615 0.259893 0.2011 0.25 0.281604 0.25985 0.2012 0.25 0.281593 0.259807 0.2013 0.25 0.281582 0.259762 0.2014 0.25 0.281571 0.259716 0.2015 0.25 0.281559 0.25967 0.2016 0.25 0.281547 0.259622 0.2017 0.25 0.281535 0.259573 0.2018 0.25 0.281523 0.259523 0.2019 0.25 0.281511 0.259473 0.202 0.25 0.281498 0.259421 0.2021 0.25 0.281485 0.259368 0.2022 0.25 0.281472 0.259314 0.2023 0.25 0.281459 0.259259 0.2024 0.25 0.281445 0.259203 0.2025 0.25 0.281431 0.259147 0.2026 0.25 0.281417 0.259089 0.2027 0.25 0.281403 0.25903 0.2028 0.25 0.281388 0.25897 0.2029 0.25 0.281374 0.25891 0.203 0.25 0.281359 0.258848 0.2031 0.25 0.281344 0.258785 0.2032 0.25 0.281329 0.258722 0.2033 0.25 0.281313 0.258657 0.2034 0.25 0.281297 0.258592 0.2035 0.25 0.281281 0.258525 0.2036 0.25 0.281265 0.258458 0.2037 0.25 0.281249 0.25839 0.2038 0.25 0.281232 0.258321 0.2039 0.25 0.281215 0.258251 0.204 0.25 0.281198 0.25818 0.2041 0.25 0.281181 0.258108 0.2042 0.25 0.281164 0.258036 0.2043 0.25 0.281146 0.257962 0.2044 0.25 0.281128 0.257888 0.2045 0.25 0.28111 0.257812 0.2046 0.25 0.281092 0.257736 0.2047 0.25 0.281073 0.257659 0.2048 0.25 0.281054 0.257582 0.2049 0.25 0.281035 0.257503 0.205 0.25 0.281016 0.257424 0.2051 0.25 0.280997 0.257344 0.2052 0.25 0.280977 0.257263 0.2053 0.25 0.280957 0.257181 0.2054 0.25 0.280937 0.257098 0.2055 0.25 0.280917 0.257015 0.2056 0.25 0.280897 0.256931 0.2057 0.25 0.280876 0.256846 0.2058 0.25 0.280855 0.25676 0.2059 0.25 0.280834 0.256674 0.206 0.25 0.280812 0.256587 0.2061 0.25 0.280791 0.256499 0.2062 0.25 0.280769 0.25641 0.2063 0.25 0.280747 0.256321 0.2064 0.25 0.280725 0.256231 0.2065 0.25 0.280703 0.256141 0.2066 0.25 0.28068 0.256049 0.2067 0.25 0.280657 0.255957 0.2068 0.25 0.280634 0.255865 0.2069 0.25 0.280611 0.255771 0.207 0.25 0.280587 0.255677 0.2071 0.25 0.280564 0.255583 0.2072 0.25 0.28054 0.255488 0.2073 0.25 0.280516 0.255392 0.2074 0.25 0.280492 0.255296 0.2075 0.25 0.280467 0.255199 0.2076 0.25 0.280442 0.255101 0.2077 0.25 0.280417 0.255003 0.2078 0.25 0.280392 0.254904 0.2079 0.25 0.280367 0.254805 0.208 0.25 0.280341 0.254705 0.2081 0.25 0.280315 0.254605 0.2082 0.25 0.280289 0.254504 0.2083 0.25 0.280263 0.254402 0.2084 0.25 0.280237 0.2543 0.2085 0.25 0.28021 0.254198 0.2086 0.25 0.280183 0.254095 0.2087 0.25 0.280156 0.253992 0.2088 0.25 0.280129 0.253888 0.2089 0.25 0.280102 0.253784 0.209 0.25 0.280074 0.253679 0.2091 0.25 0.280046 0.253574 0.2092 0.25 0.280018 0.253468 0.2093 0.25 0.27999 0.253362 0.2094 0.25 0.279961 0.253256 0.2095 0.25 0.279932 0.253149 0.2096 0.25 0.279903 0.253042 0.2097 0.25 0.279874 0.252935 0.2098 0.25 0.279845 0.252827 0.2099 0.25 0.279815 0.252719 0.21 0.25 0.279786 0.25261 0.2101 0.25 0.279756 0.252501 0.2102 0.25 0.279725 0.252392 0.2103 0.25 0.279695 0.252282 0.2104 0.25 0.279664 0.252173 0.2105 0.25 0.279634 0.252063 0.2106 0.25 0.279603 0.251952 0.2107 0.25 0.279571 0.251842 0.2108 0.25 0.27954 0.251731 0.2109 0.25 0.279508 0.25162 0.211 0.25 0.279476 0.251508 0.2111 0.25 0.279444 0.251397 0.2112 0.25 0.279412 0.251285 0.2113 0.25 0.27938 0.251173 0.2114 0.25 0.279347 0.251061 0.2115 0.25 0.279314 0.250949 0.2116 0.25 0.279281 0.250837 0.2117 0.25 0.279248 0.250724 0.2118 0.25 0.279214 0.250611 0.2119 0.25 0.279181 0.250498 0.212 0.25 0.279147 0.250385 0.2121 0.25 0.279113 0.250272 0.2122 0.25 0.279078 0.250159 0.2123 0.25 0.279044 0.250046 0.2124 0.25 0.279009 0.249933 0.2125 0.25 0.278974 0.249819 0.2126 0.25 0.278939 0.249706 0.2127 0.25 0.278904 0.249593 0.2128 0.25 0.278868 0.249479 0.2129 0.25 0.278832 0.249366 0.213 0.25 0.278796 0.249252 0.2131 0.25 0.27876 0.249139 0.2132 0.25 0.278724 0.249025 0.2133 0.25 0.278687 0.248912 0.2134 0.25 0.278651 0.248799 0.2135 0.25 0.278614 0.248685 0.2136 0.25 0.278577 0.248572 0.2137 0.25 0.278539 0.248459 0.2138 0.25 0.278502 0.248346 0.2139 0.25 0.278464 0.248233 0.214 0.25 0.278426 0.24812 0.2141 0.25 0.278388 0.248007 0.2142 0.25 0.278349 0.247895 0.2143 0.25 0.278311 0.247782 0.2144 0.25 0.278272 0.24767 0.2145 0.25 0.278233 0.247558 0.2146 0.25 0.278194 0.247446 0.2147 0.25 0.278155 0.247334 0.2148 0.25 0.278115 0.247223 0.2149 0.25 0.278075 0.247111 0.215 0.25 0.278035 0.247 0.2151 0.25 0.277995 0.246889 0.2152 0.25 0.277955 0.246779 0.2153 0.25 0.277914 0.246668 0.2154 0.25 0.277873 0.246558 0.2155 0.25 0.277833 0.246448 0.2156 0.25 0.277791 0.246339 0.2157 0.25 0.27775 0.24623 0.2158 0.25 0.277708 0.246121 0.2159 0.25 0.277667 0.246012 0.216 0.25 0.277625 0.245904 0.2161 0.25 0.277583 0.245796 0.2162 0.25 0.27754 0.245688 0.2163 0.25 0.277498 0.245581 0.2164 0.25 0.277455 0.245474 0.2165 0.25 0.277412 0.245368 0.2166 0.25 0.277369 0.245262 0.2167 0.25 0.277326 0.245156 0.2168 0.25 0.277282 0.245051 0.2169 0.25 0.277238 0.244946 0.217 0.25 0.277195 0.244842 0.2171 0.25 0.277151 0.244738 0.2172 0.25 0.277106 0.244634 0.2173 0.25 0.277062 0.244531 0.2174 0.25 0.277017 0.244429 0.2175 0.25 0.276972 0.244327 0.2176 0.25 0.276927 0.244225 0.2177 0.25 0.276882 0.244124 0.2178 0.25 0.276836 0.244024 0.2179 0.25 0.276791 0.243924 0.218 0.25 0.276745 0.243824 0.2181 0.25 0.276699 0.243726 0.2182 0.25 0.276653 0.243627 0.2183 0.25 0.276606 0.24353 0.2184 0.25 0.27656 0.243432 0.2185 0.25 0.276513 0.243336 0.2186 0.25 0.276466 0.24324 0.2187 0.25 0.276419 0.243145 0.2188 0.25 0.276371 0.24305 0.2189 0.25 0.276324 0.242956 0.219 0.25 0.276276 0.242862 0.2191 0.25 0.276228 0.242769 0.2192 0.25 0.27618 0.242677 0.2193 0.25 0.276132 0.242586 0.2194 0.25 0.276083 0.242495 0.2195 0.25 0.276035 0.242405 0.2196 0.25 0.275986 0.242315 0.2197 0.25 0.275937 0.242227 0.2198 0.25 0.275887 0.242138 0.2199 0.25 0.275838 0.242051 0.22 0.25 0.275788 0.241965 0.2201 0.25 0.275739 0.241879 0.2202 0.25 0.275689 0.241794 0.2203 0.25 0.275638 0.241709 0.2204 0.25 0.275588 0.241626 0.2205 0.25 0.275537 0.241543 0.2206 0.25 0.275487 0.241461 0.2207 0.25 0.275436 0.241379 0.2208 0.25 0.275385 0.241299 0.2209 0.25 0.275333 0.241219 0.221 0.25 0.275282 0.24114 0.2211 0.25 0.27523 0.241062 0.2212 0.25 0.275178 0.240985 0.2213 0.25 0.275126 0.240909 0.2214 0.25 0.275074 0.240833 0.2215 0.25 0.275022 0.240758 0.2216 0.25 0.274969 0.240685 0.2217 0.25 0.274916 0.240612 0.2218 0.25 0.274863 0.240539 0.2219 0.25 0.27481 0.240468 0.222 0.25 0.274757 0.240398 0.2221 0.25 0.274703 0.240328 0.2222 0.25 0.27465 0.24026 0.2223 0.25 0.274596 0.240192 0.2224 0.25 0.274542 0.240125 0.2225 0.25 0.274488 0.24006 0.2226 0.25 0.274433 0.239995 0.2227 0.25 0.274379 0.239931 0.2228 0.25 0.274324 0.239868 0.2229 0.25 0.274269 0.239806 0.223 0.25 0.274214 0.239744 0.2231 0.25 0.274158 0.239684 0.2232 0.25 0.274103 0.239625 0.2233 0.25 0.274047 0.239567 0.2234 0.25 0.273991 0.239509 0.2235 0.25 0.273935 0.239453 0.2236 0.25 0.273879 0.239398 0.2237 0.25 0.273823 0.239344 0.2238 0.25 0.273766 0.23929 0.2239 0.25 0.27371 0.239238 0.224 0.25 0.273653 0.239187 0.2241 0.25 0.273596 0.239136 0.2242 0.25 0.273538 0.239087 0.2243 0.25 0.273481 0.239039 0.2244 0.25 0.273423 0.238992 0.2245 0.25 0.273366 0.238945 0.2246 0.25 0.273308 0.2389 0.2247 0.25 0.273249 0.238856 0.2248 0.25 0.273191 0.238813 0.2249 0.25 0.273133 0.238771 0.225 0.25 0.273074 0.23873 0.2251 0.25 0.273015 0.23869 0.2252 0.25 0.272956 0.238652 0.2253 0.25 0.272897 0.238614 0.2254 0.25 0.272838 0.238577 0.2255 0.25 0.272778 0.238541 0.2256 0.25 0.272719 0.238507 0.2257 0.25 0.272659 0.238474 0.2258 0.25 0.272599 0.238441 0.2259 0.25 0.272538 0.23841 0.226 0.25 0.272478 0.23838 0.2261 0.25 0.272418 0.238351 0.2262 0.25 0.272357 0.238323 0.2263 0.25 0.272296 0.238296 0.2264 0.25 0.272235 0.23827 0.2265 0.25 0.272174 0.238246 0.2266 0.25 0.272112 0.238222 0.2267 0.25 0.272051 0.2382 0.2268 0.25 0.271989 0.238178 0.2269 0.25 0.271927 0.238158 0.227 0.25 0.271865 0.238139 0.2271 0.25 0.271803 0.238121 0.2272 0.25 0.271741 0.238104 0.2273 0.25 0.271678 0.238089 0.2274 0.25 0.271615 0.238074 0.2275 0.25 0.271552 0.238061 0.2276 0.25 0.271489 0.238048 0.2277 0.25 0.271426 0.238037 0.2278 0.25 0.271363 0.238027 0.2279 0.25 0.271299 0.238018 0.228 0.25 0.271236 0.238011 0.2281 0.25 0.271172 0.238004 0.2282 0.25 0.271108 0.237999 0.2283 0.25 0.271043 0.237994 0.2284 0.25 0.270979 0.237991 0.2285 0.25 0.270915 0.237989 0.2286 0.25 0.27085 0.237988 0.2287 0.25 0.270785 0.237988 0.2288 0.25 0.27072 0.23799 0.2289 0.25 0.270655 0.237992 0.229 0.25 0.27059 0.237996 0.2291 0.25 0.270524 0.238001 0.2292 0.25 0.270458 0.238007 0.2293 0.25 0.270393 0.238014 0.2294 0.25 0.270327 0.238022 0.2295 0.25 0.270261 0.238032 0.2296 0.25 0.270194 0.238042 0.2297 0.25 0.270128 0.238054 0.2298 0.25 0.270061 0.238067 0.2299 0.25 0.269994 0.238081 0.23 0.25 0.269928 0.238096 0.2301 0.25 0.26986 0.238112 0.2302 0.25 0.269793 0.23813 0.2303 0.25 0.269726 0.238148 0.2304 0.25 0.269658 0.238168 0.2305 0.25 0.269591 0.238189 0.2306 0.25 0.269523 0.238211 0.2307 0.25 0.269455 0.238234 0.2308 0.25 0.269387 0.238258 0.2309 0.25 0.269318 0.238283 0.231 0.25 0.26925 0.23831 0.2311 0.25 0.269181 0.238337 0.2312 0.25 0.269112 0.238366 0.2313 0.25 0.269043 0.238396 0.2314 0.25 0.268974 0.238427 0.2315 0.25 0.268905 0.238459 0.2316 0.25 0.268836 0.238492 0.2317 0.25 0.268766 0.238526 0.2318 0.25 0.268697 0.238561 0.2319 0.25 0.268627 0.238598 0.232 0.25 0.268557 0.238635 0.2321 0.25 0.268487 0.238674 0.2322 0.25 0.268416 0.238714 0.2323 0.25 0.268346 0.238755 0.2324 0.25 0.268275 0.238797 0.2325 0.25 0.268205 0.23884 0.2326 0.25 0.268134 0.238884 0.2327 0.25 0.268063 0.238929 0.2328 0.25 0.267991 0.238975 0.2329 0.25 0.26792 0.239023 0.233 0.25 0.267849 0.239071 0.2331 0.25 0.267777 0.23912 0.2332 0.25 0.267705 0.239171 0.2333 0.25 0.267633 0.239222 0.2334 0.25 0.267561 0.239275 0.2335 0.25 0.267489 0.239329 0.2336 0.25 0.267417 0.239383 0.2337 0.25 0.267344 0.239439 0.2338 0.25 0.267272 0.239496 0.2339 0.25 0.267199 0.239553 0.234 0.25 0.267126 0.239612 0.2341 0.25 0.267053 0.239672 0.2342 0.25 0.26698 0.239733 0.2343 0.25 0.266906 0.239794 0.2344 0.25 0.266833 0.239857 0.2345 0.25 0.266759 0.239921 0.2346 0.25 0.266686 0.239986 0.2347 0.25 0.266612 0.240052 0.2348 0.25 0.266538 0.240118 0.2349 0.25 0.266463 0.240186 0.235 0.25 0.266389 0.240255 0.2351 0.25 0.266315 0.240324 0.2352 0.25 0.26624 0.240395 0.2353 0.25 0.266165 0.240466 0.2354 0.25 0.26609 0.240539 0.2355 0.25 0.266015 0.240612 0.2356 0.25 0.26594 0.240686 0.2357 0.25 0.265865 0.240761 0.2358 0.25 0.26579 0.240838 0.2359 0.25 0.265714 0.240915 0.236 0.25 0.265638 0.240992 0.2361 0.25 0.265562 0.241071 0.2362 0.25 0.265486 0.241151 0.2363 0.25 0.26541 0.241232 0.2364 0.25 0.265334 0.241313 0.2365 0.25 0.265258 0.241395 0.2366 0.25 0.265181 0.241478 0.2367 0.25 0.265105 0.241562 0.2368 0.25 0.265028 0.241647 0.2369 0.25 0.264951 0.241733 0.237 0.25 0.264874 0.241819 0.2371 0.25 0.264797 0.241907 0.2372 0.25 0.264719 0.241995 0.2373 0.25 0.264642 0.242084 0.2374 0.25 0.264564 0.242174 0.2375 0.25 0.264487 0.242264 0.2376 0.25 0.264409 0.242355 0.2377 0.25 0.264331 0.242447 0.2378 0.25 0.264253 0.24254 0.2379 0.25 0.264175 0.242634 0.238 0.25 0.264096 0.242728 0.2381 0.25 0.264018 0.242823 0.2382 0.25 0.263939 0.242919 0.2383 0.25 0.263861 0.243015 0.2384 0.25 0.263782 0.243113 0.2385 0.25 0.263703 0.243211 0.2386 0.25 0.263624 0.243309 0.2387 0.25 0.263545 0.243409 0.2388 0.25 0.263465 0.243508 0.2389 0.25 0.263386 0.243609 0.239 0.25 0.263306 0.24371 0.2391 0.25 0.263227 0.243812 0.2392 0.25 0.263147 0.243915 0.2393 0.25 0.263067 0.244018 0.2394 0.25 0.262987 0.244122 0.2395 0.25 0.262907 0.244226 0.2396 0.25 0.262826 0.244332 0.2397 0.25 0.262746 0.244437 0.2398 0.25 0.262665 0.244543 0.2399 0.25 0.262585 0.24465 0.24 0.25 0.262504 0.244758 0.2401 0.25 0.262423 0.244866 0.2402 0.25 0.262342 0.244974 0.2403 0.25 0.262261 0.245083 0.2404 0.25 0.262179 0.245193 0.2405 0.25 0.262098 0.245303 0.2406 0.25 0.262017 0.245413 0.2407 0.25 0.261935 0.245524 0.2408 0.25 0.261853 0.245636 0.2409 0.25 0.261771 0.245748 0.241 0.25 0.261689 0.24586 0.2411 0.25 0.261607 0.245973 0.2412 0.25 0.261525 0.246087 0.2413 0.25 0.261443 0.246201 0.2414 0.25 0.26136 0.246315 0.2415 0.25 0.261278 0.24643 0.2416 0.25 0.261195 0.246545 0.2417 0.25 0.261112 0.24666 0.2418 0.25 0.26103 0.246776 0.2419 0.25 0.260947 0.246892 0.242 0.25 0.260863 0.247009 0.2421 0.25 0.26078 0.247126 0.2422 0.25 0.260697 0.247243 0.2423 0.25 0.260613 0.247361 0.2424 0.25 0.26053 0.247479 0.2425 0.25 0.260446 0.247597 0.2426 0.25 0.260363 0.247716 0.2427 0.25 0.260279 0.247834 0.2428 0.25 0.260195 0.247954 0.2429 0.25 0.260111 0.248073 0.243 0.25 0.260026 0.248193 0.2431 0.25 0.259942 0.248313 0.2432 0.25 0.259858 0.248433 0.2433 0.25 0.259773 0.248553 0.2434 0.25 0.259689 0.248674 0.2435 0.25 0.259604 0.248795 0.2436 0.25 0.259519 0.248916 0.2437 0.25 0.259434 0.249037 0.2438 0.25 0.259349 0.249158 0.2439 0.25 0.259264 0.24928 0.244 0.25 0.259179 0.249401 0.2441 0.25 0.259093 0.249523 0.2442 0.25 0.259008 0.249645 0.2443 0.25 0.258922 0.249767 0.2444 0.25 0.258837 0.249889 0.2445 0.25 0.258751 0.250011 0.2446 0.25 0.258665 0.250134 0.2447 0.25 0.258579 0.250256 0.2448 0.25 0.258493 0.250379 0.2449 0.25 0.258407 0.250501 0.245 0.25 0.258321 0.250624 0.2451 0.25 0.258234 0.250746 0.2452 0.25 0.258148 0.250869 0.2453 0.25 0.258061 0.250992 0.2454 0.25 0.257975 0.251114 0.2455 0.25 0.257888 0.251237 0.2456 0.25 0.257801 0.251359 0.2457 0.25 0.257714 0.251482 0.2458 0.25 0.257627 0.251604 0.2459 0.25 0.25754 0.251727 0.246 0.25 0.257453 0.251849 0.2461 0.25 0.257366 0.251971 0.2462 0.25 0.257278 0.252094 0.2463 0.25 0.257191 0.252216 0.2464 0.25 0.257103 0.252338 0.2465 0.25 0.257016 0.252459 0.2466 0.25 0.256928 0.252581 0.2467 0.25 0.25684 0.252703 0.2468 0.25 0.256752 0.252824 0.2469 0.25 0.256664 0.252945 0.247 0.25 0.256576 0.253066 0.2471 0.25 0.256488 0.253187 0.2472 0.25 0.256399 0.253308 0.2473 0.25 0.256311 0.253428 0.2474 0.25 0.256222 0.253549 0.2475 0.25 0.256134 0.253669 0.2476 0.25 0.256045 0.253788 0.2477 0.25 0.255956 0.253908 0.2478 0.25 0.255868 0.254027 0.2479 0.25 0.255779 0.254146 0.248 0.25 0.25569 0.254265 0.2481 0.25 0.255601 0.254383 0.2482 0.25 0.255512 0.254501 0.2483 0.25 0.255422 0.254619 0.2484 0.25 0.255333 0.254736 0.2485 0.25 0.255244 0.254853 0.2486 0.25 0.255154 0.25497 0.2487 0.25 0.255064 0.255086 0.2488 0.25 0.254975 0.255202 0.2489 0.25 0.254885 0.255318 0.249 0.25 0.254795 0.255433 0.2491 0.25 0.254705 0.255547 0.2492 0.25 0.254615 0.255662 0.2493 0.25 0.254525 0.255776 0.2494 0.25 0.254435 0.255889 0.2495 0.25 0.254345 0.256002 0.2496 0.25 0.254255 0.256115 0.2497 0.25 0.254164 0.256227 0.2498 0.25 0.254074 0.256339 0.2499 0.25 0.253983 0.25645 0.25 0.25 0.253893 0.25656 0.2501 0.25 0.253802 0.256671 0.2502 0.25 0.253711 0.25678 0.2503 0.25 0.25362 0.256889 0.2504 0.25 0.253529 0.256998 0.2505 0.25 0.253438 0.257106 0.2506 0.25 0.253347 0.257213 0.2507 0.25 0.253256 0.25732 0.2508 0.25 0.253165 0.257426 0.2509 0.25 0.253074 0.257532 0.251 0.25 0.252982 0.257637 0.2511 0.25 0.252891 0.257742 0.2512 0.25 0.252799 0.257846 0.2513 0.25 0.252708 0.257949 0.2514 0.25 0.252616 0.258052 0.2515 0.25 0.252525 0.258154 0.2516 0.25 0.252433 0.258255 0.2517 0.25 0.252341 0.258356 0.2518 0.25 0.252249 0.258456 0.2519 0.25 0.252157 0.258555 0.252 0.25 0.252065 0.258654 0.2521 0.25 0.251973 0.258752 0.2522 0.25 0.251881 0.258849 0.2523 0.25 0.251789 0.258945 0.2524 0.25 0.251696 0.259041 0.2525 0.25 0.251604 0.259136 0.2526 0.25 0.251511 0.25923 0.2527 0.25 0.251419 0.259324 0.2528 0.25 0.251326 0.259417 0.2529 0.25 0.251234 0.259509 0.253 0.25 0.251141 0.2596 0.2531 0.25 0.251048 0.25969 0.2532 0.25 0.250956 0.25978 0.2533 0.25 0.250863 0.259869 0.2534 0.25 0.25077 0.259957 0.2535 0.25 0.250677 0.260044 0.2536 0.25 0.250584 0.260131 0.2537 0.25 0.250491 0.260216 0.2538 0.25 0.250397 0.260301 0.2539 0.25 0.250304 0.260385 0.254 0.25 0.250211 0.260468 0.2541 0.25 0.250118 0.26055 0.2542 0.25 0.250024 0.260631 0.2543 0.25 0.249931 0.260712 0.2544 0.25 0.249837 0.260791 0.2545 0.25 0.249744 0.26087 0.2546 0.25 0.24965 0.260947 0.2547 0.25 0.249556 0.261024 0.2548 0.25 0.249463 0.2611 0.2549 0.25 0.249369 0.261175 0.255 0.25 0.249275 0.261249 0.2551 0.25 0.249181 0.261322 0.2552 0.25 0.249087 0.261394 0.2553 0.25 0.248993 0.261465 0.2554 0.25 0.248899 0.261536 0.2555 0.25 0.248805 0.261605 0.2556 0.25 0.248711 0.261673 0.2557 0.25 0.248617 0.26174 0.2558 0.25 0.248522 0.261807 0.2559 0.25 0.248428 0.261872 0.256 0.25 0.248334 0.261936 0.2561 0.25 0.248239 0.262 0.2562 0.25 0.248145 0.262062 0.2563 0.25 0.24805 0.262123 0.2564 0.25 0.247956 0.262183 0.2565 0.25 0.247861 0.262243 0.2566 0.25 0.247767 0.262301 0.2567 0.25 0.247672 0.262358 0.2568 0.25 0.247577 0.262414 0.2569 0.25 0.247483 0.262469 0.257 0.25 0.247388 0.262523 0.2571 0.25 0.247293 0.262576 0.2572 0.25 0.247198 0.262628 0.2573 0.25 0.247103 0.262679 0.2574 0.25 0.247008 0.262728 0.2575 0.25 0.246913 0.262777 0.2576 0.25 0.246818 0.262825 0.2577 0.25 0.246723 0.262871 0.2578 0.25 0.246628 0.262916 0.2579 0.25 0.246533 0.262961 0.258 0.25 0.246438 0.263004 0.2581 0.25 0.246342 0.263046 0.2582 0.25 0.246247 0.263087 0.2583 0.25 0.246152 0.263127 0.2584 0.25 0.246056 0.263165 0.2585 0.25 0.245961 0.263203 0.2586 0.25 0.245865 0.263239 0.2587 0.25 0.24577 0.263275 0.2588 0.25 0.245675 0.263309 0.2589 0.25 0.245579 0.263342 0.259 0.25 0.245483 0.263374 0.2591 0.25 0.245388 0.263404 0.2592 0.25 0.245292 0.263434 0.2593 0.25 0.245196 0.263463 0.2594 0.25 0.245101 0.26349 0.2595 0.25 0.245005 0.263516 0.2596 0.25 0.244909 0.263541 0.2597 0.25 0.244813 0.263565 0.2598 0.25 0.244718 0.263587 0.2599 0.25 0.244622 0.263609 0.26 0.25 0.244526 0.263629 0.2601 0.25 0.24443 0.263648 0.2602 0.25 0.244334 0.263666 0.2603 0.25 0.244238 0.263683 0.2604 0.25 0.244142 0.263698 0.2605 0.25 0.244046 0.263713 0.2606 0.25 0.24395 0.263726 0.2607 0.25 0.243854 0.263738 0.2608 0.25 0.243758 0.263749 0.2609 0.25 0.243662 0.263759 0.261 0.25 0.243566 0.263767 0.2611 0.25 0.243469 0.263774 0.2612 0.25 0.243373 0.26378 0.2613 0.25 0.243277 0.263785 0.2614 0.25 0.243181 0.263789 0.2615 0.25 0.243084 0.263791 0.2616 0.25 0.242988 0.263793 0.2617 0.25 0.242892 0.263793 0.2618 0.25 0.242796 0.263792 0.2619 0.25 0.242699 0.263789 0.262 0.25 0.242603 0.263786 0.2621 0.25 0.242506 0.263781 0.2622 0.25 0.24241 0.263775 0.2623 0.25 0.242314 0.263768 0.2624 0.25 0.242217 0.26376 0.2625 0.25 0.242121 0.26375 0.2626 0.25 0.242024 0.263739 0.2627 0.25 0.241928 0.263727 0.2628 0.25 0.241831 0.263714 0.2629 0.25 0.241735 0.2637 0.263 0.25 0.241638 0.263684 0.2631 0.25 0.241542 0.263668 0.2632 0.25 0.241445 0.26365 0.2633 0.25 0.241349 0.263631 0.2634 0.25 0.241252 0.26361 0.2635 0.25 0.241155 0.263589 0.2636 0.25 0.241059 0.263566 0.2637 0.25 0.240962 0.263542 0.2638 0.25 0.240865 0.263517 0.2639 0.25 0.240769 0.263491 0.264 0.25 0.240672 0.263463 0.2641 0.25 0.240575 0.263435 0.2642 0.25 0.240479 0.263405 0.2643 0.25 0.240382 0.263374 0.2644 0.25 0.240285 0.263342 0.2645 0.25 0.240189 0.263308 0.2646 0.25 0.240092 0.263274 0.2647 0.25 0.239995 0.263238 0.2648 0.25 0.239899 0.263201 0.2649 0.25 0.239802 0.263163 0.265 0.25 0.239705 0.263124 0.2651 0.25 0.239608 0.263083 0.2652 0.25 0.239512 0.263042 0.2653 0.25 0.239415 0.262999 0.2654 0.25 0.239318 0.262955 0.2655 0.25 0.239222 0.26291 0.2656 0.25 0.239125 0.262864 0.2657 0.25 0.239028 0.262817 0.2658 0.25 0.238931 0.262768 0.2659 0.25 0.238835 0.262719 0.266 0.25 0.238738 0.262668 0.2661 0.25 0.238641 0.262616 0.2662 0.25 0.238544 0.262563 0.2663 0.25 0.238448 0.262509 0.2664 0.25 0.238351 0.262454 0.2665 0.25 0.238254 0.262397 0.2666 0.25 0.238157 0.26234 0.2667 0.25 0.238061 0.262281 0.2668 0.25 0.237964 0.262222 0.2669 0.25 0.237867 0.262161 0.267 0.25 0.23777 0.262099 0.2671 0.25 0.237674 0.262036 0.2672 0.25 0.237577 0.261972 0.2673 0.25 0.23748 0.261907 0.2674 0.25 0.237384 0.261841 0.2675 0.25 0.237287 0.261773 0.2676 0.25 0.23719 0.261705 0.2677 0.25 0.237094 0.261636 0.2678 0.25 0.236997 0.261565 0.2679 0.25 0.2369 0.261494 0.268 0.25 0.236804 0.261421 0.2681 0.25 0.236707 0.261348 0.2682 0.25 0.23661 0.261273 0.2683 0.25 0.236514 0.261198 0.2684 0.25 0.236417 0.261121 0.2685 0.25 0.236321 0.261043 0.2686 0.25 0.236224 0.260965 0.2687 0.25 0.236128 0.260885 0.2688 0.25 0.236031 0.260804 0.2689 0.25 0.235935 0.260723 0.269 0.25 0.235838 0.26064 0.2691 0.25 0.235742 0.260556 0.2692 0.25 0.235645 0.260472 0.2693 0.25 0.235549 0.260386 0.2694 0.25 0.235452 0.2603 0.2695 0.25 0.235356 0.260212 0.2696 0.25 0.235259 0.260124 0.2697 0.25 0.235163 0.260035 0.2698 0.25 0.235067 0.259944 0.2699 0.25 0.23497 0.259853 0.27 0.25 0.234874 0.259761 0.2701 0.25 0.234778 0.259668 0.2702 0.25 0.234681 0.259574 0.2703 0.25 0.234585 0.259479 0.2704 0.25 0.234489 0.259384 0.2705 0.25 0.234393 0.259287 0.2706 0.25 0.234296 0.25919 0.2707 0.25 0.2342 0.259091 0.2708 0.25 0.234104 0.258992 0.2709 0.25 0.234008 0.258892 0.271 0.25 0.233912 0.258791 0.2711 0.25 0.233816 0.25869 0.2712 0.25 0.23372 0.258587 0.2713 0.25 0.233624 0.258484 0.2714 0.25 0.233528 0.25838 0.2715 0.25 0.233432 0.258275 0.2716 0.25 0.233336 0.258169 0.2717 0.25 0.23324 0.258063 0.2718 0.25 0.233144 0.257956 0.2719 0.25 0.233048 0.257848 0.272 0.25 0.232952 0.257739 0.2721 0.25 0.232856 0.257629 0.2722 0.25 0.232761 0.257519 0.2723 0.25 0.232665 0.257408 0.2724 0.25 0.232569 0.257296 0.2725 0.25 0.232474 0.257184 0.2726 0.25 0.232378 0.257071 0.2727 0.25 0.232282 0.256957 0.2728 0.25 0.232187 0.256843 0.2729 0.25 0.232091 0.256727 0.273 0.25 0.231996 0.256612 0.2731 0.25 0.2319 0.256495 0.2732 0.25 0.231805 0.256378 0.2733 0.25 0.231709 0.25626 0.2734 0.25 0.231614 0.256142 0.2735 0.25 0.231519 0.256023 0.2736 0.25 0.231423 0.255903 0.2737 0.25 0.231328 0.255783 0.2738 0.25 0.231233 0.255662 0.2739 0.25 0.231138 0.255541 0.274 0.25 0.231043 0.255419 0.2741 0.25 0.230948 0.255296 0.2742 0.25 0.230853 0.255173 0.2743 0.25 0.230758 0.25505 0.2744 0.25 0.230663 0.254925 0.2745 0.25 0.230568 0.254801 0.2746 0.25 0.230473 0.254676 0.2747 0.25 0.230378 0.25455 0.2748 0.25 0.230283 0.254424 0.2749 0.25 0.230188 0.254297 0.275 0.25 0.230094 0.25417 0.2751 0.25 0.229999 0.254042 0.2752 0.25 0.229904 0.253914 0.2753 0.25 0.22981 0.253786 0.2754 0.25 0.229715 0.253657 0.2755 0.25 0.229621 0.253528 0.2756 0.25 0.229526 0.253398 0.2757 0.25 0.229432 0.253268 0.2758 0.25 0.229338 0.253137 0.2759 0.25 0.229243 0.253007 0.276 0.25 0.229149 0.252875 0.2761 0.25 0.229055 0.252744 0.2762 0.25 0.228961 0.252612 0.2763 0.25 0.228867 0.25248 0.2764 0.25 0.228773 0.252347 0.2765 0.25 0.228679 0.252214 0.2766 0.25 0.228585 0.252081 0.2767 0.25 0.228491 0.251947 0.2768 0.25 0.228397 0.251814 0.2769 0.25 0.228304 0.25168 0.277 0.25 0.22821 0.251545 0.2771 0.25 0.228116 0.251411 0.2772 0.25 0.228023 0.251276 0.2773 0.25 0.227929 0.251141 0.2774 0.25 0.227836 0.251006 0.2775 0.25 0.227742 0.250871 0.2776 0.25 0.227649 0.250735 0.2777 0.25 0.227555 0.250599 0.2778 0.25 0.227462 0.250463 0.2779 0.25 0.227369 0.250327 0.278 0.25 0.227276 0.250191 0.2781 0.25 0.227183 0.250055 0.2782 0.25 0.22709 0.249918 0.2783 0.25 0.226997 0.249782 0.2784 0.25 0.226904 0.249645 0.2785 0.25 0.226811 0.249508 0.2786 0.25 0.226718 0.249371 0.2787 0.25 0.226626 0.249234 0.2788 0.25 0.226533 0.249097 0.2789 0.25 0.22644 0.24896 0.279 0.25 0.226348 0.248823 0.2791 0.25 0.226256 0.248686 0.2792 0.25 0.226163 0.248549 0.2793 0.25 0.226071 0.248412 0.2794 0.25 0.225979 0.248275 0.2795 0.25 0.225886 0.248138 0.2796 0.25 0.225794 0.248001 0.2797 0.25 0.225702 0.247864 0.2798 0.25 0.22561 0.247727 0.2799 0.25 0.225518 0.24759 0.28 0.25 0.225427 0.247454 0.2801 0.25 0.225335 0.247317 0.2802 0.25 0.225243 0.247181 0.2803 0.25 0.225151 0.247044 0.2804 0.25 0.22506 0.246908 0.2805 0.25 0.224968 0.246772 0.2806 0.25 0.224877 0.246636 0.2807 0.25 0.224786 0.2465 0.2808 0.25 0.224694 0.246364 0.2809 0.25 0.224603 0.246229 0.281 0.25 0.224512 0.246093 0.2811 0.25 0.224421 0.245958 0.2812 0.25 0.22433 0.245823 0.2813 0.25 0.224239 0.245689 0.2814 0.25 0.224148 0.245554 0.2815 0.25 0.224058 0.24542 0.2816 0.25 0.223967 0.245286 0.2817 0.25 0.223876 0.245153 0.2818 0.25 0.223786 0.245019 0.2819 0.25 0.223696 0.244886 0.282 0.25 0.223605 0.244754 0.2821 0.25 0.223515 0.244621 0.2822 0.25 0.223425 0.244489 0.2823 0.25 0.223335 0.244357 0.2824 0.25 0.223245 0.244226 0.2825 0.25 0.223155 0.244095 0.2826 0.25 0.223065 0.243964 0.2827 0.25 0.222975 0.243834 0.2828 0.25 0.222885 0.243704 0.2829 0.25 0.222796 0.243575 0.283 0.25 0.222706 0.243446 0.2831 0.25 0.222617 0.243317 0.2832 0.25 0.222527 0.243189 0.2833 0.25 0.222438 0.243061 0.2834 0.25 0.222349 0.242934 0.2835 0.25 0.22226 0.242807 0.2836 0.25 0.222171 0.242681 0.2837 0.25 0.222082 0.242555 0.2838 0.25 0.221993 0.24243 0.2839 0.25 0.221904 0.242305 0.284 0.25 0.221816 0.242181 0.2841 0.25 0.221727 0.242057 0.2842 0.25 0.221639 0.241934 0.2843 0.25 0.22155 0.241811 0.2844 0.25 0.221462 0.241689 0.2845 0.25 0.221374 0.241568 0.2846 0.25 0.221286 0.241447 0.2847 0.25 0.221198 0.241326 0.2848 0.25 0.22111 0.241207 0.2849 0.25 0.221022 0.241088 0.285 0.25 0.220934 0.240969 0.2851 0.25 0.220846 0.240851 0.2852 0.25 0.220759 0.240734 0.2853 0.25 0.220671 0.240618 0.2854 0.25 0.220584 0.240502 0.2855 0.25 0.220497 0.240387 0.2856 0.25 0.22041 0.240272 0.2857 0.25 0.220323 0.240158 0.2858 0.25 0.220236 0.240045 0.2859 0.25 0.220149 0.239933 0.286 0.25 0.220062 0.239821 0.2861 0.25 0.219975 0.239711 0.2862 0.25 0.219889 0.2396 0.2863 0.25 0.219802 0.239491 0.2864 0.25 0.219716 0.239382 0.2865 0.25 0.219629 0.239275 0.2866 0.25 0.219543 0.239168 0.2867 0.25 0.219457 0.239061 0.2868 0.25 0.219371 0.238956 0.2869 0.25 0.219285 0.238851 0.287 0.25 0.2192 0.238747 0.2871 0.25 0.219114 0.238644 0.2872 0.25 0.219028 0.238542 0.2873 0.25 0.218943 0.238441 0.2874 0.25 0.218858 0.23834 0.2875 0.25 0.218772 0.238241 0.2876 0.25 0.218687 0.238142 0.2877 0.25 0.218602 0.238044 0.2878 0.25 0.218517 0.237947 0.2879 0.25 0.218432 0.237851 0.288 0.25 0.218348 0.237756 0.2881 0.25 0.218263 0.237662 0.2882 0.25 0.218179 0.237569 0.2883 0.25 0.218094 0.237476 0.2884 0.25 0.21801 0.237385 0.2885 0.25 0.217926 0.237294 0.2886 0.25 0.217842 0.237205 0.2887 0.25 0.217758 0.237116 0.2888 0.25 0.217674 0.237029 0.2889 0.25 0.21759 0.236942 0.289 0.25 0.217507 0.236857 0.2891 0.25 0.217423 0.236772 0.2892 0.25 0.21734 0.236688 0.2893 0.25 0.217257 0.236606 0.2894 0.25 0.217173 0.236524 0.2895 0.25 0.21709 0.236444 0.2896 0.25 0.217007 0.236364 0.2897 0.25 0.216925 0.236286 0.2898 0.25 0.216842 0.236208 0.2899 0.25 0.216759 0.236132 0.29 0.25 0.216677 0.236057 0.2901 0.25 0.216595 0.235982 0.2902 0.25 0.216512 0.235909 0.2903 0.25 0.21643 0.235837 0.2904 0.25 0.216348 0.235766 0.2905 0.25 0.216266 0.235696 0.2906 0.25 0.216185 0.235627 0.2907 0.25 0.216103 0.23556 0.2908 0.25 0.216022 0.235493 0.2909 0.25 0.21594 0.235428 0.291 0.25 0.215859 0.235363 0.2911 0.25 0.215778 0.2353 0.2912 0.25 0.215697 0.235238 0.2913 0.25 0.215616 0.235177 0.2914 0.25 0.215535 0.235117 0.2915 0.25 0.215455 0.235059 0.2916 0.25 0.215374 0.235001 0.2917 0.25 0.215294 0.234945 0.2918 0.25 0.215213 0.23489 0.2919 0.25 0.215133 0.234836 0.292 0.25 0.215053 0.234783 0.2921 0.25 0.214973 0.234732 0.2922 0.25 0.214894 0.234681 0.2923 0.25 0.214814 0.234632 0.2924 0.25 0.214735 0.234584 0.2925 0.25 0.214655 0.234538 0.2926 0.25 0.214576 0.234492 0.2927 0.25 0.214497 0.234448 0.2928 0.25 0.214418 0.234405 0.2929 0.25 0.214339 0.234363 0.293 0.25 0.21426 0.234322 0.2931 0.25 0.214182 0.234283 0.2932 0.25 0.214103 0.234244 0.2933 0.25 0.214025 0.234207 0.2934 0.25 0.213947 0.234172 0.2935 0.25 0.213869 0.234137 0.2936 0.25 0.213791 0.234104 0.2937 0.25 0.213713 0.234072 0.2938 0.25 0.213636 0.234041 0.2939 0.25 0.213558 0.234012 0.294 0.25 0.213481 0.233984 0.2941 0.25 0.213403 0.233957 0.2942 0.25 0.213326 0.233931 0.2943 0.25 0.213249 0.233907 0.2944 0.25 0.213173 0.233884 0.2945 0.25 0.213096 0.233862 0.2946 0.25 0.213019 0.233842 0.2947 0.25 0.212943 0.233823 0.2948 0.25 0.212867 0.233805 0.2949 0.25 0.212791 0.233788 0.295 0.25 0.212715 0.233773 0.2951 0.25 0.212639 0.233759 0.2952 0.25 0.212563 0.233746 0.2953 0.25 0.212487 0.233735 0.2954 0.25 0.212412 0.233724 0.2955 0.25 0.212337 0.233716 0.2956 0.25 0.212262 0.233708 0.2957 0.25 0.212187 0.233702 0.2958 0.25 0.212112 0.233697 0.2959 0.25 0.212037 0.233693 0.296 0.25 0.211963 0.233691 0.2961 0.25 0.211888 0.23369 0.2962 0.25 0.211814 0.233691 0.2963 0.25 0.21174 0.233692 0.2964 0.25 0.211666 0.233695 0.2965 0.25 0.211592 0.2337 0.2966 0.25 0.211518 0.233705 0.2967 0.25 0.211445 0.233712 0.2968 0.25 0.211371 0.23372 0.2969 0.25 0.211298 0.23373 0.297 0.25 0.211225 0.233741 0.2971 0.25 0.211152 0.233753 0.2972 0.25 0.211079 0.233767 0.2973 0.25 0.211007 0.233781 0.2974 0.25 0.210934 0.233798 0.2975 0.25 0.210862 0.233815 0.2976 0.25 0.21079 0.233834 0.2977 0.25 0.210718 0.233854 0.2978 0.25 0.210646 0.233876 0.2979 0.25 0.210574 0.233898 0.298 0.25 0.210503 0.233922 0.2981 0.25 0.210431 0.233948 0.2982 0.25 0.21036 0.233974 0.2983 0.25 0.210289 0.234003 0.2984 0.25 0.210218 0.234032 0.2985 0.25 0.210147 0.234062 0.2986 0.25 0.210077 0.234094 0.2987 0.25 0.210006 0.234128 0.2988 0.25 0.209936 0.234162 0.2989 0.25 0.209866 0.234198 0.299 0.25 0.209796 0.234235 0.2991 0.25 0.209726 0.234274 0.2992 0.25 0.209656 0.234314 0.2993 0.25 0.209587 0.234355 0.2994 0.25 0.209517 0.234397 0.2995 0.25 0.209448 0.234441 0.2996 0.25 0.209379 0.234486 0.2997 0.25 0.20931 0.234532 0.2998 0.25 0.209242 0.234579 0.2999 0.25 0.209173 0.234628 0.3 0.25 0.209105 0.234678 0.3001 0.25 0.209036 0.23473 0.3002 0.25 0.208968 0.234782 0.3003 0.25 0.2089 0.234836 0.3004 0.25 0.208833 0.234891 0.3005 0.25 0.208765 0.234948 0.3006 0.25 0.208698 0.235006 0.3007 0.25 0.208631 0.235064 0.3008 0.25 0.208563 0.235125 0.3009 0.25 0.208497 0.235186 0.301 0.25 0.20843 0.235249 0.3011 0.25 0.208363 0.235313 0.3012 0.25 0.208297 0.235378 0.3013 0.25 0.208231 0.235444 0.3014 0.25 0.208165 0.235512 0.3015 0.25 0.208099 0.235581 0.3016 0.25 0.208033 0.235651 0.3017 0.25 0.207967 0.235722 0.3018 0.25 0.207902 0.235795 0.3019 0.25 0.207837 0.235868 0.302 0.25 0.207772 0.235943 0.3021 0.25 0.207707 0.236019 0.3022 0.25 0.207642 0.236097 0.3023 0.25 0.207578 0.236175 0.3024 0.25 0.207513 0.236255 0.3025 0.25 0.207449 0.236336 0.3026 0.25 0.207385 0.236418 0.3027 0.25 0.207321 0.236501 0.3028 0.25 0.207258 0.236585 0.3029 0.25 0.207194 0.236671 0.303 0.25 0.207131 0.236757 0.3031 0.25 0.207068 0.236845 0.3032 0.25 0.207005 0.236934 0.3033 0.25 0.206942 0.237024 0.3034 0.25 0.20688 0.237115 0.3035 0.25 0.206817 0.237207 0.3036 0.25 0.206755 0.237301 0.3037 0.25 0.206693 0.237395 0.3038 0.25 0.206631 0.237491 0.3039 0.25 0.206569 0.237588 0.304 0.25 0.206508 0.237685 0.3041 0.25 0.206446 0.237784 0.3042 0.25 0.206385 0.237884 0.3043 0.25 0.206324 0.237985 0.3044 0.25 0.206264 0.238087 0.3045 0.25 0.206203 0.23819 0.3046 0.25 0.206142 0.238294 0.3047 0.25 0.206082 0.238399 0.3048 0.25 0.206022 0.238506 0.3049 0.25 0.205962 0.238613 0.305 0.25 0.205903 0.238721 0.3051 0.25 0.205843 0.23883 0.3052 0.25 0.205784 0.23894 0.3053 0.25 0.205725 0.239052 0.3054 0.25 0.205666 0.239164 0.3055 0.25 0.205607 0.239277 0.3056 0.25 0.205548 0.239391 0.3057 0.25 0.20549 0.239506 0.3058 0.25 0.205432 0.239622 0.3059 0.25 0.205374 0.239739 0.306 0.25 0.205316 0.239857 0.3061 0.25 0.205258 0.239976 0.3062 0.25 0.205201 0.240096 0.3063 0.25 0.205143 0.240216 0.3064 0.25 0.205086 0.240338 0.3065 0.25 0.20503 0.24046 0.3066 0.25 0.204973 0.240584 0.3067 0.25 0.204916 0.240708 0.3068 0.25 0.20486 0.240833 0.3069 0.25 0.204804 0.240959 0.307 0.25 0.204748 0.241086 0.3071 0.25 0.204692 0.241213 0.3072 0.25 0.204637 0.241342 0.3073 0.25 0.204581 0.241471 0.3074 0.25 0.204526 0.241601 0.3075 0.25 0.204471 0.241732 0.3076 0.25 0.204416 0.241863 0.3077 0.25 0.204362 0.241996 0.3078 0.25 0.204308 0.242129 0.3079 0.25 0.204253 0.242263 0.308 0.25 0.204199 0.242398 0.3081 0.25 0.204146 0.242533 0.3082 0.25 0.204092 0.242669 0.3083 0.25 0.204039 0.242806 0.3084 0.25 0.203985 0.242944 0.3085 0.25 0.203932 0.243082 0.3086 0.25 0.20388 0.243221 0.3087 0.25 0.203827 0.243361 0.3088 0.25 0.203775 0.243501 0.3089 0.25 0.203722 0.243642 0.309 0.25 0.20367 0.243784 0.3091 0.25 0.203619 0.243926 0.3092 0.25 0.203567 0.244069 0.3093 0.25 0.203516 0.244212 0.3094 0.25 0.203464 0.244356 0.3095 0.25 0.203413 0.244501 0.3096 0.25 0.203363 0.244646 0.3097 0.25 0.203312 0.244792 0.3098 0.25 0.203262 0.244939 0.3099 0.25 0.203211 0.245086 0.31 0.25 0.203161 0.245233 0.3101 0.25 0.203112 0.245381 0.3102 0.25 0.203062 0.24553 0.3103 0.25 0.203013 0.245679 0.3104 0.25 0.202964 0.245829 0.3105 0.25 0.202915 0.245979 0.3106 0.25 0.202866 0.246129 0.3107 0.25 0.202817 0.24628 0.3108 0.25 0.202769 0.246432 0.3109 0.25 0.202721 0.246584 0.311 0.25 0.202673 0.246736 0.3111 0.25 0.202625 0.246889 0.3112 0.25 0.202578 0.247042 0.3113 0.25 0.202531 0.247195 0.3114 0.25 0.202483 0.247349 0.3115 0.25 0.202437 0.247504 0.3116 0.25 0.20239 0.247658 0.3117 0.25 0.202343 0.247813 0.3118 0.25 0.202297 0.247969 0.3119 0.25 0.202251 0.248124 0.312 0.25 0.202205 0.24828 0.3121 0.25 0.20216 0.248437 0.3122 0.25 0.202114 0.248593 0.3123 0.25 0.202069 0.24875 0.3124 0.25 0.202024 0.248907 0.3125 0.25 0.20198 0.249065 0.3126 0.25 0.201935 0.249222 0.3127 0.25 0.201891 0.24938 0.3128 0.25 0.201847 0.249538 0.3129 0.25 0.201803 0.249696 0.313 0.25 0.201759 0.249855 0.3131 0.25 0.201716 0.250014 0.3132 0.25 0.201672 0.250172 0.3133 0.25 0.201629 0.250331 0.3134 0.25 0.201586 0.25049 0.3135 0.25 0.201544 0.25065 0.3136 0.25 0.201502 0.250809 0.3137 0.25 0.201459 0.250969 0.3138 0.25 0.201417 0.251128 0.3139 0.25 0.201376 0.251288 0.314 0.25 0.201334 0.251448 0.3141 0.25 0.201293 0.251607 0.3142 0.25 0.201252 0.251767 0.3143 0.25 0.201211 0.251927 0.3144 0.25 0.20117 0.252087 0.3145 0.25 0.20113 0.252247 0.3146 0.25 0.20109 0.252407 0.3147 0.25 0.20105 0.252567 0.3148 0.25 0.20101 0.252727 0.3149 0.25 0.200971 0.252887 0.315 0.25 0.200931 0.253046 0.3151 0.25 0.200892 0.253206 0.3152 0.25 0.200853 0.253366 0.3153 0.25 0.200815 0.253525 0.3154 0.25 0.200776 0.253685 0.3155 0.25 0.200738 0.253844 0.3156 0.25 0.2007 0.254003 0.3157 0.25 0.200663 0.254163 0.3158 0.25 0.200625 0.254321 0.3159 0.25 0.200588 0.25448 0.316 0.25 0.200551 0.254639 0.3161 0.25 0.200514 0.254797 0.3162 0.25 0.200477 0.254956 0.3163 0.25 0.200441 0.255114 0.3164 0.25 0.200405 0.255271 0.3165 0.25 0.200369 0.255429 0.3166 0.25 0.200333 0.255586 0.3167 0.25 0.200298 0.255743 0.3168 0.25 0.200263 0.2559 0.3169 0.25 0.200228 0.256057 0.317 0.25 0.200193 0.256213 0.3171 0.25 0.200158 0.256369 0.3172 0.25 0.200124 0.256524 0.3173 0.25 0.20009 0.256679 0.3174 0.25 0.200056 0.256834 0.3175 0.25 0.200023 0.256989 0.3176 0.25 0.199989 0.257143 0.3177 0.25 0.199956 0.257297 0.3178 0.25 0.199923 0.25745 0.3179 0.25 0.199891 0.257603 0.318 0.25 0.199858 0.257756 0.3181 0.25 0.199826 0.257908 0.3182 0.25 0.199794 0.258059 0.3183 0.25 0.199762 0.258211 0.3184 0.25 0.199731 0.258361 0.3185 0.25 0.199699 0.258512 0.3186 0.25 0.199668 0.258661 0.3187 0.25 0.199638 0.258811 0.3188 0.25 0.199607 0.258959 0.3189 0.25 0.199577 0.259108 0.319 0.25 0.199547 0.259255 0.3191 0.25 0.199517 0.259403 0.3192 0.25 0.199487 0.259549 0.3193 0.25 0.199458 0.259695 0.3194 0.25 0.199429 0.259841 0.3195 0.25 0.1994 0.259985 0.3196 0.25 0.199371 0.26013 0.3197 0.25 0.199343 0.260273 0.3198 0.25 0.199315 0.260416 0.3199 0.25 0.199287 0.260559 0.32 0.25 0.199259 0.2607 0.3201 0.25 0.199232 0.260841 0.3202 0.25 0.199204 0.260982 0.3203 0.25 0.199177 0.261121 0.3204 0.25 0.199151 0.26126 0.3205 0.25 0.199124 0.261398 0.3206 0.25 0.199098 0.261536 0.3207 0.25 0.199072 0.261673 0.3208 0.25 0.199046 0.261809 0.3209 0.25 0.199021 0.261944 0.321 0.25 0.198995 0.262078 0.3211 0.25 0.19897 0.262212 0.3212 0.25 0.198946 0.262345 0.3213 0.25 0.198921 0.262477 0.3214 0.25 0.198897 0.262608 0.3215 0.25 0.198873 0.262739 0.3216 0.25 0.198849 0.262869 0.3217 0.25 0.198825 0.262997 0.3218 0.25 0.198802 0.263125 0.3219 0.25 0.198779 0.263253 0.322 0.25 0.198756 0.263379 0.3221 0.25 0.198733 0.263504 0.3222 0.25 0.198711 0.263629 0.3223 0.25 0.198689 0.263752 0.3224 0.25 0.198667 0.263875 0.3225 0.25 0.198646 0.263996 0.3226 0.25 0.198624 0.264117 0.3227 0.25 0.198603 0.264237 0.3228 0.25 0.198582 0.264356 0.3229 0.25 0.198562 0.264474 0.323 0.25 0.198541 0.264591 0.3231 0.25 0.198521 0.264707 0.3232 0.25 0.198502 0.264821 0.3233 0.25 0.198482 0.264935 0.3234 0.25 0.198463 0.265048 0.3235 0.25 0.198444 0.26516 0.3236 0.25 0.198425 0.265271 0.3237 0.25 0.198406 0.265381 0.3238 0.25 0.198388 0.26549 0.3239 0.25 0.19837 0.265597 0.324 0.25 0.198352 0.265704 0.3241 0.25 0.198334 0.265809 0.3242 0.25 0.198317 0.265914 0.3243 0.25 0.1983 0.266017 0.3244 0.25 0.198283 0.266119 0.3245 0.25 0.198267 0.26622 0.3246 0.25 0.19825 0.26632 0.3247 0.25 0.198234 0.266419 0.3248 0.25 0.198219 0.266517 0.3249 0.25 0.198203 0.266614 0.325 0.25 0.198188 0.266709 0.3251 0.25 0.198173 0.266803 0.3252 0.25 0.198158 0.266896 0.3253 0.25 0.198143 0.266988 0.3254 0.25 0.198129 0.267079 0.3255 0.25 0.198115 0.267168 0.3256 0.25 0.198102 0.267256 0.3257 0.25 0.198088 0.267344 0.3258 0.25 0.198075 0.267429 0.3259 0.25 0.198062 0.267514 0.326 0.25 0.198049 0.267597 0.3261 0.25 0.198037 0.267679 0.3262 0.25 0.198025 0.26776 0.3263 0.25 0.198013 0.26784 0.3264 0.25 0.198001 0.267918 0.3265 0.25 0.19799 0.267995 0.3266 0.25 0.197978 0.268071 0.3267 0.25 0.197968 0.268145 0.3268 0.25 0.197957 0.268218 0.3269 0.25 0.197947 0.26829 0.327 0.25 0.197937 0.268361 0.3271 0.25 0.197927 0.26843 0.3272 0.25 0.197917 0.268498 0.3273 0.25 0.197908 0.268565 0.3274 0.25 0.197899 0.26863 0.3275 0.25 0.19789 0.268694 0.3276 0.25 0.197882 0.268756 0.3277 0.25 0.197873 0.268817 0.3278 0.25 0.197865 0.268877 0.3279 0.25 0.197858 0.268936 0.328 0.25 0.19785 0.268993 0.3281 0.25 0.197843 0.269048 0.3282 0.25 0.197836 0.269103 0.3283 0.25 0.197829 0.269155 0.3284 0.25 0.197823 0.269207 0.3285 0.25 0.197817 0.269257 0.3286 0.25 0.197811 0.269306 0.3287 0.25 0.197805 0.269353 0.3288 0.25 0.1978 0.269399 0.3289 0.25 0.197795 0.269443 0.329 0.25 0.19779 0.269486 0.3291 0.25 0.197786 0.269528 0.3292 0.25 0.197782 0.269568 0.3293 0.25 0.197778 0.269607 0.3294 0.25 0.197774 0.269644 0.3295 0.25 0.19777 0.26968 0.3296 0.25 0.197767 0.269714 0.3297 0.25 0.197764 0.269747 0.3298 0.25 0.197762 0.269779 0.3299 0.25 0.197759 0.269809 0.33 0.25 0.197757 0.269837 0.3301 0.25 0.197755 0.269864 0.3302 0.25 0.197754 0.26989 0.3303 0.25 0.197753 0.269914 0.3304 0.25 0.197752 0.269936 0.3305 0.25 0.197751 0.269957 0.3306 0.25 0.19775 0.269977 0.3307 0.25 0.19775 0.269995 0.3308 0.25 0.19775 0.270012 0.3309 0.25 0.197751 0.270027 0.331 0.25 0.197751 0.27004 0.3311 0.25 0.197752 0.270053 0.3312 0.25 0.197753 0.270063 0.3313 0.25 0.197755 0.270072 0.3314 0.25 0.197756 0.27008 0.3315 0.25 0.197758 0.270086 0.3316 0.25 0.197761 0.27009 0.3317 0.25 0.197763 0.270093 0.3318 0.25 0.197766 0.270095 0.3319 0.25 0.197769 0.270095 0.332 0.25 0.197772 0.270093 0.3321 0.25 0.197776 0.27009 0.3322 0.25 0.19778 0.270086 0.3323 0.25 0.197784 0.27008 0.3324 0.25 0.197789 0.270072 0.3325 0.25 0.197793 0.270063 0.3326 0.25 0.197798 0.270052 0.3327 0.25 0.197804 0.27004 0.3328 0.25 0.197809 0.270026 0.3329 0.25 0.197815 0.270011 0.333 0.25 0.197821 0.269994 0.3331 0.25 0.197828 0.269976 0.3332 0.25 0.197834 0.269956 0.3333 0.25 0.197841 0.269934 0.3334 0.25 0.197849 0.269911 0.3335 0.25 0.197856 0.269887 0.3336 0.25 0.197864 0.269861 0.3337 0.25 0.197872 0.269833 0.3338 0.25 0.19788 0.269804 0.3339 0.25 0.197889 0.269773 0.334 0.25 0.197898 0.269741 0.3341 0.25 0.197907 0.269708 0.3342 0.25 0.197917 0.269672 0.3343 0.25 0.197927 0.269636 0.3344 0.25 0.197937 0.269597 0.3345 0.25 0.197947 0.269557 0.3346 0.25 0.197958 0.269516 0.3347 0.25 0.197968 0.269473 0.3348 0.25 0.19798 0.269429 0.3349 0.25 0.197991 0.269383 0.335 0.25 0.198003 0.269335 0.3351 0.25 0.198015 0.269286 0.3352 0.25 0.198027 0.269236 0.3353 0.25 0.19804 0.269184 0.3354 0.25 0.198053 0.26913 0.3355 0.25 0.198066 0.269075 0.3356 0.25 0.198079 0.269019 0.3357 0.25 0.198093 0.268961 0.3358 0.25 0.198107 0.268901 0.3359 0.25 0.198121 0.26884 0.336 0.25 0.198136 0.268778 0.3361 0.25 0.198151 0.268714 0.3362 0.25 0.198166 0.268648 0.3363 0.25 0.198181 0.268581 0.3364 0.25 0.198197 0.268513 0.3365 0.25 0.198213 0.268443 0.3366 0.25 0.198229 0.268371 0.3367 0.25 0.198246 0.268298 0.3368 0.25 0.198263 0.268224 0.3369 0.25 0.19828 0.268148 0.337 0.25 0.198298 0.268071 0.3371 0.25 0.198315 0.267992 0.3372 0.25 0.198333 0.267912 0.3373 0.25 0.198352 0.26783 0.3374 0.25 0.19837 0.267747 0.3375 0.25 0.198389 0.267662 0.3376 0.25 0.198408 0.267576 0.3377 0.25 0.198428 0.267489 0.3378 0.25 0.198448 0.2674 0.3379 0.25 0.198468 0.26731 0.338 0.25 0.198488 0.267218 0.3381 0.25 0.198509 0.267125 0.3382 0.25 0.19853 0.26703 0.3383 0.25 0.198551 0.266934 0.3384 0.25 0.198572 0.266837 0.3385 0.25 0.198594 0.266738 0.3386 0.25 0.198616 0.266638 0.3387 0.25 0.198639 0.266537 0.3388 0.25 0.198661 0.266434 0.3389 0.25 0.198684 0.26633 0.339 0.25 0.198707 0.266224 0.3391 0.25 0.198731 0.266117 0.3392 0.25 0.198755 0.266009 0.3393 0.25 0.198779 0.265899 0.3394 0.25 0.198803 0.265788 0.3395 0.25 0.198828 0.265676 0.3396 0.25 0.198853 0.265562 0.3397 0.25 0.198878 0.265448 0.3398 0.25 0.198904 0.265331 0.3399 0.25 0.19893 0.265214 0.34 0.25 0.198956 0.265095 0.3401 0.25 0.198983 0.264975 0.3402 0.25 0.199009 0.264854 0.3403 0.25 0.199036 0.264731 0.3404 0.25 0.199064 0.264607 0.3405 0.25 0.199091 0.264482 0.3406 0.25 0.199119 0.264355 0.3407 0.25 0.199148 0.264228 0.3408 0.25 0.199176 0.264099 0.3409 0.25 0.199205 0.263969 0.341 0.25 0.199234 0.263837 0.3411 0.25 0.199263 0.263705 0.3412 0.25 0.199293 0.263571 0.3413 0.25 0.199323 0.263436 0.3414 0.25 0.199354 0.2633 0.3415 0.25 0.199384 0.263163 0.3416 0.25 0.199415 0.263024 0.3417 0.25 0.199446 0.262885 0.3418 0.25 0.199478 0.262744 0.3419 0.25 0.19951 0.262602 0.342 0.25 0.199542 0.262459 0.3421 0.25 0.199574 0.262315 0.3422 0.25 0.199607 0.26217 0.3423 0.25 0.19964 0.262023 0.3424 0.25 0.199673 0.261876 0.3425 0.25 0.199707 0.261727 0.3426 0.25 0.19974 0.261578 0.3427 0.25 0.199775 0.261427 0.3428 0.25 0.199809 0.261275 0.3429 0.25 0.199844 0.261123 0.343 0.25 0.199879 0.260969 0.3431 0.25 0.199914 0.260814 0.3432 0.25 0.19995 0.260658 0.3433 0.25 0.199986 0.260501 0.3434 0.25 0.200022 0.260344 0.3435 0.25 0.200059 0.260185 0.3436 0.25 0.200096 0.260025 0.3437 0.25 0.200133 0.259864 0.3438 0.25 0.20017 0.259702 0.3439 0.25 0.200208 0.25954 0.344 0.25 0.200246 0.259376 0.3441 0.25 0.200285 0.259212 0.3442 0.25 0.200323 0.259046 0.3443 0.25 0.200362 0.25888 0.3444 0.25 0.200402 0.258713 0.3445 0.25 0.200441 0.258545 0.3446 0.25 0.200481 0.258376 0.3447 0.25 0.200521 0.258206 0.3448 0.25 0.200562 0.258036 0.3449 0.25 0.200603 0.257864 0.345 0.25 0.200644 0.257692 0.3451 0.25 0.200685 0.257519 0.3452 0.25 0.200727 0.257345 0.3453 0.25 0.200769 0.25717 0.3454 0.25 0.200811 0.256995 0.3455 0.25 0.200854 0.256819 0.3456 0.25 0.200897 0.256642 0.3457 0.25 0.20094 0.256464 0.3458 0.25 0.200984 0.256286 0.3459 0.25 0.201027 0.256107 0.346 0.25 0.201072 0.255927 0.3461 0.25 0.201116 0.255747 0.3462 0.25 0.201161 0.255566 0.3463 0.25 0.201206 0.255384 0.3464 0.25 0.201251 0.255201 0.3465 0.25 0.201297 0.255018 0.3466 0.25 0.201343 0.254835 0.3467 0.25 0.201389 0.25465 0.3468 0.25 0.201436 0.254465 0.3469 0.25 0.201483 0.25428 0.347 0.25 0.20153 0.254094 0.3471 0.25 0.201577 0.253907 0.3472 0.25 0.201625 0.25372 0.3473 0.25 0.201673 0.253532 0.3474 0.25 0.201722 0.253344 0.3475 0.25 0.20177 0.253155 0.3476 0.25 0.201819 0.252966 0.3477 0.25 0.201869 0.252776 0.3478 0.25 0.201918 0.252586 0.3479 0.25 0.201968 0.252396 0.348 0.25 0.202019 0.252205 0.3481 0.25 0.202069 0.252013 0.3482 0.25 0.20212 0.251821 0.3483 0.25 0.202171 0.251629 0.3484 0.25 0.202223 0.251436 0.3485 0.25 0.202275 0.251243 0.3486 0.25 0.202327 0.25105 0.3487 0.25 0.202379 0.250856 0.3488 0.25 0.202432 0.250662 0.3489 0.25 0.202485 0.250467 0.349 0.25 0.202538 0.250273 0.3491 0.25 0.202592 0.250078 0.3492 0.25 0.202646 0.249882 0.3493 0.25 0.2027 0.249687 0.3494 0.25 0.202755 0.249491 0.3495 0.25 0.20281 0.249295 0.3496 0.25 0.202865 0.249098 0.3497 0.25 0.20292 0.248902 0.3498 0.25 0.202976 0.248705 0.3499 0.25 0.203032 0.248508 0.35 0.25 0.203089 0.248311 0.3501 0.25 0.203146 0.248114 0.3502 0.25 0.203203 0.247917 0.3503 0.25 0.20326 0.247719 0.3504 0.25 0.203318 0.247522 0.3505 0.25 0.203376 0.247324 0.3506 0.25 0.203434 0.247126 0.3507 0.25 0.203493 0.246929 0.3508 0.25 0.203551 0.246731 0.3509 0.25 0.203611 0.246533 0.351 0.25 0.20367 0.246335 0.3511 0.25 0.20373 0.246137 0.3512 0.25 0.20379 0.245939 0.3513 0.25 0.203851 0.245741 0.3514 0.25 0.203912 0.245543 0.3515 0.25 0.203973 0.245345 0.3516 0.25 0.204034 0.245148 0.3517 0.25 0.204096 0.24495 0.3518 0.25 0.204158 0.244752 0.3519 0.25 0.20422 0.244555 0.352 0.25 0.204283 0.244357 0.3521 0.25 0.204346 0.24416 0.3522 0.25 0.204409 0.243963 0.3523 0.25 0.204473 0.243766 0.3524 0.25 0.204537 0.243569 0.3525 0.25 0.204601 0.243373 0.3526 0.25 0.204665 0.243176 0.3527 0.25 0.20473 0.24298 0.3528 0.25 0.204795 0.242784 0.3529 0.25 0.204861 0.242589 0.353 0.25 0.204927 0.242393 0.3531 0.25 0.204993 0.242198 0.3532 0.25 0.205059 0.242003 0.3533 0.25 0.205126 0.241809 0.3534 0.25 0.205193 0.241615 0.3535 0.25 0.20526 0.241421 0.3536 0.25 0.205328 0.241227 0.3537 0.25 0.205396 0.241034 0.3538 0.25 0.205464 0.240841 0.3539 0.25 0.205533 0.240649 0.354 0.25 0.205602 0.240457 0.3541 0.25 0.205671 0.240266 0.3542 0.25 0.205741 0.240074 0.3543 0.25 0.205811 0.239884 0.3544 0.25 0.205881 0.239694 0.3545 0.25 0.205951 0.239504 0.3546 0.25 0.206022 0.239315 0.3547 0.25 0.206093 0.239126 0.3548 0.25 0.206165 0.238938 0.3549 0.25 0.206237 0.23875 0.355 0.25 0.206309 0.238563 0.3551 0.25 0.206381 0.238377 0.3552 0.25 0.206454 0.238191 0.3553 0.25 0.206527 0.238005 0.3554 0.25 0.2066 0.237821 0.3555 0.25 0.206674 0.237636 0.3556 0.25 0.206748 0.237453 0.3557 0.25 0.206822 0.23727 0.3558 0.25 0.206897 0.237088 0.3559 0.25 0.206972 0.236906 0.356 0.25 0.207047 0.236726 0.3561 0.25 0.207123 0.236546 0.3562 0.25 0.207198 0.236366 0.3563 0.25 0.207275 0.236188 0.3564 0.25 0.207351 0.23601 0.3565 0.25 0.207428 0.235833 0.3566 0.25 0.207505 0.235656 0.3567 0.25 0.207583 0.235481 0.3568 0.25 0.20766 0.235306 0.3569 0.25 0.207738 0.235132 0.357 0.25 0.207817 0.234959 0.3571 0.25 0.207896 0.234787 0.3572 0.25 0.207975 0.234615 0.3573 0.25 0.208054 0.234445 0.3574 0.25 0.208134 0.234275 0.3575 0.25 0.208214 0.234106 0.3576 0.25 0.208294 0.233938 0.3577 0.25 0.208375 0.233772 0.3578 0.25 0.208456 0.233606 0.3579 0.25 0.208537 0.233441 0.358 0.25 0.208618 0.233277 0.3581 0.25 0.2087 0.233113 0.3582 0.25 0.208783 0.232951 0.3583 0.25 0.208865 0.23279 0.3584 0.25 0.208948 0.23263 0.3585 0.25 0.209031 0.232471 0.3586 0.25 0.209115 0.232313 0.3587 0.25 0.209198 0.232156 0.3588 0.25 0.209283 0.232 0.3589 0.25 0.209367 0.231846 0.359 0.25 0.209452 0.231692 0.3591 0.25 0.209537 0.231539 0.3592 0.25 0.209622 0.231388 0.3593 0.25 0.209708 0.231237 0.3594 0.25 0.209794 0.231088 0.3595 0.25 0.20988 0.23094 0.3596 0.25 0.209967 0.230793 0.3597 0.25 0.210054 0.230648 0.3598 0.25 0.210141 0.230503 0.3599 0.25 0.210229 0.23036 0.36 0.25 0.210317 0.230218 0.3601 0.25 0.210405 0.230077 0.3602 0.25 0.210494 0.229937 0.3603 0.25 0.210583 0.229799 0.3604 0.25 0.210672 0.229662 0.3605 0.25 0.210762 0.229526 0.3606 0.25 0.210852 0.229391 0.3607 0.25 0.210942 0.229258 0.3608 0.25 0.211032 0.229126 0.3609 0.25 0.211123 0.228995 0.361 0.25 0.211214 0.228866 0.3611 0.25 0.211306 0.228738 0.3612 0.25 0.211397 0.228611 0.3613 0.25 0.21149 0.228486 0.3614 0.25 0.211582 0.228362 0.3615 0.25 0.211675 0.22824 0.3616 0.25 0.211768 0.228119 0.3617 0.25 0.211861 0.227999 0.3618 0.25 0.211955 0.227881 0.3619 0.25 0.212049 0.227764 0.362 0.25 0.212143 0.227649 0.3621 0.25 0.212238 0.227535 0.3622 0.25 0.212333 0.227422 0.3623 0.25 0.212428 0.227311 0.3624 0.25 0.212524 0.227202 0.3625 0.25 0.21262 0.227093 0.3626 0.25 0.212716 0.226987 0.3627 0.25 0.212813 0.226882 0.3628 0.25 0.21291 0.226778 0.3629 0.25 0.213007 0.226676 0.363 0.25 0.213104 0.226576 0.3631 0.25 0.213202 0.226477 0.3632 0.25 0.2133 0.22638 0.3633 0.25 0.213399 0.226284 0.3634 0.25 0.213498 0.22619 0.3635 0.25 0.213597 0.226097 0.3636 0.25 0.213696 0.226006 0.3637 0.25 0.213796 0.225916 0.3638 0.25 0.213896 0.225829 0.3639 0.25 0.213997 0.225742 0.364 0.25 0.214097 0.225658 0.3641 0.25 0.214198 0.225575 0.3642 0.25 0.2143 0.225493 0.3643 0.25 0.214402 0.225414 0.3644 0.25 0.214504 0.225336 0.3645 0.25 0.214606 0.225259 0.3646 0.25 0.214709 0.225185 0.3647 0.25 0.214812 0.225112 0.3648 0.25 0.214915 0.22504 0.3649 0.25 0.215019 0.224971 0.365 0.25 0.215122 0.224903 0.3651 0.25 0.215227 0.224837 0.3652 0.25 0.215331 0.224772 0.3653 0.25 0.215436 0.22471 0.3654 0.25 0.215541 0.224649 0.3655 0.25 0.215647 0.224589 0.3656 0.25 0.215753 0.224532 0.3657 0.25 0.215859 0.224476 0.3658 0.25 0.215966 0.224422 0.3659 0.25 0.216072 0.22437 0.366 0.25 0.21618 0.224319 0.3661 0.25 0.216287 0.224271 0.3662 0.25 0.216395 0.224224 0.3663 0.25 0.216503 0.224179 0.3664 0.25 0.216611 0.224136 0.3665 0.25 0.21672 0.224094 0.3666 0.25 0.216829 0.224054 0.3667 0.25 0.216939 0.224017 0.3668 0.25 0.217048 0.223981 0.3669 0.25 0.217158 0.223946 0.367 0.25 0.217269 0.223914 0.3671 0.25 0.217379 0.223883 0.3672 0.25 0.217491 0.223855 0.3673 0.25 0.217602 0.223828 0.3674 0.25 0.217713 0.223803 0.3675 0.25 0.217825 0.22378 0.3676 0.25 0.217938 0.223758 0.3677 0.25 0.21805 0.223739 0.3678 0.25 0.218163 0.223721 0.3679 0.25 0.218277 0.223706 0.368 0.25 0.21839 0.223692 0.3681 0.25 0.218504 0.22368 0.3682 0.25 0.218618 0.22367 0.3683 0.25 0.218733 0.223662 0.3684 0.25 0.218848 0.223655 0.3685 0.25 0.218963 0.223651 0.3686 0.25 0.219078 0.223649 0.3687 0.25 0.219194 0.223648 0.3688 0.25 0.21931 0.223649 0.3689 0.25 0.219427 0.223653 0.369 0.25 0.219543 0.223658 0.3691 0.25 0.219661 0.223665 0.3692 0.25 0.219778 0.223674 0.3693 0.25 0.219896 0.223685 0.3694 0.25 0.220014 0.223697 0.3695 0.25 0.220132 0.223712 0.3696 0.25 0.220251 0.223729 0.3697 0.25 0.22037 0.223747 0.3698 0.25 0.220489 0.223768 0.3699 0.25 0.220609 0.22379 0.37 0.25 0.220729 0.223815 0.3701 0.25 0.220849 0.223841 0.3702 0.25 0.22097 0.223869 0.3703 0.25 0.221091 0.223899 0.3704 0.25 0.221212 0.223931 0.3705 0.25 0.221334 0.223965 0.3706 0.25 0.221455 0.224001 0.3707 0.25 0.221578 0.224039 0.3708 0.25 0.2217 0.224079 0.3709 0.25 0.221823 0.224121 0.371 0.25 0.221946 0.224164 0.3711 0.25 0.22207 0.22421 0.3712 0.25 0.222194 0.224257 0.3713 0.25 0.222318 0.224307 0.3714 0.25 0.222442 0.224358 0.3715 0.25 0.222567 0.224412 0.3716 0.25 0.222692 0.224467 0.3717 0.25 0.222817 0.224524 0.3718 0.25 0.222943 0.224583 0.3719 0.25 0.223069 0.224644 0.372 0.25 0.223196 0.224707 0.3721 0.25 0.223322 0.224772 0.3722 0.25 0.223449 0.224839 0.3723 0.25 0.223577 0.224908 0.3724 0.25 0.223704 0.224979 0.3725 0.25 0.223832 0.225051 0.3726 0.25 0.223961 0.225126 0.3727 0.25 0.224089 0.225202 0.3728 0.25 0.224218 0.225281 0.3729 0.25 0.224347 0.225361 0.373 0.25 0.224477 0.225443 0.3731 0.25 0.224607 0.225527 0.3732 0.25 0.224737 0.225613 0.3733 0.25 0.224868 0.225701 0.3734 0.25 0.224999 0.225791 0.3735 0.25 0.22513 0.225883 0.3736 0.25 0.225261 0.225976 0.3737 0.25 0.225393 0.226072 0.3738 0.25 0.225525 0.226169 0.3739 0.25 0.225658 0.226268 0.374 0.25 0.22579 0.22637 0.3741 0.25 0.225923 0.226473 0.3742 0.25 0.226057 0.226577 0.3743 0.25 0.226191 0.226684 0.3744 0.25 0.226325 0.226793 0.3745 0.25 0.226459 0.226903 0.3746 0.25 0.226594 0.227016 0.3747 0.25 0.226729 0.22713 0.3748 0.25 0.226864 0.227246 0.3749 0.25 0.227 0.227363 0.375 0.25 0.227135 0.227483 0.3751 0.25 0.227272 0.227605 0.3752 0.25 0.227408 0.227728 0.3753 0.25 0.227545 0.227853 0.3754 0.25 0.227682 0.22798 0.3755 0.25 0.22782 0.228108 0.3756 0.25 0.227958 0.228239 0.3757 0.25 0.228096 0.228371 0.3758 0.25 0.228235 0.228505 0.3759 0.25 0.228373 0.228641 0.376 0.25 0.228512 0.228779 0.3761 0.25 0.228652 0.228918 0.3762 0.25 0.228792 0.229059 0.3763 0.25 0.228932 0.229202 0.3764 0.25 0.229072 0.229347 0.3765 0.25 0.229213 0.229493 0.3766 0.25 0.229354 0.229641 0.3767 0.25 0.229495 0.229791 0.3768 0.25 0.229637 0.229943 0.3769 0.25 0.229779 0.230096 0.377 0.25 0.229921 0.230251 0.3771 0.25 0.230064 0.230407 0.3772 0.25 0.230207 0.230566 0.3773 0.25 0.23035 0.230726 0.3774 0.25 0.230494 0.230887 0.3775 0.25 0.230637 0.23105 0.3776 0.25 0.230782 0.231215 0.3777 0.25 0.230926 0.231382 0.3778 0.25 0.231071 0.23155 0.3779 0.25 0.231216 0.23172 0.378 0.25 0.231362 0.231891 0.3781 0.25 0.231507 0.232064 0.3782 0.25 0.231653 0.232239 0.3783 0.25 0.2318 0.232415 0.3784 0.25 0.231947 0.232593 0.3785 0.25 0.232094 0.232772 0.3786 0.25 0.232241 0.232953 0.3787 0.25 0.232389 0.233136 0.3788 0.25 0.232537 0.23332 0.3789 0.25 0.232685 0.233505 0.379 0.25 0.232834 0.233692 0.3791 0.25 0.232983 0.233881 0.3792 0.25 0.233132 0.234071 0.3793 0.25 0.233281 0.234262 0.3794 0.25 0.233431 0.234455 0.3795 0.25 0.233581 0.23465 0.3796 0.25 0.233732 0.234845 0.3797 0.25 0.233883 0.235043 0.3798 0.25 0.234034 0.235241 0.3799 0.25 0.234185 0.235442 0.38 0.25 0.234337 0.235643 0.3801 0.25 0.234489 0.235846 0.3802 0.25 0.234642 0.23605 0.3803 0.25 0.234794 0.236256 0.3804 0.25 0.234947 0.236463 0.3805 0.25 0.235101 0.236672 0.3806 0.25 0.235254 0.236881 0.3807 0.25 0.235408 0.237092 0.3808 0.25 0.235563 0.237305 0.3809 0.25 0.235717 0.237518 0.381 0.25 0.235872 0.237733 0.3811 0.25 0.236027 0.23795 0.3812 0.25 0.236183 0.238167 0.3813 0.25 0.236339 0.238386 0.3814 0.25 0.236495 0.238606 0.3815 0.25 0.236651 0.238827 0.3816 0.25 0.236808 0.239049 0.3817 0.25 0.236965 0.239273 0.3818 0.25 0.237123 0.239497 0.3819 0.25 0.23728 0.239723 0.382 0.25 0.237438 0.23995 0.3821 0.25 0.237597 0.240179 0.3822 0.25 0.237755 0.240408 0.3823 0.25 0.237914 0.240638 0.3824 0.25 0.238074 0.24087 0.3825 0.25 0.238233 0.241102 0.3826 0.25 0.238393 0.241336 0.3827 0.25 0.238553 0.241571 0.3828 0.25 0.238714 0.241807 0.3829 0.25 0.238875 0.242043 0.383 0.25 0.239036 0.242281 0.3831 0.25 0.239197 0.24252 0.3832 0.25 0.239359 0.24276 0.3833 0.25 0.239521 0.243 0.3834 0.25 0.239684 0.243242 0.3835 0.25 0.239846 0.243485 0.3836 0.25 0.240009 0.243728 0.3837 0.25 0.240173 0.243973 0.3838 0.25 0.240336 0.244218 0.3839 0.25 0.2405 0.244464 0.384 0.25 0.240664 0.244711 0.3841 0.25 0.240829 0.244959 0.3842 0.25 0.240994 0.245208 0.3843 0.25 0.241159 0.245457 0.3844 0.25 0.241325 0.245708 0.3845 0.25 0.24149 0.245959 0.3846 0.25 0.241657 0.246211 0.3847 0.25 0.241823 0.246464 0.3848 0.25 0.24199 0.246717 0.3849 0.25 0.242157 0.246971 0.385 0.25 0.242324 0.247226 0.3851 0.25 0.242492 0.247481 0.3852 0.25 0.24266 0.247737 0.3853 0.25 0.242828 0.247994 0.3854 0.25 0.242997 0.248252 0.3855 0.25 0.243165 0.24851 0.3856 0.25 0.243335 0.248768 0.3857 0.25 0.243504 0.249028 0.3858 0.25 0.243674 0.249287 0.3859 0.25 0.243844 0.249548 0.386 0.25 0.244015 0.249809 0.3861 0.25 0.244185 0.25007 0.3862 0.25 0.244356 0.250332 0.3863 0.25 0.244528 0.250594 0.3864 0.25 0.244699 0.250857 0.3865 0.25 0.244871 0.25112 0.3866 0.25 0.245044 0.251384 0.3867 0.25 0.245216 0.251648 0.3868 0.25 0.245389 0.251913 0.3869 0.25 0.245562 0.252178 0.387 0.25 0.245736 0.252443 0.3871 0.25 0.245909 0.252709 0.3872 0.25 0.246084 0.252975 0.3873 0.25 0.246258 0.253241 0.3874 0.25 0.246433 0.253507 0.3875 0.25 0.246608 0.253774 0.3876 0.25 0.246783 0.254041 0.3877 0.25 0.246959 0.254309 0.3878 0.25 0.247135 0.254576 0.3879 0.25 0.247311 0.254844 0.388 0.25 0.247487 0.255112 0.3881 0.25 0.247664 0.25538 0.3882 0.25 0.247841 0.255648 0.3883 0.25 0.248019 0.255917 0.3884 0.25 0.248197 0.256185 0.3885 0.25 0.248375 0.256454 0.3886 0.25 0.248553 0.256722 0.3887 0.25 0.248732 0.256991 0.3888 0.25 0.248911 0.25726 0.3889 0.25 0.24909 0.257528 0.389 0.25 0.24927 0.257797 0.3891 0.25 0.249449 0.258066 0.3892 0.25 0.24963 0.258335 0.3893 0.25 0.24981 0.258603 0.3894 0.25 0.249991 0.258872 0.3895 0.25 0.250172 0.25914 0.3896 0.25 0.250353 0.259409 0.3897 0.25 0.250535 0.259677 0.3898 0.25 0.250717 0.259945 0.3899 0.25 0.250899 0.260213 0.39 0.25 0.251082 0.260481 0.3901 0.25 0.251265 0.260748 0.3902 0.25 0.251448 0.261016 0.3903 0.25 0.251632 0.261283 0.3904 0.25 0.251815 0.261549 0.3905 0.25 0.252 0.261816 0.3906 0.25 0.252184 0.262082 0.3907 0.25 0.252369 0.262348 0.3908 0.25 0.252554 0.262614 0.3909 0.25 0.252739 0.262879 0.391 0.25 0.252925 0.263144 0.3911 0.25 0.25311 0.263408 0.3912 0.25 0.253297 0.263672 0.3913 0.25 0.253483 0.263936 0.3914 0.25 0.25367 0.264199 0.3915 0.25 0.253857 0.264462 0.3916 0.25 0.254044 0.264724 0.3917 0.25 0.254232 0.264986 0.3918 0.25 0.25442 0.265247 0.3919 0.25 0.254608 0.265508 0.392 0.25 0.254797 0.265768 0.3921 0.25 0.254986 0.266027 0.3922 0.25 0.255175 0.266286 0.3923 0.25 0.255365 0.266545 0.3924 0.25 0.255554 0.266802 0.3925 0.25 0.255744 0.267059 0.3926 0.25 0.255935 0.267316 0.3927 0.25 0.256126 0.267571 0.3928 0.25 0.256317 0.267826 0.3929 0.25 0.256508 0.26808 0.393 0.25 0.256699 0.268334 0.3931 0.25 0.256891 0.268586 0.3932 0.25 0.257083 0.268838 0.3933 0.25 0.257276 0.269089 0.3934 0.25 0.257469 0.26934 0.3935 0.25 0.257662 0.269589 0.3936 0.25 0.257855 0.269838 0.3937 0.25 0.258049 0.270085 0.3938 0.25 0.258242 0.270332 0.3939 0.25 0.258437 0.270578 0.394 0.25 0.258631 0.270823 0.3941 0.25 0.258826 0.271067 0.3942 0.25 0.259021 0.27131 0.3943 0.25 0.259216 0.271552 0.3944 0.25 0.259412 0.271793 0.3945 0.25 0.259608 0.272033 0.3946 0.25 0.259804 0.272272 0.3947 0.25 0.260001 0.27251 0.3948 0.25 0.260198 0.272746 0.3949 0.25 0.260395 0.272982 0.395 0.25 0.260592 0.273217 0.3951 0.25 0.26079 0.27345 0.3952 0.25 0.260988 0.273682 0.3953 0.25 0.261187 0.273913 0.3954 0.25 0.261385 0.274143 0.3955 0.25 0.261584 0.274372 0.3956 0.25 0.261783 0.274599 0.3957 0.25 0.261983 0.274826 0.3958 0.25 0.262183 0.275051 0.3959 0.25 0.262383 0.275274 0.396 0.25 0.262583 0.275497 0.3961 0.25 0.262784 0.275718 0.3962 0.25 0.262985 0.275937 0.3963 0.25 0.263186 0.276156 0.3964 0.25 0.263387 0.276373 0.3965 0.25 0.263589 0.276588 0.3966 0.25 0.263791 0.276802 0.3967 0.25 0.263994 0.277015 0.3968 0.25 0.264196 0.277226 0.3969 0.25 0.264399 0.277436 0.397 0.25 0.264602 0.277645 0.3971 0.25 0.264806 0.277851 0.3972 0.25 0.26501 0.278057 0.3973 0.25 0.265214 0.278261 0.3974 0.25 0.265418 0.278463 0.3975 0.25 0.265623 0.278664 0.3976 0.25 0.265828 0.278863 0.3977 0.25 0.266033 0.27906 0.3978 0.25 0.266239 0.279256 0.3979 0.25 0.266445 0.279451 0.398 0.25 0.266651 0.279643 0.3981 0.25 0.266857 0.279834 0.3982 0.25 0.267064 0.280024 0.3983 0.25 0.267271 0.280211 0.3984 0.25 0.267478 0.280397 0.3985 0.25 0.267686 0.280582 0.3986 0.25 0.267893 0.280764 0.3987 0.25 0.268102 0.280945 0.3988 0.25 0.26831 0.281124 0.3989 0.25 0.268519 0.281301 0.399 0.25 0.268728 0.281476 0.3991 0.25 0.268937 0.28165 0.3992 0.25 0.269146 0.281821 0.3993 0.25 0.269356 0.281991 0.3994 0.25 0.269566 0.282159 0.3995 0.25 0.269777 0.282325 0.3996 0.25 0.269987 0.282489 0.3997 0.25 0.270198 0.282651 0.3998 0.25 0.27041 0.282812 0.3999 0.25 0.270621 0.28297 0.4 0.25 0.270833 0.283127 0.4001 0.25 0.271045 0.283281 0.4002 0.25 0.271257 0.283433 0.4003 0.25 0.27147 0.283584 0.4004 0.25 0.271683 0.283732 0.4005 0.25 0.271896 0.283879 0.4006 0.25 0.27211 0.284023 0.4007 0.25 0.272323 0.284165 0.4008 0.25 0.272537 0.284306 0.4009 0.25 0.272752 0.284444 0.401 0.25 0.272966 0.28458 0.4011 0.25 0.273181 0.284714 0.4012 0.25 0.273396 0.284845 0.4013 0.25 0.273612 0.284975 0.4014 0.25 0.273827 0.285103 0.4015 0.25 0.274043 0.285228 0.4016 0.25 0.27426 0.285351 0.4017 0.25 0.274476 0.285472 0.4018 0.25 0.274693 0.285591 0.4019 0.25 0.27491 0.285707 0.402 0.25 0.275128 0.285821 0.4021 0.25 0.275345 0.285933 0.4022 0.25 0.275563 0.286043 0.4023 0.25 0.275781 0.286151 0.4024 0.25 0.276 0.286256 0.4025 0.25 0.276219 0.286359 0.4026 0.25 0.276438 0.286459 0.4027 0.25 0.276657 0.286558 0.4028 0.25 0.276877 0.286654 0.4029 0.25 0.277096 0.286747 0.403 0.25 0.277317 0.286838 0.4031 0.25 0.277537 0.286927 0.4032 0.25 0.277758 0.287014 0.4033 0.25 0.277979 0.287098 0.4034 0.25 0.2782 0.287179 0.4035 0.25 0.278421 0.287259 0.4036 0.25 0.278643 0.287336 0.4037 0.25 0.278865 0.28741 0.4038 0.25 0.279087 0.287482 0.4039 0.25 0.27931 0.287552 0.404 0.25 0.279533 0.287619 0.4041 0.25 0.279756 0.287683 0.4042 0.25 0.279979 0.287745 0.4043 0.25 0.280203 0.287805 0.4044 0.25 0.280427 0.287862 0.4045 0.25 0.280651 0.287917 0.4046 0.25 0.280876 0.287969 0.4047 0.25 0.281101 0.288018 0.4048 0.25 0.281326 0.288065 0.4049 0.25 0.281551 0.28811 0.405 0.25 0.281777 0.288152 0.4051 0.25 0.282002 0.288191 0.4052 0.25 0.282228 0.288228 0.4053 0.25 0.282455 0.288262 0.4054 0.25 0.282682 0.288294 0.4055 0.25 0.282908 0.288322 0.4056 0.25 0.283136 0.288349 0.4057 0.25 0.283363 0.288373 0.4058 0.25 0.283591 0.288394 0.4059 0.25 0.283819 0.288412 0.406 0.25 0.284047 0.288428 0.4061 0.25 0.284276 0.288441 0.4062 0.25 0.284504 0.288452 0.4063 0.25 0.284733 0.28846 0.4064 0.25 0.284963 0.288465 0.4065 0.25 0.285192 0.288468 0.4066 0.25 0.285422 0.288467 0.4067 0.25 0.285652 0.288465 0.4068 0.25 0.285883 0.288459 0.4069 0.25 0.286113 0.288451 0.407 0.25 0.286344 0.28844 0.4071 0.25 0.286575 0.288427 0.4072 0.25 0.286807 0.28841 0.4073 0.25 0.287039 0.288391 0.4074 0.25 0.287271 0.288369 0.4075 0.25 0.287503 0.288345 0.4076 0.25 0.287735 0.288318 0.4077 0.25 0.287968 0.288288 0.4078 0.25 0.288201 0.288255 0.4079 0.25 0.288434 0.28822 0.408 0.25 0.288668 0.288181 0.4081 0.25 0.288902 0.28814 0.4082 0.25 0.289136 0.288097 0.4083 0.25 0.28937 0.28805 0.4084 0.25 0.289605 0.288001 0.4085 0.25 0.28984 0.287949 0.4086 0.25 0.290075 0.287894 0.4087 0.25 0.29031 0.287837 0.4088 0.25 0.290546 0.287776 0.4089 0.25 0.290782 0.287713 0.409 0.25 0.291018 0.287647 0.4091 0.25 0.291254 0.287578 0.4092 0.25 0.291491 0.287507 0.4093 0.25 0.291728 0.287433 0.4094 0.25 0.291965 0.287356 0.4095 0.25 0.292202 0.287276 0.4096 0.25 0.29244 0.287193 0.4097 0.25 0.292678 0.287108 0.4098 0.25 0.292916 0.287019 0.4099 0.25 0.293155 0.286928 0.41 0.25 0.293393 0.286834 0.4101 0.25 0.293632 0.286738 0.4102 0.25 0.293871 0.286638 0.4103 0.25 0.294111 0.286536 0.4104 0.25 0.294351 0.286431 0.4105 0.25 0.294591 0.286323 0.4106 0.25 0.294831 0.286212 0.4107 0.25 0.295071 0.286099 0.4108 0.25 0.295312 0.285983 0.4109 0.25 0.295553 0.285863 0.411 0.25 0.295794 0.285742 0.4111 0.25 0.296036 0.285617 0.4112 0.25 0.296278 0.285489 0.4113 0.25 0.29652 0.285359 0.4114 0.25 0.296762 0.285226 0.4115 0.25 0.297005 0.28509 0.4116 0.25 0.297247 0.284952 0.4117 0.25 0.29749 0.28481 0.4118 0.25 0.297734 0.284666 0.4119 0.25 0.297977 0.284519 0.412 0.25 0.298221 0.284369 0.4121 0.25 0.298465 0.284217 0.4122 0.25 0.298709 0.284061 0.4123 0.25 0.298954 0.283903 0.4124 0.25 0.299199 0.283742 0.4125 0.25 0.299444 0.283579 0.4126 0.25 0.299689 0.283412 0.4127 0.25 0.299934 0.283243 0.4128 0.25 0.30018 0.283071 0.4129 0.25 0.300426 0.282897 0.413 0.25 0.300672 0.282719 0.4131 0.25 0.300919 0.282539 0.4132 0.25 0.301166 0.282357 0.4133 0.25 0.301413 0.282171 0.4134 0.25 0.30166 0.281983 0.4135 0.25 0.301907 0.281792 0.4136 0.25 0.302155 0.281598 0.4137 0.25 0.302403 0.281402 0.4138 0.25 0.302651 0.281203 0.4139 0.25 0.3029 0.281001 0.414 0.25 0.303149 0.280796 0.4141 0.25 0.303398 0.280589 0.4142 0.25 0.303647 0.280379 0.4143 0.25 0.303896 0.280167 0.4144 0.25 0.304146 0.279952 0.4145 0.25 0.304396 0.279734 0.4146 0.25 0.304646 0.279513 0.4147 0.25 0.304896 0.27929 0.4148 0.25 0.305147 0.279065 0.4149 0.25 0.305398 0.278836 0.415 0.25 0.305649 0.278605 0.4151 0.25 0.3059 0.278372 0.4152 0.25 0.306152 0.278136 0.4153 0.25 0.306404 0.277897 0.4154 0.25 0.306656 0.277656 0.4155 0.25 0.306908 0.277412 0.4156 0.25 0.307161 0.277165 0.4157 0.25 0.307414 0.276916 0.4158 0.25 0.307667 0.276665 0.4159 0.25 0.30792 0.276411 0.416 0.25 0.308174 0.276154 0.4161 0.25 0.308428 0.275895 0.4162 0.25 0.308682 0.275633 0.4163 0.25 0.308936 0.275369 0.4164 0.25 0.30919 0.275103 0.4165 0.25 0.309445 0.274834 0.4166 0.25 0.3097 0.274562 0.4167 0.25 0.309955 0.274288 0.4168 0.25 0.310211 0.274012 0.4169 0.25 0.310466 0.273733 0.417 0.25 0.310722 0.273452 0.4171 0.25 0.310978 0.273169 0.4172 0.25 0.311235 0.272883 0.4173 0.25 0.311491 0.272594 0.4174 0.25 0.311748 0.272304 0.4175 0.25 0.312005 0.272011 0.4176 0.25 0.312263 0.271715 0.4177 0.25 0.31252 0.271417 0.4178 0.25 0.312778 0.271117 0.4179 0.25 0.313036 0.270815 0.418 0.25 0.313294 0.270511 0.4181 0.25 0.313553 0.270204 0.4182 0.25 0.313811 0.269895 0.4183 0.25 0.31407 0.269583 0.4184 0.25 0.314329 0.26927 0.4185 0.25 0.314589 0.268954 0.4186 0.25 0.314848 0.268636 0.4187 0.25 0.315108 0.268316 0.4188 0.25 0.315368 0.267993 0.4189 0.25 0.315629 0.267669 0.419 0.25 0.315889 0.267342 0.4191 0.25 0.31615 0.267014 0.4192 0.25 0.316411 0.266683 0.4193 0.25 0.316672 0.26635 0.4194 0.25 0.316933 0.266015 0.4195 0.25 0.317195 0.265678 0.4196 0.25 0.317457 0.265339 0.4197 0.25 0.317719 0.264997 0.4198 0.25 0.317982 0.264654 0.4199 0.25 0.318244 0.264309 0.42 0.25 0.318507 0.263962 0.4201 0.25 0.31877 0.263613 0.4202 0.25 0.319033 0.263262 0.4203 0.25 0.319297 0.262909 0.4204 0.25 0.31956 0.262554 0.4205 0.25 0.319824 0.262197 0.4206 0.25 0.320088 0.261839 0.4207 0.25 0.320353 0.261478 0.4208 0.25 0.320617 0.261116 0.4209 0.25 0.320882 0.260752 0.421 0.25 0.321147 0.260386 0.4211 0.25 0.321412 0.260018 0.4212 0.25 0.321678 0.259649 0.4213 0.25 0.321944 0.259278 0.4214 0.25 0.32221 0.258905 0.4215 0.25 0.322476 0.25853 0.4216 0.25 0.322742 0.258154 0.4217 0.25 0.323009 0.257776 0.4218 0.25 0.323275 0.257397 0.4219 0.25 0.323542 0.257015 0.422 0.25 0.32381 0.256633 0.4221 0.25 0.324077 0.256248 0.4222 0.25 0.324345 0.255862 0.4223 0.25 0.324613 0.255475 0.4224 0.25 0.324881 0.255086 0.4225 0.25 0.325149 0.254695 0.4226 0.25 0.325418 0.254303 0.4227 0.25 0.325686 0.25391 0.4228 0.25 0.325955 0.253515 0.4229 0.25 0.326224 0.253118 0.423 0.25 0.326494 0.252721 0.4231 0.25 0.326763 0.252322 0.4232 0.25 0.327033 0.251921 0.4233 0.25 0.327303 0.251519 0.4234 0.25 0.327574 0.251116 0.4235 0.25 0.327844 0.250712 0.4236 0.25 0.328115 0.250306 0.4237 0.25 0.328386 0.2499 0.4238 0.25 0.328657 0.249492 0.4239 0.25 0.328928 0.249082 0.424 0.25 0.3292 0.248672 0.4241 0.25 0.329471 0.24826 0.4242 0.25 0.329743 0.247848 0.4243 0.25 0.330015 0.247434 0.4244 0.25 0.330288 0.247019 0.4245 0.25 0.33056 0.246603 0.4246 0.25 0.330833 0.246186 0.4247 0.25 0.331106 0.245768 0.4248 0.25 0.331379 0.245349 0.4249 0.25 0.331653 0.244929 0.425 0.25 0.331926 0.244508 0.4251 0.25 0.3322 0.244087 0.4252 0.25 0.332474 0.243664 0.4253 0.25 0.332748 0.24324 0.4254 0.25 0.333023 0.242816 0.4255 0.25 0.333298 0.242391 0.4256 0.25 0.333572 0.241965 0.4257 0.25 0.333848 0.241538 0.4258 0.25 0.334123 0.241111 0.4259 0.25 0.334398 0.240683 0.426 0.25 0.334674 0.240254 0.4261 0.25 0.33495 0.239824 0.4262 0.25 0.335226 0.239394 0.4263 0.25 0.335502 0.238964 0.4264 0.25 0.335779 0.238532 0.4265 0.25 0.336055 0.2381 0.4266 0.25 0.336332 0.237668 0.4267 0.25 0.336609 0.237235 0.4268 0.25 0.336887 0.236802 0.4269 0.25 0.337164 0.236368 0.427 0.25 0.337442 0.235933 0.4271 0.25 0.33772 0.235499 0.4272 0.25 0.337998 0.235064 0.4273 0.25 0.338276 0.234628 0.4274 0.25 0.338555 0.234193 0.4275 0.25 0.338833 0.233757 0.4276 0.25 0.339112 0.23332 0.4277 0.25 0.339391 0.232884 0.4278 0.25 0.339671 0.232447 0.4279 0.25 0.33995 0.23201 0.428 0.25 0.34023 0.231573 0.4281 0.25 0.34051 0.231136 0.4282 0.25 0.34079 0.230699 0.4283 0.25 0.34107 0.230261 0.4284 0.25 0.341351 0.229824 0.4285 0.25 0.341631 0.229387 0.4286 0.25 0.341912 0.228949 0.4287 0.25 0.342193 0.228512 0.4288 0.25 0.342474 0.228074 0.4289 0.25 0.342756 0.227637 0.429 0.25 0.343038 0.2272 0.4291 0.25 0.343319 0.226763 0.4292 0.25 0.343601 0.226326 0.4293 0.25 0.343884 0.22589 0.4294 0.25 0.344166 0.225453 0.4295 0.25 0.344449 0.225017 0.4296 0.25 0.344731 0.224582 0.4297 0.25 0.345014 0.224146 0.4298 0.25 0.345298 0.223711 0.4299 0.25 0.345581 0.223276 0.43 0.25 0.345864 0.222842 0.4301 0.25 0.346148 0.222408 0.4302 0.25 0.346432 0.221975 0.4303 0.25 0.346716 0.221542 0.4304 0.25 0.347001 0.22111 0.4305 0.25 0.347285 0.220678 0.4306 0.25 0.34757 0.220247 0.4307 0.25 0.347855 0.219816 0.4308 0.25 0.34814 0.219386 0.4309 0.25 0.348425 0.218957 0.431 0.25 0.34871 0.218528 0.4311 0.25 0.348996 0.2181 0.4312 0.25 0.349282 0.217673 0.4313 0.25 0.349568 0.217247 0.4314 0.25 0.349854 0.216821 0.4315 0.25 0.35014 0.216397 0.4316 0.25 0.350427 0.215973 0.4317 0.25 0.350714 0.21555 0.4318 0.25 0.351 0.215128 0.4319 0.25 0.351287 0.214707 0.432 0.25 0.351575 0.214287 0.4321 0.25 0.351862 0.213868 0.4322 0.25 0.35215 0.21345 0.4323 0.25 0.352438 0.213033 0.4324 0.25 0.352726 0.212618 0.4325 0.25 0.353014 0.212203 0.4326 0.25 0.353302 0.21179 0.4327 0.25 0.353591 0.211378 0.4328 0.25 0.353879 0.210967 0.4329 0.25 0.354168 0.210557 0.433 0.25 0.354457 0.210149 0.4331 0.25 0.354747 0.209742 0.4332 0.25 0.355036 0.209336 0.4333 0.25 0.355326 0.208932 0.4334 0.25 0.355615 0.208529 0.4335 0.25 0.355905 0.208128 0.4336 0.25 0.356195 0.207728 0.4337 0.25 0.356486 0.20733 0.4338 0.25 0.356776 0.206933 0.4339 0.25 0.357067 0.206538 0.434 0.25 0.357358 0.206144 0.4341 0.25 0.357649 0.205752 0.4342 0.25 0.35794 0.205362 0.4343 0.25 0.358231 0.204973 0.4344 0.25 0.358523 0.204586 0.4345 0.25 0.358814 0.204201 0.4346 0.25 0.359106 0.203817 0.4347 0.25 0.359398 0.203436 0.4348 0.25 0.359691 0.203056 0.4349 0.25 0.359983 0.202678 0.435 0.25 0.360276 0.202302 0.4351 0.25 0.360568 0.201928 0.4352 0.25 0.360861 0.201556 0.4353 0.25 0.361154 0.201186 0.4354 0.25 0.361447 0.200818 0.4355 0.25 0.361741 0.200452 0.4356 0.25 0.362034 0.200088 0.4357 0.25 0.362328 0.199727 0.4358 0.25 0.362622 0.199367 0.4359 0.25 0.362916 0.19901 0.436 0.25 0.36321 0.198655 0.4361 0.25 0.363505 0.198302 0.4362 0.25 0.363799 0.197951 0.4363 0.25 0.364094 0.197602 0.4364 0.25 0.364389 0.197256 0.4365 0.25 0.364684 0.196913 0.4366 0.25 0.364979 0.196571 0.4367 0.25 0.365275 0.196233 0.4368 0.25 0.36557 0.195896 0.4369 0.25 0.365866 0.195562 0.437 0.25 0.366162 0.195231 0.4371 0.25 0.366458 0.194902 0.4372 0.25 0.366754 0.194576 0.4373 0.25 0.36705 0.194252 0.4374 0.25 0.367347 0.193931 0.4375 0.25 0.367644 0.193612 0.4376 0.25 0.36794 0.193297 0.4377 0.25 0.368237 0.192984 0.4378 0.25 0.368535 0.192673 0.4379 0.25 0.368832 0.192366 0.438 0.25 0.369129 0.192061 0.4381 0.25 0.369427 0.191759 0.4382 0.25 0.369725 0.19146 0.4383 0.25 0.370023 0.191164 0.4384 0.25 0.370321 0.190871 0.4385 0.25 0.370619 0.190581 0.4386 0.25 0.370918 0.190294 0.4387 0.25 0.371216 0.190009 0.4388 0.25 0.371515 0.189728 0.4389 0.25 0.371814 0.18945 0.439 0.25 0.372113 0.189175 0.4391 0.25 0.372412 0.188903 0.4392 0.25 0.372711 0.188635 0.4393 0.25 0.373011 0.188369 0.4394 0.25 0.373311 0.188107 0.4395 0.25 0.37361 0.187848 0.4396 0.25 0.37391 0.187592 0.4397 0.25 0.37421 0.187339 0.4398 0.25 0.374511 0.18709 0.4399 0.25 0.374811 0.186844 0.44 0.25 0.375112 0.186602 0.4401 0.25 0.375412 0.186363 0.4402 0.25 0.375713 0.186127 0.4403 0.25 0.376014 0.185895 0.4404 0.25 0.376315 0.185667 0.4405 0.25 0.376617 0.185442 0.4406 0.25 0.376918 0.18522 0.4407 0.25 0.37722 0.185002 0.4408 0.25 0.377522 0.184788 0.4409 0.25 0.377823 0.184577 0.441 0.25 0.378126 0.18437 0.4411 0.25 0.378428 0.184167 0.4412 0.25 0.37873 0.183967 0.4413 0.25 0.379033 0.183771 0.4414 0.25 0.379335 0.183579 0.4415 0.25 0.379638 0.183391 0.4416 0.25 0.379941 0.183206 0.4417 0.25 0.380244 0.183026 0.4418 0.25 0.380547 0.182849 0.4419 0.25 0.380851 0.182676 0.442 0.25 0.381154 0.182507 0.4421 0.25 0.381458 0.182342 0.4422 0.25 0.381761 0.182181 0.4423 0.25 0.382065 0.182024 0.4424 0.25 0.382369 0.181871 0.4425 0.25 0.382674 0.181722 0.4426 0.25 0.382978 0.181578 0.4427 0.25 0.383282 0.181437 0.4428 0.25 0.383587 0.1813 0.4429 0.25 0.383892 0.181168 0.443 0.25 0.384197 0.18104 0.4431 0.25 0.384502 0.180916 0.4432 0.25 0.384807 0.180796 0.4433 0.25 0.385112 0.18068 0.4434 0.25 0.385418 0.180569 0.4435 0.25 0.385723 0.180462 0.4436 0.25 0.386029 0.18036 0.4437 0.25 0.386335 0.180261 0.4438 0.25 0.386641 0.180168 0.4439 0.25 0.386947 0.180078 0.444 0.25 0.387253 0.179993 0.4441 0.25 0.38756 0.179913 0.4442 0.25 0.387866 0.179837 0.4443 0.25 0.388173 0.179765 0.4444 0.25 0.38848 0.179698 0.4445 0.25 0.388786 0.179635 0.4446 0.25 0.389094 0.179577 0.4447 0.25 0.389401 0.179524 0.4448 0.25 0.389708 0.179475 0.4449 0.25 0.390015 0.179431 0.445 0.25 0.390323 0.179392 0.4451 0.25 0.390631 0.179357 0.4452 0.25 0.390939 0.179327 0.4453 0.25 0.391247 0.179302 0.4454 0.25 0.391555 0.179281 0.4455 0.25 0.391863 0.179265 0.4456 0.25 0.392171 0.179254 0.4457 0.25 0.39248 0.179248 0.4458 0.25 0.392788 0.179247 0.4459 0.25 0.393097 0.17925 0.446 0.25 0.393406 0.179259 0.4461 0.25 0.393715 0.179272 0.4462 0.25 0.394024 0.17929 0.4463 0.25 0.394333 0.179313 0.4464 0.25 0.394642 0.179341 0.4465 0.25 0.394952 0.179374 0.4466 0.25 0.395262 0.179413 0.4467 0.25 0.395571 0.179456 0.4468 0.25 0.395881 0.179504 0.4469 0.25 0.396191 0.179557 0.447 0.25 0.396501 0.179615 0.4471 0.25 0.396811 0.179678 0.4472 0.25 0.397122 0.179747 0.4473 0.25 0.397432 0.17982 0.4474 0.25 0.397743 0.179899 0.4475 0.25 0.398053 0.179983 0.4476 0.25 0.398364 0.180072 0.4477 0.25 0.398675 0.180166 0.4478 0.25 0.398986 0.180266 0.4479 0.25 0.399297 0.180371 0.448 0.25 0.399609 0.180481 0.4481 0.25 0.39992 0.180596 0.4482 0.25 0.400231 0.180717 0.4483 0.25 0.400543 0.180843 0.4484 0.25 0.400855 0.180974 0.4485 0.25 0.401167 0.18111 0.4486 0.25 0.401479 0.181252 0.4487 0.25 0.401791 0.181399 0.4488 0.25 0.402103 0.181552 0.4489 0.25 0.402415 0.18171 0.449 0.25 0.402728 0.181874 0.4491 0.25 0.40304 0.182043 0.4492 0.25 0.403353 0.182217 0.4493 0.25 0.403666 0.182397 0.4494 0.25 0.403979 0.182582 0.4495 0.25 0.404292 0.182773 0.4496 0.25 0.404605 0.182969 0.4497 0.25 0.404918 0.183171 0.4498 0.25 0.405231 0.183379 0.4499 0.25 0.405545 0.183592 0.45 0.25 0.405858 0.18381 0.4501 0.25 0.406172 0.184034 0.4502 0.25 0.406485 0.184264 0.4503 0.25 0.406799 0.184499 0.4504 0.25 0.407113 0.18474 0.4505 0.25 0.407427 0.184987 0.4506 0.25 0.407742 0.185239 0.4507 0.25 0.408056 0.185497 0.4508 0.25 0.40837 0.185761 0.4509 0.25 0.408685 0.18603 0.451 0.25 0.408999 0.186305 0.4511 0.25 0.409314 0.186585 0.4512 0.25 0.409629 0.186872 0.4513 0.25 0.409944 0.187164 0.4514 0.25 0.410259 0.187461 0.4515 0.25 0.410574 0.187765 0.4516 0.25 0.410889 0.188074 0.4517 0.25 0.411204 0.188389 0.4518 0.25 0.41152 0.18871 0.4519 0.25 0.411835 0.189037 0.452 0.25 0.412151 0.189369 0.4521 0.25 0.412467 0.189707 0.4522 0.25 0.412782 0.190051 0.4523 0.25 0.413098 0.190401 0.4524 0.25 0.413414 0.190757 0.4525 0.25 0.41373 0.191119 0.4526 0.25 0.414047 0.191486 0.4527 0.25 0.414363 0.191859 0.4528 0.25 0.414679 0.192238 0.4529 0.25 0.414996 0.192623 0.453 0.25 0.415312 0.193014 0.4531 0.25 0.415629 0.193411 0.4532 0.25 0.415946 0.193813 0.4533 0.25 0.416263 0.194222 0.4534 0.25 0.41658 0.194636 0.4535 0.25 0.416897 0.195057 0.4536 0.25 0.417214 0.195483 0.4537 0.25 0.417531 0.195915 0.4538 0.25 0.417849 0.196353 0.4539 0.25 0.418166 0.196797 0.454 0.25 0.418484 0.197247 0.4541 0.25 0.418801 0.197703 0.4542 0.25 0.419119 0.198165 0.4543 0.25 0.419437 0.198633 0.4544 0.25 0.419755 0.199107 0.4545 0.25 0.420073 0.199587 0.4546 0.25 0.420391 0.200072 0.4547 0.25 0.420709 0.200564 0.4548 0.25 0.421027 0.201062 0.4549 0.25 0.421345 0.201565 0.455 0.25 0.421664 0.202075 0.4551 0.25 0.421982 0.20259 0.4552 0.25 0.422301 0.203112 0.4553 0.25 0.42262 0.20364 0.4554 0.25 0.422938 0.204173 0.4555 0.25 0.423257 0.204713 0.4556 0.25 0.423576 0.205258 0.4557 0.25 0.423895 0.20581 0.4558 0.25 0.424214 0.206367 0.4559 0.25 0.424534 0.206931 0.456 0.25 0.424853 0.2075 0.4561 0.25 0.425172 0.208076 0.4562 0.25 0.425492 0.208657 0.4563 0.25 0.425811 0.209245 0.4564 0.25 0.426131 0.209838 0.4565 0.25 0.42645 0.210438 0.4566 0.25 0.42677 0.211043 0.4567 0.25 0.42709 0.211654 0.4568 0.25 0.42741 0.212272 0.4569 0.25 0.42773 0.212895 0.457 0.25 0.42805 0.213525 0.4571 0.25 0.42837 0.21416 0.4572 0.25 0.42869 0.214801 0.4573 0.25 0.429011 0.215449 0.4574 0.25 0.429331 0.216102 0.4575 0.25 0.429651 0.216761 0.4576 0.25 0.429972 0.217427 0.4577 0.25 0.430293 0.218098 0.4578 0.25 0.430613 0.218775 0.4579 0.25 0.430934 0.219458 0.458 0.25 0.431255 0.220147 0.4581 0.25 0.431576 0.220842 0.4582 0.25 0.431897 0.221543 0.4583 0.25 0.432218 0.22225 0.4584 0.25 0.432539 0.222963 0.4585 0.25 0.43286 0.223682 0.4586 0.25 0.433181 0.224407 0.4587 0.25 0.433503 0.225137 0.4588 0.25 0.433824 0.225874 0.4589 0.25 0.434146 0.226616 0.459 0.25 0.434467 0.227365 0.4591 0.25 0.434789 0.228119 0.4592 0.25 0.43511 0.228879 0.4593 0.25 0.435432 0.229645 0.4594 0.25 0.435754 0.230417 0.4595 0.25 0.436076 0.231195 0.4596 0.25 0.436398 0.231978 0.4597 0.25 0.43672 0.232768 0.4598 0.25 0.437042 0.233563 0.4599 0.25 0.437364 0.234364 0.46 0.25 0.437686 0.235171 0.4601 0.25 0.438009 0.235984 0.4602 0.25 0.438331 0.236802 0.4603 0.25 0.438653 0.237627 0.4604 0.25 0.438976 0.238457 0.4605 0.25 0.439298 0.239293 0.4606 0.25 0.439621 0.240134 0.4607 0.25 0.439944 0.240982 0.4608 0.25 0.440266 0.241835 0.4609 0.25 0.440589 0.242694 0.461 0.25 0.440912 0.243558 0.4611 0.25 0.441235 0.244429 0.4612 0.25 0.441558 0.245305 0.4613 0.25 0.441881 0.246186 0.4614 0.25 0.442204 0.247074 0.4615 0.25 0.442527 0.247967 0.4616 0.25 0.44285 0.248865 0.4617 0.25 0.443174 0.24977 0.4618 0.25 0.443497 0.25068 0.4619 0.25 0.44382 0.251595 0.462 0.25 0.444144 0.252516 0.4621 0.25 0.444467 0.253443 0.4622 0.25 0.444791 0.254375 0.4623 0.25 0.445114 0.255313 0.4624 0.25 0.445438 0.256256 0.4625 0.25 0.445762 0.257205 0.4626 0.25 0.446086 0.25816 0.4627 0.25 0.446409 0.25912 0.4628 0.25 0.446733 0.260085 0.4629 0.25 0.447057 0.261056 0.463 0.25 0.447381 0.262032 0.4631 0.25 0.447705 0.263014 0.4632 0.25 0.448029 0.264001 0.4633 0.25 0.448353 0.264994 0.4634 0.25 0.448678 0.265992 0.4635 0.25 0.449002 0.266995 0.4636 0.25 0.449326 0.268004 0.4637 0.25 0.44965 0.269018 0.4638 0.25 0.449975 0.270037 0.4639 0.25 0.450299 0.271062 0.464 0.25 0.450624 0.272091 0.4641 0.25 0.450948 0.273127 0.4642 0.25 0.451273 0.274167 0.4643 0.25 0.451597 0.275213 0.4644 0.25 0.451922 0.276263 0.4645 0.25 0.452247 0.277319 0.4646 0.25 0.452571 0.278381 0.4647 0.25 0.452896 0.279447 0.4648 0.25 0.453221 0.280518 0.4649 0.25 0.453546 0.281595 0.465 0.25 0.453871 0.282677 0.4651 0.25 0.454196 0.283763 0.4652 0.25 0.454521 0.284855 0.4653 0.25 0.454846 0.285952 0.4654 0.25 0.455171 0.287054 0.4655 0.25 0.455496 0.288161 0.4656 0.25 0.455821 0.289272 0.4657 0.25 0.456146 0.290389 0.4658 0.25 0.456472 0.291511 0.4659 0.25 0.456797 0.292637 0.466 0.25 0.457122 0.293769 0.4661 0.25 0.457448 0.294905 0.4662 0.25 0.457773 0.296046 0.4663 0.25 0.458099 0.297192 0.4664 0.25 0.458424 0.298343 0.4665 0.25 0.45875 0.299498 0.4666 0.25 0.459075 0.300658 0.4667 0.25 0.459401 0.301823 0.4668 0.25 0.459726 0.302993 0.4669 0.25 0.460052 0.304167 0.467 0.25 0.460378 0.305346 0.4671 0.25 0.460703 0.30653 0.4672 0.25 0.461029 0.307718 0.4673 0.25 0.461355 0.308911 0.4674 0.25 0.461681 0.310108 0.4675 0.25 0.462007 0.31131 0.4676 0.25 0.462332 0.312516 0.4677 0.25 0.462658 0.313727 0.4678 0.25 0.462984 0.314942 0.4679 0.25 0.46331 0.316162 0.468 0.25 0.463636 0.317386 0.4681 0.25 0.463962 0.318614 0.4682 0.25 0.464288 0.319847 0.4683 0.25 0.464615 0.321084 0.4684 0.25 0.464941 0.322326 0.4685 0.25 0.465267 0.323572 0.4686 0.25 0.465593 0.324821 0.4687 0.25 0.465919 0.326076 0.4688 0.25 0.466245 0.327334 0.4689 0.25 0.466572 0.328596 0.469 0.25 0.466898 0.329863 0.4691 0.25 0.467224 0.331134 0.4692 0.25 0.467551 0.332408 0.4693 0.25 0.467877 0.333687 0.4694 0.25 0.468203 0.33497 0.4695 0.25 0.46853 0.336257 0.4696 0.25 0.468856 0.337548 0.4697 0.25 0.469183 0.338842 0.4698 0.25 0.469509 0.340141 0.4699 0.25 0.469836 0.341444 0.47 0.25 0.470162 0.34275 0.4701 0.25 0.470489 0.34406 0.4702 0.25 0.470815 0.345374 0.4703 0.25 0.471142 0.346692 0.4704 0.25 0.471468 0.348013 0.4705 0.25 0.471795 0.349338 0.4706 0.25 0.472122 0.350667 0.4707 0.25 0.472448 0.352 0.4708 0.25 0.472775 0.353336 0.4709 0.25 0.473102 0.354675 0.471 0.25 0.473428 0.356018 0.4711 0.25 0.473755 0.357365 0.4712 0.25 0.474082 0.358715 0.4713 0.25 0.474408 0.360069 0.4714 0.25 0.474735 0.361426 0.4715 0.25 0.475062 0.362786 0.4716 0.25 0.475389 0.36415 0.4717 0.25 0.475716 0.365517 0.4718 0.25 0.476042 0.366888 0.4719 0.25 0.476369 0.368261 0.472 0.25 0.476696 0.369638 0.4721 0.25 0.477023 0.371018 0.4722 0.25 0.47735 0.372402 0.4723 0.25 0.477677 0.373788 0.4724 0.25 0.478003 0.375177 0.4725 0.25 0.47833 0.37657 0.4726 0.25 0.478657 0.377966 0.4727 0.25 0.478984 0.379364 0.4728 0.25 0.479311 0.380766 0.4729 0.25 0.479638 0.38217 0.473 0.25 0.479965 0.383577 0.4731 0.25 0.480292 0.384988 0.4732 0.25 0.480619 0.386401 0.4733 0.25 0.480946 0.387817 0.4734 0.25 0.481273 0.389235 0.4735 0.25 0.4816 0.390657 0.4736 0.25 0.481927 0.392081 0.4737 0.25 0.482254 0.393507 0.4738 0.25 0.482581 0.394937 0.4739 0.25 0.482908 0.396369 0.474 0.25 0.483235 0.397803 0.4741 0.25 0.483562 0.39924 0.4742 0.25 0.483889 0.40068 0.4743 0.25 0.484216 0.402122 0.4744 0.25 0.484543 0.403566 0.4745 0.25 0.48487 0.405013 0.4746 0.25 0.485197 0.406462 0.4747 0.25 0.485524 0.407914 0.4748 0.25 0.485851 0.409367 0.4749 0.25 0.486178 0.410823 0.475 0.25 0.486505 0.412281 0.4751 0.25 0.486832 0.413742 0.4752 0.25 0.487159 0.415204 0.4753 0.25 0.487486 0.416669 0.4754 0.25 0.487813 0.418135 0.4755 0.25 0.48814 0.419604 0.4756 0.25 0.488466 0.421075 0.4757 0.25 0.488793 0.422547 0.4758 0.25 0.48912 0.424022 0.4759 0.25 0.489447 0.425498 0.476 0.25 0.489774 0.426977 0.4761 0.25 0.490101 0.428457 0.4762 0.25 0.490428 0.429939 0.4763 0.25 0.490755 0.431422 0.4764 0.25 0.491082 0.432908 0.4765 0.25 0.491409 0.434394 0.4766 0.25 0.491736 0.435883 0.4767 0.25 0.492063 0.437373 0.4768 0.25 0.49239 0.438865 0.4769 0.25 0.492717 0.440358 0.477 0.25 0.493044 0.441853 0.4771 0.25 0.49337 0.443349 0.4772 0.25 0.493697 0.444847 0.4773 0.25 0.494024 0.446346 0.4774 0.25 0.494351 0.447846 0.4775 0.25 0.494678 0.449347 0.4776 0.25 0.495005 0.45085 0.4777 0.25 0.495331 0.452354 0.4778 0.25 0.495658 0.453859 0.4779 0.25 0.495985 0.455366 0.478 0.25 0.496312 0.456873 0.4781 0.25 0.496638 0.458382 0.4782 0.25 0.496965 0.459891 0.4783 0.25 0.497292 0.461402 0.4784 0.25 0.497619 0.462913 0.4785 0.25 0.497945 0.464426 0.4786 0.25 0.498272 0.465939 0.4787 0.25 0.498599 0.467453 0.4788 0.25 0.498925 0.468968 0.4789 0.25 0.499252 0.470484 0.479 0.25 0.499578 0.472 0.4791 0.25 0.499905 0.473517 0.4792 0.25 0.500231 0.475035 0.4793 0.25 0.500558 0.476553 0.4794 0.25 0.500885 0.478072 0.4795 0.25 0.501211 0.479592 0.4796 0.25 0.501537 0.481112 0.4797 0.25 0.501864 0.482632 0.4798 0.25 0.50219 0.484153 0.4799 0.25 0.502517 0.485674 0.48 0.25 0.502843 0.487196 0.4801 0.25 0.503169 0.488718 0.4802 0.25 0.503496 0.49024 0.4803 0.25 0.503822 0.491762 0.4804 0.25 0.504148 0.493285 0.4805 0.25 0.504475 0.494807 0.4806 0.25 0.504801 0.49633 0.4807 0.25 0.505127 0.497853 0.4808 0.25 0.505453 0.499376 0.4809 0.25 0.505779 0.500899 0.481 0.25 0.506105 0.502422 0.4811 0.25 0.506432 0.503945 0.4812 0.25 0.506758 0.505468 0.4813 0.25 0.507084 0.50699 0.4814 0.25 0.50741 0.508512 0.4815 0.25 0.507736 0.510035 0.4816 0.25 0.508062 0.511556 0.4817 0.25 0.508388 0.513078 0.4818 0.25 0.508713 0.514599 0.4819 0.25 0.509039 0.51612 0.482 0.25 0.509365 0.51764 0.4821 0.25 0.509691 0.51916 0.4822 0.25 0.510017 0.52068 0.4823 0.25 0.510342 0.522199 0.4824 0.25 0.510668 0.523717 0.4825 0.25 0.510994 0.525235 0.4826 0.25 0.511319 0.526752 0.4827 0.25 0.511645 0.528268 0.4828 0.25 0.51197 0.529784 0.4829 0.25 0.512296 0.531299 0.483 0.25 0.512621 0.532813 0.4831 0.25 0.512947 0.534326 0.4832 0.25 0.513272 0.535839 0.4833 0.25 0.513598 0.53735 0.4834 0.25 0.513923 0.53886 0.4835 0.25 0.514248 0.54037 0.4836 0.25 0.514574 0.541878 0.4837 0.25 0.514899 0.543386 0.4838 0.25 0.515224 0.544892 0.4839 0.25 0.515549 0.546397 0.484 0.25 0.515874 0.547901 0.4841 0.25 0.516199 0.549404 0.4842 0.25 0.516524 0.550906 0.4843 0.25 0.516849 0.552406 0.4844 0.25 0.517174 0.553905 0.4845 0.25 0.517499 0.555402 0.4846 0.25 0.517824 0.556898 0.4847 0.25 0.518149 0.558393 0.4848 0.25 0.518473 0.559886 0.4849 0.25 0.518798 0.561378 0.485 0.25 0.519123 0.562868 0.4851 0.25 0.519447 0.564357 0.4852 0.25 0.519772 0.565844 0.4853 0.25 0.520097 0.567329 0.4854 0.25 0.520421 0.568812 0.4855 0.25 0.520745 0.570294 0.4856 0.25 0.52107 0.571774 0.4857 0.25 0.521394 0.573252 0.4858 0.25 0.521718 0.574729 0.4859 0.25 0.522043 0.576203 0.486 0.25 0.522367 0.577676 0.4861 0.25 0.522691 0.579147 0.4862 0.25 0.523015 0.580615 0.4863 0.25 0.523339 0.582082 0.4864 0.25 0.523663 0.583546 0.4865 0.25 0.523987 0.585009 0.4866 0.25 0.524311 0.586469 0.4867 0.25 0.524635 0.587927 0.4868 0.25 0.524959 0.589383 0.4869 0.25 0.525282 0.590837 0.487 0.25 0.525606 0.592289 0.4871 0.25 0.52593 0.593738 0.4872 0.25 0.526253 0.595184 0.4873 0.25 0.526577 0.596629 0.4874 0.25 0.5269 0.598071 0.4875 0.25 0.527224 0.59951 0.4876 0.25 0.527547 0.600947 0.4877 0.25 0.52787 0.602382 0.4878 0.25 0.528194 0.603814 0.4879 0.25 0.528517 0.605243 0.488 0.25 0.52884 0.60667 0.4881 0.25 0.529163 0.608094 0.4882 0.25 0.529486 0.609516 0.4883 0.25 0.529809 0.610934 0.4884 0.25 0.530132 0.61235 0.4885 0.25 0.530455 0.613763 0.4886 0.25 0.530777 0.615174 0.4887 0.25 0.5311 0.616581 0.4888 0.25 0.531423 0.617986 0.4889 0.25 0.531745 0.619387 0.489 0.25 0.532068 0.620786 0.4891 0.25 0.53239 0.622182 0.4892 0.25 0.532713 0.623575 0.4893 0.25 0.533035 0.624964 0.4894 0.25 0.533357 0.626351 0.4895 0.25 0.533679 0.627734 0.4896 0.25 0.534002 0.629114 0.4897 0.25 0.534324 0.630491 0.4898 0.25 0.534646 0.631865 0.4899 0.25 0.534968 0.633236 0.49 0.25 0.53529 0.634603 0.4901 0.25 0.535611 0.635967 0.4902 0.25 0.535933 0.637328 0.4903 0.25 0.536255 0.638685 0.4904 0.25 0.536576 0.640039 0.4905 0.25 0.536898 0.641389 0.4906 0.25 0.537219 0.642736 0.4907 0.25 0.537541 0.64408 0.4908 0.25 0.537862 0.64542 0.4909 0.25 0.538183 0.646756 0.491 0.25 0.538505 0.648089 0.4911 0.25 0.538826 0.649418 0.4912 0.25 0.539147 0.650743 0.4913 0.25 0.539468 0.652065 0.4914 0.25 0.539789 0.653383 0.4915 0.25 0.54011 0.654697 0.4916 0.25 0.54043 0.656008 0.4917 0.25 0.540751 0.657315 0.4918 0.25 0.541072 0.658618 0.4919 0.25 0.541392 0.659917 0.492 0.25 0.541713 0.661212 0.4921 0.25 0.542033 0.662503 0.4922 0.25 0.542353 0.66379 0.4923 0.25 0.542674 0.665074 0.4924 0.25 0.542994 0.666353 0.4925 0.25 0.543314 0.667628 0.4926 0.25 0.543634 0.6689 0.4927 0.25 0.543954 0.670167 0.4928 0.25 0.544274 0.67143 0.4929 0.25 0.544594 0.672689 0.493 0.25 0.544913 0.673943 0.4931 0.25 0.545233 0.675194 0.4932 0.25 0.545552 0.67644 0.4933 0.25 0.545872 0.677682 0.4934 0.25 0.546191 0.67892 0.4935 0.25 0.546511 0.680154 0.4936 0.25 0.54683 0.681383 0.4937 0.25 0.547149 0.682608 0.4938 0.25 0.547468 0.683828 0.4939 0.25 0.547787 0.685044 0.494 0.25 0.548106 0.686256 0.4941 0.25 0.548425 0.687463 0.4942 0.25 0.548743 0.688665 0.4943 0.25 0.549062 0.689864 0.4944 0.25 0.549381 0.691057 0.4945 0.25 0.549699 0.692246 0.4946 0.25 0.550018 0.693431 0.4947 0.25 0.550336 0.694611 0.4948 0.25 0.550654 0.695786 0.4949 0.25 0.550972 0.696957 0.495 0.25 0.55129 0.698123 0.4951 0.25 0.551608 0.699284 0.4952 0.25 0.551926 0.70044 0.4953 0.25 0.552244 0.701592 0.4954 0.25 0.552562 0.702739 0.4955 0.25 0.552879 0.703881 0.4956 0.25 0.553197 0.705019 0.4957 0.25 0.553514 0.706151 0.4958 0.25 0.553832 0.707279 0.4959 0.25 0.554149 0.708402 0.496 0.25 0.554466 0.70952 0.4961 0.25 0.554783 0.710633 0.4962 0.25 0.5551 0.711741 0.4963 0.25 0.555417 0.712844 0.4964 0.25 0.555734 0.713942 0.4965 0.25 0.55605 0.715035 0.4966 0.25 0.556367 0.716124 0.4967 0.25 0.556683 0.717207 0.4968 0.25 0.557 0.718285 0.4969 0.25 0.557316 0.719358 0.497 0.25 0.557632 0.720425 0.4971 0.25 0.557949 0.721488 0.4972 0.25 0.558265 0.722546 0.4973 0.25 0.558581 0.723598 0.4974 0.25 0.558896 0.724645 0.4975 0.25 0.559212 0.725687 0.4976 0.25 0.559528 0.726724 0.4977 0.25 0.559843 0.727756 0.4978 0.25 0.560159 0.728782 0.4979 0.25 0.560474 0.729803 0.498 0.25 0.560789 0.730819 0.4981 0.25 0.561105 0.731829 0.4982 0.25 0.56142 0.732835 0.4983 0.25 0.561735 0.733834 0.4984 0.25 0.562049 0.734829 0.4985 0.25 0.562364 0.735818 0.4986 0.25 0.562679 0.736802 0.4987 0.25 0.562993 0.73778 0.4988 0.25 0.563308 0.738753 0.4989 0.25 0.563622 0.739721 0.499 0.25 0.563936 0.740683 0.4991 0.25 0.564251 0.741639 0.4992 0.25 0.564565 0.74259 0.4993 0.25 0.564879 0.743536 0.4994 0.25 0.565192 0.744476 0.4995 0.25 0.565506 0.74541 0.4996 0.25 0.56582 0.746339 0.4997 0.25 0.566133 0.747263 0.4998 0.25 0.566447 0.748181 0.4999 0.25 0.56676 0.749093 0.5 0.75 0.567073 0.75 0.5001 0.75 0.567386 0.750901 0.5002 0.75 0.567699 0.751797 0.5003 0.75 0.568012 0.752687 0.5004 0.75 0.568325 0.753571 0.5005 0.75 0.568638 0.75445 0.5006 0.75 0.56895 0.755323 0.5007 0.75 0.569263 0.75619 0.5008 0.75 0.569575 0.757051 0.5009 0.75 0.569887 0.757907 0.501 0.75 0.570199 0.758758 0.5011 0.75 0.570511 0.759602 0.5012 0.75 0.570823 0.760441 0.5013 0.75 0.571135 0.761274 0.5014 0.75 0.571446 0.762101 0.5015 0.75 0.571758 0.762923 0.5016 0.75 0.572069 0.763739 0.5017 0.75 0.572381 0.764549 0.5018 0.75 0.572692 0.765353 0.5019 0.75 0.573003 0.766151 0.502 0.75 0.573314 0.766944 0.5021 0.75 0.573625 0.767731 0.5022 0.75 0.573936 0.768512 0.5023 0.75 0.574246 0.769287 0.5024 0.75 0.574557 0.770056 0.5025 0.75 0.574867 0.77082 0.5026 0.75 0.575177 0.771578 0.5027 0.75 0.575488 0.772329 0.5028 0.75 0.575798 0.773075 0.5029 0.75 0.576108 0.773816 0.503 0.75 0.576417 0.77455 0.5031 0.75 0.576727 0.775278 0.5032 0.75 0.577037 0.776001 0.5033 0.75 0.577346 0.776717 0.5034 0.75 0.577655 0.777428 0.5035 0.75 0.577965 0.778133 0.5036 0.75 0.578274 0.778832 0.5037 0.75 0.578583 0.779525 0.5038 0.75 0.578891 0.780212 0.5039 0.75 0.5792 0.780893 0.504 0.75 0.579509 0.781568 0.5041 0.75 0.579817 0.782237 0.5042 0.75 0.580126 0.782901 0.5043 0.75 0.580434 0.783558 0.5044 0.75 0.580742 0.78421 0.5045 0.75 0.58105 0.784855 0.5046 0.75 0.581358 0.785495 0.5047 0.75 0.581665 0.786129 0.5048 0.75 0.581973 0.786756 0.5049 0.75 0.582281 0.787378 0.505 0.75 0.582588 0.787994 0.5051 0.75 0.582895 0.788604 0.5052 0.75 0.583202 0.789208 0.5053 0.75 0.583509 0.789806 0.5054 0.75 0.583816 0.790398 0.5055 0.75 0.584123 0.790984 0.5056 0.75 0.584429 0.791564 0.5057 0.75 0.584736 0.792139 0.5058 0.75 0.585042 0.792707 0.5059 0.75 0.585348 0.793269 0.506 0.75 0.585654 0.793826 0.5061 0.75 0.58596 0.794376 0.5062 0.75 0.586266 0.794921 0.5063 0.75 0.586572 0.795459 0.5064 0.75 0.586877 0.795992 0.5065 0.75 0.587183 0.796518 0.5066 0.75 0.587488 0.797039 0.5067 0.75 0.587793 0.797554 0.5068 0.75 0.588098 0.798063 0.5069 0.75 0.588403 0.798566 0.507 0.75 0.588708 0.799063 0.5071 0.75 0.589012 0.799554 0.5072 0.75 0.589317 0.800039 0.5073 0.75 0.589621 0.800518 0.5074 0.75 0.589925 0.800991 0.5075 0.75 0.590229 0.801459 0.5076 0.75 0.590533 0.80192 0.5077 0.75 0.590837 0.802376 0.5078 0.75 0.591141 0.802826 0.5079 0.75 0.591444 0.80327 0.508 0.75 0.591748 0.803707 0.5081 0.75 0.592051 0.80414 0.5082 0.75 0.592354 0.804566 0.5083 0.75 0.592657 0.804986 0.5084 0.75 0.59296 0.8054 0.5085 0.75 0.593263 0.805809 0.5086 0.75 0.593565 0.806212 0.5087 0.75 0.593868 0.806609 0.5088 0.75 0.59417 0.807 0.5089 0.75 0.594472 0.807385 0.509 0.75 0.594774 0.807764 0.5091 0.75 0.595076 0.808138 0.5092 0.75 0.595378 0.808506 0.5093 0.75 0.595679 0.808868 0.5094 0.75 0.595981 0.809224 0.5095 0.75 0.596282 0.809574 0.5096 0.75 0.596583 0.809919 0.5097 0.75 0.596884 0.810258 0.5098 0.75 0.597185 0.810591 0.5099 0.75 0.597485 0.810919 0.51 0.75 0.597786 0.81124 0.5101 0.75 0.598086 0.811556 0.5102 0.75 0.598387 0.811866 0.5103 0.75 0.598687 0.812171 0.5104 0.75 0.598987 0.81247 0.5105 0.75 0.599287 0.812763 0.5106 0.75 0.599586 0.81305 0.5107 0.75 0.599886 0.813332 0.5108 0.75 0.600185 0.813608 0.5109 0.75 0.600484 0.813879 0.511 0.75 0.600784 0.814144 0.5111 0.75 0.601082 0.814403 0.5112 0.75 0.601381 0.814657 0.5113 0.75 0.60168 0.814905 0.5114 0.75 0.601978 0.815147 0.5115 0.75 0.602277 0.815384 0.5116 0.75 0.602575 0.815616 0.5117 0.75 0.602873 0.815841 0.5118 0.75 0.603171 0.816062 0.5119 0.75 0.603469 0.816277 0.512 0.75 0.603766 0.816486 0.5121 0.75 0.604064 0.81669 0.5122 0.75 0.604361 0.816888 0.5123 0.75 0.604658 0.817081 0.5124 0.75 0.604955 0.817268 0.5125 0.75 0.605252 0.81745 0.5126 0.75 0.605548 0.817627 0.5127 0.75 0.605845 0.817798 0.5128 0.75 0.606141 0.817964 0.5129 0.75 0.606437 0.818124 0.513 0.75 0.606733 0.81828 0.5131 0.75 0.607029 0.818429 0.5132 0.75 0.607325 0.818574 0.5133 0.75 0.607621 0.818713 0.5134 0.75 0.607916 0.818847 0.5135 0.75 0.608211 0.818975 0.5136 0.75 0.608506 0.819099 0.5137 0.75 0.608801 0.819217 0.5138 0.75 0.609096 0.819329 0.5139 0.75 0.609391 0.819437 0.514 0.75 0.609685 0.81954 0.5141 0.75 0.60998 0.819637 0.5142 0.75 0.610274 0.819729 0.5143 0.75 0.610568 0.819816 0.5144 0.75 0.610862 0.819898 0.5145 0.75 0.611155 0.819975 0.5146 0.75 0.611449 0.820046 0.5147 0.75 0.611742 0.820113 0.5148 0.75 0.612035 0.820174 0.5149 0.75 0.612328 0.820231 0.515 0.75 0.612621 0.820283 0.5151 0.75 0.612914 0.820329 0.5152 0.75 0.613206 0.820371 0.5153 0.75 0.613499 0.820407 0.5154 0.75 0.613791 0.820439 0.5155 0.75 0.614083 0.820466 0.5156 0.75 0.614375 0.820488 0.5157 0.75 0.614666 0.820505 0.5158 0.75 0.614958 0.820517 0.5159 0.75 0.615249 0.820524 0.516 0.75 0.615541 0.820527 0.5161 0.75 0.615832 0.820525 0.5162 0.75 0.616122 0.820518 0.5163 0.75 0.616413 0.820506 0.5164 0.75 0.616704 0.82049 0.5165 0.75 0.616994 0.820469 0.5166 0.75 0.617284 0.820443 0.5167 0.75 0.617574 0.820412 0.5168 0.75 0.617864 0.820377 0.5169 0.75 0.618154 0.820337 0.517 0.75 0.618443 0.820293 0.5171 0.75 0.618733 0.820244 0.5172 0.75 0.619022 0.820191 0.5173 0.75 0.619311 0.820133 0.5174 0.75 0.6196 0.82007 0.5175 0.75 0.619889 0.820003 0.5176 0.75 0.620177 0.819932 0.5177 0.75 0.620465 0.819856 0.5178 0.75 0.620754 0.819776 0.5179 0.75 0.621042 0.819691 0.518 0.75 0.621329 0.819602 0.5181 0.75 0.621617 0.819509 0.5182 0.75 0.621904 0.819411 0.5183 0.75 0.622192 0.819309 0.5184 0.75 0.622479 0.819203 0.5185 0.75 0.622766 0.819093 0.5186 0.75 0.623053 0.818978 0.5187 0.75 0.623339 0.818859 0.5188 0.75 0.623626 0.818736 0.5189 0.75 0.623912 0.818609 0.519 0.75 0.624198 0.818477 0.5191 0.75 0.624484 0.818342 0.5192 0.75 0.62477 0.818203 0.5193 0.75 0.625055 0.818059 0.5194 0.75 0.62534 0.817912 0.5195 0.75 0.625626 0.81776 0.5196 0.75 0.625911 0.817604 0.5197 0.75 0.626195 0.817445 0.5198 0.75 0.62648 0.817282 0.5199 0.75 0.626765 0.817114 0.52 0.75 0.627049 0.816943 0.5201 0.75 0.627333 0.816768 0.5202 0.75 0.627617 0.816589 0.5203 0.75 0.627901 0.816407 0.5204 0.75 0.628184 0.81622 0.5205 0.75 0.628468 0.81603 0.5206 0.75 0.628751 0.815837 0.5207 0.75 0.629034 0.815639 0.5208 0.75 0.629317 0.815438 0.5209 0.75 0.629599 0.815233 0.521 0.75 0.629882 0.815025 0.5211 0.75 0.630164 0.814813 0.5212 0.75 0.630446 0.814597 0.5213 0.75 0.630728 0.814378 0.5214 0.75 0.63101 0.814156 0.5215 0.75 0.631292 0.81393 0.5216 0.75 0.631573 0.8137 0.5217 0.75 0.631854 0.813468 0.5218 0.75 0.632135 0.813231 0.5219 0.75 0.632416 0.812992 0.522 0.75 0.632697 0.812749 0.5221 0.75 0.632977 0.812503 0.5222 0.75 0.633257 0.812253 0.5223 0.75 0.633537 0.812 0.5224 0.75 0.633817 0.811744 0.5225 0.75 0.634097 0.811485 0.5226 0.75 0.634376 0.811223 0.5227 0.75 0.634656 0.810957 0.5228 0.75 0.634935 0.810689 0.5229 0.75 0.635214 0.810417 0.523 0.75 0.635493 0.810143 0.5231 0.75 0.635771 0.809865 0.5232 0.75 0.63605 0.809584 0.5233 0.75 0.636328 0.8093 0.5234 0.75 0.636606 0.809014 0.5235 0.75 0.636884 0.808724 0.5236 0.75 0.637161 0.808432 0.5237 0.75 0.637439 0.808137 0.5238 0.75 0.637716 0.807839 0.5239 0.75 0.637993 0.807538 0.524 0.75 0.63827 0.807234 0.5241 0.75 0.638547 0.806928 0.5242 0.75 0.638823 0.806619 0.5243 0.75 0.639099 0.806307 0.5244 0.75 0.639375 0.805992 0.5245 0.75 0.639651 0.805675 0.5246 0.75 0.639927 0.805356 0.5247 0.75 0.640202 0.805034 0.5248 0.75 0.640478 0.804709 0.5249 0.75 0.640753 0.804382 0.525 0.75 0.641028 0.804052 0.5251 0.75 0.641303 0.80372 0.5252 0.75 0.641577 0.803386 0.5253 0.75 0.641851 0.803049 0.5254 0.75 0.642126 0.802709 0.5255 0.75 0.642399 0.802368 0.5256 0.75 0.642673 0.802024 0.5257 0.75 0.642947 0.801678 0.5258 0.75 0.64322 0.801329 0.5259 0.75 0.643493 0.800979 0.526 0.75 0.643766 0.800626 0.5261 0.75 0.644039 0.800271 0.5262 0.75 0.644312 0.799914 0.5263 0.75 0.644584 0.799555 0.5264 0.75 0.644856 0.799194 0.5265 0.75 0.645128 0.798831 0.5266 0.75 0.6454 0.798465 0.5267 0.75 0.645671 0.798098 0.5268 0.75 0.645943 0.797729 0.5269 0.75 0.646214 0.797358 0.527 0.75 0.646485 0.796985 0.5271 0.75 0.646756 0.79661 0.5272 0.75 0.647026 0.796234 0.5273 0.75 0.647297 0.795856 0.5274 0.75 0.647567 0.795475 0.5275 0.75 0.647837 0.795094 0.5276 0.75 0.648106 0.79471 0.5277 0.75 0.648376 0.794325 0.5278 0.75 0.648645 0.793938 0.5279 0.75 0.648914 0.793549 0.528 0.75 0.649183 0.793159 0.5281 0.75 0.649452 0.792768 0.5282 0.75 0.649721 0.792375 0.5283 0.75 0.649989 0.79198 0.5284 0.75 0.650257 0.791584 0.5285 0.75 0.650525 0.791186 0.5286 0.75 0.650793 0.790787 0.5287 0.75 0.65106 0.790387 0.5288 0.75 0.651327 0.789986 0.5289 0.75 0.651595 0.789583 0.529 0.75 0.651861 0.789178 0.5291 0.75 0.652128 0.788773 0.5292 0.75 0.652395 0.788366 0.5293 0.75 0.652661 0.787958 0.5294 0.75 0.652927 0.787549 0.5295 0.75 0.653193 0.787139 0.5296 0.75 0.653458 0.786727 0.5297 0.75 0.653724 0.786315 0.5298 0.75 0.653989 0.785902 0.5299 0.75 0.654254 0.785487 0.53 0.75 0.654519 0.785072 0.5301 0.75 0.654783 0.784655 0.5302 0.75 0.655048 0.784238 0.5303 0.75 0.655312 0.783819 0.5304 0.75 0.655576 0.7834 0.5305 0.75 0.65584 0.78298 0.5306 0.75 0.656103 0.782559 0.5307 0.75 0.656367 0.782138 0.5308 0.75 0.65663 0.781715 0.5309 0.75 0.656893 0.781292 0.531 0.75 0.657155 0.780868 0.5311 0.75 0.657418 0.780444 0.5312 0.75 0.65768 0.780019 0.5313 0.75 0.657942 0.779593 0.5314 0.75 0.658204 0.779167 0.5315 0.75 0.658466 0.77874 0.5316 0.75 0.658727 0.778313 0.5317 0.75 0.658988 0.777885 0.5318 0.75 0.659249 0.777456 0.5319 0.75 0.65951 0.777027 0.532 0.75 0.65977 0.776598 0.5321 0.75 0.660031 0.776169 0.5322 0.75 0.660291 0.775739 0.5323 0.75 0.660551 0.775308 0.5324 0.75 0.660811 0.774878 0.5325 0.75 0.66107 0.774447 0.5326 0.75 0.661329 0.774016 0.5327 0.75 0.661588 0.773584 0.5328 0.75 0.661847 0.773153 0.5329 0.75 0.662106 0.772721 0.533 0.75 0.662364 0.772289 0.5331 0.75 0.662622 0.771857 0.5332 0.75 0.66288 0.771425 0.5333 0.75 0.663138 0.770993 0.5334 0.75 0.663395 0.770561 0.5335 0.75 0.663653 0.770129 0.5336 0.75 0.66391 0.769697 0.5337 0.75 0.664167 0.769265 0.5338 0.75 0.664423 0.768833 0.5339 0.75 0.66468 0.768401 0.534 0.75 0.664936 0.767969 0.5341 0.75 0.665192 0.767538 0.5342 0.75 0.665448 0.767106 0.5343 0.75 0.665703 0.766675 0.5344 0.75 0.665959 0.766244 0.5345 0.75 0.666214 0.765813 0.5346 0.75 0.666469 0.765383 0.5347 0.75 0.666723 0.764953 0.5348 0.75 0.666978 0.764523 0.5349 0.75 0.667232 0.764094 0.535 0.75 0.667486 0.763665 0.5351 0.75 0.66774 0.763237 0.5352 0.75 0.667993 0.762809 0.5353 0.75 0.668246 0.762381 0.5354 0.75 0.6685 0.761954 0.5355 0.75 0.668752 0.761528 0.5356 0.75 0.669005 0.761102 0.5357 0.75 0.669257 0.760676 0.5358 0.75 0.66951 0.760251 0.5359 0.75 0.669762 0.759827 0.536 0.75 0.670013 0.759404 0.5361 0.75 0.670265 0.758981 0.5362 0.75 0.670516 0.758559 0.5363 0.75 0.670767 0.758137 0.5364 0.75 0.671018 0.757717 0.5365 0.75 0.671269 0.757297 0.5366 0.75 0.671519 0.756878 0.5367 0.75 0.671769 0.756459 0.5368 0.75 0.672019 0.756042 0.5369 0.75 0.672269 0.755625 0.537 0.75 0.672518 0.75521 0.5371 0.75 0.672768 0.754795 0.5372 0.75 0.673017 0.754381 0.5373 0.75 0.673265 0.753968 0.5374 0.75 0.673514 0.753557 0.5375 0.75 0.673762 0.753146 0.5376 0.75 0.67401 0.752736 0.5377 0.75 0.674258 0.752327 0.5378 0.75 0.674506 0.75192 0.5379 0.75 0.674753 0.751513 0.538 0.75 0.675001 0.751107 0.5381 0.75 0.675248 0.750703 0.5382 0.75 0.675494 0.7503 0.5383 0.75 0.675741 0.749898 0.5384 0.75 0.675987 0.749497 0.5385 0.75 0.676233 0.749098 0.5386 0.75 0.676479 0.7487 0.5387 0.75 0.676724 0.748303 0.5388 0.75 0.67697 0.747907 0.5389 0.75 0.677215 0.747513 0.539 0.75 0.67746 0.74712 0.5391 0.75 0.677704 0.746728 0.5392 0.75 0.677949 0.746338 0.5393 0.75 0.678193 0.745949 0.5394 0.75 0.678437 0.745562 0.5395 0.75 0.678681 0.745176 0.5396 0.75 0.678924 0.744791 0.5397 0.75 0.679167 0.744408 0.5398 0.75 0.67941 0.744027 0.5399 0.75 0.679653 0.743647 0.54 0.75 0.679896 0.743268 0.5401 0.75 0.680138 0.742891 0.5402 0.75 0.68038 0.742516 0.5403 0.75 0.680622 0.742142 0.5404 0.75 0.680863 0.74177 0.5405 0.75 0.681105 0.7414 0.5406 0.75 0.681346 0.741031 0.5407 0.75 0.681587 0.740664 0.5408 0.75 0.681827 0.740298 0.5409 0.75 0.682068 0.739935 0.541 0.75 0.682308 0.739573 0.5411 0.75 0.682548 0.739213 0.5412 0.75 0.682788 0.738854 0.5413 0.75 0.683027 0.738498 0.5414 0.75 0.683266 0.738143 0.5415 0.75 0.683505 0.73779 0.5416 0.75 0.683744 0.737439 0.5417 0.75 0.683983 0.737089 0.5418 0.75 0.684221 0.736742 0.5419 0.75 0.684459 0.736396 0.542 0.75 0.684697 0.736053 0.5421 0.75 0.684934 0.735711 0.5422 0.75 0.685172 0.735371 0.5423 0.75 0.685409 0.735033 0.5424 0.75 0.685646 0.734697 0.5425 0.75 0.685882 0.734364 0.5426 0.75 0.686119 0.734032 0.5427 0.75 0.686355 0.733702 0.5428 0.75 0.686591 0.733374 0.5429 0.75 0.686826 0.733048 0.543 0.75 0.687062 0.732725 0.5431 0.75 0.687297 0.732403 0.5432 0.75 0.687532 0.732084 0.5433 0.75 0.687766 0.731766 0.5434 0.75 0.688001 0.731451 0.5435 0.75 0.688235 0.731138 0.5436 0.75 0.688469 0.730827 0.5437 0.75 0.688703 0.730518 0.5438 0.75 0.688936 0.730212 0.5439 0.75 0.689169 0.729907 0.544 0.75 0.689402 0.729605 0.5441 0.75 0.689635 0.729305 0.5442 0.75 0.689867 0.729007 0.5443 0.75 0.6901 0.728712 0.5444 0.75 0.690332 0.728418 0.5445 0.75 0.690563 0.728127 0.5446 0.75 0.690795 0.727839 0.5447 0.75 0.691026 0.727552 0.5448 0.75 0.691257 0.727268 0.5449 0.75 0.691488 0.726987 0.545 0.75 0.691718 0.726707 0.5451 0.75 0.691949 0.72643 0.5452 0.75 0.692179 0.726155 0.5453 0.75 0.692409 0.725883 0.5454 0.75 0.692638 0.725613 0.5455 0.75 0.692867 0.725345 0.5456 0.75 0.693096 0.72508 0.5457 0.75 0.693325 0.724817 0.5458 0.75 0.693554 0.724557 0.5459 0.75 0.693782 0.724299 0.546 0.75 0.69401 0.724044 0.5461 0.75 0.694238 0.723791 0.5462 0.75 0.694465 0.72354 0.5463 0.75 0.694693 0.723292 0.5464 0.75 0.69492 0.723046 0.5465 0.75 0.695147 0.722803 0.5466 0.75 0.695373 0.722563 0.5467 0.75 0.6956 0.722325 0.5468 0.75 0.695826 0.722089 0.5469 0.75 0.696051 0.721856 0.547 0.75 0.696277 0.721625 0.5471 0.75 0.696502 0.721397 0.5472 0.75 0.696727 0.721172 0.5473 0.75 0.696952 0.720949 0.5474 0.75 0.697177 0.720729 0.5475 0.75 0.697401 0.720511 0.5476 0.75 0.697625 0.720296 0.5477 0.75 0.697849 0.720083 0.5478 0.75 0.698073 0.719873 0.5479 0.75 0.698296 0.719666 0.548 0.75 0.698519 0.719461 0.5481 0.75 0.698742 0.719259 0.5482 0.75 0.698964 0.719059 0.5483 0.75 0.699187 0.718862 0.5484 0.75 0.699409 0.718668 0.5485 0.75 0.699631 0.718476 0.5486 0.75 0.699852 0.718287 0.5487 0.75 0.700073 0.718101 0.5488 0.75 0.700295 0.717917 0.5489 0.75 0.700515 0.717736 0.549 0.75 0.700736 0.717558 0.5491 0.75 0.700956 0.717382 0.5492 0.75 0.701176 0.717209 0.5493 0.75 0.701396 0.717038 0.5494 0.75 0.701616 0.716871 0.5495 0.75 0.701835 0.716706 0.5496 0.75 0.702054 0.716543 0.5497 0.75 0.702273 0.716384 0.5498 0.75 0.702491 0.716227 0.5499 0.75 0.702709 0.716073 0.55 0.75 0.702927 0.715921 0.5501 0.75 0.703145 0.715772 0.5502 0.75 0.703363 0.715626 0.5503 0.75 0.70358 0.715483 0.5504 0.75 0.703797 0.715342 0.5505 0.75 0.704014 0.715204 0.5506 0.75 0.70423 0.715069 0.5507 0.75 0.704446 0.714936 0.5508 0.75 0.704662 0.714806 0.5509 0.75 0.704878 0.714679 0.551 0.75 0.705093 0.714555 0.5511 0.75 0.705309 0.714433 0.5512 0.75 0.705524 0.714314 0.5513 0.75 0.705738 0.714198 0.5514 0.75 0.705953 0.714084 0.5515 0.75 0.706167 0.713973 0.5516 0.75 0.706381 0.713865 0.5517 0.75 0.706594 0.71376 0.5518 0.75 0.706808 0.713658 0.5519 0.75 0.707021 0.713558 0.552 0.75 0.707234 0.713461 0.5521 0.75 0.707447 0.713366 0.5522 0.75 0.707659 0.713274 0.5523 0.75 0.707871 0.713186 0.5524 0.75 0.708083 0.713099 0.5525 0.75 0.708294 0.713016 0.5526 0.75 0.708506 0.712935 0.5527 0.75 0.708717 0.712857 0.5528 0.75 0.708928 0.712782 0.5529 0.75 0.709138 0.712709 0.553 0.75 0.709348 0.712639 0.5531 0.75 0.709558 0.712572 0.5532 0.75 0.709768 0.712507 0.5533 0.75 0.709978 0.712446 0.5534 0.75 0.710187 0.712387 0.5535 0.75 0.710396 0.71233 0.5536 0.75 0.710605 0.712277 0.5537 0.75 0.710813 0.712226 0.5538 0.75 0.711021 0.712177 0.5539 0.75 0.711229 0.712132 0.554 0.75 0.711437 0.712089 0.5541 0.75 0.711644 0.712049 0.5542 0.75 0.711852 0.712011 0.5543 0.75 0.712059 0.711976 0.5544 0.75 0.712265 0.711944 0.5545 0.75 0.712472 0.711915 0.5546 0.75 0.712678 0.711888 0.5547 0.75 0.712884 0.711864 0.5548 0.75 0.713089 0.711842 0.5549 0.75 0.713294 0.711823 0.555 0.75 0.7135 0.711807 0.5551 0.75 0.713704 0.711793 0.5552 0.75 0.713909 0.711782 0.5553 0.75 0.714113 0.711774 0.5554 0.75 0.714317 0.711768 0.5555 0.75 0.714521 0.711765 0.5556 0.75 0.714724 0.711765 0.5557 0.75 0.714928 0.711767 0.5558 0.75 0.715131 0.711772 0.5559 0.75 0.715333 0.711779 0.556 0.75 0.715536 0.711789 0.5561 0.75 0.715738 0.711801 0.5562 0.75 0.71594 0.711816 0.5563 0.75 0.716141 0.711834 0.5564 0.75 0.716343 0.711854 0.5565 0.75 0.716544 0.711877 0.5566 0.75 0.716745 0.711902 0.5567 0.75 0.716945 0.71193 0.5568 0.75 0.717146 0.71196 0.5569 0.75 0.717346 0.711993 0.557 0.75 0.717545 0.712028 0.5571 0.75 0.717745 0.712066 0.5572 0.75 0.717944 0.712106 0.5573 0.75 0.718143 0.712149 0.5574 0.75 0.718342 0.712194 0.5575 0.75 0.71854 0.712242 0.5576 0.75 0.718739 0.712292 0.5577 0.75 0.718936 0.712345 0.5578 0.75 0.719134 0.7124 0.5579 0.75 0.719332 0.712458 0.558 0.75 0.719529 0.712518 0.5581 0.75 0.719726 0.71258 0.5582 0.75 0.719922 0.712645 0.5583 0.75 0.720118 0.712712 0.5584 0.75 0.720314 0.712782 0.5585 0.75 0.72051 0.712853 0.5586 0.75 0.720706 0.712928 0.5587 0.75 0.720901 0.713004 0.5588 0.75 0.721096 0.713083 0.5589 0.75 0.721291 0.713165 0.559 0.75 0.721485 0.713248 0.5591 0.75 0.721679 0.713334 0.5592 0.75 0.721873 0.713423 0.5593 0.75 0.722067 0.713513 0.5594 0.75 0.72226 0.713606 0.5595 0.75 0.722453 0.713701 0.5596 0.75 0.722646 0.713799 0.5597 0.75 0.722839 0.713898 0.5598 0.75 0.723031 0.714 0.5599 0.75 0.723223 0.714104 0.56 0.75 0.723415 0.71421 0.5601 0.75 0.723606 0.714319 0.5602 0.75 0.723798 0.714429 0.5603 0.75 0.723989 0.714542 0.5604 0.75 0.724179 0.714657 0.5605 0.75 0.72437 0.714774 0.5606 0.75 0.72456 0.714894 0.5607 0.75 0.72475 0.715015 0.5608 0.75 0.724939 0.715138 0.5609 0.75 0.725129 0.715264 0.561 0.75 0.725318 0.715392 0.5611 0.75 0.725507 0.715522 0.5612 0.75 0.725695 0.715653 0.5613 0.75 0.725883 0.715787 0.5614 0.75 0.726071 0.715923 0.5615 0.75 0.726259 0.716061 0.5616 0.75 0.726446 0.716201 0.5617 0.75 0.726634 0.716343 0.5618 0.75 0.72682 0.716487 0.5619 0.75 0.727007 0.716633 0.562 0.75 0.727193 0.71678 0.5621 0.75 0.72738 0.71693 0.5622 0.75 0.727565 0.717082 0.5623 0.75 0.727751 0.717235 0.5624 0.75 0.727936 0.717391 0.5625 0.75 0.728121 0.717548 0.5626 0.75 0.728306 0.717707 0.5627 0.75 0.72849 0.717869 0.5628 0.75 0.728675 0.718031 0.5629 0.75 0.728858 0.718196 0.563 0.75 0.729042 0.718363 0.5631 0.75 0.729225 0.718531 0.5632 0.75 0.729409 0.718701 0.5633 0.75 0.729591 0.718873 0.5634 0.75 0.729774 0.719047 0.5635 0.75 0.729956 0.719222 0.5636 0.75 0.730138 0.719399 0.5637 0.75 0.73032 0.719578 0.5638 0.75 0.730501 0.719758 0.5639 0.75 0.730683 0.71994 0.564 0.75 0.730863 0.720124 0.5641 0.75 0.731044 0.72031 0.5642 0.75 0.731224 0.720497 0.5643 0.75 0.731405 0.720685 0.5644 0.75 0.731584 0.720875 0.5645 0.75 0.731764 0.721067 0.5646 0.75 0.731943 0.721261 0.5647 0.75 0.732122 0.721456 0.5648 0.75 0.732301 0.721652 0.5649 0.75 0.732479 0.72185 0.565 0.75 0.732657 0.722049 0.5651 0.75 0.732835 0.72225 0.5652 0.75 0.733013 0.722453 0.5653 0.75 0.73319 0.722656 0.5654 0.75 0.733367 0.722862 0.5655 0.75 0.733544 0.723068 0.5656 0.75 0.733721 0.723276 0.5657 0.75 0.733897 0.723486 0.5658 0.75 0.734073 0.723697 0.5659 0.75 0.734249 0.723909 0.566 0.75 0.734424 0.724122 0.5661 0.75 0.734599 0.724337 0.5662 0.75 0.734774 0.724553 0.5663 0.75 0.734949 0.724771 0.5664 0.75 0.735123 0.724989 0.5665 0.75 0.735297 0.725209 0.5666 0.75 0.735471 0.72543 0.5667 0.75 0.735644 0.725653 0.5668 0.75 0.735818 0.725876 0.5669 0.75 0.735991 0.726101 0.567 0.75 0.736163 0.726327 0.5671 0.75 0.736336 0.726554 0.5672 0.75 0.736508 0.726782 0.5673 0.75 0.73668 0.727011 0.5674 0.75 0.736851 0.727241 0.5675 0.75 0.737022 0.727473 0.5676 0.75 0.737193 0.727705 0.5677 0.75 0.737364 0.727939 0.5678 0.75 0.737535 0.728173 0.5679 0.75 0.737705 0.728408 0.568 0.75 0.737875 0.728645 0.5681 0.75 0.738044 0.728882 0.5682 0.75 0.738214 0.729121 0.5683 0.75 0.738383 0.72936 0.5684 0.75 0.738552 0.7296 0.5685 0.75 0.73872 0.729841 0.5686 0.75 0.738888 0.730083 0.5687 0.75 0.739056 0.730326 0.5688 0.75 0.739224 0.73057 0.5689 0.75 0.739391 0.730814 0.569 0.75 0.739559 0.73106 0.5691 0.75 0.739725 0.731306 0.5692 0.75 0.739892 0.731553 0.5693 0.75 0.740058 0.7318 0.5694 0.75 0.740224 0.732049 0.5695 0.75 0.74039 0.732298 0.5696 0.75 0.740556 0.732548 0.5697 0.75 0.740721 0.732798 0.5698 0.75 0.740886 0.733049 0.5699 0.75 0.74105 0.733301 0.57 0.75 0.741215 0.733553 0.5701 0.75 0.741379 0.733806 0.5702 0.75 0.741543 0.73406 0.5703 0.75 0.741706 0.734314 0.5704 0.75 0.741869 0.734569 0.5705 0.75 0.742032 0.734824 0.5706 0.75 0.742195 0.73508 0.5707 0.75 0.742358 0.735336 0.5708 0.75 0.74252 0.735593 0.5709 0.75 0.742682 0.73585 0.571 0.75 0.742843 0.736108 0.5711 0.75 0.743004 0.736366 0.5712 0.75 0.743165 0.736625 0.5713 0.75 0.743326 0.736883 0.5714 0.75 0.743487 0.737143 0.5715 0.75 0.743647 0.737402 0.5716 0.75 0.743807 0.737662 0.5717 0.75 0.743966 0.737923 0.5718 0.75 0.744126 0.738183 0.5719 0.75 0.744285 0.738444 0.572 0.75 0.744444 0.738705 0.5721 0.75 0.744602 0.738967 0.5722 0.75 0.74476 0.739228 0.5723 0.75 0.744918 0.73949 0.5724 0.75 0.745076 0.739752 0.5725 0.75 0.745233 0.740014 0.5726 0.75 0.745391 0.740277 0.5727 0.75 0.745547 0.740539 0.5728 0.75 0.745704 0.740802 0.5729 0.75 0.74586 0.741065 0.573 0.75 0.746016 0.741327 0.5731 0.75 0.746172 0.74159 0.5732 0.75 0.746327 0.741853 0.5733 0.75 0.746483 0.742116 0.5734 0.75 0.746638 0.742379 0.5735 0.75 0.746792 0.742642 0.5736 0.75 0.746946 0.742905 0.5737 0.75 0.747101 0.743168 0.5738 0.75 0.747254 0.743431 0.5739 0.75 0.747408 0.743694 0.574 0.75 0.747561 0.743957 0.5741 0.75 0.747714 0.744219 0.5742 0.75 0.747867 0.744482 0.5743 0.75 0.748019 0.744744 0.5744 0.75 0.748171 0.745007 0.5745 0.75 0.748323 0.745269 0.5746 0.75 0.748474 0.745531 0.5747 0.75 0.748626 0.745792 0.5748 0.75 0.748777 0.746054 0.5749 0.75 0.748927 0.746315 0.575 0.75 0.749078 0.746576 0.5751 0.75 0.749228 0.746836 0.5752 0.75 0.749378 0.747097 0.5753 0.75 0.749527 0.747357 0.5754 0.75 0.749677 0.747617 0.5755 0.75 0.749826 0.747876 0.5756 0.75 0.749974 0.748135 0.5757 0.75 0.750123 0.748394 0.5758 0.75 0.750271 0.748652 0.5759 0.75 0.750419 0.74891 0.576 0.75 0.750567 0.749167 0.5761 0.75 0.750714 0.749424 0.5762 0.75 0.750861 0.749681 0.5763 0.75 0.751008 0.749937 0.5764 0.75 0.751154 0.750193 0.5765 0.75 0.7513 0.750448 0.5766 0.75 0.751446 0.750702 0.5767 0.75 0.751592 0.750956 0.5768 0.75 0.751737 0.75121 0.5769 0.75 0.751882 0.751463 0.577 0.75 0.752027 0.751715 0.5771 0.75 0.752172 0.751967 0.5772 0.75 0.752316 0.752218 0.5773 0.75 0.75246 0.752468 0.5774 0.75 0.752604 0.752718 0.5775 0.75 0.752747 0.752967 0.5776 0.75 0.75289 0.753215 0.5777 0.75 0.753033 0.753463 0.5778 0.75 0.753176 0.75371 0.5779 0.75 0.753318 0.753957 0.578 0.75 0.75346 0.754202 0.5781 0.75 0.753602 0.754447 0.5782 0.75 0.753743 0.754691 0.5783 0.75 0.753884 0.754934 0.5784 0.75 0.754025 0.755177 0.5785 0.75 0.754166 0.755418 0.5786 0.75 0.754306 0.755659 0.5787 0.75 0.754446 0.755899 0.5788 0.75 0.754586 0.756138 0.5789 0.75 0.754726 0.756377 0.579 0.75 0.754865 0.756614 0.5791 0.75 0.755004 0.75685 0.5792 0.75 0.755142 0.757086 0.5793 0.75 0.755281 0.757321 0.5794 0.75 0.755419 0.757554 0.5795 0.75 0.755557 0.757787 0.5796 0.75 0.755694 0.758019 0.5797 0.75 0.755831 0.75825 0.5798 0.75 0.755968 0.758479 0.5799 0.75 0.756105 0.758708 0.58 0.75 0.756241 0.758936 0.5801 0.75 0.756377 0.759162 0.5802 0.75 0.756513 0.759388 0.5803 0.75 0.756649 0.759613 0.5804 0.75 0.756784 0.759836 0.5805 0.75 0.756919 0.760058 0.5806 0.75 0.757054 0.76028 0.5807 0.75 0.757188 0.7605 0.5808 0.75 0.757322 0.760719 0.5809 0.75 0.757456 0.760937 0.581 0.75 0.75759 0.761153 0.5811 0.75 0.757723 0.761369 0.5812 0.75 0.757856 0.761583 0.5813 0.75 0.757989 0.761796 0.5814 0.75 0.758122 0.762008 0.5815 0.75 0.758254 0.762219 0.5816 0.75 0.758386 0.762429 0.5817 0.75 0.758517 0.762637 0.5818 0.75 0.758649 0.762844 0.5819 0.75 0.75878 0.76305 0.582 0.75 0.75891 0.763254 0.5821 0.75 0.759041 0.763457 0.5822 0.75 0.759171 0.763659 0.5823 0.75 0.759301 0.76386 0.5824 0.75 0.759431 0.764059 0.5825 0.75 0.75956 0.764257 0.5826 0.75 0.759689 0.764454 0.5827 0.75 0.759818 0.764649 0.5828 0.75 0.759947 0.764843 0.5829 0.75 0.760075 0.765035 0.583 0.75 0.760203 0.765226 0.5831 0.75 0.760331 0.765416 0.5832 0.75 0.760458 0.765604 0.5833 0.75 0.760585 0.765791 0.5834 0.75 0.760712 0.765976 0.5835 0.75 0.760839 0.76616 0.5836 0.75 0.760965 0.766343 0.5837 0.75 0.761091 0.766524 0.5838 0.75 0.761217 0.766704 0.5839 0.75 0.761342 0.766882 0.584 0.75 0.761467 0.767058 0.5841 0.75 0.761592 0.767234 0.5842 0.75 0.761717 0.767407 0.5843 0.75 0.761841 0.767579 0.5844 0.75 0.761965 0.76775 0.5845 0.75 0.762089 0.767919 0.5846 0.75 0.762213 0.768087 0.5847 0.75 0.762336 0.768253 0.5848 0.75 0.762459 0.768417 0.5849 0.75 0.762582 0.76858 0.585 0.75 0.762704 0.768741 0.5851 0.75 0.762826 0.768901 0.5852 0.75 0.762948 0.769059 0.5853 0.75 0.763069 0.769216 0.5854 0.75 0.763191 0.76937 0.5855 0.75 0.763312 0.769524 0.5856 0.75 0.763432 0.769675 0.5857 0.75 0.763553 0.769825 0.5858 0.75 0.763673 0.769974 0.5859 0.75 0.763793 0.770121 0.586 0.75 0.763912 0.770266 0.5861 0.75 0.764032 0.770409 0.5862 0.75 0.764151 0.770551 0.5863 0.75 0.76427 0.770691 0.5864 0.75 0.764388 0.770829 0.5865 0.75 0.764506 0.770966 0.5866 0.75 0.764624 0.771101 0.5867 0.75 0.764742 0.771235 0.5868 0.75 0.764859 0.771366 0.5869 0.75 0.764976 0.771496 0.587 0.75 0.765093 0.771624 0.5871 0.75 0.76521 0.771751 0.5872 0.75 0.765326 0.771876 0.5873 0.75 0.765442 0.771999 0.5874 0.75 0.765557 0.77212 0.5875 0.75 0.765673 0.772239 0.5876 0.75 0.765788 0.772357 0.5877 0.75 0.765903 0.772473 0.5878 0.75 0.766017 0.772588 0.5879 0.75 0.766132 0.7727 0.588 0.75 0.766246 0.772811 0.5881 0.75 0.766359 0.77292 0.5882 0.75 0.766473 0.773027 0.5883 0.75 0.766586 0.773132 0.5884 0.75 0.766699 0.773236 0.5885 0.75 0.766812 0.773338 0.5886 0.75 0.766924 0.773438 0.5887 0.75 0.767036 0.773536 0.5888 0.75 0.767148 0.773633 0.5889 0.75 0.767259 0.773727 0.589 0.75 0.767371 0.77382 0.5891 0.75 0.767482 0.773911 0.5892 0.75 0.767592 0.774 0.5893 0.75 0.767703 0.774088 0.5894 0.75 0.767813 0.774173 0.5895 0.75 0.767923 0.774257 0.5896 0.75 0.768032 0.774339 0.5897 0.75 0.768141 0.774419 0.5898 0.75 0.76825 0.774497 0.5899 0.75 0.768359 0.774574 0.59 0.75 0.768468 0.774648 0.5901 0.75 0.768576 0.774721 0.5902 0.75 0.768684 0.774792 0.5903 0.75 0.768791 0.774861 0.5904 0.75 0.768899 0.774928 0.5905 0.75 0.769006 0.774994 0.5906 0.75 0.769113 0.775057 0.5907 0.75 0.769219 0.775119 0.5908 0.75 0.769325 0.775179 0.5909 0.75 0.769431 0.775237 0.591 0.75 0.769537 0.775293 0.5911 0.75 0.769642 0.775347 0.5912 0.75 0.769747 0.7754 0.5913 0.75 0.769852 0.77545 0.5914 0.75 0.769957 0.775499 0.5915 0.75 0.770061 0.775546 0.5916 0.75 0.770165 0.775591 0.5917 0.75 0.770269 0.775634 0.5918 0.75 0.770372 0.775675 0.5919 0.75 0.770476 0.775715 0.592 0.75 0.770579 0.775752 0.5921 0.75 0.770681 0.775788 0.5922 0.75 0.770784 0.775822 0.5923 0.75 0.770886 0.775854 0.5924 0.75 0.770987 0.775884 0.5925 0.75 0.771089 0.775913 0.5926 0.75 0.77119 0.775939 0.5927 0.75 0.771291 0.775964 0.5928 0.75 0.771392 0.775986 0.5929 0.75 0.771492 0.776007 0.593 0.75 0.771593 0.776027 0.5931 0.75 0.771692 0.776044 0.5932 0.75 0.771792 0.776059 0.5933 0.75 0.771891 0.776073 0.5934 0.75 0.77199 0.776085 0.5935 0.75 0.772089 0.776094 0.5936 0.75 0.772188 0.776103 0.5937 0.75 0.772286 0.776109 0.5938 0.75 0.772384 0.776113 0.5939 0.75 0.772482 0.776116 0.594 0.75 0.772579 0.776117 0.5941 0.75 0.772676 0.776115 0.5942 0.75 0.772773 0.776113 0.5943 0.75 0.77287 0.776108 0.5944 0.75 0.772966 0.776101 0.5945 0.75 0.773062 0.776093 0.5946 0.75 0.773158 0.776083 0.5947 0.75 0.773253 0.776071 0.5948 0.75 0.773348 0.776057 0.5949 0.75 0.773443 0.776042 0.595 0.75 0.773538 0.776025 0.5951 0.75 0.773632 0.776006 0.5952 0.75 0.773727 0.775985 0.5953 0.75 0.77382 0.775962 0.5954 0.75 0.773914 0.775938 0.5955 0.75 0.774007 0.775911 0.5956 0.75 0.7741 0.775884 0.5957 0.75 0.774193 0.775854 0.5958 0.75 0.774286 0.775822 0.5959 0.75 0.774378 0.775789 0.596 0.75 0.77447 0.775754 0.5961 0.75 0.774561 0.775718 0.5962 0.75 0.774653 0.775679 0.5963 0.75 0.774744 0.775639 0.5964 0.75 0.774835 0.775597 0.5965 0.75 0.774925 0.775554 0.5966 0.75 0.775016 0.775508 0.5967 0.75 0.775106 0.775461 0.5968 0.75 0.775195 0.775412 0.5969 0.75 0.775285 0.775362 0.597 0.75 0.775374 0.77531 0.5971 0.75 0.775463 0.775256 0.5972 0.75 0.775552 0.775201 0.5973 0.75 0.77564 0.775144 0.5974 0.75 0.775728 0.775085 0.5975 0.75 0.775816 0.775024 0.5976 0.75 0.775904 0.774962 0.5977 0.75 0.775991 0.774898 0.5978 0.75 0.776078 0.774833 0.5979 0.75 0.776165 0.774766 0.598 0.75 0.776251 0.774697 0.5981 0.75 0.776337 0.774627 0.5982 0.75 0.776423 0.774555 0.5983 0.75 0.776509 0.774482 0.5984 0.75 0.776594 0.774407 0.5985 0.75 0.77668 0.77433 0.5986 0.75 0.776764 0.774252 0.5987 0.75 0.776849 0.774172 0.5988 0.75 0.776933 0.774091 0.5989 0.75 0.777017 0.774008 0.599 0.75 0.777101 0.773923 0.5991 0.75 0.777185 0.773837 0.5992 0.75 0.777268 0.77375 0.5993 0.75 0.777351 0.773661 0.5994 0.75 0.777434 0.77357 0.5995 0.75 0.777516 0.773478 0.5996 0.75 0.777598 0.773385 0.5997 0.75 0.77768 0.773289 0.5998 0.75 0.777762 0.773193 0.5999 0.75 0.777843 0.773095 0.6 0.75 0.777924 0.772995 0.6001 0.75 0.778005 0.772894 0.6002 0.75 0.778086 0.772792 0.6003 0.75 0.778166 0.772688 0.6004 0.75 0.778246 0.772583 0.6005 0.75 0.778326 0.772476 0.6006 0.75 0.778405 0.772368 0.6007 0.75 0.778484 0.772259 0.6008 0.75 0.778563 0.772148 0.6009 0.75 0.778642 0.772036 0.601 0.75 0.77872 0.771922 0.6011 0.75 0.778799 0.771807 0.6012 0.75 0.778876 0.771691 0.6013 0.75 0.778954 0.771573 0.6014 0.75 0.779031 0.771454 0.6015 0.75 0.779108 0.771334 0.6016 0.75 0.779185 0.771212 0.6017 0.75 0.779262 0.771089 0.6018 0.75 0.779338 0.770965 0.6019 0.75 0.779414 0.77084 0.602 0.75 0.77949 0.770713 0.6021 0.75 0.779565 0.770585 0.6022 0.75 0.779641 0.770456 0.6023 0.75 0.779716 0.770325 0.6024 0.75 0.77979 0.770194 0.6025 0.75 0.779865 0.770061 0.6026 0.75 0.779939 0.769927 0.6027 0.75 0.780013 0.769791 0.6028 0.75 0.780086 0.769655 0.6029 0.75 0.78016 0.769517 0.603 0.75 0.780233 0.769378 0.6031 0.75 0.780305 0.769238 0.6032 0.75 0.780378 0.769097 0.6033 0.75 0.78045 0.768955 0.6034 0.75 0.780522 0.768812 0.6035 0.75 0.780594 0.768667 0.6036 0.75 0.780666 0.768522 0.6037 0.75 0.780737 0.768375 0.6038 0.75 0.780808 0.768227 0.6039 0.75 0.780879 0.768079 0.604 0.75 0.780949 0.767929 0.6041 0.75 0.781019 0.767778 0.6042 0.75 0.781089 0.767626 0.6043 0.75 0.781159 0.767473 0.6044 0.75 0.781228 0.767319 0.6045 0.75 0.781297 0.767165 0.6046 0.75 0.781366 0.767009 0.6047 0.75 0.781435 0.766852 0.6048 0.75 0.781503 0.766694 0.6049 0.75 0.781571 0.766536 0.605 0.75 0.781639 0.766376 0.6051 0.75 0.781706 0.766216 0.6052 0.75 0.781774 0.766054 0.6053 0.75 0.781841 0.765892 0.6054 0.75 0.781907 0.765729 0.6055 0.75 0.781974 0.765565 0.6056 0.75 0.78204 0.7654 0.6057 0.75 0.782106 0.765234 0.6058 0.75 0.782172 0.765068 0.6059 0.75 0.782237 0.7649 0.606 0.75 0.782303 0.764732 0.6061 0.75 0.782367 0.764563 0.6062 0.75 0.782432 0.764394 0.6063 0.75 0.782497 0.764223 0.6064 0.75 0.782561 0.764052 0.6065 0.75 0.782625 0.76388 0.6066 0.75 0.782688 0.763708 0.6067 0.75 0.782752 0.763534 0.6068 0.75 0.782815 0.76336 0.6069 0.75 0.782878 0.763185 0.607 0.75 0.78294 0.76301 0.6071 0.75 0.783002 0.762834 0.6072 0.75 0.783064 0.762657 0.6073 0.75 0.783126 0.76248 0.6074 0.75 0.783188 0.762302 0.6075 0.75 0.783249 0.762123 0.6076 0.75 0.78331 0.761944 0.6077 0.75 0.783371 0.761765 0.6078 0.75 0.783431 0.761584 0.6079 0.75 0.783492 0.761403 0.608 0.75 0.783552 0.761222 0.6081 0.75 0.783611 0.76104 0.6082 0.75 0.783671 0.760858 0.6083 0.75 0.78373 0.760675 0.6084 0.75 0.783789 0.760491 0.6085 0.75 0.783848 0.760308 0.6086 0.75 0.783906 0.760123 0.6087 0.75 0.783964 0.759938 0.6088 0.75 0.784022 0.759753 0.6089 0.75 0.78408 0.759568 0.609 0.75 0.784138 0.759382 0.6091 0.75 0.784195 0.759195 0.6092 0.75 0.784252 0.759008 0.6093 0.75 0.784308 0.758821 0.6094 0.75 0.784365 0.758634 0.6095 0.75 0.784421 0.758446 0.6096 0.75 0.784477 0.758258 0.6097 0.75 0.784532 0.758069 0.6098 0.75 0.784588 0.75788 0.6099 0.75 0.784643 0.757691 0.61 0.75 0.784698 0.757502 0.6101 0.75 0.784752 0.757312 0.6102 0.75 0.784807 0.757123 0.6103 0.75 0.784861 0.756932 0.6104 0.75 0.784915 0.756742 0.6105 0.75 0.784968 0.756552 0.6106 0.75 0.785022 0.756361 0.6107 0.75 0.785075 0.75617 0.6108 0.75 0.785128 0.755979 0.6109 0.75 0.78518 0.755788 0.611 0.75 0.785232 0.755597 0.6111 0.75 0.785284 0.755405 0.6112 0.75 0.785336 0.755214 0.6113 0.75 0.785388 0.755022 0.6114 0.75 0.785439 0.754831 0.6115 0.75 0.78549 0.754639 0.6116 0.75 0.785541 0.754447 0.6117 0.75 0.785592 0.754255 0.6118 0.75 0.785642 0.754063 0.6119 0.75 0.785692 0.753871 0.612 0.75 0.785742 0.753679 0.6121 0.75 0.785791 0.753487 0.6122 0.75 0.785841 0.753296 0.6123 0.75 0.78589 0.753104 0.6124 0.75 0.785939 0.752912 0.6125 0.75 0.785987 0.75272 0.6126 0.75 0.786035 0.752529 0.6127 0.75 0.786083 0.752337 0.6128 0.75 0.786131 0.752146 0.6129 0.75 0.786179 0.751954 0.613 0.75 0.786226 0.751763 0.6131 0.75 0.786273 0.751572 0.6132 0.75 0.78632 0.751381 0.6133 0.75 0.786366 0.751191 0.6134 0.75 0.786413 0.751 0.6135 0.75 0.786459 0.75081 0.6136 0.75 0.786505 0.75062 0.6137 0.75 0.78655 0.75043 0.6138 0.75 0.786595 0.75024 0.6139 0.75 0.786641 0.750051 0.614 0.75 0.786685 0.749861 0.6141 0.75 0.78673 0.749673 0.6142 0.75 0.786774 0.749484 0.6143 0.75 0.786818 0.749296 0.6144 0.75 0.786862 0.749108 0.6145 0.75 0.786906 0.74892 0.6146 0.75 0.786949 0.748733 0.6147 0.75 0.786992 0.748546 0.6148 0.75 0.787035 0.748359 0.6149 0.75 0.787077 0.748173 0.615 0.75 0.78712 0.747987 0.6151 0.75 0.787162 0.747802 0.6152 0.75 0.787204 0.747617 0.6153 0.75 0.787245 0.747432 0.6154 0.75 0.787287 0.747248 0.6155 0.75 0.787328 0.747064 0.6156 0.75 0.787369 0.746881 0.6157 0.75 0.787409 0.746698 0.6158 0.75 0.78745 0.746516 0.6159 0.75 0.78749 0.746334 0.616 0.75 0.78753 0.746153 0.6161 0.75 0.787569 0.745972 0.6162 0.75 0.787609 0.745792 0.6163 0.75 0.787648 0.745612 0.6164 0.75 0.787687 0.745433 0.6165 0.75 0.787726 0.745255 0.6166 0.75 0.787764 0.745077 0.6167 0.75 0.787802 0.744899 0.6168 0.75 0.78784 0.744723 0.6169 0.75 0.787878 0.744546 0.617 0.75 0.787915 0.744371 0.6171 0.75 0.787952 0.744196 0.6172 0.75 0.787989 0.744022 0.6173 0.75 0.788026 0.743848 0.6174 0.75 0.788063 0.743675 0.6175 0.75 0.788099 0.743503 0.6176 0.75 0.788135 0.743332 0.6177 0.75 0.788171 0.743161 0.6178 0.75 0.788206 0.742991 0.6179 0.75 0.788241 0.742821 0.618 0.75 0.788277 0.742653 0.6181 0.75 0.788311 0.742485 0.6182 0.75 0.788346 0.742318 0.6183 0.75 0.78838 0.742152 0.6184 0.75 0.788414 0.741986 0.6185 0.75 0.788448 0.741821 0.6186 0.75 0.788482 0.741657 0.6187 0.75 0.788515 0.741494 0.6188 0.75 0.788548 0.741332 0.6189 0.75 0.788581 0.741171 0.619 0.75 0.788614 0.74101 0.6191 0.75 0.788646 0.74085 0.6192 0.75 0.788678 0.740691 0.6193 0.75 0.78871 0.740533 0.6194 0.75 0.788742 0.740376 0.6195 0.75 0.788773 0.74022 0.6196 0.75 0.788805 0.740065 0.6197 0.75 0.788836 0.73991 0.6198 0.75 0.788866 0.739757 0.6199 0.75 0.788897 0.739604 0.62 0.75 0.788927 0.739453 0.6201 0.75 0.788957 0.739302 0.6202 0.75 0.788987 0.739152 0.6203 0.75 0.789017 0.739004 0.6204 0.75 0.789046 0.738856 0.6205 0.75 0.789075 0.738709 0.6206 0.75 0.789104 0.738563 0.6207 0.75 0.789133 0.738419 0.6208 0.75 0.789161 0.738275 0.6209 0.75 0.789189 0.738132 0.621 0.75 0.789217 0.737991 0.6211 0.75 0.789245 0.73785 0.6212 0.75 0.789272 0.73771 0.6213 0.75 0.7893 0.737572 0.6214 0.75 0.789327 0.737435 0.6215 0.75 0.789353 0.737298 0.6216 0.75 0.78938 0.737163 0.6217 0.75 0.789406 0.737029 0.6218 0.75 0.789432 0.736896 0.6219 0.75 0.789458 0.736764 0.622 0.75 0.789484 0.736633 0.6221 0.75 0.789509 0.736503 0.6222 0.75 0.789534 0.736375 0.6223 0.75 0.789559 0.736247 0.6224 0.75 0.789584 0.736121 0.6225 0.75 0.789608 0.735996 0.6226 0.75 0.789632 0.735872 0.6227 0.75 0.789656 0.735749 0.6228 0.75 0.78968 0.735628 0.6229 0.75 0.789704 0.735507 0.623 0.75 0.789727 0.735388 0.6231 0.75 0.78975 0.73527 0.6232 0.75 0.789773 0.735153 0.6233 0.75 0.789795 0.735038 0.6234 0.75 0.789818 0.734924 0.6235 0.75 0.78984 0.73481 0.6236 0.75 0.789862 0.734698 0.6237 0.75 0.789884 0.734588 0.6238 0.75 0.789905 0.734478 0.6239 0.75 0.789926 0.73437 0.624 0.75 0.789947 0.734263 0.6241 0.75 0.789968 0.734158 0.6242 0.75 0.789989 0.734053 0.6243 0.75 0.790009 0.73395 0.6244 0.75 0.790029 0.733849 0.6245 0.75 0.790049 0.733748 0.6246 0.75 0.790069 0.733649 0.6247 0.75 0.790088 0.733551 0.6248 0.75 0.790107 0.733454 0.6249 0.75 0.790126 0.733359 0.625 0.75 0.790145 0.733265 0.6251 0.75 0.790163 0.733172 0.6252 0.75 0.790182 0.733081 0.6253 0.75 0.7902 0.732991 0.6254 0.75 0.790218 0.732902 0.6255 0.75 0.790235 0.732815 0.6256 0.75 0.790253 0.732729 0.6257 0.75 0.79027 0.732644 0.6258 0.75 0.790287 0.732561 0.6259 0.75 0.790304 0.732479 0.626 0.75 0.79032 0.732398 0.6261 0.75 0.790336 0.732319 0.6262 0.75 0.790352 0.732241 0.6263 0.75 0.790368 0.732165 0.6264 0.75 0.790384 0.73209 0.6265 0.75 0.790399 0.732016 0.6266 0.75 0.790414 0.731944 0.6267 0.75 0.790429 0.731873 0.6268 0.75 0.790444 0.731803 0.6269 0.75 0.790459 0.731735 0.627 0.75 0.790473 0.731669 0.6271 0.75 0.790487 0.731603 0.6272 0.75 0.790501 0.731539 0.6273 0.75 0.790515 0.731477 0.6274 0.75 0.790528 0.731416 0.6275 0.75 0.790541 0.731356 0.6276 0.75 0.790554 0.731298 0.6277 0.75 0.790567 0.731241 0.6278 0.75 0.790579 0.731185 0.6279 0.75 0.790592 0.731131 0.628 0.75 0.790604 0.731079 0.6281 0.75 0.790616 0.731027 0.6282 0.75 0.790627 0.730978 0.6283 0.75 0.790639 0.730929 0.6284 0.75 0.79065 0.730882 0.6285 0.75 0.790661 0.730837 0.6286 0.75 0.790672 0.730793 0.6287 0.75 0.790682 0.73075 0.6288 0.75 0.790693 0.730709 0.6289 0.75 0.790703 0.730669 0.629 0.75 0.790713 0.730631 0.6291 0.75 0.790723 0.730594 0.6292 0.75 0.790732 0.730559 0.6293 0.75 0.790741 0.730525 0.6294 0.75 0.79075 0.730493 0.6295 0.75 0.790759 0.730461 0.6296 0.75 0.790768 0.730432 0.6297 0.75 0.790776 0.730404 0.6298 0.75 0.790785 0.730377 0.6299 0.75 0.790793 0.730352 0.63 0.75 0.7908 0.730328 0.6301 0.75 0.790808 0.730306 0.6302 0.75 0.790815 0.730285 0.6303 0.75 0.790823 0.730265 0.6304 0.75 0.790829 0.730247 0.6305 0.75 0.790836 0.730231 0.6306 0.75 0.790843 0.730215 0.6307 0.75 0.790849 0.730202 0.6308 0.75 0.790855 0.730189 0.6309 0.75 0.790861 0.730179 0.631 0.75 0.790867 0.730169 0.6311 0.75 0.790872 0.730161 0.6312 0.75 0.790877 0.730155 0.6313 0.75 0.790882 0.73015 0.6314 0.75 0.790887 0.730146 0.6315 0.75 0.790892 0.730144 0.6316 0.75 0.790896 0.730143 0.6317 0.75 0.790901 0.730144 0.6318 0.75 0.790905 0.730146 0.6319 0.75 0.790908 0.73015 0.632 0.75 0.790912 0.730155 0.6321 0.75 0.790915 0.730161 0.6322 0.75 0.790918 0.730169 0.6323 0.75 0.790921 0.730178 0.6324 0.75 0.790924 0.730189 0.6325 0.75 0.790927 0.730201 0.6326 0.75 0.790929 0.730215 0.6327 0.75 0.790931 0.73023 0.6328 0.75 0.790933 0.730246 0.6329 0.75 0.790935 0.730264 0.633 0.75 0.790936 0.730283 0.6331 0.75 0.790938 0.730303 0.6332 0.75 0.790939 0.730325 0.6333 0.75 0.79094 0.730349 0.6334 0.75 0.79094 0.730373 0.6335 0.75 0.790941 0.7304 0.6336 0.75 0.790941 0.730427 0.6337 0.75 0.790941 0.730456 0.6338 0.75 0.790941 0.730486 0.6339 0.75 0.790941 0.730518 0.634 0.75 0.79094 0.730551 0.6341 0.75 0.79094 0.730585 0.6342 0.75 0.790939 0.730621 0.6343 0.75 0.790937 0.730658 0.6344 0.75 0.790936 0.730697 0.6345 0.75 0.790935 0.730737 0.6346 0.75 0.790933 0.730778 0.6347 0.75 0.790931 0.73082 0.6348 0.75 0.790929 0.730864 0.6349 0.75 0.790926 0.730909 0.635 0.75 0.790924 0.730956 0.6351 0.75 0.790921 0.731004 0.6352 0.75 0.790918 0.731053 0.6353 0.75 0.790915 0.731103 0.6354 0.75 0.790912 0.731155 0.6355 0.75 0.790908 0.731208 0.6356 0.75 0.790904 0.731263 0.6357 0.75 0.790901 0.731318 0.6358 0.75 0.790896 0.731375 0.6359 0.75 0.790892 0.731433 0.636 0.75 0.790888 0.731493 0.6361 0.75 0.790883 0.731554 0.6362 0.75 0.790878 0.731616 0.6363 0.75 0.790873 0.731679 0.6364 0.75 0.790867 0.731744 0.6365 0.75 0.790862 0.73181 0.6366 0.75 0.790856 0.731877 0.6367 0.75 0.79085 0.731945 0.6368 0.75 0.790844 0.732014 0.6369 0.75 0.790838 0.732085 0.637 0.75 0.790832 0.732157 0.6371 0.75 0.790825 0.73223 0.6372 0.75 0.790818 0.732305 0.6373 0.75 0.790811 0.73238 0.6374 0.75 0.790804 0.732457 0.6375 0.75 0.790796 0.732535 0.6376 0.75 0.790789 0.732614 0.6377 0.75 0.790781 0.732695 0.6378 0.75 0.790773 0.732776 0.6379 0.75 0.790764 0.732859 0.638 0.75 0.790756 0.732942 0.6381 0.75 0.790747 0.733027 0.6382 0.75 0.790739 0.733113 0.6383 0.75 0.79073 0.733201 0.6384 0.75 0.79072 0.733289 0.6385 0.75 0.790711 0.733378 0.6386 0.75 0.790701 0.733469 0.6387 0.75 0.790692 0.73356 0.6388 0.75 0.790682 0.733653 0.6389 0.75 0.790672 0.733747 0.639 0.75 0.790661 0.733842 0.6391 0.75 0.790651 0.733938 0.6392 0.75 0.79064 0.734035 0.6393 0.75 0.790629 0.734133 0.6394 0.75 0.790618 0.734232 0.6395 0.75 0.790607 0.734332 0.6396 0.75 0.790595 0.734433 0.6397 0.75 0.790584 0.734535 0.6398 0.75 0.790572 0.734638 0.6399 0.75 0.79056 0.734742 0.64 0.75 0.790548 0.734848 0.6401 0.75 0.790535 0.734954 0.6402 0.75 0.790523 0.735061 0.6403 0.75 0.79051 0.735169 0.6404 0.75 0.790497 0.735278 0.6405 0.75 0.790484 0.735388 0.6406 0.75 0.790471 0.735499 0.6407 0.75 0.790457 0.735611 0.6408 0.75 0.790443 0.735723 0.6409 0.75 0.79043 0.735837 0.641 0.75 0.790416 0.735951 0.6411 0.75 0.790401 0.736067 0.6412 0.75 0.790387 0.736183 0.6413 0.75 0.790372 0.736301 0.6414 0.75 0.790358 0.736419 0.6415 0.75 0.790343 0.736538 0.6416 0.75 0.790327 0.736657 0.6417 0.75 0.790312 0.736778 0.6418 0.75 0.790297 0.736899 0.6419 0.75 0.790281 0.737022 0.642 0.75 0.790265 0.737145 0.6421 0.75 0.790249 0.737269 0.6422 0.75 0.790233 0.737393 0.6423 0.75 0.790216 0.737519 0.6424 0.75 0.7902 0.737645 0.6425 0.75 0.790183 0.737772 0.6426 0.75 0.790166 0.7379 0.6427 0.75 0.790149 0.738028 0.6428 0.75 0.790132 0.738157 0.6429 0.75 0.790114 0.738287 0.643 0.75 0.790096 0.738418 0.6431 0.75 0.790079 0.738549 0.6432 0.75 0.790061 0.738681 0.6433 0.75 0.790042 0.738814 0.6434 0.75 0.790024 0.738947 0.6435 0.75 0.790006 0.739081 0.6436 0.75 0.789987 0.739216 0.6437 0.75 0.789968 0.739351 0.6438 0.75 0.789949 0.739487 0.6439 0.75 0.78993 0.739623 0.644 0.75 0.78991 0.739761 0.6441 0.75 0.789891 0.739898 0.6442 0.75 0.789871 0.740037 0.6443 0.75 0.789851 0.740175 0.6444 0.75 0.789831 0.740315 0.6445 0.75 0.78981 0.740455 0.6446 0.75 0.78979 0.740595 0.6447 0.75 0.789769 0.740737 0.6448 0.75 0.789749 0.740878 0.6449 0.75 0.789728 0.74102 0.645 0.75 0.789706 0.741163 0.6451 0.75 0.789685 0.741306 0.6452 0.75 0.789664 0.741449 0.6453 0.75 0.789642 0.741594 0.6454 0.75 0.78962 0.741738 0.6455 0.75 0.789598 0.741883 0.6456 0.75 0.789576 0.742028 0.6457 0.75 0.789554 0.742174 0.6458 0.75 0.789531 0.74232 0.6459 0.75 0.789508 0.742467 0.646 0.75 0.789485 0.742614 0.6461 0.75 0.789462 0.742761 0.6462 0.75 0.789439 0.742909 0.6463 0.75 0.789416 0.743057 0.6464 0.75 0.789392 0.743205 0.6465 0.75 0.789369 0.743354 0.6466 0.75 0.789345 0.743503 0.6467 0.75 0.789321 0.743653 0.6468 0.75 0.789297 0.743802 0.6469 0.75 0.789272 0.743952 0.647 0.75 0.789248 0.744103 0.6471 0.75 0.789223 0.744253 0.6472 0.75 0.789198 0.744404 0.6473 0.75 0.789173 0.744555 0.6474 0.75 0.789148 0.744706 0.6475 0.75 0.789123 0.744858 0.6476 0.75 0.789097 0.74501 0.6477 0.75 0.789071 0.745161 0.6478 0.75 0.789046 0.745314 0.6479 0.75 0.78902 0.745466 0.648 0.75 0.788993 0.745618 0.6481 0.75 0.788967 0.745771 0.6482 0.75 0.788941 0.745924 0.6483 0.75 0.788914 0.746076 0.6484 0.75 0.788887 0.746229 0.6485 0.75 0.78886 0.746383 0.6486 0.75 0.788833 0.746536 0.6487 0.75 0.788806 0.746689 0.6488 0.75 0.788778 0.746842 0.6489 0.75 0.788751 0.746996 0.649 0.75 0.788723 0.747149 0.6491 0.75 0.788695 0.747303 0.6492 0.75 0.788667 0.747456 0.6493 0.75 0.788638 0.74761 0.6494 0.75 0.78861 0.747763 0.6495 0.75 0.788581 0.747917 0.6496 0.75 0.788553 0.748071 0.6497 0.75 0.788524 0.748224 0.6498 0.75 0.788495 0.748378 0.6499 0.75 0.788466 0.748531 0.65 0.75 0.788436 0.748684 0.6501 0.75 0.788407 0.748838 0.6502 0.75 0.788377 0.748991 0.6503 0.75 0.788347 0.749144 0.6504 0.75 0.788317 0.749297 0.6505 0.75 0.788287 0.74945 0.6506 0.75 0.788257 0.749603 0.6507 0.75 0.788226 0.749756 0.6508 0.75 0.788196 0.749908 0.6509 0.75 0.788165 0.75006 0.651 0.75 0.788134 0.750213 0.6511 0.75 0.788103 0.750365 0.6512 0.75 0.788072 0.750516 0.6513 0.75 0.78804 0.750668 0.6514 0.75 0.788009 0.75082 0.6515 0.75 0.787977 0.750971 0.6516 0.75 0.787945 0.751122 0.6517 0.75 0.787913 0.751272 0.6518 0.75 0.787881 0.751423 0.6519 0.75 0.787849 0.751573 0.652 0.75 0.787816 0.751723 0.6521 0.75 0.787784 0.751873 0.6522 0.75 0.787751 0.752022 0.6523 0.75 0.787718 0.752171 0.6524 0.75 0.787685 0.75232 0.6525 0.75 0.787652 0.752468 0.6526 0.75 0.787619 0.752616 0.6527 0.75 0.787585 0.752764 0.6528 0.75 0.787552 0.752911 0.6529 0.75 0.787518 0.753058 0.653 0.75 0.787484 0.753204 0.6531 0.75 0.78745 0.75335 0.6532 0.75 0.787416 0.753496 0.6533 0.75 0.787381 0.753642 0.6534 0.75 0.787347 0.753786 0.6535 0.75 0.787312 0.753931 0.6536 0.75 0.787277 0.754075 0.6537 0.75 0.787242 0.754218 0.6538 0.75 0.787207 0.754362 0.6539 0.75 0.787172 0.754504 0.654 0.75 0.787137 0.754646 0.6541 0.75 0.787101 0.754788 0.6542 0.75 0.787066 0.754929 0.6543 0.75 0.78703 0.75507 0.6544 0.75 0.786994 0.75521 0.6545 0.75 0.786958 0.755349 0.6546 0.75 0.786921 0.755488 0.6547 0.75 0.786885 0.755627 0.6548 0.75 0.786849 0.755765 0.6549 0.75 0.786812 0.755902 0.655 0.75 0.786775 0.756039 0.6551 0.75 0.786738 0.756175 0.6552 0.75 0.786701 0.756311 0.6553 0.75 0.786664 0.756445 0.6554 0.75 0.786626 0.75658 0.6555 0.75 0.786589 0.756713 0.6556 0.75 0.786551 0.756847 0.6557 0.75 0.786514 0.756979 0.6558 0.75 0.786476 0.757111 0.6559 0.75 0.786438 0.757242 0.656 0.75 0.786399 0.757372 0.6561 0.75 0.786361 0.757502 0.6562 0.75 0.786323 0.757631 0.6563 0.75 0.786284 0.757759 0.6564 0.75 0.786245 0.757887 0.6565 0.75 0.786206 0.758014 0.6566 0.75 0.786167 0.75814 0.6567 0.75 0.786128 0.758265 0.6568 0.75 0.786089 0.75839 0.6569 0.75 0.786049 0.758514 0.657 0.75 0.78601 0.758637 0.6571 0.75 0.78597 0.758759 0.6572 0.75 0.78593 0.758881 0.6573 0.75 0.78589 0.759002 0.6574 0.75 0.78585 0.759122 0.6575 0.75 0.78581 0.759241 0.6576 0.75 0.78577 0.759359 0.6577 0.75 0.785729 0.759477 0.6578 0.75 0.785689 0.759594 0.6579 0.75 0.785648 0.75971 0.658 0.75 0.785607 0.759825 0.6581 0.75 0.785566 0.759939 0.6582 0.75 0.785525 0.760052 0.6583 0.75 0.785484 0.760165 0.6584 0.75 0.785442 0.760276 0.6585 0.75 0.785401 0.760387 0.6586 0.75 0.785359 0.760497 0.6587 0.75 0.785317 0.760606 0.6588 0.75 0.785275 0.760714 0.6589 0.75 0.785233 0.760821 0.659 0.75 0.785191 0.760927 0.6591 0.75 0.785149 0.761032 0.6592 0.75 0.785106 0.761137 0.6593 0.75 0.785064 0.76124 0.6594 0.75 0.785021 0.761343 0.6595 0.75 0.784978 0.761444 0.6596 0.75 0.784935 0.761545 0.6597 0.75 0.784892 0.761644 0.6598 0.75 0.784849 0.761743 0.6599 0.75 0.784806 0.76184 0.66 0.75 0.784762 0.761937 0.6601 0.75 0.784719 0.762033 0.6602 0.75 0.784675 0.762127 0.6603 0.75 0.784631 0.762221 0.6604 0.75 0.784587 0.762314 0.6605 0.75 0.784543 0.762405 0.6606 0.75 0.784499 0.762496 0.6607 0.75 0.784455 0.762586 0.6608 0.75 0.78441 0.762674 0.6609 0.75 0.784366 0.762762 0.661 0.75 0.784321 0.762848 0.6611 0.75 0.784276 0.762933 0.6612 0.75 0.784231 0.763018 0.6613 0.75 0.784186 0.763101 0.6614 0.75 0.784141 0.763183 0.6615 0.75 0.784096 0.763264 0.6616 0.75 0.78405 0.763344 0.6617 0.75 0.784005 0.763423 0.6618 0.75 0.783959 0.763501 0.6619 0.75 0.783913 0.763578 0.662 0.75 0.783868 0.763654 0.6621 0.75 0.783822 0.763728 0.6622 0.75 0.783775 0.763802 0.6623 0.75 0.783729 0.763874 0.6624 0.75 0.783683 0.763946 0.6625 0.75 0.783636 0.764016 0.6626 0.75 0.78359 0.764085 0.6627 0.75 0.783543 0.764153 0.6628 0.75 0.783496 0.76422 0.6629 0.75 0.783449 0.764285 0.663 0.75 0.783402 0.76435 0.6631 0.75 0.783355 0.764413 0.6632 0.75 0.783308 0.764475 0.6633 0.75 0.783261 0.764536 0.6634 0.75 0.783213 0.764596 0.6635 0.75 0.783165 0.764655 0.6636 0.75 0.783118 0.764713 0.6637 0.75 0.78307 0.764769 0.6638 0.75 0.783022 0.764824 0.6639 0.75 0.782974 0.764878 0.664 0.75 0.782926 0.764931 0.6641 0.75 0.782877 0.764983 0.6642 0.75 0.782829 0.765034 0.6643 0.75 0.78278 0.765083 0.6644 0.75 0.782732 0.765131 0.6645 0.75 0.782683 0.765178 0.6646 0.75 0.782634 0.765224 0.6647 0.75 0.782585 0.765269 0.6648 0.75 0.782536 0.765312 0.6649 0.75 0.782487 0.765354 0.665 0.75 0.782438 0.765395 0.6651 0.75 0.782388 0.765435 0.6652 0.75 0.782339 0.765474 0.6653 0.75 0.782289 0.765511 0.6654 0.75 0.78224 0.765547 0.6655 0.75 0.78219 0.765582 0.6656 0.75 0.78214 0.765616 0.6657 0.75 0.78209 0.765649 0.6658 0.75 0.78204 0.76568 0.6659 0.75 0.78199 0.76571 0.666 0.75 0.781939 0.765739 0.6661 0.75 0.781889 0.765767 0.6662 0.75 0.781838 0.765793 0.6663 0.75 0.781788 0.765819 0.6664 0.75 0.781737 0.765843 0.6665 0.75 0.781686 0.765866 0.6666 0.75 0.781635 0.765887 0.6667 0.75 0.781584 0.765908 0.6668 0.75 0.781533 0.765927 0.6669 0.75 0.781481 0.765945 0.667 0.75 0.78143 0.765962 0.6671 0.75 0.781379 0.765977 0.6672 0.75 0.781327 0.765991 0.6673 0.75 0.781275 0.766004 0.6674 0.75 0.781224 0.766016 0.6675 0.75 0.781172 0.766027 0.6676 0.75 0.78112 0.766036 0.6677 0.75 0.781068 0.766044 0.6678 0.75 0.781015 0.766051 0.6679 0.75 0.780963 0.766057 0.668 0.75 0.780911 0.766062 0.6681 0.75 0.780858 0.766065 0.6682 0.75 0.780806 0.766067 0.6683 0.75 0.780753 0.766068 0.6684 0.75 0.7807 0.766068 0.6685 0.75 0.780647 0.766066 0.6686 0.75 0.780595 0.766063 0.6687 0.75 0.780541 0.766059 0.6688 0.75 0.780488 0.766054 0.6689 0.75 0.780435 0.766047 0.669 0.75 0.780382 0.76604 0.6691 0.75 0.780328 0.766031 0.6692 0.75 0.780275 0.766021 0.6693 0.75 0.780221 0.76601 0.6694 0.75 0.780167 0.765997 0.6695 0.75 0.780114 0.765983 0.6696 0.75 0.78006 0.765969 0.6697 0.75 0.780006 0.765952 0.6698 0.75 0.779952 0.765935 0.6699 0.75 0.779897 0.765917 0.67 0.75 0.779843 0.765897 0.6701 0.75 0.779789 0.765876 0.6702 0.75 0.779734 0.765854 0.6703 0.75 0.77968 0.765831 0.6704 0.75 0.779625 0.765807 0.6705 0.75 0.77957 0.765781 0.6706 0.75 0.779516 0.765754 0.6707 0.75 0.779461 0.765726 0.6708 0.75 0.779406 0.765697 0.6709 0.75 0.779351 0.765667 0.671 0.75 0.779295 0.765636 0.6711 0.75 0.77924 0.765603 0.6712 0.75 0.779185 0.765569 0.6713 0.75 0.779129 0.765534 0.6714 0.75 0.779074 0.765498 0.6715 0.75 0.779018 0.765461 0.6716 0.75 0.778963 0.765423 0.6717 0.75 0.778907 0.765383 0.6718 0.75 0.778851 0.765343 0.6719 0.75 0.778795 0.765301 0.672 0.75 0.778739 0.765258 0.6721 0.75 0.778683 0.765214 0.6722 0.75 0.778627 0.765169 0.6723 0.75 0.77857 0.765123 0.6724 0.75 0.778514 0.765076 0.6725 0.75 0.778457 0.765027 0.6726 0.75 0.778401 0.764978 0.6727 0.75 0.778344 0.764927 0.6728 0.75 0.778288 0.764875 0.6729 0.75 0.778231 0.764823 0.673 0.75 0.778174 0.764769 0.6731 0.75 0.778117 0.764714 0.6732 0.75 0.77806 0.764658 0.6733 0.75 0.778003 0.764601 0.6734 0.75 0.777946 0.764542 0.6735 0.75 0.777888 0.764483 0.6736 0.75 0.777831 0.764423 0.6737 0.75 0.777774 0.764362 0.6738 0.75 0.777716 0.764299 0.6739 0.75 0.777658 0.764236 0.674 0.75 0.777601 0.764172 0.6741 0.75 0.777543 0.764106 0.6742 0.75 0.777485 0.76404 0.6743 0.75 0.777427 0.763972 0.6744 0.75 0.777369 0.763904 0.6745 0.75 0.777311 0.763834 0.6746 0.75 0.777253 0.763764 0.6747 0.75 0.777195 0.763692 0.6748 0.75 0.777137 0.76362 0.6749 0.75 0.777078 0.763547 0.675 0.75 0.77702 0.763472 0.6751 0.75 0.776961 0.763397 0.6752 0.75 0.776903 0.763321 0.6753 0.75 0.776844 0.763243 0.6754 0.75 0.776785 0.763165 0.6755 0.75 0.776727 0.763086 0.6756 0.75 0.776668 0.763006 0.6757 0.75 0.776609 0.762925 0.6758 0.75 0.77655 0.762843 0.6759 0.75 0.776491 0.76276 0.676 0.75 0.776431 0.762677 0.6761 0.75 0.776372 0.762592 0.6762 0.75 0.776313 0.762507 0.6763 0.75 0.776254 0.76242 0.6764 0.75 0.776194 0.762333 0.6765 0.75 0.776135 0.762245 0.6766 0.75 0.776075 0.762156 0.6767 0.75 0.776015 0.762066 0.6768 0.75 0.775956 0.761976 0.6769 0.75 0.775896 0.761884 0.677 0.75 0.775836 0.761792 0.6771 0.75 0.775776 0.761699 0.6772 0.75 0.775716 0.761605 0.6773 0.75 0.775656 0.76151 0.6774 0.75 0.775596 0.761415 0.6775 0.75 0.775536 0.761318 0.6776 0.75 0.775475 0.761221 0.6777 0.75 0.775415 0.761123 0.6778 0.75 0.775355 0.761025 0.6779 0.75 0.775294 0.760925 0.678 0.75 0.775234 0.760825 0.6781 0.75 0.775173 0.760724 0.6782 0.75 0.775112 0.760623 0.6783 0.75 0.775052 0.76052 0.6784 0.75 0.774991 0.760417 0.6785 0.75 0.77493 0.760313 0.6786 0.75 0.774869 0.760209 0.6787 0.75 0.774808 0.760104 0.6788 0.75 0.774747 0.759998 0.6789 0.75 0.774686 0.759891 0.679 0.75 0.774625 0.759784 0.6791 0.75 0.774563 0.759676 0.6792 0.75 0.774502 0.759568 0.6793 0.75 0.774441 0.759459 0.6794 0.75 0.774379 0.759349 0.6795 0.75 0.774318 0.759238 0.6796 0.75 0.774256 0.759127 0.6797 0.75 0.774195 0.759016 0.6798 0.75 0.774133 0.758904 0.6799 0.75 0.774071 0.758791 0.68 0.75 0.77401 0.758678 0.6801 0.75 0.773948 0.758564 0.6802 0.75 0.773886 0.758449 0.6803 0.75 0.773824 0.758334 0.6804 0.75 0.773762 0.758218 0.6805 0.75 0.7737 0.758102 0.6806 0.75 0.773638 0.757986 0.6807 0.75 0.773576 0.757869 0.6808 0.75 0.773514 0.757751 0.6809 0.75 0.773451 0.757633 0.681 0.75 0.773389 0.757514 0.6811 0.75 0.773327 0.757395 0.6812 0.75 0.773264 0.757276 0.6813 0.75 0.773202 0.757156 0.6814 0.75 0.773139 0.757035 0.6815 0.75 0.773077 0.756914 0.6816 0.75 0.773014 0.756793 0.6817 0.75 0.772951 0.756671 0.6818 0.75 0.772888 0.756549 0.6819 0.75 0.772826 0.756426 0.682 0.75 0.772763 0.756304 0.6821 0.75 0.7727 0.75618 0.6822 0.75 0.772637 0.756057 0.6823 0.75 0.772574 0.755933 0.6824 0.75 0.772511 0.755808 0.6825 0.75 0.772448 0.755683 0.6826 0.75 0.772385 0.755558 0.6827 0.75 0.772321 0.755433 0.6828 0.75 0.772258 0.755307 0.6829 0.75 0.772195 0.755181 0.683 0.75 0.772131 0.755055 0.6831 0.75 0.772068 0.754929 0.6832 0.75 0.772005 0.754802 0.6833 0.75 0.771941 0.754675 0.6834 0.75 0.771878 0.754547 0.6835 0.75 0.771814 0.75442 0.6836 0.75 0.77175 0.754292 0.6837 0.75 0.771687 0.754164 0.6838 0.75 0.771623 0.754036 0.6839 0.75 0.771559 0.753907 0.684 0.75 0.771495 0.753779 0.6841 0.75 0.771431 0.75365 0.6842 0.75 0.771367 0.753521 0.6843 0.75 0.771304 0.753392 0.6844 0.75 0.77124 0.753262 0.6845 0.75 0.771176 0.753133 0.6846 0.75 0.771111 0.753003 0.6847 0.75 0.771047 0.752874 0.6848 0.75 0.770983 0.752744 0.6849 0.75 0.770919 0.752614 0.685 0.75 0.770855 0.752484 0.6851 0.75 0.77079 0.752354 0.6852 0.75 0.770726 0.752224 0.6853 0.75 0.770662 0.752094 0.6854 0.75 0.770597 0.751964 0.6855 0.75 0.770533 0.751833 0.6856 0.75 0.770468 0.751703 0.6857 0.75 0.770404 0.751573 0.6858 0.75 0.770339 0.751442 0.6859 0.75 0.770275 0.751312 0.686 0.75 0.77021 0.751182 0.6861 0.75 0.770145 0.751051 0.6862 0.75 0.77008 0.750921 0.6863 0.75 0.770016 0.750791 0.6864 0.75 0.769951 0.750661 0.6865 0.75 0.769886 0.750531 0.6866 0.75 0.769821 0.750401 0.6867 0.75 0.769756 0.750271 0.6868 0.75 0.769691 0.750141 0.6869 0.75 0.769626 0.750011 0.687 0.75 0.769561 0.749881 0.6871 0.75 0.769496 0.749752 0.6872 0.75 0.769431 0.749623 0.6873 0.75 0.769366 0.749493 0.6874 0.75 0.769301 0.749364 0.6875 0.75 0.769236 0.749235 0.6876 0.75 0.769171 0.749106 0.6877 0.75 0.769105 0.748978 0.6878 0.75 0.76904 0.748849 0.6879 0.75 0.768975 0.748721 0.688 0.75 0.768909 0.748593 0.6881 0.75 0.768844 0.748466 0.6882 0.75 0.768779 0.748338 0.6883 0.75 0.768713 0.748211 0.6884 0.75 0.768648 0.748084 0.6885 0.75 0.768582 0.747957 0.6886 0.75 0.768517 0.74783 0.6887 0.75 0.768451 0.747704 0.6888 0.75 0.768385 0.747578 0.6889 0.75 0.76832 0.747453 0.689 0.75 0.768254 0.747327 0.6891 0.75 0.768188 0.747202 0.6892 0.75 0.768123 0.747077 0.6893 0.75 0.768057 0.746953 0.6894 0.75 0.767991 0.746829 0.6895 0.75 0.767925 0.746705 0.6896 0.75 0.76786 0.746582 0.6897 0.75 0.767794 0.746459 0.6898 0.75 0.767728 0.746337 0.6899 0.75 0.767662 0.746215 0.69 0.75 0.767596 0.746093 0.6901 0.75 0.76753 0.745971 0.6902 0.75 0.767464 0.745851 0.6903 0.75 0.767398 0.74573 0.6904 0.75 0.767332 0.74561 0.6905 0.75 0.767266 0.74549 0.6906 0.75 0.7672 0.745371 0.6907 0.75 0.767134 0.745253 0.6908 0.75 0.767068 0.745134 0.6909 0.75 0.767002 0.745017 0.691 0.75 0.766936 0.744899 0.6911 0.75 0.76687 0.744783 0.6912 0.75 0.766803 0.744666 0.6913 0.75 0.766737 0.744551 0.6914 0.75 0.766671 0.744436 0.6915 0.75 0.766605 0.744321 0.6916 0.75 0.766538 0.744207 0.6917 0.75 0.766472 0.744093 0.6918 0.75 0.766406 0.74398 0.6919 0.75 0.766339 0.743868 0.692 0.75 0.766273 0.743756 0.6921 0.75 0.766207 0.743645 0.6922 0.75 0.76614 0.743534 0.6923 0.75 0.766074 0.743424 0.6924 0.75 0.766007 0.743315 0.6925 0.75 0.765941 0.743206 0.6926 0.75 0.765875 0.743098 0.6927 0.75 0.765808 0.74299 0.6928 0.75 0.765742 0.742883 0.6929 0.75 0.765675 0.742777 0.693 0.75 0.765608 0.742671 0.6931 0.75 0.765542 0.742566 0.6932 0.75 0.765475 0.742462 0.6933 0.75 0.765409 0.742358 0.6934 0.75 0.765342 0.742255 0.6935 0.75 0.765276 0.742153 0.6936 0.75 0.765209 0.742052 0.6937 0.75 0.765142 0.741951 0.6938 0.75 0.765076 0.741851 0.6939 0.75 0.765009 0.741752 0.694 0.75 0.764942 0.741653 0.6941 0.75 0.764876 0.741555 0.6942 0.75 0.764809 0.741458 0.6943 0.75 0.764742 0.741362 0.6944 0.75 0.764676 0.741266 0.6945 0.75 0.764609 0.741171 0.6946 0.75 0.764542 0.741077 0.6947 0.75 0.764475 0.740984 0.6948 0.75 0.764409 0.740891 0.6949 0.75 0.764342 0.7408 0.695 0.75 0.764275 0.740709 0.6951 0.75 0.764208 0.740619 0.6952 0.75 0.764142 0.74053 0.6953 0.75 0.764075 0.740441 0.6954 0.75 0.764008 0.740354 0.6955 0.75 0.763941 0.740267 0.6956 0.75 0.763874 0.740181 0.6957 0.75 0.763808 0.740096 0.6958 0.75 0.763741 0.740012 0.6959 0.75 0.763674 0.739928 0.696 0.75 0.763607 0.739846 0.6961 0.75 0.76354 0.739764 0.6962 0.75 0.763473 0.739684 0.6963 0.75 0.763406 0.739604 0.6964 0.75 0.76334 0.739525 0.6965 0.75 0.763273 0.739447 0.6966 0.75 0.763206 0.73937 0.6967 0.75 0.763139 0.739294 0.6968 0.75 0.763072 0.739218 0.6969 0.75 0.763005 0.739144 0.697 0.75 0.762938 0.73907 0.6971 0.75 0.762871 0.738998 0.6972 0.75 0.762805 0.738926 0.6973 0.75 0.762738 0.738856 0.6974 0.75 0.762671 0.738786 0.6975 0.75 0.762604 0.738717 0.6976 0.75 0.762537 0.738649 0.6977 0.75 0.76247 0.738582 0.6978 0.75 0.762403 0.738517 0.6979 0.75 0.762336 0.738452 0.698 0.75 0.762269 0.738388 0.6981 0.75 0.762202 0.738325 0.6982 0.75 0.762136 0.738263 0.6983 0.75 0.762069 0.738202 0.6984 0.75 0.762002 0.738142 0.6985 0.75 0.761935 0.738083 0.6986 0.75 0.761868 0.738025 0.6987 0.75 0.761801 0.737968 0.6988 0.75 0.761734 0.737912 0.6989 0.75 0.761667 0.737857 0.699 0.75 0.7616 0.737803 0.6991 0.75 0.761533 0.73775 0.6992 0.75 0.761467 0.737698 0.6993 0.75 0.7614 0.737647 0.6994 0.75 0.761333 0.737597 0.6995 0.75 0.761266 0.737548 0.6996 0.75 0.761199 0.7375 0.6997 0.75 0.761132 0.737453 0.6998 0.75 0.761065 0.737408 0.6999 0.75 0.760999 0.737363 0.7 0.75 0.760932 0.737319 0.7001 0.75 0.760865 0.737277 0.7002 0.75 0.760798 0.737235 0.7003 0.75 0.760731 0.737194 0.7004 0.75 0.760665 0.737155 0.7005 0.75 0.760598 0.737117 0.7006 0.75 0.760531 0.737079 0.7007 0.75 0.760464 0.737043 0.7008 0.75 0.760397 0.737008 0.7009 0.75 0.760331 0.736974 0.701 0.75 0.760264 0.736941 0.7011 0.75 0.760197 0.736909 0.7012 0.75 0.76013 0.736878 0.7013 0.75 0.760064 0.736848 0.7014 0.75 0.759997 0.736819 0.7015 0.75 0.75993 0.736791 0.7016 0.75 0.759864 0.736765 0.7017 0.75 0.759797 0.736739 0.7018 0.75 0.75973 0.736715 0.7019 0.75 0.759664 0.736691 0.702 0.75 0.759597 0.736669 0.7021 0.75 0.75953 0.736648 0.7022 0.75 0.759464 0.736628 0.7023 0.75 0.759397 0.736609 0.7024 0.75 0.75933 0.736591 0.7025 0.75 0.759264 0.736574 0.7026 0.75 0.759197 0.736559 0.7027 0.75 0.759131 0.736544 0.7028 0.75 0.759064 0.73653 0.7029 0.75 0.758998 0.736518 0.703 0.75 0.758931 0.736507 0.7031 0.75 0.758865 0.736496 0.7032 0.75 0.758798 0.736487 0.7033 0.75 0.758732 0.736479 0.7034 0.75 0.758665 0.736472 0.7035 0.75 0.758599 0.736466 0.7036 0.75 0.758533 0.736461 0.7037 0.75 0.758466 0.736458 0.7038 0.75 0.7584 0.736455 0.7039 0.75 0.758333 0.736454 0.704 0.75 0.758267 0.736453 0.7041 0.75 0.758201 0.736454 0.7042 0.75 0.758134 0.736456 0.7043 0.75 0.758068 0.736459 0.7044 0.75 0.758002 0.736463 0.7045 0.75 0.757936 0.736468 0.7046 0.75 0.757869 0.736474 0.7047 0.75 0.757803 0.736481 0.7048 0.75 0.757737 0.736489 0.7049 0.75 0.757671 0.736499 0.705 0.75 0.757605 0.736509 0.7051 0.75 0.757539 0.736521 0.7052 0.75 0.757473 0.736533 0.7053 0.75 0.757407 0.736547 0.7054 0.75 0.757341 0.736562 0.7055 0.75 0.757274 0.736578 0.7056 0.75 0.757209 0.736595 0.7057 0.75 0.757143 0.736613 0.7058 0.75 0.757077 0.736632 0.7059 0.75 0.757011 0.736652 0.706 0.75 0.756945 0.736673 0.7061 0.75 0.756879 0.736695 0.7062 0.75 0.756813 0.736719 0.7063 0.75 0.756747 0.736743 0.7064 0.75 0.756681 0.736768 0.7065 0.75 0.756616 0.736795 0.7066 0.75 0.75655 0.736823 0.7067 0.75 0.756484 0.736851 0.7068 0.75 0.756418 0.736881 0.7069 0.75 0.756353 0.736911 0.707 0.75 0.756287 0.736943 0.7071 0.75 0.756221 0.736976 0.7072 0.75 0.756156 0.73701 0.7073 0.75 0.75609 0.737044 0.7074 0.75 0.756025 0.73708 0.7075 0.75 0.755959 0.737117 0.7076 0.75 0.755894 0.737155 0.7077 0.75 0.755828 0.737194 0.7078 0.75 0.755763 0.737234 0.7079 0.75 0.755698 0.737275 0.708 0.75 0.755632 0.737316 0.7081 0.75 0.755567 0.737359 0.7082 0.75 0.755502 0.737403 0.7083 0.75 0.755436 0.737448 0.7084 0.75 0.755371 0.737494 0.7085 0.75 0.755306 0.737541 0.7086 0.75 0.755241 0.737589 0.7087 0.75 0.755176 0.737637 0.7088 0.75 0.75511 0.737687 0.7089 0.75 0.755045 0.737738 0.709 0.75 0.75498 0.73779 0.7091 0.75 0.754915 0.737842 0.7092 0.75 0.75485 0.737896 0.7093 0.75 0.754785 0.73795 0.7094 0.75 0.754721 0.738006 0.7095 0.75 0.754656 0.738062 0.7096 0.75 0.754591 0.73812 0.7097 0.75 0.754526 0.738178 0.7098 0.75 0.754461 0.738237 0.7099 0.75 0.754396 0.738297 0.71 0.75 0.754332 0.738358 0.7101 0.75 0.754267 0.73842 0.7102 0.75 0.754203 0.738483 0.7103 0.75 0.754138 0.738547 0.7104 0.75 0.754073 0.738611 0.7105 0.75 0.754009 0.738677 0.7106 0.75 0.753944 0.738743 0.7107 0.75 0.75388 0.73881 0.7108 0.75 0.753816 0.738878 0.7109 0.75 0.753751 0.738947 0.711 0.75 0.753687 0.739017 0.7111 0.75 0.753623 0.739088 0.7112 0.75 0.753558 0.739159 0.7113 0.75 0.753494 0.739231 0.7114 0.75 0.75343 0.739304 0.7115 0.75 0.753366 0.739378 0.7116 0.75 0.753302 0.739453 0.7117 0.75 0.753238 0.739529 0.7118 0.75 0.753174 0.739605 0.7119 0.75 0.75311 0.739682 0.712 0.75 0.753046 0.73976 0.7121 0.75 0.752982 0.739839 0.7122 0.75 0.752918 0.739918 0.7123 0.75 0.752854 0.739999 0.7124 0.75 0.75279 0.74008 0.7125 0.75 0.752727 0.740162 0.7126 0.75 0.752663 0.740244 0.7127 0.75 0.752599 0.740327 0.7128 0.75 0.752536 0.740411 0.7129 0.75 0.752472 0.740496 0.713 0.75 0.752409 0.740581 0.7131 0.75 0.752345 0.740668 0.7132 0.75 0.752282 0.740754 0.7133 0.75 0.752219 0.740842 0.7134 0.75 0.752155 0.74093 0.7135 0.75 0.752092 0.741019 0.7136 0.75 0.752029 0.741109 0.7137 0.75 0.751966 0.741199 0.7138 0.75 0.751902 0.74129 0.7139 0.75 0.751839 0.741381 0.714 0.75 0.751776 0.741474 0.7141 0.75 0.751713 0.741566 0.7142 0.75 0.75165 0.74166 0.7143 0.75 0.751587 0.741754 0.7144 0.75 0.751525 0.741849 0.7145 0.75 0.751462 0.741944 0.7146 0.75 0.751399 0.74204 0.7147 0.75 0.751336 0.742136 0.7148 0.75 0.751274 0.742233 0.7149 0.75 0.751211 0.742331 0.715 0.75 0.751148 0.742429 0.7151 0.75 0.751086 0.742528 0.7152 0.75 0.751023 0.742627 0.7153 0.75 0.750961 0.742727 0.7154 0.75 0.750899 0.742827 0.7155 0.75 0.750836 0.742928 0.7156 0.75 0.750774 0.743029 0.7157 0.75 0.750712 0.743131 0.7158 0.75 0.75065 0.743233 0.7159 0.75 0.750588 0.743336 0.716 0.75 0.750526 0.743439 0.7161 0.75 0.750464 0.743543 0.7162 0.75 0.750402 0.743647 0.7163 0.75 0.75034 0.743752 0.7164 0.75 0.750278 0.743857 0.7165 0.75 0.750216 0.743963 0.7166 0.75 0.750154 0.744069 0.7167 0.75 0.750093 0.744175 0.7168 0.75 0.750031 0.744282 0.7169 0.75 0.749969 0.744389 0.717 0.75 0.749908 0.744496 0.7171 0.75 0.749846 0.744604 0.7172 0.75 0.749785 0.744713 0.7173 0.75 0.749724 0.744821 0.7174 0.75 0.749662 0.74493 0.7175 0.75 0.749601 0.74504 0.7176 0.75 0.74954 0.745149 0.7177 0.75 0.749479 0.745259 0.7178 0.75 0.749418 0.74537 0.7179 0.75 0.749357 0.74548 0.718 0.75 0.749296 0.745591 0.7181 0.75 0.749235 0.745702 0.7182 0.75 0.749174 0.745814 0.7183 0.75 0.749113 0.745926 0.7184 0.75 0.749052 0.746038 0.7185 0.75 0.748992 0.74615 0.7186 0.75 0.748931 0.746262 0.7187 0.75 0.74887 0.746375 0.7188 0.75 0.74881 0.746488 0.7189 0.75 0.74875 0.746601 0.719 0.75 0.748689 0.746715 0.7191 0.75 0.748629 0.746828 0.7192 0.75 0.748569 0.746942 0.7193 0.75 0.748508 0.747056 0.7194 0.75 0.748448 0.74717 0.7195 0.75 0.748388 0.747284 0.7196 0.75 0.748328 0.747398 0.7197 0.75 0.748268 0.747513 0.7198 0.75 0.748208 0.747627 0.7199 0.75 0.748148 0.747742 0.72 0.75 0.748089 0.747857 0.7201 0.75 0.748029 0.747972 0.7202 0.75 0.747969 0.748087 0.7203 0.75 0.74791 0.748202 0.7204 0.75 0.74785 0.748317 0.7205 0.75 0.747791 0.748432 0.7206 0.75 0.747731 0.748548 0.7207 0.75 0.747672 0.748663 0.7208 0.75 0.747613 0.748778 0.7209 0.75 0.747553 0.748894 0.721 0.75 0.747494 0.749009 0.7211 0.75 0.747435 0.749124 0.7212 0.75 0.747376 0.74924 0.7213 0.75 0.747317 0.749355 0.7214 0.75 0.747258 0.74947 0.7215 0.75 0.747199 0.749586 0.7216 0.75 0.747141 0.749701 0.7217 0.75 0.747082 0.749816 0.7218 0.75 0.747023 0.749931 0.7219 0.75 0.746965 0.750046 0.722 0.75 0.746906 0.750161 0.7221 0.75 0.746848 0.750276 0.7222 0.75 0.74679 0.750391 0.7223 0.75 0.746731 0.750505 0.7224 0.75 0.746673 0.75062 0.7225 0.75 0.746615 0.750734 0.7226 0.75 0.746557 0.750848 0.7227 0.75 0.746499 0.750962 0.7228 0.75 0.746441 0.751076 0.7229 0.75 0.746383 0.75119 0.723 0.75 0.746325 0.751304 0.7231 0.75 0.746267 0.751417 0.7232 0.75 0.74621 0.75153 0.7233 0.75 0.746152 0.751643 0.7234 0.75 0.746095 0.751756 0.7235 0.75 0.746037 0.751868 0.7236 0.75 0.74598 0.751981 0.7237 0.75 0.745922 0.752093 0.7238 0.75 0.745865 0.752205 0.7239 0.75 0.745808 0.752316 0.724 0.75 0.745751 0.752427 0.7241 0.75 0.745694 0.752538 0.7242 0.75 0.745637 0.752649 0.7243 0.75 0.74558 0.752759 0.7244 0.75 0.745523 0.752869 0.7245 0.75 0.745466 0.752979 0.7246 0.75 0.74541 0.753089 0.7247 0.75 0.745353 0.753198 0.7248 0.75 0.745297 0.753306 0.7249 0.75 0.74524 0.753415 0.725 0.75 0.745184 0.753523 0.7251 0.75 0.745128 0.75363 0.7252 0.75 0.745071 0.753738 0.7253 0.75 0.745015 0.753845 0.7254 0.75 0.744959 0.753951 0.7255 0.75 0.744903 0.754057 0.7256 0.75 0.744847 0.754163 0.7257 0.75 0.744791 0.754268 0.7258 0.75 0.744735 0.754373 0.7259 0.75 0.74468 0.754477 0.726 0.75 0.744624 0.754581 0.7261 0.75 0.744569 0.754685 0.7262 0.75 0.744513 0.754788 0.7263 0.75 0.744458 0.75489 0.7264 0.75 0.744402 0.754992 0.7265 0.75 0.744347 0.755094 0.7266 0.75 0.744292 0.755195 0.7267 0.75 0.744237 0.755295 0.7268 0.75 0.744182 0.755395 0.7269 0.75 0.744127 0.755495 0.727 0.75 0.744072 0.755594 0.7271 0.75 0.744017 0.755692 0.7272 0.75 0.743963 0.75579 0.7273 0.75 0.743908 0.755887 0.7274 0.75 0.743853 0.755984 0.7275 0.75 0.743799 0.75608 0.7276 0.75 0.743744 0.756176 0.7277 0.75 0.74369 0.756271 0.7278 0.75 0.743636 0.756365 0.7279 0.75 0.743582 0.756459 0.728 0.75 0.743528 0.756552 0.7281 0.75 0.743474 0.756645 0.7282 0.75 0.74342 0.756737 0.7283 0.75 0.743366 0.756828 0.7284 0.75 0.743312 0.756919 0.7285 0.75 0.743259 0.757009 0.7286 0.75 0.743205 0.757098 0.7287 0.75 0.743151 0.757187 0.7288 0.75 0.743098 0.757275 0.7289 0.75 0.743045 0.757362 0.729 0.75 0.742991 0.757449 0.7291 0.75 0.742938 0.757535 0.7292 0.75 0.742885 0.75762 0.7293 0.75 0.742832 0.757704 0.7294 0.75 0.742779 0.757788 0.7295 0.75 0.742726 0.757871 0.7296 0.75 0.742674 0.757954 0.7297 0.75 0.742621 0.758035 0.7298 0.75 0.742568 0.758116 0.7299 0.75 0.742516 0.758196 0.73 0.75 0.742463 0.758276 0.7301 0.75 0.742411 0.758355 0.7302 0.75 0.742359 0.758432 0.7303 0.75 0.742307 0.75851 0.7304 0.75 0.742255 0.758586 0.7305 0.75 0.742203 0.758662 0.7306 0.75 0.742151 0.758736 0.7307 0.75 0.742099 0.75881 0.7308 0.75 0.742047 0.758883 0.7309 0.75 0.741995 0.758956 0.731 0.75 0.741944 0.759027 0.7311 0.75 0.741892 0.759098 0.7312 0.75 0.741841 0.759168 0.7313 0.75 0.74179 0.759237 0.7314 0.75 0.741738 0.759305 0.7315 0.75 0.741687 0.759373 0.7316 0.75 0.741636 0.759439 0.7317 0.75 0.741585 0.759505 0.7318 0.75 0.741534 0.75957 0.7319 0.75 0.741484 0.759634 0.732 0.75 0.741433 0.759697 0.7321 0.75 0.741382 0.759759 0.7322 0.75 0.741332 0.759821 0.7323 0.75 0.741281 0.759881 0.7324 0.75 0.741231 0.759941 0.7325 0.75 0.741181 0.759999 0.7326 0.75 0.741131 0.760057 0.7327 0.75 0.74108 0.760114 0.7328 0.75 0.74103 0.76017 0.7329 0.75 0.740981 0.760225 0.733 0.75 0.740931 0.760279 0.7331 0.75 0.740881 0.760333 0.7332 0.75 0.740831 0.760385 0.7333 0.75 0.740782 0.760436 0.7334 0.75 0.740732 0.760487 0.7335 0.75 0.740683 0.760536 0.7336 0.75 0.740634 0.760585 0.7337 0.75 0.740585 0.760633 0.7338 0.75 0.740536 0.76068 0.7339 0.75 0.740487 0.760725 0.734 0.75 0.740438 0.76077 0.7341 0.75 0.740389 0.760814 0.7342 0.75 0.74034 0.760857 0.7343 0.75 0.740292 0.760899 0.7344 0.75 0.740243 0.76094 0.7345 0.75 0.740195 0.76098 0.7346 0.75 0.740146 0.761019 0.7347 0.75 0.740098 0.761057 0.7348 0.75 0.74005 0.761094 0.7349 0.75 0.740002 0.76113 0.735 0.75 0.739954 0.761165 0.7351 0.75 0.739906 0.761199 0.7352 0.75 0.739858 0.761233 0.7353 0.75 0.739811 0.761265 0.7354 0.75 0.739763 0.761296 0.7355 0.75 0.739715 0.761326 0.7356 0.75 0.739668 0.761355 0.7357 0.75 0.739621 0.761383 0.7358 0.75 0.739574 0.761411 0.7359 0.75 0.739526 0.761437 0.736 0.75 0.739479 0.761462 0.7361 0.75 0.739432 0.761486 0.7362 0.75 0.739386 0.761509 0.7363 0.75 0.739339 0.761531 0.7364 0.75 0.739292 0.761552 0.7365 0.75 0.739246 0.761573 0.7366 0.75 0.739199 0.761592 0.7367 0.75 0.739153 0.76161 0.7368 0.75 0.739107 0.761627 0.7369 0.75 0.739061 0.761643 0.737 0.75 0.739014 0.761658 0.7371 0.75 0.738969 0.761672 0.7372 0.75 0.738923 0.761685 0.7373 0.75 0.738877 0.761697 0.7374 0.75 0.738831 0.761708 0.7375 0.75 0.738786 0.761718 0.7376 0.75 0.73874 0.761727 0.7377 0.75 0.738695 0.761734 0.7378 0.75 0.73865 0.761741 0.7379 0.75 0.738604 0.761747 0.738 0.75 0.738559 0.761752 0.7381 0.75 0.738514 0.761756 0.7382 0.75 0.738469 0.761758 0.7383 0.75 0.738425 0.76176 0.7384 0.75 0.73838 0.761761 0.7385 0.75 0.738335 0.761761 0.7386 0.75 0.738291 0.761759 0.7387 0.75 0.738247 0.761757 0.7388 0.75 0.738202 0.761753 0.7389 0.75 0.738158 0.761749 0.739 0.75 0.738114 0.761744 0.7391 0.75 0.73807 0.761737 0.7392 0.75 0.738026 0.76173 0.7393 0.75 0.737982 0.761721 0.7394 0.75 0.737939 0.761712 0.7395 0.75 0.737895 0.761701 0.7396 0.75 0.737852 0.76169 0.7397 0.75 0.737808 0.761677 0.7398 0.75 0.737765 0.761664 0.7399 0.75 0.737722 0.761649 0.74 0.75 0.737679 0.761634 0.7401 0.75 0.737636 0.761617 0.7402 0.75 0.737593 0.761599 0.7403 0.75 0.73755 0.761581 0.7404 0.75 0.737508 0.761561 0.7405 0.75 0.737465 0.761541 0.7406 0.75 0.737423 0.761519 0.7407 0.75 0.73738 0.761497 0.7408 0.75 0.737338 0.761473 0.7409 0.75 0.737296 0.761448 0.741 0.75 0.737254 0.761423 0.7411 0.75 0.737212 0.761396 0.7412 0.75 0.73717 0.761369 0.7413 0.75 0.737128 0.76134 0.7414 0.75 0.737087 0.761311 0.7415 0.75 0.737045 0.761281 0.7416 0.75 0.737004 0.761249 0.7417 0.75 0.736963 0.761217 0.7418 0.75 0.736921 0.761184 0.7419 0.75 0.73688 0.761149 0.742 0.75 0.736839 0.761114 0.7421 0.75 0.736798 0.761078 0.7422 0.75 0.736758 0.761041 0.7423 0.75 0.736717 0.761003 0.7424 0.75 0.736676 0.760964 0.7425 0.75 0.736636 0.760924 0.7426 0.75 0.736596 0.760883 0.7427 0.75 0.736555 0.760841 0.7428 0.75 0.736515 0.760798 0.7429 0.75 0.736475 0.760755 0.743 0.75 0.736435 0.76071 0.7431 0.75 0.736395 0.760664 0.7432 0.75 0.736356 0.760618 0.7433 0.75 0.736316 0.760571 0.7434 0.75 0.736277 0.760522 0.7435 0.75 0.736237 0.760473 0.7436 0.75 0.736198 0.760423 0.7437 0.75 0.736159 0.760372 0.7438 0.75 0.73612 0.760321 0.7439 0.75 0.736081 0.760268 0.744 0.75 0.736042 0.760215 0.7441 0.75 0.736003 0.76016 0.7442 0.75 0.735964 0.760105 0.7443 0.75 0.735926 0.760049 0.7444 0.75 0.735887 0.759992 0.7445 0.75 0.735849 0.759934 0.7446 0.75 0.735811 0.759875 0.7447 0.75 0.735773 0.759816 0.7448 0.75 0.735735 0.759756 0.7449 0.75 0.735697 0.759694 0.745 0.75 0.735659 0.759632 0.7451 0.75 0.735622 0.75957 0.7452 0.75 0.735584 0.759506 0.7453 0.75 0.735547 0.759442 0.7454 0.75 0.735509 0.759376 0.7455 0.75 0.735472 0.759311 0.7456 0.75 0.735435 0.759244 0.7457 0.75 0.735398 0.759176 0.7458 0.75 0.735361 0.759108 0.7459 0.75 0.735324 0.759039 0.746 0.75 0.735287 0.758969 0.7461 0.75 0.735251 0.758898 0.7462 0.75 0.735214 0.758827 0.7463 0.75 0.735178 0.758755 0.7464 0.75 0.735142 0.758682 0.7465 0.75 0.735106 0.758609 0.7466 0.75 0.73507 0.758535 0.7467 0.75 0.735034 0.75846 0.7468 0.75 0.734998 0.758384 0.7469 0.75 0.734962 0.758308 0.747 0.75 0.734927 0.758231 0.7471 0.75 0.734891 0.758153 0.7472 0.75 0.734856 0.758074 0.7473 0.75 0.734821 0.757995 0.7474 0.75 0.734786 0.757916 0.7475 0.75 0.734751 0.757835 0.7476 0.75 0.734716 0.757754 0.7477 0.75 0.734681 0.757672 0.7478 0.75 0.734646 0.75759 0.7479 0.75 0.734612 0.757507 0.748 0.75 0.734577 0.757424 0.7481 0.75 0.734543 0.757339 0.7482 0.75 0.734509 0.757255 0.7483 0.75 0.734475 0.757169 0.7484 0.75 0.734441 0.757083 0.7485 0.75 0.734407 0.756997 0.7486 0.75 0.734373 0.75691 0.7487 0.75 0.734339 0.756822 0.7488 0.75 0.734306 0.756734 0.7489 0.75 0.734272 0.756645 0.749 0.75 0.734239 0.756556 0.7491 0.75 0.734206 0.756466 0.7492 0.75 0.734173 0.756376 0.7493 0.75 0.73414 0.756285 0.7494 0.75 0.734107 0.756193 0.7495 0.75 0.734074 0.756101 0.7496 0.75 0.734042 0.756009 0.7497 0.75 0.734009 0.755916 0.7498 0.75 0.733977 0.755823 0.7499 0.75 0.733944 0.755729 0.75 0.75 0.733912 0.755635 0.7501 0.75 0.73388 0.75554 0.7502 0.75 0.733848 0.755445 0.7503 0.75 0.733816 0.755349 0.7504 0.75 0.733785 0.755253 0.7505 0.75 0.733753 0.755157 0.7506 0.75 0.733722 0.75506 0.7507 0.75 0.73369 0.754963 0.7508 0.75 0.733659 0.754865 0.7509 0.75 0.733628 0.754767 0.751 0.75 0.733597 0.754669 0.7511 0.75 0.733566 0.75457 0.7512 0.75 0.733535 0.754471 0.7513 0.75 0.733505 0.754372 0.7514 0.75 0.733474 0.754272 0.7515 0.75 0.733444 0.754172 0.7516 0.75 0.733413 0.754072 0.7517 0.75 0.733383 0.753971 0.7518 0.75 0.733353 0.75387 0.7519 0.75 0.733323 0.753769 0.752 0.75 0.733293 0.753667 0.7521 0.75 0.733263 0.753565 0.7522 0.75 0.733234 0.753463 0.7523 0.75 0.733204 0.753361 0.7524 0.75 0.733175 0.753258 0.7525 0.75 0.733146 0.753156 0.7526 0.75 0.733117 0.753053 0.7527 0.75 0.733087 0.752949 0.7528 0.75 0.733059 0.752846 0.7529 0.75 0.73303 0.752742 0.753 0.75 0.733001 0.752638 0.7531 0.75 0.732973 0.752534 0.7532 0.75 0.732944 0.75243 0.7533 0.75 0.732916 0.752326 0.7534 0.75 0.732888 0.752221 0.7535 0.75 0.732859 0.752117 0.7536 0.75 0.732831 0.752012 0.7537 0.75 0.732804 0.751907 0.7538 0.75 0.732776 0.751802 0.7539 0.75 0.732748 0.751697 0.754 0.75 0.732721 0.751592 0.7541 0.75 0.732693 0.751487 0.7542 0.75 0.732666 0.751381 0.7543 0.75 0.732639 0.751276 0.7544 0.75 0.732612 0.751171 0.7545 0.75 0.732585 0.751065 0.7546 0.75 0.732558 0.75096 0.7547 0.75 0.732532 0.750854 0.7548 0.75 0.732505 0.750748 0.7549 0.75 0.732479 0.750643 0.755 0.75 0.732452 0.750537 0.7551 0.75 0.732426 0.750432 0.7552 0.75 0.7324 0.750326 0.7553 0.75 0.732374 0.750221 0.7554 0.75 0.732348 0.750115 0.7555 0.75 0.732323 0.75001 0.7556 0.75 0.732297 0.749904 0.7557 0.75 0.732271 0.749799 0.7558 0.75 0.732246 0.749694 0.7559 0.75 0.732221 0.749589 0.756 0.75 0.732196 0.749484 0.7561 0.75 0.732171 0.749379 0.7562 0.75 0.732146 0.749274 0.7563 0.75 0.732121 0.74917 0.7564 0.75 0.732096 0.749065 0.7565 0.75 0.732072 0.748961 0.7566 0.75 0.732048 0.748856 0.7567 0.75 0.732023 0.748752 0.7568 0.75 0.731999 0.748649 0.7569 0.75 0.731975 0.748545 0.757 0.75 0.731951 0.748441 0.7571 0.75 0.731927 0.748338 0.7572 0.75 0.731904 0.748235 0.7573 0.75 0.73188 0.748132 0.7574 0.75 0.731857 0.748029 0.7575 0.75 0.731833 0.747927 0.7576 0.75 0.73181 0.747825 0.7577 0.75 0.731787 0.747723 0.7578 0.75 0.731764 0.747621 0.7579 0.75 0.731741 0.74752 0.758 0.75 0.731719 0.747419 0.7581 0.75 0.731696 0.747318 0.7582 0.75 0.731674 0.747218 0.7583 0.75 0.731651 0.747118 0.7584 0.75 0.731629 0.747018 0.7585 0.75 0.731607 0.746918 0.7586 0.75 0.731585 0.746819 0.7587 0.75 0.731563 0.74672 0.7588 0.75 0.731541 0.746622 0.7589 0.75 0.73152 0.746524 0.759 0.75 0.731498 0.746426 0.7591 0.75 0.731477 0.746329 0.7592 0.75 0.731456 0.746232 0.7593 0.75 0.731434 0.746135 0.7594 0.75 0.731413 0.746039 0.7595 0.75 0.731393 0.745943 0.7596 0.75 0.731372 0.745848 0.7597 0.75 0.731351 0.745753 0.7598 0.75 0.731331 0.745659 0.7599 0.75 0.73131 0.745565 0.76 0.75 0.73129 0.745471 0.7601 0.75 0.73127 0.745378 0.7602 0.75 0.73125 0.745286 0.7603 0.75 0.73123 0.745194 0.7604 0.75 0.73121 0.745102 0.7605 0.75 0.73119 0.745011 0.7606 0.75 0.731171 0.744921 0.7607 0.75 0.731151 0.744831 0.7608 0.75 0.731132 0.744741 0.7609 0.75 0.731113 0.744652 0.761 0.75 0.731094 0.744564 0.7611 0.75 0.731075 0.744476 0.7612 0.75 0.731056 0.744389 0.7613 0.75 0.731037 0.744302 0.7614 0.75 0.731019 0.744216 0.7615 0.75 0.731 0.74413 0.7616 0.75 0.730982 0.744045 0.7617 0.75 0.730964 0.743961 0.7618 0.75 0.730946 0.743877 0.7619 0.75 0.730928 0.743794 0.762 0.75 0.73091 0.743711 0.7621 0.75 0.730892 0.743629 0.7622 0.75 0.730875 0.743548 0.7623 0.75 0.730857 0.743467 0.7624 0.75 0.73084 0.743387 0.7625 0.75 0.730823 0.743308 0.7626 0.75 0.730806 0.743229 0.7627 0.75 0.730789 0.743151 0.7628 0.75 0.730772 0.743074 0.7629 0.75 0.730755 0.742997 0.763 0.75 0.730739 0.742922 0.7631 0.75 0.730722 0.742846 0.7632 0.75 0.730706 0.742772 0.7633 0.75 0.73069 0.742698 0.7634 0.75 0.730673 0.742625 0.7635 0.75 0.730657 0.742553 0.7636 0.75 0.730642 0.742481 0.7637 0.75 0.730626 0.74241 0.7638 0.75 0.73061 0.74234 0.7639 0.75 0.730595 0.74227 0.764 0.75 0.730579 0.742202 0.7641 0.75 0.730564 0.742134 0.7642 0.75 0.730549 0.742067 0.7643 0.75 0.730534 0.742001 0.7644 0.75 0.730519 0.741935 0.7645 0.75 0.730504 0.74187 0.7646 0.75 0.73049 0.741806 0.7647 0.75 0.730475 0.741743 0.7648 0.75 0.730461 0.741681 0.7649 0.75 0.730447 0.741619 0.765 0.75 0.730432 0.741558 0.7651 0.75 0.730418 0.741499 0.7652 0.75 0.730405 0.741439 0.7653 0.75 0.730391 0.741381 0.7654 0.75 0.730377 0.741324 0.7655 0.75 0.730364 0.741267 0.7656 0.75 0.73035 0.741212 0.7657 0.75 0.730337 0.741157 0.7658 0.75 0.730324 0.741103 0.7659 0.75 0.730311 0.741049 0.766 0.75 0.730298 0.740997 0.7661 0.75 0.730285 0.740946 0.7662 0.75 0.730272 0.740895 0.7663 0.75 0.73026 0.740846 0.7664 0.75 0.730248 0.740797 0.7665 0.75 0.730235 0.740749 0.7666 0.75 0.730223 0.740702 0.7667 0.75 0.730211 0.740656 0.7668 0.75 0.730199 0.740611 0.7669 0.75 0.730187 0.740567 0.767 0.75 0.730176 0.740523 0.7671 0.75 0.730164 0.740481 0.7672 0.75 0.730153 0.740439 0.7673 0.75 0.730141 0.740399 0.7674 0.75 0.73013 0.740359 0.7675 0.75 0.730119 0.74032 0.7676 0.75 0.730108 0.740282 0.7677 0.75 0.730098 0.740245 0.7678 0.75 0.730087 0.74021 0.7679 0.75 0.730076 0.740174 0.768 0.75 0.730066 0.74014 0.7681 0.75 0.730056 0.740107 0.7682 0.75 0.730045 0.740075 0.7683 0.75 0.730035 0.740044 0.7684 0.75 0.730025 0.740014 0.7685 0.75 0.730016 0.739984 0.7686 0.75 0.730006 0.739956 0.7687 0.75 0.729996 0.739929 0.7688 0.75 0.729987 0.739902 0.7689 0.75 0.729978 0.739877 0.769 0.75 0.729968 0.739852 0.7691 0.75 0.729959 0.739829 0.7692 0.75 0.72995 0.739806 0.7693 0.75 0.729942 0.739785 0.7694 0.75 0.729933 0.739764 0.7695 0.75 0.729924 0.739745 0.7696 0.75 0.729916 0.739726 0.7697 0.75 0.729908 0.739709 0.7698 0.75 0.729899 0.739692 0.7699 0.75 0.729891 0.739676 0.77 0.75 0.729883 0.739662 0.7701 0.75 0.729875 0.739648 0.7702 0.75 0.729868 0.739635 0.7703 0.75 0.72986 0.739624 0.7704 0.75 0.729853 0.739613 0.7705 0.75 0.729845 0.739603 0.7706 0.75 0.729838 0.739594 0.7707 0.75 0.729831 0.739587 0.7708 0.75 0.729824 0.73958 0.7709 0.75 0.729817 0.739574 0.771 0.75 0.729811 0.73957 0.7711 0.75 0.729804 0.739566 0.7712 0.75 0.729797 0.739563 0.7713 0.75 0.729791 0.739561 0.7714 0.75 0.729785 0.739561 0.7715 0.75 0.729779 0.739561 0.7716 0.75 0.729773 0.739562 0.7717 0.75 0.729767 0.739564 0.7718 0.75 0.729761 0.739567 0.7719 0.75 0.729756 0.739572 0.772 0.75 0.72975 0.739577 0.7721 0.75 0.729745 0.739583 0.7722 0.75 0.729739 0.73959 0.7723 0.75 0.729734 0.739598 0.7724 0.75 0.729729 0.739608 0.7725 0.75 0.729724 0.739618 0.7726 0.75 0.72972 0.739629 0.7727 0.75 0.729715 0.739641 0.7728 0.75 0.729711 0.739654 0.7729 0.75 0.729706 0.739668 0.773 0.75 0.729702 0.739683 0.7731 0.75 0.729698 0.739699 0.7732 0.75 0.729694 0.739716 0.7733 0.75 0.72969 0.739734 0.7734 0.75 0.729686 0.739753 0.7735 0.75 0.729682 0.739773 0.7736 0.75 0.729679 0.739794 0.7737 0.75 0.729676 0.739816 0.7738 0.75 0.729672 0.739839 0.7739 0.75 0.729669 0.739863 0.774 0.75 0.729666 0.739888 0.7741 0.75 0.729663 0.739913 0.7742 0.75 0.72966 0.73994 0.7743 0.75 0.729658 0.739968 0.7744 0.75 0.729655 0.739996 0.7745 0.75 0.729653 0.740026 0.7746 0.75 0.72965 0.740056 0.7747 0.75 0.729648 0.740088 0.7748 0.75 0.729646 0.74012 0.7749 0.75 0.729644 0.740154 0.775 0.75 0.729642 0.740188 0.7751 0.75 0.729641 0.740223 0.7752 0.75 0.729639 0.740259 0.7753 0.75 0.729638 0.740296 0.7754 0.75 0.729636 0.740334 0.7755 0.75 0.729635 0.740373 0.7756 0.75 0.729634 0.740413 0.7757 0.75 0.729633 0.740453 0.7758 0.75 0.729632 0.740495 0.7759 0.75 0.729632 0.740537 0.776 0.75 0.729631 0.74058 0.7761 0.75 0.729631 0.740625 0.7762 0.75 0.72963 0.74067 0.7763 0.75 0.72963 0.740716 0.7764 0.75 0.72963 0.740763 0.7765 0.75 0.72963 0.74081 0.7766 0.75 0.72963 0.740859 0.7767 0.75 0.72963 0.740908 0.7768 0.75 0.729631 0.740959 0.7769 0.75 0.729631 0.74101 0.777 0.75 0.729632 0.741062 0.7771 0.75 0.729632 0.741115 0.7772 0.75 0.729633 0.741168 0.7773 0.75 0.729634 0.741223 0.7774 0.75 0.729635 0.741278 0.7775 0.75 0.729637 0.741335 0.7776 0.75 0.729638 0.741391 0.7777 0.75 0.729639 0.741449 0.7778 0.75 0.729641 0.741508 0.7779 0.75 0.729643 0.741567 0.778 0.75 0.729644 0.741627 0.7781 0.75 0.729646 0.741688 0.7782 0.75 0.729648 0.74175 0.7783 0.75 0.729651 0.741813 0.7784 0.75 0.729653 0.741876 0.7785 0.75 0.729655 0.74194 0.7786 0.75 0.729658 0.742005 0.7787 0.75 0.729661 0.74207 0.7788 0.75 0.729663 0.742136 0.7789 0.75 0.729666 0.742203 0.779 0.75 0.729669 0.742271 0.7791 0.75 0.729672 0.74234 0.7792 0.75 0.729676 0.742409 0.7793 0.75 0.729679 0.742479 0.7794 0.75 0.729683 0.742549 0.7795 0.75 0.729686 0.74262 0.7796 0.75 0.72969 0.742692 0.7797 0.75 0.729694 0.742765 0.7798 0.75 0.729698 0.742838 0.7799 0.75 0.729702 0.742912 0.78 0.75 0.729706 0.742987 0.7801 0.75 0.72971 0.743062 0.7802 0.75 0.729715 0.743138 0.7803 0.75 0.729719 0.743214 0.7804 0.75 0.729724 0.743292 0.7805 0.75 0.729729 0.743369 0.7806 0.75 0.729734 0.743448 0.7807 0.75 0.729739 0.743527 0.7808 0.75 0.729744 0.743606 0.7809 0.75 0.729749 0.743686 0.781 0.75 0.729755 0.743767 0.7811 0.75 0.72976 0.743849 0.7812 0.75 0.729766 0.74393 0.7813 0.75 0.729772 0.744013 0.7814 0.75 0.729778 0.744096 0.7815 0.75 0.729784 0.744179 0.7816 0.75 0.72979 0.744263 0.7817 0.75 0.729796 0.744348 0.7818 0.75 0.729802 0.744433 0.7819 0.75 0.729809 0.744519 0.782 0.75 0.729815 0.744605 0.7821 0.75 0.729822 0.744691 0.7822 0.75 0.729829 0.744779 0.7823 0.75 0.729836 0.744866 0.7824 0.75 0.729843 0.744954 0.7825 0.75 0.72985 0.745043 0.7826 0.75 0.729857 0.745132 0.7827 0.75 0.729865 0.745221 0.7828 0.75 0.729872 0.745311 0.7829 0.75 0.72988 0.745401 0.783 0.75 0.729887 0.745491 0.7831 0.75 0.729895 0.745582 0.7832 0.75 0.729903 0.745674 0.7833 0.75 0.729911 0.745766 0.7834 0.75 0.72992 0.745858 0.7835 0.75 0.729928 0.74595 0.7836 0.75 0.729936 0.746043 0.7837 0.75 0.729945 0.746136 0.7838 0.75 0.729954 0.74623 0.7839 0.75 0.729962 0.746324 0.784 0.75 0.729971 0.746418 0.7841 0.75 0.72998 0.746513 0.7842 0.75 0.729989 0.746607 0.7843 0.75 0.729999 0.746703 0.7844 0.75 0.730008 0.746798 0.7845 0.75 0.730018 0.746894 0.7846 0.75 0.730027 0.746989 0.7847 0.75 0.730037 0.747086 0.7848 0.75 0.730047 0.747182 0.7849 0.75 0.730057 0.747279 0.785 0.75 0.730067 0.747376 0.7851 0.75 0.730077 0.747473 0.7852 0.75 0.730087 0.74757 0.7853 0.75 0.730098 0.747667 0.7854 0.75 0.730108 0.747765 0.7855 0.75 0.730119 0.747863 0.7856 0.75 0.730129 0.747961 0.7857 0.75 0.73014 0.748059 0.7858 0.75 0.730151 0.748158 0.7859 0.75 0.730162 0.748256 0.786 0.75 0.730174 0.748355 0.7861 0.75 0.730185 0.748453 0.7862 0.75 0.730196 0.748552 0.7863 0.75 0.730208 0.748651 0.7864 0.75 0.73022 0.74875 0.7865 0.75 0.730231 0.748849 0.7866 0.75 0.730243 0.748948 0.7867 0.75 0.730255 0.749047 0.7868 0.75 0.730267 0.749147 0.7869 0.75 0.73028 0.749246 0.787 0.75 0.730292 0.749345 0.7871 0.75 0.730304 0.749445 0.7872 0.75 0.730317 0.749544 0.7873 0.75 0.73033 0.749643 0.7874 0.75 0.730342 0.749743 0.7875 0.75 0.730355 0.749842 0.7876 0.75 0.730368 0.749941 0.7877 0.75 0.730381 0.75004 0.7878 0.75 0.730395 0.75014 0.7879 0.75 0.730408 0.750239 0.788 0.75 0.730421 0.750338 0.7881 0.75 0.730435 0.750437 0.7882 0.75 0.730449 0.750536 0.7883 0.75 0.730462 0.750634 0.7884 0.75 0.730476 0.750733 0.7885 0.75 0.73049 0.750832 0.7886 0.75 0.730504 0.75093 0.7887 0.75 0.730519 0.751028 0.7888 0.75 0.730533 0.751126 0.7889 0.75 0.730547 0.751224 0.789 0.75 0.730562 0.751322 0.7891 0.75 0.730577 0.75142 0.7892 0.75 0.730591 0.751517 0.7893 0.75 0.730606 0.751614 0.7894 0.75 0.730621 0.751711 0.7895 0.75 0.730636 0.751808 0.7896 0.75 0.730652 0.751905 0.7897 0.75 0.730667 0.752001 0.7898 0.75 0.730682 0.752097 0.7899 0.75 0.730698 0.752193 0.79 0.75 0.730713 0.752289 0.7901 0.75 0.730729 0.752384 0.7902 0.75 0.730745 0.752479 0.7903 0.75 0.730761 0.752574 0.7904 0.75 0.730777 0.752668 0.7905 0.75 0.730793 0.752762 0.7906 0.75 0.73081 0.752856 0.7907 0.75 0.730826 0.752949 0.7908 0.75 0.730843 0.753042 0.7909 0.75 0.730859 0.753135 0.791 0.75 0.730876 0.753227 0.7911 0.75 0.730893 0.753319 0.7912 0.75 0.73091 0.753411 0.7913 0.75 0.730927 0.753502 0.7914 0.75 0.730944 0.753593 0.7915 0.75 0.730961 0.753684 0.7916 0.75 0.730979 0.753774 0.7917 0.75 0.730996 0.753863 0.7918 0.75 0.731014 0.753952 0.7919 0.75 0.731031 0.754041 0.792 0.75 0.731049 0.754129 0.7921 0.75 0.731067 0.754217 0.7922 0.75 0.731085 0.754304 0.7923 0.75 0.731103 0.754391 0.7924 0.75 0.731121 0.754477 0.7925 0.75 0.73114 0.754563 0.7926 0.75 0.731158 0.754649 0.7927 0.75 0.731177 0.754734 0.7928 0.75 0.731195 0.754818 0.7929 0.75 0.731214 0.754902 0.793 0.75 0.731233 0.754985 0.7931 0.75 0.731252 0.755068 0.7932 0.75 0.731271 0.75515 0.7933 0.75 0.73129 0.755231 0.7934 0.75 0.731309 0.755312 0.7935 0.75 0.731329 0.755393 0.7936 0.75 0.731348 0.755473 0.7937 0.75 0.731368 0.755552 0.7938 0.75 0.731387 0.75563 0.7939 0.75 0.731407 0.755708 0.794 0.75 0.731427 0.755786 0.7941 0.75 0.731447 0.755863 0.7942 0.75 0.731467 0.755939 0.7943 0.75 0.731487 0.756014 0.7944 0.75 0.731508 0.756089 0.7945 0.75 0.731528 0.756163 0.7946 0.75 0.731549 0.756237 0.7947 0.75 0.731569 0.756309 0.7948 0.75 0.73159 0.756382 0.7949 0.75 0.731611 0.756453 0.795 0.75 0.731632 0.756524 0.7951 0.75 0.731653 0.756594 0.7952 0.75 0.731674 0.756663 0.7953 0.75 0.731695 0.756732 0.7954 0.75 0.731716 0.7568 0.7955 0.75 0.731738 0.756867 0.7956 0.75 0.731759 0.756933 0.7957 0.75 0.731781 0.756999 0.7958 0.75 0.731803 0.757064 0.7959 0.75 0.731824 0.757128 0.796 0.75 0.731846 0.757191 0.7961 0.75 0.731868 0.757254 0.7962 0.75 0.731891 0.757316 0.7963 0.75 0.731913 0.757377 0.7964 0.75 0.731935 0.757437 0.7965 0.75 0.731957 0.757497 0.7966 0.75 0.73198 0.757555 0.7967 0.75 0.732003 0.757613 0.7968 0.75 0.732025 0.75767 0.7969 0.75 0.732048 0.757727 0.797 0.75 0.732071 0.757782 0.7971 0.75 0.732094 0.757836 0.7972 0.75 0.732117 0.75789 0.7973 0.75 0.73214 0.757943 0.7974 0.75 0.732164 0.757995 0.7975 0.75 0.732187 0.758046 0.7976 0.75 0.732211 0.758097 0.7977 0.75 0.732234 0.758146 0.7978 0.75 0.732258 0.758195 0.7979 0.75 0.732282 0.758242 0.798 0.75 0.732306 0.758289 0.7981 0.75 0.73233 0.758335 0.7982 0.75 0.732354 0.75838 0.7983 0.75 0.732378 0.758424 0.7984 0.75 0.732402 0.758468 0.7985 0.75 0.732426 0.75851 0.7986 0.75 0.732451 0.758552 0.7987 0.75 0.732475 0.758592 0.7988 0.75 0.7325 0.758632 0.7989 0.75 0.732525 0.75867 0.799 0.75 0.73255 0.758708 0.7991 0.75 0.732575 0.758745 0.7992 0.75 0.7326 0.758781 0.7993 0.75 0.732625 0.758816 0.7994 0.75 0.73265 0.75885 0.7995 0.75 0.732675 0.758883 0.7996 0.75 0.732701 0.758915 0.7997 0.75 0.732726 0.758947 0.7998 0.75 0.732752 0.758977 0.7999 0.75 0.732778 0.759006 0.8 0.75 0.732803 0.759034 0.8001 0.75 0.732829 0.759062 0.8002 0.75 0.732855 0.759088 0.8003 0.75 0.732881 0.759114 0.8004 0.75 0.732907 0.759138 0.8005 0.75 0.732934 0.759162 0.8006 0.75 0.73296 0.759184 0.8007 0.75 0.732987 0.759206 0.8008 0.75 0.733013 0.759227 0.8009 0.75 0.73304 0.759246 0.801 0.75 0.733066 0.759265 0.8011 0.75 0.733093 0.759282 0.8012 0.75 0.73312 0.759299 0.8013 0.75 0.733147 0.759315 0.8014 0.75 0.733174 0.759329 0.8015 0.75 0.733201 0.759343 0.8016 0.75 0.733229 0.759356 0.8017 0.75 0.733256 0.759368 0.8018 0.75 0.733283 0.759378 0.8019 0.75 0.733311 0.759388 0.802 0.75 0.733338 0.759397 0.8021 0.75 0.733366 0.759404 0.8022 0.75 0.733394 0.759411 0.8023 0.75 0.733422 0.759417 0.8024 0.75 0.73345 0.759422 0.8025 0.75 0.733478 0.759425 0.8026 0.75 0.733506 0.759428 0.8027 0.75 0.733534 0.75943 0.8028 0.75 0.733563 0.759431 0.8029 0.75 0.733591 0.75943 0.803 0.75 0.733619 0.759429 0.8031 0.75 0.733648 0.759427 0.8032 0.75 0.733677 0.759423 0.8033 0.75 0.733705 0.759419 0.8034 0.75 0.733734 0.759414 0.8035 0.75 0.733763 0.759408 0.8036 0.75 0.733792 0.7594 0.8037 0.75 0.733821 0.759392 0.8038 0.75 0.733851 0.759383 0.8039 0.75 0.73388 0.759372 0.804 0.75 0.733909 0.759361 0.8041 0.75 0.733939 0.759349 0.8042 0.75 0.733968 0.759336 0.8043 0.75 0.733998 0.759322 0.8044 0.75 0.734027 0.759306 0.8045 0.75 0.734057 0.75929 0.8046 0.75 0.734087 0.759273 0.8047 0.75 0.734117 0.759255 0.8048 0.75 0.734147 0.759236 0.8049 0.75 0.734177 0.759215 0.805 0.75 0.734207 0.759194 0.8051 0.75 0.734238 0.759172 0.8052 0.75 0.734268 0.759149 0.8053 0.75 0.734299 0.759125 0.8054 0.75 0.734329 0.7591 0.8055 0.75 0.73436 0.759074 0.8056 0.75 0.73439 0.759047 0.8057 0.75 0.734421 0.759019 0.8058 0.75 0.734452 0.75899 0.8059 0.75 0.734483 0.758961 0.806 0.75 0.734514 0.75893 0.8061 0.75 0.734545 0.758898 0.8062 0.75 0.734576 0.758866 0.8063 0.75 0.734608 0.758832 0.8064 0.75 0.734639 0.758798 0.8065 0.75 0.73467 0.758762 0.8066 0.75 0.734702 0.758726 0.8067 0.75 0.734733 0.758688 0.8068 0.75 0.734765 0.75865 0.8069 0.75 0.734797 0.758611 0.807 0.75 0.734829 0.758571 0.8071 0.75 0.734861 0.75853 0.8072 0.75 0.734893 0.758488 0.8073 0.75 0.734925 0.758445 0.8074 0.75 0.734957 0.758402 0.8075 0.75 0.734989 0.758357 0.8076 0.75 0.735021 0.758312 0.8077 0.75 0.735054 0.758266 0.8078 0.75 0.735086 0.758218 0.8079 0.75 0.735119 0.75817 0.808 0.75 0.735151 0.758121 0.8081 0.75 0.735184 0.758072 0.8082 0.75 0.735217 0.758021 0.8083 0.75 0.73525 0.75797 0.8084 0.75 0.735283 0.757917 0.8085 0.75 0.735316 0.757864 0.8086 0.75 0.735349 0.75781 0.8087 0.75 0.735382 0.757755 0.8088 0.75 0.735415 0.7577 0.8089 0.75 0.735448 0.757643 0.809 0.75 0.735482 0.757586 0.8091 0.75 0.735515 0.757528 0.8092 0.75 0.735549 0.757469 0.8093 0.75 0.735582 0.757409 0.8094 0.75 0.735616 0.757349 0.8095 0.75 0.73565 0.757288 0.8096 0.75 0.735683 0.757226 0.8097 0.75 0.735717 0.757163 0.8098 0.75 0.735751 0.7571 0.8099 0.75 0.735785 0.757035 0.81 0.75 0.735819 0.75697 0.8101 0.75 0.735854 0.756905 0.8102 0.75 0.735888 0.756838 0.8103 0.75 0.735922 0.756771 0.8104 0.75 0.735957 0.756703 0.8105 0.75 0.735991 0.756635 0.8106 0.75 0.736026 0.756565 0.8107 0.75 0.73606 0.756495 0.8108 0.75 0.736095 0.756425 0.8109 0.75 0.73613 0.756353 0.811 0.75 0.736164 0.756281 0.8111 0.75 0.736199 0.756209 0.8112 0.75 0.736234 0.756135 0.8113 0.75 0.736269 0.756061 0.8114 0.75 0.736304 0.755987 0.8115 0.75 0.73634 0.755912 0.8116 0.75 0.736375 0.755836 0.8117 0.75 0.73641 0.755759 0.8118 0.75 0.736446 0.755682 0.8119 0.75 0.736481 0.755605 0.812 0.75 0.736517 0.755527 0.8121 0.75 0.736552 0.755448 0.8122 0.75 0.736588 0.755368 0.8123 0.75 0.736623 0.755288 0.8124 0.75 0.736659 0.755208 0.8125 0.75 0.736695 0.755127 0.8126 0.75 0.736731 0.755045 0.8127 0.75 0.736767 0.754963 0.8128 0.75 0.736803 0.754881 0.8129 0.75 0.736839 0.754798 0.813 0.75 0.736875 0.754714 0.8131 0.75 0.736912 0.75463 0.8132 0.75 0.736948 0.754545 0.8133 0.75 0.736984 0.75446 0.8134 0.75 0.737021 0.754375 0.8135 0.75 0.737057 0.754289 0.8136 0.75 0.737094 0.754203 0.8137 0.75 0.73713 0.754116 0.8138 0.75 0.737167 0.754028 0.8139 0.75 0.737204 0.753941 0.814 0.75 0.737241 0.753853 0.8141 0.75 0.737278 0.753764 0.8142 0.75 0.737315 0.753675 0.8143 0.75 0.737352 0.753586 0.8144 0.75 0.737389 0.753497 0.8145 0.75 0.737426 0.753407 0.8146 0.75 0.737463 0.753317 0.8147 0.75 0.7375 0.753226 0.8148 0.75 0.737537 0.753135 0.8149 0.75 0.737575 0.753044 0.815 0.75 0.737612 0.752952 0.8151 0.75 0.73765 0.75286 0.8152 0.75 0.737687 0.752768 0.8153 0.75 0.737725 0.752676 0.8154 0.75 0.737763 0.752583 0.8155 0.75 0.7378 0.75249 0.8156 0.75 0.737838 0.752397 0.8157 0.75 0.737876 0.752304 0.8158 0.75 0.737914 0.75221 0.8159 0.75 0.737952 0.752116 0.816 0.75 0.73799 0.752022 0.8161 0.75 0.738028 0.751928 0.8162 0.75 0.738066 0.751834 0.8163 0.75 0.738104 0.751739 0.8164 0.75 0.738143 0.751644 0.8165 0.75 0.738181 0.75155 0.8166 0.75 0.738219 0.751455 0.8167 0.75 0.738258 0.751359 0.8168 0.75 0.738296 0.751264 0.8169 0.75 0.738335 0.751169 0.817 0.75 0.738374 0.751073 0.8171 0.75 0.738412 0.750978 0.8172 0.75 0.738451 0.750882 0.8173 0.75 0.73849 0.750787 0.8174 0.75 0.738528 0.750691 0.8175 0.75 0.738567 0.750595 0.8176 0.75 0.738606 0.750499 0.8177 0.75 0.738645 0.750404 0.8178 0.75 0.738684 0.750308 0.8179 0.75 0.738723 0.750212 0.818 0.75 0.738763 0.750116 0.8181 0.75 0.738802 0.75002 0.8182 0.75 0.738841 0.749925 0.8183 0.75 0.73888 0.749829 0.8184 0.75 0.73892 0.749733 0.8185 0.75 0.738959 0.749638 0.8186 0.75 0.738999 0.749542 0.8187 0.75 0.739038 0.749447 0.8188 0.75 0.739078 0.749351 0.8189 0.75 0.739117 0.749256 0.819 0.75 0.739157 0.749161 0.8191 0.75 0.739197 0.749066 0.8192 0.75 0.739236 0.748971 0.8193 0.75 0.739276 0.748877 0.8194 0.75 0.739316 0.748782 0.8195 0.75 0.739356 0.748688 0.8196 0.75 0.739396 0.748594 0.8197 0.75 0.739436 0.7485 0.8198 0.75 0.739476 0.748406 0.8199 0.75 0.739516 0.748312 0.82 0.75 0.739556 0.748219 0.8201 0.75 0.739596 0.748126 0.8202 0.75 0.739637 0.748033 0.8203 0.75 0.739677 0.747941 0.8204 0.75 0.739717 0.747848 0.8205 0.75 0.739758 0.747756 0.8206 0.75 0.739798 0.747665 0.8207 0.75 0.739839 0.747573 0.8208 0.75 0.739879 0.747482 0.8209 0.75 0.73992 0.747391 0.821 0.75 0.73996 0.747301 0.8211 0.75 0.740001 0.747211 0.8212 0.75 0.740042 0.747121 0.8213 0.75 0.740083 0.747031 0.8214 0.75 0.740123 0.746942 0.8215 0.75 0.740164 0.746854 0.8216 0.75 0.740205 0.746766 0.8217 0.75 0.740246 0.746678 0.8218 0.75 0.740287 0.74659 0.8219 0.75 0.740328 0.746503 0.822 0.75 0.740369 0.746417 0.8221 0.75 0.74041 0.74633 0.8222 0.75 0.740451 0.746245 0.8223 0.75 0.740492 0.74616 0.8224 0.75 0.740534 0.746075 0.8225 0.75 0.740575 0.745991 0.8226 0.75 0.740616 0.745907 0.8227 0.75 0.740658 0.745823 0.8228 0.75 0.740699 0.745741 0.8229 0.75 0.74074 0.745658 0.823 0.75 0.740782 0.745577 0.8231 0.75 0.740823 0.745496 0.8232 0.75 0.740865 0.745415 0.8233 0.75 0.740907 0.745335 0.8234 0.75 0.740948 0.745255 0.8235 0.75 0.74099 0.745176 0.8236 0.75 0.741032 0.745098 0.8237 0.75 0.741073 0.74502 0.8238 0.75 0.741115 0.744943 0.8239 0.75 0.741157 0.744867 0.824 0.75 0.741199 0.744791 0.8241 0.75 0.741241 0.744715 0.8242 0.75 0.741283 0.744641 0.8243 0.75 0.741325 0.744567 0.8244 0.75 0.741367 0.744493 0.8245 0.75 0.741409 0.744421 0.8246 0.75 0.741451 0.744349 0.8247 0.75 0.741493 0.744277 0.8248 0.75 0.741535 0.744207 0.8249 0.75 0.741577 0.744137 0.825 0.75 0.741619 0.744068 0.8251 0.75 0.741661 0.743999 0.8252 0.75 0.741704 0.743931 0.8253 0.75 0.741746 0.743864 0.8254 0.75 0.741788 0.743798 0.8255 0.75 0.741831 0.743732 0.8256 0.75 0.741873 0.743668 0.8257 0.75 0.741916 0.743604 0.8258 0.75 0.741958 0.74354 0.8259 0.75 0.742001 0.743478 0.826 0.75 0.742043 0.743416 0.8261 0.75 0.742086 0.743355 0.8262 0.75 0.742128 0.743295 0.8263 0.75 0.742171 0.743236 0.8264 0.75 0.742214 0.743177 0.8265 0.75 0.742256 0.743119 0.8266 0.75 0.742299 0.743062 0.8267 0.75 0.742342 0.743006 0.8268 0.75 0.742385 0.742951 0.8269 0.75 0.742427 0.742897 0.827 0.75 0.74247 0.742843 0.8271 0.75 0.742513 0.742791 0.8272 0.75 0.742556 0.742739 0.8273 0.75 0.742599 0.742688 0.8274 0.75 0.742642 0.742638 0.8275 0.75 0.742685 0.742589 0.8276 0.75 0.742728 0.742541 0.8277 0.75 0.742771 0.742493 0.8278 0.75 0.742814 0.742447 0.8279 0.75 0.742857 0.742401 0.828 0.75 0.7429 0.742357 0.8281 0.75 0.742943 0.742313 0.8282 0.75 0.742986 0.74227 0.8283 0.75 0.74303 0.742228 0.8284 0.75 0.743073 0.742187 0.8285 0.75 0.743116 0.742147 0.8286 0.75 0.743159 0.742108 0.8287 0.75 0.743203 0.74207 0.8288 0.75 0.743246 0.742033 0.8289 0.75 0.743289 0.741997 0.829 0.75 0.743333 0.741961 0.8291 0.75 0.743376 0.741927 0.8292 0.75 0.743419 0.741894 0.8293 0.75 0.743463 0.741861 0.8294 0.75 0.743506 0.74183 0.8295 0.75 0.74355 0.7418 0.8296 0.75 0.743593 0.74177 0.8297 0.75 0.743637 0.741742 0.8298 0.75 0.74368 0.741714 0.8299 0.75 0.743724 0.741688 0.83 0.75 0.743767 0.741662 0.8301 0.75 0.743811 0.741638 0.8302 0.75 0.743854 0.741615 0.8303 0.75 0.743898 0.741592 0.8304 0.75 0.743942 0.741571 0.8305 0.75 0.743985 0.74155 0.8306 0.75 0.744029 0.741531 0.8307 0.75 0.744073 0.741513 0.8308 0.75 0.744116 0.741495 0.8309 0.75 0.74416 0.741479 0.831 0.75 0.744204 0.741464 0.8311 0.75 0.744248 0.741449 0.8312 0.75 0.744291 0.741436 0.8313 0.75 0.744335 0.741424 0.8314 0.75 0.744379 0.741413 0.8315 0.75 0.744423 0.741402 0.8316 0.75 0.744467 0.741393 0.8317 0.75 0.744511 0.741385 0.8318 0.75 0.744554 0.741378 0.8319 0.75 0.744598 0.741372 0.832 0.75 0.744642 0.741367 0.8321 0.75 0.744686 0.741363 0.8322 0.75 0.74473 0.74136 0.8323 0.75 0.744774 0.741359 0.8324 0.75 0.744818 0.741358 0.8325 0.75 0.744862 0.741358 0.8326 0.75 0.744906 0.741359 0.8327 0.75 0.74495 0.741362 0.8328 0.75 0.744994 0.741365 0.8329 0.75 0.745038 0.741369 0.833 0.75 0.745082 0.741375 0.8331 0.75 0.745126 0.741381 0.8332 0.75 0.74517 0.741389 0.8333 0.75 0.745214 0.741397 0.8334 0.75 0.745258 0.741407 0.8335 0.75 0.745302 0.741417 0.8336 0.75 0.745346 0.741429 0.8337 0.75 0.74539 0.741442 0.8338 0.75 0.745435 0.741455 0.8339 0.75 0.745479 0.74147 0.834 0.75 0.745523 0.741486 0.8341 0.75 0.745567 0.741503 0.8342 0.75 0.745611 0.741521 0.8343 0.75 0.745655 0.74154 0.8344 0.75 0.745699 0.741559 0.8345 0.75 0.745744 0.74158 0.8346 0.75 0.745788 0.741602 0.8347 0.75 0.745832 0.741625 0.8348 0.75 0.745876 0.741649 0.8349 0.75 0.74592 0.741674 0.835 0.75 0.745964 0.7417 0.8351 0.75 0.746009 0.741727 0.8352 0.75 0.746053 0.741755 0.8353 0.75 0.746097 0.741784 0.8354 0.75 0.746141 0.741814 0.8355 0.75 0.746186 0.741845 0.8356 0.75 0.74623 0.741877 0.8357 0.75 0.746274 0.74191 0.8358 0.75 0.746318 0.741944 0.8359 0.75 0.746362 0.741979 0.836 0.75 0.746407 0.742014 0.8361 0.75 0.746451 0.742051 0.8362 0.75 0.746495 0.742089 0.8363 0.75 0.746539 0.742128 0.8364 0.75 0.746584 0.742167 0.8365 0.75 0.746628 0.742208 0.8366 0.75 0.746672 0.74225 0.8367 0.75 0.746716 0.742292 0.8368 0.75 0.746761 0.742336 0.8369 0.75 0.746805 0.74238 0.837 0.75 0.746849 0.742425 0.8371 0.75 0.746893 0.742471 0.8372 0.75 0.746937 0.742519 0.8373 0.75 0.746982 0.742567 0.8374 0.75 0.747026 0.742616 0.8375 0.75 0.74707 0.742665 0.8376 0.75 0.747114 0.742716 0.8377 0.75 0.747159 0.742768 0.8378 0.75 0.747203 0.74282 0.8379 0.75 0.747247 0.742874 0.838 0.75 0.747291 0.742928 0.8381 0.75 0.747335 0.742983 0.8382 0.75 0.74738 0.743039 0.8383 0.75 0.747424 0.743096 0.8384 0.75 0.747468 0.743153 0.8385 0.75 0.747512 0.743212 0.8386 0.75 0.747556 0.743271 0.8387 0.75 0.747601 0.743331 0.8388 0.75 0.747645 0.743392 0.8389 0.75 0.747689 0.743454 0.839 0.75 0.747733 0.743516 0.8391 0.75 0.747777 0.74358 0.8392 0.75 0.747821 0.743644 0.8393 0.75 0.747865 0.743709 0.8394 0.75 0.74791 0.743774 0.8395 0.75 0.747954 0.743841 0.8396 0.75 0.747998 0.743908 0.8397 0.75 0.748042 0.743975 0.8398 0.75 0.748086 0.744044 0.8399 0.75 0.74813 0.744113 0.84 0.75 0.748174 0.744183 0.8401 0.75 0.748218 0.744254 0.8402 0.75 0.748262 0.744326 0.8403 0.75 0.748306 0.744398 0.8404 0.75 0.74835 0.74447 0.8405 0.75 0.748394 0.744544 0.8406 0.75 0.748438 0.744618 0.8407 0.75 0.748482 0.744693 0.8408 0.75 0.748526 0.744768 0.8409 0.75 0.74857 0.744844 0.841 0.75 0.748614 0.744921 0.8411 0.75 0.748658 0.744998 0.8412 0.75 0.748702 0.745076 0.8413 0.75 0.748746 0.745155 0.8414 0.75 0.74879 0.745234 0.8415 0.75 0.748834 0.745313 0.8416 0.75 0.748878 0.745394 0.8417 0.75 0.748922 0.745474 0.8418 0.75 0.748966 0.745556 0.8419 0.75 0.749009 0.745638 0.842 0.75 0.749053 0.74572 0.8421 0.75 0.749097 0.745803 0.8422 0.75 0.749141 0.745886 0.8423 0.75 0.749184 0.74597 0.8424 0.75 0.749228 0.746055 0.8425 0.75 0.749272 0.746139 0.8426 0.75 0.749316 0.746225 0.8427 0.75 0.749359 0.746311 0.8428 0.75 0.749403 0.746397 0.8429 0.75 0.749447 0.746483 0.843 0.75 0.74949 0.746571 0.8431 0.75 0.749534 0.746658 0.8432 0.75 0.749578 0.746746 0.8433 0.75 0.749621 0.746834 0.8434 0.75 0.749665 0.746923 0.8435 0.75 0.749708 0.747012 0.8436 0.75 0.749752 0.747101 0.8437 0.75 0.749795 0.747191 0.8438 0.75 0.749839 0.747281 0.8439 0.75 0.749882 0.747371 0.844 0.75 0.749926 0.747462 0.8441 0.75 0.749969 0.747553 0.8442 0.75 0.750012 0.747644 0.8443 0.75 0.750056 0.747736 0.8444 0.75 0.750099 0.747828 0.8445 0.75 0.750142 0.74792 0.8446 0.75 0.750186 0.748012 0.8447 0.75 0.750229 0.748105 0.8448 0.75 0.750272 0.748197 0.8449 0.75 0.750316 0.74829 0.845 0.75 0.750359 0.748383 0.8451 0.75 0.750402 0.748477 0.8452 0.75 0.750445 0.74857 0.8453 0.75 0.750488 0.748664 0.8454 0.75 0.750531 0.748758 0.8455 0.75 0.750574 0.748852 0.8456 0.75 0.750617 0.748946 0.8457 0.75 0.75066 0.74904 0.8458 0.75 0.750703 0.749134 0.8459 0.75 0.750746 0.749228 0.846 0.75 0.750789 0.749323 0.8461 0.75 0.750832 0.749417 0.8462 0.75 0.750875 0.749512 0.8463 0.75 0.750918 0.749606 0.8464 0.75 0.750961 0.749701 0.8465 0.75 0.751003 0.749795 0.8466 0.75 0.751046 0.74989 0.8467 0.75 0.751089 0.749985 0.8468 0.75 0.751132 0.750079 0.8469 0.75 0.751174 0.750174 0.847 0.75 0.751217 0.750268 0.8471 0.75 0.75126 0.750363 0.8472 0.75 0.751302 0.750457 0.8473 0.75 0.751345 0.750551 0.8474 0.75 0.751387 0.750645 0.8475 0.75 0.75143 0.750739 0.8476 0.75 0.751472 0.750833 0.8477 0.75 0.751515 0.750927 0.8478 0.75 0.751557 0.751021 0.8479 0.75 0.751599 0.751114 0.848 0.75 0.751642 0.751208 0.8481 0.75 0.751684 0.751301 0.8482 0.75 0.751726 0.751394 0.8483 0.75 0.751768 0.751486 0.8484 0.75 0.75181 0.751579 0.8485 0.75 0.751853 0.751671 0.8486 0.75 0.751895 0.751763 0.8487 0.75 0.751937 0.751855 0.8488 0.75 0.751979 0.751946 0.8489 0.75 0.752021 0.752038 0.849 0.75 0.752063 0.752129 0.8491 0.75 0.752105 0.752219 0.8492 0.75 0.752146 0.75231 0.8493 0.75 0.752188 0.7524 0.8494 0.75 0.75223 0.752489 0.8495 0.75 0.752272 0.752579 0.8496 0.75 0.752314 0.752668 0.8497 0.75 0.752355 0.752756 0.8498 0.75 0.752397 0.752844 0.8499 0.75 0.752439 0.752932 0.85 0.75 0.75248 0.753019 0.8501 0.75 0.752522 0.753106 0.8502 0.75 0.752563 0.753193 0.8503 0.75 0.752605 0.753279 0.8504 0.75 0.752646 0.753365 0.8505 0.75 0.752687 0.75345 0.8506 0.75 0.752729 0.753534 0.8507 0.75 0.75277 0.753619 0.8508 0.75 0.752811 0.753702 0.8509 0.75 0.752852 0.753786 0.851 0.75 0.752893 0.753868 0.8511 0.75 0.752935 0.75395 0.8512 0.75 0.752976 0.754032 0.8513 0.75 0.753017 0.754113 0.8514 0.75 0.753058 0.754193 0.8515 0.75 0.753098 0.754273 0.8516 0.75 0.753139 0.754353 0.8517 0.75 0.75318 0.754431 0.8518 0.75 0.753221 0.754509 0.8519 0.75 0.753262 0.754587 0.852 0.75 0.753302 0.754664 0.8521 0.75 0.753343 0.75474 0.8522 0.75 0.753384 0.754815 0.8523 0.75 0.753424 0.75489 0.8524 0.75 0.753465 0.754964 0.8525 0.75 0.753505 0.755038 0.8526 0.75 0.753546 0.755111 0.8527 0.75 0.753586 0.755183 0.8528 0.75 0.753626 0.755254 0.8529 0.75 0.753667 0.755325 0.853 0.75 0.753707 0.755395 0.8531 0.75 0.753747 0.755464 0.8532 0.75 0.753787 0.755533 0.8533 0.75 0.753827 0.7556 0.8534 0.75 0.753867 0.755667 0.8535 0.75 0.753907 0.755733 0.8536 0.75 0.753947 0.755799 0.8537 0.75 0.753987 0.755863 0.8538 0.75 0.754027 0.755927 0.8539 0.75 0.754067 0.75599 0.854 0.75 0.754106 0.756052 0.8541 0.75 0.754146 0.756114 0.8542 0.75 0.754186 0.756174 0.8543 0.75 0.754225 0.756234 0.8544 0.75 0.754265 0.756292 0.8545 0.75 0.754304 0.75635 0.8546 0.75 0.754343 0.756407 0.8547 0.75 0.754383 0.756464 0.8548 0.75 0.754422 0.756519 0.8549 0.75 0.754461 0.756573 0.855 0.75 0.754501 0.756627 0.8551 0.75 0.75454 0.756679 0.8552 0.75 0.754579 0.756731 0.8553 0.75 0.754618 0.756782 0.8554 0.75 0.754657 0.756831 0.8555 0.75 0.754696 0.75688 0.8556 0.75 0.754734 0.756928 0.8557 0.75 0.754773 0.756975 0.8558 0.75 0.754812 0.757021 0.8559 0.75 0.754851 0.757066 0.856 0.75 0.754889 0.75711 0.8561 0.75 0.754928 0.757153 0.8562 0.75 0.754966 0.757195 0.8563 0.75 0.755005 0.757236 0.8564 0.75 0.755043 0.757276 0.8565 0.75 0.755081 0.757315 0.8566 0.75 0.75512 0.757353 0.8567 0.75 0.755158 0.757391 0.8568 0.75 0.755196 0.757427 0.8569 0.75 0.755234 0.757462 0.857 0.75 0.755272 0.757496 0.8571 0.75 0.75531 0.757529 0.8572 0.75 0.755348 0.75756 0.8573 0.75 0.755386 0.757591 0.8574 0.75 0.755424 0.757621 0.8575 0.75 0.755461 0.75765 0.8576 0.75 0.755499 0.757678 0.8577 0.75 0.755537 0.757704 0.8578 0.75 0.755574 0.75773 0.8579 0.75 0.755612 0.757754 0.858 0.75 0.755649 0.757778 0.8581 0.75 0.755686 0.7578 0.8582 0.75 0.755724 0.757821 0.8583 0.75 0.755761 0.757841 0.8584 0.75 0.755798 0.757861 0.8585 0.75 0.755835 0.757879 0.8586 0.75 0.755872 0.757895 0.8587 0.75 0.755909 0.757911 0.8588 0.75 0.755946 0.757926 0.8589 0.75 0.755983 0.75794 0.859 0.75 0.756019 0.757952 0.8591 0.75 0.756056 0.757963 0.8592 0.75 0.756093 0.757974 0.8593 0.75 0.756129 0.757983 0.8594 0.75 0.756166 0.757991 0.8595 0.75 0.756202 0.757998 0.8596 0.75 0.756238 0.758004 0.8597 0.75 0.756275 0.758009 0.8598 0.75 0.756311 0.758012 0.8599 0.75 0.756347 0.758015 0.86 0.75 0.756383 0.758016 0.8601 0.75 0.756419 0.758016 0.8602 0.75 0.756455 0.758015 0.8603 0.75 0.756491 0.758013 0.8604 0.75 0.756527 0.75801 0.8605 0.75 0.756562 0.758006 0.8606 0.75 0.756598 0.758001 0.8607 0.75 0.756634 0.757994 0.8608 0.75 0.756669 0.757987 0.8609 0.75 0.756704 0.757978 0.861 0.75 0.75674 0.757968 0.8611 0.75 0.756775 0.757957 0.8612 0.75 0.75681 0.757945 0.8613 0.75 0.756845 0.757932 0.8614 0.75 0.756881 0.757918 0.8615 0.75 0.756916 0.757902 0.8616 0.75 0.75695 0.757886 0.8617 0.75 0.756985 0.757868 0.8618 0.75 0.75702 0.75785 0.8619 0.75 0.757055 0.75783 0.862 0.75 0.757089 0.757809 0.8621 0.75 0.757124 0.757787 0.8622 0.75 0.757158 0.757764 0.8623 0.75 0.757193 0.75774 0.8624 0.75 0.757227 0.757714 0.8625 0.75 0.757261 0.757688 0.8626 0.75 0.757296 0.757661 0.8627 0.75 0.75733 0.757632 0.8628 0.75 0.757364 0.757602 0.8629 0.75 0.757398 0.757572 0.863 0.75 0.757431 0.75754 0.8631 0.75 0.757465 0.757507 0.8632 0.75 0.757499 0.757473 0.8633 0.75 0.757533 0.757438 0.8634 0.75 0.757566 0.757402 0.8635 0.75 0.7576 0.757365 0.8636 0.75 0.757633 0.757327 0.8637 0.75 0.757666 0.757288 0.8638 0.75 0.7577 0.757248 0.8639 0.75 0.757733 0.757207 0.864 0.75 0.757766 0.757165 0.8641 0.75 0.757799 0.757121 0.8642 0.75 0.757832 0.757077 0.8643 0.75 0.757864 0.757032 0.8644 0.75 0.757897 0.756986 0.8645 0.75 0.75793 0.756939 0.8646 0.75 0.757962 0.75689 0.8647 0.75 0.757995 0.756841 0.8648 0.75 0.758027 0.756791 0.8649 0.75 0.75806 0.75674 0.865 0.75 0.758092 0.756688 0.8651 0.75 0.758124 0.756635 0.8652 0.75 0.758156 0.756581 0.8653 0.75 0.758188 0.756526 0.8654 0.75 0.75822 0.75647 0.8655 0.75 0.758252 0.756414 0.8656 0.75 0.758284 0.756356 0.8657 0.75 0.758315 0.756297 0.8658 0.75 0.758347 0.756238 0.8659 0.75 0.758379 0.756177 0.866 0.75 0.75841 0.756116 0.8661 0.75 0.758441 0.756054 0.8662 0.75 0.758472 0.755991 0.8663 0.75 0.758504 0.755927 0.8664 0.75 0.758535 0.755863 0.8665 0.75 0.758566 0.755797 0.8666 0.75 0.758597 0.755731 0.8667 0.75 0.758627 0.755664 0.8668 0.75 0.758658 0.755596 0.8669 0.75 0.758689 0.755527 0.867 0.75 0.758719 0.755457 0.8671 0.75 0.75875 0.755387 0.8672 0.75 0.75878 0.755316 0.8673 0.75 0.75881 0.755244 0.8674 0.75 0.758841 0.755171 0.8675 0.75 0.758871 0.755098 0.8676 0.75 0.758901 0.755024 0.8677 0.75 0.758931 0.754949 0.8678 0.75 0.75896 0.754873 0.8679 0.75 0.75899 0.754797 0.868 0.75 0.75902 0.75472 0.8681 0.75 0.759049 0.754643 0.8682 0.75 0.759079 0.754564 0.8683 0.75 0.759108 0.754486 0.8684 0.75 0.759138 0.754406 0.8685 0.75 0.759167 0.754326 0.8686 0.75 0.759196 0.754245 0.8687 0.75 0.759225 0.754164 0.8688 0.75 0.759254 0.754082 0.8689 0.75 0.759283 0.753999 0.869 0.75 0.759311 0.753916 0.8691 0.75 0.75934 0.753832 0.8692 0.75 0.759369 0.753748 0.8693 0.75 0.759397 0.753663 0.8694 0.75 0.759425 0.753577 0.8695 0.75 0.759454 0.753492 0.8696 0.75 0.759482 0.753405 0.8697 0.75 0.75951 0.753318 0.8698 0.75 0.759538 0.753231 0.8699 0.75 0.759566 0.753143 0.87 0.75 0.759594 0.753055 0.8701 0.75 0.759621 0.752966 0.8702 0.75 0.759649 0.752877 0.8703 0.75 0.759676 0.752788 0.8704 0.75 0.759704 0.752698 0.8705 0.75 0.759731 0.752607 0.8706 0.75 0.759758 0.752517 0.8707 0.75 0.759785 0.752426 0.8708 0.75 0.759812 0.752334 0.8709 0.75 0.759839 0.752243 0.871 0.75 0.759866 0.752151 0.8711 0.75 0.759893 0.752058 0.8712 0.75 0.75992 0.751966 0.8713 0.75 0.759946 0.751873 0.8714 0.75 0.759972 0.751779 0.8715 0.75 0.759999 0.751686 0.8716 0.75 0.760025 0.751592 0.8717 0.75 0.760051 0.751499 0.8718 0.75 0.760077 0.751404 0.8719 0.75 0.760103 0.75131 0.872 0.75 0.760129 0.751216 0.8721 0.75 0.760155 0.751121 0.8722 0.75 0.76018 0.751026 0.8723 0.75 0.760206 0.750931 0.8724 0.75 0.760231 0.750836 0.8725 0.75 0.760257 0.750741 0.8726 0.75 0.760282 0.750646 0.8727 0.75 0.760307 0.750551 0.8728 0.75 0.760332 0.750455 0.8729 0.75 0.760357 0.75036 0.873 0.75 0.760382 0.750264 0.8731 0.75 0.760407 0.750169 0.8732 0.75 0.760431 0.750073 0.8733 0.75 0.760456 0.749978 0.8734 0.75 0.76048 0.749882 0.8735 0.75 0.760504 0.749787 0.8736 0.75 0.760529 0.749691 0.8737 0.75 0.760553 0.749596 0.8738 0.75 0.760577 0.749501 0.8739 0.75 0.760601 0.749405 0.874 0.75 0.760624 0.74931 0.8741 0.75 0.760648 0.749215 0.8742 0.75 0.760672 0.749121 0.8743 0.75 0.760695 0.749026 0.8744 0.75 0.760719 0.748931 0.8745 0.75 0.760742 0.748837 0.8746 0.75 0.760765 0.748743 0.8747 0.75 0.760788 0.748649 0.8748 0.75 0.760811 0.748555 0.8749 0.75 0.760834 0.748462 0.875 0.75 0.760857 0.748369 0.8751 0.75 0.760879 0.748276 0.8752 0.75 0.760902 0.748183 0.8753 0.75 0.760924 0.748091 0.8754 0.75 0.760946 0.747999 0.8755 0.75 0.760969 0.747907 0.8756 0.75 0.760991 0.747815 0.8757 0.75 0.761013 0.747724 0.8758 0.75 0.761035 0.747634 0.8759 0.75 0.761056 0.747543 0.876 0.75 0.761078 0.747453 0.8761 0.75 0.761099 0.747364 0.8762 0.75 0.761121 0.747275 0.8763 0.75 0.761142 0.747186 0.8764 0.75 0.761163 0.747098 0.8765 0.75 0.761185 0.74701 0.8766 0.75 0.761206 0.746923 0.8767 0.75 0.761226 0.746836 0.8768 0.75 0.761247 0.74675 0.8769 0.75 0.761268 0.746664 0.877 0.75 0.761288 0.746579 0.8771 0.75 0.761309 0.746494 0.8772 0.75 0.761329 0.74641 0.8773 0.75 0.76135 0.746327 0.8774 0.75 0.76137 0.746244 0.8775 0.75 0.76139 0.746161 0.8776 0.75 0.76141 0.74608 0.8777 0.75 0.761429 0.745999 0.8778 0.75 0.761449 0.745918 0.8779 0.75 0.761469 0.745838 0.878 0.75 0.761488 0.745759 0.8781 0.75 0.761507 0.745681 0.8782 0.75 0.761527 0.745603 0.8783 0.75 0.761546 0.745526 0.8784 0.75 0.761565 0.745449 0.8785 0.75 0.761583 0.745374 0.8786 0.75 0.761602 0.745299 0.8787 0.75 0.761621 0.745225 0.8788 0.75 0.761639 0.745151 0.8789 0.75 0.761658 0.745079 0.879 0.75 0.761676 0.745007 0.8791 0.75 0.761694 0.744936 0.8792 0.75 0.761712 0.744866 0.8793 0.75 0.76173 0.744796 0.8794 0.75 0.761748 0.744728 0.8795 0.75 0.761766 0.74466 0.8796 0.75 0.761784 0.744593 0.8797 0.75 0.761801 0.744527 0.8798 0.75 0.761818 0.744462 0.8799 0.75 0.761836 0.744398 0.88 0.75 0.761853 0.744334 0.8801 0.75 0.76187 0.744272 0.8802 0.75 0.761887 0.744211 0.8803 0.75 0.761904 0.74415 0.8804 0.75 0.76192 0.74409 0.8805 0.75 0.761937 0.744032 0.8806 0.75 0.761953 0.743974 0.8807 0.75 0.76197 0.743917 0.8808 0.75 0.761986 0.743861 0.8809 0.75 0.762002 0.743807 0.881 0.75 0.762018 0.743753 0.8811 0.75 0.762034 0.7437 0.8812 0.75 0.76205 0.743648 0.8813 0.75 0.762065 0.743598 0.8814 0.75 0.762081 0.743548 0.8815 0.75 0.762096 0.743499 0.8816 0.75 0.762111 0.743452 0.8817 0.75 0.762126 0.743405 0.8818 0.75 0.762142 0.74336 0.8819 0.75 0.762156 0.743315 0.882 0.75 0.762171 0.743272 0.8821 0.75 0.762186 0.74323 0.8822 0.75 0.7622 0.743189 0.8823 0.75 0.762215 0.743149 0.8824 0.75 0.762229 0.74311 0.8825 0.75 0.762243 0.743072 0.8826 0.75 0.762257 0.743035 0.8827 0.75 0.762271 0.743 0.8828 0.75 0.762285 0.742965 0.8829 0.75 0.762299 0.742932 0.883 0.75 0.762312 0.7429 0.8831 0.75 0.762326 0.742869 0.8832 0.75 0.762339 0.742839 0.8833 0.75 0.762353 0.742811 0.8834 0.75 0.762366 0.742784 0.8835 0.75 0.762379 0.742757 0.8836 0.75 0.762391 0.742732 0.8837 0.75 0.762404 0.742708 0.8838 0.75 0.762417 0.742686 0.8839 0.75 0.762429 0.742664 0.884 0.75 0.762442 0.742644 0.8841 0.75 0.762454 0.742625 0.8842 0.75 0.762466 0.742607 0.8843 0.75 0.762478 0.742591 0.8844 0.75 0.76249 0.742575 0.8845 0.75 0.762502 0.742561 0.8846 0.75 0.762513 0.742548 0.8847 0.75 0.762525 0.742536 0.8848 0.75 0.762536 0.742526 0.8849 0.75 0.762547 0.742516 0.885 0.75 0.762558 0.742508 0.8851 0.75 0.762569 0.742502 0.8852 0.75 0.76258 0.742496 0.8853 0.75 0.762591 0.742492 0.8854 0.75 0.762602 0.742489 0.8855 0.75 0.762612 0.742487 0.8856 0.75 0.762623 0.742486 0.8857 0.75 0.762633 0.742487 0.8858 0.75 0.762643 0.742489 0.8859 0.75 0.762653 0.742492 0.886 0.75 0.762663 0.742497 0.8861 0.75 0.762673 0.742502 0.8862 0.75 0.762682 0.742509 0.8863 0.75 0.762692 0.742517 0.8864 0.75 0.762701 0.742527 0.8865 0.75 0.76271 0.742537 0.8866 0.75 0.76272 0.742549 0.8867 0.75 0.762729 0.742562 0.8868 0.75 0.762737 0.742577 0.8869 0.75 0.762746 0.742592 0.887 0.75 0.762755 0.742609 0.8871 0.75 0.762763 0.742627 0.8872 0.75 0.762772 0.742647 0.8873 0.75 0.76278 0.742667 0.8874 0.75 0.762788 0.742689 0.8875 0.75 0.762796 0.742712 0.8876 0.75 0.762804 0.742736 0.8877 0.75 0.762812 0.742762 0.8878 0.75 0.762819 0.742788 0.8879 0.75 0.762827 0.742816 0.888 0.75 0.762834 0.742845 0.8881 0.75 0.762841 0.742876 0.8882 0.75 0.762848 0.742907 0.8883 0.75 0.762855 0.74294 0.8884 0.75 0.762862 0.742974 0.8885 0.75 0.762869 0.743009 0.8886 0.75 0.762875 0.743045 0.8887 0.75 0.762882 0.743082 0.8888 0.75 0.762888 0.743121 0.8889 0.75 0.762894 0.743161 0.889 0.75 0.7629 0.743202 0.8891 0.75 0.762906 0.743244 0.8892 0.75 0.762912 0.743287 0.8893 0.75 0.762918 0.743332 0.8894 0.75 0.762923 0.743377 0.8895 0.75 0.762929 0.743424 0.8896 0.75 0.762934 0.743471 0.8897 0.75 0.762939 0.74352 0.8898 0.75 0.762944 0.74357 0.8899 0.75 0.762949 0.743621 0.89 0.75 0.762954 0.743674 0.8901 0.75 0.762958 0.743727 0.8902 0.75 0.762963 0.743781 0.8903 0.75 0.762967 0.743836 0.8904 0.75 0.762972 0.743893 0.8905 0.75 0.762976 0.74395 0.8906 0.75 0.76298 0.744009 0.8907 0.75 0.762984 0.744068 0.8908 0.75 0.762987 0.744129 0.8909 0.75 0.762991 0.744191 0.891 0.75 0.762994 0.744253 0.8911 0.75 0.762998 0.744317 0.8912 0.75 0.763001 0.744381 0.8913 0.75 0.763004 0.744447 0.8914 0.75 0.763007 0.744513 0.8915 0.75 0.76301 0.744581 0.8916 0.75 0.763012 0.744649 0.8917 0.75 0.763015 0.744718 0.8918 0.75 0.763017 0.744789 0.8919 0.75 0.76302 0.74486 0.892 0.75 0.763022 0.744932 0.8921 0.75 0.763024 0.745004 0.8922 0.75 0.763026 0.745078 0.8923 0.75 0.763027 0.745153 0.8924 0.75 0.763029 0.745228 0.8925 0.75 0.76303 0.745304 0.8926 0.75 0.763032 0.745381 0.8927 0.75 0.763033 0.745459 0.8928 0.75 0.763034 0.745538 0.8929 0.75 0.763035 0.745617 0.893 0.75 0.763036 0.745698 0.8931 0.75 0.763037 0.745779 0.8932 0.75 0.763037 0.74586 0.8933 0.75 0.763038 0.745943 0.8934 0.75 0.763038 0.746026 0.8935 0.75 0.763038 0.74611 0.8936 0.75 0.763038 0.746194 0.8937 0.75 0.763038 0.746279 0.8938 0.75 0.763038 0.746365 0.8939 0.75 0.763037 0.746452 0.894 0.75 0.763037 0.746539 0.8941 0.75 0.763036 0.746626 0.8942 0.75 0.763035 0.746715 0.8943 0.75 0.763035 0.746804 0.8944 0.75 0.763034 0.746893 0.8945 0.75 0.763032 0.746983 0.8946 0.75 0.763031 0.747073 0.8947 0.75 0.76303 0.747164 0.8948 0.75 0.763028 0.747256 0.8949 0.75 0.763026 0.747348 0.895 0.75 0.763025 0.74744 0.8951 0.75 0.763023 0.747533 0.8952 0.75 0.763021 0.747627 0.8953 0.75 0.763018 0.74772 0.8954 0.75 0.763016 0.747815 0.8955 0.75 0.763013 0.747909 0.8956 0.75 0.763011 0.748004 0.8957 0.75 0.763008 0.748099 0.8958 0.75 0.763005 0.748195 0.8959 0.75 0.763002 0.748291 0.896 0.75 0.762999 0.748387 0.8961 0.75 0.762996 0.748484 0.8962 0.75 0.762992 0.748581 0.8963 0.75 0.762989 0.748678 0.8964 0.75 0.762985 0.748775 0.8965 0.75 0.762981 0.748872 0.8966 0.75 0.762977 0.74897 0.8967 0.75 0.762973 0.749068 0.8968 0.75 0.762969 0.749166 0.8969 0.75 0.762964 0.749264 0.897 0.75 0.76296 0.749363 0.8971 0.75 0.762955 0.749461 0.8972 0.75 0.762951 0.749559 0.8973 0.75 0.762946 0.749658 0.8974 0.75 0.762941 0.749757 0.8975 0.75 0.762935 0.749855 0.8976 0.75 0.76293 0.749954 0.8977 0.75 0.762925 0.750053 0.8978 0.75 0.762919 0.750152 0.8979 0.75 0.762913 0.75025 0.898 0.75 0.762908 0.750349 0.8981 0.75 0.762902 0.750447 0.8982 0.75 0.762896 0.750546 0.8983 0.75 0.762889 0.750644 0.8984 0.75 0.762883 0.750743 0.8985 0.75 0.762876 0.750841 0.8986 0.75 0.76287 0.750939 0.8987 0.75 0.762863 0.751036 0.8988 0.75 0.762856 0.751134 0.8989 0.75 0.762849 0.751231 0.899 0.75 0.762842 0.751328 0.8991 0.75 0.762835 0.751425 0.8992 0.75 0.762827 0.751522 0.8993 0.75 0.762819 0.751618 0.8994 0.75 0.762812 0.751714 0.8995 0.75 0.762804 0.75181 0.8996 0.75 0.762796 0.751905 0.8997 0.75 0.762788 0.752 0.8998 0.75 0.76278 0.752095 0.8999 0.75 0.762771 0.752189 0.9 0.75 0.762763 0.752283 0.9001 0.75 0.762754 0.752376 0.9002 0.75 0.762745 0.752469 0.9003 0.75 0.762736 0.752562 0.9004 0.75 0.762727 0.752654 0.9005 0.75 0.762718 0.752745 0.9006 0.75 0.762709 0.752836 0.9007 0.75 0.762699 0.752927 0.9008 0.75 0.76269 0.753017 0.9009 0.75 0.76268 0.753106 0.901 0.75 0.76267 0.753195 0.9011 0.75 0.76266 0.753283 0.9012 0.75 0.76265 0.75337 0.9013 0.75 0.76264 0.753457 0.9014 0.75 0.762629 0.753544 0.9015 0.75 0.762619 0.753629 0.9016 0.75 0.762608 0.753714 0.9017 0.75 0.762597 0.753798 0.9018 0.75 0.762586 0.753882 0.9019 0.75 0.762575 0.753964 0.902 0.75 0.762564 0.754046 0.9021 0.75 0.762553 0.754127 0.9022 0.75 0.762541 0.754208 0.9023 0.75 0.76253 0.754287 0.9024 0.75 0.762518 0.754366 0.9025 0.75 0.762506 0.754444 0.9026 0.75 0.762494 0.754521 0.9027 0.75 0.762482 0.754597 0.9028 0.75 0.76247 0.754673 0.9029 0.75 0.762457 0.754747 0.903 0.75 0.762445 0.754821 0.9031 0.75 0.762432 0.754893 0.9032 0.75 0.762419 0.754965 0.9033 0.75 0.762406 0.755036 0.9034 0.75 0.762393 0.755105 0.9035 0.75 0.76238 0.755174 0.9036 0.75 0.762367 0.755242 0.9037 0.75 0.762353 0.755309 0.9038 0.75 0.76234 0.755374 0.9039 0.75 0.762326 0.755439 0.904 0.75 0.762312 0.755503 0.9041 0.75 0.762298 0.755565 0.9042 0.75 0.762284 0.755627 0.9043 0.75 0.76227 0.755687 0.9044 0.75 0.762256 0.755746 0.9045 0.75 0.762241 0.755805 0.9046 0.75 0.762226 0.755862 0.9047 0.75 0.762212 0.755918 0.9048 0.75 0.762197 0.755972 0.9049 0.75 0.762182 0.756026 0.905 0.75 0.762167 0.756078 0.9051 0.75 0.762151 0.75613 0.9052 0.75 0.762136 0.75618 0.9053 0.75 0.76212 0.756228 0.9054 0.75 0.762105 0.756276 0.9055 0.75 0.762089 0.756322 0.9056 0.75 0.762073 0.756367 0.9057 0.75 0.762057 0.756411 0.9058 0.75 0.76204 0.756454 0.9059 0.75 0.762024 0.756495 0.906 0.75 0.762008 0.756535 0.9061 0.75 0.761991 0.756574 0.9062 0.75 0.761974 0.756612 0.9063 0.75 0.761957 0.756648 0.9064 0.75 0.76194 0.756683 0.9065 0.75 0.761923 0.756716 0.9066 0.75 0.761906 0.756748 0.9067 0.75 0.761889 0.756779 0.9068 0.75 0.761871 0.756809 0.9069 0.75 0.761853 0.756837 0.907 0.75 0.761836 0.756864 0.9071 0.75 0.761818 0.756889 0.9072 0.75 0.7618 0.756913 0.9073 0.75 0.761781 0.756936 0.9074 0.75 0.761763 0.756957 0.9075 0.75 0.761745 0.756977 0.9076 0.75 0.761726 0.756996 0.9077 0.75 0.761707 0.757013 0.9078 0.75 0.761689 0.757028 0.9079 0.75 0.76167 0.757043 0.908 0.75 0.761651 0.757056 0.9081 0.75 0.761631 0.757067 0.9082 0.75 0.761612 0.757077 0.9083 0.75 0.761593 0.757086 0.9084 0.75 0.761573 0.757093 0.9085 0.75 0.761553 0.757099 0.9086 0.75 0.761534 0.757103 0.9087 0.75 0.761514 0.757106 0.9088 0.75 0.761493 0.757107 0.9089 0.75 0.761473 0.757107 0.909 0.75 0.761453 0.757106 0.9091 0.75 0.761432 0.757103 0.9092 0.75 0.761412 0.757099 0.9093 0.75 0.761391 0.757093 0.9094 0.75 0.76137 0.757086 0.9095 0.75 0.761349 0.757077 0.9096 0.75 0.761328 0.757067 0.9097 0.75 0.761307 0.757055 0.9098 0.75 0.761285 0.757042 0.9099 0.75 0.761264 0.757028 0.91 0.75 0.761242 0.757012 0.9101 0.75 0.761221 0.756995 0.9102 0.75 0.761199 0.756976 0.9103 0.75 0.761177 0.756956 0.9104 0.75 0.761155 0.756934 0.9105 0.75 0.761132 0.756911 0.9106 0.75 0.76111 0.756887 0.9107 0.75 0.761087 0.756861 0.9108 0.75 0.761065 0.756833 0.9109 0.75 0.761042 0.756805 0.911 0.75 0.761019 0.756775 0.9111 0.75 0.760996 0.756743 0.9112 0.75 0.760973 0.75671 0.9113 0.75 0.76095 0.756676 0.9114 0.75 0.760927 0.75664 0.9115 0.75 0.760903 0.756603 0.9116 0.75 0.760879 0.756564 0.9117 0.75 0.760856 0.756524 0.9118 0.75 0.760832 0.756483 0.9119 0.75 0.760808 0.756441 0.912 0.75 0.760784 0.756397 0.9121 0.75 0.760759 0.756351 0.9122 0.75 0.760735 0.756305 0.9123 0.75 0.760711 0.756257 0.9124 0.75 0.760686 0.756208 0.9125 0.75 0.760661 0.756157 0.9126 0.75 0.760637 0.756105 0.9127 0.75 0.760612 0.756052 0.9128 0.75 0.760586 0.755998 0.9129 0.75 0.760561 0.755942 0.913 0.75 0.760536 0.755885 0.9131 0.75 0.760511 0.755827 0.9132 0.75 0.760485 0.755767 0.9133 0.75 0.760459 0.755707 0.9134 0.75 0.760433 0.755645 0.9135 0.75 0.760408 0.755582 0.9136 0.75 0.760382 0.755518 0.9137 0.75 0.760355 0.755452 0.9138 0.75 0.760329 0.755386 0.9139 0.75 0.760303 0.755318 0.914 0.75 0.760276 0.755249 0.9141 0.75 0.760249 0.755179 0.9142 0.75 0.760223 0.755108 0.9143 0.75 0.760196 0.755035 0.9144 0.75 0.760169 0.754962 0.9145 0.75 0.760142 0.754888 0.9146 0.75 0.760115 0.754812 0.9147 0.75 0.760087 0.754736 0.9148 0.75 0.76006 0.754658 0.9149 0.75 0.760032 0.75458 0.915 0.75 0.760004 0.7545 0.9151 0.75 0.759977 0.75442 0.9152 0.75 0.759949 0.754338 0.9153 0.75 0.759921 0.754256 0.9154 0.75 0.759893 0.754173 0.9155 0.75 0.759864 0.754088 0.9156 0.75 0.759836 0.754003 0.9157 0.75 0.759807 0.753917 0.9158 0.75 0.759779 0.75383 0.9159 0.75 0.75975 0.753742 0.916 0.75 0.759721 0.753654 0.9161 0.75 0.759692 0.753565 0.9162 0.75 0.759663 0.753474 0.9163 0.75 0.759634 0.753384 0.9164 0.75 0.759605 0.753292 0.9165 0.75 0.759575 0.7532 0.9166 0.75 0.759546 0.753106 0.9167 0.75 0.759516 0.753013 0.9168 0.75 0.759486 0.752918 0.9169 0.75 0.759456 0.752823 0.917 0.75 0.759426 0.752727 0.9171 0.75 0.759396 0.752631 0.9172 0.75 0.759366 0.752534 0.9173 0.75 0.759336 0.752437 0.9174 0.75 0.759305 0.752338 0.9175 0.75 0.759275 0.75224 0.9176 0.75 0.759244 0.752141 0.9177 0.75 0.759213 0.752041 0.9178 0.75 0.759183 0.751941 0.9179 0.75 0.759152 0.751841 0.918 0.75 0.75912 0.75174 0.9181 0.75 0.759089 0.751639 0.9182 0.75 0.759058 0.751537 0.9183 0.75 0.759027 0.751435 0.9184 0.75 0.758995 0.751332 0.9185 0.75 0.758963 0.75123 0.9186 0.75 0.758932 0.751127 0.9187 0.75 0.7589 0.751024 0.9188 0.75 0.758868 0.75092 0.9189 0.75 0.758836 0.750816 0.919 0.75 0.758804 0.750713 0.9191 0.75 0.758771 0.750609 0.9192 0.75 0.758739 0.750504 0.9193 0.75 0.758707 0.7504 0.9194 0.75 0.758674 0.750296 0.9195 0.75 0.758641 0.750191 0.9196 0.75 0.758608 0.750087 0.9197 0.75 0.758576 0.749982 0.9198 0.75 0.758543 0.749877 0.9199 0.75 0.758509 0.749773 0.92 0.75 0.758476 0.749668 0.9201 0.75 0.758443 0.749564 0.9202 0.75 0.75841 0.749459 0.9203 0.75 0.758376 0.749355 0.9204 0.75 0.758342 0.749251 0.9205 0.75 0.758309 0.749147 0.9206 0.75 0.758275 0.749043 0.9207 0.75 0.758241 0.74894 0.9208 0.75 0.758207 0.748836 0.9209 0.75 0.758173 0.748733 0.921 0.75 0.758139 0.74863 0.9211 0.75 0.758104 0.748528 0.9212 0.75 0.75807 0.748425 0.9213 0.75 0.758035 0.748324 0.9214 0.75 0.758001 0.748222 0.9215 0.75 0.757966 0.748121 0.9216 0.75 0.757931 0.74802 0.9217 0.75 0.757896 0.74792 0.9218 0.75 0.757861 0.74782 0.9219 0.75 0.757826 0.747721 0.922 0.75 0.757791 0.747623 0.9221 0.75 0.757755 0.747524 0.9222 0.75 0.75772 0.747427 0.9223 0.75 0.757685 0.74733 0.9224 0.75 0.757649 0.747233 0.9225 0.75 0.757613 0.747138 0.9226 0.75 0.757577 0.747042 0.9227 0.75 0.757542 0.746948 0.9228 0.75 0.757506 0.746854 0.9229 0.75 0.75747 0.746761 0.923 0.75 0.757433 0.746669 0.9231 0.75 0.757397 0.746578 0.9232 0.75 0.757361 0.746487 0.9233 0.75 0.757324 0.746397 0.9234 0.75 0.757288 0.746308 0.9235 0.75 0.757251 0.74622 0.9236 0.75 0.757214 0.746133 0.9237 0.75 0.757178 0.746046 0.9238 0.75 0.757141 0.745961 0.9239 0.75 0.757104 0.745876 0.924 0.75 0.757067 0.745793 0.9241 0.75 0.757029 0.74571 0.9242 0.75 0.756992 0.745629 0.9243 0.75 0.756955 0.745548 0.9244 0.75 0.756917 0.745469 0.9245 0.75 0.75688 0.745391 0.9246 0.75 0.756842 0.745313 0.9247 0.75 0.756805 0.745237 0.9248 0.75 0.756767 0.745162 0.9249 0.75 0.756729 0.745088 0.925 0.75 0.756691 0.745016 0.9251 0.75 0.756653 0.744944 0.9252 0.75 0.756615 0.744874 0.9253 0.75 0.756577 0.744805 0.9254 0.75 0.756538 0.744737 0.9255 0.75 0.7565 0.744671 0.9256 0.75 0.756461 0.744606 0.9257 0.75 0.756423 0.744542 0.9258 0.75 0.756384 0.744479 0.9259 0.75 0.756345 0.744418 0.926 0.75 0.756307 0.744358 0.9261 0.75 0.756268 0.7443 0.9262 0.75 0.756229 0.744243 0.9263 0.75 0.75619 0.744187 0.9264 0.75 0.756151 0.744133 0.9265 0.75 0.756111 0.74408 0.9266 0.75 0.756072 0.744028 0.9267 0.75 0.756033 0.743978 0.9268 0.75 0.755993 0.74393 0.9269 0.75 0.755954 0.743883 0.927 0.75 0.755914 0.743838 0.9271 0.75 0.755875 0.743794 0.9272 0.75 0.755835 0.743751 0.9273 0.75 0.755795 0.74371 0.9274 0.75 0.755755 0.743671 0.9275 0.75 0.755715 0.743633 0.9276 0.75 0.755675 0.743597 0.9277 0.75 0.755635 0.743563 0.9278 0.75 0.755595 0.74353 0.9279 0.75 0.755554 0.743499 0.928 0.75 0.755514 0.743469 0.9281 0.75 0.755474 0.743441 0.9282 0.75 0.755433 0.743414 0.9283 0.75 0.755392 0.74339 0.9284 0.75 0.755352 0.743367 0.9285 0.75 0.755311 0.743345 0.9286 0.75 0.75527 0.743325 0.9287 0.75 0.755229 0.743307 0.9288 0.75 0.755189 0.743291 0.9289 0.75 0.755148 0.743276 0.929 0.75 0.755106 0.743263 0.9291 0.75 0.755065 0.743252 0.9292 0.75 0.755024 0.743243 0.9293 0.75 0.754983 0.743235 0.9294 0.75 0.754942 0.743229 0.9295 0.75 0.7549 0.743225 0.9296 0.75 0.754859 0.743222 0.9297 0.75 0.754817 0.743221 0.9298 0.75 0.754775 0.743222 0.9299 0.75 0.754734 0.743225 0.93 0.75 0.754692 0.743229 0.9301 0.75 0.75465 0.743235 0.9302 0.75 0.754608 0.743243 0.9303 0.75 0.754567 0.743253 0.9304 0.75 0.754525 0.743264 0.9305 0.75 0.754482 0.743277 0.9306 0.75 0.75444 0.743292 0.9307 0.75 0.754398 0.743309 0.9308 0.75 0.754356 0.743327 0.9309 0.75 0.754314 0.743347 0.931 0.75 0.754271 0.743369 0.9311 0.75 0.754229 0.743393 0.9312 0.75 0.754186 0.743418 0.9313 0.75 0.754144 0.743445 0.9314 0.75 0.754101 0.743474 0.9315 0.75 0.754059 0.743505 0.9316 0.75 0.754016 0.743537 0.9317 0.75 0.753973 0.743571 0.9318 0.75 0.75393 0.743606 0.9319 0.75 0.753888 0.743644 0.932 0.75 0.753845 0.743683 0.9321 0.75 0.753802 0.743724 0.9322 0.75 0.753759 0.743766 0.9323 0.75 0.753716 0.74381 0.9324 0.75 0.753672 0.743856 0.9325 0.75 0.753629 0.743903 0.9326 0.75 0.753586 0.743952 0.9327 0.75 0.753543 0.744003 0.9328 0.75 0.753499 0.744055 0.9329 0.75 0.753456 0.744109 0.933 0.75 0.753413 0.744165 0.9331 0.75 0.753369 0.744222 0.9332 0.75 0.753326 0.74428 0.9333 0.75 0.753282 0.74434 0.9334 0.75 0.753238 0.744402 0.9335 0.75 0.753195 0.744465 0.9336 0.75 0.753151 0.74453 0.9337 0.75 0.753107 0.744596 0.9338 0.75 0.753063 0.744664 0.9339 0.75 0.75302 0.744733 0.934 0.75 0.752976 0.744804 0.9341 0.75 0.752932 0.744876 0.9342 0.75 0.752888 0.74495 0.9343 0.75 0.752844 0.745025 0.9344 0.75 0.7528 0.745101 0.9345 0.75 0.752756 0.745179 0.9346 0.75 0.752711 0.745258 0.9347 0.75 0.752667 0.745338 0.9348 0.75 0.752623 0.74542 0.9349 0.75 0.752579 0.745503 0.935 0.75 0.752535 0.745587 0.9351 0.75 0.75249 0.745672 0.9352 0.75 0.752446 0.745759 0.9353 0.75 0.752401 0.745847 0.9354 0.75 0.752357 0.745936 0.9355 0.75 0.752313 0.746026 0.9356 0.75 0.752268 0.746117 0.9357 0.75 0.752223 0.74621 0.9358 0.75 0.752179 0.746303 0.9359 0.75 0.752134 0.746398 0.936 0.75 0.75209 0.746493 0.9361 0.75 0.752045 0.74659 0.9362 0.75 0.752 0.746688 0.9363 0.75 0.751956 0.746786 0.9364 0.75 0.751911 0.746886 0.9365 0.75 0.751866 0.746986 0.9366 0.75 0.751821 0.747087 0.9367 0.75 0.751776 0.74719 0.9368 0.75 0.751731 0.747293 0.9369 0.75 0.751687 0.747396 0.937 0.75 0.751642 0.747501 0.9371 0.75 0.751597 0.747606 0.9372 0.75 0.751552 0.747712 0.9373 0.75 0.751507 0.747819 0.9374 0.75 0.751462 0.747926 0.9375 0.75 0.751417 0.748034 0.9376 0.75 0.751372 0.748143 0.9377 0.75 0.751326 0.748252 0.9378 0.75 0.751281 0.748362 0.9379 0.75 0.751236 0.748472 0.938 0.75 0.751191 0.748583 0.9381 0.75 0.751146 0.748694 0.9382 0.75 0.751101 0.748805 0.9383 0.75 0.751055 0.748917 0.9384 0.75 0.75101 0.749029 0.9385 0.75 0.750965 0.749142 0.9386 0.75 0.75092 0.749255 0.9387 0.75 0.750875 0.749368 0.9388 0.75 0.750829 0.749481 0.9389 0.75 0.750784 0.749595 0.939 0.75 0.750739 0.749708 0.9391 0.75 0.750693 0.749822 0.9392 0.75 0.750648 0.749936 0.9393 0.75 0.750603 0.75005 0.9394 0.75 0.750557 0.750164 0.9395 0.75 0.750512 0.750278 0.9396 0.75 0.750467 0.750392 0.9397 0.75 0.750421 0.750506 0.9398 0.75 0.750376 0.750619 0.9399 0.75 0.75033 0.750733 0.94 0.75 0.750285 0.750846 0.9401 0.75 0.75024 0.75096 0.9402 0.75 0.750194 0.751073 0.9403 0.75 0.750149 0.751185 0.9404 0.75 0.750103 0.751298 0.9405 0.75 0.750058 0.75141 0.9406 0.75 0.750012 0.751521 0.9407 0.75 0.749967 0.751632 0.9408 0.75 0.749922 0.751743 0.9409 0.75 0.749876 0.751853 0.941 0.75 0.749831 0.751963 0.9411 0.75 0.749785 0.752072 0.9412 0.75 0.74974 0.752181 0.9413 0.75 0.749694 0.752289 0.9414 0.75 0.749649 0.752396 0.9415 0.75 0.749604 0.752503 0.9416 0.75 0.749558 0.752609 0.9417 0.75 0.749513 0.752714 0.9418 0.75 0.749467 0.752818 0.9419 0.75 0.749422 0.752922 0.942 0.75 0.749377 0.753024 0.9421 0.75 0.749331 0.753126 0.9422 0.75 0.749286 0.753227 0.9423 0.75 0.749241 0.753327 0.9424 0.75 0.749195 0.753426 0.9425 0.75 0.74915 0.753524 0.9426 0.75 0.749105 0.753621 0.9427 0.75 0.749059 0.753716 0.9428 0.75 0.749014 0.753811 0.9429 0.75 0.748969 0.753904 0.943 0.75 0.748923 0.753997 0.9431 0.75 0.748878 0.754088 0.9432 0.75 0.748833 0.754178 0.9433 0.75 0.748788 0.754266 0.9434 0.75 0.748743 0.754353 0.9435 0.75 0.748697 0.754439 0.9436 0.75 0.748652 0.754524 0.9437 0.75 0.748607 0.754607 0.9438 0.75 0.748562 0.754689 0.9439 0.75 0.748517 0.754769 0.944 0.75 0.748472 0.754848 0.9441 0.75 0.748427 0.754925 0.9442 0.75 0.748382 0.755001 0.9443 0.75 0.748337 0.755075 0.9444 0.75 0.748292 0.755148 0.9445 0.75 0.748247 0.755219 0.9446 0.75 0.748202 0.755288 0.9447 0.75 0.748157 0.755356 0.9448 0.75 0.748112 0.755422 0.9449 0.75 0.748067 0.755486 0.945 0.75 0.748022 0.755548 0.9451 0.75 0.747978 0.755609 0.9452 0.75 0.747933 0.755668 0.9453 0.75 0.747888 0.755725 0.9454 0.75 0.747844 0.755781 0.9455 0.75 0.747799 0.755834 0.9456 0.75 0.747754 0.755886 0.9457 0.75 0.74771 0.755935 0.9458 0.75 0.747665 0.755983 0.9459 0.75 0.747621 0.756029 0.946 0.75 0.747576 0.756073 0.9461 0.75 0.747532 0.756115 0.9462 0.75 0.747488 0.756155 0.9463 0.75 0.747443 0.756192 0.9464 0.75 0.747399 0.756228 0.9465 0.75 0.747355 0.756262 0.9466 0.75 0.74731 0.756294 0.9467 0.75 0.747266 0.756323 0.9468 0.75 0.747222 0.756351 0.9469 0.75 0.747178 0.756376 0.947 0.75 0.747134 0.7564 0.9471 0.75 0.74709 0.756421 0.9472 0.75 0.747046 0.75644 0.9473 0.75 0.747002 0.756457 0.9474 0.75 0.746958 0.756472 0.9475 0.75 0.746915 0.756484 0.9476 0.75 0.746871 0.756495 0.9477 0.75 0.746827 0.756503 0.9478 0.75 0.746784 0.756509 0.9479 0.75 0.74674 0.756512 0.948 0.75 0.746697 0.756514 0.9481 0.75 0.746653 0.756513 0.9482 0.75 0.74661 0.756511 0.9483 0.75 0.746566 0.756505 0.9484 0.75 0.746523 0.756498 0.9485 0.75 0.74648 0.756488 0.9486 0.75 0.746437 0.756477 0.9487 0.75 0.746394 0.756463 0.9488 0.75 0.746351 0.756446 0.9489 0.75 0.746308 0.756428 0.949 0.75 0.746265 0.756407 0.9491 0.75 0.746222 0.756384 0.9492 0.75 0.746179 0.756359 0.9493 0.75 0.746136 0.756331 0.9494 0.75 0.746094 0.756302 0.9495 0.75 0.746051 0.75627 0.9496 0.75 0.746009 0.756236 0.9497 0.75 0.745966 0.756199 0.9498 0.75 0.745924 0.756161 0.9499 0.75 0.745882 0.75612 0.95 0.75 0.745839 0.756077 0.9501 0.75 0.745797 0.756032 0.9502 0.75 0.745755 0.755985 0.9503 0.75 0.745713 0.755935 0.9504 0.75 0.745671 0.755884 0.9505 0.75 0.745629 0.75583 0.9506 0.75 0.745588 0.755774 0.9507 0.75 0.745546 0.755717 0.9508 0.75 0.745504 0.755657 0.9509 0.75 0.745463 0.755595 0.951 0.75 0.745421 0.755531 0.9511 0.75 0.74538 0.755465 0.9512 0.75 0.745339 0.755396 0.9513 0.75 0.745297 0.755326 0.9514 0.75 0.745256 0.755254 0.9515 0.75 0.745215 0.75518 0.9516 0.75 0.745174 0.755104 0.9517 0.75 0.745134 0.755027 0.9518 0.75 0.745093 0.754947 0.9519 0.75 0.745052 0.754865 0.952 0.75 0.745012 0.754782 0.9521 0.75 0.744971 0.754697 0.9522 0.75 0.744931 0.75461 0.9523 0.75 0.74489 0.754521 0.9524 0.75 0.74485 0.75443 0.9525 0.75 0.74481 0.754338 0.9526 0.75 0.74477 0.754244 0.9527 0.75 0.74473 0.754149 0.9528 0.75 0.74469 0.754052 0.9529 0.75 0.744651 0.753953 0.953 0.75 0.744611 0.753853 0.9531 0.75 0.744571 0.753752 0.9532 0.75 0.744532 0.753648 0.9533 0.75 0.744493 0.753544 0.9534 0.75 0.744454 0.753438 0.9535 0.75 0.744414 0.75333 0.9536 0.75 0.744375 0.753222 0.9537 0.75 0.744337 0.753112 0.9538 0.75 0.744298 0.753001 0.9539 0.75 0.744259 0.752888 0.954 0.75 0.744221 0.752775 0.9541 0.75 0.744182 0.75266 0.9542 0.75 0.744144 0.752544 0.9543 0.75 0.744106 0.752427 0.9544 0.75 0.744068 0.752309 0.9545 0.75 0.74403 0.752191 0.9546 0.75 0.743992 0.752071 0.9547 0.75 0.743954 0.75195 0.9548 0.75 0.743916 0.751829 0.9549 0.75 0.743879 0.751706 0.955 0.75 0.743841 0.751583 0.9551 0.75 0.743804 0.75146 0.9552 0.75 0.743767 0.751335 0.9553 0.75 0.74373 0.75121 0.9554 0.75 0.743693 0.751085 0.9555 0.75 0.743656 0.750959 0.9556 0.75 0.74362 0.750832 0.9557 0.75 0.743583 0.750705 0.9558 0.75 0.743547 0.750578 0.9559 0.75 0.74351 0.750451 0.956 0.75 0.743474 0.750323 0.9561 0.75 0.743438 0.750195 0.9562 0.75 0.743402 0.750066 0.9563 0.75 0.743367 0.749938 0.9564 0.75 0.743331 0.74981 0.9565 0.75 0.743296 0.749681 0.9566 0.75 0.74326 0.749553 0.9567 0.75 0.743225 0.749425 0.9568 0.75 0.74319 0.749297 0.9569 0.75 0.743155 0.749169 0.957 0.75 0.74312 0.749041 0.9571 0.75 0.743086 0.748914 0.9572 0.75 0.743051 0.748787 0.9573 0.75 0.743017 0.74866 0.9574 0.75 0.742983 0.748534 0.9575 0.75 0.742949 0.748408 0.9576 0.75 0.742915 0.748283 0.9577 0.75 0.742881 0.748159 0.9578 0.75 0.742848 0.748035 0.9579 0.75 0.742814 0.747912 0.958 0.75 0.742781 0.74779 0.9581 0.75 0.742748 0.747668 0.9582 0.75 0.742715 0.747548 0.9583 0.75 0.742682 0.747428 0.9584 0.75 0.742649 0.74731 0.9585 0.75 0.742617 0.747192 0.9586 0.75 0.742584 0.747076 0.9587 0.75 0.742552 0.74696 0.9588 0.75 0.74252 0.746846 0.9589 0.75 0.742488 0.746733 0.959 0.75 0.742456 0.746622 0.9591 0.75 0.742425 0.746512 0.9592 0.75 0.742394 0.746403 0.9593 0.75 0.742362 0.746296 0.9594 0.75 0.742331 0.74619 0.9595 0.75 0.7423 0.746086 0.9596 0.75 0.74227 0.745983 0.9597 0.75 0.742239 0.745882 0.9598 0.75 0.742209 0.745783 0.9599 0.75 0.742179 0.745685 0.96 0.75 0.742149 0.74559 0.9601 0.75 0.742119 0.745496 0.9602 0.75 0.742089 0.745404 0.9603 0.75 0.74206 0.745314 0.9604 0.75 0.74203 0.745226 0.9605 0.75 0.742001 0.74514 0.9606 0.75 0.741972 0.745056 0.9607 0.75 0.741943 0.744975 0.9608 0.75 0.741915 0.744895 0.9609 0.75 0.741886 0.744818 0.961 0.75 0.741858 0.744743 0.9611 0.75 0.74183 0.74467 0.9612 0.75 0.741802 0.7446 0.9613 0.75 0.741775 0.744532 0.9614 0.75 0.741747 0.744466 0.9615 0.75 0.74172 0.744403 0.9616 0.75 0.741693 0.744342 0.9617 0.75 0.741666 0.744284 0.9618 0.75 0.741639 0.744228 0.9619 0.75 0.741613 0.744175 0.962 0.75 0.741586 0.744125 0.9621 0.75 0.74156 0.744077 0.9622 0.75 0.741534 0.744032 0.9623 0.75 0.741509 0.74399 0.9624 0.75 0.741483 0.74395 0.9625 0.75 0.741458 0.743913 0.9626 0.75 0.741433 0.743879 0.9627 0.75 0.741408 0.743848 0.9628 0.75 0.741383 0.74382 0.9629 0.75 0.741359 0.743794 0.963 0.75 0.741335 0.743772 0.9631 0.75 0.741311 0.743752 0.9632 0.75 0.741287 0.743736 0.9633 0.75 0.741263 0.743722 0.9634 0.75 0.74124 0.743711 0.9635 0.75 0.741217 0.743703 0.9636 0.75 0.741194 0.743698 0.9637 0.75 0.741171 0.743697 0.9638 0.75 0.741148 0.743698 0.9639 0.75 0.741126 0.743702 0.964 0.75 0.741104 0.74371 0.9641 0.75 0.741082 0.74372 0.9642 0.75 0.74106 0.743733 0.9643 0.75 0.741039 0.74375 0.9644 0.75 0.741018 0.74377 0.9645 0.75 0.740997 0.743792 0.9646 0.75 0.740976 0.743818 0.9647 0.75 0.740955 0.743847 0.9648 0.75 0.740935 0.743879 0.9649 0.75 0.740915 0.743914 0.965 0.75 0.740895 0.743952 0.9651 0.75 0.740876 0.743993 0.9652 0.75 0.740856 0.744037 0.9653 0.75 0.740837 0.744084 0.9654 0.75 0.740818 0.744134 0.9655 0.75 0.7408 0.744187 0.9656 0.75 0.740781 0.744243 0.9657 0.75 0.740763 0.744302 0.9658 0.75 0.740745 0.744364 0.9659 0.75 0.740728 0.744429 0.966 0.75 0.74071 0.744497 0.9661 0.75 0.740693 0.744568 0.9662 0.75 0.740676 0.744641 0.9663 0.75 0.74066 0.744718 0.9664 0.75 0.740643 0.744797 0.9665 0.75 0.740627 0.744879 0.9666 0.75 0.740611 0.744964 0.9667 0.75 0.740595 0.745051 0.9668 0.75 0.74058 0.745141 0.9669 0.75 0.740565 0.745234 0.967 0.75 0.74055 0.745329 0.9671 0.75 0.740535 0.745427 0.9672 0.75 0.740521 0.745528 0.9673 0.75 0.740507 0.745631 0.9674 0.75 0.740493 0.745736 0.9675 0.75 0.74048 0.745844 0.9676 0.75 0.740466 0.745954 0.9677 0.75 0.740453 0.746066 0.9678 0.75 0.740441 0.746181 0.9679 0.75 0.740428 0.746297 0.968 0.75 0.740416 0.746416 0.9681 0.75 0.740404 0.746537 0.9682 0.75 0.740392 0.74666 0.9683 0.75 0.740381 0.746785 0.9684 0.75 0.74037 0.746912 0.9685 0.75 0.740359 0.747041 0.9686 0.75 0.740348 0.747171 0.9687 0.75 0.740338 0.747304 0.9688 0.75 0.740328 0.747438 0.9689 0.75 0.740318 0.747573 0.969 0.75 0.740309 0.74771 0.9691 0.75 0.7403 0.747848 0.9692 0.75 0.740291 0.747988 0.9693 0.75 0.740282 0.748129 0.9694 0.75 0.740274 0.748271 0.9695 0.75 0.740266 0.748415 0.9696 0.75 0.740259 0.748559 0.9697 0.75 0.740251 0.748705 0.9698 0.75 0.740244 0.748851 0.9699 0.75 0.740237 0.748998 0.97 0.75 0.740231 0.749146 0.9701 0.75 0.740225 0.749295 0.9702 0.75 0.740219 0.749444 0.9703 0.75 0.740213 0.749594 0.9704 0.75 0.740208 0.749744 0.9705 0.75 0.740203 0.749894 0.9706 0.75 0.740198 0.750045 0.9707 0.75 0.740194 0.750196 0.9708 0.75 0.74019 0.750347 0.9709 0.75 0.740186 0.750498 0.971 0.75 0.740183 0.750649 0.9711 0.75 0.74018 0.7508 0.9712 0.75 0.740177 0.75095 0.9713 0.75 0.740175 0.7511 0.9714 0.75 0.740172 0.751249 0.9715 0.75 0.740171 0.751398 0.9716 0.75 0.740169 0.751547 0.9717 0.75 0.740168 0.751694 0.9718 0.75 0.740167 0.751841 0.9719 0.75 0.740167 0.751987 0.972 0.75 0.740166 0.752131 0.9721 0.75 0.740166 0.752275 0.9722 0.75 0.740167 0.752417 0.9723 0.75 0.740168 0.752559 0.9724 0.75 0.740169 0.752698 0.9725 0.75 0.74017 0.752836 0.9726 0.75 0.740172 0.752973 0.9727 0.75 0.740174 0.753108 0.9728 0.75 0.740177 0.753241 0.9729 0.75 0.74018 0.753372 0.973 0.75 0.740183 0.753502 0.9731 0.75 0.740186 0.753629 0.9732 0.75 0.74019 0.753754 0.9733 0.75 0.740194 0.753877 0.9734 0.75 0.740199 0.753997 0.9735 0.75 0.740204 0.754115 0.9736 0.75 0.740209 0.754231 0.9737 0.75 0.740214 0.754344 0.9738 0.75 0.74022 0.754454 0.9739 0.75 0.740227 0.754561 0.974 0.75 0.740233 0.754666 0.9741 0.75 0.74024 0.754768 0.9742 0.75 0.740248 0.754866 0.9743 0.75 0.740255 0.754962 0.9744 0.75 0.740264 0.755054 0.9745 0.75 0.740272 0.755143 0.9746 0.75 0.740281 0.755229 0.9747 0.75 0.74029 0.755311 0.9748 0.75 0.7403 0.75539 0.9749 0.75 0.74031 0.755465 0.975 0.75 0.74032 0.755537 0.9751 0.75 0.74033 0.755605 0.9752 0.75 0.740342 0.755669 0.9753 0.75 0.740353 0.755729 0.9754 0.75 0.740365 0.755786 0.9755 0.75 0.740377 0.755838 0.9756 0.75 0.740389 0.755887 0.9757 0.75 0.740402 0.755931 0.9758 0.75 0.740416 0.755971 0.9759 0.75 0.740429 0.756007 0.976 0.75 0.740444 0.756039 0.9761 0.75 0.740458 0.756066 0.9762 0.75 0.740473 0.756089 0.9763 0.75 0.740488 0.756108 0.9764 0.75 0.740504 0.756123 0.9765 0.75 0.74052 0.756133 0.9766 0.75 0.740536 0.756138 0.9767 0.75 0.740553 0.756139 0.9768 0.75 0.74057 0.756135 0.9769 0.75 0.740588 0.756127 0.977 0.75 0.740606 0.756114 0.9771 0.75 0.740624 0.756097 0.9772 0.75 0.740643 0.756075 0.9773 0.75 0.740663 0.756049 0.9774 0.75 0.740682 0.756017 0.9775 0.75 0.740702 0.755982 0.9776 0.75 0.740723 0.755941 0.9777 0.75 0.740744 0.755896 0.9778 0.75 0.740765 0.755846 0.9779 0.75 0.740787 0.755792 0.978 0.75 0.740809 0.755733 0.9781 0.75 0.740831 0.75567 0.9782 0.75 0.740854 0.755601 0.9783 0.75 0.740878 0.755529 0.9784 0.75 0.740902 0.755452 0.9785 0.75 0.740926 0.75537 0.9786 0.75 0.74095 0.755284 0.9787 0.75 0.740976 0.755193 0.9788 0.75 0.741001 0.755099 0.9789 0.75 0.741027 0.754999 0.979 0.75 0.741053 0.754896 0.9791 0.75 0.74108 0.754788 0.9792 0.75 0.741108 0.754677 0.9793 0.75 0.741135 0.754561 0.9794 0.75 0.741163 0.754441 0.9795 0.75 0.741192 0.754317 0.9796 0.75 0.741221 0.754189 0.9797 0.75 0.74125 0.754058 0.9798 0.75 0.74128 0.753923 0.9799 0.75 0.741311 0.753784 0.98 0.75 0.741342 0.753642 0.9801 0.75 0.741373 0.753496 0.9802 0.75 0.741405 0.753347 0.9803 0.75 0.741437 0.753195 0.9804 0.75 0.741469 0.75304 0.9805 0.75 0.741502 0.752881 0.9806 0.75 0.741536 0.75272 0.9807 0.75 0.74157 0.752556 0.9808 0.75 0.741604 0.75239 0.9809 0.75 0.741639 0.752221 0.981 0.75 0.741675 0.752049 0.9811 0.75 0.741711 0.751876 0.9812 0.75 0.741747 0.7517 0.9813 0.75 0.741784 0.751523 0.9814 0.75 0.741821 0.751343 0.9815 0.75 0.741859 0.751162 0.9816 0.75 0.741897 0.75098 0.9817 0.75 0.741936 0.750796 0.9818 0.75 0.741975 0.750611 0.9819 0.75 0.742014 0.750425 0.982 0.75 0.742055 0.750238 0.9821 0.75 0.742095 0.75005 0.9822 0.75 0.742136 0.749862 0.9823 0.75 0.742178 0.749674 0.9824 0.75 0.74222 0.749485 0.9825 0.75 0.742263 0.749297 0.9826 0.75 0.742306 0.749109 0.9827 0.75 0.742349 0.748921 0.9828 0.75 0.742393 0.748734 0.9829 0.75 0.742438 0.748548 0.983 0.75 0.742483 0.748362 0.9831 0.75 0.742528 0.748178 0.9832 0.75 0.742574 0.747995 0.9833 0.75 0.742621 0.747814 0.9834 0.75 0.742668 0.747635 0.9835 0.75 0.742716 0.747457 0.9836 0.75 0.742764 0.747282 0.9837 0.75 0.742812 0.747109 0.9838 0.75 0.742861 0.746939 0.9839 0.75 0.742911 0.746771 0.984 0.75 0.742961 0.746607 0.9841 0.75 0.743012 0.746445 0.9842 0.75 0.743063 0.746287 0.9843 0.75 0.743115 0.746133 0.9844 0.75 0.743167 0.745982 0.9845 0.75 0.743219 0.745836 0.9846 0.75 0.743273 0.745693 0.9847 0.75 0.743327 0.745555 0.9848 0.75 0.743381 0.745422 0.9849 0.75 0.743436 0.745293 0.985 0.75 0.743491 0.745169 0.9851 0.75 0.743547 0.745051 0.9852 0.75 0.743603 0.744937 0.9853 0.75 0.74366 0.744829 0.9854 0.75 0.743718 0.744727 0.9855 0.75 0.743776 0.744631 0.9856 0.75 0.743835 0.744541 0.9857 0.75 0.743894 0.744457 0.9858 0.75 0.743953 0.744379 0.9859 0.75 0.744014 0.744308 0.986 0.75 0.744074 0.744244 0.9861 0.75 0.744136 0.744186 0.9862 0.75 0.744198 0.744135 0.9863 0.75 0.74426 0.744092 0.9864 0.75 0.744323 0.744055 0.9865 0.75 0.744387 0.744026 0.9866 0.75 0.744451 0.744005 0.9867 0.75 0.744516 0.743991 0.9868 0.75 0.744581 0.743984 0.9869 0.75 0.744647 0.743986 0.987 0.75 0.744713 0.743995 0.9871 0.75 0.74478 0.744012 0.9872 0.75 0.744848 0.744037 0.9873 0.75 0.744916 0.74407 0.9874 0.75 0.744984 0.744111 0.9875 0.75 0.745054 0.74416 0.9876 0.75 0.745124 0.744218 0.9877 0.75 0.745194 0.744284 0.9878 0.75 0.745265 0.744357 0.9879 0.75 0.745337 0.744439 0.988 0.75 0.745409 0.744529 0.9881 0.75 0.745482 0.744627 0.9882 0.75 0.745555 0.744733 0.9883 0.75 0.745629 0.744848 0.9884 0.75 0.745703 0.74497 0.9885 0.75 0.745778 0.7451 0.9886 0.75 0.745854 0.745237 0.9887 0.75 0.745931 0.745383 0.9888 0.75 0.746007 0.745536 0.9889 0.75 0.746085 0.745696 0.989 0.75 0.746163 0.745864 0.9891 0.75 0.746242 0.746038 0.9892 0.75 0.746321 0.74622 0.9893 0.75 0.746401 0.746408 0.9894 0.75 0.746482 0.746603 0.9895 0.75 0.746563 0.746804 0.9896 0.75 0.746645 0.747011 0.9897 0.75 0.746727 0.747224 0.9898 0.75 0.74681 0.747443 0.9899 0.75 0.746894 0.747667 0.99 0.75 0.746978 0.747895 0.9901 0.75 0.747063 0.748128 0.9902 0.75 0.747149 0.748366 0.9903 0.75 0.747235 0.748608 0.9904 0.75 0.747322 0.748853 0.9905 0.75 0.747409 0.749101 0.9906 0.75 0.747497 0.749352 0.9907 0.75 0.747586 0.749605 0.9908 0.75 0.747675 0.749861 0.9909 0.75 0.747765 0.750118 0.991 0.75 0.747856 0.750376 0.9911 0.75 0.747947 0.750635 0.9912 0.75 0.748039 0.750894 0.9913 0.75 0.748131 0.751152 0.9914 0.75 0.748225 0.75141 0.9915 0.75 0.748318 0.751666 0.9916 0.75 0.748413 0.75192 0.9917 0.75 0.748508 0.752172 0.9918 0.75 0.748604 0.752421 0.9919 0.75 0.7487 0.752666 0.992 0.75 0.748798 0.752907 0.9921 0.75 0.748895 0.753143 0.9922 0.75 0.748994 0.753374 0.9923 0.75 0.749093 0.753599 0.9924 0.75 0.749193 0.753817 0.9925 0.75 0.749293 0.754028 0.9926 0.75 0.749394 0.754231 0.9927 0.75 0.749496 0.754426 0.9928 0.75 0.749599 0.754612 0.9929 0.75 0.749702 0.754788 0.993 0.75 0.749806 0.754954 0.9931 0.75 0.74991 0.755109 0.9932 0.75 0.750015 0.755253 0.9933 0.75 0.750121 0.755384 0.9934 0.75 0.750228 0.755503 0.9935 0.75 0.750335 0.755608 0.9936 0.75 0.750443 0.7557 0.9937 0.75 0.750552 0.755777 0.9938 0.75 0.750661 0.755839 0.9939 0.75 0.750771 0.755885 0.994 0.75 0.750882 0.755916 0.9941 0.75 0.750993 0.75593 0.9942 0.75 0.751105 0.755927 0.9943 0.75 0.751218 0.755907 0.9944 0.75 0.751332 0.755869 0.9945 0.75 0.751446 0.755813 0.9946 0.75 0.751561 0.755738 0.9947 0.75 0.751677 0.755645 0.9948 0.75 0.751793 0.755533 0.9949 0.75 0.75191 0.755402 0.995 0.75 0.752028 0.755252 0.9951 0.75 0.752147 0.755082 0.9952 0.75 0.752266 0.754893 0.9953 0.75 0.752386 0.754685 0.9954 0.75 0.752507 0.754458 0.9955 0.75 0.752628 0.754212 0.9956 0.75 0.75275 0.753948 0.9957 0.75 0.752873 0.753665 0.9958 0.75 0.752997 0.753365 0.9959 0.75 0.753121 0.753048 0.996 0.75 0.753246 0.752714 0.9961 0.75 0.753372 0.752365 0.9962 0.75 0.753499 0.752001 0.9963 0.75 0.753626 0.751624 0.9964 0.75 0.753754 0.751234 0.9965 0.75 0.753883 0.750833 0.9966 0.75 0.754013 0.750423 0.9967 0.75 0.754143 0.750004 0.9968 0.75 0.754274 0.74958 0.9969 0.75 0.754406 0.749151 0.997 0.75 0.754539 0.74872 0.9971 0.75 0.754672 0.748289 0.9972 0.75 0.754806 0.747861 0.9973 0.75 0.754941 0.747438 0.9974 0.75 0.755077 0.747024 0.9975 0.75 0.755213 0.746621 0.9976 0.75 0.75535 0.746234 0.9977 0.75 0.755488 0.745865 0.9978 0.75 0.755627 0.745518 0.9979 0.75 0.755767 0.745199 0.998 0.75 0.755907 0.744911 0.9981 0.75 0.756048 0.74466 0.9982 0.75 0.75619 0.744449 0.9983 0.75 0.756333 0.744286 0.9984 0.75 0.756476 0.744175 0.9985 0.75 0.75662 0.744122 0.9986 0.75 0.756765 0.744136 0.9987 0.75 0.756911 0.744221 0.9988 0.75 0.757058 0.744386 0.9989 0.75 0.757205 0.744638 0.999 0.75 0.757353 0.744985 0.9991 0.75 0.757502 0.745437 0.9992 0.75 0.757652 0.746002 0.9993 0.75 0.757803 0.746689 0.9994 0.75 0.757954 0.74751 0.9995 0.75 0.758106 0.748474 0.9996 0.75 0.758259 0.749594 0.9997 0.75 0.758413 0.750879 0.9998 0.75 0.758568 0.752344 0.9999 0.75 0.758723 0.754001 gsl-doc-2.3/doc/examples/intro.c0000664000175000017500000000025512616157443014657 0ustar eddedd#include #include int main (void) { double x = 5.0; double y = gsl_sf_bessel_J0 (x); printf ("J0(%g) = %.18e\n", x, y); return 0; } gsl-doc-2.3/doc/examples/Makefile.in0000644000175000017500000014337313022372405015421 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = blas$(EXEEXT) block$(EXEEXT) cblas$(EXEEXT) \ cdf$(EXEEXT) cheb$(EXEEXT) combination$(EXEEXT) \ multiset$(EXEEXT) const$(EXEEXT) diff$(EXEEXT) eigen$(EXEEXT) \ fft$(EXEEXT) fftmr$(EXEEXT) fftreal$(EXEEXT) fitting$(EXEEXT) \ fitting2$(EXEEXT) fitting3$(EXEEXT) fitreg$(EXEEXT) \ fitreg2$(EXEEXT) histogram$(EXEEXT) histogram2d$(EXEEXT) \ ieee$(EXEEXT) ieeeround$(EXEEXT) integration$(EXEEXT) \ interp$(EXEEXT) interp2d$(EXEEXT) intro$(EXEEXT) \ linalglu$(EXEEXT) largefit$(EXEEXT) matrix$(EXEEXT) \ matrixw$(EXEEXT) min$(EXEEXT) monte$(EXEEXT) ntupler$(EXEEXT) \ ntuplew$(EXEEXT) ode-initval$(EXEEXT) permseq$(EXEEXT) \ permshuffle$(EXEEXT) polyroots$(EXEEXT) qrng$(EXEEXT) \ randpoisson$(EXEEXT) randwalk$(EXEEXT) rng$(EXEEXT) \ rngunif$(EXEEXT) robfit$(EXEEXT) rootnewt$(EXEEXT) \ roots$(EXEEXT) siman$(EXEEXT) sortsmall$(EXEEXT) \ specfun$(EXEEXT) specfun_e$(EXEEXT) rstat$(EXEEXT) \ rquantile$(EXEEXT) stat$(EXEEXT) statsort$(EXEEXT) \ sum$(EXEEXT) vector$(EXEEXT) vectorr$(EXEEXT) \ vectorview$(EXEEXT) vectorw$(EXEEXT) dwt$(EXEEXT) \ nlfit$(EXEEXT) nlfit2$(EXEEXT) nlfit3$(EXEEXT) nlfit4$(EXEEXT) \ interpp$(EXEEXT) eigen_nonsymm$(EXEEXT) bspline$(EXEEXT) \ poisson$(EXEEXT) interp_compare$(EXEEXT) spmatrix$(EXEEXT) subdir = doc/examples DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(dist_noinst_DATA) 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 = CONFIG_CLEAN_VPATH_FILES = blas_SOURCES = blas.c blas_OBJECTS = blas.$(OBJEXT) blas_LDADD = $(LDADD) blas_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = block_SOURCES = block.c block_OBJECTS = block.$(OBJEXT) block_LDADD = $(LDADD) block_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la bspline_SOURCES = bspline.c bspline_OBJECTS = bspline.$(OBJEXT) bspline_LDADD = $(LDADD) bspline_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la cblas_SOURCES = cblas.c cblas_OBJECTS = cblas.$(OBJEXT) cblas_LDADD = $(LDADD) cblas_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la cdf_SOURCES = cdf.c cdf_OBJECTS = cdf.$(OBJEXT) cdf_LDADD = $(LDADD) cdf_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la cheb_SOURCES = cheb.c cheb_OBJECTS = cheb.$(OBJEXT) cheb_LDADD = $(LDADD) cheb_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la combination_SOURCES = combination.c combination_OBJECTS = combination.$(OBJEXT) combination_LDADD = $(LDADD) combination_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la const_SOURCES = const.c const_OBJECTS = const.$(OBJEXT) const_LDADD = $(LDADD) const_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la diff_SOURCES = diff.c diff_OBJECTS = diff.$(OBJEXT) diff_LDADD = $(LDADD) diff_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la dwt_SOURCES = dwt.c dwt_OBJECTS = dwt.$(OBJEXT) dwt_LDADD = $(LDADD) dwt_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la eigen_SOURCES = eigen.c eigen_OBJECTS = eigen.$(OBJEXT) eigen_LDADD = $(LDADD) eigen_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la eigen_nonsymm_SOURCES = eigen_nonsymm.c eigen_nonsymm_OBJECTS = eigen_nonsymm.$(OBJEXT) eigen_nonsymm_LDADD = $(LDADD) eigen_nonsymm_DEPENDENCIES = ../../libgsl.la \ ../../cblas/libgslcblas.la fft_SOURCES = fft.c fft_OBJECTS = fft.$(OBJEXT) fft_LDADD = $(LDADD) fft_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fftmr_SOURCES = fftmr.c fftmr_OBJECTS = fftmr.$(OBJEXT) fftmr_LDADD = $(LDADD) fftmr_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fftreal_SOURCES = fftreal.c fftreal_OBJECTS = fftreal.$(OBJEXT) fftreal_LDADD = $(LDADD) fftreal_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fitreg_SOURCES = fitreg.c fitreg_OBJECTS = fitreg.$(OBJEXT) fitreg_LDADD = $(LDADD) fitreg_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fitreg2_SOURCES = fitreg2.c fitreg2_OBJECTS = fitreg2.$(OBJEXT) fitreg2_LDADD = $(LDADD) fitreg2_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fitting_SOURCES = fitting.c fitting_OBJECTS = fitting.$(OBJEXT) fitting_LDADD = $(LDADD) fitting_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fitting2_SOURCES = fitting2.c fitting2_OBJECTS = fitting2.$(OBJEXT) fitting2_LDADD = $(LDADD) fitting2_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la fitting3_SOURCES = fitting3.c fitting3_OBJECTS = fitting3.$(OBJEXT) fitting3_LDADD = $(LDADD) fitting3_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la histogram_SOURCES = histogram.c histogram_OBJECTS = histogram.$(OBJEXT) histogram_LDADD = $(LDADD) histogram_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la histogram2d_SOURCES = histogram2d.c histogram2d_OBJECTS = histogram2d.$(OBJEXT) histogram2d_LDADD = $(LDADD) histogram2d_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la ieee_SOURCES = ieee.c ieee_OBJECTS = ieee.$(OBJEXT) ieee_LDADD = $(LDADD) ieee_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la ieeeround_SOURCES = ieeeround.c ieeeround_OBJECTS = ieeeround.$(OBJEXT) ieeeround_LDADD = $(LDADD) ieeeround_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la integration_SOURCES = integration.c integration_OBJECTS = integration.$(OBJEXT) integration_LDADD = $(LDADD) integration_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la interp_SOURCES = interp.c interp_OBJECTS = interp.$(OBJEXT) interp_LDADD = $(LDADD) interp_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la interp2d_SOURCES = interp2d.c interp2d_OBJECTS = interp2d.$(OBJEXT) interp2d_LDADD = $(LDADD) interp2d_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la interp_compare_SOURCES = interp_compare.c interp_compare_OBJECTS = interp_compare.$(OBJEXT) interp_compare_LDADD = $(LDADD) interp_compare_DEPENDENCIES = ../../libgsl.la \ ../../cblas/libgslcblas.la interpp_SOURCES = interpp.c interpp_OBJECTS = interpp.$(OBJEXT) interpp_LDADD = $(LDADD) interpp_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la intro_SOURCES = intro.c intro_OBJECTS = intro.$(OBJEXT) intro_LDADD = $(LDADD) intro_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la largefit_SOURCES = largefit.c largefit_OBJECTS = largefit.$(OBJEXT) largefit_LDADD = $(LDADD) largefit_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la linalglu_SOURCES = linalglu.c linalglu_OBJECTS = linalglu.$(OBJEXT) linalglu_LDADD = $(LDADD) linalglu_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la matrix_SOURCES = matrix.c matrix_OBJECTS = matrix.$(OBJEXT) matrix_LDADD = $(LDADD) matrix_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la matrixw_SOURCES = matrixw.c matrixw_OBJECTS = matrixw.$(OBJEXT) matrixw_LDADD = $(LDADD) matrixw_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la min_SOURCES = min.c min_OBJECTS = min.$(OBJEXT) min_LDADD = $(LDADD) min_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la monte_SOURCES = monte.c monte_OBJECTS = monte.$(OBJEXT) monte_LDADD = $(LDADD) monte_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la multiset_SOURCES = multiset.c multiset_OBJECTS = multiset.$(OBJEXT) multiset_LDADD = $(LDADD) multiset_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la nlfit_SOURCES = nlfit.c nlfit_OBJECTS = nlfit.$(OBJEXT) nlfit_LDADD = $(LDADD) nlfit_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la nlfit2_SOURCES = nlfit2.c nlfit2_OBJECTS = nlfit2.$(OBJEXT) nlfit2_LDADD = $(LDADD) nlfit2_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la nlfit3_SOURCES = nlfit3.c nlfit3_OBJECTS = nlfit3.$(OBJEXT) nlfit3_LDADD = $(LDADD) nlfit3_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la nlfit4_SOURCES = nlfit4.c nlfit4_OBJECTS = nlfit4.$(OBJEXT) nlfit4_LDADD = $(LDADD) nlfit4_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la ntupler_SOURCES = ntupler.c ntupler_OBJECTS = ntupler.$(OBJEXT) ntupler_LDADD = $(LDADD) ntupler_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la ntuplew_SOURCES = ntuplew.c ntuplew_OBJECTS = ntuplew.$(OBJEXT) ntuplew_LDADD = $(LDADD) ntuplew_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la ode_initval_SOURCES = ode-initval.c ode_initval_OBJECTS = ode-initval.$(OBJEXT) ode_initval_LDADD = $(LDADD) ode_initval_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la permseq_SOURCES = permseq.c permseq_OBJECTS = permseq.$(OBJEXT) permseq_LDADD = $(LDADD) permseq_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la permshuffle_SOURCES = permshuffle.c permshuffle_OBJECTS = permshuffle.$(OBJEXT) permshuffle_LDADD = $(LDADD) permshuffle_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la poisson_SOURCES = poisson.c poisson_OBJECTS = poisson.$(OBJEXT) poisson_LDADD = $(LDADD) poisson_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la polyroots_SOURCES = polyroots.c polyroots_OBJECTS = polyroots.$(OBJEXT) polyroots_LDADD = $(LDADD) polyroots_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la qrng_SOURCES = qrng.c qrng_OBJECTS = qrng.$(OBJEXT) qrng_LDADD = $(LDADD) qrng_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la randpoisson_SOURCES = randpoisson.c randpoisson_OBJECTS = randpoisson.$(OBJEXT) randpoisson_LDADD = $(LDADD) randpoisson_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la randwalk_SOURCES = randwalk.c randwalk_OBJECTS = randwalk.$(OBJEXT) randwalk_LDADD = $(LDADD) randwalk_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la rng_SOURCES = rng.c rng_OBJECTS = rng.$(OBJEXT) rng_LDADD = $(LDADD) rng_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la rngunif_SOURCES = rngunif.c rngunif_OBJECTS = rngunif.$(OBJEXT) rngunif_LDADD = $(LDADD) rngunif_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la robfit_SOURCES = robfit.c robfit_OBJECTS = robfit.$(OBJEXT) robfit_LDADD = $(LDADD) robfit_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la rootnewt_SOURCES = rootnewt.c rootnewt_OBJECTS = rootnewt.$(OBJEXT) rootnewt_LDADD = $(LDADD) rootnewt_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la roots_SOURCES = roots.c roots_OBJECTS = roots.$(OBJEXT) roots_LDADD = $(LDADD) roots_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la rquantile_SOURCES = rquantile.c rquantile_OBJECTS = rquantile.$(OBJEXT) rquantile_LDADD = $(LDADD) rquantile_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la rstat_SOURCES = rstat.c rstat_OBJECTS = rstat.$(OBJEXT) rstat_LDADD = $(LDADD) rstat_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la siman_SOURCES = siman.c siman_OBJECTS = siman.$(OBJEXT) siman_LDADD = $(LDADD) siman_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la sortsmall_SOURCES = sortsmall.c sortsmall_OBJECTS = sortsmall.$(OBJEXT) sortsmall_LDADD = $(LDADD) sortsmall_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la specfun_SOURCES = specfun.c specfun_OBJECTS = specfun.$(OBJEXT) specfun_LDADD = $(LDADD) specfun_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la specfun_e_SOURCES = specfun_e.c specfun_e_OBJECTS = specfun_e.$(OBJEXT) specfun_e_LDADD = $(LDADD) specfun_e_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la spmatrix_SOURCES = spmatrix.c spmatrix_OBJECTS = spmatrix.$(OBJEXT) spmatrix_LDADD = $(LDADD) spmatrix_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la stat_SOURCES = stat.c stat_OBJECTS = stat.$(OBJEXT) stat_LDADD = $(LDADD) stat_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la statsort_SOURCES = statsort.c statsort_OBJECTS = statsort.$(OBJEXT) statsort_LDADD = $(LDADD) statsort_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la sum_SOURCES = sum.c sum_OBJECTS = sum.$(OBJEXT) sum_LDADD = $(LDADD) sum_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la vector_SOURCES = vector.c vector_OBJECTS = vector.$(OBJEXT) vector_LDADD = $(LDADD) vector_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la vectorr_SOURCES = vectorr.c vectorr_OBJECTS = vectorr.$(OBJEXT) vectorr_LDADD = $(LDADD) vectorr_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la vectorview_SOURCES = vectorview.c vectorview_OBJECTS = vectorview.$(OBJEXT) vectorview_LDADD = $(LDADD) vectorview_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la vectorw_SOURCES = vectorw.c vectorw_OBJECTS = vectorw.$(OBJEXT) vectorw_LDADD = $(LDADD) vectorw_DEPENDENCIES = ../../libgsl.la ../../cblas/libgslcblas.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = blas.c block.c bspline.c cblas.c cdf.c cheb.c combination.c \ const.c diff.c dwt.c eigen.c eigen_nonsymm.c fft.c fftmr.c \ fftreal.c fitreg.c fitreg2.c fitting.c fitting2.c fitting3.c \ histogram.c histogram2d.c ieee.c ieeeround.c integration.c \ interp.c interp2d.c interp_compare.c interpp.c intro.c \ largefit.c linalglu.c matrix.c matrixw.c min.c monte.c \ multiset.c nlfit.c nlfit2.c nlfit3.c nlfit4.c ntupler.c \ ntuplew.c ode-initval.c permseq.c permshuffle.c poisson.c \ polyroots.c qrng.c randpoisson.c randwalk.c rng.c rngunif.c \ robfit.c rootnewt.c roots.c rquantile.c rstat.c siman.c \ sortsmall.c specfun.c specfun_e.c spmatrix.c stat.c statsort.c \ sum.c vector.c vectorr.c vectorview.c vectorw.c DIST_SOURCES = blas.c block.c bspline.c cblas.c cdf.c cheb.c \ combination.c const.c diff.c dwt.c eigen.c eigen_nonsymm.c \ fft.c fftmr.c fftreal.c fitreg.c fitreg2.c fitting.c \ fitting2.c fitting3.c histogram.c histogram2d.c ieee.c \ ieeeround.c integration.c interp.c interp2d.c interp_compare.c \ interpp.c intro.c largefit.c linalglu.c matrix.c matrixw.c \ min.c monte.c multiset.c nlfit.c nlfit2.c nlfit3.c nlfit4.c \ ntupler.c ntuplew.c ode-initval.c permseq.c permshuffle.c \ poisson.c polyroots.c qrng.c randpoisson.c randwalk.c rng.c \ rngunif.c robfit.c rootnewt.c roots.c rquantile.c rstat.c \ siman.c sortsmall.c specfun.c specfun_e.c spmatrix.c stat.c \ statsort.c sum.c vector.c vectorr.c vectorview.c vectorw.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ examples_src = blas.c block.c cblas.c cdf.c cheb.c combination.c multiset.c const.c demo_fn.c diff.c eigen.c fft.c fftmr.c fftreal.c fitting.c fitting2.c fitting3.c fitreg.c fitreg2.c histogram.c histogram2d.c ieee.c ieeeround.c integration.c interp.c interp2d.c intro.c linalglu.c largefit.c matrix.c matrixw.c min.c monte.c ntupler.c ntuplew.c ode-initval.c odefixed.c permseq.c permshuffle.c polyroots.c qrng.c randpoisson.c randwalk.c rng.c rngunif.c robfit.c rootnewt.c roots.c siman.c sortsmall.c specfun.c specfun_e.c rstat.c rquantile.c stat.c statsort.c sum.c vector.c vectorr.c vectorview.c vectorw.c demo_fn.h dwt.c nlfit.c nlfit2.c nlfit3.c interpp.c eigen_nonsymm.c bspline.c multimin.c multiminfn.c nmsimplex.c ode-initval-low-level.c poisson.c interp_compare.c spmatrix.c examples_txt = blas.txt block.txt bspline.txt cblas.txt cdf.txt cheb.txt combination.txt const.txt diff.txt dwt.txt eigen_nonsymm.txt eigen.txt fftmr.txt fftreal.txt fft.txt fitreg.txt fitreg2.txt fitting2.txt fitting.txt histogram2d.txt ieeeround.txt ieee.txt integration.txt interp2d.txt interp_compare.txt interpp.txt interp.txt intro.txt largefit.txt largefit2.txt linalglu.txt matrix.txt matrixw.txt min.txt monte.txt multimin.txt multiset.txt nlfit.txt nlfit2.txt nlfit3.txt nmsimplex.txt ntuple.txt ode-initval.txt permseq.txt permshuffle.txt poisson.txt polyroots.txt qrng.txt randpoisson2.txt randpoisson.txt randwalk.txt rng.txt rngunif.txt rngunif2.txt robfit.txt rootnewt.txt roots.txt rquantile.txt rstat.txt siman.txt sortsmall.txt specfun.txt specfun_e.txt spmatrix.txt statsort.txt stat.txt sum.txt vectorr.txt vectorview.txt dist_noinst_DATA = $(examples_src) $(examples_txt) LDADD = ../../libgsl.la ../../cblas/libgslcblas.la AM_DEFAULT_SOURCE_EXT = .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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/examples/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 $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list blas$(EXEEXT): $(blas_OBJECTS) $(blas_DEPENDENCIES) $(EXTRA_blas_DEPENDENCIES) @rm -f blas$(EXEEXT) $(AM_V_CCLD)$(LINK) $(blas_OBJECTS) $(blas_LDADD) $(LIBS) block$(EXEEXT): $(block_OBJECTS) $(block_DEPENDENCIES) $(EXTRA_block_DEPENDENCIES) @rm -f block$(EXEEXT) $(AM_V_CCLD)$(LINK) $(block_OBJECTS) $(block_LDADD) $(LIBS) bspline$(EXEEXT): $(bspline_OBJECTS) $(bspline_DEPENDENCIES) $(EXTRA_bspline_DEPENDENCIES) @rm -f bspline$(EXEEXT) $(AM_V_CCLD)$(LINK) $(bspline_OBJECTS) $(bspline_LDADD) $(LIBS) cblas$(EXEEXT): $(cblas_OBJECTS) $(cblas_DEPENDENCIES) $(EXTRA_cblas_DEPENDENCIES) @rm -f cblas$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cblas_OBJECTS) $(cblas_LDADD) $(LIBS) cdf$(EXEEXT): $(cdf_OBJECTS) $(cdf_DEPENDENCIES) $(EXTRA_cdf_DEPENDENCIES) @rm -f cdf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdf_OBJECTS) $(cdf_LDADD) $(LIBS) cheb$(EXEEXT): $(cheb_OBJECTS) $(cheb_DEPENDENCIES) $(EXTRA_cheb_DEPENDENCIES) @rm -f cheb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cheb_OBJECTS) $(cheb_LDADD) $(LIBS) combination$(EXEEXT): $(combination_OBJECTS) $(combination_DEPENDENCIES) $(EXTRA_combination_DEPENDENCIES) @rm -f combination$(EXEEXT) $(AM_V_CCLD)$(LINK) $(combination_OBJECTS) $(combination_LDADD) $(LIBS) const$(EXEEXT): $(const_OBJECTS) $(const_DEPENDENCIES) $(EXTRA_const_DEPENDENCIES) @rm -f const$(EXEEXT) $(AM_V_CCLD)$(LINK) $(const_OBJECTS) $(const_LDADD) $(LIBS) diff$(EXEEXT): $(diff_OBJECTS) $(diff_DEPENDENCIES) $(EXTRA_diff_DEPENDENCIES) @rm -f diff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(diff_OBJECTS) $(diff_LDADD) $(LIBS) dwt$(EXEEXT): $(dwt_OBJECTS) $(dwt_DEPENDENCIES) $(EXTRA_dwt_DEPENDENCIES) @rm -f dwt$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dwt_OBJECTS) $(dwt_LDADD) $(LIBS) eigen$(EXEEXT): $(eigen_OBJECTS) $(eigen_DEPENDENCIES) $(EXTRA_eigen_DEPENDENCIES) @rm -f eigen$(EXEEXT) $(AM_V_CCLD)$(LINK) $(eigen_OBJECTS) $(eigen_LDADD) $(LIBS) eigen_nonsymm$(EXEEXT): $(eigen_nonsymm_OBJECTS) $(eigen_nonsymm_DEPENDENCIES) $(EXTRA_eigen_nonsymm_DEPENDENCIES) @rm -f eigen_nonsymm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(eigen_nonsymm_OBJECTS) $(eigen_nonsymm_LDADD) $(LIBS) fft$(EXEEXT): $(fft_OBJECTS) $(fft_DEPENDENCIES) $(EXTRA_fft_DEPENDENCIES) @rm -f fft$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fft_OBJECTS) $(fft_LDADD) $(LIBS) fftmr$(EXEEXT): $(fftmr_OBJECTS) $(fftmr_DEPENDENCIES) $(EXTRA_fftmr_DEPENDENCIES) @rm -f fftmr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fftmr_OBJECTS) $(fftmr_LDADD) $(LIBS) fftreal$(EXEEXT): $(fftreal_OBJECTS) $(fftreal_DEPENDENCIES) $(EXTRA_fftreal_DEPENDENCIES) @rm -f fftreal$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fftreal_OBJECTS) $(fftreal_LDADD) $(LIBS) fitreg$(EXEEXT): $(fitreg_OBJECTS) $(fitreg_DEPENDENCIES) $(EXTRA_fitreg_DEPENDENCIES) @rm -f fitreg$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fitreg_OBJECTS) $(fitreg_LDADD) $(LIBS) fitreg2$(EXEEXT): $(fitreg2_OBJECTS) $(fitreg2_DEPENDENCIES) $(EXTRA_fitreg2_DEPENDENCIES) @rm -f fitreg2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fitreg2_OBJECTS) $(fitreg2_LDADD) $(LIBS) fitting$(EXEEXT): $(fitting_OBJECTS) $(fitting_DEPENDENCIES) $(EXTRA_fitting_DEPENDENCIES) @rm -f fitting$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fitting_OBJECTS) $(fitting_LDADD) $(LIBS) fitting2$(EXEEXT): $(fitting2_OBJECTS) $(fitting2_DEPENDENCIES) $(EXTRA_fitting2_DEPENDENCIES) @rm -f fitting2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fitting2_OBJECTS) $(fitting2_LDADD) $(LIBS) fitting3$(EXEEXT): $(fitting3_OBJECTS) $(fitting3_DEPENDENCIES) $(EXTRA_fitting3_DEPENDENCIES) @rm -f fitting3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fitting3_OBJECTS) $(fitting3_LDADD) $(LIBS) histogram$(EXEEXT): $(histogram_OBJECTS) $(histogram_DEPENDENCIES) $(EXTRA_histogram_DEPENDENCIES) @rm -f histogram$(EXEEXT) $(AM_V_CCLD)$(LINK) $(histogram_OBJECTS) $(histogram_LDADD) $(LIBS) histogram2d$(EXEEXT): $(histogram2d_OBJECTS) $(histogram2d_DEPENDENCIES) $(EXTRA_histogram2d_DEPENDENCIES) @rm -f histogram2d$(EXEEXT) $(AM_V_CCLD)$(LINK) $(histogram2d_OBJECTS) $(histogram2d_LDADD) $(LIBS) ieee$(EXEEXT): $(ieee_OBJECTS) $(ieee_DEPENDENCIES) $(EXTRA_ieee_DEPENDENCIES) @rm -f ieee$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ieee_OBJECTS) $(ieee_LDADD) $(LIBS) ieeeround$(EXEEXT): $(ieeeround_OBJECTS) $(ieeeround_DEPENDENCIES) $(EXTRA_ieeeround_DEPENDENCIES) @rm -f ieeeround$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ieeeround_OBJECTS) $(ieeeround_LDADD) $(LIBS) integration$(EXEEXT): $(integration_OBJECTS) $(integration_DEPENDENCIES) $(EXTRA_integration_DEPENDENCIES) @rm -f integration$(EXEEXT) $(AM_V_CCLD)$(LINK) $(integration_OBJECTS) $(integration_LDADD) $(LIBS) interp$(EXEEXT): $(interp_OBJECTS) $(interp_DEPENDENCIES) $(EXTRA_interp_DEPENDENCIES) @rm -f interp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(interp_OBJECTS) $(interp_LDADD) $(LIBS) interp2d$(EXEEXT): $(interp2d_OBJECTS) $(interp2d_DEPENDENCIES) $(EXTRA_interp2d_DEPENDENCIES) @rm -f interp2d$(EXEEXT) $(AM_V_CCLD)$(LINK) $(interp2d_OBJECTS) $(interp2d_LDADD) $(LIBS) interp_compare$(EXEEXT): $(interp_compare_OBJECTS) $(interp_compare_DEPENDENCIES) $(EXTRA_interp_compare_DEPENDENCIES) @rm -f interp_compare$(EXEEXT) $(AM_V_CCLD)$(LINK) $(interp_compare_OBJECTS) $(interp_compare_LDADD) $(LIBS) interpp$(EXEEXT): $(interpp_OBJECTS) $(interpp_DEPENDENCIES) $(EXTRA_interpp_DEPENDENCIES) @rm -f interpp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(interpp_OBJECTS) $(interpp_LDADD) $(LIBS) intro$(EXEEXT): $(intro_OBJECTS) $(intro_DEPENDENCIES) $(EXTRA_intro_DEPENDENCIES) @rm -f intro$(EXEEXT) $(AM_V_CCLD)$(LINK) $(intro_OBJECTS) $(intro_LDADD) $(LIBS) largefit$(EXEEXT): $(largefit_OBJECTS) $(largefit_DEPENDENCIES) $(EXTRA_largefit_DEPENDENCIES) @rm -f largefit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(largefit_OBJECTS) $(largefit_LDADD) $(LIBS) linalglu$(EXEEXT): $(linalglu_OBJECTS) $(linalglu_DEPENDENCIES) $(EXTRA_linalglu_DEPENDENCIES) @rm -f linalglu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(linalglu_OBJECTS) $(linalglu_LDADD) $(LIBS) matrix$(EXEEXT): $(matrix_OBJECTS) $(matrix_DEPENDENCIES) $(EXTRA_matrix_DEPENDENCIES) @rm -f matrix$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_OBJECTS) $(matrix_LDADD) $(LIBS) matrixw$(EXEEXT): $(matrixw_OBJECTS) $(matrixw_DEPENDENCIES) $(EXTRA_matrixw_DEPENDENCIES) @rm -f matrixw$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrixw_OBJECTS) $(matrixw_LDADD) $(LIBS) min$(EXEEXT): $(min_OBJECTS) $(min_DEPENDENCIES) $(EXTRA_min_DEPENDENCIES) @rm -f min$(EXEEXT) $(AM_V_CCLD)$(LINK) $(min_OBJECTS) $(min_LDADD) $(LIBS) monte$(EXEEXT): $(monte_OBJECTS) $(monte_DEPENDENCIES) $(EXTRA_monte_DEPENDENCIES) @rm -f monte$(EXEEXT) $(AM_V_CCLD)$(LINK) $(monte_OBJECTS) $(monte_LDADD) $(LIBS) multiset$(EXEEXT): $(multiset_OBJECTS) $(multiset_DEPENDENCIES) $(EXTRA_multiset_DEPENDENCIES) @rm -f multiset$(EXEEXT) $(AM_V_CCLD)$(LINK) $(multiset_OBJECTS) $(multiset_LDADD) $(LIBS) nlfit$(EXEEXT): $(nlfit_OBJECTS) $(nlfit_DEPENDENCIES) $(EXTRA_nlfit_DEPENDENCIES) @rm -f nlfit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nlfit_OBJECTS) $(nlfit_LDADD) $(LIBS) nlfit2$(EXEEXT): $(nlfit2_OBJECTS) $(nlfit2_DEPENDENCIES) $(EXTRA_nlfit2_DEPENDENCIES) @rm -f nlfit2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nlfit2_OBJECTS) $(nlfit2_LDADD) $(LIBS) nlfit3$(EXEEXT): $(nlfit3_OBJECTS) $(nlfit3_DEPENDENCIES) $(EXTRA_nlfit3_DEPENDENCIES) @rm -f nlfit3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nlfit3_OBJECTS) $(nlfit3_LDADD) $(LIBS) nlfit4$(EXEEXT): $(nlfit4_OBJECTS) $(nlfit4_DEPENDENCIES) $(EXTRA_nlfit4_DEPENDENCIES) @rm -f nlfit4$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nlfit4_OBJECTS) $(nlfit4_LDADD) $(LIBS) ntupler$(EXEEXT): $(ntupler_OBJECTS) $(ntupler_DEPENDENCIES) $(EXTRA_ntupler_DEPENDENCIES) @rm -f ntupler$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ntupler_OBJECTS) $(ntupler_LDADD) $(LIBS) ntuplew$(EXEEXT): $(ntuplew_OBJECTS) $(ntuplew_DEPENDENCIES) $(EXTRA_ntuplew_DEPENDENCIES) @rm -f ntuplew$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ntuplew_OBJECTS) $(ntuplew_LDADD) $(LIBS) ode-initval$(EXEEXT): $(ode_initval_OBJECTS) $(ode_initval_DEPENDENCIES) $(EXTRA_ode_initval_DEPENDENCIES) @rm -f ode-initval$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ode_initval_OBJECTS) $(ode_initval_LDADD) $(LIBS) permseq$(EXEEXT): $(permseq_OBJECTS) $(permseq_DEPENDENCIES) $(EXTRA_permseq_DEPENDENCIES) @rm -f permseq$(EXEEXT) $(AM_V_CCLD)$(LINK) $(permseq_OBJECTS) $(permseq_LDADD) $(LIBS) permshuffle$(EXEEXT): $(permshuffle_OBJECTS) $(permshuffle_DEPENDENCIES) $(EXTRA_permshuffle_DEPENDENCIES) @rm -f permshuffle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(permshuffle_OBJECTS) $(permshuffle_LDADD) $(LIBS) poisson$(EXEEXT): $(poisson_OBJECTS) $(poisson_DEPENDENCIES) $(EXTRA_poisson_DEPENDENCIES) @rm -f poisson$(EXEEXT) $(AM_V_CCLD)$(LINK) $(poisson_OBJECTS) $(poisson_LDADD) $(LIBS) polyroots$(EXEEXT): $(polyroots_OBJECTS) $(polyroots_DEPENDENCIES) $(EXTRA_polyroots_DEPENDENCIES) @rm -f polyroots$(EXEEXT) $(AM_V_CCLD)$(LINK) $(polyroots_OBJECTS) $(polyroots_LDADD) $(LIBS) qrng$(EXEEXT): $(qrng_OBJECTS) $(qrng_DEPENDENCIES) $(EXTRA_qrng_DEPENDENCIES) @rm -f qrng$(EXEEXT) $(AM_V_CCLD)$(LINK) $(qrng_OBJECTS) $(qrng_LDADD) $(LIBS) randpoisson$(EXEEXT): $(randpoisson_OBJECTS) $(randpoisson_DEPENDENCIES) $(EXTRA_randpoisson_DEPENDENCIES) @rm -f randpoisson$(EXEEXT) $(AM_V_CCLD)$(LINK) $(randpoisson_OBJECTS) $(randpoisson_LDADD) $(LIBS) randwalk$(EXEEXT): $(randwalk_OBJECTS) $(randwalk_DEPENDENCIES) $(EXTRA_randwalk_DEPENDENCIES) @rm -f randwalk$(EXEEXT) $(AM_V_CCLD)$(LINK) $(randwalk_OBJECTS) $(randwalk_LDADD) $(LIBS) rng$(EXEEXT): $(rng_OBJECTS) $(rng_DEPENDENCIES) $(EXTRA_rng_DEPENDENCIES) @rm -f rng$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rng_OBJECTS) $(rng_LDADD) $(LIBS) rngunif$(EXEEXT): $(rngunif_OBJECTS) $(rngunif_DEPENDENCIES) $(EXTRA_rngunif_DEPENDENCIES) @rm -f rngunif$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rngunif_OBJECTS) $(rngunif_LDADD) $(LIBS) robfit$(EXEEXT): $(robfit_OBJECTS) $(robfit_DEPENDENCIES) $(EXTRA_robfit_DEPENDENCIES) @rm -f robfit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(robfit_OBJECTS) $(robfit_LDADD) $(LIBS) rootnewt$(EXEEXT): $(rootnewt_OBJECTS) $(rootnewt_DEPENDENCIES) $(EXTRA_rootnewt_DEPENDENCIES) @rm -f rootnewt$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rootnewt_OBJECTS) $(rootnewt_LDADD) $(LIBS) roots$(EXEEXT): $(roots_OBJECTS) $(roots_DEPENDENCIES) $(EXTRA_roots_DEPENDENCIES) @rm -f roots$(EXEEXT) $(AM_V_CCLD)$(LINK) $(roots_OBJECTS) $(roots_LDADD) $(LIBS) rquantile$(EXEEXT): $(rquantile_OBJECTS) $(rquantile_DEPENDENCIES) $(EXTRA_rquantile_DEPENDENCIES) @rm -f rquantile$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rquantile_OBJECTS) $(rquantile_LDADD) $(LIBS) rstat$(EXEEXT): $(rstat_OBJECTS) $(rstat_DEPENDENCIES) $(EXTRA_rstat_DEPENDENCIES) @rm -f rstat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rstat_OBJECTS) $(rstat_LDADD) $(LIBS) siman$(EXEEXT): $(siman_OBJECTS) $(siman_DEPENDENCIES) $(EXTRA_siman_DEPENDENCIES) @rm -f siman$(EXEEXT) $(AM_V_CCLD)$(LINK) $(siman_OBJECTS) $(siman_LDADD) $(LIBS) sortsmall$(EXEEXT): $(sortsmall_OBJECTS) $(sortsmall_DEPENDENCIES) $(EXTRA_sortsmall_DEPENDENCIES) @rm -f sortsmall$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sortsmall_OBJECTS) $(sortsmall_LDADD) $(LIBS) specfun$(EXEEXT): $(specfun_OBJECTS) $(specfun_DEPENDENCIES) $(EXTRA_specfun_DEPENDENCIES) @rm -f specfun$(EXEEXT) $(AM_V_CCLD)$(LINK) $(specfun_OBJECTS) $(specfun_LDADD) $(LIBS) specfun_e$(EXEEXT): $(specfun_e_OBJECTS) $(specfun_e_DEPENDENCIES) $(EXTRA_specfun_e_DEPENDENCIES) @rm -f specfun_e$(EXEEXT) $(AM_V_CCLD)$(LINK) $(specfun_e_OBJECTS) $(specfun_e_LDADD) $(LIBS) spmatrix$(EXEEXT): $(spmatrix_OBJECTS) $(spmatrix_DEPENDENCIES) $(EXTRA_spmatrix_DEPENDENCIES) @rm -f spmatrix$(EXEEXT) $(AM_V_CCLD)$(LINK) $(spmatrix_OBJECTS) $(spmatrix_LDADD) $(LIBS) stat$(EXEEXT): $(stat_OBJECTS) $(stat_DEPENDENCIES) $(EXTRA_stat_DEPENDENCIES) @rm -f stat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(stat_OBJECTS) $(stat_LDADD) $(LIBS) statsort$(EXEEXT): $(statsort_OBJECTS) $(statsort_DEPENDENCIES) $(EXTRA_statsort_DEPENDENCIES) @rm -f statsort$(EXEEXT) $(AM_V_CCLD)$(LINK) $(statsort_OBJECTS) $(statsort_LDADD) $(LIBS) sum$(EXEEXT): $(sum_OBJECTS) $(sum_DEPENDENCIES) $(EXTRA_sum_DEPENDENCIES) @rm -f sum$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sum_OBJECTS) $(sum_LDADD) $(LIBS) vector$(EXEEXT): $(vector_OBJECTS) $(vector_DEPENDENCIES) $(EXTRA_vector_DEPENDENCIES) @rm -f vector$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vector_OBJECTS) $(vector_LDADD) $(LIBS) vectorr$(EXEEXT): $(vectorr_OBJECTS) $(vectorr_DEPENDENCIES) $(EXTRA_vectorr_DEPENDENCIES) @rm -f vectorr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vectorr_OBJECTS) $(vectorr_LDADD) $(LIBS) vectorview$(EXEEXT): $(vectorview_OBJECTS) $(vectorview_DEPENDENCIES) $(EXTRA_vectorview_DEPENDENCIES) @rm -f vectorview$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vectorview_OBJECTS) $(vectorview_LDADD) $(LIBS) vectorw$(EXEEXT): $(vectorw_OBJECTS) $(vectorw_DEPENDENCIES) $(EXTRA_vectorw_DEPENDENCIES) @rm -f vectorw$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vectorw_OBJECTS) $(vectorw_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bspline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cblas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combination.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/const.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigen_nonsymm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fftmr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fftreal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fitreg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fitreg2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fitting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fitting2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fitting3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/histogram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/histogram2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ieee.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ieeeround.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/integration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp_compare.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intro.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/largefit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linalglu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrixw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/min.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/monte.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlfit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlfit2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlfit3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlfit4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntupler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntuplew.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ode-initval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permseq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permshuffle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyroots.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrng.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randpoisson.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randwalk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rng.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rngunif.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/robfit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rootnewt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/roots.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rquantile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rstat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortsmall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specfun.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specfun_e.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmatrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statsort.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorw.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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) check: check-am all-am: Makefile $(DATA) 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am 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 tags-am uninstall uninstall-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: gsl-doc-2.3/doc/examples/fftreal.txt0000664000175000017500000000652512620432033015534 0ustar eddedd0: 0.000000e+00 1: 0.000000e+00 2: 0.000000e+00 3: 0.000000e+00 4: 0.000000e+00 5: 0.000000e+00 6: 0.000000e+00 7: 0.000000e+00 8: 0.000000e+00 9: 0.000000e+00 10: 0.000000e+00 11: 0.000000e+00 12: 0.000000e+00 13: 0.000000e+00 14: 0.000000e+00 15: 0.000000e+00 16: 0.000000e+00 17: 0.000000e+00 18: 0.000000e+00 19: 0.000000e+00 20: 0.000000e+00 21: 0.000000e+00 22: 0.000000e+00 23: 0.000000e+00 24: 0.000000e+00 25: 0.000000e+00 26: 0.000000e+00 27: 0.000000e+00 28: 0.000000e+00 29: 0.000000e+00 30: 0.000000e+00 31: 0.000000e+00 32: 0.000000e+00 33: 1.000000e+00 34: 1.000000e+00 35: 1.000000e+00 36: 1.000000e+00 37: 1.000000e+00 38: 1.000000e+00 39: 1.000000e+00 40: 1.000000e+00 41: 1.000000e+00 42: 1.000000e+00 43: 1.000000e+00 44: 1.000000e+00 45: 1.000000e+00 46: 1.000000e+00 47: 1.000000e+00 48: 1.000000e+00 49: 1.000000e+00 50: 1.000000e+00 51: 1.000000e+00 52: 1.000000e+00 53: 1.000000e+00 54: 1.000000e+00 55: 1.000000e+00 56: 1.000000e+00 57: 1.000000e+00 58: 1.000000e+00 59: 1.000000e+00 60: 1.000000e+00 61: 1.000000e+00 62: 1.000000e+00 63: 1.000000e+00 64: 1.000000e+00 65: 1.000000e+00 66: 0.000000e+00 67: 0.000000e+00 68: 0.000000e+00 69: 0.000000e+00 70: 0.000000e+00 71: 0.000000e+00 72: 0.000000e+00 73: 0.000000e+00 74: 0.000000e+00 75: 0.000000e+00 76: 0.000000e+00 77: 0.000000e+00 78: 0.000000e+00 79: 0.000000e+00 80: 0.000000e+00 81: 0.000000e+00 82: 0.000000e+00 83: 0.000000e+00 84: 0.000000e+00 85: 0.000000e+00 86: 0.000000e+00 87: 0.000000e+00 88: 0.000000e+00 89: 0.000000e+00 90: 0.000000e+00 91: 0.000000e+00 92: 0.000000e+00 93: 0.000000e+00 94: 0.000000e+00 95: 0.000000e+00 96: 0.000000e+00 97: 0.000000e+00 98: 0.000000e+00 99: 0.000000e+00 0: 3.122705e-02 1: 2.450194e-02 2: 1.427646e-02 3: 1.899536e-03 4: -1.097701e-02 5: -2.260263e-02 6: -3.134804e-02 7: -3.591554e-02 8: -3.551489e-02 9: -2.998321e-02 10: -1.983327e-02 11: -6.221841e-03 12: 9.161253e-03 13: 2.427436e-02 14: 3.695824e-02 15: 4.519985e-02 16: 4.739798e-02 17: 4.260194e-02 18: 3.069621e-02 19: 1.250816e-02 20: -1.017626e-02 21: -3.469604e-02 22: -5.769429e-02 23: -7.538051e-02 24: -8.385398e-02 25: -7.945977e-02 26: -5.914429e-02 27: -2.077636e-02 28: 3.659819e-02 29: 1.125953e-01 30: 2.054434e-01 31: 3.120546e-01 32: 4.282146e-01 33: 5.488770e-01 34: 6.685387e-01 35: 7.816653e-01 36: 8.831282e-01 37: 9.686159e-01 38: 1.034981e+00 39: 1.080492e+00 40: 1.104967e+00 41: 1.109770e+00 42: 1.097677e+00 43: 1.072623e+00 44: 1.039334e+00 45: 1.002904e+00 46: 9.683306e-01 47: 9.400659e-01 48: 9.216117e-01 49: 9.152040e-01 50: 9.216117e-01 51: 9.400659e-01 52: 9.683306e-01 53: 1.002904e+00 54: 1.039334e+00 55: 1.072623e+00 56: 1.097677e+00 57: 1.109770e+00 58: 1.104967e+00 59: 1.080492e+00 60: 1.034981e+00 61: 9.686159e-01 62: 8.831282e-01 63: 7.816653e-01 64: 6.685387e-01 65: 5.488770e-01 66: 4.282146e-01 67: 3.120546e-01 68: 2.054434e-01 69: 1.125953e-01 70: 3.659819e-02 71: -2.077636e-02 72: -5.914429e-02 73: -7.945977e-02 74: -8.385398e-02 75: -7.538051e-02 76: -5.769429e-02 77: -3.469604e-02 78: -1.017626e-02 79: 1.250816e-02 80: 3.069621e-02 81: 4.260194e-02 82: 4.739798e-02 83: 4.519985e-02 84: 3.695824e-02 85: 2.427436e-02 86: 9.161253e-03 87: -6.221841e-03 88: -1.983327e-02 89: -2.998321e-02 90: -3.551489e-02 91: -3.591554e-02 92: -3.134804e-02 93: -2.260263e-02 94: -1.097701e-02 95: 1.899536e-03 96: 1.427646e-02 97: 2.450194e-02 98: 3.122705e-02 99: 3.357077e-02 gsl-doc-2.3/doc/examples/randwalk.txt0000664000175000017500000000030012620442163015702 0ustar eddedd0 0 -0.617746 -0.786378 0.376003 -0.674734 -0.569808 -0.350015 -0.112542 0.539315 -0.575798 -0.34691 -1.56878 -0.465204 -2.47057 -0.0330451 -2.50057 0.966505 -1.72376 1.59625 -2.64634 1.98207 gsl-doc-2.3/doc/examples/multimin.c0000664000175000017500000000231712616277724015370 0ustar eddeddint main (void) { size_t iter = 0; int status; const gsl_multimin_fdfminimizer_type *T; gsl_multimin_fdfminimizer *s; /* Position of the minimum (1,2), scale factors 10,20, height 30. */ double par[5] = { 1.0, 2.0, 10.0, 20.0, 30.0 }; gsl_vector *x; gsl_multimin_function_fdf my_func; my_func.n = 2; my_func.f = my_f; my_func.df = my_df; my_func.fdf = my_fdf; 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; } gsl-doc-2.3/doc/examples/poisson.c0000644000175000017500000000540412736044021015203 0ustar eddedd#include #include #include #include #include #include #include int main() { const size_t N = 100; /* number of grid points */ const size_t n = N - 2; /* subtract 2 to exclude boundaries */ const double h = 1.0 / (N - 1.0); /* grid spacing */ gsl_spmatrix *A = gsl_spmatrix_alloc(n ,n); /* triplet format */ gsl_spmatrix *C; /* compressed format */ gsl_vector *f = gsl_vector_alloc(n); /* right hand side vector */ gsl_vector *u = gsl_vector_alloc(n); /* solution vector */ size_t i; /* construct the sparse matrix for the finite difference equation */ /* construct first row */ gsl_spmatrix_set(A, 0, 0, -2.0); gsl_spmatrix_set(A, 0, 1, 1.0); /* construct rows [1:n-2] */ for (i = 1; i < n - 1; ++i) { gsl_spmatrix_set(A, i, i + 1, 1.0); gsl_spmatrix_set(A, i, i, -2.0); gsl_spmatrix_set(A, i, i - 1, 1.0); } /* construct last row */ gsl_spmatrix_set(A, n - 1, n - 1, -2.0); gsl_spmatrix_set(A, n - 1, n - 2, 1.0); /* scale by h^2 */ gsl_spmatrix_scale(A, 1.0 / (h * h)); /* construct right hand side vector */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double fi = -M_PI * M_PI * sin(M_PI * xi); gsl_vector_set(f, i, fi); } /* convert to compressed column format */ C = gsl_spmatrix_ccs(A); /* now solve the system with the GMRES iterative solver */ { const double tol = 1.0e-6; /* solution relative tolerance */ const size_t max_iter = 10; /* maximum iterations */ const gsl_splinalg_itersolve_type *T = gsl_splinalg_itersolve_gmres; gsl_splinalg_itersolve *work = gsl_splinalg_itersolve_alloc(T, n, 0); size_t iter = 0; double residual; int status; /* initial guess u = 0 */ gsl_vector_set_zero(u); /* solve the system A u = f */ do { status = gsl_splinalg_itersolve_iterate(C, f, tol, u, work); /* print out residual norm ||A*u - f|| */ residual = gsl_splinalg_itersolve_normr(work); fprintf(stderr, "iter %zu residual = %.12e\n", iter, residual); if (status == GSL_SUCCESS) fprintf(stderr, "Converged\n"); } while (status == GSL_CONTINUE && ++iter < max_iter); /* output solution */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double u_exact = sin(M_PI * xi); double u_gsl = gsl_vector_get(u, i); printf("%f %.12e %.12e\n", xi, u_gsl, u_exact); } gsl_splinalg_itersolve_free(work); } gsl_spmatrix_free(A); gsl_spmatrix_free(C); gsl_vector_free(f); gsl_vector_free(u); return 0; } /* main() */ gsl-doc-2.3/doc/examples/vectorr.txt0000664000175000017500000000006312620444412015570 0ustar eddedd1.23 2.23 3.23 4.23 5.23 6.23 7.23 8.23 9.23 10.23 gsl-doc-2.3/doc/examples/multimin.txt0000664000175000017500000000073412620026734015752 0ustar eddedd 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 gsl-doc-2.3/doc/examples/block.c0000664000175000017500000000036212620167243014607 0ustar eddedd#include #include int main (void) { gsl_block * b = gsl_block_alloc (100); printf ("length of block = %zu\n", b->size); printf ("block data address = %p\n", b->data); gsl_block_free (b); return 0; } gsl-doc-2.3/doc/examples/vectorview.c0000664000175000017500000000102212620170510015673 0ustar eddedd#include #include #include #include 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 %zu, norm = %g\n", j, d); } gsl_matrix_free (m); return 0; } gsl-doc-2.3/doc/examples/intro.txt0000664000175000017500000000004212620435776015251 0ustar eddeddJ0(5) = -1.775967713143382642e-01 gsl-doc-2.3/doc/examples/rstat.txt0000644000175000017500000000062112774420036015245 0ustar eddeddThe dataset is 17.2, 18.1, 16.5, 18.3, 12.6 The sample mean is 16.54 The estimated variance is 5.373 The largest value is 18.3 The smallest value is 12.6 The median is 16.5 The standard deviation is 2.31797 The root mean square is 16.6694 The standard devation of the mean is 1.03663 The skew is -0.829058 The kurtosis -1.2217 There are 5 items in the accumulator There are 0 items in the accumulator gsl-doc-2.3/doc/examples/linalglu.c0000664000175000017500000000136312616157443015334 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/rngunif.c0000664000175000017500000000052112616157443015170 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/multiset.c0000664000175000017500000000071212616157443015370 0ustar eddedd#include #include int main (void) { gsl_multiset * c; size_t i; printf ("All multisets of {0,1,2,3} by size:\n") ; for (i = 0; i <= 4; i++) { c = gsl_multiset_calloc (4, i); do { printf ("{"); gsl_multiset_fprintf (stdout, c, " %u"); printf (" }\n"); } while (gsl_multiset_next (c) == GSL_SUCCESS); gsl_multiset_free (c); } return 0; } gsl-doc-2.3/doc/examples/nlfit4.c0000644000175000017500000001267712767073700014735 0ustar eddedd#include #include #include #include #include #include #include #include #include /* parameters for functions */ struct model_params { double alpha; gsl_spmatrix *J; }; /* penalty function */ int penalty_f (const gsl_vector * x, void *params, gsl_vector * f) { struct model_params *par = (struct model_params *) params; const double sqrt_alpha = sqrt(par->alpha); const size_t p = x->size; size_t i; double sum = 0.0; for (i = 0; i < p; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, sqrt_alpha*(xi - 1.0)); sum += xi * xi; } gsl_vector_set(f, p, sum - 0.25); return GSL_SUCCESS; } int penalty_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { struct model_params *par = (struct model_params *) params; const size_t p = x->size; size_t j; /* store 2*x in last row of J */ for (j = 0; j < p; ++j) { double xj = gsl_vector_get(x, j); gsl_spmatrix_set(par->J, p, j, 2.0 * xj); } /* compute v = op(J) u */ if (v) gsl_spblas_dgemv(TransJ, 1.0, par->J, u, 0.0, v); if (JTJ) { gsl_vector_view diag = gsl_matrix_diagonal(JTJ); /* compute J^T J = [ alpha*I_p + 4 x x^T ] */ gsl_matrix_set_zero(JTJ); /* store 4 x x^T in lower half of JTJ */ gsl_blas_dsyr(CblasLower, 4.0, x, JTJ); /* add alpha to diag(JTJ) */ gsl_vector_add_constant(&diag.vector, par->alpha); } return GSL_SUCCESS; } int penalty_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const size_t p = x->size; double normv = gsl_blas_dnrm2(v); gsl_vector_set_zero(fvv); gsl_vector_set(fvv, p, 2.0 * normv * normv); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } void solve_system(const gsl_vector *x0, gsl_multilarge_nlinear_fdf *fdf, gsl_multilarge_nlinear_parameters *params) { const gsl_multilarge_nlinear_type *T = gsl_multilarge_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multilarge_nlinear_workspace *work = gsl_multilarge_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multilarge_nlinear_residual(work); gsl_vector * x = gsl_multilarge_nlinear_position(work); int info; double chisq0, chisq, rcond, xsq; struct timeval tv0, tv1; gettimeofday(&tv0, NULL); /* initialize solver */ gsl_multilarge_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multilarge_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, work); gettimeofday(&tv1, NULL); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* compute final ||x||^2 */ gsl_blas_ddot(x, x, &xsq); /* store cond(J(x)) */ gsl_multilarge_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "%-25s %-5zu %-4zu %-5zu %-6zu %-4zu %-10.4e %-10.4e %-7.2f %-11.4e %.2f\n", gsl_multilarge_nlinear_trs_name(work), gsl_multilarge_nlinear_niter(work), fdf->nevalf, fdf->nevaldfu, fdf->nevaldf2, fdf->nevalfvv, chisq0, chisq, 1.0 / rcond, xsq, (tv1.tv_sec - tv0.tv_sec) + 1.0e-6 * (tv1.tv_usec - tv0.tv_usec)); gsl_multilarge_nlinear_free(work); } int main (void) { const size_t p = 2000; const size_t n = p + 1; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); /* allocate sparse Jacobian matrix with 2*p non-zero elements in triplet format */ gsl_spmatrix *J = gsl_spmatrix_alloc_nzmax(n, p, 2 * p, GSL_SPMATRIX_TRIPLET); gsl_multilarge_nlinear_fdf fdf; gsl_multilarge_nlinear_parameters fdf_params = gsl_multilarge_nlinear_default_parameters(); struct model_params params; size_t i; params.alpha = 1.0e-5; params.J = J; /* define function to be minimized */ fdf.f = penalty_f; fdf.df = penalty_df; fdf.fvv = penalty_fvv; fdf.n = n; fdf.p = p; fdf.params = ¶ms; for (i = 0; i < p; ++i) { /* starting point */ gsl_vector_set(x, i, i + 1.0); /* store sqrt(alpha)*I_p in upper p-by-p block of J */ gsl_spmatrix_set(J, i, i, sqrt(params.alpha)); } fprintf(stderr, "%-25s %-4s %-4s %-5s %-6s %-4s %-10s %-10s %-7s %-11s %-10s\n", "Method", "NITER", "NFEV", "NJUEV", "NJTJEV", "NAEV", "Init Cost", "Final cost", "cond(J)", "Final |x|^2", "Time (s)"); fdf_params.scale = gsl_multilarge_nlinear_scale_levenberg; fdf_params.trs = gsl_multilarge_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_dogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_ddogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_subspace2D; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_cgst; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); gsl_spmatrix_free(J); return 0; } gsl-doc-2.3/doc/examples/specfun.txt0000664000175000017500000000010012620443677015553 0ustar eddeddJ0(5.0) = -0.177596771314338264 exact = -0.177596771314338292 gsl-doc-2.3/doc/examples/fitting2.c0000664000175000017500000000340712616157443015254 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/ntuplew.c0000664000175000017500000000130612620444473015215 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/nlfit3.txt0000644000175000017500000437560712764323454015343 0ustar eddedd-5.000000 -5.000000 505.002695 -5.000000 -4.900000 500.575223 -5.000000 -4.800000 496.167751 -5.000000 -4.700000 491.780279 -5.000000 -4.600000 487.412807 -5.000000 -4.500000 483.065335 -5.000000 -4.400000 478.737863 -5.000000 -4.300000 474.430391 -5.000000 -4.200000 470.142919 -5.000000 -4.100000 465.875447 -5.000000 -4.000000 461.627975 -5.000000 -3.900000 457.400503 -5.000000 -3.800000 453.193031 -5.000000 -3.700000 449.005559 -5.000000 -3.600000 444.838087 -5.000000 -3.500000 440.690615 -5.000000 -3.400000 436.563143 -5.000000 -3.300000 432.455671 -5.000000 -3.200000 428.368199 -5.000000 -3.100000 424.300727 -5.000000 -3.000000 420.253255 -5.000000 -2.900000 416.225783 -5.000000 -2.800000 412.218311 -5.000000 -2.700000 408.230839 -5.000000 -2.600000 404.263367 -5.000000 -2.500000 400.315895 -5.000000 -2.400000 396.388423 -5.000000 -2.300000 392.480951 -5.000000 -2.200000 388.593479 -5.000000 -2.100000 384.726008 -5.000000 -2.000000 380.878536 -5.000000 -1.900000 377.051064 -5.000000 -1.800000 373.243592 -5.000000 -1.700000 369.456120 -5.000000 -1.600000 365.688648 -5.000000 -1.500000 361.941176 -5.000000 -1.400000 358.213704 -5.000000 -1.300000 354.506232 -5.000000 -1.200000 350.818760 -5.000000 -1.100000 347.151288 -5.000000 -1.000000 343.503816 -5.000000 -0.900000 339.876344 -5.000000 -0.800000 336.268872 -5.000000 -0.700000 332.681400 -5.000000 -0.600000 329.113928 -5.000000 -0.500000 325.566456 -5.000000 -0.400000 322.038984 -5.000000 -0.300000 318.531512 -5.000000 -0.200000 315.044040 -5.000000 -0.100000 311.576568 -5.000000 -0.000000 308.129096 -5.000000 0.100000 304.701624 -5.000000 0.200000 301.294152 -5.000000 0.300000 297.906680 -5.000000 0.400000 294.539208 -5.000000 0.500000 291.191736 -5.000000 0.600000 287.864264 -5.000000 0.700000 284.556792 -5.000000 0.800000 281.269320 -5.000000 0.900000 278.001848 -5.000000 1.000000 274.754376 -5.000000 1.100000 271.526904 -5.000000 1.200000 268.319432 -5.000000 1.300000 265.131960 -5.000000 1.400000 261.964488 -5.000000 1.500000 258.817016 -5.000000 1.600000 255.689544 -5.000000 1.700000 252.582072 -5.000000 1.800000 249.494600 -5.000000 1.900000 246.427128 -5.000000 2.000000 243.379656 -5.000000 2.100000 240.352185 -5.000000 2.200000 237.344713 -5.000000 2.300000 234.357241 -5.000000 2.400000 231.389769 -5.000000 2.500000 228.442297 -5.000000 2.600000 225.514825 -5.000000 2.700000 222.607353 -5.000000 2.800000 219.719881 -5.000000 2.900000 216.852409 -5.000000 3.000000 214.004937 -5.000000 3.100000 211.177465 -5.000000 3.200000 208.369993 -5.000000 3.300000 205.582521 -5.000000 3.400000 202.815049 -5.000000 3.500000 200.067577 -5.000000 3.600000 197.340105 -5.000000 3.700000 194.632633 -5.000000 3.800000 191.945161 -5.000000 3.900000 189.277689 -5.000000 4.000000 186.630217 -5.000000 4.100000 184.002745 -5.000000 4.200000 181.395273 -5.000000 4.300000 178.807801 -5.000000 4.400000 176.240329 -5.000000 4.500000 173.692857 -5.000000 4.600000 171.165385 -5.000000 4.700000 168.657913 -5.000000 4.800000 166.170441 -5.000000 4.900000 163.702969 -5.000000 5.000000 161.255497 -5.000000 5.100000 158.828025 -5.000000 5.200000 156.420553 -5.000000 5.300000 154.033081 -5.000000 5.400000 151.665609 -5.000000 5.500000 149.318137 -5.000000 5.600000 146.990665 -5.000000 5.700000 144.683193 -5.000000 5.800000 142.395721 -5.000000 5.900000 140.128249 -5.000000 6.000000 137.880777 -5.000000 6.100000 135.653305 -5.000000 6.200000 133.445833 -5.000000 6.300000 131.258361 -5.000000 6.400000 129.090890 -5.000000 6.500000 126.943418 -5.000000 6.600000 124.815946 -5.000000 6.700000 122.708474 -5.000000 6.800000 120.621002 -5.000000 6.900000 118.553530 -5.000000 7.000000 116.506058 -5.000000 7.100000 114.478586 -5.000000 7.200000 112.471114 -5.000000 7.300000 110.483642 -5.000000 7.400000 108.516170 -5.000000 7.500000 106.568698 -5.000000 7.600000 104.641226 -5.000000 7.700000 102.733754 -5.000000 7.800000 100.846282 -5.000000 7.900000 98.978810 -5.000000 8.000000 97.131338 -5.000000 8.100000 95.303866 -5.000000 8.200000 93.496394 -5.000000 8.300000 91.708922 -5.000000 8.400000 89.941450 -5.000000 8.500000 88.193978 -5.000000 8.600000 86.466506 -5.000000 8.700000 84.759034 -5.000000 8.800000 83.071562 -5.000000 8.900000 81.404090 -5.000000 9.000000 79.756618 -5.000000 9.100000 78.129146 -5.000000 9.200000 76.521674 -5.000000 9.300000 74.934202 -5.000000 9.400000 73.366730 -5.000000 9.500000 71.819258 -5.000000 9.600000 70.291786 -5.000000 9.700000 68.784314 -5.000000 9.800000 67.296842 -5.000000 9.900000 65.829370 -5.000000 10.000000 64.381898 -5.000000 10.100000 62.954426 -5.000000 10.200000 61.546954 -5.000000 10.300000 60.159482 -5.000000 10.400000 58.792010 -5.000000 10.500000 57.444538 -5.000000 10.600000 56.117066 -5.000000 10.700000 54.809595 -5.000000 10.800000 53.522123 -5.000000 10.900000 52.254651 -5.000000 11.000000 51.007179 -5.000000 11.100000 49.779707 -5.000000 11.200000 48.572235 -5.000000 11.300000 47.384763 -5.000000 11.400000 46.217291 -5.000000 11.500000 45.069819 -5.000000 11.600000 43.942347 -5.000000 11.700000 42.834875 -5.000000 11.800000 41.747403 -5.000000 11.900000 40.679931 -5.000000 12.000000 39.632459 -5.000000 12.100000 38.604987 -5.000000 12.200000 37.597515 -5.000000 12.300000 36.610043 -5.000000 12.400000 35.642571 -5.000000 12.500000 34.695099 -5.000000 12.600000 33.767627 -5.000000 12.700000 32.860155 -5.000000 12.800000 31.972683 -5.000000 12.900000 31.105211 -5.000000 13.000000 30.257739 -5.000000 13.100000 29.430267 -5.000000 13.200000 28.622795 -5.000000 13.300000 27.835323 -5.000000 13.400000 27.067851 -5.000000 13.500000 26.320379 -5.000000 13.600000 25.592907 -5.000000 13.700000 24.885435 -5.000000 13.800000 24.197963 -5.000000 13.900000 23.530491 -5.000000 14.000000 22.883019 -5.000000 14.100000 22.255547 -5.000000 14.200000 21.648075 -5.000000 14.300000 21.060603 -5.000000 14.400000 20.493131 -5.000000 14.500000 19.945659 -5.000000 14.600000 19.418187 -5.000000 14.700000 18.910715 -5.000000 14.800000 18.423243 -5.000000 14.900000 17.955771 -5.000000 15.000000 17.508300 -4.900000 -5.000000 491.414591 -4.900000 -4.900000 487.044528 -4.900000 -4.800000 482.694466 -4.900000 -4.700000 478.364403 -4.900000 -4.600000 474.054341 -4.900000 -4.500000 469.764278 -4.900000 -4.400000 465.494216 -4.900000 -4.300000 461.244153 -4.900000 -4.200000 457.014091 -4.900000 -4.100000 452.804028 -4.900000 -4.000000 448.613966 -4.900000 -3.900000 444.443904 -4.900000 -3.800000 440.293841 -4.900000 -3.700000 436.163779 -4.900000 -3.600000 432.053716 -4.900000 -3.500000 427.963654 -4.900000 -3.400000 423.893591 -4.900000 -3.300000 419.843529 -4.900000 -3.200000 415.813466 -4.900000 -3.100000 411.803404 -4.900000 -3.000000 407.813341 -4.900000 -2.900000 403.843279 -4.900000 -2.800000 399.893217 -4.900000 -2.700000 395.963154 -4.900000 -2.600000 392.053092 -4.900000 -2.500000 388.163029 -4.900000 -2.400000 384.292967 -4.900000 -2.300000 380.442904 -4.900000 -2.200000 376.612842 -4.900000 -2.100000 372.802779 -4.900000 -2.000000 369.012717 -4.900000 -1.900000 365.242654 -4.900000 -1.800000 361.492592 -4.900000 -1.700000 357.762530 -4.900000 -1.600000 354.052467 -4.900000 -1.500000 350.362405 -4.900000 -1.400000 346.692342 -4.900000 -1.300000 343.042280 -4.900000 -1.200000 339.412217 -4.900000 -1.100000 335.802155 -4.900000 -1.000000 332.212092 -4.900000 -0.900000 328.642030 -4.900000 -0.800000 325.091967 -4.900000 -0.700000 321.561905 -4.900000 -0.600000 318.051843 -4.900000 -0.500000 314.561780 -4.900000 -0.400000 311.091718 -4.900000 -0.300000 307.641655 -4.900000 -0.200000 304.211593 -4.900000 -0.100000 300.801530 -4.900000 -0.000000 297.411468 -4.900000 0.100000 294.041405 -4.900000 0.200000 290.691343 -4.900000 0.300000 287.361280 -4.900000 0.400000 284.051218 -4.900000 0.500000 280.761156 -4.900000 0.600000 277.491093 -4.900000 0.700000 274.241031 -4.900000 0.800000 271.010968 -4.900000 0.900000 267.800906 -4.900000 1.000000 264.610843 -4.900000 1.100000 261.440781 -4.900000 1.200000 258.290718 -4.900000 1.300000 255.160656 -4.900000 1.400000 252.050593 -4.900000 1.500000 248.960531 -4.900000 1.600000 245.890469 -4.900000 1.700000 242.840406 -4.900000 1.800000 239.810344 -4.900000 1.900000 236.800281 -4.900000 2.000000 233.810219 -4.900000 2.100000 230.840156 -4.900000 2.200000 227.890094 -4.900000 2.300000 224.960031 -4.900000 2.400000 222.049969 -4.900000 2.500000 219.159906 -4.900000 2.600000 216.289844 -4.900000 2.700000 213.439782 -4.900000 2.800000 210.609719 -4.900000 2.900000 207.799657 -4.900000 3.000000 205.009594 -4.900000 3.100000 202.239532 -4.900000 3.200000 199.489469 -4.900000 3.300000 196.759407 -4.900000 3.400000 194.049344 -4.900000 3.500000 191.359282 -4.900000 3.600000 188.689219 -4.900000 3.700000 186.039157 -4.900000 3.800000 183.409095 -4.900000 3.900000 180.799032 -4.900000 4.000000 178.208970 -4.900000 4.100000 175.638907 -4.900000 4.200000 173.088845 -4.900000 4.300000 170.558782 -4.900000 4.400000 168.048720 -4.900000 4.500000 165.558657 -4.900000 4.600000 163.088595 -4.900000 4.700000 160.638532 -4.900000 4.800000 158.208470 -4.900000 4.900000 155.798408 -4.900000 5.000000 153.408345 -4.900000 5.100000 151.038283 -4.900000 5.200000 148.688220 -4.900000 5.300000 146.358158 -4.900000 5.400000 144.048095 -4.900000 5.500000 141.758033 -4.900000 5.600000 139.487970 -4.900000 5.700000 137.237908 -4.900000 5.800000 135.007845 -4.900000 5.900000 132.797783 -4.900000 6.000000 130.607720 -4.900000 6.100000 128.437658 -4.900000 6.200000 126.287596 -4.900000 6.300000 124.157533 -4.900000 6.400000 122.047471 -4.900000 6.500000 119.957408 -4.900000 6.600000 117.887346 -4.900000 6.700000 115.837283 -4.900000 6.800000 113.807221 -4.900000 6.900000 111.797158 -4.900000 7.000000 109.807096 -4.900000 7.100000 107.837033 -4.900000 7.200000 105.886971 -4.900000 7.300000 103.956909 -4.900000 7.400000 102.046846 -4.900000 7.500000 100.156784 -4.900000 7.600000 98.286721 -4.900000 7.700000 96.436659 -4.900000 7.800000 94.606596 -4.900000 7.900000 92.796534 -4.900000 8.000000 91.006471 -4.900000 8.100000 89.236409 -4.900000 8.200000 87.486346 -4.900000 8.300000 85.756284 -4.900000 8.400000 84.046222 -4.900000 8.500000 82.356159 -4.900000 8.600000 80.686097 -4.900000 8.700000 79.036034 -4.900000 8.800000 77.405972 -4.900000 8.900000 75.795909 -4.900000 9.000000 74.205847 -4.900000 9.100000 72.635784 -4.900000 9.200000 71.085722 -4.900000 9.300000 69.555659 -4.900000 9.400000 68.045597 -4.900000 9.500000 66.555535 -4.900000 9.600000 65.085472 -4.900000 9.700000 63.635410 -4.900000 9.800000 62.205347 -4.900000 9.900000 60.795285 -4.900000 10.000000 59.405222 -4.900000 10.100000 58.035160 -4.900000 10.200000 56.685097 -4.900000 10.300000 55.355035 -4.900000 10.400000 54.044972 -4.900000 10.500000 52.754910 -4.900000 10.600000 51.484848 -4.900000 10.700000 50.234785 -4.900000 10.800000 49.004723 -4.900000 10.900000 47.794660 -4.900000 11.000000 46.604598 -4.900000 11.100000 45.434535 -4.900000 11.200000 44.284473 -4.900000 11.300000 43.154410 -4.900000 11.400000 42.044348 -4.900000 11.500000 40.954285 -4.900000 11.600000 39.884223 -4.900000 11.700000 38.834161 -4.900000 11.800000 37.804098 -4.900000 11.900000 36.794036 -4.900000 12.000000 35.803973 -4.900000 12.100000 34.833911 -4.900000 12.200000 33.883848 -4.900000 12.300000 32.953786 -4.900000 12.400000 32.043723 -4.900000 12.500000 31.153661 -4.900000 12.600000 30.283598 -4.900000 12.700000 29.433536 -4.900000 12.800000 28.603474 -4.900000 12.900000 27.793411 -4.900000 13.000000 27.003349 -4.900000 13.100000 26.233286 -4.900000 13.200000 25.483224 -4.900000 13.300000 24.753161 -4.900000 13.400000 24.043099 -4.900000 13.500000 23.353036 -4.900000 13.600000 22.682974 -4.900000 13.700000 22.032911 -4.900000 13.800000 21.402849 -4.900000 13.900000 20.792787 -4.900000 14.000000 20.202724 -4.900000 14.100000 19.632662 -4.900000 14.200000 19.082599 -4.900000 14.300000 18.552537 -4.900000 14.400000 18.042474 -4.900000 14.500000 17.552412 -4.900000 14.600000 17.082349 -4.900000 14.700000 16.632287 -4.900000 14.800000 16.202224 -4.900000 14.900000 15.792162 -4.900000 15.000000 15.402100 -4.800000 -5.000000 478.085075 -4.800000 -4.900000 473.771906 -4.800000 -4.800000 469.478736 -4.800000 -4.700000 465.205566 -4.800000 -4.600000 460.952397 -4.800000 -4.500000 456.719227 -4.800000 -4.400000 452.506057 -4.800000 -4.300000 448.312888 -4.800000 -4.200000 444.139718 -4.800000 -4.100000 439.986548 -4.800000 -4.000000 435.853379 -4.800000 -3.900000 431.740209 -4.800000 -3.800000 427.647039 -4.800000 -3.700000 423.573870 -4.800000 -3.600000 419.520700 -4.800000 -3.500000 415.487530 -4.800000 -3.400000 411.474361 -4.800000 -3.300000 407.481191 -4.800000 -3.200000 403.508021 -4.800000 -3.100000 399.554852 -4.800000 -3.000000 395.621682 -4.800000 -2.900000 391.708512 -4.800000 -2.800000 387.815343 -4.800000 -2.700000 383.942173 -4.800000 -2.600000 380.089003 -4.800000 -2.500000 376.255834 -4.800000 -2.400000 372.442664 -4.800000 -2.300000 368.649494 -4.800000 -2.200000 364.876325 -4.800000 -2.100000 361.123155 -4.800000 -2.000000 357.389985 -4.800000 -1.900000 353.676816 -4.800000 -1.800000 349.983646 -4.800000 -1.700000 346.310476 -4.800000 -1.600000 342.657307 -4.800000 -1.500000 339.024137 -4.800000 -1.400000 335.410967 -4.800000 -1.300000 331.817798 -4.800000 -1.200000 328.244628 -4.800000 -1.100000 324.691458 -4.800000 -1.000000 321.158289 -4.800000 -0.900000 317.645119 -4.800000 -0.800000 314.151949 -4.800000 -0.700000 310.678779 -4.800000 -0.600000 307.225610 -4.800000 -0.500000 303.792440 -4.800000 -0.400000 300.379270 -4.800000 -0.300000 296.986101 -4.800000 -0.200000 293.612931 -4.800000 -0.100000 290.259761 -4.800000 -0.000000 286.926592 -4.800000 0.100000 283.613422 -4.800000 0.200000 280.320252 -4.800000 0.300000 277.047083 -4.800000 0.400000 273.793913 -4.800000 0.500000 270.560743 -4.800000 0.600000 267.347574 -4.800000 0.700000 264.154404 -4.800000 0.800000 260.981234 -4.800000 0.900000 257.828065 -4.800000 1.000000 254.694895 -4.800000 1.100000 251.581725 -4.800000 1.200000 248.488556 -4.800000 1.300000 245.415386 -4.800000 1.400000 242.362216 -4.800000 1.500000 239.329047 -4.800000 1.600000 236.315877 -4.800000 1.700000 233.322707 -4.800000 1.800000 230.349538 -4.800000 1.900000 227.396368 -4.800000 2.000000 224.463198 -4.800000 2.100000 221.550029 -4.800000 2.200000 218.656859 -4.800000 2.300000 215.783689 -4.800000 2.400000 212.930520 -4.800000 2.500000 210.097350 -4.800000 2.600000 207.284180 -4.800000 2.700000 204.491011 -4.800000 2.800000 201.717841 -4.800000 2.900000 198.964671 -4.800000 3.000000 196.231502 -4.800000 3.100000 193.518332 -4.800000 3.200000 190.825162 -4.800000 3.300000 188.151993 -4.800000 3.400000 185.498823 -4.800000 3.500000 182.865653 -4.800000 3.600000 180.252484 -4.800000 3.700000 177.659314 -4.800000 3.800000 175.086144 -4.800000 3.900000 172.532975 -4.800000 4.000000 169.999805 -4.800000 4.100000 167.486635 -4.800000 4.200000 164.993466 -4.800000 4.300000 162.520296 -4.800000 4.400000 160.067126 -4.800000 4.500000 157.633957 -4.800000 4.600000 155.220787 -4.800000 4.700000 152.827617 -4.800000 4.800000 150.454448 -4.800000 4.900000 148.101278 -4.800000 5.000000 145.768108 -4.800000 5.100000 143.454939 -4.800000 5.200000 141.161769 -4.800000 5.300000 138.888599 -4.800000 5.400000 136.635430 -4.800000 5.500000 134.402260 -4.800000 5.600000 132.189090 -4.800000 5.700000 129.995920 -4.800000 5.800000 127.822751 -4.800000 5.900000 125.669581 -4.800000 6.000000 123.536411 -4.800000 6.100000 121.423242 -4.800000 6.200000 119.330072 -4.800000 6.300000 117.256902 -4.800000 6.400000 115.203733 -4.800000 6.500000 113.170563 -4.800000 6.600000 111.157393 -4.800000 6.700000 109.164224 -4.800000 6.800000 107.191054 -4.800000 6.900000 105.237884 -4.800000 7.000000 103.304715 -4.800000 7.100000 101.391545 -4.800000 7.200000 99.498375 -4.800000 7.300000 97.625206 -4.800000 7.400000 95.772036 -4.800000 7.500000 93.938866 -4.800000 7.600000 92.125697 -4.800000 7.700000 90.332527 -4.800000 7.800000 88.559357 -4.800000 7.900000 86.806188 -4.800000 8.000000 85.073018 -4.800000 8.100000 83.359848 -4.800000 8.200000 81.666679 -4.800000 8.300000 79.993509 -4.800000 8.400000 78.340339 -4.800000 8.500000 76.707170 -4.800000 8.600000 75.094000 -4.800000 8.700000 73.500830 -4.800000 8.800000 71.927661 -4.800000 8.900000 70.374491 -4.800000 9.000000 68.841321 -4.800000 9.100000 67.328152 -4.800000 9.200000 65.834982 -4.800000 9.300000 64.361812 -4.800000 9.400000 62.908643 -4.800000 9.500000 61.475473 -4.800000 9.600000 60.062303 -4.800000 9.700000 58.669134 -4.800000 9.800000 57.295964 -4.800000 9.900000 55.942794 -4.800000 10.000000 54.609625 -4.800000 10.100000 53.296455 -4.800000 10.200000 52.003285 -4.800000 10.300000 50.730116 -4.800000 10.400000 49.476946 -4.800000 10.500000 48.243776 -4.800000 10.600000 47.030607 -4.800000 10.700000 45.837437 -4.800000 10.800000 44.664267 -4.800000 10.900000 43.511098 -4.800000 11.000000 42.377928 -4.800000 11.100000 41.264758 -4.800000 11.200000 40.171589 -4.800000 11.300000 39.098419 -4.800000 11.400000 38.045249 -4.800000 11.500000 37.012080 -4.800000 11.600000 35.998910 -4.800000 11.700000 35.005740 -4.800000 11.800000 34.032571 -4.800000 11.900000 33.079401 -4.800000 12.000000 32.146231 -4.800000 12.100000 31.233061 -4.800000 12.200000 30.339892 -4.800000 12.300000 29.466722 -4.800000 12.400000 28.613552 -4.800000 12.500000 27.780383 -4.800000 12.600000 26.967213 -4.800000 12.700000 26.174043 -4.800000 12.800000 25.400874 -4.800000 12.900000 24.647704 -4.800000 13.000000 23.914534 -4.800000 13.100000 23.201365 -4.800000 13.200000 22.508195 -4.800000 13.300000 21.835025 -4.800000 13.400000 21.181856 -4.800000 13.500000 20.548686 -4.800000 13.600000 19.935516 -4.800000 13.700000 19.342347 -4.800000 13.800000 18.769177 -4.800000 13.900000 18.216007 -4.800000 14.000000 17.682838 -4.800000 14.100000 17.169668 -4.800000 14.200000 16.676498 -4.800000 14.300000 16.203329 -4.800000 14.400000 15.750159 -4.800000 14.500000 15.316989 -4.800000 14.600000 14.903820 -4.800000 14.700000 14.510650 -4.800000 14.800000 14.137480 -4.800000 14.900000 13.784311 -4.800000 15.000000 13.451141 -4.700000 -5.000000 465.019239 -4.700000 -4.900000 460.762445 -4.700000 -4.800000 456.525652 -4.700000 -4.700000 452.308858 -4.700000 -4.600000 448.112064 -4.700000 -4.500000 443.935271 -4.700000 -4.400000 439.778477 -4.700000 -4.300000 435.641684 -4.700000 -4.200000 431.524890 -4.700000 -4.100000 427.428096 -4.700000 -4.000000 423.351303 -4.700000 -3.900000 419.294509 -4.700000 -3.800000 415.257715 -4.700000 -3.700000 411.240922 -4.700000 -3.600000 407.244128 -4.700000 -3.500000 403.267335 -4.700000 -3.400000 399.310541 -4.700000 -3.300000 395.373747 -4.700000 -3.200000 391.456954 -4.700000 -3.100000 387.560160 -4.700000 -3.000000 383.683366 -4.700000 -2.900000 379.826573 -4.700000 -2.800000 375.989779 -4.700000 -2.700000 372.172986 -4.700000 -2.600000 368.376192 -4.700000 -2.500000 364.599398 -4.700000 -2.400000 360.842605 -4.700000 -2.300000 357.105811 -4.700000 -2.200000 353.389017 -4.700000 -2.100000 349.692224 -4.700000 -2.000000 346.015430 -4.700000 -1.900000 342.358637 -4.700000 -1.800000 338.721843 -4.700000 -1.700000 335.105049 -4.700000 -1.600000 331.508256 -4.700000 -1.500000 327.931462 -4.700000 -1.400000 324.374668 -4.700000 -1.300000 320.837875 -4.700000 -1.200000 317.321081 -4.700000 -1.100000 313.824287 -4.700000 -1.000000 310.347494 -4.700000 -0.900000 306.890700 -4.700000 -0.800000 303.453907 -4.700000 -0.700000 300.037113 -4.700000 -0.600000 296.640319 -4.700000 -0.500000 293.263526 -4.700000 -0.400000 289.906732 -4.700000 -0.300000 286.569938 -4.700000 -0.200000 283.253145 -4.700000 -0.100000 279.956351 -4.700000 -0.000000 276.679558 -4.700000 0.100000 273.422764 -4.700000 0.200000 270.185970 -4.700000 0.300000 266.969177 -4.700000 0.400000 263.772383 -4.700000 0.500000 260.595589 -4.700000 0.600000 257.438796 -4.700000 0.700000 254.302002 -4.700000 0.800000 251.185209 -4.700000 0.900000 248.088415 -4.700000 1.000000 245.011621 -4.700000 1.100000 241.954828 -4.700000 1.200000 238.918034 -4.700000 1.300000 235.901240 -4.700000 1.400000 232.904447 -4.700000 1.500000 229.927653 -4.700000 1.600000 226.970860 -4.700000 1.700000 224.034066 -4.700000 1.800000 221.117272 -4.700000 1.900000 218.220479 -4.700000 2.000000 215.343685 -4.700000 2.100000 212.486891 -4.700000 2.200000 209.650098 -4.700000 2.300000 206.833304 -4.700000 2.400000 204.036511 -4.700000 2.500000 201.259717 -4.700000 2.600000 198.502923 -4.700000 2.700000 195.766130 -4.700000 2.800000 193.049336 -4.700000 2.900000 190.352542 -4.700000 3.000000 187.675749 -4.700000 3.100000 185.018955 -4.700000 3.200000 182.382162 -4.700000 3.300000 179.765368 -4.700000 3.400000 177.168574 -4.700000 3.500000 174.591781 -4.700000 3.600000 172.034987 -4.700000 3.700000 169.498193 -4.700000 3.800000 166.981400 -4.700000 3.900000 164.484606 -4.700000 4.000000 162.007813 -4.700000 4.100000 159.551019 -4.700000 4.200000 157.114225 -4.700000 4.300000 154.697432 -4.700000 4.400000 152.300638 -4.700000 4.500000 149.923844 -4.700000 4.600000 147.567051 -4.700000 4.700000 145.230257 -4.700000 4.800000 142.913464 -4.700000 4.900000 140.616670 -4.700000 5.000000 138.339876 -4.700000 5.100000 136.083083 -4.700000 5.200000 133.846289 -4.700000 5.300000 131.629495 -4.700000 5.400000 129.432702 -4.700000 5.500000 127.255908 -4.700000 5.600000 125.099115 -4.700000 5.700000 122.962321 -4.700000 5.800000 120.845527 -4.700000 5.900000 118.748734 -4.700000 6.000000 116.671940 -4.700000 6.100000 114.615146 -4.700000 6.200000 112.578353 -4.700000 6.300000 110.561559 -4.700000 6.400000 108.564766 -4.700000 6.500000 106.587972 -4.700000 6.600000 104.631178 -4.700000 6.700000 102.694385 -4.700000 6.800000 100.777591 -4.700000 6.900000 98.880797 -4.700000 7.000000 97.004004 -4.700000 7.100000 95.147210 -4.700000 7.200000 93.310416 -4.700000 7.300000 91.493623 -4.700000 7.400000 89.696829 -4.700000 7.500000 87.920036 -4.700000 7.600000 86.163242 -4.700000 7.700000 84.426448 -4.700000 7.800000 82.709655 -4.700000 7.900000 81.012861 -4.700000 8.000000 79.336067 -4.700000 8.100000 77.679274 -4.700000 8.200000 76.042480 -4.700000 8.300000 74.425687 -4.700000 8.400000 72.828893 -4.700000 8.500000 71.252099 -4.700000 8.600000 69.695306 -4.700000 8.700000 68.158512 -4.700000 8.800000 66.641718 -4.700000 8.900000 65.144925 -4.700000 9.000000 63.668131 -4.700000 9.100000 62.211338 -4.700000 9.200000 60.774544 -4.700000 9.300000 59.357750 -4.700000 9.400000 57.960957 -4.700000 9.500000 56.584163 -4.700000 9.600000 55.227369 -4.700000 9.700000 53.890576 -4.700000 9.800000 52.573782 -4.700000 9.900000 51.276989 -4.700000 10.000000 50.000195 -4.700000 10.100000 48.743401 -4.700000 10.200000 47.506608 -4.700000 10.300000 46.289814 -4.700000 10.400000 45.093020 -4.700000 10.500000 43.916227 -4.700000 10.600000 42.759433 -4.700000 10.700000 41.622640 -4.700000 10.800000 40.505846 -4.700000 10.900000 39.409052 -4.700000 11.000000 38.332259 -4.700000 11.100000 37.275465 -4.700000 11.200000 36.238671 -4.700000 11.300000 35.221878 -4.700000 11.400000 34.225084 -4.700000 11.500000 33.248291 -4.700000 11.600000 32.291497 -4.700000 11.700000 31.354703 -4.700000 11.800000 30.437910 -4.700000 11.900000 29.541116 -4.700000 12.000000 28.664322 -4.700000 12.100000 27.807529 -4.700000 12.200000 26.970735 -4.700000 12.300000 26.153942 -4.700000 12.400000 25.357148 -4.700000 12.500000 24.580354 -4.700000 12.600000 23.823561 -4.700000 12.700000 23.086767 -4.700000 12.800000 22.369973 -4.700000 12.900000 21.673180 -4.700000 13.000000 20.996386 -4.700000 13.100000 20.339593 -4.700000 13.200000 19.702799 -4.700000 13.300000 19.086005 -4.700000 13.400000 18.489212 -4.700000 13.500000 17.912418 -4.700000 13.600000 17.355624 -4.700000 13.700000 16.818831 -4.700000 13.800000 16.302037 -4.700000 13.900000 15.805244 -4.700000 14.000000 15.328450 -4.700000 14.100000 14.871656 -4.700000 14.200000 14.434863 -4.700000 14.300000 14.018069 -4.700000 14.400000 13.621275 -4.700000 14.500000 13.244482 -4.700000 14.600000 12.887688 -4.700000 14.700000 12.550895 -4.700000 14.800000 12.234101 -4.700000 14.900000 11.937307 -4.700000 15.000000 11.660514 -4.600000 -5.000000 452.222295 -4.600000 -4.900000 448.021360 -4.600000 -4.800000 443.840426 -4.600000 -4.700000 439.679492 -4.600000 -4.600000 435.538558 -4.600000 -4.500000 431.417623 -4.600000 -4.400000 427.316689 -4.600000 -4.300000 423.235755 -4.600000 -4.200000 419.174820 -4.600000 -4.100000 415.133886 -4.600000 -4.000000 411.112952 -4.600000 -3.900000 407.112017 -4.600000 -3.800000 403.131083 -4.600000 -3.700000 399.170149 -4.600000 -3.600000 395.229214 -4.600000 -3.500000 391.308280 -4.600000 -3.400000 387.407346 -4.600000 -3.300000 383.526411 -4.600000 -3.200000 379.665477 -4.600000 -3.100000 375.824543 -4.600000 -3.000000 372.003608 -4.600000 -2.900000 368.202674 -4.600000 -2.800000 364.421740 -4.600000 -2.700000 360.660805 -4.600000 -2.600000 356.919871 -4.600000 -2.500000 353.198937 -4.600000 -2.400000 349.498003 -4.600000 -2.300000 345.817068 -4.600000 -2.200000 342.156134 -4.600000 -2.100000 338.515200 -4.600000 -2.000000 334.894265 -4.600000 -1.900000 331.293331 -4.600000 -1.800000 327.712397 -4.600000 -1.700000 324.151462 -4.600000 -1.600000 320.610528 -4.600000 -1.500000 317.089594 -4.600000 -1.400000 313.588659 -4.600000 -1.300000 310.107725 -4.600000 -1.200000 306.646791 -4.600000 -1.100000 303.205856 -4.600000 -1.000000 299.784922 -4.600000 -0.900000 296.383988 -4.600000 -0.800000 293.003053 -4.600000 -0.700000 289.642119 -4.600000 -0.600000 286.301185 -4.600000 -0.500000 282.980250 -4.600000 -0.400000 279.679316 -4.600000 -0.300000 276.398382 -4.600000 -0.200000 273.137447 -4.600000 -0.100000 269.896513 -4.600000 -0.000000 266.675579 -4.600000 0.100000 263.474645 -4.600000 0.200000 260.293710 -4.600000 0.300000 257.132776 -4.600000 0.400000 253.991842 -4.600000 0.500000 250.870907 -4.600000 0.600000 247.769973 -4.600000 0.700000 244.689039 -4.600000 0.800000 241.628104 -4.600000 0.900000 238.587170 -4.600000 1.000000 235.566236 -4.600000 1.100000 232.565301 -4.600000 1.200000 229.584367 -4.600000 1.300000 226.623433 -4.600000 1.400000 223.682498 -4.600000 1.500000 220.761564 -4.600000 1.600000 217.860630 -4.600000 1.700000 214.979695 -4.600000 1.800000 212.118761 -4.600000 1.900000 209.277827 -4.600000 2.000000 206.456892 -4.600000 2.100000 203.655958 -4.600000 2.200000 200.875024 -4.600000 2.300000 198.114090 -4.600000 2.400000 195.373155 -4.600000 2.500000 192.652221 -4.600000 2.600000 189.951287 -4.600000 2.700000 187.270352 -4.600000 2.800000 184.609418 -4.600000 2.900000 181.968484 -4.600000 3.000000 179.347549 -4.600000 3.100000 176.746615 -4.600000 3.200000 174.165681 -4.600000 3.300000 171.604746 -4.600000 3.400000 169.063812 -4.600000 3.500000 166.542878 -4.600000 3.600000 164.041943 -4.600000 3.700000 161.561009 -4.600000 3.800000 159.100075 -4.600000 3.900000 156.659140 -4.600000 4.000000 154.238206 -4.600000 4.100000 151.837272 -4.600000 4.200000 149.456337 -4.600000 4.300000 147.095403 -4.600000 4.400000 144.754469 -4.600000 4.500000 142.433534 -4.600000 4.600000 140.132600 -4.600000 4.700000 137.851666 -4.600000 4.800000 135.590732 -4.600000 4.900000 133.349797 -4.600000 5.000000 131.128863 -4.600000 5.100000 128.927929 -4.600000 5.200000 126.746994 -4.600000 5.300000 124.586060 -4.600000 5.400000 122.445126 -4.600000 5.500000 120.324191 -4.600000 5.600000 118.223257 -4.600000 5.700000 116.142323 -4.600000 5.800000 114.081388 -4.600000 5.900000 112.040454 -4.600000 6.000000 110.019520 -4.600000 6.100000 108.018585 -4.600000 6.200000 106.037651 -4.600000 6.300000 104.076717 -4.600000 6.400000 102.135782 -4.600000 6.500000 100.214848 -4.600000 6.600000 98.313914 -4.600000 6.700000 96.432979 -4.600000 6.800000 94.572045 -4.600000 6.900000 92.731111 -4.600000 7.000000 90.910177 -4.600000 7.100000 89.109242 -4.600000 7.200000 87.328308 -4.600000 7.300000 85.567374 -4.600000 7.400000 83.826439 -4.600000 7.500000 82.105505 -4.600000 7.600000 80.404571 -4.600000 7.700000 78.723636 -4.600000 7.800000 77.062702 -4.600000 7.900000 75.421768 -4.600000 8.000000 73.800833 -4.600000 8.100000 72.199899 -4.600000 8.200000 70.618965 -4.600000 8.300000 69.058030 -4.600000 8.400000 67.517096 -4.600000 8.500000 65.996162 -4.600000 8.600000 64.495227 -4.600000 8.700000 63.014293 -4.600000 8.800000 61.553359 -4.600000 8.900000 60.112424 -4.600000 9.000000 58.691490 -4.600000 9.100000 57.290556 -4.600000 9.200000 55.909621 -4.600000 9.300000 54.548687 -4.600000 9.400000 53.207753 -4.600000 9.500000 51.886819 -4.600000 9.600000 50.585884 -4.600000 9.700000 49.304950 -4.600000 9.800000 48.044016 -4.600000 9.900000 46.803081 -4.600000 10.000000 45.582147 -4.600000 10.100000 44.381213 -4.600000 10.200000 43.200278 -4.600000 10.300000 42.039344 -4.600000 10.400000 40.898410 -4.600000 10.500000 39.777475 -4.600000 10.600000 38.676541 -4.600000 10.700000 37.595607 -4.600000 10.800000 36.534672 -4.600000 10.900000 35.493738 -4.600000 11.000000 34.472804 -4.600000 11.100000 33.471869 -4.600000 11.200000 32.490935 -4.600000 11.300000 31.530001 -4.600000 11.400000 30.589066 -4.600000 11.500000 29.668132 -4.600000 11.600000 28.767198 -4.600000 11.700000 27.886264 -4.600000 11.800000 27.025329 -4.600000 11.900000 26.184395 -4.600000 12.000000 25.363461 -4.600000 12.100000 24.562526 -4.600000 12.200000 23.781592 -4.600000 12.300000 23.020658 -4.600000 12.400000 22.279723 -4.600000 12.500000 21.558789 -4.600000 12.600000 20.857855 -4.600000 12.700000 20.176920 -4.600000 12.800000 19.515986 -4.600000 12.900000 18.875052 -4.600000 13.000000 18.254117 -4.600000 13.100000 17.653183 -4.600000 13.200000 17.072249 -4.600000 13.300000 16.511314 -4.600000 13.400000 15.970380 -4.600000 13.500000 15.449446 -4.600000 13.600000 14.948511 -4.600000 13.700000 14.467577 -4.600000 13.800000 14.006643 -4.600000 13.900000 13.565708 -4.600000 14.000000 13.144774 -4.600000 14.100000 12.743840 -4.600000 14.200000 12.362906 -4.600000 14.300000 12.001971 -4.600000 14.400000 11.661037 -4.600000 14.500000 11.340103 -4.600000 14.600000 11.039168 -4.600000 14.700000 10.758234 -4.600000 14.800000 10.497300 -4.600000 14.900000 10.256365 -4.600000 15.000000 10.035431 -4.500000 -5.000000 439.699485 -4.500000 -4.900000 435.553893 -4.500000 -4.800000 431.428301 -4.500000 -4.700000 427.322710 -4.500000 -4.600000 423.237118 -4.500000 -4.500000 419.171526 -4.500000 -4.400000 415.125934 -4.500000 -4.300000 411.100343 -4.500000 -4.200000 407.094751 -4.500000 -4.100000 403.109159 -4.500000 -4.000000 399.143567 -4.500000 -3.900000 395.197976 -4.500000 -3.800000 391.272384 -4.500000 -3.700000 387.366792 -4.500000 -3.600000 383.481200 -4.500000 -3.500000 379.615609 -4.500000 -3.400000 375.770017 -4.500000 -3.300000 371.944425 -4.500000 -3.200000 368.138833 -4.500000 -3.100000 364.353242 -4.500000 -3.000000 360.587650 -4.500000 -2.900000 356.842058 -4.500000 -2.800000 353.116466 -4.500000 -2.700000 349.410875 -4.500000 -2.600000 345.725283 -4.500000 -2.500000 342.059691 -4.500000 -2.400000 338.414099 -4.500000 -2.300000 334.788508 -4.500000 -2.200000 331.182916 -4.500000 -2.100000 327.597324 -4.500000 -2.000000 324.031732 -4.500000 -1.900000 320.486141 -4.500000 -1.800000 316.960549 -4.500000 -1.700000 313.454957 -4.500000 -1.600000 309.969365 -4.500000 -1.500000 306.503774 -4.500000 -1.400000 303.058182 -4.500000 -1.300000 299.632590 -4.500000 -1.200000 296.226998 -4.500000 -1.100000 292.841407 -4.500000 -1.000000 289.475815 -4.500000 -0.900000 286.130223 -4.500000 -0.800000 282.804631 -4.500000 -0.700000 279.499040 -4.500000 -0.600000 276.213448 -4.500000 -0.500000 272.947856 -4.500000 -0.400000 269.702264 -4.500000 -0.300000 266.476673 -4.500000 -0.200000 263.271081 -4.500000 -0.100000 260.085489 -4.500000 -0.000000 256.919897 -4.500000 0.100000 253.774306 -4.500000 0.200000 250.648714 -4.500000 0.300000 247.543122 -4.500000 0.400000 244.457530 -4.500000 0.500000 241.391939 -4.500000 0.600000 238.346347 -4.500000 0.700000 235.320755 -4.500000 0.800000 232.315163 -4.500000 0.900000 229.329572 -4.500000 1.000000 226.363980 -4.500000 1.100000 223.418388 -4.500000 1.200000 220.492796 -4.500000 1.300000 217.587205 -4.500000 1.400000 214.701613 -4.500000 1.500000 211.836021 -4.500000 1.600000 208.990429 -4.500000 1.700000 206.164838 -4.500000 1.800000 203.359246 -4.500000 1.900000 200.573654 -4.500000 2.000000 197.808062 -4.500000 2.100000 195.062471 -4.500000 2.200000 192.336879 -4.500000 2.300000 189.631287 -4.500000 2.400000 186.945695 -4.500000 2.500000 184.280104 -4.500000 2.600000 181.634512 -4.500000 2.700000 179.008920 -4.500000 2.800000 176.403328 -4.500000 2.900000 173.817737 -4.500000 3.000000 171.252145 -4.500000 3.100000 168.706553 -4.500000 3.200000 166.180961 -4.500000 3.300000 163.675370 -4.500000 3.400000 161.189778 -4.500000 3.500000 158.724186 -4.500000 3.600000 156.278594 -4.500000 3.700000 153.853003 -4.500000 3.800000 151.447411 -4.500000 3.900000 149.061819 -4.500000 4.000000 146.696227 -4.500000 4.100000 144.350636 -4.500000 4.200000 142.025044 -4.500000 4.300000 139.719452 -4.500000 4.400000 137.433860 -4.500000 4.500000 135.168269 -4.500000 4.600000 132.922677 -4.500000 4.700000 130.697085 -4.500000 4.800000 128.491493 -4.500000 4.900000 126.305902 -4.500000 5.000000 124.140310 -4.500000 5.100000 121.994718 -4.500000 5.200000 119.869126 -4.500000 5.300000 117.763535 -4.500000 5.400000 115.677943 -4.500000 5.500000 113.612351 -4.500000 5.600000 111.566759 -4.500000 5.700000 109.541168 -4.500000 5.800000 107.535576 -4.500000 5.900000 105.549984 -4.500000 6.000000 103.584392 -4.500000 6.100000 101.638801 -4.500000 6.200000 99.713209 -4.500000 6.300000 97.807617 -4.500000 6.400000 95.922025 -4.500000 6.500000 94.056434 -4.500000 6.600000 92.210842 -4.500000 6.700000 90.385250 -4.500000 6.800000 88.579658 -4.500000 6.900000 86.794067 -4.500000 7.000000 85.028475 -4.500000 7.100000 83.282883 -4.500000 7.200000 81.557291 -4.500000 7.300000 79.851700 -4.500000 7.400000 78.166108 -4.500000 7.500000 76.500516 -4.500000 7.600000 74.854924 -4.500000 7.700000 73.229333 -4.500000 7.800000 71.623741 -4.500000 7.900000 70.038149 -4.500000 8.000000 68.472557 -4.500000 8.100000 66.926966 -4.500000 8.200000 65.401374 -4.500000 8.300000 63.895782 -4.500000 8.400000 62.410190 -4.500000 8.500000 60.944599 -4.500000 8.600000 59.499007 -4.500000 8.700000 58.073415 -4.500000 8.800000 56.667823 -4.500000 8.900000 55.282232 -4.500000 9.000000 53.916640 -4.500000 9.100000 52.571048 -4.500000 9.200000 51.245456 -4.500000 9.300000 49.939865 -4.500000 9.400000 48.654273 -4.500000 9.500000 47.388681 -4.500000 9.600000 46.143089 -4.500000 9.700000 44.917498 -4.500000 9.800000 43.711906 -4.500000 9.900000 42.526314 -4.500000 10.000000 41.360722 -4.500000 10.100000 40.215131 -4.500000 10.200000 39.089539 -4.500000 10.300000 37.983947 -4.500000 10.400000 36.898355 -4.500000 10.500000 35.832764 -4.500000 10.600000 34.787172 -4.500000 10.700000 33.761580 -4.500000 10.800000 32.755988 -4.500000 10.900000 31.770397 -4.500000 11.000000 30.804805 -4.500000 11.100000 29.859213 -4.500000 11.200000 28.933621 -4.500000 11.300000 28.028030 -4.500000 11.400000 27.142438 -4.500000 11.500000 26.276846 -4.500000 11.600000 25.431254 -4.500000 11.700000 24.605663 -4.500000 11.800000 23.800071 -4.500000 11.900000 23.014479 -4.500000 12.000000 22.248887 -4.500000 12.100000 21.503296 -4.500000 12.200000 20.777704 -4.500000 12.300000 20.072112 -4.500000 12.400000 19.386520 -4.500000 12.500000 18.720929 -4.500000 12.600000 18.075337 -4.500000 12.700000 17.449745 -4.500000 12.800000 16.844153 -4.500000 12.900000 16.258562 -4.500000 13.000000 15.692970 -4.500000 13.100000 15.147378 -4.500000 13.200000 14.621786 -4.500000 13.300000 14.116195 -4.500000 13.400000 13.630603 -4.500000 13.500000 13.165011 -4.500000 13.600000 12.719419 -4.500000 13.700000 12.293828 -4.500000 13.800000 11.888236 -4.500000 13.900000 11.502644 -4.500000 14.000000 11.137052 -4.500000 14.100000 10.791461 -4.500000 14.200000 10.465869 -4.500000 14.300000 10.160277 -4.500000 14.400000 9.874685 -4.500000 14.500000 9.609094 -4.500000 14.600000 9.363502 -4.500000 14.700000 9.137910 -4.500000 14.800000 8.932318 -4.500000 14.900000 8.746727 -4.500000 15.000000 8.581135 -4.400000 -5.000000 427.455983 -4.400000 -4.900000 423.365217 -4.400000 -4.800000 419.294451 -4.400000 -4.700000 415.243685 -4.400000 -4.600000 411.212919 -4.400000 -4.500000 407.202154 -4.400000 -4.400000 403.211388 -4.400000 -4.300000 399.240622 -4.400000 -4.200000 395.289856 -4.400000 -4.100000 391.359090 -4.400000 -4.000000 387.448324 -4.400000 -3.900000 383.557558 -4.400000 -3.800000 379.686792 -4.400000 -3.700000 375.836026 -4.400000 -3.600000 372.005260 -4.400000 -3.500000 368.194494 -4.400000 -3.400000 364.403728 -4.400000 -3.300000 360.632963 -4.400000 -3.200000 356.882197 -4.400000 -3.100000 353.151431 -4.400000 -3.000000 349.440665 -4.400000 -2.900000 345.749899 -4.400000 -2.800000 342.079133 -4.400000 -2.700000 338.428367 -4.400000 -2.600000 334.797601 -4.400000 -2.500000 331.186835 -4.400000 -2.400000 327.596069 -4.400000 -2.300000 324.025303 -4.400000 -2.200000 320.474537 -4.400000 -2.100000 316.943772 -4.400000 -2.000000 313.433006 -4.400000 -1.900000 309.942240 -4.400000 -1.800000 306.471474 -4.400000 -1.700000 303.020708 -4.400000 -1.600000 299.589942 -4.400000 -1.500000 296.179176 -4.400000 -1.400000 292.788410 -4.400000 -1.300000 289.417644 -4.400000 -1.200000 286.066878 -4.400000 -1.100000 282.736112 -4.400000 -1.000000 279.425346 -4.400000 -0.900000 276.134580 -4.400000 -0.800000 272.863815 -4.400000 -0.700000 269.613049 -4.400000 -0.600000 266.382283 -4.400000 -0.500000 263.171517 -4.400000 -0.400000 259.980751 -4.400000 -0.300000 256.809985 -4.400000 -0.200000 253.659219 -4.400000 -0.100000 250.528453 -4.400000 -0.000000 247.417687 -4.400000 0.100000 244.326921 -4.400000 0.200000 241.256155 -4.400000 0.300000 238.205389 -4.400000 0.400000 235.174624 -4.400000 0.500000 232.163858 -4.400000 0.600000 229.173092 -4.400000 0.700000 226.202326 -4.400000 0.800000 223.251560 -4.400000 0.900000 220.320794 -4.400000 1.000000 217.410028 -4.400000 1.100000 214.519262 -4.400000 1.200000 211.648496 -4.400000 1.300000 208.797730 -4.400000 1.400000 205.966964 -4.400000 1.500000 203.156198 -4.400000 1.600000 200.365433 -4.400000 1.700000 197.594667 -4.400000 1.800000 194.843901 -4.400000 1.900000 192.113135 -4.400000 2.000000 189.402369 -4.400000 2.100000 186.711603 -4.400000 2.200000 184.040837 -4.400000 2.300000 181.390071 -4.400000 2.400000 178.759305 -4.400000 2.500000 176.148539 -4.400000 2.600000 173.557773 -4.400000 2.700000 170.987007 -4.400000 2.800000 168.436241 -4.400000 2.900000 165.905476 -4.400000 3.000000 163.394710 -4.400000 3.100000 160.903944 -4.400000 3.200000 158.433178 -4.400000 3.300000 155.982412 -4.400000 3.400000 153.551646 -4.400000 3.500000 151.140880 -4.400000 3.600000 148.750114 -4.400000 3.700000 146.379348 -4.400000 3.800000 144.028582 -4.400000 3.900000 141.697816 -4.400000 4.000000 139.387050 -4.400000 4.100000 137.096285 -4.400000 4.200000 134.825519 -4.400000 4.300000 132.574753 -4.400000 4.400000 130.343987 -4.400000 4.500000 128.133221 -4.400000 4.600000 125.942455 -4.400000 4.700000 123.771689 -4.400000 4.800000 121.620923 -4.400000 4.900000 119.490157 -4.400000 5.000000 117.379391 -4.400000 5.100000 115.288625 -4.400000 5.200000 113.217859 -4.400000 5.300000 111.167094 -4.400000 5.400000 109.136328 -4.400000 5.500000 107.125562 -4.400000 5.600000 105.134796 -4.400000 5.700000 103.164030 -4.400000 5.800000 101.213264 -4.400000 5.900000 99.282498 -4.400000 6.000000 97.371732 -4.400000 6.100000 95.480966 -4.400000 6.200000 93.610200 -4.400000 6.300000 91.759434 -4.400000 6.400000 89.928668 -4.400000 6.500000 88.117903 -4.400000 6.600000 86.327137 -4.400000 6.700000 84.556371 -4.400000 6.800000 82.805605 -4.400000 6.900000 81.074839 -4.400000 7.000000 79.364073 -4.400000 7.100000 77.673307 -4.400000 7.200000 76.002541 -4.400000 7.300000 74.351775 -4.400000 7.400000 72.721009 -4.400000 7.500000 71.110243 -4.400000 7.600000 69.519477 -4.400000 7.700000 67.948711 -4.400000 7.800000 66.397946 -4.400000 7.900000 64.867180 -4.400000 8.000000 63.356414 -4.400000 8.100000 61.865648 -4.400000 8.200000 60.394882 -4.400000 8.300000 58.944116 -4.400000 8.400000 57.513350 -4.400000 8.500000 56.102584 -4.400000 8.600000 54.711818 -4.400000 8.700000 53.341052 -4.400000 8.800000 51.990286 -4.400000 8.900000 50.659520 -4.400000 9.000000 49.348755 -4.400000 9.100000 48.057989 -4.400000 9.200000 46.787223 -4.400000 9.300000 45.536457 -4.400000 9.400000 44.305691 -4.400000 9.500000 43.094925 -4.400000 9.600000 41.904159 -4.400000 9.700000 40.733393 -4.400000 9.800000 39.582627 -4.400000 9.900000 38.451861 -4.400000 10.000000 37.341095 -4.400000 10.100000 36.250329 -4.400000 10.200000 35.179564 -4.400000 10.300000 34.128798 -4.400000 10.400000 33.098032 -4.400000 10.500000 32.087266 -4.400000 10.600000 31.096500 -4.400000 10.700000 30.125734 -4.400000 10.800000 29.174968 -4.400000 10.900000 28.244202 -4.400000 11.000000 27.333436 -4.400000 11.100000 26.442670 -4.400000 11.200000 25.571904 -4.400000 11.300000 24.721138 -4.400000 11.400000 23.890372 -4.400000 11.500000 23.079607 -4.400000 11.600000 22.288841 -4.400000 11.700000 21.518075 -4.400000 11.800000 20.767309 -4.400000 11.900000 20.036543 -4.400000 12.000000 19.325777 -4.400000 12.100000 18.635011 -4.400000 12.200000 17.964245 -4.400000 12.300000 17.313479 -4.400000 12.400000 16.682713 -4.400000 12.500000 16.071947 -4.400000 12.600000 15.481181 -4.400000 12.700000 14.910416 -4.400000 12.800000 14.359650 -4.400000 12.900000 13.828884 -4.400000 13.000000 13.318118 -4.400000 13.100000 12.827352 -4.400000 13.200000 12.356586 -4.400000 13.300000 11.905820 -4.400000 13.400000 11.475054 -4.400000 13.500000 11.064288 -4.400000 13.600000 10.673522 -4.400000 13.700000 10.302756 -4.400000 13.800000 9.951990 -4.400000 13.900000 9.621225 -4.400000 14.000000 9.310459 -4.400000 14.100000 9.019693 -4.400000 14.200000 8.748927 -4.400000 14.300000 8.498161 -4.400000 14.400000 8.267395 -4.400000 14.500000 8.056629 -4.400000 14.600000 7.865863 -4.400000 14.700000 7.695097 -4.400000 14.800000 7.544331 -4.400000 14.900000 7.413565 -4.400000 15.000000 7.302799 -4.300000 -5.000000 415.496802 -4.300000 -4.900000 411.460345 -4.300000 -4.800000 407.443889 -4.300000 -4.700000 403.447432 -4.300000 -4.600000 399.470975 -4.300000 -4.500000 395.514518 -4.300000 -4.400000 391.578061 -4.300000 -4.300000 387.661604 -4.300000 -4.200000 383.765148 -4.300000 -4.100000 379.888691 -4.300000 -4.000000 376.032234 -4.300000 -3.900000 372.195777 -4.300000 -3.800000 368.379320 -4.300000 -3.700000 364.582863 -4.300000 -3.600000 360.806407 -4.300000 -3.500000 357.049950 -4.300000 -3.400000 353.313493 -4.300000 -3.300000 349.597036 -4.300000 -3.200000 345.900579 -4.300000 -3.100000 342.224123 -4.300000 -3.000000 338.567666 -4.300000 -2.900000 334.931209 -4.300000 -2.800000 331.314752 -4.300000 -2.700000 327.718295 -4.300000 -2.600000 324.141838 -4.300000 -2.500000 320.585382 -4.300000 -2.400000 317.048925 -4.300000 -2.300000 313.532468 -4.300000 -2.200000 310.036011 -4.300000 -2.100000 306.559554 -4.300000 -2.000000 303.103097 -4.300000 -1.900000 299.666641 -4.300000 -1.800000 296.250184 -4.300000 -1.700000 292.853727 -4.300000 -1.600000 289.477270 -4.300000 -1.500000 286.120813 -4.300000 -1.400000 282.784356 -4.300000 -1.300000 279.467900 -4.300000 -1.200000 276.171443 -4.300000 -1.100000 272.894986 -4.300000 -1.000000 269.638529 -4.300000 -0.900000 266.402072 -4.300000 -0.800000 263.185616 -4.300000 -0.700000 259.989159 -4.300000 -0.600000 256.812702 -4.300000 -0.500000 253.656245 -4.300000 -0.400000 250.519788 -4.300000 -0.300000 247.403331 -4.300000 -0.200000 244.306875 -4.300000 -0.100000 241.230418 -4.300000 -0.000000 238.173961 -4.300000 0.100000 235.137504 -4.300000 0.200000 232.121047 -4.300000 0.300000 229.124590 -4.300000 0.400000 226.148134 -4.300000 0.500000 223.191677 -4.300000 0.600000 220.255220 -4.300000 0.700000 217.338763 -4.300000 0.800000 214.442306 -4.300000 0.900000 211.565850 -4.300000 1.000000 208.709393 -4.300000 1.100000 205.872936 -4.300000 1.200000 203.056479 -4.300000 1.300000 200.260022 -4.300000 1.400000 197.483565 -4.300000 1.500000 194.727109 -4.300000 1.600000 191.990652 -4.300000 1.700000 189.274195 -4.300000 1.800000 186.577738 -4.300000 1.900000 183.901281 -4.300000 2.000000 181.244824 -4.300000 2.100000 178.608368 -4.300000 2.200000 175.991911 -4.300000 2.300000 173.395454 -4.300000 2.400000 170.818997 -4.300000 2.500000 168.262540 -4.300000 2.600000 165.726083 -4.300000 2.700000 163.209627 -4.300000 2.800000 160.713170 -4.300000 2.900000 158.236713 -4.300000 3.000000 155.780256 -4.300000 3.100000 153.343799 -4.300000 3.200000 150.927343 -4.300000 3.300000 148.530886 -4.300000 3.400000 146.154429 -4.300000 3.500000 143.797972 -4.300000 3.600000 141.461515 -4.300000 3.700000 139.145058 -4.300000 3.800000 136.848602 -4.300000 3.900000 134.572145 -4.300000 4.000000 132.315688 -4.300000 4.100000 130.079231 -4.300000 4.200000 127.862774 -4.300000 4.300000 125.666317 -4.300000 4.400000 123.489861 -4.300000 4.500000 121.333404 -4.300000 4.600000 119.196947 -4.300000 4.700000 117.080490 -4.300000 4.800000 114.984033 -4.300000 4.900000 112.907576 -4.300000 5.000000 110.851120 -4.300000 5.100000 108.814663 -4.300000 5.200000 106.798206 -4.300000 5.300000 104.801749 -4.300000 5.400000 102.825292 -4.300000 5.500000 100.868836 -4.300000 5.600000 98.932379 -4.300000 5.700000 97.015922 -4.300000 5.800000 95.119465 -4.300000 5.900000 93.243008 -4.300000 6.000000 91.386551 -4.300000 6.100000 89.550095 -4.300000 6.200000 87.733638 -4.300000 6.300000 85.937181 -4.300000 6.400000 84.160724 -4.300000 6.500000 82.404267 -4.300000 6.600000 80.667810 -4.300000 6.700000 78.951354 -4.300000 6.800000 77.254897 -4.300000 6.900000 75.578440 -4.300000 7.000000 73.921983 -4.300000 7.100000 72.285526 -4.300000 7.200000 70.669069 -4.300000 7.300000 69.072613 -4.300000 7.400000 67.496156 -4.300000 7.500000 65.939699 -4.300000 7.600000 64.403242 -4.300000 7.700000 62.886785 -4.300000 7.800000 61.390329 -4.300000 7.900000 59.913872 -4.300000 8.000000 58.457415 -4.300000 8.100000 57.020958 -4.300000 8.200000 55.604501 -4.300000 8.300000 54.208044 -4.300000 8.400000 52.831588 -4.300000 8.500000 51.475131 -4.300000 8.600000 50.138674 -4.300000 8.700000 48.822217 -4.300000 8.800000 47.525760 -4.300000 8.900000 46.249303 -4.300000 9.000000 44.992847 -4.300000 9.100000 43.756390 -4.300000 9.200000 42.539933 -4.300000 9.300000 41.343476 -4.300000 9.400000 40.167019 -4.300000 9.500000 39.010563 -4.300000 9.600000 37.874106 -4.300000 9.700000 36.757649 -4.300000 9.800000 35.661192 -4.300000 9.900000 34.584735 -4.300000 10.000000 33.528278 -4.300000 10.100000 32.491822 -4.300000 10.200000 31.475365 -4.300000 10.300000 30.478908 -4.300000 10.400000 29.502451 -4.300000 10.500000 28.545994 -4.300000 10.600000 27.609537 -4.300000 10.700000 26.693081 -4.300000 10.800000 25.796624 -4.300000 10.900000 24.920167 -4.300000 11.000000 24.063710 -4.300000 11.100000 23.227253 -4.300000 11.200000 22.410796 -4.300000 11.300000 21.614340 -4.300000 11.400000 20.837883 -4.300000 11.500000 20.081426 -4.300000 11.600000 19.344969 -4.300000 11.700000 18.628512 -4.300000 11.800000 17.932056 -4.300000 11.900000 17.255599 -4.300000 12.000000 16.599142 -4.300000 12.100000 15.962685 -4.300000 12.200000 15.346228 -4.300000 12.300000 14.749771 -4.300000 12.400000 14.173315 -4.300000 12.500000 13.616858 -4.300000 12.600000 13.080401 -4.300000 12.700000 12.563944 -4.300000 12.800000 12.067487 -4.300000 12.900000 11.591030 -4.300000 13.000000 11.134574 -4.300000 13.100000 10.698117 -4.300000 13.200000 10.281660 -4.300000 13.300000 9.885203 -4.300000 13.400000 9.508746 -4.300000 13.500000 9.152289 -4.300000 13.600000 8.815833 -4.300000 13.700000 8.499376 -4.300000 13.800000 8.202919 -4.300000 13.900000 7.926462 -4.300000 14.000000 7.670005 -4.300000 14.100000 7.433549 -4.300000 14.200000 7.217092 -4.300000 14.300000 7.020635 -4.300000 14.400000 6.844178 -4.300000 14.500000 6.687721 -4.300000 14.600000 6.551264 -4.300000 14.700000 6.434808 -4.300000 14.800000 6.338351 -4.300000 14.900000 6.261894 -4.300000 15.000000 6.205437 -4.200000 -5.000000 403.826700 -4.200000 -4.900000 399.844035 -4.200000 -4.800000 395.881371 -4.200000 -4.700000 391.938706 -4.200000 -4.600000 388.016042 -4.200000 -4.500000 384.113377 -4.200000 -4.400000 380.230713 -4.200000 -4.300000 376.368048 -4.200000 -4.200000 372.525384 -4.200000 -4.100000 368.702719 -4.200000 -4.000000 364.900055 -4.200000 -3.900000 361.117390 -4.200000 -3.800000 357.354726 -4.200000 -3.700000 353.612062 -4.200000 -3.600000 349.889397 -4.200000 -3.500000 346.186733 -4.200000 -3.400000 342.504068 -4.200000 -3.300000 338.841404 -4.200000 -3.200000 335.198739 -4.200000 -3.100000 331.576075 -4.200000 -3.000000 327.973410 -4.200000 -2.900000 324.390746 -4.200000 -2.800000 320.828081 -4.200000 -2.700000 317.285417 -4.200000 -2.600000 313.762752 -4.200000 -2.500000 310.260088 -4.200000 -2.400000 306.777423 -4.200000 -2.300000 303.314759 -4.200000 -2.200000 299.872094 -4.200000 -2.100000 296.449430 -4.200000 -2.000000 293.046766 -4.200000 -1.900000 289.664101 -4.200000 -1.800000 286.301437 -4.200000 -1.700000 282.958772 -4.200000 -1.600000 279.636108 -4.200000 -1.500000 276.333443 -4.200000 -1.400000 273.050779 -4.200000 -1.300000 269.788114 -4.200000 -1.200000 266.545450 -4.200000 -1.100000 263.322785 -4.200000 -1.000000 260.120121 -4.200000 -0.900000 256.937456 -4.200000 -0.800000 253.774792 -4.200000 -0.700000 250.632127 -4.200000 -0.600000 247.509463 -4.200000 -0.500000 244.406799 -4.200000 -0.400000 241.324134 -4.200000 -0.300000 238.261470 -4.200000 -0.200000 235.218805 -4.200000 -0.100000 232.196141 -4.200000 -0.000000 229.193476 -4.200000 0.100000 226.210812 -4.200000 0.200000 223.248147 -4.200000 0.300000 220.305483 -4.200000 0.400000 217.382818 -4.200000 0.500000 214.480154 -4.200000 0.600000 211.597489 -4.200000 0.700000 208.734825 -4.200000 0.800000 205.892160 -4.200000 0.900000 203.069496 -4.200000 1.000000 200.266831 -4.200000 1.100000 197.484167 -4.200000 1.200000 194.721503 -4.200000 1.300000 191.978838 -4.200000 1.400000 189.256174 -4.200000 1.500000 186.553509 -4.200000 1.600000 183.870845 -4.200000 1.700000 181.208180 -4.200000 1.800000 178.565516 -4.200000 1.900000 175.942851 -4.200000 2.000000 173.340187 -4.200000 2.100000 170.757522 -4.200000 2.200000 168.194858 -4.200000 2.300000 165.652193 -4.200000 2.400000 163.129529 -4.200000 2.500000 160.626864 -4.200000 2.600000 158.144200 -4.200000 2.700000 155.681535 -4.200000 2.800000 153.238871 -4.200000 2.900000 150.816207 -4.200000 3.000000 148.413542 -4.200000 3.100000 146.030878 -4.200000 3.200000 143.668213 -4.200000 3.300000 141.325549 -4.200000 3.400000 139.002884 -4.200000 3.500000 136.700220 -4.200000 3.600000 134.417555 -4.200000 3.700000 132.154891 -4.200000 3.800000 129.912226 -4.200000 3.900000 127.689562 -4.200000 4.000000 125.486897 -4.200000 4.100000 123.304233 -4.200000 4.200000 121.141568 -4.200000 4.300000 118.998904 -4.200000 4.400000 116.876239 -4.200000 4.500000 114.773575 -4.200000 4.600000 112.690911 -4.200000 4.700000 110.628246 -4.200000 4.800000 108.585582 -4.200000 4.900000 106.562917 -4.200000 5.000000 104.560253 -4.200000 5.100000 102.577588 -4.200000 5.200000 100.614924 -4.200000 5.300000 98.672259 -4.200000 5.400000 96.749595 -4.200000 5.500000 94.846930 -4.200000 5.600000 92.964266 -4.200000 5.700000 91.101601 -4.200000 5.800000 89.258937 -4.200000 5.900000 87.436272 -4.200000 6.000000 85.633608 -4.200000 6.100000 83.850943 -4.200000 6.200000 82.088279 -4.200000 6.300000 80.345615 -4.200000 6.400000 78.622950 -4.200000 6.500000 76.920286 -4.200000 6.600000 75.237621 -4.200000 6.700000 73.574957 -4.200000 6.800000 71.932292 -4.200000 6.900000 70.309628 -4.200000 7.000000 68.706963 -4.200000 7.100000 67.124299 -4.200000 7.200000 65.561634 -4.200000 7.300000 64.018970 -4.200000 7.400000 62.496305 -4.200000 7.500000 60.993641 -4.200000 7.600000 59.510976 -4.200000 7.700000 58.048312 -4.200000 7.800000 56.605647 -4.200000 7.900000 55.182983 -4.200000 8.000000 53.780319 -4.200000 8.100000 52.397654 -4.200000 8.200000 51.034990 -4.200000 8.300000 49.692325 -4.200000 8.400000 48.369661 -4.200000 8.500000 47.066996 -4.200000 8.600000 45.784332 -4.200000 8.700000 44.521667 -4.200000 8.800000 43.279003 -4.200000 8.900000 42.056338 -4.200000 9.000000 40.853674 -4.200000 9.100000 39.671009 -4.200000 9.200000 38.508345 -4.200000 9.300000 37.365680 -4.200000 9.400000 36.243016 -4.200000 9.500000 35.140351 -4.200000 9.600000 34.057687 -4.200000 9.700000 32.995023 -4.200000 9.800000 31.952358 -4.200000 9.900000 30.929694 -4.200000 10.000000 29.927029 -4.200000 10.100000 28.944365 -4.200000 10.200000 27.981700 -4.200000 10.300000 27.039036 -4.200000 10.400000 26.116371 -4.200000 10.500000 25.213707 -4.200000 10.600000 24.331042 -4.200000 10.700000 23.468378 -4.200000 10.800000 22.625713 -4.200000 10.900000 21.803049 -4.200000 11.000000 21.000384 -4.200000 11.100000 20.217720 -4.200000 11.200000 19.455055 -4.200000 11.300000 18.712391 -4.200000 11.400000 17.989727 -4.200000 11.500000 17.287062 -4.200000 11.600000 16.604398 -4.200000 11.700000 15.941733 -4.200000 11.800000 15.299069 -4.200000 11.900000 14.676404 -4.200000 12.000000 14.073740 -4.200000 12.100000 13.491075 -4.200000 12.200000 12.928411 -4.200000 12.300000 12.385746 -4.200000 12.400000 11.863082 -4.200000 12.500000 11.360417 -4.200000 12.600000 10.877753 -4.200000 12.700000 10.415088 -4.200000 12.800000 9.972424 -4.200000 12.900000 9.549759 -4.200000 13.000000 9.147095 -4.200000 13.100000 8.764431 -4.200000 13.200000 8.401766 -4.200000 13.300000 8.059102 -4.200000 13.400000 7.736437 -4.200000 13.500000 7.433773 -4.200000 13.600000 7.151108 -4.200000 13.700000 6.888444 -4.200000 13.800000 6.645779 -4.200000 13.900000 6.423115 -4.200000 14.000000 6.220450 -4.200000 14.100000 6.037786 -4.200000 14.200000 5.875121 -4.200000 14.300000 5.732457 -4.200000 14.400000 5.609792 -4.200000 14.500000 5.507128 -4.200000 14.600000 5.424464 -4.200000 14.700000 5.361799 -4.200000 14.800000 5.319135 -4.200000 14.900000 5.296470 -4.200000 15.000000 5.293806 -4.100000 -5.000000 392.450089 -4.100000 -4.900000 388.520700 -4.100000 -4.800000 384.611311 -4.100000 -4.700000 380.721923 -4.100000 -4.600000 376.852534 -4.100000 -4.500000 373.003145 -4.100000 -4.400000 369.173756 -4.100000 -4.300000 365.364367 -4.100000 -4.200000 361.574978 -4.100000 -4.100000 357.805589 -4.100000 -4.000000 354.056201 -4.100000 -3.900000 350.326812 -4.100000 -3.800000 346.617423 -4.100000 -3.700000 342.928034 -4.100000 -3.600000 339.258645 -4.100000 -3.500000 335.609256 -4.100000 -3.400000 331.979867 -4.100000 -3.300000 328.370479 -4.100000 -3.200000 324.781090 -4.100000 -3.100000 321.211701 -4.100000 -3.000000 317.662312 -4.100000 -2.900000 314.132923 -4.100000 -2.800000 310.623534 -4.100000 -2.700000 307.134145 -4.100000 -2.600000 303.664757 -4.100000 -2.500000 300.215368 -4.100000 -2.400000 296.785979 -4.100000 -2.300000 293.376590 -4.100000 -2.200000 289.987201 -4.100000 -2.100000 286.617812 -4.100000 -2.000000 283.268424 -4.100000 -1.900000 279.939035 -4.100000 -1.800000 276.629646 -4.100000 -1.700000 273.340257 -4.100000 -1.600000 270.070868 -4.100000 -1.500000 266.821479 -4.100000 -1.400000 263.592090 -4.100000 -1.300000 260.382702 -4.100000 -1.200000 257.193313 -4.100000 -1.100000 254.023924 -4.100000 -1.000000 250.874535 -4.100000 -0.900000 247.745146 -4.100000 -0.800000 244.635757 -4.100000 -0.700000 241.546368 -4.100000 -0.600000 238.476980 -4.100000 -0.500000 235.427591 -4.100000 -0.400000 232.398202 -4.100000 -0.300000 229.388813 -4.100000 -0.200000 226.399424 -4.100000 -0.100000 223.430035 -4.100000 -0.000000 220.480646 -4.100000 0.100000 217.551258 -4.100000 0.200000 214.641869 -4.100000 0.300000 211.752480 -4.100000 0.400000 208.883091 -4.100000 0.500000 206.033702 -4.100000 0.600000 203.204313 -4.100000 0.700000 200.394924 -4.100000 0.800000 197.605536 -4.100000 0.900000 194.836147 -4.100000 1.000000 192.086758 -4.100000 1.100000 189.357369 -4.100000 1.200000 186.647980 -4.100000 1.300000 183.958591 -4.100000 1.400000 181.289203 -4.100000 1.500000 178.639814 -4.100000 1.600000 176.010425 -4.100000 1.700000 173.401036 -4.100000 1.800000 170.811647 -4.100000 1.900000 168.242258 -4.100000 2.000000 165.692869 -4.100000 2.100000 163.163481 -4.100000 2.200000 160.654092 -4.100000 2.300000 158.164703 -4.100000 2.400000 155.695314 -4.100000 2.500000 153.245925 -4.100000 2.600000 150.816536 -4.100000 2.700000 148.407147 -4.100000 2.800000 146.017759 -4.100000 2.900000 143.648370 -4.100000 3.000000 141.298981 -4.100000 3.100000 138.969592 -4.100000 3.200000 136.660203 -4.100000 3.300000 134.370814 -4.100000 3.400000 132.101425 -4.100000 3.500000 129.852037 -4.100000 3.600000 127.622648 -4.100000 3.700000 125.413259 -4.100000 3.800000 123.223870 -4.100000 3.900000 121.054481 -4.100000 4.000000 118.905092 -4.100000 4.100000 116.775703 -4.100000 4.200000 114.666315 -4.100000 4.300000 112.576926 -4.100000 4.400000 110.507537 -4.100000 4.500000 108.458148 -4.100000 4.600000 106.428759 -4.100000 4.700000 104.419370 -4.100000 4.800000 102.429982 -4.100000 4.900000 100.460593 -4.100000 5.000000 98.511204 -4.100000 5.100000 96.581815 -4.100000 5.200000 94.672426 -4.100000 5.300000 92.783037 -4.100000 5.400000 90.913648 -4.100000 5.500000 89.064260 -4.100000 5.600000 87.234871 -4.100000 5.700000 85.425482 -4.100000 5.800000 83.636093 -4.100000 5.900000 81.866704 -4.100000 6.000000 80.117315 -4.100000 6.100000 78.387926 -4.100000 6.200000 76.678538 -4.100000 6.300000 74.989149 -4.100000 6.400000 73.319760 -4.100000 6.500000 71.670371 -4.100000 6.600000 70.040982 -4.100000 6.700000 68.431593 -4.100000 6.800000 66.842204 -4.100000 6.900000 65.272816 -4.100000 7.000000 63.723427 -4.100000 7.100000 62.194038 -4.100000 7.200000 60.684649 -4.100000 7.300000 59.195260 -4.100000 7.400000 57.725871 -4.100000 7.500000 56.276482 -4.100000 7.600000 54.847094 -4.100000 7.700000 53.437705 -4.100000 7.800000 52.048316 -4.100000 7.900000 50.678927 -4.100000 8.000000 49.329538 -4.100000 8.100000 48.000149 -4.100000 8.200000 46.690761 -4.100000 8.300000 45.401372 -4.100000 8.400000 44.131983 -4.100000 8.500000 42.882594 -4.100000 8.600000 41.653205 -4.100000 8.700000 40.443816 -4.100000 8.800000 39.254427 -4.100000 8.900000 38.085039 -4.100000 9.000000 36.935650 -4.100000 9.100000 35.806261 -4.100000 9.200000 34.696872 -4.100000 9.300000 33.607483 -4.100000 9.400000 32.538094 -4.100000 9.500000 31.488705 -4.100000 9.600000 30.459317 -4.100000 9.700000 29.449928 -4.100000 9.800000 28.460539 -4.100000 9.900000 27.491150 -4.100000 10.000000 26.541761 -4.100000 10.100000 25.612372 -4.100000 10.200000 24.702983 -4.100000 10.300000 23.813595 -4.100000 10.400000 22.944206 -4.100000 10.500000 22.094817 -4.100000 10.600000 21.265428 -4.100000 10.700000 20.456039 -4.100000 10.800000 19.666650 -4.100000 10.900000 18.897261 -4.100000 11.000000 18.147873 -4.100000 11.100000 17.418484 -4.100000 11.200000 16.709095 -4.100000 11.300000 16.019706 -4.100000 11.400000 15.350317 -4.100000 11.500000 14.700928 -4.100000 11.600000 14.071539 -4.100000 11.700000 13.462151 -4.100000 11.800000 12.872762 -4.100000 11.900000 12.303373 -4.100000 12.000000 11.753984 -4.100000 12.100000 11.224595 -4.100000 12.200000 10.715206 -4.100000 12.300000 10.225818 -4.100000 12.400000 9.756429 -4.100000 12.500000 9.307040 -4.100000 12.600000 8.877651 -4.100000 12.700000 8.468262 -4.100000 12.800000 8.078873 -4.100000 12.900000 7.709484 -4.100000 13.000000 7.360096 -4.100000 13.100000 7.030707 -4.100000 13.200000 6.721318 -4.100000 13.300000 6.431929 -4.100000 13.400000 6.162540 -4.100000 13.500000 5.913151 -4.100000 13.600000 5.683762 -4.100000 13.700000 5.474374 -4.100000 13.800000 5.284985 -4.100000 13.900000 5.115596 -4.100000 14.000000 4.966207 -4.100000 14.100000 4.836818 -4.100000 14.200000 4.727429 -4.100000 14.300000 4.638040 -4.100000 14.400000 4.568652 -4.100000 14.500000 4.519263 -4.100000 14.600000 4.489874 -4.100000 14.700000 4.480485 -4.100000 14.800000 4.491096 -4.100000 14.900000 4.521707 -4.100000 15.000000 4.572318 -4.000000 -5.000000 381.370954 -4.000000 -4.900000 377.494324 -4.000000 -4.800000 373.637694 -4.000000 -4.700000 369.801064 -4.000000 -4.600000 365.984434 -4.000000 -4.500000 362.187804 -4.000000 -4.400000 358.411174 -4.000000 -4.300000 354.654544 -4.000000 -4.200000 350.917914 -4.000000 -4.100000 347.201284 -4.000000 -4.000000 343.504654 -4.000000 -3.900000 339.828024 -4.000000 -3.800000 336.171395 -4.000000 -3.700000 332.534765 -4.000000 -3.600000 328.918135 -4.000000 -3.500000 325.321505 -4.000000 -3.400000 321.744875 -4.000000 -3.300000 318.188245 -4.000000 -3.200000 314.651615 -4.000000 -3.100000 311.134985 -4.000000 -3.000000 307.638355 -4.000000 -2.900000 304.161725 -4.000000 -2.800000 300.705095 -4.000000 -2.700000 297.268465 -4.000000 -2.600000 293.851835 -4.000000 -2.500000 290.455205 -4.000000 -2.400000 287.078575 -4.000000 -2.300000 283.721945 -4.000000 -2.200000 280.385315 -4.000000 -2.100000 277.068685 -4.000000 -2.000000 273.772055 -4.000000 -1.900000 270.495425 -4.000000 -1.800000 267.238795 -4.000000 -1.700000 264.002165 -4.000000 -1.600000 260.785535 -4.000000 -1.500000 257.588905 -4.000000 -1.400000 254.412275 -4.000000 -1.300000 251.255645 -4.000000 -1.200000 248.119015 -4.000000 -1.100000 245.002385 -4.000000 -1.000000 241.905755 -4.000000 -0.900000 238.829125 -4.000000 -0.800000 235.772495 -4.000000 -0.700000 232.735865 -4.000000 -0.600000 229.719235 -4.000000 -0.500000 226.722605 -4.000000 -0.400000 223.745975 -4.000000 -0.300000 220.789345 -4.000000 -0.200000 217.852715 -4.000000 -0.100000 214.936085 -4.000000 -0.000000 212.039455 -4.000000 0.100000 209.162826 -4.000000 0.200000 206.306196 -4.000000 0.300000 203.469566 -4.000000 0.400000 200.652936 -4.000000 0.500000 197.856306 -4.000000 0.600000 195.079676 -4.000000 0.700000 192.323046 -4.000000 0.800000 189.586416 -4.000000 0.900000 186.869786 -4.000000 1.000000 184.173156 -4.000000 1.100000 181.496526 -4.000000 1.200000 178.839896 -4.000000 1.300000 176.203266 -4.000000 1.400000 173.586636 -4.000000 1.500000 170.990006 -4.000000 1.600000 168.413376 -4.000000 1.700000 165.856746 -4.000000 1.800000 163.320116 -4.000000 1.900000 160.803486 -4.000000 2.000000 158.306856 -4.000000 2.100000 155.830226 -4.000000 2.200000 153.373596 -4.000000 2.300000 150.936966 -4.000000 2.400000 148.520336 -4.000000 2.500000 146.123706 -4.000000 2.600000 143.747076 -4.000000 2.700000 141.390446 -4.000000 2.800000 139.053816 -4.000000 2.900000 136.737186 -4.000000 3.000000 134.440556 -4.000000 3.100000 132.163926 -4.000000 3.200000 129.907296 -4.000000 3.300000 127.670666 -4.000000 3.400000 125.454036 -4.000000 3.500000 123.257406 -4.000000 3.600000 121.080776 -4.000000 3.700000 118.924146 -4.000000 3.800000 116.787516 -4.000000 3.900000 114.670887 -4.000000 4.000000 112.574257 -4.000000 4.100000 110.497627 -4.000000 4.200000 108.440997 -4.000000 4.300000 106.404367 -4.000000 4.400000 104.387737 -4.000000 4.500000 102.391107 -4.000000 4.600000 100.414477 -4.000000 4.700000 98.457847 -4.000000 4.800000 96.521217 -4.000000 4.900000 94.604587 -4.000000 5.000000 92.707957 -4.000000 5.100000 90.831327 -4.000000 5.200000 88.974697 -4.000000 5.300000 87.138067 -4.000000 5.400000 85.321437 -4.000000 5.500000 83.524807 -4.000000 5.600000 81.748177 -4.000000 5.700000 79.991547 -4.000000 5.800000 78.254917 -4.000000 5.900000 76.538287 -4.000000 6.000000 74.841657 -4.000000 6.100000 73.165027 -4.000000 6.200000 71.508397 -4.000000 6.300000 69.871767 -4.000000 6.400000 68.255137 -4.000000 6.500000 66.658507 -4.000000 6.600000 65.081877 -4.000000 6.700000 63.525247 -4.000000 6.800000 61.988617 -4.000000 6.900000 60.471987 -4.000000 7.000000 58.975357 -4.000000 7.100000 57.498727 -4.000000 7.200000 56.042097 -4.000000 7.300000 54.605467 -4.000000 7.400000 53.188837 -4.000000 7.500000 51.792207 -4.000000 7.600000 50.415577 -4.000000 7.700000 49.058947 -4.000000 7.800000 47.722318 -4.000000 7.900000 46.405688 -4.000000 8.000000 45.109058 -4.000000 8.100000 43.832428 -4.000000 8.200000 42.575798 -4.000000 8.300000 41.339168 -4.000000 8.400000 40.122538 -4.000000 8.500000 38.925908 -4.000000 8.600000 37.749278 -4.000000 8.700000 36.592648 -4.000000 8.800000 35.456018 -4.000000 8.900000 34.339388 -4.000000 9.000000 33.242758 -4.000000 9.100000 32.166128 -4.000000 9.200000 31.109498 -4.000000 9.300000 30.072868 -4.000000 9.400000 29.056238 -4.000000 9.500000 28.059608 -4.000000 9.600000 27.082978 -4.000000 9.700000 26.126348 -4.000000 9.800000 25.189718 -4.000000 9.900000 24.273088 -4.000000 10.000000 23.376458 -4.000000 10.100000 22.499828 -4.000000 10.200000 21.643198 -4.000000 10.300000 20.806568 -4.000000 10.400000 19.989938 -4.000000 10.500000 19.193308 -4.000000 10.600000 18.416678 -4.000000 10.700000 17.660048 -4.000000 10.800000 16.923418 -4.000000 10.900000 16.206788 -4.000000 11.000000 15.510158 -4.000000 11.100000 14.833528 -4.000000 11.200000 14.176898 -4.000000 11.300000 13.540268 -4.000000 11.400000 12.923638 -4.000000 11.500000 12.327008 -4.000000 11.600000 11.750379 -4.000000 11.700000 11.193749 -4.000000 11.800000 10.657119 -4.000000 11.900000 10.140489 -4.000000 12.000000 9.643859 -4.000000 12.100000 9.167229 -4.000000 12.200000 8.710599 -4.000000 12.300000 8.273969 -4.000000 12.400000 7.857339 -4.000000 12.500000 7.460709 -4.000000 12.600000 7.084079 -4.000000 12.700000 6.727449 -4.000000 12.800000 6.390819 -4.000000 12.900000 6.074189 -4.000000 13.000000 5.777559 -4.000000 13.100000 5.500929 -4.000000 13.200000 5.244299 -4.000000 13.300000 5.007669 -4.000000 13.400000 4.791039 -4.000000 13.500000 4.594409 -4.000000 13.600000 4.417779 -4.000000 13.700000 4.261149 -4.000000 13.800000 4.124519 -4.000000 13.900000 4.007889 -4.000000 14.000000 3.911259 -4.000000 14.100000 3.834629 -4.000000 14.200000 3.777999 -4.000000 14.300000 3.741369 -4.000000 14.400000 3.724739 -4.000000 14.500000 3.728109 -4.000000 14.600000 3.751479 -4.000000 14.700000 3.794849 -4.000000 14.800000 3.858219 -4.000000 14.900000 3.941589 -4.000000 15.000000 4.044959 -3.900000 -5.000000 370.592768 -3.900000 -4.900000 366.768380 -3.900000 -4.800000 362.963992 -3.900000 -4.700000 359.179604 -3.900000 -4.600000 355.415216 -3.900000 -4.500000 351.670828 -3.900000 -4.400000 347.946441 -3.900000 -4.300000 344.242053 -3.900000 -4.200000 340.557665 -3.900000 -4.100000 336.893277 -3.900000 -4.000000 333.248889 -3.900000 -3.900000 329.624501 -3.900000 -3.800000 326.020114 -3.900000 -3.700000 322.435726 -3.900000 -3.600000 318.871338 -3.900000 -3.500000 315.326950 -3.900000 -3.400000 311.802562 -3.900000 -3.300000 308.298174 -3.900000 -3.200000 304.813787 -3.900000 -3.100000 301.349399 -3.900000 -3.000000 297.905011 -3.900000 -2.900000 294.480623 -3.900000 -2.800000 291.076235 -3.900000 -2.700000 287.691847 -3.900000 -2.600000 284.327460 -3.900000 -2.500000 280.983072 -3.900000 -2.400000 277.658684 -3.900000 -2.300000 274.354296 -3.900000 -2.200000 271.069908 -3.900000 -2.100000 267.805520 -3.900000 -2.000000 264.561133 -3.900000 -1.900000 261.336745 -3.900000 -1.800000 258.132357 -3.900000 -1.700000 254.947969 -3.900000 -1.600000 251.783581 -3.900000 -1.500000 248.639193 -3.900000 -1.400000 245.514806 -3.900000 -1.300000 242.410418 -3.900000 -1.200000 239.326030 -3.900000 -1.100000 236.261642 -3.900000 -1.000000 233.217254 -3.900000 -0.900000 230.192866 -3.900000 -0.800000 227.188479 -3.900000 -0.700000 224.204091 -3.900000 -0.600000 221.239703 -3.900000 -0.500000 218.295315 -3.900000 -0.400000 215.370927 -3.900000 -0.300000 212.466539 -3.900000 -0.200000 209.582152 -3.900000 -0.100000 206.717764 -3.900000 -0.000000 203.873376 -3.900000 0.100000 201.048988 -3.900000 0.200000 198.244600 -3.900000 0.300000 195.460212 -3.900000 0.400000 192.695825 -3.900000 0.500000 189.951437 -3.900000 0.600000 187.227049 -3.900000 0.700000 184.522661 -3.900000 0.800000 181.838273 -3.900000 0.900000 179.173885 -3.900000 1.000000 176.529498 -3.900000 1.100000 173.905110 -3.900000 1.200000 171.300722 -3.900000 1.300000 168.716334 -3.900000 1.400000 166.151946 -3.900000 1.500000 163.607558 -3.900000 1.600000 161.083171 -3.900000 1.700000 158.578783 -3.900000 1.800000 156.094395 -3.900000 1.900000 153.630007 -3.900000 2.000000 151.185619 -3.900000 2.100000 148.761231 -3.900000 2.200000 146.356844 -3.900000 2.300000 143.972456 -3.900000 2.400000 141.608068 -3.900000 2.500000 139.263680 -3.900000 2.600000 136.939292 -3.900000 2.700000 134.634904 -3.900000 2.800000 132.350517 -3.900000 2.900000 130.086129 -3.900000 3.000000 127.841741 -3.900000 3.100000 125.617353 -3.900000 3.200000 123.412965 -3.900000 3.300000 121.228577 -3.900000 3.400000 119.064190 -3.900000 3.500000 116.919802 -3.900000 3.600000 114.795414 -3.900000 3.700000 112.691026 -3.900000 3.800000 110.606638 -3.900000 3.900000 108.542250 -3.900000 4.000000 106.497863 -3.900000 4.100000 104.473475 -3.900000 4.200000 102.469087 -3.900000 4.300000 100.484699 -3.900000 4.400000 98.520311 -3.900000 4.500000 96.575923 -3.900000 4.600000 94.651536 -3.900000 4.700000 92.747148 -3.900000 4.800000 90.862760 -3.900000 4.900000 88.998372 -3.900000 5.000000 87.153984 -3.900000 5.100000 85.329596 -3.900000 5.200000 83.525209 -3.900000 5.300000 81.740821 -3.900000 5.400000 79.976433 -3.900000 5.500000 78.232045 -3.900000 5.600000 76.507657 -3.900000 5.700000 74.803269 -3.900000 5.800000 73.118882 -3.900000 5.900000 71.454494 -3.900000 6.000000 69.810106 -3.900000 6.100000 68.185718 -3.900000 6.200000 66.581330 -3.900000 6.300000 64.996942 -3.900000 6.400000 63.432555 -3.900000 6.500000 61.888167 -3.900000 6.600000 60.363779 -3.900000 6.700000 58.859391 -3.900000 6.800000 57.375003 -3.900000 6.900000 55.910615 -3.900000 7.000000 54.466228 -3.900000 7.100000 53.041840 -3.900000 7.200000 51.637452 -3.900000 7.300000 50.253064 -3.900000 7.400000 48.888676 -3.900000 7.500000 47.544288 -3.900000 7.600000 46.219901 -3.900000 7.700000 44.915513 -3.900000 7.800000 43.631125 -3.900000 7.900000 42.366737 -3.900000 8.000000 41.122349 -3.900000 8.100000 39.897961 -3.900000 8.200000 38.693574 -3.900000 8.300000 37.509186 -3.900000 8.400000 36.344798 -3.900000 8.500000 35.200410 -3.900000 8.600000 34.076022 -3.900000 8.700000 32.971634 -3.900000 8.800000 31.887247 -3.900000 8.900000 30.822859 -3.900000 9.000000 29.778471 -3.900000 9.100000 28.754083 -3.900000 9.200000 27.749695 -3.900000 9.300000 26.765307 -3.900000 9.400000 25.800920 -3.900000 9.500000 24.856532 -3.900000 9.600000 23.932144 -3.900000 9.700000 23.027756 -3.900000 9.800000 22.143368 -3.900000 9.900000 21.278980 -3.900000 10.000000 20.434593 -3.900000 10.100000 19.610205 -3.900000 10.200000 18.805817 -3.900000 10.300000 18.021429 -3.900000 10.400000 17.257041 -3.900000 10.500000 16.512653 -3.900000 10.600000 15.788266 -3.900000 10.700000 15.083878 -3.900000 10.800000 14.399490 -3.900000 10.900000 13.735102 -3.900000 11.000000 13.090714 -3.900000 11.100000 12.466326 -3.900000 11.200000 11.861939 -3.900000 11.300000 11.277551 -3.900000 11.400000 10.713163 -3.900000 11.500000 10.168775 -3.900000 11.600000 9.644387 -3.900000 11.700000 9.139999 -3.900000 11.800000 8.655612 -3.900000 11.900000 8.191224 -3.900000 12.000000 7.746836 -3.900000 12.100000 7.322448 -3.900000 12.200000 6.918060 -3.900000 12.300000 6.533672 -3.900000 12.400000 6.169285 -3.900000 12.500000 5.824897 -3.900000 12.600000 5.500509 -3.900000 12.700000 5.196121 -3.900000 12.800000 4.911733 -3.900000 12.900000 4.647345 -3.900000 13.000000 4.402958 -3.900000 13.100000 4.178570 -3.900000 13.200000 3.974182 -3.900000 13.300000 3.789794 -3.900000 13.400000 3.625406 -3.900000 13.500000 3.481018 -3.900000 13.600000 3.356631 -3.900000 13.700000 3.252243 -3.900000 13.800000 3.167855 -3.900000 13.900000 3.103467 -3.900000 14.000000 3.059079 -3.900000 14.100000 3.034691 -3.900000 14.200000 3.030304 -3.900000 14.300000 3.045916 -3.900000 14.400000 3.081528 -3.900000 14.500000 3.137140 -3.900000 14.600000 3.212752 -3.900000 14.700000 3.308364 -3.900000 14.800000 3.423977 -3.900000 14.900000 3.559589 -3.900000 15.000000 3.715201 -3.800000 -5.000000 360.118415 -3.800000 -4.900000 356.345753 -3.800000 -4.800000 352.593091 -3.800000 -4.700000 348.860428 -3.800000 -4.600000 345.147766 -3.800000 -4.500000 341.455103 -3.800000 -4.400000 337.782441 -3.800000 -4.300000 334.129778 -3.800000 -4.200000 330.497116 -3.800000 -4.100000 326.884454 -3.800000 -4.000000 323.291791 -3.800000 -3.900000 319.719129 -3.800000 -3.800000 316.166466 -3.800000 -3.700000 312.633804 -3.800000 -3.600000 309.121141 -3.800000 -3.500000 305.628479 -3.800000 -3.400000 302.155817 -3.800000 -3.300000 298.703154 -3.800000 -3.200000 295.270492 -3.800000 -3.100000 291.857829 -3.800000 -3.000000 288.465167 -3.800000 -2.900000 285.092504 -3.800000 -2.800000 281.739842 -3.800000 -2.700000 278.407180 -3.800000 -2.600000 275.094517 -3.800000 -2.500000 271.801855 -3.800000 -2.400000 268.529192 -3.800000 -2.300000 265.276530 -3.800000 -2.200000 262.043867 -3.800000 -2.100000 258.831205 -3.800000 -2.000000 255.638543 -3.800000 -1.900000 252.465880 -3.800000 -1.800000 249.313218 -3.800000 -1.700000 246.180555 -3.800000 -1.600000 243.067893 -3.800000 -1.500000 239.975230 -3.800000 -1.400000 236.902568 -3.800000 -1.300000 233.849905 -3.800000 -1.200000 230.817243 -3.800000 -1.100000 227.804581 -3.800000 -1.000000 224.811918 -3.800000 -0.900000 221.839256 -3.800000 -0.800000 218.886593 -3.800000 -0.700000 215.953931 -3.800000 -0.600000 213.041268 -3.800000 -0.500000 210.148606 -3.800000 -0.400000 207.275944 -3.800000 -0.300000 204.423281 -3.800000 -0.200000 201.590619 -3.800000 -0.100000 198.777956 -3.800000 -0.000000 195.985294 -3.800000 0.100000 193.212631 -3.800000 0.200000 190.459969 -3.800000 0.300000 187.727307 -3.800000 0.400000 185.014644 -3.800000 0.500000 182.321982 -3.800000 0.600000 179.649319 -3.800000 0.700000 176.996657 -3.800000 0.800000 174.363994 -3.800000 0.900000 171.751332 -3.800000 1.000000 169.158670 -3.800000 1.100000 166.586007 -3.800000 1.200000 164.033345 -3.800000 1.300000 161.500682 -3.800000 1.400000 158.988020 -3.800000 1.500000 156.495357 -3.800000 1.600000 154.022695 -3.800000 1.700000 151.570033 -3.800000 1.800000 149.137370 -3.800000 1.900000 146.724708 -3.800000 2.000000 144.332045 -3.800000 2.100000 141.959383 -3.800000 2.200000 139.606720 -3.800000 2.300000 137.274058 -3.800000 2.400000 134.961396 -3.800000 2.500000 132.668733 -3.800000 2.600000 130.396071 -3.800000 2.700000 128.143408 -3.800000 2.800000 125.910746 -3.800000 2.900000 123.698083 -3.800000 3.000000 121.505421 -3.800000 3.100000 119.332759 -3.800000 3.200000 117.180096 -3.800000 3.300000 115.047434 -3.800000 3.400000 112.934771 -3.800000 3.500000 110.842109 -3.800000 3.600000 108.769446 -3.800000 3.700000 106.716784 -3.800000 3.800000 104.684122 -3.800000 3.900000 102.671459 -3.800000 4.000000 100.678797 -3.800000 4.100000 98.706134 -3.800000 4.200000 96.753472 -3.800000 4.300000 94.820809 -3.800000 4.400000 92.908147 -3.800000 4.500000 91.015485 -3.800000 4.600000 89.142822 -3.800000 4.700000 87.290160 -3.800000 4.800000 85.457497 -3.800000 4.900000 83.644835 -3.800000 5.000000 81.852172 -3.800000 5.100000 80.079510 -3.800000 5.200000 78.326848 -3.800000 5.300000 76.594185 -3.800000 5.400000 74.881523 -3.800000 5.500000 73.188860 -3.800000 5.600000 71.516198 -3.800000 5.700000 69.863535 -3.800000 5.800000 68.230873 -3.800000 5.900000 66.618211 -3.800000 6.000000 65.025548 -3.800000 6.100000 63.452886 -3.800000 6.200000 61.900223 -3.800000 6.300000 60.367561 -3.800000 6.400000 58.854898 -3.800000 6.500000 57.362236 -3.800000 6.600000 55.889574 -3.800000 6.700000 54.436911 -3.800000 6.800000 53.004249 -3.800000 6.900000 51.591586 -3.800000 7.000000 50.198924 -3.800000 7.100000 48.826261 -3.800000 7.200000 47.473599 -3.800000 7.300000 46.140937 -3.800000 7.400000 44.828274 -3.800000 7.500000 43.535612 -3.800000 7.600000 42.262949 -3.800000 7.700000 41.010287 -3.800000 7.800000 39.777624 -3.800000 7.900000 38.564962 -3.800000 8.000000 37.372300 -3.800000 8.100000 36.199637 -3.800000 8.200000 35.046975 -3.800000 8.300000 33.914312 -3.800000 8.400000 32.801650 -3.800000 8.500000 31.708987 -3.800000 8.600000 30.636325 -3.800000 8.700000 29.583663 -3.800000 8.800000 28.551000 -3.800000 8.900000 27.538338 -3.800000 9.000000 26.545675 -3.800000 9.100000 25.573013 -3.800000 9.200000 24.620350 -3.800000 9.300000 23.687688 -3.800000 9.400000 22.775025 -3.800000 9.500000 21.882363 -3.800000 9.600000 21.009701 -3.800000 9.700000 20.157038 -3.800000 9.800000 19.324376 -3.800000 9.900000 18.511713 -3.800000 10.000000 17.719051 -3.800000 10.100000 16.946388 -3.800000 10.200000 16.193726 -3.800000 10.300000 15.461064 -3.800000 10.400000 14.748401 -3.800000 10.500000 14.055739 -3.800000 10.600000 13.383076 -3.800000 10.700000 12.730414 -3.800000 10.800000 12.097751 -3.800000 10.900000 11.485089 -3.800000 11.000000 10.892427 -3.800000 11.100000 10.319764 -3.800000 11.200000 9.767102 -3.800000 11.300000 9.234439 -3.800000 11.400000 8.721777 -3.800000 11.500000 8.229114 -3.800000 11.600000 7.756452 -3.800000 11.700000 7.303790 -3.800000 11.800000 6.871127 -3.800000 11.900000 6.458465 -3.800000 12.000000 6.065802 -3.800000 12.100000 5.693140 -3.800000 12.200000 5.340477 -3.800000 12.300000 5.007815 -3.800000 12.400000 4.695153 -3.800000 12.500000 4.402490 -3.800000 12.600000 4.129828 -3.800000 12.700000 3.877165 -3.800000 12.800000 3.644503 -3.800000 12.900000 3.431840 -3.800000 13.000000 3.239178 -3.800000 13.100000 3.066516 -3.800000 13.200000 2.913853 -3.800000 13.300000 2.781191 -3.800000 13.400000 2.668528 -3.800000 13.500000 2.575866 -3.800000 13.600000 2.503203 -3.800000 13.700000 2.450541 -3.800000 13.800000 2.417879 -3.800000 13.900000 2.405216 -3.800000 14.000000 2.412554 -3.800000 14.100000 2.439891 -3.800000 14.200000 2.487229 -3.800000 14.300000 2.554566 -3.800000 14.400000 2.641904 -3.800000 14.500000 2.749242 -3.800000 14.600000 2.876579 -3.800000 14.700000 3.023917 -3.800000 14.800000 3.191254 -3.800000 14.900000 3.378592 -3.800000 15.000000 3.585929 -3.700000 -5.000000 349.950128 -3.700000 -4.900000 346.228674 -3.700000 -4.800000 342.527220 -3.700000 -4.700000 338.845767 -3.700000 -4.600000 335.184313 -3.700000 -4.500000 331.542859 -3.700000 -4.400000 327.921405 -3.700000 -4.300000 324.319952 -3.700000 -4.200000 320.738498 -3.700000 -4.100000 317.177044 -3.700000 -4.000000 313.635590 -3.700000 -3.900000 310.114137 -3.700000 -3.800000 306.612683 -3.700000 -3.700000 303.131229 -3.700000 -3.600000 299.669775 -3.700000 -3.500000 296.228321 -3.700000 -3.400000 292.806868 -3.700000 -3.300000 289.405414 -3.700000 -3.200000 286.023960 -3.700000 -3.100000 282.662506 -3.700000 -3.000000 279.321053 -3.700000 -2.900000 275.999599 -3.700000 -2.800000 272.698145 -3.700000 -2.700000 269.416691 -3.700000 -2.600000 266.155238 -3.700000 -2.500000 262.913784 -3.700000 -2.400000 259.692330 -3.700000 -2.300000 256.490876 -3.700000 -2.200000 253.309423 -3.700000 -2.100000 250.147969 -3.700000 -2.000000 247.006515 -3.700000 -1.900000 243.885061 -3.700000 -1.800000 240.783607 -3.700000 -1.700000 237.702154 -3.700000 -1.600000 234.640700 -3.700000 -1.500000 231.599246 -3.700000 -1.400000 228.577792 -3.700000 -1.300000 225.576339 -3.700000 -1.200000 222.594885 -3.700000 -1.100000 219.633431 -3.700000 -1.000000 216.691977 -3.700000 -0.900000 213.770524 -3.700000 -0.800000 210.869070 -3.700000 -0.700000 207.987616 -3.700000 -0.600000 205.126162 -3.700000 -0.500000 202.284709 -3.700000 -0.400000 199.463255 -3.700000 -0.300000 196.661801 -3.700000 -0.200000 193.880347 -3.700000 -0.100000 191.118893 -3.700000 -0.000000 188.377440 -3.700000 0.100000 185.655986 -3.700000 0.200000 182.954532 -3.700000 0.300000 180.273078 -3.700000 0.400000 177.611625 -3.700000 0.500000 174.970171 -3.700000 0.600000 172.348717 -3.700000 0.700000 169.747263 -3.700000 0.800000 167.165810 -3.700000 0.900000 164.604356 -3.700000 1.000000 162.062902 -3.700000 1.100000 159.541448 -3.700000 1.200000 157.039995 -3.700000 1.300000 154.558541 -3.700000 1.400000 152.097087 -3.700000 1.500000 149.655633 -3.700000 1.600000 147.234179 -3.700000 1.700000 144.832726 -3.700000 1.800000 142.451272 -3.700000 1.900000 140.089818 -3.700000 2.000000 137.748364 -3.700000 2.100000 135.426911 -3.700000 2.200000 133.125457 -3.700000 2.300000 130.844003 -3.700000 2.400000 128.582549 -3.700000 2.500000 126.341096 -3.700000 2.600000 124.119642 -3.700000 2.700000 121.918188 -3.700000 2.800000 119.736734 -3.700000 2.900000 117.575281 -3.700000 3.000000 115.433827 -3.700000 3.100000 113.312373 -3.700000 3.200000 111.210919 -3.700000 3.300000 109.129465 -3.700000 3.400000 107.068012 -3.700000 3.500000 105.026558 -3.700000 3.600000 103.005104 -3.700000 3.700000 101.003650 -3.700000 3.800000 99.022197 -3.700000 3.900000 97.060743 -3.700000 4.000000 95.119289 -3.700000 4.100000 93.197835 -3.700000 4.200000 91.296382 -3.700000 4.300000 89.414928 -3.700000 4.400000 87.553474 -3.700000 4.500000 85.712020 -3.700000 4.600000 83.890567 -3.700000 4.700000 82.089113 -3.700000 4.800000 80.307659 -3.700000 4.900000 78.546205 -3.700000 5.000000 76.804751 -3.700000 5.100000 75.083298 -3.700000 5.200000 73.381844 -3.700000 5.300000 71.700390 -3.700000 5.400000 70.038936 -3.700000 5.500000 68.397483 -3.700000 5.600000 66.776029 -3.700000 5.700000 65.174575 -3.700000 5.800000 63.593121 -3.700000 5.900000 62.031668 -3.700000 6.000000 60.490214 -3.700000 6.100000 58.968760 -3.700000 6.200000 57.467306 -3.700000 6.300000 55.985853 -3.700000 6.400000 54.524399 -3.700000 6.500000 53.082945 -3.700000 6.600000 51.661491 -3.700000 6.700000 50.260037 -3.700000 6.800000 48.878584 -3.700000 6.900000 47.517130 -3.700000 7.000000 46.175676 -3.700000 7.100000 44.854222 -3.700000 7.200000 43.552769 -3.700000 7.300000 42.271315 -3.700000 7.400000 41.009861 -3.700000 7.500000 39.768407 -3.700000 7.600000 38.546954 -3.700000 7.700000 37.345500 -3.700000 7.800000 36.164046 -3.700000 7.900000 35.002592 -3.700000 8.000000 33.861139 -3.700000 8.100000 32.739685 -3.700000 8.200000 31.638231 -3.700000 8.300000 30.556777 -3.700000 8.400000 29.495323 -3.700000 8.500000 28.453870 -3.700000 8.600000 27.432416 -3.700000 8.700000 26.430962 -3.700000 8.800000 25.449508 -3.700000 8.900000 24.488055 -3.700000 9.000000 23.546601 -3.700000 9.100000 22.625147 -3.700000 9.200000 21.723693 -3.700000 9.300000 20.842240 -3.700000 9.400000 19.980786 -3.700000 9.500000 19.139332 -3.700000 9.600000 18.317878 -3.700000 9.700000 17.516425 -3.700000 9.800000 16.734971 -3.700000 9.900000 15.973517 -3.700000 10.000000 15.232063 -3.700000 10.100000 14.510609 -3.700000 10.200000 13.809156 -3.700000 10.300000 13.127702 -3.700000 10.400000 12.466248 -3.700000 10.500000 11.824794 -3.700000 10.600000 11.203341 -3.700000 10.700000 10.601887 -3.700000 10.800000 10.020433 -3.700000 10.900000 9.458979 -3.700000 11.000000 8.917526 -3.700000 11.100000 8.396072 -3.700000 11.200000 7.894618 -3.700000 11.300000 7.413164 -3.700000 11.400000 6.951711 -3.700000 11.500000 6.510257 -3.700000 11.600000 6.088803 -3.700000 11.700000 5.687349 -3.700000 11.800000 5.305895 -3.700000 11.900000 4.944442 -3.700000 12.000000 4.602988 -3.700000 12.100000 4.281534 -3.700000 12.200000 3.980080 -3.700000 12.300000 3.698627 -3.700000 12.400000 3.437173 -3.700000 12.500000 3.195719 -3.700000 12.600000 2.974265 -3.700000 12.700000 2.772812 -3.700000 12.800000 2.591358 -3.700000 12.900000 2.429904 -3.700000 13.000000 2.288450 -3.700000 13.100000 2.166997 -3.700000 13.200000 2.065543 -3.700000 13.300000 1.984089 -3.700000 13.400000 1.922635 -3.700000 13.500000 1.881181 -3.700000 13.600000 1.859728 -3.700000 13.700000 1.858274 -3.700000 13.800000 1.876820 -3.700000 13.900000 1.915366 -3.700000 14.000000 1.973913 -3.700000 14.100000 2.052459 -3.700000 14.200000 2.151005 -3.700000 14.300000 2.269551 -3.700000 14.400000 2.408098 -3.700000 14.500000 2.566644 -3.700000 14.600000 2.745190 -3.700000 14.700000 2.943736 -3.700000 14.800000 3.162283 -3.700000 14.900000 3.400829 -3.700000 15.000000 3.659375 -3.600000 -5.000000 340.089417 -3.600000 -4.900000 336.418656 -3.600000 -4.800000 332.767894 -3.600000 -4.700000 329.137132 -3.600000 -4.600000 325.526370 -3.600000 -4.500000 321.935608 -3.600000 -4.400000 318.364846 -3.600000 -4.300000 314.814085 -3.600000 -4.200000 311.283323 -3.600000 -4.100000 307.772561 -3.600000 -4.000000 304.281799 -3.600000 -3.900000 300.811037 -3.600000 -3.800000 297.360275 -3.600000 -3.700000 293.929513 -3.600000 -3.600000 290.518752 -3.600000 -3.500000 287.127990 -3.600000 -3.400000 283.757228 -3.600000 -3.300000 280.406466 -3.600000 -3.200000 277.075704 -3.600000 -3.100000 273.764942 -3.600000 -3.000000 270.474181 -3.600000 -2.900000 267.203419 -3.600000 -2.800000 263.952657 -3.600000 -2.700000 260.721895 -3.600000 -2.600000 257.511133 -3.600000 -2.500000 254.320371 -3.600000 -2.400000 251.149610 -3.600000 -2.300000 247.998848 -3.600000 -2.200000 244.868086 -3.600000 -2.100000 241.757324 -3.600000 -2.000000 238.666562 -3.600000 -1.900000 235.595800 -3.600000 -1.800000 232.545039 -3.600000 -1.700000 229.514277 -3.600000 -1.600000 226.503515 -3.600000 -1.500000 223.512753 -3.600000 -1.400000 220.541991 -3.600000 -1.300000 217.591229 -3.600000 -1.200000 214.660468 -3.600000 -1.100000 211.749706 -3.600000 -1.000000 208.858944 -3.600000 -0.900000 205.988182 -3.600000 -0.800000 203.137420 -3.600000 -0.700000 200.306658 -3.600000 -0.600000 197.495896 -3.600000 -0.500000 194.705135 -3.600000 -0.400000 191.934373 -3.600000 -0.300000 189.183611 -3.600000 -0.200000 186.452849 -3.600000 -0.100000 183.742087 -3.600000 -0.000000 181.051325 -3.600000 0.100000 178.380564 -3.600000 0.200000 175.729802 -3.600000 0.300000 173.099040 -3.600000 0.400000 170.488278 -3.600000 0.500000 167.897516 -3.600000 0.600000 165.326754 -3.600000 0.700000 162.775993 -3.600000 0.800000 160.245231 -3.600000 0.900000 157.734469 -3.600000 1.000000 155.243707 -3.600000 1.100000 152.772945 -3.600000 1.200000 150.322183 -3.600000 1.300000 147.891422 -3.600000 1.400000 145.480660 -3.600000 1.500000 143.089898 -3.600000 1.600000 140.719136 -3.600000 1.700000 138.368374 -3.600000 1.800000 136.037612 -3.600000 1.900000 133.726851 -3.600000 2.000000 131.436089 -3.600000 2.100000 129.165327 -3.600000 2.200000 126.914565 -3.600000 2.300000 124.683803 -3.600000 2.400000 122.473041 -3.600000 2.500000 120.282280 -3.600000 2.600000 118.111518 -3.600000 2.700000 115.960756 -3.600000 2.800000 113.829994 -3.600000 2.900000 111.719232 -3.600000 3.000000 109.628470 -3.600000 3.100000 107.557708 -3.600000 3.200000 105.506947 -3.600000 3.300000 103.476185 -3.600000 3.400000 101.465423 -3.600000 3.500000 99.474661 -3.600000 3.600000 97.503899 -3.600000 3.700000 95.553137 -3.600000 3.800000 93.622376 -3.600000 3.900000 91.711614 -3.600000 4.000000 89.820852 -3.600000 4.100000 87.950090 -3.600000 4.200000 86.099328 -3.600000 4.300000 84.268566 -3.600000 4.400000 82.457805 -3.600000 4.500000 80.667043 -3.600000 4.600000 78.896281 -3.600000 4.700000 77.145519 -3.600000 4.800000 75.414757 -3.600000 4.900000 73.703995 -3.600000 5.000000 72.013234 -3.600000 5.100000 70.342472 -3.600000 5.200000 68.691710 -3.600000 5.300000 67.060948 -3.600000 5.400000 65.450186 -3.600000 5.500000 63.859424 -3.600000 5.600000 62.288663 -3.600000 5.700000 60.737901 -3.600000 5.800000 59.207139 -3.600000 5.900000 57.696377 -3.600000 6.000000 56.205615 -3.600000 6.100000 54.734853 -3.600000 6.200000 53.284092 -3.600000 6.300000 51.853330 -3.600000 6.400000 50.442568 -3.600000 6.500000 49.051806 -3.600000 6.600000 47.681044 -3.600000 6.700000 46.330282 -3.600000 6.800000 44.999520 -3.600000 6.900000 43.688759 -3.600000 7.000000 42.397997 -3.600000 7.100000 41.127235 -3.600000 7.200000 39.876473 -3.600000 7.300000 38.645711 -3.600000 7.400000 37.434949 -3.600000 7.500000 36.244188 -3.600000 7.600000 35.073426 -3.600000 7.700000 33.922664 -3.600000 7.800000 32.791902 -3.600000 7.900000 31.681140 -3.600000 8.000000 30.590378 -3.600000 8.100000 29.519617 -3.600000 8.200000 28.468855 -3.600000 8.300000 27.438093 -3.600000 8.400000 26.427331 -3.600000 8.500000 25.436569 -3.600000 8.600000 24.465807 -3.600000 8.700000 23.515046 -3.600000 8.800000 22.584284 -3.600000 8.900000 21.673522 -3.600000 9.000000 20.782760 -3.600000 9.100000 19.911998 -3.600000 9.200000 19.061236 -3.600000 9.300000 18.230475 -3.600000 9.400000 17.419713 -3.600000 9.500000 16.628951 -3.600000 9.600000 15.858189 -3.600000 9.700000 15.107427 -3.600000 9.800000 14.376665 -3.600000 9.900000 13.665904 -3.600000 10.000000 12.975142 -3.600000 10.100000 12.304380 -3.600000 10.200000 11.653618 -3.600000 10.300000 11.022856 -3.600000 10.400000 10.412094 -3.600000 10.500000 9.821332 -3.600000 10.600000 9.250571 -3.600000 10.700000 8.699809 -3.600000 10.800000 8.169047 -3.600000 10.900000 7.658285 -3.600000 11.000000 7.167523 -3.600000 11.100000 6.696761 -3.600000 11.200000 6.246000 -3.600000 11.300000 5.815238 -3.600000 11.400000 5.404476 -3.600000 11.500000 5.013714 -3.600000 11.600000 4.642952 -3.600000 11.700000 4.292190 -3.600000 11.800000 3.961429 -3.600000 11.900000 3.650667 -3.600000 12.000000 3.359905 -3.600000 12.100000 3.089143 -3.600000 12.200000 2.838381 -3.600000 12.300000 2.607619 -3.600000 12.400000 2.396858 -3.600000 12.500000 2.206096 -3.600000 12.600000 2.035334 -3.600000 12.700000 1.884572 -3.600000 12.800000 1.753810 -3.600000 12.900000 1.643048 -3.600000 13.000000 1.552287 -3.600000 13.100000 1.481525 -3.600000 13.200000 1.430763 -3.600000 13.300000 1.400001 -3.600000 13.400000 1.389239 -3.600000 13.500000 1.398477 -3.600000 13.600000 1.427716 -3.600000 13.700000 1.476954 -3.600000 13.800000 1.546192 -3.600000 13.900000 1.635430 -3.600000 14.000000 1.744668 -3.600000 14.100000 1.873906 -3.600000 14.200000 2.023144 -3.600000 14.300000 2.192383 -3.600000 14.400000 2.381621 -3.600000 14.500000 2.590859 -3.600000 14.600000 2.820097 -3.600000 14.700000 3.069335 -3.600000 14.800000 3.338573 -3.600000 14.900000 3.627812 -3.600000 15.000000 3.937050 -3.500000 -5.000000 330.537023 -3.500000 -4.900000 326.916436 -3.500000 -4.800000 323.315850 -3.500000 -4.700000 319.735263 -3.500000 -4.600000 316.174676 -3.500000 -4.500000 312.634090 -3.500000 -4.400000 309.113503 -3.500000 -4.300000 305.612916 -3.500000 -4.200000 302.132330 -3.500000 -4.100000 298.671743 -3.500000 -4.000000 295.231156 -3.500000 -3.900000 291.810570 -3.500000 -3.800000 288.409983 -3.500000 -3.700000 285.029396 -3.500000 -3.600000 281.668810 -3.500000 -3.500000 278.328223 -3.500000 -3.400000 275.007636 -3.500000 -3.300000 271.707050 -3.500000 -3.200000 268.426463 -3.500000 -3.100000 265.165876 -3.500000 -3.000000 261.925290 -3.500000 -2.900000 258.704703 -3.500000 -2.800000 255.504117 -3.500000 -2.700000 252.323530 -3.500000 -2.600000 249.162943 -3.500000 -2.500000 246.022357 -3.500000 -2.400000 242.901770 -3.500000 -2.300000 239.801183 -3.500000 -2.200000 236.720597 -3.500000 -2.100000 233.660010 -3.500000 -2.000000 230.619423 -3.500000 -1.900000 227.598837 -3.500000 -1.800000 224.598250 -3.500000 -1.700000 221.617663 -3.500000 -1.600000 218.657077 -3.500000 -1.500000 215.716490 -3.500000 -1.400000 212.795903 -3.500000 -1.300000 209.895317 -3.500000 -1.200000 207.014730 -3.500000 -1.100000 204.154143 -3.500000 -1.000000 201.313557 -3.500000 -0.900000 198.492970 -3.500000 -0.800000 195.692384 -3.500000 -0.700000 192.911797 -3.500000 -0.600000 190.151210 -3.500000 -0.500000 187.410624 -3.500000 -0.400000 184.690037 -3.500000 -0.300000 181.989450 -3.500000 -0.200000 179.308864 -3.500000 -0.100000 176.648277 -3.500000 -0.000000 174.007690 -3.500000 0.100000 171.387104 -3.500000 0.200000 168.786517 -3.500000 0.300000 166.205930 -3.500000 0.400000 163.645344 -3.500000 0.500000 161.104757 -3.500000 0.600000 158.584170 -3.500000 0.700000 156.083584 -3.500000 0.800000 153.602997 -3.500000 0.900000 151.142411 -3.500000 1.000000 148.701824 -3.500000 1.100000 146.281237 -3.500000 1.200000 143.880651 -3.500000 1.300000 141.500064 -3.500000 1.400000 139.139477 -3.500000 1.500000 136.798891 -3.500000 1.600000 134.478304 -3.500000 1.700000 132.177717 -3.500000 1.800000 129.897131 -3.500000 1.900000 127.636544 -3.500000 2.000000 125.395957 -3.500000 2.100000 123.175371 -3.500000 2.200000 120.974784 -3.500000 2.300000 118.794197 -3.500000 2.400000 116.633611 -3.500000 2.500000 114.493024 -3.500000 2.600000 112.372437 -3.500000 2.700000 110.271851 -3.500000 2.800000 108.191264 -3.500000 2.900000 106.130678 -3.500000 3.000000 104.090091 -3.500000 3.100000 102.069504 -3.500000 3.200000 100.068918 -3.500000 3.300000 98.088331 -3.500000 3.400000 96.127744 -3.500000 3.500000 94.187158 -3.500000 3.600000 92.266571 -3.500000 3.700000 90.365984 -3.500000 3.800000 88.485398 -3.500000 3.900000 86.624811 -3.500000 4.000000 84.784224 -3.500000 4.100000 82.963638 -3.500000 4.200000 81.163051 -3.500000 4.300000 79.382464 -3.500000 4.400000 77.621878 -3.500000 4.500000 75.881291 -3.500000 4.600000 74.160705 -3.500000 4.700000 72.460118 -3.500000 4.800000 70.779531 -3.500000 4.900000 69.118945 -3.500000 5.000000 67.478358 -3.500000 5.100000 65.857771 -3.500000 5.200000 64.257185 -3.500000 5.300000 62.676598 -3.500000 5.400000 61.116011 -3.500000 5.500000 59.575425 -3.500000 5.600000 58.054838 -3.500000 5.700000 56.554251 -3.500000 5.800000 55.073665 -3.500000 5.900000 53.613078 -3.500000 6.000000 52.172491 -3.500000 6.100000 50.751905 -3.500000 6.200000 49.351318 -3.500000 6.300000 47.970731 -3.500000 6.400000 46.610145 -3.500000 6.500000 45.269558 -3.500000 6.600000 43.948972 -3.500000 6.700000 42.648385 -3.500000 6.800000 41.367798 -3.500000 6.900000 40.107212 -3.500000 7.000000 38.866625 -3.500000 7.100000 37.646038 -3.500000 7.200000 36.445452 -3.500000 7.300000 35.264865 -3.500000 7.400000 34.104278 -3.500000 7.500000 32.963692 -3.500000 7.600000 31.843105 -3.500000 7.700000 30.742518 -3.500000 7.800000 29.661932 -3.500000 7.900000 28.601345 -3.500000 8.000000 27.560758 -3.500000 8.100000 26.540172 -3.500000 8.200000 25.539585 -3.500000 8.300000 24.558998 -3.500000 8.400000 23.598412 -3.500000 8.500000 22.657825 -3.500000 8.600000 21.737239 -3.500000 8.700000 20.836652 -3.500000 8.800000 19.956065 -3.500000 8.900000 19.095479 -3.500000 9.000000 18.254892 -3.500000 9.100000 17.434305 -3.500000 9.200000 16.633719 -3.500000 9.300000 15.853132 -3.500000 9.400000 15.092545 -3.500000 9.500000 14.351959 -3.500000 9.600000 13.631372 -3.500000 9.700000 12.930785 -3.500000 9.800000 12.250199 -3.500000 9.900000 11.589612 -3.500000 10.000000 10.949025 -3.500000 10.100000 10.328439 -3.500000 10.200000 9.727852 -3.500000 10.300000 9.147266 -3.500000 10.400000 8.586679 -3.500000 10.500000 8.046092 -3.500000 10.600000 7.525506 -3.500000 10.700000 7.024919 -3.500000 10.800000 6.544332 -3.500000 10.900000 6.083746 -3.500000 11.000000 5.643159 -3.500000 11.100000 5.222572 -3.500000 11.200000 4.821986 -3.500000 11.300000 4.441399 -3.500000 11.400000 4.080812 -3.500000 11.500000 3.740226 -3.500000 11.600000 3.419639 -3.500000 11.700000 3.119052 -3.500000 11.800000 2.838466 -3.500000 11.900000 2.577879 -3.500000 12.000000 2.337292 -3.500000 12.100000 2.116706 -3.500000 12.200000 1.916119 -3.500000 12.300000 1.735533 -3.500000 12.400000 1.574946 -3.500000 12.500000 1.434359 -3.500000 12.600000 1.313773 -3.500000 12.700000 1.213186 -3.500000 12.800000 1.132599 -3.500000 12.900000 1.072013 -3.500000 13.000000 1.031426 -3.500000 13.100000 1.010839 -3.500000 13.200000 1.010253 -3.500000 13.300000 1.029666 -3.500000 13.400000 1.069079 -3.500000 13.500000 1.128493 -3.500000 13.600000 1.207906 -3.500000 13.700000 1.307319 -3.500000 13.800000 1.426733 -3.500000 13.900000 1.566146 -3.500000 14.000000 1.725559 -3.500000 14.100000 1.904973 -3.500000 14.200000 2.104386 -3.500000 14.300000 2.323800 -3.500000 14.400000 2.563213 -3.500000 14.500000 2.822626 -3.500000 14.600000 3.102040 -3.500000 14.700000 3.401453 -3.500000 14.800000 3.720866 -3.500000 14.900000 4.060280 -3.500000 15.000000 4.419693 -3.400000 -5.000000 321.292864 -3.400000 -4.900000 317.721936 -3.400000 -4.800000 314.171007 -3.400000 -4.700000 310.640079 -3.400000 -4.600000 307.129151 -3.400000 -4.500000 303.638223 -3.400000 -4.400000 300.167295 -3.400000 -4.300000 296.716366 -3.400000 -4.200000 293.285438 -3.400000 -4.100000 289.874510 -3.400000 -4.000000 286.483582 -3.400000 -3.900000 283.112654 -3.400000 -3.800000 279.761725 -3.400000 -3.700000 276.430797 -3.400000 -3.600000 273.119869 -3.400000 -3.500000 269.828941 -3.400000 -3.400000 266.558013 -3.400000 -3.300000 263.307084 -3.400000 -3.200000 260.076156 -3.400000 -3.100000 256.865228 -3.400000 -3.000000 253.674300 -3.400000 -2.900000 250.503372 -3.400000 -2.800000 247.352444 -3.400000 -2.700000 244.221515 -3.400000 -2.600000 241.110587 -3.400000 -2.500000 238.019659 -3.400000 -2.400000 234.948731 -3.400000 -2.300000 231.897803 -3.400000 -2.200000 228.866874 -3.400000 -2.100000 225.855946 -3.400000 -2.000000 222.865018 -3.400000 -1.900000 219.894090 -3.400000 -1.800000 216.943162 -3.400000 -1.700000 214.012233 -3.400000 -1.600000 211.101305 -3.400000 -1.500000 208.210377 -3.400000 -1.400000 205.339449 -3.400000 -1.300000 202.488521 -3.400000 -1.200000 199.657592 -3.400000 -1.100000 196.846664 -3.400000 -1.000000 194.055736 -3.400000 -0.900000 191.284808 -3.400000 -0.800000 188.533880 -3.400000 -0.700000 185.802951 -3.400000 -0.600000 183.092023 -3.400000 -0.500000 180.401095 -3.400000 -0.400000 177.730167 -3.400000 -0.300000 175.079239 -3.400000 -0.200000 172.448310 -3.400000 -0.100000 169.837382 -3.400000 -0.000000 167.246454 -3.400000 0.100000 164.675526 -3.400000 0.200000 162.124598 -3.400000 0.300000 159.593669 -3.400000 0.400000 157.082741 -3.400000 0.500000 154.591813 -3.400000 0.600000 152.120885 -3.400000 0.700000 149.669957 -3.400000 0.800000 147.239028 -3.400000 0.900000 144.828100 -3.400000 1.000000 142.437172 -3.400000 1.100000 140.066244 -3.400000 1.200000 137.715316 -3.400000 1.300000 135.384387 -3.400000 1.400000 133.073459 -3.400000 1.500000 130.782531 -3.400000 1.600000 128.511603 -3.400000 1.700000 126.260675 -3.400000 1.800000 124.029746 -3.400000 1.900000 121.818818 -3.400000 2.000000 119.627890 -3.400000 2.100000 117.456962 -3.400000 2.200000 115.306034 -3.400000 2.300000 113.175105 -3.400000 2.400000 111.064177 -3.400000 2.500000 108.973249 -3.400000 2.600000 106.902321 -3.400000 2.700000 104.851393 -3.400000 2.800000 102.820464 -3.400000 2.900000 100.809536 -3.400000 3.000000 98.818608 -3.400000 3.100000 96.847680 -3.400000 3.200000 94.896752 -3.400000 3.300000 92.965823 -3.400000 3.400000 91.054895 -3.400000 3.500000 89.163967 -3.400000 3.600000 87.293039 -3.400000 3.700000 85.442111 -3.400000 3.800000 83.611182 -3.400000 3.900000 81.800254 -3.400000 4.000000 80.009326 -3.400000 4.100000 78.238398 -3.400000 4.200000 76.487470 -3.400000 4.300000 74.756541 -3.400000 4.400000 73.045613 -3.400000 4.500000 71.354685 -3.400000 4.600000 69.683757 -3.400000 4.700000 68.032829 -3.400000 4.800000 66.401900 -3.400000 4.900000 64.790972 -3.400000 5.000000 63.200044 -3.400000 5.100000 61.629116 -3.400000 5.200000 60.078188 -3.400000 5.300000 58.547259 -3.400000 5.400000 57.036331 -3.400000 5.500000 55.545403 -3.400000 5.600000 54.074475 -3.400000 5.700000 52.623547 -3.400000 5.800000 51.192618 -3.400000 5.900000 49.781690 -3.400000 6.000000 48.390762 -3.400000 6.100000 47.019834 -3.400000 6.200000 45.668906 -3.400000 6.300000 44.337977 -3.400000 6.400000 43.027049 -3.400000 6.500000 41.736121 -3.400000 6.600000 40.465193 -3.400000 6.700000 39.214265 -3.400000 6.800000 37.983336 -3.400000 6.900000 36.772408 -3.400000 7.000000 35.581480 -3.400000 7.100000 34.410552 -3.400000 7.200000 33.259624 -3.400000 7.300000 32.128695 -3.400000 7.400000 31.017767 -3.400000 7.500000 29.926839 -3.400000 7.600000 28.855911 -3.400000 7.700000 27.804983 -3.400000 7.800000 26.774054 -3.400000 7.900000 25.763126 -3.400000 8.000000 24.772198 -3.400000 8.100000 23.801270 -3.400000 8.200000 22.850342 -3.400000 8.300000 21.919414 -3.400000 8.400000 21.008485 -3.400000 8.500000 20.117557 -3.400000 8.600000 19.246629 -3.400000 8.700000 18.395701 -3.400000 8.800000 17.564773 -3.400000 8.900000 16.753844 -3.400000 9.000000 15.962916 -3.400000 9.100000 15.191988 -3.400000 9.200000 14.441060 -3.400000 9.300000 13.710132 -3.400000 9.400000 12.999203 -3.400000 9.500000 12.308275 -3.400000 9.600000 11.637347 -3.400000 9.700000 10.986419 -3.400000 9.800000 10.355491 -3.400000 9.900000 9.744562 -3.400000 10.000000 9.153634 -3.400000 10.100000 8.582706 -3.400000 10.200000 8.031778 -3.400000 10.300000 7.500850 -3.400000 10.400000 6.989921 -3.400000 10.500000 6.498993 -3.400000 10.600000 6.028065 -3.400000 10.700000 5.577137 -3.400000 10.800000 5.146209 -3.400000 10.900000 4.735280 -3.400000 11.000000 4.344352 -3.400000 11.100000 3.973424 -3.400000 11.200000 3.622496 -3.400000 11.300000 3.291568 -3.400000 11.400000 2.980639 -3.400000 11.500000 2.689711 -3.400000 11.600000 2.418783 -3.400000 11.700000 2.167855 -3.400000 11.800000 1.936927 -3.400000 11.900000 1.725998 -3.400000 12.000000 1.535070 -3.400000 12.100000 1.364142 -3.400000 12.200000 1.213214 -3.400000 12.300000 1.082286 -3.400000 12.400000 0.971357 -3.400000 12.500000 0.880429 -3.400000 12.600000 0.809501 -3.400000 12.700000 0.758573 -3.400000 12.800000 0.727645 -3.400000 12.900000 0.716716 -3.400000 13.000000 0.725788 -3.400000 13.100000 0.754860 -3.400000 13.200000 0.803932 -3.400000 13.300000 0.873004 -3.400000 13.400000 0.962075 -3.400000 13.500000 1.071147 -3.400000 13.600000 1.200219 -3.400000 13.700000 1.349291 -3.400000 13.800000 1.518363 -3.400000 13.900000 1.707434 -3.400000 14.000000 1.916506 -3.400000 14.100000 2.145578 -3.400000 14.200000 2.394650 -3.400000 14.300000 2.663722 -3.400000 14.400000 2.952793 -3.400000 14.500000 3.261865 -3.400000 14.600000 3.590937 -3.400000 14.700000 3.940009 -3.400000 14.800000 4.309081 -3.400000 14.900000 4.698152 -3.400000 15.000000 5.107224 -3.300000 -5.000000 312.356002 -3.300000 -4.900000 308.834216 -3.300000 -4.800000 305.332429 -3.300000 -4.700000 301.850643 -3.300000 -4.600000 298.388857 -3.300000 -4.500000 294.947070 -3.300000 -4.400000 291.525284 -3.300000 -4.300000 288.123497 -3.300000 -4.200000 284.741711 -3.300000 -4.100000 281.379924 -3.300000 -4.000000 278.038138 -3.300000 -3.900000 274.716351 -3.300000 -3.800000 271.414565 -3.300000 -3.700000 268.132778 -3.300000 -3.600000 264.870992 -3.300000 -3.500000 261.629205 -3.300000 -3.400000 258.407419 -3.300000 -3.300000 255.205632 -3.300000 -3.200000 252.023846 -3.300000 -3.100000 248.862059 -3.300000 -3.000000 245.720273 -3.300000 -2.900000 242.598486 -3.300000 -2.800000 239.496700 -3.300000 -2.700000 236.414913 -3.300000 -2.600000 233.353127 -3.300000 -2.500000 230.311340 -3.300000 -2.400000 227.289554 -3.300000 -2.300000 224.287767 -3.300000 -2.200000 221.305981 -3.300000 -2.100000 218.344194 -3.300000 -2.000000 215.402408 -3.300000 -1.900000 212.480621 -3.300000 -1.800000 209.578835 -3.300000 -1.700000 206.697048 -3.300000 -1.600000 203.835262 -3.300000 -1.500000 200.993475 -3.300000 -1.400000 198.171689 -3.300000 -1.300000 195.369903 -3.300000 -1.200000 192.588116 -3.300000 -1.100000 189.826330 -3.300000 -1.000000 187.084543 -3.300000 -0.900000 184.362757 -3.300000 -0.800000 181.660970 -3.300000 -0.700000 178.979184 -3.300000 -0.600000 176.317397 -3.300000 -0.500000 173.675611 -3.300000 -0.400000 171.053824 -3.300000 -0.300000 168.452038 -3.300000 -0.200000 165.870251 -3.300000 -0.100000 163.308465 -3.300000 -0.000000 160.766678 -3.300000 0.100000 158.244892 -3.300000 0.200000 155.743105 -3.300000 0.300000 153.261319 -3.300000 0.400000 150.799532 -3.300000 0.500000 148.357746 -3.300000 0.600000 145.935959 -3.300000 0.700000 143.534173 -3.300000 0.800000 141.152386 -3.300000 0.900000 138.790600 -3.300000 1.000000 136.448813 -3.300000 1.100000 134.127027 -3.300000 1.200000 131.825240 -3.300000 1.300000 129.543454 -3.300000 1.400000 127.281667 -3.300000 1.500000 125.039881 -3.300000 1.600000 122.818094 -3.300000 1.700000 120.616308 -3.300000 1.800000 118.434521 -3.300000 1.900000 116.272735 -3.300000 2.000000 114.130948 -3.300000 2.100000 112.009162 -3.300000 2.200000 109.907376 -3.300000 2.300000 107.825589 -3.300000 2.400000 105.763803 -3.300000 2.500000 103.722016 -3.300000 2.600000 101.700230 -3.300000 2.700000 99.698443 -3.300000 2.800000 97.716657 -3.300000 2.900000 95.754870 -3.300000 3.000000 93.813084 -3.300000 3.100000 91.891297 -3.300000 3.200000 89.989511 -3.300000 3.300000 88.107724 -3.300000 3.400000 86.245938 -3.300000 3.500000 84.404151 -3.300000 3.600000 82.582365 -3.300000 3.700000 80.780578 -3.300000 3.800000 78.998792 -3.300000 3.900000 77.237005 -3.300000 4.000000 75.495219 -3.300000 4.100000 73.773432 -3.300000 4.200000 72.071646 -3.300000 4.300000 70.389859 -3.300000 4.400000 68.728073 -3.300000 4.500000 67.086286 -3.300000 4.600000 65.464500 -3.300000 4.700000 63.862713 -3.300000 4.800000 62.280927 -3.300000 4.900000 60.719140 -3.300000 5.000000 59.177354 -3.300000 5.100000 57.655567 -3.300000 5.200000 56.153781 -3.300000 5.300000 54.671994 -3.300000 5.400000 53.210208 -3.300000 5.500000 51.768422 -3.300000 5.600000 50.346635 -3.300000 5.700000 48.944849 -3.300000 5.800000 47.563062 -3.300000 5.900000 46.201276 -3.300000 6.000000 44.859489 -3.300000 6.100000 43.537703 -3.300000 6.200000 42.235916 -3.300000 6.300000 40.954130 -3.300000 6.400000 39.692343 -3.300000 6.500000 38.450557 -3.300000 6.600000 37.228770 -3.300000 6.700000 36.026984 -3.300000 6.800000 34.845197 -3.300000 6.900000 33.683411 -3.300000 7.000000 32.541624 -3.300000 7.100000 31.419838 -3.300000 7.200000 30.318051 -3.300000 7.300000 29.236265 -3.300000 7.400000 28.174478 -3.300000 7.500000 27.132692 -3.300000 7.600000 26.110905 -3.300000 7.700000 25.109119 -3.300000 7.800000 24.127332 -3.300000 7.900000 23.165546 -3.300000 8.000000 22.223759 -3.300000 8.100000 21.301973 -3.300000 8.200000 20.400186 -3.300000 8.300000 19.518400 -3.300000 8.400000 18.656613 -3.300000 8.500000 17.814827 -3.300000 8.600000 16.993040 -3.300000 8.700000 16.191254 -3.300000 8.800000 15.409467 -3.300000 8.900000 14.647681 -3.300000 9.000000 13.905895 -3.300000 9.100000 13.184108 -3.300000 9.200000 12.482322 -3.300000 9.300000 11.800535 -3.300000 9.400000 11.138749 -3.300000 9.500000 10.496962 -3.300000 9.600000 9.875176 -3.300000 9.700000 9.273389 -3.300000 9.800000 8.691603 -3.300000 9.900000 8.129816 -3.300000 10.000000 7.588030 -3.300000 10.100000 7.066243 -3.300000 10.200000 6.564457 -3.300000 10.300000 6.082670 -3.300000 10.400000 5.620884 -3.300000 10.500000 5.179097 -3.300000 10.600000 4.757311 -3.300000 10.700000 4.355524 -3.300000 10.800000 3.973738 -3.300000 10.900000 3.611951 -3.300000 11.000000 3.270165 -3.300000 11.100000 2.948378 -3.300000 11.200000 2.646592 -3.300000 11.300000 2.364805 -3.300000 11.400000 2.103019 -3.300000 11.500000 1.861232 -3.300000 11.600000 1.639446 -3.300000 11.700000 1.437659 -3.300000 11.800000 1.255873 -3.300000 11.900000 1.094086 -3.300000 12.000000 0.952300 -3.300000 12.100000 0.830513 -3.300000 12.200000 0.728727 -3.300000 12.300000 0.646941 -3.300000 12.400000 0.585154 -3.300000 12.500000 0.543368 -3.300000 12.600000 0.521581 -3.300000 12.700000 0.519795 -3.300000 12.800000 0.538008 -3.300000 12.900000 0.576222 -3.300000 13.000000 0.634435 -3.300000 13.100000 0.712649 -3.300000 13.200000 0.810862 -3.300000 13.300000 0.929076 -3.300000 13.400000 1.067289 -3.300000 13.500000 1.225503 -3.300000 13.600000 1.403716 -3.300000 13.700000 1.601930 -3.300000 13.800000 1.820143 -3.300000 13.900000 2.058357 -3.300000 14.000000 2.316570 -3.300000 14.100000 2.594784 -3.300000 14.200000 2.892997 -3.300000 14.300000 3.211211 -3.300000 14.400000 3.549424 -3.300000 14.500000 3.907638 -3.300000 14.600000 4.285851 -3.300000 14.700000 4.684065 -3.300000 14.800000 5.102278 -3.300000 14.900000 5.540492 -3.300000 15.000000 5.998705 -3.200000 -5.000000 303.724614 -3.200000 -4.900000 300.251452 -3.200000 -4.800000 296.798291 -3.200000 -4.700000 293.365129 -3.200000 -4.600000 289.951968 -3.200000 -4.500000 286.558806 -3.200000 -4.400000 283.185645 -3.200000 -4.300000 279.832483 -3.200000 -4.200000 276.499322 -3.200000 -4.100000 273.186160 -3.200000 -4.000000 269.892999 -3.200000 -3.900000 266.619837 -3.200000 -3.800000 263.366676 -3.200000 -3.700000 260.133514 -3.200000 -3.600000 256.920353 -3.200000 -3.500000 253.727191 -3.200000 -3.400000 250.554030 -3.200000 -3.300000 247.400868 -3.200000 -3.200000 244.267707 -3.200000 -3.100000 241.154545 -3.200000 -3.000000 238.061384 -3.200000 -2.900000 234.988222 -3.200000 -2.800000 231.935061 -3.200000 -2.700000 228.901899 -3.200000 -2.600000 225.888738 -3.200000 -2.500000 222.895576 -3.200000 -2.400000 219.922415 -3.200000 -2.300000 216.969253 -3.200000 -2.200000 214.036092 -3.200000 -2.100000 211.122930 -3.200000 -2.000000 208.229769 -3.200000 -1.900000 205.356607 -3.200000 -1.800000 202.503445 -3.200000 -1.700000 199.670284 -3.200000 -1.600000 196.857122 -3.200000 -1.500000 194.063961 -3.200000 -1.400000 191.290799 -3.200000 -1.300000 188.537638 -3.200000 -1.200000 185.804476 -3.200000 -1.100000 183.091315 -3.200000 -1.000000 180.398153 -3.200000 -0.900000 177.724992 -3.200000 -0.800000 175.071830 -3.200000 -0.700000 172.438669 -3.200000 -0.600000 169.825507 -3.200000 -0.500000 167.232346 -3.200000 -0.400000 164.659184 -3.200000 -0.300000 162.106023 -3.200000 -0.200000 159.572861 -3.200000 -0.100000 157.059700 -3.200000 -0.000000 154.566538 -3.200000 0.100000 152.093377 -3.200000 0.200000 149.640215 -3.200000 0.300000 147.207054 -3.200000 0.400000 144.793892 -3.200000 0.500000 142.400731 -3.200000 0.600000 140.027569 -3.200000 0.700000 137.674408 -3.200000 0.800000 135.341246 -3.200000 0.900000 133.028085 -3.200000 1.000000 130.734923 -3.200000 1.100000 128.461762 -3.200000 1.200000 126.208600 -3.200000 1.300000 123.975439 -3.200000 1.400000 121.762277 -3.200000 1.500000 119.569116 -3.200000 1.600000 117.395954 -3.200000 1.700000 115.242793 -3.200000 1.800000 113.109631 -3.200000 1.900000 110.996470 -3.200000 2.000000 108.903308 -3.200000 2.100000 106.830147 -3.200000 2.200000 104.776985 -3.200000 2.300000 102.743824 -3.200000 2.400000 100.730662 -3.200000 2.500000 98.737501 -3.200000 2.600000 96.764339 -3.200000 2.700000 94.811178 -3.200000 2.800000 92.878016 -3.200000 2.900000 90.964854 -3.200000 3.000000 89.071693 -3.200000 3.100000 87.198531 -3.200000 3.200000 85.345370 -3.200000 3.300000 83.512208 -3.200000 3.400000 81.699047 -3.200000 3.500000 79.905885 -3.200000 3.600000 78.132724 -3.200000 3.700000 76.379562 -3.200000 3.800000 74.646401 -3.200000 3.900000 72.933239 -3.200000 4.000000 71.240078 -3.200000 4.100000 69.566916 -3.200000 4.200000 67.913755 -3.200000 4.300000 66.280593 -3.200000 4.400000 64.667432 -3.200000 4.500000 63.074270 -3.200000 4.600000 61.501109 -3.200000 4.700000 59.947947 -3.200000 4.800000 58.414786 -3.200000 4.900000 56.901624 -3.200000 5.000000 55.408463 -3.200000 5.100000 53.935301 -3.200000 5.200000 52.482140 -3.200000 5.300000 51.048978 -3.200000 5.400000 49.635817 -3.200000 5.500000 48.242655 -3.200000 5.600000 46.869494 -3.200000 5.700000 45.516332 -3.200000 5.800000 44.183171 -3.200000 5.900000 42.870009 -3.200000 6.000000 41.576848 -3.200000 6.100000 40.303686 -3.200000 6.200000 39.050525 -3.200000 6.300000 37.817363 -3.200000 6.400000 36.604202 -3.200000 6.500000 35.411040 -3.200000 6.600000 34.237879 -3.200000 6.700000 33.084717 -3.200000 6.800000 31.951556 -3.200000 6.900000 30.838394 -3.200000 7.000000 29.745233 -3.200000 7.100000 28.672071 -3.200000 7.200000 27.618910 -3.200000 7.300000 26.585748 -3.200000 7.400000 25.572587 -3.200000 7.500000 24.579425 -3.200000 7.600000 23.606263 -3.200000 7.700000 22.653102 -3.200000 7.800000 21.719940 -3.200000 7.900000 20.806779 -3.200000 8.000000 19.913617 -3.200000 8.100000 19.040456 -3.200000 8.200000 18.187294 -3.200000 8.300000 17.354133 -3.200000 8.400000 16.540971 -3.200000 8.500000 15.747810 -3.200000 8.600000 14.974648 -3.200000 8.700000 14.221487 -3.200000 8.800000 13.488325 -3.200000 8.900000 12.775164 -3.200000 9.000000 12.082002 -3.200000 9.100000 11.408841 -3.200000 9.200000 10.755679 -3.200000 9.300000 10.122518 -3.200000 9.400000 9.509356 -3.200000 9.500000 8.916195 -3.200000 9.600000 8.343033 -3.200000 9.700000 7.789872 -3.200000 9.800000 7.256710 -3.200000 9.900000 6.743549 -3.200000 10.000000 6.250387 -3.200000 10.100000 5.777226 -3.200000 10.200000 5.324064 -3.200000 10.300000 4.890903 -3.200000 10.400000 4.477741 -3.200000 10.500000 4.084580 -3.200000 10.600000 3.711418 -3.200000 10.700000 3.358257 -3.200000 10.800000 3.025095 -3.200000 10.900000 2.711934 -3.200000 11.000000 2.418772 -3.200000 11.100000 2.145611 -3.200000 11.200000 1.892449 -3.200000 11.300000 1.659288 -3.200000 11.400000 1.446126 -3.200000 11.500000 1.252965 -3.200000 11.600000 1.079803 -3.200000 11.700000 0.926642 -3.200000 11.800000 0.793480 -3.200000 11.900000 0.680319 -3.200000 12.000000 0.587157 -3.200000 12.100000 0.513996 -3.200000 12.200000 0.460834 -3.200000 12.300000 0.427673 -3.200000 12.400000 0.414511 -3.200000 12.500000 0.421349 -3.200000 12.600000 0.448188 -3.200000 12.700000 0.495026 -3.200000 12.800000 0.561865 -3.200000 12.900000 0.648703 -3.200000 13.000000 0.755542 -3.200000 13.100000 0.882380 -3.200000 13.200000 1.029219 -3.200000 13.300000 1.196057 -3.200000 13.400000 1.382896 -3.200000 13.500000 1.589734 -3.200000 13.600000 1.816573 -3.200000 13.700000 2.063411 -3.200000 13.800000 2.330250 -3.200000 13.900000 2.617088 -3.200000 14.000000 2.923927 -3.200000 14.100000 3.250765 -3.200000 14.200000 3.597604 -3.200000 14.300000 3.964442 -3.200000 14.400000 4.351281 -3.200000 14.500000 4.758119 -3.200000 14.600000 5.184958 -3.200000 14.700000 5.631796 -3.200000 14.800000 6.098635 -3.200000 14.900000 6.585473 -3.200000 15.000000 7.092312 -3.100000 -5.000000 295.395967 -3.100000 -4.900000 291.970913 -3.100000 -4.800000 288.565860 -3.100000 -4.700000 285.180807 -3.100000 -4.600000 281.815753 -3.100000 -4.500000 278.470700 -3.100000 -4.400000 275.145647 -3.100000 -4.300000 271.840594 -3.100000 -4.200000 268.555540 -3.100000 -4.100000 265.290487 -3.100000 -4.000000 262.045434 -3.100000 -3.900000 258.820381 -3.100000 -3.800000 255.615327 -3.100000 -3.700000 252.430274 -3.100000 -3.600000 249.265221 -3.100000 -3.500000 246.120167 -3.100000 -3.400000 242.995114 -3.100000 -3.300000 239.890061 -3.100000 -3.200000 236.805008 -3.100000 -3.100000 233.739954 -3.100000 -3.000000 230.694901 -3.100000 -2.900000 227.669848 -3.100000 -2.800000 224.664795 -3.100000 -2.700000 221.679741 -3.100000 -2.600000 218.714688 -3.100000 -2.500000 215.769635 -3.100000 -2.400000 212.844581 -3.100000 -2.300000 209.939528 -3.100000 -2.200000 207.054475 -3.100000 -2.100000 204.189422 -3.100000 -2.000000 201.344368 -3.100000 -1.900000 198.519315 -3.100000 -1.800000 195.714262 -3.100000 -1.700000 192.929209 -3.100000 -1.600000 190.164155 -3.100000 -1.500000 187.419102 -3.100000 -1.400000 184.694049 -3.100000 -1.300000 181.988995 -3.100000 -1.200000 179.303942 -3.100000 -1.100000 176.638889 -3.100000 -1.000000 173.993836 -3.100000 -0.900000 171.368782 -3.100000 -0.800000 168.763729 -3.100000 -0.700000 166.178676 -3.100000 -0.600000 163.613623 -3.100000 -0.500000 161.068569 -3.100000 -0.400000 158.543516 -3.100000 -0.300000 156.038463 -3.100000 -0.200000 153.553409 -3.100000 -0.100000 151.088356 -3.100000 -0.000000 148.643303 -3.100000 0.100000 146.218250 -3.100000 0.200000 143.813196 -3.100000 0.300000 141.428143 -3.100000 0.400000 139.063090 -3.100000 0.500000 136.718037 -3.100000 0.600000 134.392983 -3.100000 0.700000 132.087930 -3.100000 0.800000 129.802877 -3.100000 0.900000 127.537823 -3.100000 1.000000 125.292770 -3.100000 1.100000 123.067717 -3.100000 1.200000 120.862664 -3.100000 1.300000 118.677610 -3.100000 1.400000 116.512557 -3.100000 1.500000 114.367504 -3.100000 1.600000 112.242451 -3.100000 1.700000 110.137397 -3.100000 1.800000 108.052344 -3.100000 1.900000 105.987291 -3.100000 2.000000 103.942237 -3.100000 2.100000 101.917184 -3.100000 2.200000 99.912131 -3.100000 2.300000 97.927078 -3.100000 2.400000 95.962024 -3.100000 2.500000 94.016971 -3.100000 2.600000 92.091918 -3.100000 2.700000 90.186865 -3.100000 2.800000 88.301811 -3.100000 2.900000 86.436758 -3.100000 3.000000 84.591705 -3.100000 3.100000 82.766651 -3.100000 3.200000 80.961598 -3.100000 3.300000 79.176545 -3.100000 3.400000 77.411492 -3.100000 3.500000 75.666438 -3.100000 3.600000 73.941385 -3.100000 3.700000 72.236332 -3.100000 3.800000 70.551278 -3.100000 3.900000 68.886225 -3.100000 4.000000 67.241172 -3.100000 4.100000 65.616119 -3.100000 4.200000 64.011065 -3.100000 4.300000 62.426012 -3.100000 4.400000 60.860959 -3.100000 4.500000 59.315906 -3.100000 4.600000 57.790852 -3.100000 4.700000 56.285799 -3.100000 4.800000 54.800746 -3.100000 4.900000 53.335692 -3.100000 5.000000 51.890639 -3.100000 5.100000 50.465586 -3.100000 5.200000 49.060533 -3.100000 5.300000 47.675479 -3.100000 5.400000 46.310426 -3.100000 5.500000 44.965373 -3.100000 5.600000 43.640320 -3.100000 5.700000 42.335266 -3.100000 5.800000 41.050213 -3.100000 5.900000 39.785160 -3.100000 6.000000 38.540106 -3.100000 6.100000 37.315053 -3.100000 6.200000 36.110000 -3.100000 6.300000 34.924947 -3.100000 6.400000 33.759893 -3.100000 6.500000 32.614840 -3.100000 6.600000 31.489787 -3.100000 6.700000 30.384734 -3.100000 6.800000 29.299680 -3.100000 6.900000 28.234627 -3.100000 7.000000 27.189574 -3.100000 7.100000 26.164520 -3.100000 7.200000 25.159467 -3.100000 7.300000 24.174414 -3.100000 7.400000 23.209361 -3.100000 7.500000 22.264307 -3.100000 7.600000 21.339254 -3.100000 7.700000 20.434201 -3.100000 7.800000 19.549148 -3.100000 7.900000 18.684094 -3.100000 8.000000 17.839041 -3.100000 8.100000 17.013988 -3.100000 8.200000 16.208934 -3.100000 8.300000 15.423881 -3.100000 8.400000 14.658828 -3.100000 8.500000 13.913775 -3.100000 8.600000 13.188721 -3.100000 8.700000 12.483668 -3.100000 8.800000 11.798615 -3.100000 8.900000 11.133562 -3.100000 9.000000 10.488508 -3.100000 9.100000 9.863455 -3.100000 9.200000 9.258402 -3.100000 9.300000 8.673348 -3.100000 9.400000 8.108295 -3.100000 9.500000 7.563242 -3.100000 9.600000 7.038189 -3.100000 9.700000 6.533135 -3.100000 9.800000 6.048082 -3.100000 9.900000 5.583029 -3.100000 10.000000 5.137976 -3.100000 10.100000 4.712922 -3.100000 10.200000 4.307869 -3.100000 10.300000 3.922816 -3.100000 10.400000 3.557762 -3.100000 10.500000 3.212709 -3.100000 10.600000 2.887656 -3.100000 10.700000 2.582603 -3.100000 10.800000 2.297549 -3.100000 10.900000 2.032496 -3.100000 11.000000 1.787443 -3.100000 11.100000 1.562390 -3.100000 11.200000 1.357336 -3.100000 11.300000 1.172283 -3.100000 11.400000 1.007230 -3.100000 11.500000 0.862176 -3.100000 11.600000 0.737123 -3.100000 11.700000 0.632070 -3.100000 11.800000 0.547017 -3.100000 11.900000 0.481963 -3.100000 12.000000 0.436910 -3.100000 12.100000 0.411857 -3.100000 12.200000 0.406803 -3.100000 12.300000 0.421750 -3.100000 12.400000 0.456697 -3.100000 12.500000 0.511644 -3.100000 12.600000 0.586590 -3.100000 12.700000 0.681537 -3.100000 12.800000 0.796484 -3.100000 12.900000 0.931431 -3.100000 13.000000 1.086377 -3.100000 13.100000 1.261324 -3.100000 13.200000 1.456271 -3.100000 13.300000 1.671217 -3.100000 13.400000 1.906164 -3.100000 13.500000 2.161111 -3.100000 13.600000 2.436058 -3.100000 13.700000 2.731004 -3.100000 13.800000 3.045951 -3.100000 13.900000 3.380898 -3.100000 14.000000 3.735845 -3.100000 14.100000 4.110791 -3.100000 14.200000 4.505738 -3.100000 14.300000 4.920685 -3.100000 14.400000 5.355631 -3.100000 14.500000 5.810578 -3.100000 14.600000 6.285525 -3.100000 14.700000 6.780472 -3.100000 14.800000 7.295418 -3.100000 14.900000 7.830365 -3.100000 15.000000 8.385312 -3.000000 -5.000000 287.366412 -3.000000 -4.900000 283.988951 -3.000000 -4.800000 280.631489 -3.000000 -4.700000 277.294027 -3.000000 -4.600000 273.976565 -3.000000 -4.500000 270.679104 -3.000000 -4.400000 267.401642 -3.000000 -4.300000 264.144180 -3.000000 -4.200000 260.906718 -3.000000 -4.100000 257.689256 -3.000000 -4.000000 254.491795 -3.000000 -3.900000 251.314333 -3.000000 -3.800000 248.156871 -3.000000 -3.700000 245.019409 -3.000000 -3.600000 241.901948 -3.000000 -3.500000 238.804486 -3.000000 -3.400000 235.727024 -3.000000 -3.300000 232.669562 -3.000000 -3.200000 229.632101 -3.000000 -3.100000 226.614639 -3.000000 -3.000000 223.617177 -3.000000 -2.900000 220.639715 -3.000000 -2.800000 217.682253 -3.000000 -2.700000 214.744792 -3.000000 -2.600000 211.827330 -3.000000 -2.500000 208.929868 -3.000000 -2.400000 206.052406 -3.000000 -2.300000 203.194945 -3.000000 -2.200000 200.357483 -3.000000 -2.100000 197.540021 -3.000000 -2.000000 194.742559 -3.000000 -1.900000 191.965097 -3.000000 -1.800000 189.207636 -3.000000 -1.700000 186.470174 -3.000000 -1.600000 183.752712 -3.000000 -1.500000 181.055250 -3.000000 -1.400000 178.377789 -3.000000 -1.300000 175.720327 -3.000000 -1.200000 173.082865 -3.000000 -1.100000 170.465403 -3.000000 -1.000000 167.867941 -3.000000 -0.900000 165.290480 -3.000000 -0.800000 162.733018 -3.000000 -0.700000 160.195556 -3.000000 -0.600000 157.678094 -3.000000 -0.500000 155.180633 -3.000000 -0.400000 152.703171 -3.000000 -0.300000 150.245709 -3.000000 -0.200000 147.808247 -3.000000 -0.100000 145.390785 -3.000000 -0.000000 142.993324 -3.000000 0.100000 140.615862 -3.000000 0.200000 138.258400 -3.000000 0.300000 135.920938 -3.000000 0.400000 133.603477 -3.000000 0.500000 131.306015 -3.000000 0.600000 129.028553 -3.000000 0.700000 126.771091 -3.000000 0.800000 124.533630 -3.000000 0.900000 122.316168 -3.000000 1.000000 120.118706 -3.000000 1.100000 117.941244 -3.000000 1.200000 115.783782 -3.000000 1.300000 113.646321 -3.000000 1.400000 111.528859 -3.000000 1.500000 109.431397 -3.000000 1.600000 107.353935 -3.000000 1.700000 105.296474 -3.000000 1.800000 103.259012 -3.000000 1.900000 101.241550 -3.000000 2.000000 99.244088 -3.000000 2.100000 97.266626 -3.000000 2.200000 95.309165 -3.000000 2.300000 93.371703 -3.000000 2.400000 91.454241 -3.000000 2.500000 89.556779 -3.000000 2.600000 87.679318 -3.000000 2.700000 85.821856 -3.000000 2.800000 83.984394 -3.000000 2.900000 82.166932 -3.000000 3.000000 80.369470 -3.000000 3.100000 78.592009 -3.000000 3.200000 76.834547 -3.000000 3.300000 75.097085 -3.000000 3.400000 73.379623 -3.000000 3.500000 71.682162 -3.000000 3.600000 70.004700 -3.000000 3.700000 68.347238 -3.000000 3.800000 66.709776 -3.000000 3.900000 65.092314 -3.000000 4.000000 63.494853 -3.000000 4.100000 61.917391 -3.000000 4.200000 60.359929 -3.000000 4.300000 58.822467 -3.000000 4.400000 57.305006 -3.000000 4.500000 55.807544 -3.000000 4.600000 54.330082 -3.000000 4.700000 52.872620 -3.000000 4.800000 51.435159 -3.000000 4.900000 50.017697 -3.000000 5.000000 48.620235 -3.000000 5.100000 47.242773 -3.000000 5.200000 45.885311 -3.000000 5.300000 44.547850 -3.000000 5.400000 43.230388 -3.000000 5.500000 41.932926 -3.000000 5.600000 40.655464 -3.000000 5.700000 39.398003 -3.000000 5.800000 38.160541 -3.000000 5.900000 36.943079 -3.000000 6.000000 35.745617 -3.000000 6.100000 34.568155 -3.000000 6.200000 33.410694 -3.000000 6.300000 32.273232 -3.000000 6.400000 31.155770 -3.000000 6.500000 30.058308 -3.000000 6.600000 28.980847 -3.000000 6.700000 27.923385 -3.000000 6.800000 26.885923 -3.000000 6.900000 25.868461 -3.000000 7.000000 24.870999 -3.000000 7.100000 23.893538 -3.000000 7.200000 22.936076 -3.000000 7.300000 21.998614 -3.000000 7.400000 21.081152 -3.000000 7.500000 20.183691 -3.000000 7.600000 19.306229 -3.000000 7.700000 18.448767 -3.000000 7.800000 17.611305 -3.000000 7.900000 16.793843 -3.000000 8.000000 15.996382 -3.000000 8.100000 15.218920 -3.000000 8.200000 14.461458 -3.000000 8.300000 13.723996 -3.000000 8.400000 13.006535 -3.000000 8.500000 12.309073 -3.000000 8.600000 11.631611 -3.000000 8.700000 10.974149 -3.000000 8.800000 10.336688 -3.000000 8.900000 9.719226 -3.000000 9.000000 9.121764 -3.000000 9.100000 8.544302 -3.000000 9.200000 7.986840 -3.000000 9.300000 7.449379 -3.000000 9.400000 6.931917 -3.000000 9.500000 6.434455 -3.000000 9.600000 5.956993 -3.000000 9.700000 5.499532 -3.000000 9.800000 5.062070 -3.000000 9.900000 4.644608 -3.000000 10.000000 4.247146 -3.000000 10.100000 3.869684 -3.000000 10.200000 3.512223 -3.000000 10.300000 3.174761 -3.000000 10.400000 2.857299 -3.000000 10.500000 2.559837 -3.000000 10.600000 2.282376 -3.000000 10.700000 2.024914 -3.000000 10.800000 1.787452 -3.000000 10.900000 1.569990 -3.000000 11.000000 1.372528 -3.000000 11.100000 1.195067 -3.000000 11.200000 1.037605 -3.000000 11.300000 0.900143 -3.000000 11.400000 0.782681 -3.000000 11.500000 0.685220 -3.000000 11.600000 0.607758 -3.000000 11.700000 0.550296 -3.000000 11.800000 0.512834 -3.000000 11.900000 0.495372 -3.000000 12.000000 0.497911 -3.000000 12.100000 0.520449 -3.000000 12.200000 0.562987 -3.000000 12.300000 0.625525 -3.000000 12.400000 0.708064 -3.000000 12.500000 0.810602 -3.000000 12.600000 0.933140 -3.000000 12.700000 1.075678 -3.000000 12.800000 1.238217 -3.000000 12.900000 1.420755 -3.000000 13.000000 1.623293 -3.000000 13.100000 1.845831 -3.000000 13.200000 2.088369 -3.000000 13.300000 2.350908 -3.000000 13.400000 2.633446 -3.000000 13.500000 2.935984 -3.000000 13.600000 3.258522 -3.000000 13.700000 3.601061 -3.000000 13.800000 3.963599 -3.000000 13.900000 4.346137 -3.000000 14.000000 4.748675 -3.000000 14.100000 5.171213 -3.000000 14.200000 5.613752 -3.000000 14.300000 6.076290 -3.000000 14.400000 6.558828 -3.000000 14.500000 7.061366 -3.000000 14.600000 7.583905 -3.000000 14.700000 8.126443 -3.000000 14.800000 8.688981 -3.000000 14.900000 9.271519 -3.000000 15.000000 9.874057 -2.900000 -5.000000 279.631385 -2.900000 -4.900000 276.300998 -2.900000 -4.800000 272.990611 -2.900000 -4.700000 269.700224 -2.900000 -4.600000 266.429837 -2.900000 -4.500000 263.179450 -2.900000 -4.400000 259.949063 -2.900000 -4.300000 256.738676 -2.900000 -4.200000 253.548289 -2.900000 -4.100000 250.377902 -2.900000 -4.000000 247.227515 -2.900000 -3.900000 244.097128 -2.900000 -3.800000 240.986741 -2.900000 -3.700000 237.896354 -2.900000 -3.600000 234.825967 -2.900000 -3.500000 231.775580 -2.900000 -3.400000 228.745193 -2.900000 -3.300000 225.734806 -2.900000 -3.200000 222.744419 -2.900000 -3.100000 219.774032 -2.900000 -3.000000 216.823645 -2.900000 -2.900000 213.893258 -2.900000 -2.800000 210.982871 -2.900000 -2.700000 208.092484 -2.900000 -2.600000 205.222097 -2.900000 -2.500000 202.371710 -2.900000 -2.400000 199.541323 -2.900000 -2.300000 196.730936 -2.900000 -2.200000 193.940549 -2.900000 -2.100000 191.170162 -2.900000 -2.000000 188.419775 -2.900000 -1.900000 185.689388 -2.900000 -1.800000 182.979001 -2.900000 -1.700000 180.288614 -2.900000 -1.600000 177.618227 -2.900000 -1.500000 174.967840 -2.900000 -1.400000 172.337453 -2.900000 -1.300000 169.727066 -2.900000 -1.200000 167.136679 -2.900000 -1.100000 164.566292 -2.900000 -1.000000 162.015905 -2.900000 -0.900000 159.485518 -2.900000 -0.800000 156.975131 -2.900000 -0.700000 154.484744 -2.900000 -0.600000 152.014357 -2.900000 -0.500000 149.563970 -2.900000 -0.400000 147.133583 -2.900000 -0.300000 144.723196 -2.900000 -0.200000 142.332809 -2.900000 -0.100000 139.962422 -2.900000 -0.000000 137.612035 -2.900000 0.100000 135.281648 -2.900000 0.200000 132.971261 -2.900000 0.300000 130.680874 -2.900000 0.400000 128.410487 -2.900000 0.500000 126.160100 -2.900000 0.600000 123.929713 -2.900000 0.700000 121.719326 -2.900000 0.800000 119.528939 -2.900000 0.900000 117.358552 -2.900000 1.000000 115.208165 -2.900000 1.100000 113.077778 -2.900000 1.200000 110.967391 -2.900000 1.300000 108.877004 -2.900000 1.400000 106.806617 -2.900000 1.500000 104.756230 -2.900000 1.600000 102.725843 -2.900000 1.700000 100.715456 -2.900000 1.800000 98.725068 -2.900000 1.900000 96.754681 -2.900000 2.000000 94.804294 -2.900000 2.100000 92.873907 -2.900000 2.200000 90.963520 -2.900000 2.300000 89.073133 -2.900000 2.400000 87.202746 -2.900000 2.500000 85.352359 -2.900000 2.600000 83.521972 -2.900000 2.700000 81.711585 -2.900000 2.800000 79.921198 -2.900000 2.900000 78.150811 -2.900000 3.000000 76.400424 -2.900000 3.100000 74.670037 -2.900000 3.200000 72.959650 -2.900000 3.300000 71.269263 -2.900000 3.400000 69.598876 -2.900000 3.500000 67.948489 -2.900000 3.600000 66.318102 -2.900000 3.700000 64.707715 -2.900000 3.800000 63.117328 -2.900000 3.900000 61.546941 -2.900000 4.000000 59.996554 -2.900000 4.100000 58.466167 -2.900000 4.200000 56.955780 -2.900000 4.300000 55.465393 -2.900000 4.400000 53.995006 -2.900000 4.500000 52.544619 -2.900000 4.600000 51.114232 -2.900000 4.700000 49.703845 -2.900000 4.800000 48.313458 -2.900000 4.900000 46.943071 -2.900000 5.000000 45.592684 -2.900000 5.100000 44.262297 -2.900000 5.200000 42.951910 -2.900000 5.300000 41.661523 -2.900000 5.400000 40.391136 -2.900000 5.500000 39.140749 -2.900000 5.600000 37.910362 -2.900000 5.700000 36.699975 -2.900000 5.800000 35.509588 -2.900000 5.900000 34.339201 -2.900000 6.000000 33.188814 -2.900000 6.100000 32.058427 -2.900000 6.200000 30.948040 -2.900000 6.300000 29.857653 -2.900000 6.400000 28.787266 -2.900000 6.500000 27.736879 -2.900000 6.600000 26.706492 -2.900000 6.700000 25.696105 -2.900000 6.800000 24.705718 -2.900000 6.900000 23.735331 -2.900000 7.000000 22.784944 -2.900000 7.100000 21.854557 -2.900000 7.200000 20.944170 -2.900000 7.300000 20.053783 -2.900000 7.400000 19.183396 -2.900000 7.500000 18.333009 -2.900000 7.600000 17.502622 -2.900000 7.700000 16.692235 -2.900000 7.800000 15.901848 -2.900000 7.900000 15.131461 -2.900000 8.000000 14.381074 -2.900000 8.100000 13.650687 -2.900000 8.200000 12.940300 -2.900000 8.300000 12.249913 -2.900000 8.400000 11.579526 -2.900000 8.500000 10.929139 -2.900000 8.600000 10.298752 -2.900000 8.700000 9.688365 -2.900000 8.800000 9.097977 -2.900000 8.900000 8.527590 -2.900000 9.000000 7.977203 -2.900000 9.100000 7.446816 -2.900000 9.200000 6.936429 -2.900000 9.300000 6.446042 -2.900000 9.400000 5.975655 -2.900000 9.500000 5.525268 -2.900000 9.600000 5.094881 -2.900000 9.700000 4.684494 -2.900000 9.800000 4.294107 -2.900000 9.900000 3.923720 -2.900000 10.000000 3.573333 -2.900000 10.100000 3.242946 -2.900000 10.200000 2.932559 -2.900000 10.300000 2.642172 -2.900000 10.400000 2.371785 -2.900000 10.500000 2.121398 -2.900000 10.600000 1.891011 -2.900000 10.700000 1.680624 -2.900000 10.800000 1.490237 -2.900000 10.900000 1.319850 -2.900000 11.000000 1.169463 -2.900000 11.100000 1.039076 -2.900000 11.200000 0.928689 -2.900000 11.300000 0.838302 -2.900000 11.400000 0.767915 -2.900000 11.500000 0.717528 -2.900000 11.600000 0.687141 -2.900000 11.700000 0.676754 -2.900000 11.800000 0.686367 -2.900000 11.900000 0.715980 -2.900000 12.000000 0.765593 -2.900000 12.100000 0.835206 -2.900000 12.200000 0.924819 -2.900000 12.300000 1.034432 -2.900000 12.400000 1.164045 -2.900000 12.500000 1.313658 -2.900000 12.600000 1.483271 -2.900000 12.700000 1.672884 -2.900000 12.800000 1.882497 -2.900000 12.900000 2.112110 -2.900000 13.000000 2.361723 -2.900000 13.100000 2.631336 -2.900000 13.200000 2.920949 -2.900000 13.300000 3.230562 -2.900000 13.400000 3.560175 -2.900000 13.500000 3.909788 -2.900000 13.600000 4.279401 -2.900000 13.700000 4.669014 -2.900000 13.800000 5.078627 -2.900000 13.900000 5.508240 -2.900000 14.000000 5.957853 -2.900000 14.100000 6.427466 -2.900000 14.200000 6.917079 -2.900000 14.300000 7.426692 -2.900000 14.400000 7.956305 -2.900000 14.500000 8.505918 -2.900000 14.600000 9.075531 -2.900000 14.700000 9.665144 -2.900000 14.800000 10.274757 -2.900000 14.900000 10.904370 -2.900000 15.000000 11.553983 -2.800000 -5.000000 272.185411 -2.800000 -4.900000 268.901582 -2.800000 -4.800000 265.637753 -2.800000 -4.700000 262.393924 -2.800000 -4.600000 259.170095 -2.800000 -4.500000 255.966266 -2.800000 -4.400000 252.782437 -2.800000 -4.300000 249.618608 -2.800000 -4.200000 246.474779 -2.800000 -4.100000 243.350950 -2.800000 -4.000000 240.247121 -2.800000 -3.900000 237.163292 -2.800000 -3.800000 234.099463 -2.800000 -3.700000 231.055634 -2.800000 -3.600000 228.031805 -2.800000 -3.500000 225.027976 -2.800000 -3.400000 222.044147 -2.800000 -3.300000 219.080318 -2.800000 -3.200000 216.136489 -2.800000 -3.100000 213.212660 -2.800000 -3.000000 210.308831 -2.800000 -2.900000 207.425002 -2.800000 -2.800000 204.561173 -2.800000 -2.700000 201.717344 -2.800000 -2.600000 198.893515 -2.800000 -2.500000 196.089686 -2.800000 -2.400000 193.305857 -2.800000 -2.300000 190.542028 -2.800000 -2.200000 187.798199 -2.800000 -2.100000 185.074370 -2.800000 -2.000000 182.370541 -2.800000 -1.900000 179.686712 -2.800000 -1.800000 177.022883 -2.800000 -1.700000 174.379054 -2.800000 -1.600000 171.755225 -2.800000 -1.500000 169.151396 -2.800000 -1.400000 166.567567 -2.800000 -1.300000 164.003738 -2.800000 -1.200000 161.459909 -2.800000 -1.100000 158.936080 -2.800000 -1.000000 156.432251 -2.800000 -0.900000 153.948422 -2.800000 -0.800000 151.484593 -2.800000 -0.700000 149.040764 -2.800000 -0.600000 146.616935 -2.800000 -0.500000 144.213106 -2.800000 -0.400000 141.829277 -2.800000 -0.300000 139.465448 -2.800000 -0.200000 137.121619 -2.800000 -0.100000 134.797790 -2.800000 -0.000000 132.493961 -2.800000 0.100000 130.210132 -2.800000 0.200000 127.946303 -2.800000 0.300000 125.702474 -2.800000 0.400000 123.478645 -2.800000 0.500000 121.274816 -2.800000 0.600000 119.090987 -2.800000 0.700000 116.927158 -2.800000 0.800000 114.783329 -2.800000 0.900000 112.659500 -2.800000 1.000000 110.555671 -2.800000 1.100000 108.471842 -2.800000 1.200000 106.408013 -2.800000 1.300000 104.364184 -2.800000 1.400000 102.340355 -2.800000 1.500000 100.336526 -2.800000 1.600000 98.352697 -2.800000 1.700000 96.388868 -2.800000 1.800000 94.445039 -2.800000 1.900000 92.521210 -2.800000 2.000000 90.617381 -2.800000 2.100000 88.733552 -2.800000 2.200000 86.869723 -2.800000 2.300000 85.025894 -2.800000 2.400000 83.202065 -2.800000 2.500000 81.398236 -2.800000 2.600000 79.614407 -2.800000 2.700000 77.850578 -2.800000 2.800000 76.106749 -2.800000 2.900000 74.382920 -2.800000 3.000000 72.679091 -2.800000 3.100000 70.995262 -2.800000 3.200000 69.331433 -2.800000 3.300000 67.687604 -2.800000 3.400000 66.063775 -2.800000 3.500000 64.459946 -2.800000 3.600000 62.876117 -2.800000 3.700000 61.312288 -2.800000 3.800000 59.768459 -2.800000 3.900000 58.244630 -2.800000 4.000000 56.740801 -2.800000 4.100000 55.256972 -2.800000 4.200000 53.793143 -2.800000 4.300000 52.349314 -2.800000 4.400000 50.925485 -2.800000 4.500000 49.521656 -2.800000 4.600000 48.137827 -2.800000 4.700000 46.773998 -2.800000 4.800000 45.430169 -2.800000 4.900000 44.106340 -2.800000 5.000000 42.802511 -2.800000 5.100000 41.518682 -2.800000 5.200000 40.254853 -2.800000 5.300000 39.011024 -2.800000 5.400000 37.787195 -2.800000 5.500000 36.583366 -2.800000 5.600000 35.399537 -2.800000 5.700000 34.235709 -2.800000 5.800000 33.091880 -2.800000 5.900000 31.968051 -2.800000 6.000000 30.864222 -2.800000 6.100000 29.780393 -2.800000 6.200000 28.716564 -2.800000 6.300000 27.672735 -2.800000 6.400000 26.648906 -2.800000 6.500000 25.645077 -2.800000 6.600000 24.661248 -2.800000 6.700000 23.697419 -2.800000 6.800000 22.753590 -2.800000 6.900000 21.829761 -2.800000 7.000000 20.925932 -2.800000 7.100000 20.042103 -2.800000 7.200000 19.178274 -2.800000 7.300000 18.334445 -2.800000 7.400000 17.510616 -2.800000 7.500000 16.706787 -2.800000 7.600000 15.922958 -2.800000 7.700000 15.159129 -2.800000 7.800000 14.415300 -2.800000 7.900000 13.691471 -2.800000 8.000000 12.987642 -2.800000 8.100000 12.303813 -2.800000 8.200000 11.639984 -2.800000 8.300000 10.996155 -2.800000 8.400000 10.372326 -2.800000 8.500000 9.768497 -2.800000 8.600000 9.184668 -2.800000 8.700000 8.620839 -2.800000 8.800000 8.077010 -2.800000 8.900000 7.553181 -2.800000 9.000000 7.049352 -2.800000 9.100000 6.565523 -2.800000 9.200000 6.101694 -2.800000 9.300000 5.657865 -2.800000 9.400000 5.234036 -2.800000 9.500000 4.830207 -2.800000 9.600000 4.446378 -2.800000 9.700000 4.082549 -2.800000 9.800000 3.738720 -2.800000 9.900000 3.414891 -2.800000 10.000000 3.111062 -2.800000 10.100000 2.827233 -2.800000 10.200000 2.563404 -2.800000 10.300000 2.319575 -2.800000 10.400000 2.095746 -2.800000 10.500000 1.891917 -2.800000 10.600000 1.708088 -2.800000 10.700000 1.544259 -2.800000 10.800000 1.400430 -2.800000 10.900000 1.276601 -2.800000 11.000000 1.172772 -2.800000 11.100000 1.088943 -2.800000 11.200000 1.025114 -2.800000 11.300000 0.981285 -2.800000 11.400000 0.957456 -2.800000 11.500000 0.953627 -2.800000 11.600000 0.969798 -2.800000 11.700000 1.005969 -2.800000 11.800000 1.062140 -2.800000 11.900000 1.138311 -2.800000 12.000000 1.234482 -2.800000 12.100000 1.350653 -2.800000 12.200000 1.486824 -2.800000 12.300000 1.642995 -2.800000 12.400000 1.819166 -2.800000 12.500000 2.015337 -2.800000 12.600000 2.231508 -2.800000 12.700000 2.467679 -2.800000 12.800000 2.723850 -2.800000 12.900000 3.000021 -2.800000 13.000000 3.296192 -2.800000 13.100000 3.612363 -2.800000 13.200000 3.948534 -2.800000 13.300000 4.304705 -2.800000 13.400000 4.680876 -2.800000 13.500000 5.077047 -2.800000 13.600000 5.493218 -2.800000 13.700000 5.929389 -2.800000 13.800000 6.385560 -2.800000 13.900000 6.861731 -2.800000 14.000000 7.357902 -2.800000 14.100000 7.874073 -2.800000 14.200000 8.410244 -2.800000 14.300000 8.966415 -2.800000 14.400000 9.542586 -2.800000 14.500000 10.138757 -2.800000 14.600000 10.754928 -2.800000 14.700000 11.391099 -2.800000 14.800000 12.047270 -2.800000 14.900000 12.723441 -2.800000 15.000000 13.419612 -2.700000 -5.000000 265.022122 -2.700000 -4.900000 261.784334 -2.700000 -4.800000 258.566547 -2.700000 -4.700000 255.368759 -2.700000 -4.600000 252.190971 -2.700000 -4.500000 249.033184 -2.700000 -4.400000 245.895396 -2.700000 -4.300000 242.777608 -2.700000 -4.200000 239.679821 -2.700000 -4.100000 236.602033 -2.700000 -4.000000 233.544245 -2.700000 -3.900000 230.506457 -2.700000 -3.800000 227.488670 -2.700000 -3.700000 224.490882 -2.700000 -3.600000 221.513094 -2.700000 -3.500000 218.555307 -2.700000 -3.400000 215.617519 -2.700000 -3.300000 212.699731 -2.700000 -3.200000 209.801943 -2.700000 -3.100000 206.924156 -2.700000 -3.000000 204.066368 -2.700000 -2.900000 201.228580 -2.700000 -2.800000 198.410793 -2.700000 -2.700000 195.613005 -2.700000 -2.600000 192.835217 -2.700000 -2.500000 190.077430 -2.700000 -2.400000 187.339642 -2.700000 -2.300000 184.621854 -2.700000 -2.200000 181.924066 -2.700000 -2.100000 179.246279 -2.700000 -2.000000 176.588491 -2.700000 -1.900000 173.950703 -2.700000 -1.800000 171.332916 -2.700000 -1.700000 168.735128 -2.700000 -1.600000 166.157340 -2.700000 -1.500000 163.599552 -2.700000 -1.400000 161.061765 -2.700000 -1.300000 158.543977 -2.700000 -1.200000 156.046189 -2.700000 -1.100000 153.568402 -2.700000 -1.000000 151.110614 -2.700000 -0.900000 148.672826 -2.700000 -0.800000 146.255039 -2.700000 -0.700000 143.857251 -2.700000 -0.600000 141.479463 -2.700000 -0.500000 139.121675 -2.700000 -0.400000 136.783888 -2.700000 -0.300000 134.466100 -2.700000 -0.200000 132.168312 -2.700000 -0.100000 129.890525 -2.700000 -0.000000 127.632737 -2.700000 0.100000 125.394949 -2.700000 0.200000 123.177161 -2.700000 0.300000 120.979374 -2.700000 0.400000 118.801586 -2.700000 0.500000 116.643798 -2.700000 0.600000 114.506011 -2.700000 0.700000 112.388223 -2.700000 0.800000 110.290435 -2.700000 0.900000 108.212647 -2.700000 1.000000 106.154860 -2.700000 1.100000 104.117072 -2.700000 1.200000 102.099284 -2.700000 1.300000 100.101497 -2.700000 1.400000 98.123709 -2.700000 1.500000 96.165921 -2.700000 1.600000 94.228134 -2.700000 1.700000 92.310346 -2.700000 1.800000 90.412558 -2.700000 1.900000 88.534770 -2.700000 2.000000 86.676983 -2.700000 2.100000 84.839195 -2.700000 2.200000 83.021407 -2.700000 2.300000 81.223620 -2.700000 2.400000 79.445832 -2.700000 2.500000 77.688044 -2.700000 2.600000 75.950256 -2.700000 2.700000 74.232469 -2.700000 2.800000 72.534681 -2.700000 2.900000 70.856893 -2.700000 3.000000 69.199106 -2.700000 3.100000 67.561318 -2.700000 3.200000 65.943530 -2.700000 3.300000 64.345743 -2.700000 3.400000 62.767955 -2.700000 3.500000 61.210167 -2.700000 3.600000 59.672379 -2.700000 3.700000 58.154592 -2.700000 3.800000 56.656804 -2.700000 3.900000 55.179016 -2.700000 4.000000 53.721229 -2.700000 4.100000 52.283441 -2.700000 4.200000 50.865653 -2.700000 4.300000 49.467865 -2.700000 4.400000 48.090078 -2.700000 4.500000 46.732290 -2.700000 4.600000 45.394502 -2.700000 4.700000 44.076715 -2.700000 4.800000 42.778927 -2.700000 4.900000 41.501139 -2.700000 5.000000 40.243352 -2.700000 5.100000 39.005564 -2.700000 5.200000 37.787776 -2.700000 5.300000 36.589988 -2.700000 5.400000 35.412201 -2.700000 5.500000 34.254413 -2.700000 5.600000 33.116625 -2.700000 5.700000 31.998838 -2.700000 5.800000 30.901050 -2.700000 5.900000 29.823262 -2.700000 6.000000 28.765474 -2.700000 6.100000 27.727687 -2.700000 6.200000 26.709899 -2.700000 6.300000 25.712111 -2.700000 6.400000 24.734324 -2.700000 6.500000 23.776536 -2.700000 6.600000 22.838748 -2.700000 6.700000 21.920960 -2.700000 6.800000 21.023173 -2.700000 6.900000 20.145385 -2.700000 7.000000 19.287597 -2.700000 7.100000 18.449810 -2.700000 7.200000 17.632022 -2.700000 7.300000 16.834234 -2.700000 7.400000 16.056447 -2.700000 7.500000 15.298659 -2.700000 7.600000 14.560871 -2.700000 7.700000 13.843083 -2.700000 7.800000 13.145296 -2.700000 7.900000 12.467508 -2.700000 8.000000 11.809720 -2.700000 8.100000 11.171933 -2.700000 8.200000 10.554145 -2.700000 8.300000 9.956357 -2.700000 8.400000 9.378569 -2.700000 8.500000 8.820782 -2.700000 8.600000 8.282994 -2.700000 8.700000 7.765206 -2.700000 8.800000 7.267419 -2.700000 8.900000 6.789631 -2.700000 9.000000 6.331843 -2.700000 9.100000 5.894056 -2.700000 9.200000 5.476268 -2.700000 9.300000 5.078480 -2.700000 9.400000 4.700692 -2.700000 9.500000 4.342905 -2.700000 9.600000 4.005117 -2.700000 9.700000 3.687329 -2.700000 9.800000 3.389542 -2.700000 9.900000 3.111754 -2.700000 10.000000 2.853966 -2.700000 10.100000 2.616178 -2.700000 10.200000 2.398391 -2.700000 10.300000 2.200603 -2.700000 10.400000 2.022815 -2.700000 10.500000 1.865028 -2.700000 10.600000 1.727240 -2.700000 10.700000 1.609452 -2.700000 10.800000 1.511664 -2.700000 10.900000 1.433877 -2.700000 11.000000 1.376089 -2.700000 11.100000 1.338301 -2.700000 11.200000 1.320514 -2.700000 11.300000 1.322726 -2.700000 11.400000 1.344938 -2.700000 11.500000 1.387151 -2.700000 11.600000 1.449363 -2.700000 11.700000 1.531575 -2.700000 11.800000 1.633787 -2.700000 11.900000 1.756000 -2.700000 12.000000 1.898212 -2.700000 12.100000 2.060424 -2.700000 12.200000 2.242637 -2.700000 12.300000 2.444849 -2.700000 12.400000 2.667061 -2.700000 12.500000 2.909273 -2.700000 12.600000 3.171486 -2.700000 12.700000 3.453698 -2.700000 12.800000 3.755910 -2.700000 12.900000 4.078123 -2.700000 13.000000 4.420335 -2.700000 13.100000 4.782547 -2.700000 13.200000 5.164760 -2.700000 13.300000 5.566972 -2.700000 13.400000 5.989184 -2.700000 13.500000 6.431396 -2.700000 13.600000 6.893609 -2.700000 13.700000 7.375821 -2.700000 13.800000 7.878033 -2.700000 13.900000 8.400246 -2.700000 14.000000 8.942458 -2.700000 14.100000 9.504670 -2.700000 14.200000 10.086882 -2.700000 14.300000 10.689095 -2.700000 14.400000 11.311307 -2.700000 14.500000 11.953519 -2.700000 14.600000 12.615732 -2.700000 14.700000 13.297944 -2.700000 14.800000 14.000156 -2.700000 14.900000 14.722369 -2.700000 15.000000 15.464581 -2.600000 -5.000000 258.134291 -2.600000 -4.900000 254.942028 -2.600000 -4.800000 251.769765 -2.600000 -4.700000 248.617502 -2.600000 -4.600000 245.485239 -2.600000 -4.500000 242.372976 -2.600000 -4.400000 239.280712 -2.600000 -4.300000 236.208449 -2.600000 -4.200000 233.156186 -2.600000 -4.100000 230.123923 -2.600000 -4.000000 227.111660 -2.600000 -3.900000 224.119397 -2.600000 -3.800000 221.147133 -2.600000 -3.700000 218.194870 -2.600000 -3.600000 215.262607 -2.600000 -3.500000 212.350344 -2.600000 -3.400000 209.458081 -2.600000 -3.300000 206.585818 -2.600000 -3.200000 203.733554 -2.600000 -3.100000 200.901291 -2.600000 -3.000000 198.089028 -2.600000 -2.900000 195.296765 -2.600000 -2.800000 192.524502 -2.600000 -2.700000 189.772239 -2.600000 -2.600000 187.039976 -2.600000 -2.500000 184.327712 -2.600000 -2.400000 181.635449 -2.600000 -2.300000 178.963186 -2.600000 -2.200000 176.310923 -2.600000 -2.100000 173.678660 -2.600000 -2.000000 171.066397 -2.600000 -1.900000 168.474133 -2.600000 -1.800000 165.901870 -2.600000 -1.700000 163.349607 -2.600000 -1.600000 160.817344 -2.600000 -1.500000 158.305081 -2.600000 -1.400000 155.812818 -2.600000 -1.300000 153.340554 -2.600000 -1.200000 150.888291 -2.600000 -1.100000 148.456028 -2.600000 -1.000000 146.043765 -2.600000 -0.900000 143.651502 -2.600000 -0.800000 141.279239 -2.600000 -0.700000 138.926975 -2.600000 -0.600000 136.594712 -2.600000 -0.500000 134.282449 -2.600000 -0.400000 131.990186 -2.600000 -0.300000 129.717923 -2.600000 -0.200000 127.465660 -2.600000 -0.100000 125.233397 -2.600000 -0.000000 123.021133 -2.600000 0.100000 120.828870 -2.600000 0.200000 118.656607 -2.600000 0.300000 116.504344 -2.600000 0.400000 114.372081 -2.600000 0.500000 112.259818 -2.600000 0.600000 110.167554 -2.600000 0.700000 108.095291 -2.600000 0.800000 106.043028 -2.600000 0.900000 104.010765 -2.600000 1.000000 101.998502 -2.600000 1.100000 100.006239 -2.600000 1.200000 98.033975 -2.600000 1.300000 96.081712 -2.600000 1.400000 94.149449 -2.600000 1.500000 92.237186 -2.600000 1.600000 90.344923 -2.600000 1.700000 88.472660 -2.600000 1.800000 86.620396 -2.600000 1.900000 84.788133 -2.600000 2.000000 82.975870 -2.600000 2.100000 81.183607 -2.600000 2.200000 79.411344 -2.600000 2.300000 77.659081 -2.600000 2.400000 75.926818 -2.600000 2.500000 74.214554 -2.600000 2.600000 72.522291 -2.600000 2.700000 70.850028 -2.600000 2.800000 69.197765 -2.600000 2.900000 67.565502 -2.600000 3.000000 65.953239 -2.600000 3.100000 64.360975 -2.600000 3.200000 62.788712 -2.600000 3.300000 61.236449 -2.600000 3.400000 59.704186 -2.600000 3.500000 58.191923 -2.600000 3.600000 56.699660 -2.600000 3.700000 55.227396 -2.600000 3.800000 53.775133 -2.600000 3.900000 52.342870 -2.600000 4.000000 50.930607 -2.600000 4.100000 49.538344 -2.600000 4.200000 48.166081 -2.600000 4.300000 46.813817 -2.600000 4.400000 45.481554 -2.600000 4.500000 44.169291 -2.600000 4.600000 42.877028 -2.600000 4.700000 41.604765 -2.600000 4.800000 40.352502 -2.600000 4.900000 39.120239 -2.600000 5.000000 37.907975 -2.600000 5.100000 36.715712 -2.600000 5.200000 35.543449 -2.600000 5.300000 34.391186 -2.600000 5.400000 33.258923 -2.600000 5.500000 32.146660 -2.600000 5.600000 31.054396 -2.600000 5.700000 29.982133 -2.600000 5.800000 28.929870 -2.600000 5.900000 27.897607 -2.600000 6.000000 26.885344 -2.600000 6.100000 25.893081 -2.600000 6.200000 24.920817 -2.600000 6.300000 23.968554 -2.600000 6.400000 23.036291 -2.600000 6.500000 22.124028 -2.600000 6.600000 21.231765 -2.600000 6.700000 20.359502 -2.600000 6.800000 19.507238 -2.600000 6.900000 18.674975 -2.600000 7.000000 17.862712 -2.600000 7.100000 17.070449 -2.600000 7.200000 16.298186 -2.600000 7.300000 15.545923 -2.600000 7.400000 14.813659 -2.600000 7.500000 14.101396 -2.600000 7.600000 13.409133 -2.600000 7.700000 12.736870 -2.600000 7.800000 12.084607 -2.600000 7.900000 11.452344 -2.600000 8.000000 10.840081 -2.600000 8.100000 10.247817 -2.600000 8.200000 9.675554 -2.600000 8.300000 9.123291 -2.600000 8.400000 8.591028 -2.600000 8.500000 8.078765 -2.600000 8.600000 7.586502 -2.600000 8.700000 7.114238 -2.600000 8.800000 6.661975 -2.600000 8.900000 6.229712 -2.600000 9.000000 5.817449 -2.600000 9.100000 5.425186 -2.600000 9.200000 5.052923 -2.600000 9.300000 4.700659 -2.600000 9.400000 4.368396 -2.600000 9.500000 4.056133 -2.600000 9.600000 3.763870 -2.600000 9.700000 3.491607 -2.600000 9.800000 3.239344 -2.600000 9.900000 3.007080 -2.600000 10.000000 2.794817 -2.600000 10.100000 2.602554 -2.600000 10.200000 2.430291 -2.600000 10.300000 2.278028 -2.600000 10.400000 2.145765 -2.600000 10.500000 2.033502 -2.600000 10.600000 1.941238 -2.600000 10.700000 1.868975 -2.600000 10.800000 1.816712 -2.600000 10.900000 1.784449 -2.600000 11.000000 1.772186 -2.600000 11.100000 1.779923 -2.600000 11.200000 1.807659 -2.600000 11.300000 1.855396 -2.600000 11.400000 1.923133 -2.600000 11.500000 2.010870 -2.600000 11.600000 2.118607 -2.600000 11.700000 2.246344 -2.600000 11.800000 2.394080 -2.600000 11.900000 2.561817 -2.600000 12.000000 2.749554 -2.600000 12.100000 2.957291 -2.600000 12.200000 3.185028 -2.600000 12.300000 3.432765 -2.600000 12.400000 3.700501 -2.600000 12.500000 3.988238 -2.600000 12.600000 4.295975 -2.600000 12.700000 4.623712 -2.600000 12.800000 4.971449 -2.600000 12.900000 5.339186 -2.600000 13.000000 5.726923 -2.600000 13.100000 6.134659 -2.600000 13.200000 6.562396 -2.600000 13.300000 7.010133 -2.600000 13.400000 7.477870 -2.600000 13.500000 7.965607 -2.600000 13.600000 8.473344 -2.600000 13.700000 9.001080 -2.600000 13.800000 9.548817 -2.600000 13.900000 10.116554 -2.600000 14.000000 10.704291 -2.600000 14.100000 11.312028 -2.600000 14.200000 11.939765 -2.600000 14.300000 12.587501 -2.600000 14.400000 13.255238 -2.600000 14.500000 13.942975 -2.600000 14.600000 14.650712 -2.600000 14.700000 15.378449 -2.600000 14.800000 16.126186 -2.600000 14.900000 16.893922 -2.600000 15.000000 17.681659 -2.500000 -5.000000 251.513863 -2.500000 -4.900000 248.366607 -2.500000 -4.800000 245.239352 -2.500000 -4.700000 242.132097 -2.500000 -4.600000 239.044841 -2.500000 -4.500000 235.977586 -2.500000 -4.400000 232.930331 -2.500000 -4.300000 229.903075 -2.500000 -4.200000 226.895820 -2.500000 -4.100000 223.908565 -2.500000 -4.000000 220.941309 -2.500000 -3.900000 217.994054 -2.500000 -3.800000 215.066798 -2.500000 -3.700000 212.159543 -2.500000 -3.600000 209.272288 -2.500000 -3.500000 206.405032 -2.500000 -3.400000 203.557777 -2.500000 -3.300000 200.730522 -2.500000 -3.200000 197.923266 -2.500000 -3.100000 195.136011 -2.500000 -3.000000 192.368756 -2.500000 -2.900000 189.621500 -2.500000 -2.800000 186.894245 -2.500000 -2.700000 184.186990 -2.500000 -2.600000 181.499734 -2.500000 -2.500000 178.832479 -2.500000 -2.400000 176.185224 -2.500000 -2.300000 173.557968 -2.500000 -2.200000 170.950713 -2.500000 -2.100000 168.363457 -2.500000 -2.000000 165.796202 -2.500000 -1.900000 163.248947 -2.500000 -1.800000 160.721691 -2.500000 -1.700000 158.214436 -2.500000 -1.600000 155.727181 -2.500000 -1.500000 153.259925 -2.500000 -1.400000 150.812670 -2.500000 -1.300000 148.385415 -2.500000 -1.200000 145.978159 -2.500000 -1.100000 143.590904 -2.500000 -1.000000 141.223649 -2.500000 -0.900000 138.876393 -2.500000 -0.800000 136.549138 -2.500000 -0.700000 134.241883 -2.500000 -0.600000 131.954627 -2.500000 -0.500000 129.687372 -2.500000 -0.400000 127.440116 -2.500000 -0.300000 125.212861 -2.500000 -0.200000 123.005606 -2.500000 -0.100000 120.818350 -2.500000 -0.000000 118.651095 -2.500000 0.100000 116.503840 -2.500000 0.200000 114.376584 -2.500000 0.300000 112.269329 -2.500000 0.400000 110.182074 -2.500000 0.500000 108.114818 -2.500000 0.600000 106.067563 -2.500000 0.700000 104.040308 -2.500000 0.800000 102.033052 -2.500000 0.900000 100.045797 -2.500000 1.000000 98.078542 -2.500000 1.100000 96.131286 -2.500000 1.200000 94.204031 -2.500000 1.300000 92.296776 -2.500000 1.400000 90.409520 -2.500000 1.500000 88.542265 -2.500000 1.600000 86.695009 -2.500000 1.700000 84.867754 -2.500000 1.800000 83.060499 -2.500000 1.900000 81.273243 -2.500000 2.000000 79.505988 -2.500000 2.100000 77.758733 -2.500000 2.200000 76.031477 -2.500000 2.300000 74.324222 -2.500000 2.400000 72.636967 -2.500000 2.500000 70.969711 -2.500000 2.600000 69.322456 -2.500000 2.700000 67.695201 -2.500000 2.800000 66.087945 -2.500000 2.900000 64.500690 -2.500000 3.000000 62.933435 -2.500000 3.100000 61.386179 -2.500000 3.200000 59.858924 -2.500000 3.300000 58.351668 -2.500000 3.400000 56.864413 -2.500000 3.500000 55.397158 -2.500000 3.600000 53.949902 -2.500000 3.700000 52.522647 -2.500000 3.800000 51.115392 -2.500000 3.900000 49.728136 -2.500000 4.000000 48.360881 -2.500000 4.100000 47.013626 -2.500000 4.200000 45.686370 -2.500000 4.300000 44.379115 -2.500000 4.400000 43.091860 -2.500000 4.500000 41.824604 -2.500000 4.600000 40.577349 -2.500000 4.700000 39.350094 -2.500000 4.800000 38.142838 -2.500000 4.900000 36.955583 -2.500000 5.000000 35.788327 -2.500000 5.100000 34.641072 -2.500000 5.200000 33.513817 -2.500000 5.300000 32.406561 -2.500000 5.400000 31.319306 -2.500000 5.500000 30.252051 -2.500000 5.600000 29.204795 -2.500000 5.700000 28.177540 -2.500000 5.800000 27.170285 -2.500000 5.900000 26.183029 -2.500000 6.000000 25.215774 -2.500000 6.100000 24.268519 -2.500000 6.200000 23.341263 -2.500000 6.300000 22.434008 -2.500000 6.400000 21.546753 -2.500000 6.500000 20.679497 -2.500000 6.600000 19.832242 -2.500000 6.700000 19.004987 -2.500000 6.800000 18.197731 -2.500000 6.900000 17.410476 -2.500000 7.000000 16.643220 -2.500000 7.100000 15.895965 -2.500000 7.200000 15.168710 -2.500000 7.300000 14.461454 -2.500000 7.400000 13.774199 -2.500000 7.500000 13.106944 -2.500000 7.600000 12.459688 -2.500000 7.700000 11.832433 -2.500000 7.800000 11.225178 -2.500000 7.900000 10.637922 -2.500000 8.000000 10.070667 -2.500000 8.100000 9.523412 -2.500000 8.200000 8.996156 -2.500000 8.300000 8.488901 -2.500000 8.400000 8.001646 -2.500000 8.500000 7.534390 -2.500000 8.600000 7.087135 -2.500000 8.700000 6.659879 -2.500000 8.800000 6.252624 -2.500000 8.900000 5.865369 -2.500000 9.000000 5.498113 -2.500000 9.100000 5.150858 -2.500000 9.200000 4.823603 -2.500000 9.300000 4.516347 -2.500000 9.400000 4.229092 -2.500000 9.500000 3.961837 -2.500000 9.600000 3.714581 -2.500000 9.700000 3.487326 -2.500000 9.800000 3.280071 -2.500000 9.900000 3.092815 -2.500000 10.000000 2.925560 -2.500000 10.100000 2.778305 -2.500000 10.200000 2.651049 -2.500000 10.300000 2.543794 -2.500000 10.400000 2.456538 -2.500000 10.500000 2.389283 -2.500000 10.600000 2.342028 -2.500000 10.700000 2.314772 -2.500000 10.800000 2.307517 -2.500000 10.900000 2.320262 -2.500000 11.000000 2.353006 -2.500000 11.100000 2.405751 -2.500000 11.200000 2.478496 -2.500000 11.300000 2.571240 -2.500000 11.400000 2.683985 -2.500000 11.500000 2.816730 -2.500000 11.600000 2.969474 -2.500000 11.700000 3.142219 -2.500000 11.800000 3.334964 -2.500000 11.900000 3.547708 -2.500000 12.000000 3.780453 -2.500000 12.100000 4.033198 -2.500000 12.200000 4.305942 -2.500000 12.300000 4.598687 -2.500000 12.400000 4.911431 -2.500000 12.500000 5.244176 -2.500000 12.600000 5.596921 -2.500000 12.700000 5.969665 -2.500000 12.800000 6.362410 -2.500000 12.900000 6.775155 -2.500000 13.000000 7.207899 -2.500000 13.100000 7.660644 -2.500000 13.200000 8.133389 -2.500000 13.300000 8.626133 -2.500000 13.400000 9.138878 -2.500000 13.500000 9.671623 -2.500000 13.600000 10.224367 -2.500000 13.700000 10.797112 -2.500000 13.800000 11.389857 -2.500000 13.900000 12.002601 -2.500000 14.000000 12.635346 -2.500000 14.100000 13.288090 -2.500000 14.200000 13.960835 -2.500000 14.300000 14.653580 -2.500000 14.400000 15.366324 -2.500000 14.500000 16.099069 -2.500000 14.600000 16.851814 -2.500000 14.700000 17.624558 -2.500000 14.800000 18.417303 -2.500000 14.900000 19.230048 -2.500000 15.000000 20.062792 -2.400000 -5.000000 245.151999 -2.400000 -4.900000 242.049235 -2.400000 -4.800000 238.966471 -2.400000 -4.700000 235.903706 -2.400000 -4.600000 232.860942 -2.400000 -4.500000 229.838178 -2.400000 -4.400000 226.835414 -2.400000 -4.300000 223.852649 -2.400000 -4.200000 220.889885 -2.400000 -4.100000 217.947121 -2.400000 -4.000000 215.024356 -2.400000 -3.900000 212.121592 -2.400000 -3.800000 209.238828 -2.400000 -3.700000 206.376064 -2.400000 -3.600000 203.533299 -2.400000 -3.500000 200.710535 -2.400000 -3.400000 197.907771 -2.400000 -3.300000 195.125006 -2.400000 -3.200000 192.362242 -2.400000 -3.100000 189.619478 -2.400000 -3.000000 186.896714 -2.400000 -2.900000 184.193949 -2.400000 -2.800000 181.511185 -2.400000 -2.700000 178.848421 -2.400000 -2.600000 176.205657 -2.400000 -2.500000 173.582892 -2.400000 -2.400000 170.980128 -2.400000 -2.300000 168.397364 -2.400000 -2.200000 165.834599 -2.400000 -2.100000 163.291835 -2.400000 -2.000000 160.769071 -2.400000 -1.900000 158.266307 -2.400000 -1.800000 155.783542 -2.400000 -1.700000 153.320778 -2.400000 -1.600000 150.878014 -2.400000 -1.500000 148.455249 -2.400000 -1.400000 146.052485 -2.400000 -1.300000 143.669721 -2.400000 -1.200000 141.306957 -2.400000 -1.100000 138.964192 -2.400000 -1.000000 136.641428 -2.400000 -0.900000 134.338664 -2.400000 -0.800000 132.055899 -2.400000 -0.700000 129.793135 -2.400000 -0.600000 127.550371 -2.400000 -0.500000 125.327607 -2.400000 -0.400000 123.124842 -2.400000 -0.300000 120.942078 -2.400000 -0.200000 118.779314 -2.400000 -0.100000 116.636549 -2.400000 -0.000000 114.513785 -2.400000 0.100000 112.411021 -2.400000 0.200000 110.328257 -2.400000 0.300000 108.265492 -2.400000 0.400000 106.222728 -2.400000 0.500000 104.199964 -2.400000 0.600000 102.197200 -2.400000 0.700000 100.214435 -2.400000 0.800000 98.251671 -2.400000 0.900000 96.308907 -2.400000 1.000000 94.386142 -2.400000 1.100000 92.483378 -2.400000 1.200000 90.600614 -2.400000 1.300000 88.737850 -2.400000 1.400000 86.895085 -2.400000 1.500000 85.072321 -2.400000 1.600000 83.269557 -2.400000 1.700000 81.486792 -2.400000 1.800000 79.724028 -2.400000 1.900000 77.981264 -2.400000 2.000000 76.258500 -2.400000 2.100000 74.555735 -2.400000 2.200000 72.872971 -2.400000 2.300000 71.210207 -2.400000 2.400000 69.567442 -2.400000 2.500000 67.944678 -2.400000 2.600000 66.341914 -2.400000 2.700000 64.759150 -2.400000 2.800000 63.196385 -2.400000 2.900000 61.653621 -2.400000 3.000000 60.130857 -2.400000 3.100000 58.628092 -2.400000 3.200000 57.145328 -2.400000 3.300000 55.682564 -2.400000 3.400000 54.239800 -2.400000 3.500000 52.817035 -2.400000 3.600000 51.414271 -2.400000 3.700000 50.031507 -2.400000 3.800000 48.668743 -2.400000 3.900000 47.325978 -2.400000 4.000000 46.003214 -2.400000 4.100000 44.700450 -2.400000 4.200000 43.417685 -2.400000 4.300000 42.154921 -2.400000 4.400000 40.912157 -2.400000 4.500000 39.689393 -2.400000 4.600000 38.486628 -2.400000 4.700000 37.303864 -2.400000 4.800000 36.141100 -2.400000 4.900000 34.998335 -2.400000 5.000000 33.875571 -2.400000 5.100000 32.772807 -2.400000 5.200000 31.690043 -2.400000 5.300000 30.627278 -2.400000 5.400000 29.584514 -2.400000 5.500000 28.561750 -2.400000 5.600000 27.558985 -2.400000 5.700000 26.576221 -2.400000 5.800000 25.613457 -2.400000 5.900000 24.670693 -2.400000 6.000000 23.747928 -2.400000 6.100000 22.845164 -2.400000 6.200000 21.962400 -2.400000 6.300000 21.099635 -2.400000 6.400000 20.256871 -2.400000 6.500000 19.434107 -2.400000 6.600000 18.631343 -2.400000 6.700000 17.848578 -2.400000 6.800000 17.085814 -2.400000 6.900000 16.343050 -2.400000 7.000000 15.620286 -2.400000 7.100000 14.917521 -2.400000 7.200000 14.234757 -2.400000 7.300000 13.571993 -2.400000 7.400000 12.929228 -2.400000 7.500000 12.306464 -2.400000 7.600000 11.703700 -2.400000 7.700000 11.120936 -2.400000 7.800000 10.558171 -2.400000 7.900000 10.015407 -2.400000 8.000000 9.492643 -2.400000 8.100000 8.989878 -2.400000 8.200000 8.507114 -2.400000 8.300000 8.044350 -2.400000 8.400000 7.601586 -2.400000 8.500000 7.178821 -2.400000 8.600000 6.776057 -2.400000 8.700000 6.393293 -2.400000 8.800000 6.030528 -2.400000 8.900000 5.687764 -2.400000 9.000000 5.365000 -2.400000 9.100000 5.062236 -2.400000 9.200000 4.779471 -2.400000 9.300000 4.516707 -2.400000 9.400000 4.273943 -2.400000 9.500000 4.051178 -2.400000 9.600000 3.848414 -2.400000 9.700000 3.665650 -2.400000 9.800000 3.502886 -2.400000 9.900000 3.360121 -2.400000 10.000000 3.237357 -2.400000 10.100000 3.134593 -2.400000 10.200000 3.051828 -2.400000 10.300000 2.989064 -2.400000 10.400000 2.946300 -2.400000 10.500000 2.923536 -2.400000 10.600000 2.920771 -2.400000 10.700000 2.938007 -2.400000 10.800000 2.975243 -2.400000 10.900000 3.032479 -2.400000 11.000000 3.109714 -2.400000 11.100000 3.206950 -2.400000 11.200000 3.324186 -2.400000 11.300000 3.461421 -2.400000 11.400000 3.618657 -2.400000 11.500000 3.795893 -2.400000 11.600000 3.993129 -2.400000 11.700000 4.210364 -2.400000 11.800000 4.447600 -2.400000 11.900000 4.704836 -2.400000 12.000000 4.982071 -2.400000 12.100000 5.279307 -2.400000 12.200000 5.596543 -2.400000 12.300000 5.933779 -2.400000 12.400000 6.291014 -2.400000 12.500000 6.668250 -2.400000 12.600000 7.065486 -2.400000 12.700000 7.482721 -2.400000 12.800000 7.919957 -2.400000 12.900000 8.377193 -2.400000 13.000000 8.854429 -2.400000 13.100000 9.351664 -2.400000 13.200000 9.868900 -2.400000 13.300000 10.406136 -2.400000 13.400000 10.963371 -2.400000 13.500000 11.540607 -2.400000 13.600000 12.137843 -2.400000 13.700000 12.755079 -2.400000 13.800000 13.392314 -2.400000 13.900000 14.049550 -2.400000 14.000000 14.726786 -2.400000 14.100000 15.424022 -2.400000 14.200000 16.141257 -2.400000 14.300000 16.878493 -2.400000 14.400000 17.635729 -2.400000 14.500000 18.412964 -2.400000 14.600000 19.210200 -2.400000 14.700000 20.027436 -2.400000 14.800000 20.864672 -2.400000 14.900000 21.721907 -2.400000 15.000000 22.599143 -2.300000 -5.000000 239.039136 -2.300000 -4.900000 235.980346 -2.300000 -4.800000 232.941556 -2.300000 -4.700000 229.922767 -2.300000 -4.600000 226.923977 -2.300000 -4.500000 223.945187 -2.300000 -4.400000 220.986397 -2.300000 -4.300000 218.047607 -2.300000 -4.200000 215.128817 -2.300000 -4.100000 212.230027 -2.300000 -4.000000 209.351237 -2.300000 -3.900000 206.492447 -2.300000 -3.800000 203.653657 -2.300000 -3.700000 200.834867 -2.300000 -3.600000 198.036077 -2.300000 -3.500000 195.257287 -2.300000 -3.400000 192.498497 -2.300000 -3.300000 189.759707 -2.300000 -3.200000 187.040917 -2.300000 -3.100000 184.342127 -2.300000 -3.000000 181.663337 -2.300000 -2.900000 179.004547 -2.300000 -2.800000 176.365757 -2.300000 -2.700000 173.746968 -2.300000 -2.600000 171.148178 -2.300000 -2.500000 168.569388 -2.300000 -2.400000 166.010598 -2.300000 -2.300000 163.471808 -2.300000 -2.200000 160.953018 -2.300000 -2.100000 158.454228 -2.300000 -2.000000 155.975438 -2.300000 -1.900000 153.516648 -2.300000 -1.800000 151.077858 -2.300000 -1.700000 148.659068 -2.300000 -1.600000 146.260278 -2.300000 -1.500000 143.881488 -2.300000 -1.400000 141.522698 -2.300000 -1.300000 139.183908 -2.300000 -1.200000 136.865118 -2.300000 -1.100000 134.566328 -2.300000 -1.000000 132.287538 -2.300000 -0.900000 130.028748 -2.300000 -0.800000 127.789959 -2.300000 -0.700000 125.571169 -2.300000 -0.600000 123.372379 -2.300000 -0.500000 121.193589 -2.300000 -0.400000 119.034799 -2.300000 -0.300000 116.896009 -2.300000 -0.200000 114.777219 -2.300000 -0.100000 112.678429 -2.300000 -0.000000 110.599639 -2.300000 0.100000 108.540849 -2.300000 0.200000 106.502059 -2.300000 0.300000 104.483269 -2.300000 0.400000 102.484479 -2.300000 0.500000 100.505689 -2.300000 0.600000 98.546899 -2.300000 0.700000 96.608109 -2.300000 0.800000 94.689319 -2.300000 0.900000 92.790529 -2.300000 1.000000 90.911739 -2.300000 1.100000 89.052949 -2.300000 1.200000 87.214160 -2.300000 1.300000 85.395370 -2.300000 1.400000 83.596580 -2.300000 1.500000 81.817790 -2.300000 1.600000 80.059000 -2.300000 1.700000 78.320210 -2.300000 1.800000 76.601420 -2.300000 1.900000 74.902630 -2.300000 2.000000 73.223840 -2.300000 2.100000 71.565050 -2.300000 2.200000 69.926260 -2.300000 2.300000 68.307470 -2.300000 2.400000 66.708680 -2.300000 2.500000 65.129890 -2.300000 2.600000 63.571100 -2.300000 2.700000 62.032310 -2.300000 2.800000 60.513520 -2.300000 2.900000 59.014730 -2.300000 3.000000 57.535940 -2.300000 3.100000 56.077150 -2.300000 3.200000 54.638361 -2.300000 3.300000 53.219571 -2.300000 3.400000 51.820781 -2.300000 3.500000 50.441991 -2.300000 3.600000 49.083201 -2.300000 3.700000 47.744411 -2.300000 3.800000 46.425621 -2.300000 3.900000 45.126831 -2.300000 4.000000 43.848041 -2.300000 4.100000 42.589251 -2.300000 4.200000 41.350461 -2.300000 4.300000 40.131671 -2.300000 4.400000 38.932881 -2.300000 4.500000 37.754091 -2.300000 4.600000 36.595301 -2.300000 4.700000 35.456511 -2.300000 4.800000 34.337721 -2.300000 4.900000 33.238931 -2.300000 5.000000 32.160141 -2.300000 5.100000 31.101352 -2.300000 5.200000 30.062562 -2.300000 5.300000 29.043772 -2.300000 5.400000 28.044982 -2.300000 5.500000 27.066192 -2.300000 5.600000 26.107402 -2.300000 5.700000 25.168612 -2.300000 5.800000 24.249822 -2.300000 5.900000 23.351032 -2.300000 6.000000 22.472242 -2.300000 6.100000 21.613452 -2.300000 6.200000 20.774662 -2.300000 6.300000 19.955872 -2.300000 6.400000 19.157082 -2.300000 6.500000 18.378292 -2.300000 6.600000 17.619502 -2.300000 6.700000 16.880712 -2.300000 6.800000 16.161922 -2.300000 6.900000 15.463132 -2.300000 7.000000 14.784342 -2.300000 7.100000 14.125553 -2.300000 7.200000 13.486763 -2.300000 7.300000 12.867973 -2.300000 7.400000 12.269183 -2.300000 7.500000 11.690393 -2.300000 7.600000 11.131603 -2.300000 7.700000 10.592813 -2.300000 7.800000 10.074023 -2.300000 7.900000 9.575233 -2.300000 8.000000 9.096443 -2.300000 8.100000 8.637653 -2.300000 8.200000 8.198863 -2.300000 8.300000 7.780073 -2.300000 8.400000 7.381283 -2.300000 8.500000 7.002493 -2.300000 8.600000 6.643703 -2.300000 8.700000 6.304913 -2.300000 8.800000 5.986123 -2.300000 8.900000 5.687333 -2.300000 9.000000 5.408544 -2.300000 9.100000 5.149754 -2.300000 9.200000 4.910964 -2.300000 9.300000 4.692174 -2.300000 9.400000 4.493384 -2.300000 9.500000 4.314594 -2.300000 9.600000 4.155804 -2.300000 9.700000 4.017014 -2.300000 9.800000 3.898224 -2.300000 9.900000 3.799434 -2.300000 10.000000 3.720644 -2.300000 10.100000 3.661854 -2.300000 10.200000 3.623064 -2.300000 10.300000 3.604274 -2.300000 10.400000 3.605484 -2.300000 10.500000 3.626694 -2.300000 10.600000 3.667904 -2.300000 10.700000 3.729114 -2.300000 10.800000 3.810324 -2.300000 10.900000 3.911534 -2.300000 11.000000 4.032745 -2.300000 11.100000 4.173955 -2.300000 11.200000 4.335165 -2.300000 11.300000 4.516375 -2.300000 11.400000 4.717585 -2.300000 11.500000 4.938795 -2.300000 11.600000 5.180005 -2.300000 11.700000 5.441215 -2.300000 11.800000 5.722425 -2.300000 11.900000 6.023635 -2.300000 12.000000 6.344845 -2.300000 12.100000 6.686055 -2.300000 12.200000 7.047265 -2.300000 12.300000 7.428475 -2.300000 12.400000 7.829685 -2.300000 12.500000 8.250895 -2.300000 12.600000 8.692105 -2.300000 12.700000 9.153315 -2.300000 12.800000 9.634525 -2.300000 12.900000 10.135736 -2.300000 13.000000 10.656946 -2.300000 13.100000 11.198156 -2.300000 13.200000 11.759366 -2.300000 13.300000 12.340576 -2.300000 13.400000 12.941786 -2.300000 13.500000 13.562996 -2.300000 13.600000 14.204206 -2.300000 13.700000 14.865416 -2.300000 13.800000 15.546626 -2.300000 13.900000 16.247836 -2.300000 14.000000 16.969046 -2.300000 14.100000 17.710256 -2.300000 14.200000 18.471466 -2.300000 14.300000 19.252676 -2.300000 14.400000 20.053886 -2.300000 14.500000 20.875096 -2.300000 14.600000 21.716306 -2.300000 14.700000 22.577516 -2.300000 14.800000 23.458726 -2.300000 14.900000 24.359937 -2.300000 15.000000 25.281147 -2.200000 -5.000000 233.165042 -2.200000 -4.900000 230.149710 -2.200000 -4.800000 227.154378 -2.200000 -4.700000 224.179045 -2.200000 -4.600000 221.223713 -2.200000 -4.500000 218.288381 -2.200000 -4.400000 215.373048 -2.200000 -4.300000 212.477716 -2.200000 -4.200000 209.602384 -2.200000 -4.100000 206.747051 -2.200000 -4.000000 203.911719 -2.200000 -3.900000 201.096386 -2.200000 -3.800000 198.301054 -2.200000 -3.700000 195.525722 -2.200000 -3.600000 192.770389 -2.200000 -3.500000 190.035057 -2.200000 -3.400000 187.319725 -2.200000 -3.300000 184.624392 -2.200000 -3.200000 181.949060 -2.200000 -3.100000 179.293728 -2.200000 -3.000000 176.658395 -2.200000 -2.900000 174.043063 -2.200000 -2.800000 171.447731 -2.200000 -2.700000 168.872398 -2.200000 -2.600000 166.317066 -2.200000 -2.500000 163.781733 -2.200000 -2.400000 161.266401 -2.200000 -2.300000 158.771069 -2.200000 -2.200000 156.295736 -2.200000 -2.100000 153.840404 -2.200000 -2.000000 151.405072 -2.200000 -1.900000 148.989739 -2.200000 -1.800000 146.594407 -2.200000 -1.700000 144.219075 -2.200000 -1.600000 141.863742 -2.200000 -1.500000 139.528410 -2.200000 -1.400000 137.213078 -2.200000 -1.300000 134.917745 -2.200000 -1.200000 132.642413 -2.200000 -1.100000 130.387081 -2.200000 -1.000000 128.151748 -2.200000 -0.900000 125.936416 -2.200000 -0.800000 123.741083 -2.200000 -0.700000 121.565751 -2.200000 -0.600000 119.410419 -2.200000 -0.500000 117.275086 -2.200000 -0.400000 115.159754 -2.200000 -0.300000 113.064422 -2.200000 -0.200000 110.989089 -2.200000 -0.100000 108.933757 -2.200000 -0.000000 106.898425 -2.200000 0.100000 104.883092 -2.200000 0.200000 102.887760 -2.200000 0.300000 100.912428 -2.200000 0.400000 98.957095 -2.200000 0.500000 97.021763 -2.200000 0.600000 95.106431 -2.200000 0.700000 93.211098 -2.200000 0.800000 91.335766 -2.200000 0.900000 89.480433 -2.200000 1.000000 87.645101 -2.200000 1.100000 85.829769 -2.200000 1.200000 84.034436 -2.200000 1.300000 82.259104 -2.200000 1.400000 80.503772 -2.200000 1.500000 78.768439 -2.200000 1.600000 77.053107 -2.200000 1.700000 75.357775 -2.200000 1.800000 73.682442 -2.200000 1.900000 72.027110 -2.200000 2.000000 70.391778 -2.200000 2.100000 68.776445 -2.200000 2.200000 67.181113 -2.200000 2.300000 65.605780 -2.200000 2.400000 64.050448 -2.200000 2.500000 62.515116 -2.200000 2.600000 60.999783 -2.200000 2.700000 59.504451 -2.200000 2.800000 58.029119 -2.200000 2.900000 56.573786 -2.200000 3.000000 55.138454 -2.200000 3.100000 53.723122 -2.200000 3.200000 52.327789 -2.200000 3.300000 50.952457 -2.200000 3.400000 49.597125 -2.200000 3.500000 48.261792 -2.200000 3.600000 46.946460 -2.200000 3.700000 45.651128 -2.200000 3.800000 44.375795 -2.200000 3.900000 43.120463 -2.200000 4.000000 41.885130 -2.200000 4.100000 40.669798 -2.200000 4.200000 39.474466 -2.200000 4.300000 38.299133 -2.200000 4.400000 37.143801 -2.200000 4.500000 36.008469 -2.200000 4.600000 34.893136 -2.200000 4.700000 33.797804 -2.200000 4.800000 32.722472 -2.200000 4.900000 31.667139 -2.200000 5.000000 30.631807 -2.200000 5.100000 29.616475 -2.200000 5.200000 28.621142 -2.200000 5.300000 27.645810 -2.200000 5.400000 26.690477 -2.200000 5.500000 25.755145 -2.200000 5.600000 24.839813 -2.200000 5.700000 23.944480 -2.200000 5.800000 23.069148 -2.200000 5.900000 22.213816 -2.200000 6.000000 21.378483 -2.200000 6.100000 20.563151 -2.200000 6.200000 19.767819 -2.200000 6.300000 18.992486 -2.200000 6.400000 18.237154 -2.200000 6.500000 17.501822 -2.200000 6.600000 16.786489 -2.200000 6.700000 16.091157 -2.200000 6.800000 15.415825 -2.200000 6.900000 14.760492 -2.200000 7.000000 14.125160 -2.200000 7.100000 13.509827 -2.200000 7.200000 12.914495 -2.200000 7.300000 12.339163 -2.200000 7.400000 11.783830 -2.200000 7.500000 11.248498 -2.200000 7.600000 10.733166 -2.200000 7.700000 10.237833 -2.200000 7.800000 9.762501 -2.200000 7.900000 9.307169 -2.200000 8.000000 8.871836 -2.200000 8.100000 8.456504 -2.200000 8.200000 8.061172 -2.200000 8.300000 7.685839 -2.200000 8.400000 7.330507 -2.200000 8.500000 6.995175 -2.200000 8.600000 6.679842 -2.200000 8.700000 6.384510 -2.200000 8.800000 6.109177 -2.200000 8.900000 5.853845 -2.200000 9.000000 5.618513 -2.200000 9.100000 5.403180 -2.200000 9.200000 5.207848 -2.200000 9.300000 5.032516 -2.200000 9.400000 4.877183 -2.200000 9.500000 4.741851 -2.200000 9.600000 4.626519 -2.200000 9.700000 4.531186 -2.200000 9.800000 4.455854 -2.200000 9.900000 4.400522 -2.200000 10.000000 4.365189 -2.200000 10.100000 4.349857 -2.200000 10.200000 4.354524 -2.200000 10.300000 4.379192 -2.200000 10.400000 4.423860 -2.200000 10.500000 4.488527 -2.200000 10.600000 4.573195 -2.200000 10.700000 4.677863 -2.200000 10.800000 4.802530 -2.200000 10.900000 4.947198 -2.200000 11.000000 5.111866 -2.200000 11.100000 5.296533 -2.200000 11.200000 5.501201 -2.200000 11.300000 5.725869 -2.200000 11.400000 5.970536 -2.200000 11.500000 6.235204 -2.200000 11.600000 6.519872 -2.200000 11.700000 6.824539 -2.200000 11.800000 7.149207 -2.200000 11.900000 7.493874 -2.200000 12.000000 7.858542 -2.200000 12.100000 8.243210 -2.200000 12.200000 8.647877 -2.200000 12.300000 9.072545 -2.200000 12.400000 9.517213 -2.200000 12.500000 9.981880 -2.200000 12.600000 10.466548 -2.200000 12.700000 10.971216 -2.200000 12.800000 11.495883 -2.200000 12.900000 12.040551 -2.200000 13.000000 12.605219 -2.200000 13.100000 13.189886 -2.200000 13.200000 13.794554 -2.200000 13.300000 14.419221 -2.200000 13.400000 15.063889 -2.200000 13.500000 15.728557 -2.200000 13.600000 16.413224 -2.200000 13.700000 17.117892 -2.200000 13.800000 17.842560 -2.200000 13.900000 18.587227 -2.200000 14.000000 19.351895 -2.200000 14.100000 20.136563 -2.200000 14.200000 20.941230 -2.200000 14.300000 21.765898 -2.200000 14.400000 22.610566 -2.200000 14.500000 23.475233 -2.200000 14.600000 24.359901 -2.200000 14.700000 25.264569 -2.200000 14.800000 26.189236 -2.200000 14.900000 27.133904 -2.200000 15.000000 28.098571 -2.100000 -5.000000 227.518887 -2.100000 -4.900000 224.546496 -2.100000 -4.800000 221.594104 -2.100000 -4.700000 218.661713 -2.100000 -4.600000 215.749321 -2.100000 -4.500000 212.856930 -2.100000 -4.400000 209.984538 -2.100000 -4.300000 207.132147 -2.100000 -4.200000 204.299755 -2.100000 -4.100000 201.487364 -2.100000 -4.000000 198.694972 -2.100000 -3.900000 195.922581 -2.100000 -3.800000 193.170189 -2.100000 -3.700000 190.437798 -2.100000 -3.600000 187.725406 -2.100000 -3.500000 185.033015 -2.100000 -3.400000 182.360623 -2.100000 -3.300000 179.708232 -2.100000 -3.200000 177.075840 -2.100000 -3.100000 174.463449 -2.100000 -3.000000 171.871057 -2.100000 -2.900000 169.298666 -2.100000 -2.800000 166.746274 -2.100000 -2.700000 164.213883 -2.100000 -2.600000 161.701491 -2.100000 -2.500000 159.209100 -2.100000 -2.400000 156.736708 -2.100000 -2.300000 154.284317 -2.100000 -2.200000 151.851925 -2.100000 -2.100000 149.439534 -2.100000 -2.000000 147.047142 -2.100000 -1.900000 144.674751 -2.100000 -1.800000 142.322359 -2.100000 -1.700000 139.989968 -2.100000 -1.600000 137.677576 -2.100000 -1.500000 135.385185 -2.100000 -1.400000 133.112793 -2.100000 -1.300000 130.860402 -2.100000 -1.200000 128.628010 -2.100000 -1.100000 126.415619 -2.100000 -1.000000 124.223227 -2.100000 -0.900000 122.050836 -2.100000 -0.800000 119.898444 -2.100000 -0.700000 117.766053 -2.100000 -0.600000 115.653661 -2.100000 -0.500000 113.561270 -2.100000 -0.400000 111.488878 -2.100000 -0.300000 109.436487 -2.100000 -0.200000 107.404095 -2.100000 -0.100000 105.391704 -2.100000 -0.000000 103.399312 -2.100000 0.100000 101.426921 -2.100000 0.200000 99.474529 -2.100000 0.300000 97.542138 -2.100000 0.400000 95.629746 -2.100000 0.500000 93.737355 -2.100000 0.600000 91.864963 -2.100000 0.700000 90.012572 -2.100000 0.800000 88.180180 -2.100000 0.900000 86.367789 -2.100000 1.000000 84.575397 -2.100000 1.100000 82.803006 -2.100000 1.200000 81.050614 -2.100000 1.300000 79.318223 -2.100000 1.400000 77.605831 -2.100000 1.500000 75.913440 -2.100000 1.600000 74.241048 -2.100000 1.700000 72.588657 -2.100000 1.800000 70.956265 -2.100000 1.900000 69.343874 -2.100000 2.000000 67.751482 -2.100000 2.100000 66.179091 -2.100000 2.200000 64.626699 -2.100000 2.300000 63.094308 -2.100000 2.400000 61.581916 -2.100000 2.500000 60.089525 -2.100000 2.600000 58.617133 -2.100000 2.700000 57.164742 -2.100000 2.800000 55.732350 -2.100000 2.900000 54.319959 -2.100000 3.000000 52.927567 -2.100000 3.100000 51.555176 -2.100000 3.200000 50.202784 -2.100000 3.300000 48.870393 -2.100000 3.400000 47.558001 -2.100000 3.500000 46.265610 -2.100000 3.600000 44.993218 -2.100000 3.700000 43.740827 -2.100000 3.800000 42.508435 -2.100000 3.900000 41.296044 -2.100000 4.000000 40.103652 -2.100000 4.100000 38.931261 -2.100000 4.200000 37.778869 -2.100000 4.300000 36.646478 -2.100000 4.400000 35.534086 -2.100000 4.500000 34.441695 -2.100000 4.600000 33.369303 -2.100000 4.700000 32.316912 -2.100000 4.800000 31.284520 -2.100000 4.900000 30.272129 -2.100000 5.000000 29.279737 -2.100000 5.100000 28.307346 -2.100000 5.200000 27.354954 -2.100000 5.300000 26.422563 -2.100000 5.400000 25.510171 -2.100000 5.500000 24.617780 -2.100000 5.600000 23.745388 -2.100000 5.700000 22.892997 -2.100000 5.800000 22.060605 -2.100000 5.900000 21.248214 -2.100000 6.000000 20.455822 -2.100000 6.100000 19.683431 -2.100000 6.200000 18.931039 -2.100000 6.300000 18.198648 -2.100000 6.400000 17.486256 -2.100000 6.500000 16.793865 -2.100000 6.600000 16.121473 -2.100000 6.700000 15.469082 -2.100000 6.800000 14.836690 -2.100000 6.900000 14.224299 -2.100000 7.000000 13.631907 -2.100000 7.100000 13.059516 -2.100000 7.200000 12.507124 -2.100000 7.300000 11.974733 -2.100000 7.400000 11.462341 -2.100000 7.500000 10.969950 -2.100000 7.600000 10.497558 -2.100000 7.700000 10.045167 -2.100000 7.800000 9.612775 -2.100000 7.900000 9.200384 -2.100000 8.000000 8.807992 -2.100000 8.100000 8.435601 -2.100000 8.200000 8.083209 -2.100000 8.300000 7.750818 -2.100000 8.400000 7.438426 -2.100000 8.500000 7.146035 -2.100000 8.600000 6.873643 -2.100000 8.700000 6.621252 -2.100000 8.800000 6.388860 -2.100000 8.900000 6.176469 -2.100000 9.000000 5.984077 -2.100000 9.100000 5.811686 -2.100000 9.200000 5.659294 -2.100000 9.300000 5.526903 -2.100000 9.400000 5.414511 -2.100000 9.500000 5.322120 -2.100000 9.600000 5.249728 -2.100000 9.700000 5.197337 -2.100000 9.800000 5.164945 -2.100000 9.900000 5.152554 -2.100000 10.000000 5.160162 -2.100000 10.100000 5.187771 -2.100000 10.200000 5.235379 -2.100000 10.300000 5.302988 -2.100000 10.400000 5.390596 -2.100000 10.500000 5.498205 -2.100000 10.600000 5.625813 -2.100000 10.700000 5.773422 -2.100000 10.800000 5.941030 -2.100000 10.900000 6.128639 -2.100000 11.000000 6.336247 -2.100000 11.100000 6.563856 -2.100000 11.200000 6.811464 -2.100000 11.300000 7.079073 -2.100000 11.400000 7.366681 -2.100000 11.500000 7.674290 -2.100000 11.600000 8.001898 -2.100000 11.700000 8.349507 -2.100000 11.800000 8.717115 -2.100000 11.900000 9.104724 -2.100000 12.000000 9.512332 -2.100000 12.100000 9.939941 -2.100000 12.200000 10.387549 -2.100000 12.300000 10.855158 -2.100000 12.400000 11.342766 -2.100000 12.500000 11.850375 -2.100000 12.600000 12.377983 -2.100000 12.700000 12.925592 -2.100000 12.800000 13.493200 -2.100000 12.900000 14.080809 -2.100000 13.000000 14.688417 -2.100000 13.100000 15.316026 -2.100000 13.200000 15.963634 -2.100000 13.300000 16.631243 -2.100000 13.400000 17.318851 -2.100000 13.500000 18.026460 -2.100000 13.600000 18.754068 -2.100000 13.700000 19.501677 -2.100000 13.800000 20.269285 -2.100000 13.900000 21.056894 -2.100000 14.000000 21.864502 -2.100000 14.100000 22.692111 -2.100000 14.200000 23.539719 -2.100000 14.300000 24.407328 -2.100000 14.400000 25.294936 -2.100000 14.500000 26.202545 -2.100000 14.600000 27.130153 -2.100000 14.700000 28.077762 -2.100000 14.800000 29.045370 -2.100000 14.900000 30.032979 -2.100000 15.000000 31.040587 -2.000000 -5.000000 222.089316 -2.000000 -4.900000 219.159349 -2.000000 -4.800000 216.249381 -2.000000 -4.700000 213.359414 -2.000000 -4.600000 210.489447 -2.000000 -4.500000 207.639479 -2.000000 -4.400000 204.809512 -2.000000 -4.300000 201.999544 -2.000000 -4.200000 199.209577 -2.000000 -4.100000 196.439610 -2.000000 -4.000000 193.689642 -2.000000 -3.900000 190.959675 -2.000000 -3.800000 188.249707 -2.000000 -3.700000 185.559740 -2.000000 -3.600000 182.889773 -2.000000 -3.500000 180.239805 -2.000000 -3.400000 177.609838 -2.000000 -3.300000 174.999871 -2.000000 -3.200000 172.409903 -2.000000 -3.100000 169.839936 -2.000000 -3.000000 167.289968 -2.000000 -2.900000 164.760001 -2.000000 -2.800000 162.250034 -2.000000 -2.700000 159.760066 -2.000000 -2.600000 157.290099 -2.000000 -2.500000 154.840132 -2.000000 -2.400000 152.410164 -2.000000 -2.300000 150.000197 -2.000000 -2.200000 147.610229 -2.000000 -2.100000 145.240262 -2.000000 -2.000000 142.890295 -2.000000 -1.900000 140.560327 -2.000000 -1.800000 138.250360 -2.000000 -1.700000 135.960393 -2.000000 -1.600000 133.690425 -2.000000 -1.500000 131.440458 -2.000000 -1.400000 129.210490 -2.000000 -1.300000 127.000523 -2.000000 -1.200000 124.810556 -2.000000 -1.100000 122.640588 -2.000000 -1.000000 120.490621 -2.000000 -0.900000 118.360653 -2.000000 -0.800000 116.250686 -2.000000 -0.700000 114.160719 -2.000000 -0.600000 112.090751 -2.000000 -0.500000 110.040784 -2.000000 -0.400000 108.010817 -2.000000 -0.300000 106.000849 -2.000000 -0.200000 104.010882 -2.000000 -0.100000 102.040914 -2.000000 -0.000000 100.090947 -2.000000 0.100000 98.160980 -2.000000 0.200000 96.251012 -2.000000 0.300000 94.361045 -2.000000 0.400000 92.491078 -2.000000 0.500000 90.641110 -2.000000 0.600000 88.811143 -2.000000 0.700000 87.001175 -2.000000 0.800000 85.211208 -2.000000 0.900000 83.441241 -2.000000 1.000000 81.691273 -2.000000 1.100000 79.961306 -2.000000 1.200000 78.251338 -2.000000 1.300000 76.561371 -2.000000 1.400000 74.891404 -2.000000 1.500000 73.241436 -2.000000 1.600000 71.611469 -2.000000 1.700000 70.001502 -2.000000 1.800000 68.411534 -2.000000 1.900000 66.841567 -2.000000 2.000000 65.291599 -2.000000 2.100000 63.761632 -2.000000 2.200000 62.251665 -2.000000 2.300000 60.761697 -2.000000 2.400000 59.291730 -2.000000 2.500000 57.841763 -2.000000 2.600000 56.411795 -2.000000 2.700000 55.001828 -2.000000 2.800000 53.611860 -2.000000 2.900000 52.241893 -2.000000 3.000000 50.891926 -2.000000 3.100000 49.561958 -2.000000 3.200000 48.251991 -2.000000 3.300000 46.962024 -2.000000 3.400000 45.692056 -2.000000 3.500000 44.442089 -2.000000 3.600000 43.212121 -2.000000 3.700000 42.002154 -2.000000 3.800000 40.812187 -2.000000 3.900000 39.642219 -2.000000 4.000000 38.492252 -2.000000 4.100000 37.362284 -2.000000 4.200000 36.252317 -2.000000 4.300000 35.162350 -2.000000 4.400000 34.092382 -2.000000 4.500000 33.042415 -2.000000 4.600000 32.012448 -2.000000 4.700000 31.002480 -2.000000 4.800000 30.012513 -2.000000 4.900000 29.042545 -2.000000 5.000000 28.092578 -2.000000 5.100000 27.162611 -2.000000 5.200000 26.252643 -2.000000 5.300000 25.362676 -2.000000 5.400000 24.492709 -2.000000 5.500000 23.642741 -2.000000 5.600000 22.812774 -2.000000 5.700000 22.002806 -2.000000 5.800000 21.212839 -2.000000 5.900000 20.442872 -2.000000 6.000000 19.692904 -2.000000 6.100000 18.962937 -2.000000 6.200000 18.252970 -2.000000 6.300000 17.563002 -2.000000 6.400000 16.893035 -2.000000 6.500000 16.243067 -2.000000 6.600000 15.613100 -2.000000 6.700000 15.003133 -2.000000 6.800000 14.413165 -2.000000 6.900000 13.843198 -2.000000 7.000000 13.293230 -2.000000 7.100000 12.763263 -2.000000 7.200000 12.253296 -2.000000 7.300000 11.763328 -2.000000 7.400000 11.293361 -2.000000 7.500000 10.843394 -2.000000 7.600000 10.413426 -2.000000 7.700000 10.003459 -2.000000 7.800000 9.613491 -2.000000 7.900000 9.243524 -2.000000 8.000000 8.893557 -2.000000 8.100000 8.563589 -2.000000 8.200000 8.253622 -2.000000 8.300000 7.963655 -2.000000 8.400000 7.693687 -2.000000 8.500000 7.443720 -2.000000 8.600000 7.213752 -2.000000 8.700000 7.003785 -2.000000 8.800000 6.813818 -2.000000 8.900000 6.643850 -2.000000 9.000000 6.493883 -2.000000 9.100000 6.363916 -2.000000 9.200000 6.253948 -2.000000 9.300000 6.163981 -2.000000 9.400000 6.094013 -2.000000 9.500000 6.044046 -2.000000 9.600000 6.014079 -2.000000 9.700000 6.004111 -2.000000 9.800000 6.014144 -2.000000 9.900000 6.044176 -2.000000 10.000000 6.094209 -2.000000 10.100000 6.164242 -2.000000 10.200000 6.254274 -2.000000 10.300000 6.364307 -2.000000 10.400000 6.494340 -2.000000 10.500000 6.644372 -2.000000 10.600000 6.814405 -2.000000 10.700000 7.004437 -2.000000 10.800000 7.214470 -2.000000 10.900000 7.444503 -2.000000 11.000000 7.694535 -2.000000 11.100000 7.964568 -2.000000 11.200000 8.254601 -2.000000 11.300000 8.564633 -2.000000 11.400000 8.894666 -2.000000 11.500000 9.244698 -2.000000 11.600000 9.614731 -2.000000 11.700000 10.004764 -2.000000 11.800000 10.414796 -2.000000 11.900000 10.844829 -2.000000 12.000000 11.294861 -2.000000 12.100000 11.764894 -2.000000 12.200000 12.254927 -2.000000 12.300000 12.764959 -2.000000 12.400000 13.294992 -2.000000 12.500000 13.845025 -2.000000 12.600000 14.415057 -2.000000 12.700000 15.005090 -2.000000 12.800000 15.615122 -2.000000 12.900000 16.245155 -2.000000 13.000000 16.895188 -2.000000 13.100000 17.565220 -2.000000 13.200000 18.255253 -2.000000 13.300000 18.965286 -2.000000 13.400000 19.695318 -2.000000 13.500000 20.445351 -2.000000 13.600000 21.215383 -2.000000 13.700000 22.005416 -2.000000 13.800000 22.815449 -2.000000 13.900000 23.645481 -2.000000 14.000000 24.495514 -2.000000 14.100000 25.365547 -2.000000 14.200000 26.255579 -2.000000 14.300000 27.165612 -2.000000 14.400000 28.095644 -2.000000 14.500000 29.045677 -2.000000 14.600000 30.015710 -2.000000 14.700000 31.005742 -2.000000 14.800000 32.015775 -2.000000 14.900000 33.045807 -2.000000 15.000000 34.095840 -1.900000 -5.000000 216.864531 -1.900000 -4.900000 213.976471 -1.900000 -4.800000 211.108411 -1.900000 -4.700000 208.260351 -1.900000 -4.600000 205.432291 -1.900000 -4.500000 202.624231 -1.900000 -4.400000 199.836171 -1.900000 -4.300000 197.068111 -1.900000 -4.200000 194.320051 -1.900000 -4.100000 191.591991 -1.900000 -4.000000 188.883931 -1.900000 -3.900000 186.195871 -1.900000 -3.800000 183.527811 -1.900000 -3.700000 180.879751 -1.900000 -3.600000 178.251691 -1.900000 -3.500000 175.643631 -1.900000 -3.400000 173.055571 -1.900000 -3.300000 170.487511 -1.900000 -3.200000 167.939451 -1.900000 -3.100000 165.411391 -1.900000 -3.000000 162.903331 -1.900000 -2.900000 160.415271 -1.900000 -2.800000 157.947211 -1.900000 -2.700000 155.499151 -1.900000 -2.600000 153.071091 -1.900000 -2.500000 150.663031 -1.900000 -2.400000 148.274971 -1.900000 -2.300000 145.906911 -1.900000 -2.200000 143.558851 -1.900000 -2.100000 141.230791 -1.900000 -2.000000 138.922731 -1.900000 -1.900000 136.634671 -1.900000 -1.800000 134.366611 -1.900000 -1.700000 132.118551 -1.900000 -1.600000 129.890491 -1.900000 -1.500000 127.682431 -1.900000 -1.400000 125.494371 -1.900000 -1.300000 123.326311 -1.900000 -1.200000 121.178251 -1.900000 -1.100000 119.050191 -1.900000 -1.000000 116.942131 -1.900000 -0.900000 114.854071 -1.900000 -0.800000 112.786011 -1.900000 -0.700000 110.737951 -1.900000 -0.600000 108.709891 -1.900000 -0.500000 106.701831 -1.900000 -0.400000 104.713771 -1.900000 -0.300000 102.745711 -1.900000 -0.200000 100.797651 -1.900000 -0.100000 98.869591 -1.900000 -0.000000 96.961531 -1.900000 0.100000 95.073471 -1.900000 0.200000 93.205411 -1.900000 0.300000 91.357351 -1.900000 0.400000 89.529291 -1.900000 0.500000 87.721231 -1.900000 0.600000 85.933171 -1.900000 0.700000 84.165111 -1.900000 0.800000 82.417051 -1.900000 0.900000 80.688991 -1.900000 1.000000 78.980931 -1.900000 1.100000 77.292871 -1.900000 1.200000 75.624811 -1.900000 1.300000 73.976751 -1.900000 1.400000 72.348691 -1.900000 1.500000 70.740631 -1.900000 1.600000 69.152571 -1.900000 1.700000 67.584511 -1.900000 1.800000 66.036451 -1.900000 1.900000 64.508391 -1.900000 2.000000 63.000331 -1.900000 2.100000 61.512271 -1.900000 2.200000 60.044211 -1.900000 2.300000 58.596151 -1.900000 2.400000 57.168091 -1.900000 2.500000 55.760031 -1.900000 2.600000 54.371971 -1.900000 2.700000 53.003911 -1.900000 2.800000 51.655851 -1.900000 2.900000 50.327791 -1.900000 3.000000 49.019731 -1.900000 3.100000 47.731671 -1.900000 3.200000 46.463611 -1.900000 3.300000 45.215551 -1.900000 3.400000 43.987491 -1.900000 3.500000 42.779431 -1.900000 3.600000 41.591371 -1.900000 3.700000 40.423311 -1.900000 3.800000 39.275251 -1.900000 3.900000 38.147191 -1.900000 4.000000 37.039131 -1.900000 4.100000 35.951071 -1.900000 4.200000 34.883011 -1.900000 4.300000 33.834951 -1.900000 4.400000 32.806891 -1.900000 4.500000 31.798831 -1.900000 4.600000 30.810771 -1.900000 4.700000 29.842711 -1.900000 4.800000 28.894651 -1.900000 4.900000 27.966591 -1.900000 5.000000 27.058531 -1.900000 5.100000 26.170471 -1.900000 5.200000 25.302411 -1.900000 5.300000 24.454351 -1.900000 5.400000 23.626291 -1.900000 5.500000 22.818231 -1.900000 5.600000 22.030171 -1.900000 5.700000 21.262111 -1.900000 5.800000 20.514051 -1.900000 5.900000 19.785991 -1.900000 6.000000 19.077931 -1.900000 6.100000 18.389871 -1.900000 6.200000 17.721811 -1.900000 6.300000 17.073751 -1.900000 6.400000 16.445691 -1.900000 6.500000 15.837631 -1.900000 6.600000 15.249571 -1.900000 6.700000 14.681511 -1.900000 6.800000 14.133451 -1.900000 6.900000 13.605391 -1.900000 7.000000 13.097331 -1.900000 7.100000 12.609271 -1.900000 7.200000 12.141211 -1.900000 7.300000 11.693151 -1.900000 7.400000 11.265091 -1.900000 7.500000 10.857031 -1.900000 7.600000 10.468971 -1.900000 7.700000 10.100911 -1.900000 7.800000 9.752851 -1.900000 7.900000 9.424791 -1.900000 8.000000 9.116731 -1.900000 8.100000 8.828671 -1.900000 8.200000 8.560611 -1.900000 8.300000 8.312551 -1.900000 8.400000 8.084491 -1.900000 8.500000 7.876431 -1.900000 8.600000 7.688371 -1.900000 8.700000 7.520311 -1.900000 8.800000 7.372251 -1.900000 8.900000 7.244191 -1.900000 9.000000 7.136131 -1.900000 9.100000 7.048071 -1.900000 9.200000 6.980011 -1.900000 9.300000 6.931951 -1.900000 9.400000 6.903891 -1.900000 9.500000 6.895831 -1.900000 9.600000 6.907771 -1.900000 9.700000 6.939711 -1.900000 9.800000 6.991651 -1.900000 9.900000 7.063591 -1.900000 10.000000 7.155531 -1.900000 10.100000 7.267471 -1.900000 10.200000 7.399411 -1.900000 10.300000 7.551351 -1.900000 10.400000 7.723291 -1.900000 10.500000 7.915231 -1.900000 10.600000 8.127171 -1.900000 10.700000 8.359111 -1.900000 10.800000 8.611051 -1.900000 10.900000 8.882991 -1.900000 11.000000 9.174931 -1.900000 11.100000 9.486871 -1.900000 11.200000 9.818811 -1.900000 11.300000 10.170751 -1.900000 11.400000 10.542691 -1.900000 11.500000 10.934631 -1.900000 11.600000 11.346571 -1.900000 11.700000 11.778511 -1.900000 11.800000 12.230451 -1.900000 11.900000 12.702391 -1.900000 12.000000 13.194331 -1.900000 12.100000 13.706271 -1.900000 12.200000 14.238211 -1.900000 12.300000 14.790151 -1.900000 12.400000 15.362091 -1.900000 12.500000 15.954031 -1.900000 12.600000 16.565971 -1.900000 12.700000 17.197911 -1.900000 12.800000 17.849851 -1.900000 12.900000 18.521791 -1.900000 13.000000 19.213731 -1.900000 13.100000 19.925671 -1.900000 13.200000 20.657611 -1.900000 13.300000 21.409551 -1.900000 13.400000 22.181491 -1.900000 13.500000 22.973431 -1.900000 13.600000 23.785371 -1.900000 13.700000 24.617311 -1.900000 13.800000 25.469251 -1.900000 13.900000 26.341191 -1.900000 14.000000 27.233131 -1.900000 14.100000 28.145071 -1.900000 14.200000 29.077011 -1.900000 14.300000 30.028951 -1.900000 14.400000 31.000891 -1.900000 14.500000 31.992831 -1.900000 14.600000 33.004771 -1.900000 14.700000 34.036711 -1.900000 14.800000 35.088651 -1.900000 14.900000 36.160591 -1.900000 15.000000 37.252531 -1.800000 -5.000000 211.832375 -1.800000 -4.900000 208.985706 -1.800000 -4.800000 206.159037 -1.800000 -4.700000 203.352367 -1.800000 -4.600000 200.565698 -1.800000 -4.500000 197.799028 -1.800000 -4.400000 195.052359 -1.800000 -4.300000 192.325690 -1.800000 -4.200000 189.619020 -1.800000 -4.100000 186.932351 -1.800000 -4.000000 184.265682 -1.800000 -3.900000 181.619012 -1.800000 -3.800000 178.992343 -1.800000 -3.700000 176.385674 -1.800000 -3.600000 173.799004 -1.800000 -3.500000 171.232335 -1.800000 -3.400000 168.685666 -1.800000 -3.300000 166.158996 -1.800000 -3.200000 163.652327 -1.800000 -3.100000 161.165657 -1.800000 -3.000000 158.698988 -1.800000 -2.900000 156.252319 -1.800000 -2.800000 153.825649 -1.800000 -2.700000 151.418980 -1.800000 -2.600000 149.032311 -1.800000 -2.500000 146.665641 -1.800000 -2.400000 144.318972 -1.800000 -2.300000 141.992303 -1.800000 -2.200000 139.685633 -1.800000 -2.100000 137.398964 -1.800000 -2.000000 135.132295 -1.800000 -1.900000 132.885625 -1.800000 -1.800000 130.658956 -1.800000 -1.700000 128.452286 -1.800000 -1.600000 126.265617 -1.800000 -1.500000 124.098948 -1.800000 -1.400000 121.952278 -1.800000 -1.300000 119.825609 -1.800000 -1.200000 117.718940 -1.800000 -1.100000 115.632270 -1.800000 -1.000000 113.565601 -1.800000 -0.900000 111.518932 -1.800000 -0.800000 109.492262 -1.800000 -0.700000 107.485593 -1.800000 -0.600000 105.498924 -1.800000 -0.500000 103.532254 -1.800000 -0.400000 101.585585 -1.800000 -0.300000 99.658916 -1.800000 -0.200000 97.752246 -1.800000 -0.100000 95.865577 -1.800000 -0.000000 93.998907 -1.800000 0.100000 92.152238 -1.800000 0.200000 90.325569 -1.800000 0.300000 88.518899 -1.800000 0.400000 86.732230 -1.800000 0.500000 84.965561 -1.800000 0.600000 83.218891 -1.800000 0.700000 81.492222 -1.800000 0.800000 79.785553 -1.800000 0.900000 78.098883 -1.800000 1.000000 76.432214 -1.800000 1.100000 74.785545 -1.800000 1.200000 73.158875 -1.800000 1.300000 71.552206 -1.800000 1.400000 69.965536 -1.800000 1.500000 68.398867 -1.800000 1.600000 66.852198 -1.800000 1.700000 65.325528 -1.800000 1.800000 63.818859 -1.800000 1.900000 62.332190 -1.800000 2.000000 60.865520 -1.800000 2.100000 59.418851 -1.800000 2.200000 57.992182 -1.800000 2.300000 56.585512 -1.800000 2.400000 55.198843 -1.800000 2.500000 53.832174 -1.800000 2.600000 52.485504 -1.800000 2.700000 51.158835 -1.800000 2.800000 49.852165 -1.800000 2.900000 48.565496 -1.800000 3.000000 47.298827 -1.800000 3.100000 46.052157 -1.800000 3.200000 44.825488 -1.800000 3.300000 43.618819 -1.800000 3.400000 42.432149 -1.800000 3.500000 41.265480 -1.800000 3.600000 40.118811 -1.800000 3.700000 38.992141 -1.800000 3.800000 37.885472 -1.800000 3.900000 36.798803 -1.800000 4.000000 35.732133 -1.800000 4.100000 34.685464 -1.800000 4.200000 33.658794 -1.800000 4.300000 32.652125 -1.800000 4.400000 31.665456 -1.800000 4.500000 30.698786 -1.800000 4.600000 29.752117 -1.800000 4.700000 28.825448 -1.800000 4.800000 27.918778 -1.800000 4.900000 27.032109 -1.800000 5.000000 26.165440 -1.800000 5.100000 25.318770 -1.800000 5.200000 24.492101 -1.800000 5.300000 23.685432 -1.800000 5.400000 22.898762 -1.800000 5.500000 22.132093 -1.800000 5.600000 21.385423 -1.800000 5.700000 20.658754 -1.800000 5.800000 19.952085 -1.800000 5.900000 19.265415 -1.800000 6.000000 18.598746 -1.800000 6.100000 17.952077 -1.800000 6.200000 17.325407 -1.800000 6.300000 16.718738 -1.800000 6.400000 16.132069 -1.800000 6.500000 15.565399 -1.800000 6.600000 15.018730 -1.800000 6.700000 14.492061 -1.800000 6.800000 13.985391 -1.800000 6.900000 13.498722 -1.800000 7.000000 13.032052 -1.800000 7.100000 12.585383 -1.800000 7.200000 12.158714 -1.800000 7.300000 11.752044 -1.800000 7.400000 11.365375 -1.800000 7.500000 10.998706 -1.800000 7.600000 10.652036 -1.800000 7.700000 10.325367 -1.800000 7.800000 10.018698 -1.800000 7.900000 9.732028 -1.800000 8.000000 9.465359 -1.800000 8.100000 9.218690 -1.800000 8.200000 8.992020 -1.800000 8.300000 8.785351 -1.800000 8.400000 8.598681 -1.800000 8.500000 8.432012 -1.800000 8.600000 8.285343 -1.800000 8.700000 8.158673 -1.800000 8.800000 8.052004 -1.800000 8.900000 7.965335 -1.800000 9.000000 7.898665 -1.800000 9.100000 7.851996 -1.800000 9.200000 7.825327 -1.800000 9.300000 7.818657 -1.800000 9.400000 7.831988 -1.800000 9.500000 7.865319 -1.800000 9.600000 7.918649 -1.800000 9.700000 7.991980 -1.800000 9.800000 8.085310 -1.800000 9.900000 8.198641 -1.800000 10.000000 8.331972 -1.800000 10.100000 8.485302 -1.800000 10.200000 8.658633 -1.800000 10.300000 8.851964 -1.800000 10.400000 9.065294 -1.800000 10.500000 9.298625 -1.800000 10.600000 9.551956 -1.800000 10.700000 9.825286 -1.800000 10.800000 10.118617 -1.800000 10.900000 10.431948 -1.800000 11.000000 10.765278 -1.800000 11.100000 11.118609 -1.800000 11.200000 11.491939 -1.800000 11.300000 11.885270 -1.800000 11.400000 12.298601 -1.800000 11.500000 12.731931 -1.800000 11.600000 13.185262 -1.800000 11.700000 13.658593 -1.800000 11.800000 14.151923 -1.800000 11.900000 14.665254 -1.800000 12.000000 15.198585 -1.800000 12.100000 15.751915 -1.800000 12.200000 16.325246 -1.800000 12.300000 16.918577 -1.800000 12.400000 17.531907 -1.800000 12.500000 18.165238 -1.800000 12.600000 18.818568 -1.800000 12.700000 19.491899 -1.800000 12.800000 20.185230 -1.800000 12.900000 20.898560 -1.800000 13.000000 21.631891 -1.800000 13.100000 22.385222 -1.800000 13.200000 23.158552 -1.800000 13.300000 23.951883 -1.800000 13.400000 24.765214 -1.800000 13.500000 25.598544 -1.800000 13.600000 26.451875 -1.800000 13.700000 27.325206 -1.800000 13.800000 28.218536 -1.800000 13.900000 29.131867 -1.800000 14.000000 30.065197 -1.800000 14.100000 31.018528 -1.800000 14.200000 31.991859 -1.800000 14.300000 32.985189 -1.800000 14.400000 33.998520 -1.800000 14.500000 35.031851 -1.800000 14.600000 36.085181 -1.800000 14.700000 37.158512 -1.800000 14.800000 38.251843 -1.800000 14.900000 39.365173 -1.800000 15.000000 40.498504 -1.700000 -5.000000 206.980421 -1.700000 -4.900000 204.174626 -1.700000 -4.800000 201.388831 -1.700000 -4.700000 198.623035 -1.700000 -4.600000 195.877240 -1.700000 -4.500000 193.151444 -1.700000 -4.400000 190.445649 -1.700000 -4.300000 187.759853 -1.700000 -4.200000 185.094058 -1.700000 -4.100000 182.448262 -1.700000 -4.000000 179.822467 -1.700000 -3.900000 177.216671 -1.700000 -3.800000 174.630876 -1.700000 -3.700000 172.065081 -1.700000 -3.600000 169.519285 -1.700000 -3.500000 166.993490 -1.700000 -3.400000 164.487694 -1.700000 -3.300000 162.001899 -1.700000 -3.200000 159.536103 -1.700000 -3.100000 157.090308 -1.700000 -3.000000 154.664512 -1.700000 -2.900000 152.258717 -1.700000 -2.800000 149.872921 -1.700000 -2.700000 147.507126 -1.700000 -2.600000 145.161331 -1.700000 -2.500000 142.835535 -1.700000 -2.400000 140.529740 -1.700000 -2.300000 138.243944 -1.700000 -2.200000 135.978149 -1.700000 -2.100000 133.732353 -1.700000 -2.000000 131.506558 -1.700000 -1.900000 129.300762 -1.700000 -1.800000 127.114967 -1.700000 -1.700000 124.949172 -1.700000 -1.600000 122.803376 -1.700000 -1.500000 120.677581 -1.700000 -1.400000 118.571785 -1.700000 -1.300000 116.485990 -1.700000 -1.200000 114.420194 -1.700000 -1.100000 112.374399 -1.700000 -1.000000 110.348603 -1.700000 -0.900000 108.342808 -1.700000 -0.800000 106.357012 -1.700000 -0.700000 104.391217 -1.700000 -0.600000 102.445422 -1.700000 -0.500000 100.519626 -1.700000 -0.400000 98.613831 -1.700000 -0.300000 96.728035 -1.700000 -0.200000 94.862240 -1.700000 -0.100000 93.016444 -1.700000 -0.000000 91.190649 -1.700000 0.100000 89.384853 -1.700000 0.200000 87.599058 -1.700000 0.300000 85.833262 -1.700000 0.400000 84.087467 -1.700000 0.500000 82.361672 -1.700000 0.600000 80.655876 -1.700000 0.700000 78.970081 -1.700000 0.800000 77.304285 -1.700000 0.900000 75.658490 -1.700000 1.000000 74.032694 -1.700000 1.100000 72.426899 -1.700000 1.200000 70.841103 -1.700000 1.300000 69.275308 -1.700000 1.400000 67.729512 -1.700000 1.500000 66.203717 -1.700000 1.600000 64.697922 -1.700000 1.700000 63.212126 -1.700000 1.800000 61.746331 -1.700000 1.900000 60.300535 -1.700000 2.000000 58.874740 -1.700000 2.100000 57.468944 -1.700000 2.200000 56.083149 -1.700000 2.300000 54.717353 -1.700000 2.400000 53.371558 -1.700000 2.500000 52.045762 -1.700000 2.600000 50.739967 -1.700000 2.700000 49.454172 -1.700000 2.800000 48.188376 -1.700000 2.900000 46.942581 -1.700000 3.000000 45.716785 -1.700000 3.100000 44.510990 -1.700000 3.200000 43.325194 -1.700000 3.300000 42.159399 -1.700000 3.400000 41.013603 -1.700000 3.500000 39.887808 -1.700000 3.600000 38.782013 -1.700000 3.700000 37.696217 -1.700000 3.800000 36.630422 -1.700000 3.900000 35.584626 -1.700000 4.000000 34.558831 -1.700000 4.100000 33.553035 -1.700000 4.200000 32.567240 -1.700000 4.300000 31.601444 -1.700000 4.400000 30.655649 -1.700000 4.500000 29.729853 -1.700000 4.600000 28.824058 -1.700000 4.700000 27.938263 -1.700000 4.800000 27.072467 -1.700000 4.900000 26.226672 -1.700000 5.000000 25.400876 -1.700000 5.100000 24.595081 -1.700000 5.200000 23.809285 -1.700000 5.300000 23.043490 -1.700000 5.400000 22.297694 -1.700000 5.500000 21.571899 -1.700000 5.600000 20.866103 -1.700000 5.700000 20.180308 -1.700000 5.800000 19.514513 -1.700000 5.900000 18.868717 -1.700000 6.000000 18.242922 -1.700000 6.100000 17.637126 -1.700000 6.200000 17.051331 -1.700000 6.300000 16.485535 -1.700000 6.400000 15.939740 -1.700000 6.500000 15.413944 -1.700000 6.600000 14.908149 -1.700000 6.700000 14.422353 -1.700000 6.800000 13.956558 -1.700000 6.900000 13.510763 -1.700000 7.000000 13.084967 -1.700000 7.100000 12.679172 -1.700000 7.200000 12.293376 -1.700000 7.300000 11.927581 -1.700000 7.400000 11.581785 -1.700000 7.500000 11.255990 -1.700000 7.600000 10.950194 -1.700000 7.700000 10.664399 -1.700000 7.800000 10.398603 -1.700000 7.900000 10.152808 -1.700000 8.000000 9.927013 -1.700000 8.100000 9.721217 -1.700000 8.200000 9.535422 -1.700000 8.300000 9.369626 -1.700000 8.400000 9.223831 -1.700000 8.500000 9.098035 -1.700000 8.600000 8.992240 -1.700000 8.700000 8.906444 -1.700000 8.800000 8.840649 -1.700000 8.900000 8.794854 -1.700000 9.000000 8.769058 -1.700000 9.100000 8.763263 -1.700000 9.200000 8.777467 -1.700000 9.300000 8.811672 -1.700000 9.400000 8.865876 -1.700000 9.500000 8.940081 -1.700000 9.600000 9.034285 -1.700000 9.700000 9.148490 -1.700000 9.800000 9.282694 -1.700000 9.900000 9.436899 -1.700000 10.000000 9.611104 -1.700000 10.100000 9.805308 -1.700000 10.200000 10.019513 -1.700000 10.300000 10.253717 -1.700000 10.400000 10.507922 -1.700000 10.500000 10.782126 -1.700000 10.600000 11.076331 -1.700000 10.700000 11.390535 -1.700000 10.800000 11.724740 -1.700000 10.900000 12.078944 -1.700000 11.000000 12.453149 -1.700000 11.100000 12.847354 -1.700000 11.200000 13.261558 -1.700000 11.300000 13.695763 -1.700000 11.400000 14.149967 -1.700000 11.500000 14.624172 -1.700000 11.600000 15.118376 -1.700000 11.700000 15.632581 -1.700000 11.800000 16.166785 -1.700000 11.900000 16.720990 -1.700000 12.000000 17.295194 -1.700000 12.100000 17.889399 -1.700000 12.200000 18.503604 -1.700000 12.300000 19.137808 -1.700000 12.400000 19.792013 -1.700000 12.500000 20.466217 -1.700000 12.600000 21.160422 -1.700000 12.700000 21.874626 -1.700000 12.800000 22.608831 -1.700000 12.900000 23.363035 -1.700000 13.000000 24.137240 -1.700000 13.100000 24.931444 -1.700000 13.200000 25.745649 -1.700000 13.300000 26.579854 -1.700000 13.400000 27.434058 -1.700000 13.500000 28.308263 -1.700000 13.600000 29.202467 -1.700000 13.700000 30.116672 -1.700000 13.800000 31.050876 -1.700000 13.900000 32.005081 -1.700000 14.000000 32.979285 -1.700000 14.100000 33.973490 -1.700000 14.200000 34.987695 -1.700000 14.300000 36.021899 -1.700000 14.400000 37.076104 -1.700000 14.500000 38.150308 -1.700000 14.600000 39.244513 -1.700000 14.700000 40.358717 -1.700000 14.800000 41.492922 -1.700000 14.900000 42.647126 -1.700000 15.000000 43.821331 -1.600000 -5.000000 202.296065 -1.600000 -4.900000 199.530627 -1.600000 -4.800000 196.785188 -1.600000 -4.700000 194.059750 -1.600000 -4.600000 191.354312 -1.600000 -4.500000 188.668874 -1.600000 -4.400000 186.003435 -1.600000 -4.300000 183.357997 -1.600000 -4.200000 180.732559 -1.600000 -4.100000 178.127120 -1.600000 -4.000000 175.541682 -1.600000 -3.900000 172.976244 -1.600000 -3.800000 170.430806 -1.600000 -3.700000 167.905367 -1.600000 -3.600000 165.399929 -1.600000 -3.500000 162.914491 -1.600000 -3.400000 160.449052 -1.600000 -3.300000 158.003614 -1.600000 -3.200000 155.578176 -1.600000 -3.100000 153.172738 -1.600000 -3.000000 150.787299 -1.600000 -2.900000 148.421861 -1.600000 -2.800000 146.076423 -1.600000 -2.700000 143.750984 -1.600000 -2.600000 141.445546 -1.600000 -2.500000 139.160108 -1.600000 -2.400000 136.894670 -1.600000 -2.300000 134.649231 -1.600000 -2.200000 132.423793 -1.600000 -2.100000 130.218355 -1.600000 -2.000000 128.032916 -1.600000 -1.900000 125.867478 -1.600000 -1.800000 123.722040 -1.600000 -1.700000 121.596602 -1.600000 -1.600000 119.491163 -1.600000 -1.500000 117.405725 -1.600000 -1.400000 115.340287 -1.600000 -1.300000 113.294848 -1.600000 -1.200000 111.269410 -1.600000 -1.100000 109.263972 -1.600000 -1.000000 107.278533 -1.600000 -0.900000 105.313095 -1.600000 -0.800000 103.367657 -1.600000 -0.700000 101.442219 -1.600000 -0.600000 99.536780 -1.600000 -0.500000 97.651342 -1.600000 -0.400000 95.785904 -1.600000 -0.300000 93.940465 -1.600000 -0.200000 92.115027 -1.600000 -0.100000 90.309589 -1.600000 -0.000000 88.524151 -1.600000 0.100000 86.758712 -1.600000 0.200000 85.013274 -1.600000 0.300000 83.287836 -1.600000 0.400000 81.582397 -1.600000 0.500000 79.896959 -1.600000 0.600000 78.231521 -1.600000 0.700000 76.586083 -1.600000 0.800000 74.960644 -1.600000 0.900000 73.355206 -1.600000 1.000000 71.769768 -1.600000 1.100000 70.204329 -1.600000 1.200000 68.658891 -1.600000 1.300000 67.133453 -1.600000 1.400000 65.628015 -1.600000 1.500000 64.142576 -1.600000 1.600000 62.677138 -1.600000 1.700000 61.231700 -1.600000 1.800000 59.806261 -1.600000 1.900000 58.400823 -1.600000 2.000000 57.015385 -1.600000 2.100000 55.649947 -1.600000 2.200000 54.304508 -1.600000 2.300000 52.979070 -1.600000 2.400000 51.673632 -1.600000 2.500000 50.388193 -1.600000 2.600000 49.122755 -1.600000 2.700000 47.877317 -1.600000 2.800000 46.651879 -1.600000 2.900000 45.446440 -1.600000 3.000000 44.261002 -1.600000 3.100000 43.095564 -1.600000 3.200000 41.950125 -1.600000 3.300000 40.824687 -1.600000 3.400000 39.719249 -1.600000 3.500000 38.633811 -1.600000 3.600000 37.568372 -1.600000 3.700000 36.522934 -1.600000 3.800000 35.497496 -1.600000 3.900000 34.492057 -1.600000 4.000000 33.506619 -1.600000 4.100000 32.541181 -1.600000 4.200000 31.595743 -1.600000 4.300000 30.670304 -1.600000 4.400000 29.764866 -1.600000 4.500000 28.879428 -1.600000 4.600000 28.013989 -1.600000 4.700000 27.168551 -1.600000 4.800000 26.343113 -1.600000 4.900000 25.537675 -1.600000 5.000000 24.752236 -1.600000 5.100000 23.986798 -1.600000 5.200000 23.241360 -1.600000 5.300000 22.515921 -1.600000 5.400000 21.810483 -1.600000 5.500000 21.125045 -1.600000 5.600000 20.459607 -1.600000 5.700000 19.814168 -1.600000 5.800000 19.188730 -1.600000 5.900000 18.583292 -1.600000 6.000000 17.997853 -1.600000 6.100000 17.432415 -1.600000 6.200000 16.886977 -1.600000 6.300000 16.361539 -1.600000 6.400000 15.856100 -1.600000 6.500000 15.370662 -1.600000 6.600000 14.905224 -1.600000 6.700000 14.459785 -1.600000 6.800000 14.034347 -1.600000 6.900000 13.628909 -1.600000 7.000000 13.243471 -1.600000 7.100000 12.878032 -1.600000 7.200000 12.532594 -1.600000 7.300000 12.207156 -1.600000 7.400000 11.901717 -1.600000 7.500000 11.616279 -1.600000 7.600000 11.350841 -1.600000 7.700000 11.105403 -1.600000 7.800000 10.879964 -1.600000 7.900000 10.674526 -1.600000 8.000000 10.489088 -1.600000 8.100000 10.323649 -1.600000 8.200000 10.178211 -1.600000 8.300000 10.052773 -1.600000 8.400000 9.947335 -1.600000 8.500000 9.861896 -1.600000 8.600000 9.796458 -1.600000 8.700000 9.751020 -1.600000 8.800000 9.725581 -1.600000 8.900000 9.720143 -1.600000 9.000000 9.734705 -1.600000 9.100000 9.769267 -1.600000 9.200000 9.823828 -1.600000 9.300000 9.898390 -1.600000 9.400000 9.992952 -1.600000 9.500000 10.107513 -1.600000 9.600000 10.242075 -1.600000 9.700000 10.396637 -1.600000 9.800000 10.571199 -1.600000 9.900000 10.765760 -1.600000 10.000000 10.980322 -1.600000 10.100000 11.214884 -1.600000 10.200000 11.469445 -1.600000 10.300000 11.744007 -1.600000 10.400000 12.038569 -1.600000 10.500000 12.353131 -1.600000 10.600000 12.687692 -1.600000 10.700000 13.042254 -1.600000 10.800000 13.416816 -1.600000 10.900000 13.811377 -1.600000 11.000000 14.225939 -1.600000 11.100000 14.660501 -1.600000 11.200000 15.115063 -1.600000 11.300000 15.589624 -1.600000 11.400000 16.084186 -1.600000 11.500000 16.598748 -1.600000 11.600000 17.133309 -1.600000 11.700000 17.687871 -1.600000 11.800000 18.262433 -1.600000 11.900000 18.856995 -1.600000 12.000000 19.471556 -1.600000 12.100000 20.106118 -1.600000 12.200000 20.760680 -1.600000 12.300000 21.435241 -1.600000 12.400000 22.129803 -1.600000 12.500000 22.844365 -1.600000 12.600000 23.578927 -1.600000 12.700000 24.333488 -1.600000 12.800000 25.108050 -1.600000 12.900000 25.902612 -1.600000 13.000000 26.717173 -1.600000 13.100000 27.551735 -1.600000 13.200000 28.406297 -1.600000 13.300000 29.280859 -1.600000 13.400000 30.175420 -1.600000 13.500000 31.089982 -1.600000 13.600000 32.024544 -1.600000 13.700000 32.979105 -1.600000 13.800000 33.953667 -1.600000 13.900000 34.948229 -1.600000 14.000000 35.962791 -1.600000 14.100000 36.997352 -1.600000 14.200000 38.051914 -1.600000 14.300000 39.126476 -1.600000 14.400000 40.221037 -1.600000 14.500000 41.335599 -1.600000 14.600000 42.470161 -1.600000 14.700000 43.624723 -1.600000 14.800000 44.799284 -1.600000 14.900000 45.993846 -1.600000 15.000000 47.208408 -1.500000 -5.000000 197.766618 -1.500000 -4.900000 195.041020 -1.500000 -4.800000 192.335422 -1.500000 -4.700000 189.649824 -1.500000 -4.600000 186.984226 -1.500000 -4.500000 184.338628 -1.500000 -4.400000 181.713030 -1.500000 -4.300000 179.107433 -1.500000 -4.200000 176.521835 -1.500000 -4.100000 173.956237 -1.500000 -4.000000 171.410639 -1.500000 -3.900000 168.885041 -1.500000 -3.800000 166.379443 -1.500000 -3.700000 163.893845 -1.500000 -3.600000 161.428248 -1.500000 -3.500000 158.982650 -1.500000 -3.400000 156.557052 -1.500000 -3.300000 154.151454 -1.500000 -3.200000 151.765856 -1.500000 -3.100000 149.400258 -1.500000 -3.000000 147.054660 -1.500000 -2.900000 144.729063 -1.500000 -2.800000 142.423465 -1.500000 -2.700000 140.137867 -1.500000 -2.600000 137.872269 -1.500000 -2.500000 135.626671 -1.500000 -2.400000 133.401073 -1.500000 -2.300000 131.195475 -1.500000 -2.200000 129.009878 -1.500000 -2.100000 126.844280 -1.500000 -2.000000 124.698682 -1.500000 -1.900000 122.573084 -1.500000 -1.800000 120.467486 -1.500000 -1.700000 118.381888 -1.500000 -1.600000 116.316290 -1.500000 -1.500000 114.270693 -1.500000 -1.400000 112.245095 -1.500000 -1.300000 110.239497 -1.500000 -1.200000 108.253899 -1.500000 -1.100000 106.288301 -1.500000 -1.000000 104.342703 -1.500000 -0.900000 102.417105 -1.500000 -0.800000 100.511508 -1.500000 -0.700000 98.625910 -1.500000 -0.600000 96.760312 -1.500000 -0.500000 94.914714 -1.500000 -0.400000 93.089116 -1.500000 -0.300000 91.283518 -1.500000 -0.200000 89.497920 -1.500000 -0.100000 87.732323 -1.500000 -0.000000 85.986725 -1.500000 0.100000 84.261127 -1.500000 0.200000 82.555529 -1.500000 0.300000 80.869931 -1.500000 0.400000 79.204333 -1.500000 0.500000 77.558735 -1.500000 0.600000 75.933138 -1.500000 0.700000 74.327540 -1.500000 0.800000 72.741942 -1.500000 0.900000 71.176344 -1.500000 1.000000 69.630746 -1.500000 1.100000 68.105148 -1.500000 1.200000 66.599550 -1.500000 1.300000 65.113953 -1.500000 1.400000 63.648355 -1.500000 1.500000 62.202757 -1.500000 1.600000 60.777159 -1.500000 1.700000 59.371561 -1.500000 1.800000 57.985963 -1.500000 1.900000 56.620365 -1.500000 2.000000 55.274768 -1.500000 2.100000 53.949170 -1.500000 2.200000 52.643572 -1.500000 2.300000 51.357974 -1.500000 2.400000 50.092376 -1.500000 2.500000 48.846778 -1.500000 2.600000 47.621180 -1.500000 2.700000 46.415583 -1.500000 2.800000 45.229985 -1.500000 2.900000 44.064387 -1.500000 3.000000 42.918789 -1.500000 3.100000 41.793191 -1.500000 3.200000 40.687593 -1.500000 3.300000 39.601995 -1.500000 3.400000 38.536398 -1.500000 3.500000 37.490800 -1.500000 3.600000 36.465202 -1.500000 3.700000 35.459604 -1.500000 3.800000 34.474006 -1.500000 3.900000 33.508408 -1.500000 4.000000 32.562810 -1.500000 4.100000 31.637213 -1.500000 4.200000 30.731615 -1.500000 4.300000 29.846017 -1.500000 4.400000 28.980419 -1.500000 4.500000 28.134821 -1.500000 4.600000 27.309223 -1.500000 4.700000 26.503625 -1.500000 4.800000 25.718028 -1.500000 4.900000 24.952430 -1.500000 5.000000 24.206832 -1.500000 5.100000 23.481234 -1.500000 5.200000 22.775636 -1.500000 5.300000 22.090038 -1.500000 5.400000 21.424440 -1.500000 5.500000 20.778843 -1.500000 5.600000 20.153245 -1.500000 5.700000 19.547647 -1.500000 5.800000 18.962049 -1.500000 5.900000 18.396451 -1.500000 6.000000 17.850853 -1.500000 6.100000 17.325255 -1.500000 6.200000 16.819658 -1.500000 6.300000 16.334060 -1.500000 6.400000 15.868462 -1.500000 6.500000 15.422864 -1.500000 6.600000 14.997266 -1.500000 6.700000 14.591668 -1.500000 6.800000 14.206070 -1.500000 6.900000 13.840473 -1.500000 7.000000 13.494875 -1.500000 7.100000 13.169277 -1.500000 7.200000 12.863679 -1.500000 7.300000 12.578081 -1.500000 7.400000 12.312483 -1.500000 7.500000 12.066885 -1.500000 7.600000 11.841287 -1.500000 7.700000 11.635690 -1.500000 7.800000 11.450092 -1.500000 7.900000 11.284494 -1.500000 8.000000 11.138896 -1.500000 8.100000 11.013298 -1.500000 8.200000 10.907700 -1.500000 8.300000 10.822102 -1.500000 8.400000 10.756505 -1.500000 8.500000 10.710907 -1.500000 8.600000 10.685309 -1.500000 8.700000 10.679711 -1.500000 8.800000 10.694113 -1.500000 8.900000 10.728515 -1.500000 9.000000 10.782917 -1.500000 9.100000 10.857320 -1.500000 9.200000 10.951722 -1.500000 9.300000 11.066124 -1.500000 9.400000 11.200526 -1.500000 9.500000 11.354928 -1.500000 9.600000 11.529330 -1.500000 9.700000 11.723732 -1.500000 9.800000 11.938135 -1.500000 9.900000 12.172537 -1.500000 10.000000 12.426939 -1.500000 10.100000 12.701341 -1.500000 10.200000 12.995743 -1.500000 10.300000 13.310145 -1.500000 10.400000 13.644547 -1.500000 10.500000 13.998950 -1.500000 10.600000 14.373352 -1.500000 10.700000 14.767754 -1.500000 10.800000 15.182156 -1.500000 10.900000 15.616558 -1.500000 11.000000 16.070960 -1.500000 11.100000 16.545362 -1.500000 11.200000 17.039765 -1.500000 11.300000 17.554167 -1.500000 11.400000 18.088569 -1.500000 11.500000 18.642971 -1.500000 11.600000 19.217373 -1.500000 11.700000 19.811775 -1.500000 11.800000 20.426177 -1.500000 11.900000 21.060580 -1.500000 12.000000 21.714982 -1.500000 12.100000 22.389384 -1.500000 12.200000 23.083786 -1.500000 12.300000 23.798188 -1.500000 12.400000 24.532590 -1.500000 12.500000 25.286992 -1.500000 12.600000 26.061395 -1.500000 12.700000 26.855797 -1.500000 12.800000 27.670199 -1.500000 12.900000 28.504601 -1.500000 13.000000 29.359003 -1.500000 13.100000 30.233405 -1.500000 13.200000 31.127807 -1.500000 13.300000 32.042210 -1.500000 13.400000 32.976612 -1.500000 13.500000 33.931014 -1.500000 13.600000 34.905416 -1.500000 13.700000 35.899818 -1.500000 13.800000 36.914220 -1.500000 13.900000 37.948622 -1.500000 14.000000 39.003025 -1.500000 14.100000 40.077427 -1.500000 14.200000 41.171829 -1.500000 14.300000 42.286231 -1.500000 14.400000 43.420633 -1.500000 14.500000 44.575035 -1.500000 14.600000 45.749437 -1.500000 14.700000 46.943840 -1.500000 14.800000 48.158242 -1.500000 14.900000 49.392644 -1.500000 15.000000 50.647046 -1.400000 -5.000000 193.379403 -1.400000 -4.900000 190.693129 -1.400000 -4.800000 188.026855 -1.400000 -4.700000 185.380581 -1.400000 -4.600000 182.754307 -1.400000 -4.500000 180.148033 -1.400000 -4.400000 177.561758 -1.400000 -4.300000 174.995484 -1.400000 -4.200000 172.449210 -1.400000 -4.100000 169.922936 -1.400000 -4.000000 167.416662 -1.400000 -3.900000 164.930388 -1.400000 -3.800000 162.464113 -1.400000 -3.700000 160.017839 -1.400000 -3.600000 157.591565 -1.400000 -3.500000 155.185291 -1.400000 -3.400000 152.799017 -1.400000 -3.300000 150.432743 -1.400000 -3.200000 148.086468 -1.400000 -3.100000 145.760194 -1.400000 -3.000000 143.453920 -1.400000 -2.900000 141.167646 -1.400000 -2.800000 138.901372 -1.400000 -2.700000 136.655098 -1.400000 -2.600000 134.428823 -1.400000 -2.500000 132.222549 -1.400000 -2.400000 130.036275 -1.400000 -2.300000 127.870001 -1.400000 -2.200000 125.723727 -1.400000 -2.100000 123.597453 -1.400000 -2.000000 121.491178 -1.400000 -1.900000 119.404904 -1.400000 -1.800000 117.338630 -1.400000 -1.700000 115.292356 -1.400000 -1.600000 113.266082 -1.400000 -1.500000 111.259808 -1.400000 -1.400000 109.273533 -1.400000 -1.300000 107.307259 -1.400000 -1.200000 105.360985 -1.400000 -1.100000 103.434711 -1.400000 -1.000000 101.528437 -1.400000 -0.900000 99.642163 -1.400000 -0.800000 97.775888 -1.400000 -0.700000 95.929614 -1.400000 -0.600000 94.103340 -1.400000 -0.500000 92.297066 -1.400000 -0.400000 90.510792 -1.400000 -0.300000 88.744518 -1.400000 -0.200000 86.998243 -1.400000 -0.100000 85.271969 -1.400000 -0.000000 83.565695 -1.400000 0.100000 81.879421 -1.400000 0.200000 80.213147 -1.400000 0.300000 78.566872 -1.400000 0.400000 76.940598 -1.400000 0.500000 75.334324 -1.400000 0.600000 73.748050 -1.400000 0.700000 72.181776 -1.400000 0.800000 70.635502 -1.400000 0.900000 69.109227 -1.400000 1.000000 67.602953 -1.400000 1.100000 66.116679 -1.400000 1.200000 64.650405 -1.400000 1.300000 63.204131 -1.400000 1.400000 61.777857 -1.400000 1.500000 60.371582 -1.400000 1.600000 58.985308 -1.400000 1.700000 57.619034 -1.400000 1.800000 56.272760 -1.400000 1.900000 54.946486 -1.400000 2.000000 53.640212 -1.400000 2.100000 52.353937 -1.400000 2.200000 51.087663 -1.400000 2.300000 49.841389 -1.400000 2.400000 48.615115 -1.400000 2.500000 47.408841 -1.400000 2.600000 46.222567 -1.400000 2.700000 45.056292 -1.400000 2.800000 43.910018 -1.400000 2.900000 42.783744 -1.400000 3.000000 41.677470 -1.400000 3.100000 40.591196 -1.400000 3.200000 39.524922 -1.400000 3.300000 38.478647 -1.400000 3.400000 37.452373 -1.400000 3.500000 36.446099 -1.400000 3.600000 35.459825 -1.400000 3.700000 34.493551 -1.400000 3.800000 33.547277 -1.400000 3.900000 32.621002 -1.400000 4.000000 31.714728 -1.400000 4.100000 30.828454 -1.400000 4.200000 29.962180 -1.400000 4.300000 29.115906 -1.400000 4.400000 28.289632 -1.400000 4.500000 27.483357 -1.400000 4.600000 26.697083 -1.400000 4.700000 25.930809 -1.400000 4.800000 25.184535 -1.400000 4.900000 24.458261 -1.400000 5.000000 23.751987 -1.400000 5.100000 23.065712 -1.400000 5.200000 22.399438 -1.400000 5.300000 21.753164 -1.400000 5.400000 21.126890 -1.400000 5.500000 20.520616 -1.400000 5.600000 19.934342 -1.400000 5.700000 19.368067 -1.400000 5.800000 18.821793 -1.400000 5.900000 18.295519 -1.400000 6.000000 17.789245 -1.400000 6.100000 17.302971 -1.400000 6.200000 16.836697 -1.400000 6.300000 16.390422 -1.400000 6.400000 15.964148 -1.400000 6.500000 15.557874 -1.400000 6.600000 15.171600 -1.400000 6.700000 14.805326 -1.400000 6.800000 14.459052 -1.400000 6.900000 14.132777 -1.400000 7.000000 13.826503 -1.400000 7.100000 13.540229 -1.400000 7.200000 13.273955 -1.400000 7.300000 13.027681 -1.400000 7.400000 12.801407 -1.400000 7.500000 12.595132 -1.400000 7.600000 12.408858 -1.400000 7.700000 12.242584 -1.400000 7.800000 12.096310 -1.400000 7.900000 11.970036 -1.400000 8.000000 11.863762 -1.400000 8.100000 11.777487 -1.400000 8.200000 11.711213 -1.400000 8.300000 11.664939 -1.400000 8.400000 11.638665 -1.400000 8.500000 11.632391 -1.400000 8.600000 11.646117 -1.400000 8.700000 11.679842 -1.400000 8.800000 11.733568 -1.400000 8.900000 11.807294 -1.400000 9.000000 11.901020 -1.400000 9.100000 12.014746 -1.400000 9.200000 12.148472 -1.400000 9.300000 12.302197 -1.400000 9.400000 12.475923 -1.400000 9.500000 12.669649 -1.400000 9.600000 12.883375 -1.400000 9.700000 13.117101 -1.400000 9.800000 13.370827 -1.400000 9.900000 13.644552 -1.400000 10.000000 13.938278 -1.400000 10.100000 14.252004 -1.400000 10.200000 14.585730 -1.400000 10.300000 14.939456 -1.400000 10.400000 15.313182 -1.400000 10.500000 15.706907 -1.400000 10.600000 16.120633 -1.400000 10.700000 16.554359 -1.400000 10.800000 17.008085 -1.400000 10.900000 17.481811 -1.400000 11.000000 17.975536 -1.400000 11.100000 18.489262 -1.400000 11.200000 19.022988 -1.400000 11.300000 19.576714 -1.400000 11.400000 20.150440 -1.400000 11.500000 20.744166 -1.400000 11.600000 21.357891 -1.400000 11.700000 21.991617 -1.400000 11.800000 22.645343 -1.400000 11.900000 23.319069 -1.400000 12.000000 24.012795 -1.400000 12.100000 24.726521 -1.400000 12.200000 25.460246 -1.400000 12.300000 26.213972 -1.400000 12.400000 26.987698 -1.400000 12.500000 27.781424 -1.400000 12.600000 28.595150 -1.400000 12.700000 29.428876 -1.400000 12.800000 30.282601 -1.400000 12.900000 31.156327 -1.400000 13.000000 32.050053 -1.400000 13.100000 32.963779 -1.400000 13.200000 33.897505 -1.400000 13.300000 34.851231 -1.400000 13.400000 35.824956 -1.400000 13.500000 36.818682 -1.400000 13.600000 37.832408 -1.400000 13.700000 38.866134 -1.400000 13.800000 39.919860 -1.400000 13.900000 40.993586 -1.400000 14.000000 42.087311 -1.400000 14.100000 43.201037 -1.400000 14.200000 44.334763 -1.400000 14.300000 45.488489 -1.400000 14.400000 46.662215 -1.400000 14.500000 47.855941 -1.400000 14.600000 49.069666 -1.400000 14.700000 50.303392 -1.400000 14.800000 51.557118 -1.400000 14.900000 52.830844 -1.400000 15.000000 54.124570 -1.300000 -5.000000 189.121854 -1.300000 -4.900000 186.474387 -1.300000 -4.800000 183.846920 -1.300000 -4.700000 181.239452 -1.300000 -4.600000 178.651985 -1.300000 -4.500000 176.084518 -1.300000 -4.400000 173.537051 -1.300000 -4.300000 171.009583 -1.300000 -4.200000 168.502116 -1.300000 -4.100000 166.014649 -1.300000 -4.000000 163.547182 -1.300000 -3.900000 161.099715 -1.300000 -3.800000 158.672247 -1.300000 -3.700000 156.264780 -1.300000 -3.600000 153.877313 -1.300000 -3.500000 151.509846 -1.300000 -3.400000 149.162379 -1.300000 -3.300000 146.834911 -1.300000 -3.200000 144.527444 -1.300000 -3.100000 142.239977 -1.300000 -3.000000 139.972510 -1.300000 -2.900000 137.725042 -1.300000 -2.800000 135.497575 -1.300000 -2.700000 133.290108 -1.300000 -2.600000 131.102641 -1.300000 -2.500000 128.935174 -1.300000 -2.400000 126.787706 -1.300000 -2.300000 124.660239 -1.300000 -2.200000 122.552772 -1.300000 -2.100000 120.465305 -1.300000 -2.000000 118.397838 -1.300000 -1.900000 116.350370 -1.300000 -1.800000 114.322903 -1.300000 -1.700000 112.315436 -1.300000 -1.600000 110.327969 -1.300000 -1.500000 108.360501 -1.300000 -1.400000 106.413034 -1.300000 -1.300000 104.485567 -1.300000 -1.200000 102.578100 -1.300000 -1.100000 100.690633 -1.300000 -1.000000 98.823165 -1.300000 -0.900000 96.975698 -1.300000 -0.800000 95.148231 -1.300000 -0.700000 93.340764 -1.300000 -0.600000 91.553296 -1.300000 -0.500000 89.785829 -1.300000 -0.400000 88.038362 -1.300000 -0.300000 86.310895 -1.300000 -0.200000 84.603428 -1.300000 -0.100000 82.915960 -1.300000 -0.000000 81.248493 -1.300000 0.100000 79.601026 -1.300000 0.200000 77.973559 -1.300000 0.300000 76.366092 -1.300000 0.400000 74.778624 -1.300000 0.500000 73.211157 -1.300000 0.600000 71.663690 -1.300000 0.700000 70.136223 -1.300000 0.800000 68.628755 -1.300000 0.900000 67.141288 -1.300000 1.000000 65.673821 -1.300000 1.100000 64.226354 -1.300000 1.200000 62.798887 -1.300000 1.300000 61.391419 -1.300000 1.400000 60.003952 -1.300000 1.500000 58.636485 -1.300000 1.600000 57.289018 -1.300000 1.700000 55.961551 -1.300000 1.800000 54.654083 -1.300000 1.900000 53.366616 -1.300000 2.000000 52.099149 -1.300000 2.100000 50.851682 -1.300000 2.200000 49.624214 -1.300000 2.300000 48.416747 -1.300000 2.400000 47.229280 -1.300000 2.500000 46.061813 -1.300000 2.600000 44.914346 -1.300000 2.700000 43.786878 -1.300000 2.800000 42.679411 -1.300000 2.900000 41.591944 -1.300000 3.000000 40.524477 -1.300000 3.100000 39.477009 -1.300000 3.200000 38.449542 -1.300000 3.300000 37.442075 -1.300000 3.400000 36.454608 -1.300000 3.500000 35.487141 -1.300000 3.600000 34.539673 -1.300000 3.700000 33.612206 -1.300000 3.800000 32.704739 -1.300000 3.900000 31.817272 -1.300000 4.000000 30.949805 -1.300000 4.100000 30.102337 -1.300000 4.200000 29.274870 -1.300000 4.300000 28.467403 -1.300000 4.400000 27.679936 -1.300000 4.500000 26.912468 -1.300000 4.600000 26.165001 -1.300000 4.700000 25.437534 -1.300000 4.800000 24.730067 -1.300000 4.900000 24.042600 -1.300000 5.000000 23.375132 -1.300000 5.100000 22.727665 -1.300000 5.200000 22.100198 -1.300000 5.300000 21.492731 -1.300000 5.400000 20.905264 -1.300000 5.500000 20.337796 -1.300000 5.600000 19.790329 -1.300000 5.700000 19.262862 -1.300000 5.800000 18.755395 -1.300000 5.900000 18.267927 -1.300000 6.000000 17.800460 -1.300000 6.100000 17.352993 -1.300000 6.200000 16.925526 -1.300000 6.300000 16.518059 -1.300000 6.400000 16.130591 -1.300000 6.500000 15.763124 -1.300000 6.600000 15.415657 -1.300000 6.700000 15.088190 -1.300000 6.800000 14.780723 -1.300000 6.900000 14.493255 -1.300000 7.000000 14.225788 -1.300000 7.100000 13.978321 -1.300000 7.200000 13.750854 -1.300000 7.300000 13.543386 -1.300000 7.400000 13.355919 -1.300000 7.500000 13.188452 -1.300000 7.600000 13.040985 -1.300000 7.700000 12.913518 -1.300000 7.800000 12.806050 -1.300000 7.900000 12.718583 -1.300000 8.000000 12.651116 -1.300000 8.100000 12.603649 -1.300000 8.200000 12.576181 -1.300000 8.300000 12.568714 -1.300000 8.400000 12.581247 -1.300000 8.500000 12.613780 -1.300000 8.600000 12.666313 -1.300000 8.700000 12.738845 -1.300000 8.800000 12.831378 -1.300000 8.900000 12.943911 -1.300000 9.000000 13.076444 -1.300000 9.100000 13.228977 -1.300000 9.200000 13.401509 -1.300000 9.300000 13.594042 -1.300000 9.400000 13.806575 -1.300000 9.500000 14.039108 -1.300000 9.600000 14.291640 -1.300000 9.700000 14.564173 -1.300000 9.800000 14.856706 -1.300000 9.900000 15.169239 -1.300000 10.000000 15.501772 -1.300000 10.100000 15.854304 -1.300000 10.200000 16.226837 -1.300000 10.300000 16.619370 -1.300000 10.400000 17.031903 -1.300000 10.500000 17.464436 -1.300000 10.600000 17.916968 -1.300000 10.700000 18.389501 -1.300000 10.800000 18.882034 -1.300000 10.900000 19.394567 -1.300000 11.000000 19.927099 -1.300000 11.100000 20.479632 -1.300000 11.200000 21.052165 -1.300000 11.300000 21.644698 -1.300000 11.400000 22.257231 -1.300000 11.500000 22.889763 -1.300000 11.600000 23.542296 -1.300000 11.700000 24.214829 -1.300000 11.800000 24.907362 -1.300000 11.900000 25.619894 -1.300000 12.000000 26.352427 -1.300000 12.100000 27.104960 -1.300000 12.200000 27.877493 -1.300000 12.300000 28.670026 -1.300000 12.400000 29.482558 -1.300000 12.500000 30.315091 -1.300000 12.600000 31.167624 -1.300000 12.700000 32.040157 -1.300000 12.800000 32.932690 -1.300000 12.900000 33.845222 -1.300000 13.000000 34.777755 -1.300000 13.100000 35.730288 -1.300000 13.200000 36.702821 -1.300000 13.300000 37.695353 -1.300000 13.400000 38.707886 -1.300000 13.500000 39.740419 -1.300000 13.600000 40.792952 -1.300000 13.700000 41.865485 -1.300000 13.800000 42.958017 -1.300000 13.900000 44.070550 -1.300000 14.000000 45.203083 -1.300000 14.100000 46.355616 -1.300000 14.200000 47.528149 -1.300000 14.300000 48.720681 -1.300000 14.400000 49.933214 -1.300000 14.500000 51.165747 -1.300000 14.600000 52.418280 -1.300000 14.700000 53.690812 -1.300000 14.800000 54.983345 -1.300000 14.900000 56.295878 -1.300000 15.000000 57.628411 -1.200000 -5.000000 184.981604 -1.200000 -4.900000 182.372427 -1.200000 -4.800000 179.783250 -1.200000 -4.700000 177.214073 -1.200000 -4.600000 174.664896 -1.200000 -4.500000 172.135719 -1.200000 -4.400000 169.626542 -1.200000 -4.300000 167.137365 -1.200000 -4.200000 164.668188 -1.200000 -4.100000 162.219011 -1.200000 -4.000000 159.789834 -1.200000 -3.900000 157.380657 -1.200000 -3.800000 154.991480 -1.200000 -3.700000 152.622303 -1.200000 -3.600000 150.273126 -1.200000 -3.500000 147.943949 -1.200000 -3.400000 145.634772 -1.200000 -3.300000 143.345595 -1.200000 -3.200000 141.076418 -1.200000 -3.100000 138.827241 -1.200000 -3.000000 136.598064 -1.200000 -2.900000 134.388887 -1.200000 -2.800000 132.199710 -1.200000 -2.700000 130.030533 -1.200000 -2.600000 127.881356 -1.200000 -2.500000 125.752179 -1.200000 -2.400000 123.643002 -1.200000 -2.300000 121.553825 -1.200000 -2.200000 119.484648 -1.200000 -2.100000 117.435471 -1.200000 -2.000000 115.406294 -1.200000 -1.900000 113.397117 -1.200000 -1.800000 111.407940 -1.200000 -1.700000 109.438763 -1.200000 -1.600000 107.489586 -1.200000 -1.500000 105.560409 -1.200000 -1.400000 103.651232 -1.200000 -1.300000 101.762055 -1.200000 -1.200000 99.892878 -1.200000 -1.100000 98.043701 -1.200000 -1.000000 96.214524 -1.200000 -0.900000 94.405347 -1.200000 -0.800000 92.616170 -1.200000 -0.700000 90.846993 -1.200000 -0.600000 89.097816 -1.200000 -0.500000 87.368639 -1.200000 -0.400000 85.659462 -1.200000 -0.300000 83.970285 -1.200000 -0.200000 82.301108 -1.200000 -0.100000 80.651931 -1.200000 -0.000000 79.022754 -1.200000 0.100000 77.413577 -1.200000 0.200000 75.824400 -1.200000 0.300000 74.255223 -1.200000 0.400000 72.706046 -1.200000 0.500000 71.176869 -1.200000 0.600000 69.667692 -1.200000 0.700000 68.178515 -1.200000 0.800000 66.709338 -1.200000 0.900000 65.260161 -1.200000 1.000000 63.830984 -1.200000 1.100000 62.421807 -1.200000 1.200000 61.032630 -1.200000 1.300000 59.663453 -1.200000 1.400000 58.314276 -1.200000 1.500000 56.985099 -1.200000 1.600000 55.675922 -1.200000 1.700000 54.386745 -1.200000 1.800000 53.117568 -1.200000 1.900000 51.868391 -1.200000 2.000000 50.639214 -1.200000 2.100000 49.430037 -1.200000 2.200000 48.240860 -1.200000 2.300000 47.071683 -1.200000 2.400000 45.922506 -1.200000 2.500000 44.793329 -1.200000 2.600000 43.684152 -1.200000 2.700000 42.594975 -1.200000 2.800000 41.525798 -1.200000 2.900000 40.476621 -1.200000 3.000000 39.447444 -1.200000 3.100000 38.438267 -1.200000 3.200000 37.449090 -1.200000 3.300000 36.479913 -1.200000 3.400000 35.530736 -1.200000 3.500000 34.601559 -1.200000 3.600000 33.692382 -1.200000 3.700000 32.803205 -1.200000 3.800000 31.934028 -1.200000 3.900000 31.084851 -1.200000 4.000000 30.255674 -1.200000 4.100000 29.446497 -1.200000 4.200000 28.657320 -1.200000 4.300000 27.888143 -1.200000 4.400000 27.138966 -1.200000 4.500000 26.409789 -1.200000 4.600000 25.700612 -1.200000 4.700000 25.011435 -1.200000 4.800000 24.342258 -1.200000 4.900000 23.693081 -1.200000 5.000000 23.063904 -1.200000 5.100000 22.454727 -1.200000 5.200000 21.865550 -1.200000 5.300000 21.296373 -1.200000 5.400000 20.747196 -1.200000 5.500000 20.218019 -1.200000 5.600000 19.708842 -1.200000 5.700000 19.219665 -1.200000 5.800000 18.750488 -1.200000 5.900000 18.301311 -1.200000 6.000000 17.872134 -1.200000 6.100000 17.462957 -1.200000 6.200000 17.073780 -1.200000 6.300000 16.704603 -1.200000 6.400000 16.355426 -1.200000 6.500000 16.026249 -1.200000 6.600000 15.717072 -1.200000 6.700000 15.427895 -1.200000 6.800000 15.158718 -1.200000 6.900000 14.909541 -1.200000 7.000000 14.680364 -1.200000 7.100000 14.471187 -1.200000 7.200000 14.282010 -1.200000 7.300000 14.112833 -1.200000 7.400000 13.963656 -1.200000 7.500000 13.834479 -1.200000 7.600000 13.725302 -1.200000 7.700000 13.636125 -1.200000 7.800000 13.566948 -1.200000 7.900000 13.517771 -1.200000 8.000000 13.488594 -1.200000 8.100000 13.479417 -1.200000 8.200000 13.490240 -1.200000 8.300000 13.521063 -1.200000 8.400000 13.571886 -1.200000 8.500000 13.642709 -1.200000 8.600000 13.733532 -1.200000 8.700000 13.844355 -1.200000 8.800000 13.975178 -1.200000 8.900000 14.126001 -1.200000 9.000000 14.296824 -1.200000 9.100000 14.487647 -1.200000 9.200000 14.698470 -1.200000 9.300000 14.929293 -1.200000 9.400000 15.180116 -1.200000 9.500000 15.450939 -1.200000 9.600000 15.741762 -1.200000 9.700000 16.052585 -1.200000 9.800000 16.383408 -1.200000 9.900000 16.734231 -1.200000 10.000000 17.105054 -1.200000 10.100000 17.495877 -1.200000 10.200000 17.906700 -1.200000 10.300000 18.337523 -1.200000 10.400000 18.788346 -1.200000 10.500000 19.259169 -1.200000 10.600000 19.749992 -1.200000 10.700000 20.260815 -1.200000 10.800000 20.791638 -1.200000 10.900000 21.342461 -1.200000 11.000000 21.913284 -1.200000 11.100000 22.504107 -1.200000 11.200000 23.114930 -1.200000 11.300000 23.745753 -1.200000 11.400000 24.396576 -1.200000 11.500000 25.067399 -1.200000 11.600000 25.758222 -1.200000 11.700000 26.469045 -1.200000 11.800000 27.199868 -1.200000 11.900000 27.950691 -1.200000 12.000000 28.721514 -1.200000 12.100000 29.512337 -1.200000 12.200000 30.323160 -1.200000 12.300000 31.153983 -1.200000 12.400000 32.004806 -1.200000 12.500000 32.875629 -1.200000 12.600000 33.766452 -1.200000 12.700000 34.677275 -1.200000 12.800000 35.608098 -1.200000 12.900000 36.558921 -1.200000 13.000000 37.529744 -1.200000 13.100000 38.520567 -1.200000 13.200000 39.531390 -1.200000 13.300000 40.562213 -1.200000 13.400000 41.613036 -1.200000 13.500000 42.683859 -1.200000 13.600000 43.774682 -1.200000 13.700000 44.885505 -1.200000 13.800000 46.016328 -1.200000 13.900000 47.167151 -1.200000 14.000000 48.337974 -1.200000 14.100000 49.528797 -1.200000 14.200000 50.739620 -1.200000 14.300000 51.970443 -1.200000 14.400000 53.221266 -1.200000 14.500000 54.492089 -1.200000 14.600000 55.782912 -1.200000 14.700000 57.093735 -1.200000 14.800000 58.424558 -1.200000 14.900000 59.775381 -1.200000 15.000000 61.146204 -1.100000 -5.000000 180.946585 -1.100000 -4.900000 178.375182 -1.100000 -4.800000 175.823778 -1.100000 -4.700000 173.292375 -1.100000 -4.600000 170.780971 -1.100000 -4.500000 168.289568 -1.100000 -4.400000 165.818164 -1.100000 -4.300000 163.366760 -1.100000 -4.200000 160.935357 -1.100000 -4.100000 158.523953 -1.100000 -4.000000 156.132550 -1.100000 -3.900000 153.761146 -1.100000 -3.800000 151.409743 -1.100000 -3.700000 149.078339 -1.100000 -3.600000 146.766936 -1.100000 -3.500000 144.475532 -1.100000 -3.400000 142.204129 -1.100000 -3.300000 139.952725 -1.100000 -3.200000 137.721322 -1.100000 -3.100000 135.509918 -1.100000 -3.000000 133.318515 -1.100000 -2.900000 131.147111 -1.100000 -2.800000 128.995708 -1.100000 -2.700000 126.864304 -1.100000 -2.600000 124.752901 -1.100000 -2.500000 122.661497 -1.100000 -2.400000 120.590093 -1.100000 -2.300000 118.538690 -1.100000 -2.200000 116.507286 -1.100000 -2.100000 114.495883 -1.100000 -2.000000 112.504479 -1.100000 -1.900000 110.533076 -1.100000 -1.800000 108.581672 -1.100000 -1.700000 106.650269 -1.100000 -1.600000 104.738865 -1.100000 -1.500000 102.847462 -1.100000 -1.400000 100.976058 -1.100000 -1.300000 99.124655 -1.100000 -1.200000 97.293251 -1.100000 -1.100000 95.481848 -1.100000 -1.000000 93.690444 -1.100000 -0.900000 91.919041 -1.100000 -0.800000 90.167637 -1.100000 -0.700000 88.436234 -1.100000 -0.600000 86.724830 -1.100000 -0.500000 85.033426 -1.100000 -0.400000 83.362023 -1.100000 -0.300000 81.710619 -1.100000 -0.200000 80.079216 -1.100000 -0.100000 78.467812 -1.100000 -0.000000 76.876409 -1.100000 0.100000 75.305005 -1.100000 0.200000 73.753602 -1.100000 0.300000 72.222198 -1.100000 0.400000 70.710795 -1.100000 0.500000 69.219391 -1.100000 0.600000 67.747988 -1.100000 0.700000 66.296584 -1.100000 0.800000 64.865181 -1.100000 0.900000 63.453777 -1.100000 1.000000 62.062374 -1.100000 1.100000 60.690970 -1.100000 1.200000 59.339567 -1.100000 1.300000 58.008163 -1.100000 1.400000 56.696759 -1.100000 1.500000 55.405356 -1.100000 1.600000 54.133952 -1.100000 1.700000 52.882549 -1.100000 1.800000 51.651145 -1.100000 1.900000 50.439742 -1.100000 2.000000 49.248338 -1.100000 2.100000 48.076935 -1.100000 2.200000 46.925531 -1.100000 2.300000 45.794128 -1.100000 2.400000 44.682724 -1.100000 2.500000 43.591321 -1.100000 2.600000 42.519917 -1.100000 2.700000 41.468514 -1.100000 2.800000 40.437110 -1.100000 2.900000 39.425707 -1.100000 3.000000 38.434303 -1.100000 3.100000 37.462900 -1.100000 3.200000 36.511496 -1.100000 3.300000 35.580092 -1.100000 3.400000 34.668689 -1.100000 3.500000 33.777285 -1.100000 3.600000 32.905882 -1.100000 3.700000 32.054478 -1.100000 3.800000 31.223075 -1.100000 3.900000 30.411671 -1.100000 4.000000 29.620268 -1.100000 4.100000 28.848864 -1.100000 4.200000 28.097461 -1.100000 4.300000 27.366057 -1.100000 4.400000 26.654654 -1.100000 4.500000 25.963250 -1.100000 4.600000 25.291847 -1.100000 4.700000 24.640443 -1.100000 4.800000 24.009040 -1.100000 4.900000 23.397636 -1.100000 5.000000 22.806233 -1.100000 5.100000 22.234829 -1.100000 5.200000 21.683426 -1.100000 5.300000 21.152022 -1.100000 5.400000 20.640618 -1.100000 5.500000 20.149215 -1.100000 5.600000 19.677811 -1.100000 5.700000 19.226408 -1.100000 5.800000 18.795004 -1.100000 5.900000 18.383601 -1.100000 6.000000 17.992197 -1.100000 6.100000 17.620794 -1.100000 6.200000 17.269390 -1.100000 6.300000 16.937987 -1.100000 6.400000 16.626583 -1.100000 6.500000 16.335180 -1.100000 6.600000 16.063776 -1.100000 6.700000 15.812373 -1.100000 6.800000 15.580969 -1.100000 6.900000 15.369566 -1.100000 7.000000 15.178162 -1.100000 7.100000 15.006759 -1.100000 7.200000 14.855355 -1.100000 7.300000 14.723951 -1.100000 7.400000 14.612548 -1.100000 7.500000 14.521144 -1.100000 7.600000 14.449741 -1.100000 7.700000 14.398337 -1.100000 7.800000 14.366934 -1.100000 7.900000 14.355530 -1.100000 8.000000 14.364127 -1.100000 8.100000 14.392723 -1.100000 8.200000 14.441320 -1.100000 8.300000 14.509916 -1.100000 8.400000 14.598513 -1.100000 8.500000 14.707109 -1.100000 8.600000 14.835706 -1.100000 8.700000 14.984302 -1.100000 8.800000 15.152899 -1.100000 8.900000 15.341495 -1.100000 9.000000 15.550092 -1.100000 9.100000 15.778688 -1.100000 9.200000 16.027284 -1.100000 9.300000 16.295881 -1.100000 9.400000 16.584477 -1.100000 9.500000 16.893074 -1.100000 9.600000 17.221670 -1.100000 9.700000 17.570267 -1.100000 9.800000 17.938863 -1.100000 9.900000 18.327460 -1.100000 10.000000 18.736056 -1.100000 10.100000 19.164653 -1.100000 10.200000 19.613249 -1.100000 10.300000 20.081846 -1.100000 10.400000 20.570442 -1.100000 10.500000 21.079039 -1.100000 10.600000 21.607635 -1.100000 10.700000 22.156232 -1.100000 10.800000 22.724828 -1.100000 10.900000 23.313425 -1.100000 11.000000 23.922021 -1.100000 11.100000 24.550617 -1.100000 11.200000 25.199214 -1.100000 11.300000 25.867810 -1.100000 11.400000 26.556407 -1.100000 11.500000 27.265003 -1.100000 11.600000 27.993600 -1.100000 11.700000 28.742196 -1.100000 11.800000 29.510793 -1.100000 11.900000 30.299389 -1.100000 12.000000 31.107986 -1.100000 12.100000 31.936582 -1.100000 12.200000 32.785179 -1.100000 12.300000 33.653775 -1.100000 12.400000 34.542372 -1.100000 12.500000 35.450968 -1.100000 12.600000 36.379565 -1.100000 12.700000 37.328161 -1.100000 12.800000 38.296758 -1.100000 12.900000 39.285354 -1.100000 13.000000 40.293950 -1.100000 13.100000 41.322547 -1.100000 13.200000 42.371143 -1.100000 13.300000 43.439740 -1.100000 13.400000 44.528336 -1.100000 13.500000 45.636933 -1.100000 13.600000 46.765529 -1.100000 13.700000 47.914126 -1.100000 13.800000 49.082722 -1.100000 13.900000 50.271319 -1.100000 14.000000 51.479915 -1.100000 14.100000 52.708512 -1.100000 14.200000 53.957108 -1.100000 14.300000 55.225705 -1.100000 14.400000 56.514301 -1.100000 14.500000 57.822898 -1.100000 14.600000 59.151494 -1.100000 14.700000 60.500091 -1.100000 14.800000 61.868687 -1.100000 14.900000 63.257283 -1.100000 15.000000 64.665880 -1.000000 -5.000000 177.005116 -1.000000 -4.900000 174.470969 -1.000000 -4.800000 171.956822 -1.000000 -4.700000 169.462675 -1.000000 -4.600000 166.988528 -1.000000 -4.500000 164.534382 -1.000000 -4.400000 162.100235 -1.000000 -4.300000 159.686088 -1.000000 -4.200000 157.291941 -1.000000 -4.100000 154.917794 -1.000000 -4.000000 152.563648 -1.000000 -3.900000 150.229501 -1.000000 -3.800000 147.915354 -1.000000 -3.700000 145.621207 -1.000000 -3.600000 143.347061 -1.000000 -3.500000 141.092914 -1.000000 -3.400000 138.858767 -1.000000 -3.300000 136.644620 -1.000000 -3.200000 134.450473 -1.000000 -3.100000 132.276327 -1.000000 -3.000000 130.122180 -1.000000 -2.900000 127.988033 -1.000000 -2.800000 125.873886 -1.000000 -2.700000 123.779739 -1.000000 -2.600000 121.705593 -1.000000 -2.500000 119.651446 -1.000000 -2.400000 117.617299 -1.000000 -2.300000 115.603152 -1.000000 -2.200000 113.609006 -1.000000 -2.100000 111.634859 -1.000000 -2.000000 109.680712 -1.000000 -1.900000 107.746565 -1.000000 -1.800000 105.832418 -1.000000 -1.700000 103.938272 -1.000000 -1.600000 102.064125 -1.000000 -1.500000 100.209978 -1.000000 -1.400000 98.375831 -1.000000 -1.300000 96.561684 -1.000000 -1.200000 94.767538 -1.000000 -1.100000 92.993391 -1.000000 -1.000000 91.239244 -1.000000 -0.900000 89.505097 -1.000000 -0.800000 87.790950 -1.000000 -0.700000 86.096804 -1.000000 -0.600000 84.422657 -1.000000 -0.500000 82.768510 -1.000000 -0.400000 81.134363 -1.000000 -0.300000 79.520217 -1.000000 -0.200000 77.926070 -1.000000 -0.100000 76.351923 -1.000000 -0.000000 74.797776 -1.000000 0.100000 73.263629 -1.000000 0.200000 71.749483 -1.000000 0.300000 70.255336 -1.000000 0.400000 68.781189 -1.000000 0.500000 67.327042 -1.000000 0.600000 65.892895 -1.000000 0.700000 64.478749 -1.000000 0.800000 63.084602 -1.000000 0.900000 61.710455 -1.000000 1.000000 60.356308 -1.000000 1.100000 59.022162 -1.000000 1.200000 57.708015 -1.000000 1.300000 56.413868 -1.000000 1.400000 55.139721 -1.000000 1.500000 53.885574 -1.000000 1.600000 52.651428 -1.000000 1.700000 51.437281 -1.000000 1.800000 50.243134 -1.000000 1.900000 49.068987 -1.000000 2.000000 47.914840 -1.000000 2.100000 46.780694 -1.000000 2.200000 45.666547 -1.000000 2.300000 44.572400 -1.000000 2.400000 43.498253 -1.000000 2.500000 42.444106 -1.000000 2.600000 41.409960 -1.000000 2.700000 40.395813 -1.000000 2.800000 39.401666 -1.000000 2.900000 38.427519 -1.000000 3.000000 37.473373 -1.000000 3.100000 36.539226 -1.000000 3.200000 35.625079 -1.000000 3.300000 34.730932 -1.000000 3.400000 33.856785 -1.000000 3.500000 33.002639 -1.000000 3.600000 32.168492 -1.000000 3.700000 31.354345 -1.000000 3.800000 30.560198 -1.000000 3.900000 29.786051 -1.000000 4.000000 29.031905 -1.000000 4.100000 28.297758 -1.000000 4.200000 27.583611 -1.000000 4.300000 26.889464 -1.000000 4.400000 26.215318 -1.000000 4.500000 25.561171 -1.000000 4.600000 24.927024 -1.000000 4.700000 24.312877 -1.000000 4.800000 23.718730 -1.000000 4.900000 23.144584 -1.000000 5.000000 22.590437 -1.000000 5.100000 22.056290 -1.000000 5.200000 21.542143 -1.000000 5.300000 21.047996 -1.000000 5.400000 20.573850 -1.000000 5.500000 20.119703 -1.000000 5.600000 19.685556 -1.000000 5.700000 19.271409 -1.000000 5.800000 18.877262 -1.000000 5.900000 18.503116 -1.000000 6.000000 18.148969 -1.000000 6.100000 17.814822 -1.000000 6.200000 17.500675 -1.000000 6.300000 17.206529 -1.000000 6.400000 16.932382 -1.000000 6.500000 16.678235 -1.000000 6.600000 16.444088 -1.000000 6.700000 16.229941 -1.000000 6.800000 16.035795 -1.000000 6.900000 15.861648 -1.000000 7.000000 15.707501 -1.000000 7.100000 15.573354 -1.000000 7.200000 15.459207 -1.000000 7.300000 15.365061 -1.000000 7.400000 15.290914 -1.000000 7.500000 15.236767 -1.000000 7.600000 15.202620 -1.000000 7.700000 15.188473 -1.000000 7.800000 15.194327 -1.000000 7.900000 15.220180 -1.000000 8.000000 15.266033 -1.000000 8.100000 15.331886 -1.000000 8.200000 15.417740 -1.000000 8.300000 15.523593 -1.000000 8.400000 15.649446 -1.000000 8.500000 15.795299 -1.000000 8.600000 15.961152 -1.000000 8.700000 16.147006 -1.000000 8.800000 16.352859 -1.000000 8.900000 16.578712 -1.000000 9.000000 16.824565 -1.000000 9.100000 17.090418 -1.000000 9.200000 17.376272 -1.000000 9.300000 17.682125 -1.000000 9.400000 18.007978 -1.000000 9.500000 18.353831 -1.000000 9.600000 18.719685 -1.000000 9.700000 19.105538 -1.000000 9.800000 19.511391 -1.000000 9.900000 19.937244 -1.000000 10.000000 20.383097 -1.000000 10.100000 20.848951 -1.000000 10.200000 21.334804 -1.000000 10.300000 21.840657 -1.000000 10.400000 22.366510 -1.000000 10.500000 22.912363 -1.000000 10.600000 23.478217 -1.000000 10.700000 24.064070 -1.000000 10.800000 24.669923 -1.000000 10.900000 25.295776 -1.000000 11.000000 25.941629 -1.000000 11.100000 26.607483 -1.000000 11.200000 27.293336 -1.000000 11.300000 27.999189 -1.000000 11.400000 28.725042 -1.000000 11.500000 29.470896 -1.000000 11.600000 30.236749 -1.000000 11.700000 31.022602 -1.000000 11.800000 31.828455 -1.000000 11.900000 32.654308 -1.000000 12.000000 33.500162 -1.000000 12.100000 34.366015 -1.000000 12.200000 35.251868 -1.000000 12.300000 36.157721 -1.000000 12.400000 37.083574 -1.000000 12.500000 38.029428 -1.000000 12.600000 38.995281 -1.000000 12.700000 39.981134 -1.000000 12.800000 40.986987 -1.000000 12.900000 42.012841 -1.000000 13.000000 43.058694 -1.000000 13.100000 44.124547 -1.000000 13.200000 45.210400 -1.000000 13.300000 46.316253 -1.000000 13.400000 47.442107 -1.000000 13.500000 48.587960 -1.000000 13.600000 49.753813 -1.000000 13.700000 50.939666 -1.000000 13.800000 52.145519 -1.000000 13.900000 53.371373 -1.000000 14.000000 54.617226 -1.000000 14.100000 55.883079 -1.000000 14.200000 57.168932 -1.000000 14.300000 58.474785 -1.000000 14.400000 59.800639 -1.000000 14.500000 61.146492 -1.000000 14.600000 62.512345 -1.000000 14.700000 63.898198 -1.000000 14.800000 65.304052 -1.000000 14.900000 66.729905 -1.000000 15.000000 68.175758 -0.900000 -5.000000 173.145989 -0.900000 -4.900000 170.648582 -0.900000 -4.800000 168.171175 -0.900000 -4.700000 165.713769 -0.900000 -4.600000 163.276362 -0.900000 -4.500000 160.858955 -0.900000 -4.400000 158.461548 -0.900000 -4.300000 156.084141 -0.900000 -4.200000 153.726735 -0.900000 -4.100000 151.389328 -0.900000 -4.000000 149.071921 -0.900000 -3.900000 146.774514 -0.900000 -3.800000 144.497107 -0.900000 -3.700000 142.239701 -0.900000 -3.600000 140.002294 -0.900000 -3.500000 137.784887 -0.900000 -3.400000 135.587480 -0.900000 -3.300000 133.410074 -0.900000 -3.200000 131.252667 -0.900000 -3.100000 129.115260 -0.900000 -3.000000 126.997853 -0.900000 -2.900000 124.900446 -0.900000 -2.800000 122.823040 -0.900000 -2.700000 120.765633 -0.900000 -2.600000 118.728226 -0.900000 -2.500000 116.710819 -0.900000 -2.400000 114.713412 -0.900000 -2.300000 112.736006 -0.900000 -2.200000 110.778599 -0.900000 -2.100000 108.841192 -0.900000 -2.000000 106.923785 -0.900000 -1.900000 105.026379 -0.900000 -1.800000 103.148972 -0.900000 -1.700000 101.291565 -0.900000 -1.600000 99.454158 -0.900000 -1.500000 97.636751 -0.900000 -1.400000 95.839345 -0.900000 -1.300000 94.061938 -0.900000 -1.200000 92.304531 -0.900000 -1.100000 90.567124 -0.900000 -1.000000 88.849717 -0.900000 -0.900000 87.152311 -0.900000 -0.800000 85.474904 -0.900000 -0.700000 83.817497 -0.900000 -0.600000 82.180090 -0.900000 -0.500000 80.562683 -0.900000 -0.400000 78.965277 -0.900000 -0.300000 77.387870 -0.900000 -0.200000 75.830463 -0.900000 -0.100000 74.293056 -0.900000 -0.000000 72.775650 -0.900000 0.100000 71.278243 -0.900000 0.200000 69.800836 -0.900000 0.300000 68.343429 -0.900000 0.400000 66.906022 -0.900000 0.500000 65.488616 -0.900000 0.600000 64.091209 -0.900000 0.700000 62.713802 -0.900000 0.800000 61.356395 -0.900000 0.900000 60.018988 -0.900000 1.000000 58.701582 -0.900000 1.100000 57.404175 -0.900000 1.200000 56.126768 -0.900000 1.300000 54.869361 -0.900000 1.400000 53.631955 -0.900000 1.500000 52.414548 -0.900000 1.600000 51.217141 -0.900000 1.700000 50.039734 -0.900000 1.800000 48.882327 -0.900000 1.900000 47.744921 -0.900000 2.000000 46.627514 -0.900000 2.100000 45.530107 -0.900000 2.200000 44.452700 -0.900000 2.300000 43.395293 -0.900000 2.400000 42.357887 -0.900000 2.500000 41.340480 -0.900000 2.600000 40.343073 -0.900000 2.700000 39.365666 -0.900000 2.800000 38.408259 -0.900000 2.900000 37.470853 -0.900000 3.000000 36.553446 -0.900000 3.100000 35.656039 -0.900000 3.200000 34.778632 -0.900000 3.300000 33.921226 -0.900000 3.400000 33.083819 -0.900000 3.500000 32.266412 -0.900000 3.600000 31.469005 -0.900000 3.700000 30.691598 -0.900000 3.800000 29.934192 -0.900000 3.900000 29.196785 -0.900000 4.000000 28.479378 -0.900000 4.100000 27.781971 -0.900000 4.200000 27.104564 -0.900000 4.300000 26.447158 -0.900000 4.400000 25.809751 -0.900000 4.500000 25.192344 -0.900000 4.600000 24.594937 -0.900000 4.700000 24.017531 -0.900000 4.800000 23.460124 -0.900000 4.900000 22.922717 -0.900000 5.000000 22.405310 -0.900000 5.100000 21.907903 -0.900000 5.200000 21.430497 -0.900000 5.300000 20.973090 -0.900000 5.400000 20.535683 -0.900000 5.500000 20.118276 -0.900000 5.600000 19.720869 -0.900000 5.700000 19.343463 -0.900000 5.800000 18.986056 -0.900000 5.900000 18.648649 -0.900000 6.000000 18.331242 -0.900000 6.100000 18.033835 -0.900000 6.200000 17.756429 -0.900000 6.300000 17.499022 -0.900000 6.400000 17.261615 -0.900000 6.500000 17.044208 -0.900000 6.600000 16.846802 -0.900000 6.700000 16.669395 -0.900000 6.800000 16.511988 -0.900000 6.900000 16.374581 -0.900000 7.000000 16.257174 -0.900000 7.100000 16.159768 -0.900000 7.200000 16.082361 -0.900000 7.300000 16.024954 -0.900000 7.400000 15.987547 -0.900000 7.500000 15.970140 -0.900000 7.600000 15.972734 -0.900000 7.700000 15.995327 -0.900000 7.800000 16.037920 -0.900000 7.900000 16.100513 -0.900000 8.000000 16.183107 -0.900000 8.100000 16.285700 -0.900000 8.200000 16.408293 -0.900000 8.300000 16.550886 -0.900000 8.400000 16.713479 -0.900000 8.500000 16.896073 -0.900000 8.600000 17.098666 -0.900000 8.700000 17.321259 -0.900000 8.800000 17.563852 -0.900000 8.900000 17.826445 -0.900000 9.000000 18.109039 -0.900000 9.100000 18.411632 -0.900000 9.200000 18.734225 -0.900000 9.300000 19.076818 -0.900000 9.400000 19.439411 -0.900000 9.500000 19.822005 -0.900000 9.600000 20.224598 -0.900000 9.700000 20.647191 -0.900000 9.800000 21.089784 -0.900000 9.900000 21.552378 -0.900000 10.000000 22.034971 -0.900000 10.100000 22.537564 -0.900000 10.200000 23.060157 -0.900000 10.300000 23.602750 -0.900000 10.400000 24.165344 -0.900000 10.500000 24.747937 -0.900000 10.600000 25.350530 -0.900000 10.700000 25.973123 -0.900000 10.800000 26.615716 -0.900000 10.900000 27.278310 -0.900000 11.000000 27.960903 -0.900000 11.100000 28.663496 -0.900000 11.200000 29.386089 -0.900000 11.300000 30.128683 -0.900000 11.400000 30.891276 -0.900000 11.500000 31.673869 -0.900000 11.600000 32.476462 -0.900000 11.700000 33.299055 -0.900000 11.800000 34.141649 -0.900000 11.900000 35.004242 -0.900000 12.000000 35.886835 -0.900000 12.100000 36.789428 -0.900000 12.200000 37.712021 -0.900000 12.300000 38.654615 -0.900000 12.400000 39.617208 -0.900000 12.500000 40.599801 -0.900000 12.600000 41.602394 -0.900000 12.700000 42.624987 -0.900000 12.800000 43.667581 -0.900000 12.900000 44.730174 -0.900000 13.000000 45.812767 -0.900000 13.100000 46.915360 -0.900000 13.200000 48.037954 -0.900000 13.300000 49.180547 -0.900000 13.400000 50.343140 -0.900000 13.500000 51.525733 -0.900000 13.600000 52.728326 -0.900000 13.700000 53.950920 -0.900000 13.800000 55.193513 -0.900000 13.900000 56.456106 -0.900000 14.000000 57.738699 -0.900000 14.100000 59.041292 -0.900000 14.200000 60.363886 -0.900000 14.300000 61.706479 -0.900000 14.400000 63.069072 -0.900000 14.500000 64.451665 -0.900000 14.600000 65.854258 -0.900000 14.700000 67.276852 -0.900000 14.800000 68.719445 -0.900000 14.900000 70.182038 -0.900000 15.000000 71.664631 -0.800000 -5.000000 169.358557 -0.800000 -4.900000 166.897373 -0.800000 -4.800000 164.456190 -0.800000 -4.700000 162.035006 -0.800000 -4.600000 159.633823 -0.800000 -4.500000 157.252639 -0.800000 -4.400000 154.891456 -0.800000 -4.300000 152.550272 -0.800000 -4.200000 150.229089 -0.800000 -4.100000 147.927905 -0.800000 -4.000000 145.646722 -0.800000 -3.900000 143.385538 -0.800000 -3.800000 141.144354 -0.800000 -3.700000 138.923171 -0.800000 -3.600000 136.721987 -0.800000 -3.500000 134.540804 -0.800000 -3.400000 132.379620 -0.800000 -3.300000 130.238437 -0.800000 -3.200000 128.117253 -0.800000 -3.100000 126.016070 -0.800000 -3.000000 123.934886 -0.800000 -2.900000 121.873703 -0.800000 -2.800000 119.832519 -0.800000 -2.700000 117.811336 -0.800000 -2.600000 115.810152 -0.800000 -2.500000 113.828969 -0.800000 -2.400000 111.867785 -0.800000 -2.300000 109.926602 -0.800000 -2.200000 108.005418 -0.800000 -2.100000 106.104235 -0.800000 -2.000000 104.223051 -0.800000 -1.900000 102.361867 -0.800000 -1.800000 100.520684 -0.800000 -1.700000 98.699500 -0.800000 -1.600000 96.898317 -0.800000 -1.500000 95.117133 -0.800000 -1.400000 93.355950 -0.800000 -1.300000 91.614766 -0.800000 -1.200000 89.893583 -0.800000 -1.100000 88.192399 -0.800000 -1.000000 86.511216 -0.800000 -0.900000 84.850032 -0.800000 -0.800000 83.208849 -0.800000 -0.700000 81.587665 -0.800000 -0.600000 79.986482 -0.800000 -0.500000 78.405298 -0.800000 -0.400000 76.844115 -0.800000 -0.300000 75.302931 -0.800000 -0.200000 73.781748 -0.800000 -0.100000 72.280564 -0.800000 -0.000000 70.799380 -0.800000 0.100000 69.338197 -0.800000 0.200000 67.897013 -0.800000 0.300000 66.475830 -0.800000 0.400000 65.074646 -0.800000 0.500000 63.693463 -0.800000 0.600000 62.332279 -0.800000 0.700000 60.991096 -0.800000 0.800000 59.669912 -0.800000 0.900000 58.368729 -0.800000 1.000000 57.087545 -0.800000 1.100000 55.826362 -0.800000 1.200000 54.585178 -0.800000 1.300000 53.363995 -0.800000 1.400000 52.162811 -0.800000 1.500000 50.981628 -0.800000 1.600000 49.820444 -0.800000 1.700000 48.679261 -0.800000 1.800000 47.558077 -0.800000 1.900000 46.456893 -0.800000 2.000000 45.375710 -0.800000 2.100000 44.314526 -0.800000 2.200000 43.273343 -0.800000 2.300000 42.252159 -0.800000 2.400000 41.250976 -0.800000 2.500000 40.269792 -0.800000 2.600000 39.308609 -0.800000 2.700000 38.367425 -0.800000 2.800000 37.446242 -0.800000 2.900000 36.545058 -0.800000 3.000000 35.663875 -0.800000 3.100000 34.802691 -0.800000 3.200000 33.961508 -0.800000 3.300000 33.140324 -0.800000 3.400000 32.339141 -0.800000 3.500000 31.557957 -0.800000 3.600000 30.796774 -0.800000 3.700000 30.055590 -0.800000 3.800000 29.334406 -0.800000 3.900000 28.633223 -0.800000 4.000000 27.952039 -0.800000 4.100000 27.290856 -0.800000 4.200000 26.649672 -0.800000 4.300000 26.028489 -0.800000 4.400000 25.427305 -0.800000 4.500000 24.846122 -0.800000 4.600000 24.284938 -0.800000 4.700000 23.743755 -0.800000 4.800000 23.222571 -0.800000 4.900000 22.721388 -0.800000 5.000000 22.240204 -0.800000 5.100000 21.779021 -0.800000 5.200000 21.337837 -0.800000 5.300000 20.916654 -0.800000 5.400000 20.515470 -0.800000 5.500000 20.134287 -0.800000 5.600000 19.773103 -0.800000 5.700000 19.431920 -0.800000 5.800000 19.110736 -0.800000 5.900000 18.809552 -0.800000 6.000000 18.528369 -0.800000 6.100000 18.267185 -0.800000 6.200000 18.026002 -0.800000 6.300000 17.804818 -0.800000 6.400000 17.603635 -0.800000 6.500000 17.422451 -0.800000 6.600000 17.261268 -0.800000 6.700000 17.120084 -0.800000 6.800000 16.998901 -0.800000 6.900000 16.897717 -0.800000 7.000000 16.816534 -0.800000 7.100000 16.755350 -0.800000 7.200000 16.714167 -0.800000 7.300000 16.692983 -0.800000 7.400000 16.691800 -0.800000 7.500000 16.710616 -0.800000 7.600000 16.749433 -0.800000 7.700000 16.808249 -0.800000 7.800000 16.887065 -0.800000 7.900000 16.985882 -0.800000 8.000000 17.104698 -0.800000 8.100000 17.243515 -0.800000 8.200000 17.402331 -0.800000 8.300000 17.581148 -0.800000 8.400000 17.779964 -0.800000 8.500000 17.998781 -0.800000 8.600000 18.237597 -0.800000 8.700000 18.496414 -0.800000 8.800000 18.775230 -0.800000 8.900000 19.074047 -0.800000 9.000000 19.392863 -0.800000 9.100000 19.731680 -0.800000 9.200000 20.090496 -0.800000 9.300000 20.469313 -0.800000 9.400000 20.868129 -0.800000 9.500000 21.286946 -0.800000 9.600000 21.725762 -0.800000 9.700000 22.184578 -0.800000 9.800000 22.663395 -0.800000 9.900000 23.162211 -0.800000 10.000000 23.681028 -0.800000 10.100000 24.219844 -0.800000 10.200000 24.778661 -0.800000 10.300000 25.357477 -0.800000 10.400000 25.956294 -0.800000 10.500000 26.575110 -0.800000 10.600000 27.213927 -0.800000 10.700000 27.872743 -0.800000 10.800000 28.551560 -0.800000 10.900000 29.250376 -0.800000 11.000000 29.969193 -0.800000 11.100000 30.708009 -0.800000 11.200000 31.466826 -0.800000 11.300000 32.245642 -0.800000 11.400000 33.044459 -0.800000 11.500000 33.863275 -0.800000 11.600000 34.702091 -0.800000 11.700000 35.560908 -0.800000 11.800000 36.439724 -0.800000 11.900000 37.338541 -0.800000 12.000000 38.257357 -0.800000 12.100000 39.196174 -0.800000 12.200000 40.154990 -0.800000 12.300000 41.133807 -0.800000 12.400000 42.132623 -0.800000 12.500000 43.151440 -0.800000 12.600000 44.190256 -0.800000 12.700000 45.249073 -0.800000 12.800000 46.327889 -0.800000 12.900000 47.426706 -0.800000 13.000000 48.545522 -0.800000 13.100000 49.684339 -0.800000 13.200000 50.843155 -0.800000 13.300000 52.021972 -0.800000 13.400000 53.220788 -0.800000 13.500000 54.439604 -0.800000 13.600000 55.678421 -0.800000 13.700000 56.937237 -0.800000 13.800000 58.216054 -0.800000 13.900000 59.514870 -0.800000 14.000000 60.833687 -0.800000 14.100000 62.172503 -0.800000 14.200000 63.531320 -0.800000 14.300000 64.910136 -0.800000 14.400000 66.308953 -0.800000 14.500000 67.727769 -0.800000 14.600000 69.166586 -0.800000 14.700000 70.625402 -0.800000 14.800000 72.104219 -0.800000 14.900000 73.603035 -0.800000 15.000000 75.121852 -0.700000 -5.000000 165.632807 -0.700000 -4.900000 163.207330 -0.700000 -4.800000 160.801853 -0.700000 -4.700000 158.416376 -0.700000 -4.600000 156.050899 -0.700000 -4.500000 153.705422 -0.700000 -4.400000 151.379945 -0.700000 -4.300000 149.074468 -0.700000 -4.200000 146.788991 -0.700000 -4.100000 144.523514 -0.700000 -4.000000 142.278037 -0.700000 -3.900000 140.052560 -0.700000 -3.800000 137.847083 -0.700000 -3.700000 135.661606 -0.700000 -3.600000 133.496129 -0.700000 -3.500000 131.350652 -0.700000 -3.400000 129.225175 -0.700000 -3.300000 127.119698 -0.700000 -3.200000 125.034221 -0.700000 -3.100000 122.968744 -0.700000 -3.000000 120.923267 -0.700000 -2.900000 118.897789 -0.700000 -2.800000 116.892312 -0.700000 -2.700000 114.906835 -0.700000 -2.600000 112.941358 -0.700000 -2.500000 110.995881 -0.700000 -2.400000 109.070404 -0.700000 -2.300000 107.164927 -0.700000 -2.200000 105.279450 -0.700000 -2.100000 103.413973 -0.700000 -2.000000 101.568496 -0.700000 -1.900000 99.743019 -0.700000 -1.800000 97.937542 -0.700000 -1.700000 96.152065 -0.700000 -1.600000 94.386588 -0.700000 -1.500000 92.641111 -0.700000 -1.400000 90.915634 -0.700000 -1.300000 89.210157 -0.700000 -1.200000 87.524680 -0.700000 -1.100000 85.859203 -0.700000 -1.000000 84.213726 -0.700000 -0.900000 82.588249 -0.700000 -0.800000 80.982772 -0.700000 -0.700000 79.397295 -0.700000 -0.600000 77.831818 -0.700000 -0.500000 76.286341 -0.700000 -0.400000 74.760864 -0.700000 -0.300000 73.255387 -0.700000 -0.200000 71.769910 -0.700000 -0.100000 70.304433 -0.700000 -0.000000 68.858956 -0.700000 0.100000 67.433479 -0.700000 0.200000 66.028002 -0.700000 0.300000 64.642525 -0.700000 0.400000 63.277048 -0.700000 0.500000 61.931571 -0.700000 0.600000 60.606094 -0.700000 0.700000 59.300617 -0.700000 0.800000 58.015140 -0.700000 0.900000 56.749663 -0.700000 1.000000 55.504186 -0.700000 1.100000 54.278709 -0.700000 1.200000 53.073232 -0.700000 1.300000 51.887755 -0.700000 1.400000 50.722278 -0.700000 1.500000 49.576801 -0.700000 1.600000 48.451324 -0.700000 1.700000 47.345847 -0.700000 1.800000 46.260370 -0.700000 1.900000 45.194893 -0.700000 2.000000 44.149416 -0.700000 2.100000 43.123939 -0.700000 2.200000 42.118462 -0.700000 2.300000 41.132985 -0.700000 2.400000 40.167508 -0.700000 2.500000 39.222031 -0.700000 2.600000 38.296554 -0.700000 2.700000 37.391077 -0.700000 2.800000 36.505600 -0.700000 2.900000 35.640123 -0.700000 3.000000 34.794646 -0.700000 3.100000 33.969169 -0.700000 3.200000 33.163692 -0.700000 3.300000 32.378215 -0.700000 3.400000 31.612738 -0.700000 3.500000 30.867261 -0.700000 3.600000 30.141784 -0.700000 3.700000 29.436307 -0.700000 3.800000 28.750830 -0.700000 3.900000 28.085353 -0.700000 4.000000 27.439876 -0.700000 4.100000 26.814399 -0.700000 4.200000 26.208922 -0.700000 4.300000 25.623445 -0.700000 4.400000 25.057968 -0.700000 4.500000 24.512491 -0.700000 4.600000 23.987014 -0.700000 4.700000 23.481537 -0.700000 4.800000 22.996060 -0.700000 4.900000 22.530583 -0.700000 5.000000 22.085106 -0.700000 5.100000 21.659629 -0.700000 5.200000 21.254152 -0.700000 5.300000 20.868675 -0.700000 5.400000 20.503198 -0.700000 5.500000 20.157721 -0.700000 5.600000 19.832244 -0.700000 5.700000 19.526767 -0.700000 5.800000 19.241290 -0.700000 5.900000 18.975813 -0.700000 6.000000 18.730336 -0.700000 6.100000 18.504859 -0.700000 6.200000 18.299382 -0.700000 6.300000 18.113905 -0.700000 6.400000 17.948428 -0.700000 6.500000 17.802951 -0.700000 6.600000 17.677474 -0.700000 6.700000 17.571997 -0.700000 6.800000 17.486520 -0.700000 6.900000 17.421043 -0.700000 7.000000 17.375566 -0.700000 7.100000 17.350089 -0.700000 7.200000 17.344612 -0.700000 7.300000 17.359135 -0.700000 7.400000 17.393658 -0.700000 7.500000 17.448181 -0.700000 7.600000 17.522704 -0.700000 7.700000 17.617227 -0.700000 7.800000 17.731750 -0.700000 7.900000 17.866273 -0.700000 8.000000 18.020796 -0.700000 8.100000 18.195319 -0.700000 8.200000 18.389842 -0.700000 8.300000 18.604365 -0.700000 8.400000 18.838888 -0.700000 8.500000 19.093411 -0.700000 8.600000 19.367934 -0.700000 8.700000 19.662457 -0.700000 8.800000 19.976980 -0.700000 8.900000 20.311503 -0.700000 9.000000 20.666026 -0.700000 9.100000 21.040549 -0.700000 9.200000 21.435072 -0.700000 9.300000 21.849595 -0.700000 9.400000 22.284118 -0.700000 9.500000 22.738641 -0.700000 9.600000 23.213164 -0.700000 9.700000 23.707687 -0.700000 9.800000 24.222210 -0.700000 9.900000 24.756733 -0.700000 10.000000 25.311256 -0.700000 10.100000 25.885779 -0.700000 10.200000 26.480302 -0.700000 10.300000 27.094825 -0.700000 10.400000 27.729348 -0.700000 10.500000 28.383871 -0.700000 10.600000 29.058394 -0.700000 10.700000 29.752917 -0.700000 10.800000 30.467440 -0.700000 10.900000 31.201963 -0.700000 11.000000 31.956486 -0.700000 11.100000 32.731009 -0.700000 11.200000 33.525532 -0.700000 11.300000 34.340055 -0.700000 11.400000 35.174578 -0.700000 11.500000 36.029101 -0.700000 11.600000 36.903624 -0.700000 11.700000 37.798147 -0.700000 11.800000 38.712670 -0.700000 11.900000 39.647193 -0.700000 12.000000 40.601716 -0.700000 12.100000 41.576239 -0.700000 12.200000 42.570762 -0.700000 12.300000 43.585285 -0.700000 12.400000 44.619808 -0.700000 12.500000 45.674331 -0.700000 12.600000 46.748854 -0.700000 12.700000 47.843377 -0.700000 12.800000 48.957900 -0.700000 12.900000 50.092423 -0.700000 13.000000 51.246946 -0.700000 13.100000 52.421469 -0.700000 13.200000 53.615992 -0.700000 13.300000 54.830515 -0.700000 13.400000 56.065038 -0.700000 13.500000 57.319561 -0.700000 13.600000 58.594084 -0.700000 13.700000 59.888607 -0.700000 13.800000 61.203130 -0.700000 13.900000 62.537653 -0.700000 14.000000 63.892176 -0.700000 14.100000 65.266699 -0.700000 14.200000 66.661222 -0.700000 14.300000 68.075745 -0.700000 14.400000 69.510268 -0.700000 14.500000 70.964791 -0.700000 14.600000 72.439314 -0.700000 14.700000 73.933837 -0.700000 14.800000 75.448360 -0.700000 14.900000 76.982883 -0.700000 15.000000 78.537406 -0.600000 -5.000000 161.959434 -0.600000 -4.900000 159.569146 -0.600000 -4.800000 157.198859 -0.600000 -4.700000 154.848572 -0.600000 -4.600000 152.518285 -0.600000 -4.500000 150.207997 -0.600000 -4.400000 147.917710 -0.600000 -4.300000 145.647423 -0.600000 -4.200000 143.397136 -0.600000 -4.100000 141.166849 -0.600000 -4.000000 138.956561 -0.600000 -3.900000 136.766274 -0.600000 -3.800000 134.595987 -0.600000 -3.700000 132.445700 -0.600000 -3.600000 130.315413 -0.600000 -3.500000 128.205125 -0.600000 -3.400000 126.114838 -0.600000 -3.300000 124.044551 -0.600000 -3.200000 121.994264 -0.600000 -3.100000 119.963976 -0.600000 -3.000000 117.953689 -0.600000 -2.900000 115.963402 -0.600000 -2.800000 113.993115 -0.600000 -2.700000 112.042828 -0.600000 -2.600000 110.112540 -0.600000 -2.500000 108.202253 -0.600000 -2.400000 106.311966 -0.600000 -2.300000 104.441679 -0.600000 -2.200000 102.591392 -0.600000 -2.100000 100.761104 -0.600000 -2.000000 98.950817 -0.600000 -1.900000 97.160530 -0.600000 -1.800000 95.390243 -0.600000 -1.700000 93.639955 -0.600000 -1.600000 91.909668 -0.600000 -1.500000 90.199381 -0.600000 -1.400000 88.509094 -0.600000 -1.300000 86.838807 -0.600000 -1.200000 85.188519 -0.600000 -1.100000 83.558232 -0.600000 -1.000000 81.947945 -0.600000 -0.900000 80.357658 -0.600000 -0.800000 78.787370 -0.600000 -0.700000 77.237083 -0.600000 -0.600000 75.706796 -0.600000 -0.500000 74.196509 -0.600000 -0.400000 72.706222 -0.600000 -0.300000 71.235934 -0.600000 -0.200000 69.785647 -0.600000 -0.100000 68.355360 -0.600000 -0.000000 66.945073 -0.600000 0.100000 65.554786 -0.600000 0.200000 64.184498 -0.600000 0.300000 62.834211 -0.600000 0.400000 61.503924 -0.600000 0.500000 60.193637 -0.600000 0.600000 58.903349 -0.600000 0.700000 57.633062 -0.600000 0.800000 56.382775 -0.600000 0.900000 55.152488 -0.600000 1.000000 53.942201 -0.600000 1.100000 52.751913 -0.600000 1.200000 51.581626 -0.600000 1.300000 50.431339 -0.600000 1.400000 49.301052 -0.600000 1.500000 48.190765 -0.600000 1.600000 47.100477 -0.600000 1.700000 46.030190 -0.600000 1.800000 44.979903 -0.600000 1.900000 43.949616 -0.600000 2.000000 42.939328 -0.600000 2.100000 41.949041 -0.600000 2.200000 40.978754 -0.600000 2.300000 40.028467 -0.600000 2.400000 39.098180 -0.600000 2.500000 38.187892 -0.600000 2.600000 37.297605 -0.600000 2.700000 36.427318 -0.600000 2.800000 35.577031 -0.600000 2.900000 34.746743 -0.600000 3.000000 33.936456 -0.600000 3.100000 33.146169 -0.600000 3.200000 32.375882 -0.600000 3.300000 31.625595 -0.600000 3.400000 30.895307 -0.600000 3.500000 30.185020 -0.600000 3.600000 29.494733 -0.600000 3.700000 28.824446 -0.600000 3.800000 28.174159 -0.600000 3.900000 27.543871 -0.600000 4.000000 26.933584 -0.600000 4.100000 26.343297 -0.600000 4.200000 25.773010 -0.600000 4.300000 25.222722 -0.600000 4.400000 24.692435 -0.600000 4.500000 24.182148 -0.600000 4.600000 23.691861 -0.600000 4.700000 23.221574 -0.600000 4.800000 22.771286 -0.600000 4.900000 22.340999 -0.600000 5.000000 21.930712 -0.600000 5.100000 21.540425 -0.600000 5.200000 21.170137 -0.600000 5.300000 20.819850 -0.600000 5.400000 20.489563 -0.600000 5.500000 20.179276 -0.600000 5.600000 19.888989 -0.600000 5.700000 19.618701 -0.600000 5.800000 19.368414 -0.600000 5.900000 19.138127 -0.600000 6.000000 18.927840 -0.600000 6.100000 18.737553 -0.600000 6.200000 18.567265 -0.600000 6.300000 18.416978 -0.600000 6.400000 18.286691 -0.600000 6.500000 18.176404 -0.600000 6.600000 18.086116 -0.600000 6.700000 18.015829 -0.600000 6.800000 17.965542 -0.600000 6.900000 17.935255 -0.600000 7.000000 17.924968 -0.600000 7.100000 17.934680 -0.600000 7.200000 17.964393 -0.600000 7.300000 18.014106 -0.600000 7.400000 18.083819 -0.600000 7.500000 18.173532 -0.600000 7.600000 18.283244 -0.600000 7.700000 18.412957 -0.600000 7.800000 18.562670 -0.600000 7.900000 18.732383 -0.600000 8.000000 18.922095 -0.600000 8.100000 19.131808 -0.600000 8.200000 19.361521 -0.600000 8.300000 19.611234 -0.600000 8.400000 19.880947 -0.600000 8.500000 20.170659 -0.600000 8.600000 20.480372 -0.600000 8.700000 20.810085 -0.600000 8.800000 21.159798 -0.600000 8.900000 21.529510 -0.600000 9.000000 21.919223 -0.600000 9.100000 22.328936 -0.600000 9.200000 22.758649 -0.600000 9.300000 23.208362 -0.600000 9.400000 23.678074 -0.600000 9.500000 24.167787 -0.600000 9.600000 24.677500 -0.600000 9.700000 25.207213 -0.600000 9.800000 25.756926 -0.600000 9.900000 26.326638 -0.600000 10.000000 26.916351 -0.600000 10.100000 27.526064 -0.600000 10.200000 28.155777 -0.600000 10.300000 28.805489 -0.600000 10.400000 29.475202 -0.600000 10.500000 30.164915 -0.600000 10.600000 30.874628 -0.600000 10.700000 31.604341 -0.600000 10.800000 32.354053 -0.600000 10.900000 33.123766 -0.600000 11.000000 33.913479 -0.600000 11.100000 34.723192 -0.600000 11.200000 35.552905 -0.600000 11.300000 36.402617 -0.600000 11.400000 37.272330 -0.600000 11.500000 38.162043 -0.600000 11.600000 39.071756 -0.600000 11.700000 40.001468 -0.600000 11.800000 40.951181 -0.600000 11.900000 41.920894 -0.600000 12.000000 42.910607 -0.600000 12.100000 43.920320 -0.600000 12.200000 44.950032 -0.600000 12.300000 45.999745 -0.600000 12.400000 47.069458 -0.600000 12.500000 48.159171 -0.600000 12.600000 49.268883 -0.600000 12.700000 50.398596 -0.600000 12.800000 51.548309 -0.600000 12.900000 52.718022 -0.600000 13.000000 53.907735 -0.600000 13.100000 55.117447 -0.600000 13.200000 56.347160 -0.600000 13.300000 57.596873 -0.600000 13.400000 58.866586 -0.600000 13.500000 60.156299 -0.600000 13.600000 61.466011 -0.600000 13.700000 62.795724 -0.600000 13.800000 64.145437 -0.600000 13.900000 65.515150 -0.600000 14.000000 66.904862 -0.600000 14.100000 68.314575 -0.600000 14.200000 69.744288 -0.600000 14.300000 71.194001 -0.600000 14.400000 72.663714 -0.600000 14.500000 74.153426 -0.600000 14.600000 75.663139 -0.600000 14.700000 77.192852 -0.600000 14.800000 78.742565 -0.600000 14.900000 80.312278 -0.600000 15.000000 81.901990 -0.500000 -5.000000 158.329906 -0.500000 -4.900000 155.974292 -0.500000 -4.800000 153.638678 -0.500000 -4.700000 151.323064 -0.500000 -4.600000 149.027450 -0.500000 -4.500000 146.751836 -0.500000 -4.400000 144.496221 -0.500000 -4.300000 142.260607 -0.500000 -4.200000 140.044993 -0.500000 -4.100000 137.849379 -0.500000 -4.000000 135.673765 -0.500000 -3.900000 133.518151 -0.500000 -3.800000 131.382536 -0.500000 -3.700000 129.266922 -0.500000 -3.600000 127.171308 -0.500000 -3.500000 125.095694 -0.500000 -3.400000 123.040080 -0.500000 -3.300000 121.004466 -0.500000 -3.200000 118.988851 -0.500000 -3.100000 116.993237 -0.500000 -3.000000 115.017623 -0.500000 -2.900000 113.062009 -0.500000 -2.800000 111.126395 -0.500000 -2.700000 109.210781 -0.500000 -2.600000 107.315166 -0.500000 -2.500000 105.439552 -0.500000 -2.400000 103.583938 -0.500000 -2.300000 101.748324 -0.500000 -2.200000 99.932710 -0.500000 -2.100000 98.137096 -0.500000 -2.000000 96.361481 -0.500000 -1.900000 94.605867 -0.500000 -1.800000 92.870253 -0.500000 -1.700000 91.154639 -0.500000 -1.600000 89.459025 -0.500000 -1.500000 87.783411 -0.500000 -1.400000 86.127796 -0.500000 -1.300000 84.492182 -0.500000 -1.200000 82.876568 -0.500000 -1.100000 81.280954 -0.500000 -1.000000 79.705340 -0.500000 -0.900000 78.149726 -0.500000 -0.800000 76.614111 -0.500000 -0.700000 75.098497 -0.500000 -0.600000 73.602883 -0.500000 -0.500000 72.127269 -0.500000 -0.400000 70.671655 -0.500000 -0.300000 69.236041 -0.500000 -0.200000 67.820426 -0.500000 -0.100000 66.424812 -0.500000 -0.000000 65.049198 -0.500000 0.100000 63.693584 -0.500000 0.200000 62.357970 -0.500000 0.300000 61.042356 -0.500000 0.400000 59.746741 -0.500000 0.500000 58.471127 -0.500000 0.600000 57.215513 -0.500000 0.700000 55.979899 -0.500000 0.800000 54.764285 -0.500000 0.900000 53.568671 -0.500000 1.000000 52.393056 -0.500000 1.100000 51.237442 -0.500000 1.200000 50.101828 -0.500000 1.300000 48.986214 -0.500000 1.400000 47.890600 -0.500000 1.500000 46.814986 -0.500000 1.600000 45.759371 -0.500000 1.700000 44.723757 -0.500000 1.800000 43.708143 -0.500000 1.900000 42.712529 -0.500000 2.000000 41.736915 -0.500000 2.100000 40.781301 -0.500000 2.200000 39.845686 -0.500000 2.300000 38.930072 -0.500000 2.400000 38.034458 -0.500000 2.500000 37.158844 -0.500000 2.600000 36.303230 -0.500000 2.700000 35.467615 -0.500000 2.800000 34.652001 -0.500000 2.900000 33.856387 -0.500000 3.000000 33.080773 -0.500000 3.100000 32.325159 -0.500000 3.200000 31.589545 -0.500000 3.300000 30.873930 -0.500000 3.400000 30.178316 -0.500000 3.500000 29.502702 -0.500000 3.600000 28.847088 -0.500000 3.700000 28.211474 -0.500000 3.800000 27.595860 -0.500000 3.900000 27.000245 -0.500000 4.000000 26.424631 -0.500000 4.100000 25.869017 -0.500000 4.200000 25.333403 -0.500000 4.300000 24.817789 -0.500000 4.400000 24.322175 -0.500000 4.500000 23.846560 -0.500000 4.600000 23.390946 -0.500000 4.700000 22.955332 -0.500000 4.800000 22.539718 -0.500000 4.900000 22.144104 -0.500000 5.000000 21.768490 -0.500000 5.100000 21.412875 -0.500000 5.200000 21.077261 -0.500000 5.300000 20.761647 -0.500000 5.400000 20.466033 -0.500000 5.500000 20.190419 -0.500000 5.600000 19.934805 -0.500000 5.700000 19.699190 -0.500000 5.800000 19.483576 -0.500000 5.900000 19.287962 -0.500000 6.000000 19.112348 -0.500000 6.100000 18.956734 -0.500000 6.200000 18.821120 -0.500000 6.300000 18.705505 -0.500000 6.400000 18.609891 -0.500000 6.500000 18.534277 -0.500000 6.600000 18.478663 -0.500000 6.700000 18.443049 -0.500000 6.800000 18.427435 -0.500000 6.900000 18.431820 -0.500000 7.000000 18.456206 -0.500000 7.100000 18.500592 -0.500000 7.200000 18.564978 -0.500000 7.300000 18.649364 -0.500000 7.400000 18.753750 -0.500000 7.500000 18.878135 -0.500000 7.600000 19.022521 -0.500000 7.700000 19.186907 -0.500000 7.800000 19.371293 -0.500000 7.900000 19.575679 -0.500000 8.000000 19.800065 -0.500000 8.100000 20.044450 -0.500000 8.200000 20.308836 -0.500000 8.300000 20.593222 -0.500000 8.400000 20.897608 -0.500000 8.500000 21.221994 -0.500000 8.600000 21.566380 -0.500000 8.700000 21.930765 -0.500000 8.800000 22.315151 -0.500000 8.900000 22.719537 -0.500000 9.000000 23.143923 -0.500000 9.100000 23.588309 -0.500000 9.200000 24.052695 -0.500000 9.300000 24.537080 -0.500000 9.400000 25.041466 -0.500000 9.500000 25.565852 -0.500000 9.600000 26.110238 -0.500000 9.700000 26.674624 -0.500000 9.800000 27.259010 -0.500000 9.900000 27.863395 -0.500000 10.000000 28.487781 -0.500000 10.100000 29.132167 -0.500000 10.200000 29.796553 -0.500000 10.300000 30.480939 -0.500000 10.400000 31.185325 -0.500000 10.500000 31.909710 -0.500000 10.600000 32.654096 -0.500000 10.700000 33.418482 -0.500000 10.800000 34.202868 -0.500000 10.900000 35.007254 -0.500000 11.000000 35.831640 -0.500000 11.100000 36.676025 -0.500000 11.200000 37.540411 -0.500000 11.300000 38.424797 -0.500000 11.400000 39.329183 -0.500000 11.500000 40.253569 -0.500000 11.600000 41.197954 -0.500000 11.700000 42.162340 -0.500000 11.800000 43.146726 -0.500000 11.900000 44.151112 -0.500000 12.000000 45.175498 -0.500000 12.100000 46.219884 -0.500000 12.200000 47.284269 -0.500000 12.300000 48.368655 -0.500000 12.400000 49.473041 -0.500000 12.500000 50.597427 -0.500000 12.600000 51.741813 -0.500000 12.700000 52.906199 -0.500000 12.800000 54.090584 -0.500000 12.900000 55.294970 -0.500000 13.000000 56.519356 -0.500000 13.100000 57.763742 -0.500000 13.200000 59.028128 -0.500000 13.300000 60.312514 -0.500000 13.400000 61.616899 -0.500000 13.500000 62.941285 -0.500000 13.600000 64.285671 -0.500000 13.700000 65.650057 -0.500000 13.800000 67.034443 -0.500000 13.900000 68.438829 -0.500000 14.000000 69.863214 -0.500000 14.100000 71.307600 -0.500000 14.200000 72.771986 -0.500000 14.300000 74.256372 -0.500000 14.400000 75.760758 -0.500000 14.500000 77.285144 -0.500000 14.600000 78.829529 -0.500000 14.700000 80.393915 -0.500000 14.800000 81.978301 -0.500000 14.900000 83.582687 -0.500000 15.000000 85.207073 -0.400000 -5.000000 154.736525 -0.400000 -4.900000 152.415067 -0.400000 -4.800000 150.113609 -0.400000 -4.700000 147.832152 -0.400000 -4.600000 145.570694 -0.400000 -4.500000 143.329236 -0.400000 -4.400000 141.107778 -0.400000 -4.300000 138.906320 -0.400000 -4.200000 136.724862 -0.400000 -4.100000 134.563404 -0.400000 -4.000000 132.421947 -0.400000 -3.900000 130.300489 -0.400000 -3.800000 128.199031 -0.400000 -3.700000 126.117573 -0.400000 -3.600000 124.056115 -0.400000 -3.500000 122.014657 -0.400000 -3.400000 119.993199 -0.400000 -3.300000 117.991741 -0.400000 -3.200000 116.010284 -0.400000 -3.100000 114.048826 -0.400000 -3.000000 112.107368 -0.400000 -2.900000 110.185910 -0.400000 -2.800000 108.284452 -0.400000 -2.700000 106.402994 -0.400000 -2.600000 104.541536 -0.400000 -2.500000 102.700079 -0.400000 -2.400000 100.878621 -0.400000 -2.300000 99.077163 -0.400000 -2.200000 97.295705 -0.400000 -2.100000 95.534247 -0.400000 -2.000000 93.792789 -0.400000 -1.900000 92.071331 -0.400000 -1.800000 90.369874 -0.400000 -1.700000 88.688416 -0.400000 -1.600000 87.026958 -0.400000 -1.500000 85.385500 -0.400000 -1.400000 83.764042 -0.400000 -1.300000 82.162584 -0.400000 -1.200000 80.581126 -0.400000 -1.100000 79.019669 -0.400000 -1.000000 77.478211 -0.400000 -0.900000 75.956753 -0.400000 -0.800000 74.455295 -0.400000 -0.700000 72.973837 -0.400000 -0.600000 71.512379 -0.400000 -0.500000 70.070921 -0.400000 -0.400000 68.649464 -0.400000 -0.300000 67.248006 -0.400000 -0.200000 65.866548 -0.400000 -0.100000 64.505090 -0.400000 -0.000000 63.163632 -0.400000 0.100000 61.842174 -0.400000 0.200000 60.540716 -0.400000 0.300000 59.259259 -0.400000 0.400000 57.997801 -0.400000 0.500000 56.756343 -0.400000 0.600000 55.534885 -0.400000 0.700000 54.333427 -0.400000 0.800000 53.151969 -0.400000 0.900000 51.990511 -0.400000 1.000000 50.849054 -0.400000 1.100000 49.727596 -0.400000 1.200000 48.626138 -0.400000 1.300000 47.544680 -0.400000 1.400000 46.483222 -0.400000 1.500000 45.441764 -0.400000 1.600000 44.420306 -0.400000 1.700000 43.418849 -0.400000 1.800000 42.437391 -0.400000 1.900000 41.475933 -0.400000 2.000000 40.534475 -0.400000 2.100000 39.613017 -0.400000 2.200000 38.711559 -0.400000 2.300000 37.830101 -0.400000 2.400000 36.968644 -0.400000 2.500000 36.127186 -0.400000 2.600000 35.305728 -0.400000 2.700000 34.504270 -0.400000 2.800000 33.722812 -0.400000 2.900000 32.961354 -0.400000 3.000000 32.219896 -0.400000 3.100000 31.498439 -0.400000 3.200000 30.796981 -0.400000 3.300000 30.115523 -0.400000 3.400000 29.454065 -0.400000 3.500000 28.812607 -0.400000 3.600000 28.191149 -0.400000 3.700000 27.589691 -0.400000 3.800000 27.008234 -0.400000 3.900000 26.446776 -0.400000 4.000000 25.905318 -0.400000 4.100000 25.383860 -0.400000 4.200000 24.882402 -0.400000 4.300000 24.400944 -0.400000 4.400000 23.939486 -0.400000 4.500000 23.498029 -0.400000 4.600000 23.076571 -0.400000 4.700000 22.675113 -0.400000 4.800000 22.293655 -0.400000 4.900000 21.932197 -0.400000 5.000000 21.590739 -0.400000 5.100000 21.269281 -0.400000 5.200000 20.967824 -0.400000 5.300000 20.686366 -0.400000 5.400000 20.424908 -0.400000 5.500000 20.183450 -0.400000 5.600000 19.961992 -0.400000 5.700000 19.760534 -0.400000 5.800000 19.579076 -0.400000 5.900000 19.417618 -0.400000 6.000000 19.276161 -0.400000 6.100000 19.154703 -0.400000 6.200000 19.053245 -0.400000 6.300000 18.971787 -0.400000 6.400000 18.910329 -0.400000 6.500000 18.868871 -0.400000 6.600000 18.847413 -0.400000 6.700000 18.845956 -0.400000 6.800000 18.864498 -0.400000 6.900000 18.903040 -0.400000 7.000000 18.961582 -0.400000 7.100000 19.040124 -0.400000 7.200000 19.138666 -0.400000 7.300000 19.257208 -0.400000 7.400000 19.395751 -0.400000 7.500000 19.554293 -0.400000 7.600000 19.732835 -0.400000 7.700000 19.931377 -0.400000 7.800000 20.149919 -0.400000 7.900000 20.388461 -0.400000 8.000000 20.647003 -0.400000 8.100000 20.925546 -0.400000 8.200000 21.224088 -0.400000 8.300000 21.542630 -0.400000 8.400000 21.881172 -0.400000 8.500000 22.239714 -0.400000 8.600000 22.618256 -0.400000 8.700000 23.016798 -0.400000 8.800000 23.435341 -0.400000 8.900000 23.873883 -0.400000 9.000000 24.332425 -0.400000 9.100000 24.810967 -0.400000 9.200000 25.309509 -0.400000 9.300000 25.828051 -0.400000 9.400000 26.366593 -0.400000 9.500000 26.925136 -0.400000 9.600000 27.503678 -0.400000 9.700000 28.102220 -0.400000 9.800000 28.720762 -0.400000 9.900000 29.359304 -0.400000 10.000000 30.017846 -0.400000 10.100000 30.696388 -0.400000 10.200000 31.394931 -0.400000 10.300000 32.113473 -0.400000 10.400000 32.852015 -0.400000 10.500000 33.610557 -0.400000 10.600000 34.389099 -0.400000 10.700000 35.187641 -0.400000 10.800000 36.006183 -0.400000 10.900000 36.844726 -0.400000 11.000000 37.703268 -0.400000 11.100000 38.581810 -0.400000 11.200000 39.480352 -0.400000 11.300000 40.398894 -0.400000 11.400000 41.337436 -0.400000 11.500000 42.295978 -0.400000 11.600000 43.274521 -0.400000 11.700000 44.273063 -0.400000 11.800000 45.291605 -0.400000 11.900000 46.330147 -0.400000 12.000000 47.388689 -0.400000 12.100000 48.467231 -0.400000 12.200000 49.565773 -0.400000 12.300000 50.684316 -0.400000 12.400000 51.822858 -0.400000 12.500000 52.981400 -0.400000 12.600000 54.159942 -0.400000 12.700000 55.358484 -0.400000 12.800000 56.577026 -0.400000 12.900000 57.815568 -0.400000 13.000000 59.074111 -0.400000 13.100000 60.352653 -0.400000 13.200000 61.651195 -0.400000 13.300000 62.969737 -0.400000 13.400000 64.308279 -0.400000 13.500000 65.666821 -0.400000 13.600000 67.045363 -0.400000 13.700000 68.443906 -0.400000 13.800000 69.862448 -0.400000 13.900000 71.300990 -0.400000 14.000000 72.759532 -0.400000 14.100000 74.238074 -0.400000 14.200000 75.736616 -0.400000 14.300000 77.255158 -0.400000 14.400000 78.793700 -0.400000 14.500000 80.352243 -0.400000 14.600000 81.930785 -0.400000 14.700000 83.529327 -0.400000 14.800000 85.147869 -0.400000 14.900000 86.786411 -0.400000 15.000000 88.444953 -0.300000 -5.000000 151.172471 -0.300000 -4.900000 148.884652 -0.300000 -4.800000 146.616834 -0.300000 -4.700000 144.369016 -0.300000 -4.600000 142.141197 -0.300000 -4.500000 139.933379 -0.300000 -4.400000 137.745561 -0.300000 -4.300000 135.577743 -0.300000 -4.200000 133.429924 -0.300000 -4.100000 131.302106 -0.300000 -4.000000 129.194288 -0.300000 -3.900000 127.106469 -0.300000 -3.800000 125.038651 -0.300000 -3.700000 122.990833 -0.300000 -3.600000 120.963015 -0.300000 -3.500000 118.955196 -0.300000 -3.400000 116.967378 -0.300000 -3.300000 114.999560 -0.300000 -3.200000 113.051741 -0.300000 -3.100000 111.123923 -0.300000 -3.000000 109.216105 -0.300000 -2.900000 107.328287 -0.300000 -2.800000 105.460468 -0.300000 -2.700000 103.612650 -0.300000 -2.600000 101.784832 -0.300000 -2.500000 99.977013 -0.300000 -2.400000 98.189195 -0.300000 -2.300000 96.421377 -0.300000 -2.200000 94.673559 -0.300000 -2.100000 92.945740 -0.300000 -2.000000 91.237922 -0.300000 -1.900000 89.550104 -0.300000 -1.800000 87.882285 -0.300000 -1.700000 86.234467 -0.300000 -1.600000 84.606649 -0.300000 -1.500000 82.998831 -0.300000 -1.400000 81.411012 -0.300000 -1.300000 79.843194 -0.300000 -1.200000 78.295376 -0.300000 -1.100000 76.767557 -0.300000 -1.000000 75.259739 -0.300000 -0.900000 73.771921 -0.300000 -0.800000 72.304103 -0.300000 -0.700000 70.856284 -0.300000 -0.600000 69.428466 -0.300000 -0.500000 68.020648 -0.300000 -0.400000 66.632829 -0.300000 -0.300000 65.265011 -0.300000 -0.200000 63.917193 -0.300000 -0.100000 62.589375 -0.300000 -0.000000 61.281556 -0.300000 0.100000 59.993738 -0.300000 0.200000 58.725920 -0.300000 0.300000 57.478101 -0.300000 0.400000 56.250283 -0.300000 0.500000 55.042465 -0.300000 0.600000 53.854647 -0.300000 0.700000 52.686828 -0.300000 0.800000 51.539010 -0.300000 0.900000 50.411192 -0.300000 1.000000 49.303373 -0.300000 1.100000 48.215555 -0.300000 1.200000 47.147737 -0.300000 1.300000 46.099919 -0.300000 1.400000 45.072100 -0.300000 1.500000 44.064282 -0.300000 1.600000 43.076464 -0.300000 1.700000 42.108645 -0.300000 1.800000 41.160827 -0.300000 1.900000 40.233009 -0.300000 2.000000 39.325190 -0.300000 2.100000 38.437372 -0.300000 2.200000 37.569554 -0.300000 2.300000 36.721736 -0.300000 2.400000 35.893917 -0.300000 2.500000 35.086099 -0.300000 2.600000 34.298281 -0.300000 2.700000 33.530462 -0.300000 2.800000 32.782644 -0.300000 2.900000 32.054826 -0.300000 3.000000 31.347008 -0.300000 3.100000 30.659189 -0.300000 3.200000 29.991371 -0.300000 3.300000 29.343553 -0.300000 3.400000 28.715734 -0.300000 3.500000 28.107916 -0.300000 3.600000 27.520098 -0.300000 3.700000 26.952280 -0.300000 3.800000 26.404461 -0.300000 3.900000 25.876643 -0.300000 4.000000 25.368825 -0.300000 4.100000 24.881006 -0.300000 4.200000 24.413188 -0.300000 4.300000 23.965370 -0.300000 4.400000 23.537552 -0.300000 4.500000 23.129733 -0.300000 4.600000 22.741915 -0.300000 4.700000 22.374097 -0.300000 4.800000 22.026278 -0.300000 4.900000 21.698460 -0.300000 5.000000 21.390642 -0.300000 5.100000 21.102824 -0.300000 5.200000 20.835005 -0.300000 5.300000 20.587187 -0.300000 5.400000 20.359369 -0.300000 5.500000 20.151550 -0.300000 5.600000 19.963732 -0.300000 5.700000 19.795914 -0.300000 5.800000 19.648096 -0.300000 5.900000 19.520277 -0.300000 6.000000 19.412459 -0.300000 6.100000 19.324641 -0.300000 6.200000 19.256822 -0.300000 6.300000 19.209004 -0.300000 6.400000 19.181186 -0.300000 6.500000 19.173368 -0.300000 6.600000 19.185549 -0.300000 6.700000 19.217731 -0.300000 6.800000 19.269913 -0.300000 6.900000 19.342094 -0.300000 7.000000 19.434276 -0.300000 7.100000 19.546458 -0.300000 7.200000 19.678640 -0.300000 7.300000 19.830821 -0.300000 7.400000 20.003003 -0.300000 7.500000 20.195185 -0.300000 7.600000 20.407366 -0.300000 7.700000 20.639548 -0.300000 7.800000 20.891730 -0.300000 7.900000 21.163912 -0.300000 8.000000 21.456093 -0.300000 8.100000 21.768275 -0.300000 8.200000 22.100457 -0.300000 8.300000 22.452638 -0.300000 8.400000 22.824820 -0.300000 8.500000 23.217002 -0.300000 8.600000 23.629184 -0.300000 8.700000 24.061365 -0.300000 8.800000 24.513547 -0.300000 8.900000 24.985729 -0.300000 9.000000 25.477910 -0.300000 9.100000 25.990092 -0.300000 9.200000 26.522274 -0.300000 9.300000 27.074456 -0.300000 9.400000 27.646637 -0.300000 9.500000 28.238819 -0.300000 9.600000 28.851001 -0.300000 9.700000 29.483182 -0.300000 9.800000 30.135364 -0.300000 9.900000 30.807546 -0.300000 10.000000 31.499728 -0.300000 10.100000 32.211909 -0.300000 10.200000 32.944091 -0.300000 10.300000 33.696273 -0.300000 10.400000 34.468454 -0.300000 10.500000 35.260636 -0.300000 10.600000 36.072818 -0.300000 10.700000 36.905000 -0.300000 10.800000 37.757181 -0.300000 10.900000 38.629363 -0.300000 11.000000 39.521545 -0.300000 11.100000 40.433726 -0.300000 11.200000 41.365908 -0.300000 11.300000 42.318090 -0.300000 11.400000 43.290272 -0.300000 11.500000 44.282453 -0.300000 11.600000 45.294635 -0.300000 11.700000 46.326817 -0.300000 11.800000 47.378998 -0.300000 11.900000 48.451180 -0.300000 12.000000 49.543362 -0.300000 12.100000 50.655544 -0.300000 12.200000 51.787725 -0.300000 12.300000 52.939907 -0.300000 12.400000 54.112089 -0.300000 12.500000 55.304270 -0.300000 12.600000 56.516452 -0.300000 12.700000 57.748634 -0.300000 12.800000 59.000815 -0.300000 12.900000 60.272997 -0.300000 13.000000 61.565179 -0.300000 13.100000 62.877361 -0.300000 13.200000 64.209542 -0.300000 13.300000 65.561724 -0.300000 13.400000 66.933906 -0.300000 13.500000 68.326087 -0.300000 13.600000 69.738269 -0.300000 13.700000 71.170451 -0.300000 13.800000 72.622633 -0.300000 13.900000 74.094814 -0.300000 14.000000 75.586996 -0.300000 14.100000 77.099178 -0.300000 14.200000 78.631359 -0.300000 14.300000 80.183541 -0.300000 14.400000 81.755723 -0.300000 14.500000 83.347905 -0.300000 14.600000 84.960086 -0.300000 14.700000 86.592268 -0.300000 14.800000 88.244450 -0.300000 14.900000 89.916631 -0.300000 15.000000 91.608813 -0.200000 -5.000000 147.631847 -0.200000 -4.900000 145.377152 -0.200000 -4.800000 143.142456 -0.200000 -4.700000 140.927761 -0.200000 -4.600000 138.733065 -0.200000 -4.500000 136.558370 -0.200000 -4.400000 134.403674 -0.200000 -4.300000 132.268979 -0.200000 -4.200000 130.154283 -0.200000 -4.100000 128.059588 -0.200000 -4.000000 125.984893 -0.200000 -3.900000 123.930197 -0.200000 -3.800000 121.895502 -0.200000 -3.700000 119.880806 -0.200000 -3.600000 117.886111 -0.200000 -3.500000 115.911415 -0.200000 -3.400000 113.956720 -0.200000 -3.300000 112.022024 -0.200000 -3.200000 110.107329 -0.200000 -3.100000 108.212633 -0.200000 -3.000000 106.337938 -0.200000 -2.900000 104.483243 -0.200000 -2.800000 102.648547 -0.200000 -2.700000 100.833852 -0.200000 -2.600000 99.039156 -0.200000 -2.500000 97.264461 -0.200000 -2.400000 95.509765 -0.200000 -2.300000 93.775070 -0.200000 -2.200000 92.060374 -0.200000 -2.100000 90.365679 -0.200000 -2.000000 88.690983 -0.200000 -1.900000 87.036288 -0.200000 -1.800000 85.401593 -0.200000 -1.700000 83.786897 -0.200000 -1.600000 82.192202 -0.200000 -1.500000 80.617506 -0.200000 -1.400000 79.062811 -0.200000 -1.300000 77.528115 -0.200000 -1.200000 76.013420 -0.200000 -1.100000 74.518724 -0.200000 -1.000000 73.044029 -0.200000 -0.900000 71.589333 -0.200000 -0.800000 70.154638 -0.200000 -0.700000 68.739943 -0.200000 -0.600000 67.345247 -0.200000 -0.500000 65.970552 -0.200000 -0.400000 64.615856 -0.200000 -0.300000 63.281161 -0.200000 -0.200000 61.966465 -0.200000 -0.100000 60.671770 -0.200000 -0.000000 59.397074 -0.200000 0.100000 58.142379 -0.200000 0.200000 56.907684 -0.200000 0.300000 55.692988 -0.200000 0.400000 54.498293 -0.200000 0.500000 53.323597 -0.200000 0.600000 52.168902 -0.200000 0.700000 51.034206 -0.200000 0.800000 49.919511 -0.200000 0.900000 48.824815 -0.200000 1.000000 47.750120 -0.200000 1.100000 46.695424 -0.200000 1.200000 45.660729 -0.200000 1.300000 44.646034 -0.200000 1.400000 43.651338 -0.200000 1.500000 42.676643 -0.200000 1.600000 41.721947 -0.200000 1.700000 40.787252 -0.200000 1.800000 39.872556 -0.200000 1.900000 38.977861 -0.200000 2.000000 38.103165 -0.200000 2.100000 37.248470 -0.200000 2.200000 36.413774 -0.200000 2.300000 35.599079 -0.200000 2.400000 34.804384 -0.200000 2.500000 34.029688 -0.200000 2.600000 33.274993 -0.200000 2.700000 32.540297 -0.200000 2.800000 31.825602 -0.200000 2.900000 31.130906 -0.200000 3.000000 30.456211 -0.200000 3.100000 29.801515 -0.200000 3.200000 29.166820 -0.200000 3.300000 28.552124 -0.200000 3.400000 27.957429 -0.200000 3.500000 27.382734 -0.200000 3.600000 26.828038 -0.200000 3.700000 26.293343 -0.200000 3.800000 25.778647 -0.200000 3.900000 25.283952 -0.200000 4.000000 24.809256 -0.200000 4.100000 24.354561 -0.200000 4.200000 23.919865 -0.200000 4.300000 23.505170 -0.200000 4.400000 23.110474 -0.200000 4.500000 22.735779 -0.200000 4.600000 22.381084 -0.200000 4.700000 22.046388 -0.200000 4.800000 21.731693 -0.200000 4.900000 21.436997 -0.200000 5.000000 21.162302 -0.200000 5.100000 20.907606 -0.200000 5.200000 20.672911 -0.200000 5.300000 20.458215 -0.200000 5.400000 20.263520 -0.200000 5.500000 20.088824 -0.200000 5.600000 19.934129 -0.200000 5.700000 19.799434 -0.200000 5.800000 19.684738 -0.200000 5.900000 19.590043 -0.200000 6.000000 19.515347 -0.200000 6.100000 19.460652 -0.200000 6.200000 19.425956 -0.200000 6.300000 19.411261 -0.200000 6.400000 19.416565 -0.200000 6.500000 19.441870 -0.200000 6.600000 19.487174 -0.200000 6.700000 19.552479 -0.200000 6.800000 19.637784 -0.200000 6.900000 19.743088 -0.200000 7.000000 19.868393 -0.200000 7.100000 20.013697 -0.200000 7.200000 20.179002 -0.200000 7.300000 20.364306 -0.200000 7.400000 20.569611 -0.200000 7.500000 20.794915 -0.200000 7.600000 21.040220 -0.200000 7.700000 21.305525 -0.200000 7.800000 21.590829 -0.200000 7.900000 21.896134 -0.200000 8.000000 22.221438 -0.200000 8.100000 22.566743 -0.200000 8.200000 22.932047 -0.200000 8.300000 23.317352 -0.200000 8.400000 23.722656 -0.200000 8.500000 24.147961 -0.200000 8.600000 24.593265 -0.200000 8.700000 25.058570 -0.200000 8.800000 25.543875 -0.200000 8.900000 26.049179 -0.200000 9.000000 26.574484 -0.200000 9.100000 27.119788 -0.200000 9.200000 27.685093 -0.200000 9.300000 28.270397 -0.200000 9.400000 28.875702 -0.200000 9.500000 29.501006 -0.200000 9.600000 30.146311 -0.200000 9.700000 30.811615 -0.200000 9.800000 31.496920 -0.200000 9.900000 32.202225 -0.200000 10.000000 32.927529 -0.200000 10.100000 33.672834 -0.200000 10.200000 34.438138 -0.200000 10.300000 35.223443 -0.200000 10.400000 36.028747 -0.200000 10.500000 36.854052 -0.200000 10.600000 37.699356 -0.200000 10.700000 38.564661 -0.200000 10.800000 39.449965 -0.200000 10.900000 40.355270 -0.200000 11.000000 41.280575 -0.200000 11.100000 42.225879 -0.200000 11.200000 43.191184 -0.200000 11.300000 44.176488 -0.200000 11.400000 45.181793 -0.200000 11.500000 46.207097 -0.200000 11.600000 47.252402 -0.200000 11.700000 48.317706 -0.200000 11.800000 49.403011 -0.200000 11.900000 50.508315 -0.200000 12.000000 51.633620 -0.200000 12.100000 52.778925 -0.200000 12.200000 53.944229 -0.200000 12.300000 55.129534 -0.200000 12.400000 56.334838 -0.200000 12.500000 57.560143 -0.200000 12.600000 58.805447 -0.200000 12.700000 60.070752 -0.200000 12.800000 61.356056 -0.200000 12.900000 62.661361 -0.200000 13.000000 63.986665 -0.200000 13.100000 65.331970 -0.200000 13.200000 66.697275 -0.200000 13.300000 68.082579 -0.200000 13.400000 69.487884 -0.200000 13.500000 70.913188 -0.200000 13.600000 72.358493 -0.200000 13.700000 73.823797 -0.200000 13.800000 75.309102 -0.200000 13.900000 76.814406 -0.200000 14.000000 78.339711 -0.200000 14.100000 79.885016 -0.200000 14.200000 81.450320 -0.200000 14.300000 83.035625 -0.200000 14.400000 84.640929 -0.200000 14.500000 86.266234 -0.200000 14.600000 87.911538 -0.200000 14.700000 89.576843 -0.200000 14.800000 91.262147 -0.200000 14.900000 92.967452 -0.200000 15.000000 94.692756 -0.100000 -5.000000 144.109715 -0.100000 -4.900000 141.887625 -0.100000 -4.800000 139.685536 -0.100000 -4.700000 137.503447 -0.100000 -4.600000 135.341357 -0.100000 -4.500000 133.199268 -0.100000 -4.400000 131.077178 -0.100000 -4.300000 128.975089 -0.100000 -4.200000 126.893000 -0.100000 -4.100000 124.830910 -0.100000 -4.000000 122.788821 -0.100000 -3.900000 120.766732 -0.100000 -3.800000 118.764642 -0.100000 -3.700000 116.782553 -0.100000 -3.600000 114.820464 -0.100000 -3.500000 112.878374 -0.100000 -3.400000 110.956285 -0.100000 -3.300000 109.054196 -0.100000 -3.200000 107.172106 -0.100000 -3.100000 105.310017 -0.100000 -3.000000 103.467927 -0.100000 -2.900000 101.645838 -0.100000 -2.800000 99.843749 -0.100000 -2.700000 98.061659 -0.100000 -2.600000 96.299570 -0.100000 -2.500000 94.557481 -0.100000 -2.400000 92.835391 -0.100000 -2.300000 91.133302 -0.100000 -2.200000 89.451213 -0.100000 -2.100000 87.789123 -0.100000 -2.000000 86.147034 -0.100000 -1.900000 84.524944 -0.100000 -1.800000 82.922855 -0.100000 -1.700000 81.340766 -0.100000 -1.600000 79.778676 -0.100000 -1.500000 78.236587 -0.100000 -1.400000 76.714498 -0.100000 -1.300000 75.212408 -0.100000 -1.200000 73.730319 -0.100000 -1.100000 72.268230 -0.100000 -1.000000 70.826140 -0.100000 -0.900000 69.404051 -0.100000 -0.800000 68.001962 -0.100000 -0.700000 66.619872 -0.100000 -0.600000 65.257783 -0.100000 -0.500000 63.915693 -0.100000 -0.400000 62.593604 -0.100000 -0.300000 61.291515 -0.100000 -0.200000 60.009425 -0.100000 -0.100000 58.747336 -0.100000 -0.000000 57.505247 -0.100000 0.100000 56.283157 -0.100000 0.200000 55.081068 -0.100000 0.300000 53.898979 -0.100000 0.400000 52.736889 -0.100000 0.500000 51.594800 -0.100000 0.600000 50.472711 -0.100000 0.700000 49.370621 -0.100000 0.800000 48.288532 -0.100000 0.900000 47.226442 -0.100000 1.000000 46.184353 -0.100000 1.100000 45.162264 -0.100000 1.200000 44.160174 -0.100000 1.300000 43.178085 -0.100000 1.400000 42.215996 -0.100000 1.500000 41.273906 -0.100000 1.600000 40.351817 -0.100000 1.700000 39.449728 -0.100000 1.800000 38.567638 -0.100000 1.900000 37.705549 -0.100000 2.000000 36.863460 -0.100000 2.100000 36.041370 -0.100000 2.200000 35.239281 -0.100000 2.300000 34.457191 -0.100000 2.400000 33.695102 -0.100000 2.500000 32.953013 -0.100000 2.600000 32.230923 -0.100000 2.700000 31.528834 -0.100000 2.800000 30.846745 -0.100000 2.900000 30.184655 -0.100000 3.000000 29.542566 -0.100000 3.100000 28.920477 -0.100000 3.200000 28.318387 -0.100000 3.300000 27.736298 -0.100000 3.400000 27.174209 -0.100000 3.500000 26.632119 -0.100000 3.600000 26.110030 -0.100000 3.700000 25.607940 -0.100000 3.800000 25.125851 -0.100000 3.900000 24.663762 -0.100000 4.000000 24.221672 -0.100000 4.100000 23.799583 -0.100000 4.200000 23.397494 -0.100000 4.300000 23.015404 -0.100000 4.400000 22.653315 -0.100000 4.500000 22.311226 -0.100000 4.600000 21.989136 -0.100000 4.700000 21.687047 -0.100000 4.800000 21.404958 -0.100000 4.900000 21.142868 -0.100000 5.000000 20.900779 -0.100000 5.100000 20.678689 -0.100000 5.200000 20.476600 -0.100000 5.300000 20.294511 -0.100000 5.400000 20.132421 -0.100000 5.500000 19.990332 -0.100000 5.600000 19.868243 -0.100000 5.700000 19.766153 -0.100000 5.800000 19.684064 -0.100000 5.900000 19.621975 -0.100000 6.000000 19.579885 -0.100000 6.100000 19.557796 -0.100000 6.200000 19.555707 -0.100000 6.300000 19.573617 -0.100000 6.400000 19.611528 -0.100000 6.500000 19.669438 -0.100000 6.600000 19.747349 -0.100000 6.700000 19.845260 -0.100000 6.800000 19.963170 -0.100000 6.900000 20.101081 -0.100000 7.000000 20.258992 -0.100000 7.100000 20.436902 -0.100000 7.200000 20.634813 -0.100000 7.300000 20.852724 -0.100000 7.400000 21.090634 -0.100000 7.500000 21.348545 -0.100000 7.600000 21.626456 -0.100000 7.700000 21.924366 -0.100000 7.800000 22.242277 -0.100000 7.900000 22.580187 -0.100000 8.000000 22.938098 -0.100000 8.100000 23.316009 -0.100000 8.200000 23.713919 -0.100000 8.300000 24.131830 -0.100000 8.400000 24.569741 -0.100000 8.500000 25.027651 -0.100000 8.600000 25.505562 -0.100000 8.700000 26.003473 -0.100000 8.800000 26.521383 -0.100000 8.900000 27.059294 -0.100000 9.000000 27.617205 -0.100000 9.100000 28.195115 -0.100000 9.200000 28.793026 -0.100000 9.300000 29.410936 -0.100000 9.400000 30.048847 -0.100000 9.500000 30.706758 -0.100000 9.600000 31.384668 -0.100000 9.700000 32.082579 -0.100000 9.800000 32.800490 -0.100000 9.900000 33.538400 -0.100000 10.000000 34.296311 -0.100000 10.100000 35.074222 -0.100000 10.200000 35.872132 -0.100000 10.300000 36.690043 -0.100000 10.400000 37.527954 -0.100000 10.500000 38.385864 -0.100000 10.600000 39.263775 -0.100000 10.700000 40.161685 -0.100000 10.800000 41.079596 -0.100000 10.900000 42.017507 -0.100000 11.000000 42.975417 -0.100000 11.100000 43.953328 -0.100000 11.200000 44.951239 -0.100000 11.300000 45.969149 -0.100000 11.400000 47.007060 -0.100000 11.500000 48.064971 -0.100000 11.600000 49.142881 -0.100000 11.700000 50.240792 -0.100000 11.800000 51.358703 -0.100000 11.900000 52.496613 -0.100000 12.000000 53.654524 -0.100000 12.100000 54.832434 -0.100000 12.200000 56.030345 -0.100000 12.300000 57.248256 -0.100000 12.400000 58.486166 -0.100000 12.500000 59.744077 -0.100000 12.600000 61.021988 -0.100000 12.700000 62.319898 -0.100000 12.800000 63.637809 -0.100000 12.900000 64.975720 -0.100000 13.000000 66.333630 -0.100000 13.100000 67.711541 -0.100000 13.200000 69.109451 -0.100000 13.300000 70.527362 -0.100000 13.400000 71.965273 -0.100000 13.500000 73.423183 -0.100000 13.600000 74.901094 -0.100000 13.700000 76.399005 -0.100000 13.800000 77.916915 -0.100000 13.900000 79.454826 -0.100000 14.000000 81.012737 -0.100000 14.100000 82.590647 -0.100000 14.200000 84.188558 -0.100000 14.300000 85.806469 -0.100000 14.400000 87.444379 -0.100000 14.500000 89.102290 -0.100000 14.600000 90.780200 -0.100000 14.700000 92.478111 -0.100000 14.800000 94.196022 -0.100000 14.900000 95.933932 -0.100000 15.000000 97.691843 -0.000000 -5.000000 140.602113 -0.000000 -4.900000 138.412113 -0.000000 -4.800000 136.242113 -0.000000 -4.700000 134.092113 -0.000000 -4.600000 131.962113 -0.000000 -4.500000 129.852113 -0.000000 -4.400000 127.762113 -0.000000 -4.300000 125.692113 -0.000000 -4.200000 123.642113 -0.000000 -4.100000 121.612113 -0.000000 -4.000000 119.602113 -0.000000 -3.900000 117.612113 -0.000000 -3.800000 115.642113 -0.000000 -3.700000 113.692113 -0.000000 -3.600000 111.762113 -0.000000 -3.500000 109.852113 -0.000000 -3.400000 107.962113 -0.000000 -3.300000 106.092113 -0.000000 -3.200000 104.242113 -0.000000 -3.100000 102.412113 -0.000000 -3.000000 100.602113 -0.000000 -2.900000 98.812113 -0.000000 -2.800000 97.042113 -0.000000 -2.700000 95.292113 -0.000000 -2.600000 93.562113 -0.000000 -2.500000 91.852113 -0.000000 -2.400000 90.162113 -0.000000 -2.300000 88.492113 -0.000000 -2.200000 86.842113 -0.000000 -2.100000 85.212113 -0.000000 -2.000000 83.602113 -0.000000 -1.900000 82.012113 -0.000000 -1.800000 80.442113 -0.000000 -1.700000 78.892113 -0.000000 -1.600000 77.362113 -0.000000 -1.500000 75.852113 -0.000000 -1.400000 74.362113 -0.000000 -1.300000 72.892113 -0.000000 -1.200000 71.442113 -0.000000 -1.100000 70.012113 -0.000000 -1.000000 68.602113 -0.000000 -0.900000 67.212113 -0.000000 -0.800000 65.842113 -0.000000 -0.700000 64.492113 -0.000000 -0.600000 63.162113 -0.000000 -0.500000 61.852113 -0.000000 -0.400000 60.562113 -0.000000 -0.300000 59.292113 -0.000000 -0.200000 58.042113 -0.000000 -0.100000 56.812113 -0.000000 -0.000000 55.602113 -0.000000 0.100000 54.412113 -0.000000 0.200000 53.242113 -0.000000 0.300000 52.092113 -0.000000 0.400000 50.962113 -0.000000 0.500000 49.852113 -0.000000 0.600000 48.762113 -0.000000 0.700000 47.692113 -0.000000 0.800000 46.642113 -0.000000 0.900000 45.612113 -0.000000 1.000000 44.602113 -0.000000 1.100000 43.612113 -0.000000 1.200000 42.642113 -0.000000 1.300000 41.692113 -0.000000 1.400000 40.762113 -0.000000 1.500000 39.852113 -0.000000 1.600000 38.962113 -0.000000 1.700000 38.092113 -0.000000 1.800000 37.242113 -0.000000 1.900000 36.412113 -0.000000 2.000000 35.602113 -0.000000 2.100000 34.812113 -0.000000 2.200000 34.042113 -0.000000 2.300000 33.292113 -0.000000 2.400000 32.562113 -0.000000 2.500000 31.852113 -0.000000 2.600000 31.162113 -0.000000 2.700000 30.492113 -0.000000 2.800000 29.842113 -0.000000 2.900000 29.212113 -0.000000 3.000000 28.602113 -0.000000 3.100000 28.012113 -0.000000 3.200000 27.442113 -0.000000 3.300000 26.892113 -0.000000 3.400000 26.362113 -0.000000 3.500000 25.852113 -0.000000 3.600000 25.362113 -0.000000 3.700000 24.892113 -0.000000 3.800000 24.442113 -0.000000 3.900000 24.012113 -0.000000 4.000000 23.602113 -0.000000 4.100000 23.212113 -0.000000 4.200000 22.842113 -0.000000 4.300000 22.492113 -0.000000 4.400000 22.162113 -0.000000 4.500000 21.852113 -0.000000 4.600000 21.562113 -0.000000 4.700000 21.292113 -0.000000 4.800000 21.042113 -0.000000 4.900000 20.812113 -0.000000 5.000000 20.602113 -0.000000 5.100000 20.412113 -0.000000 5.200000 20.242113 -0.000000 5.300000 20.092113 -0.000000 5.400000 19.962113 -0.000000 5.500000 19.852113 -0.000000 5.600000 19.762113 -0.000000 5.700000 19.692113 -0.000000 5.800000 19.642113 -0.000000 5.900000 19.612113 -0.000000 6.000000 19.602113 -0.000000 6.100000 19.612113 -0.000000 6.200000 19.642113 -0.000000 6.300000 19.692113 -0.000000 6.400000 19.762113 -0.000000 6.500000 19.852113 -0.000000 6.600000 19.962113 -0.000000 6.700000 20.092113 -0.000000 6.800000 20.242113 -0.000000 6.900000 20.412113 -0.000000 7.000000 20.602113 -0.000000 7.100000 20.812113 -0.000000 7.200000 21.042113 -0.000000 7.300000 21.292113 -0.000000 7.400000 21.562113 -0.000000 7.500000 21.852113 -0.000000 7.600000 22.162113 -0.000000 7.700000 22.492113 -0.000000 7.800000 22.842113 -0.000000 7.900000 23.212113 -0.000000 8.000000 23.602113 -0.000000 8.100000 24.012113 -0.000000 8.200000 24.442113 -0.000000 8.300000 24.892113 -0.000000 8.400000 25.362113 -0.000000 8.500000 25.852113 -0.000000 8.600000 26.362113 -0.000000 8.700000 26.892113 -0.000000 8.800000 27.442113 -0.000000 8.900000 28.012113 -0.000000 9.000000 28.602113 -0.000000 9.100000 29.212113 -0.000000 9.200000 29.842113 -0.000000 9.300000 30.492113 -0.000000 9.400000 31.162113 -0.000000 9.500000 31.852113 -0.000000 9.600000 32.562113 -0.000000 9.700000 33.292113 -0.000000 9.800000 34.042113 -0.000000 9.900000 34.812113 -0.000000 10.000000 35.602113 -0.000000 10.100000 36.412113 -0.000000 10.200000 37.242113 -0.000000 10.300000 38.092113 -0.000000 10.400000 38.962113 -0.000000 10.500000 39.852113 -0.000000 10.600000 40.762113 -0.000000 10.700000 41.692113 -0.000000 10.800000 42.642113 -0.000000 10.900000 43.612113 -0.000000 11.000000 44.602113 -0.000000 11.100000 45.612113 -0.000000 11.200000 46.642113 -0.000000 11.300000 47.692113 -0.000000 11.400000 48.762113 -0.000000 11.500000 49.852113 -0.000000 11.600000 50.962113 -0.000000 11.700000 52.092113 -0.000000 11.800000 53.242113 -0.000000 11.900000 54.412113 -0.000000 12.000000 55.602113 -0.000000 12.100000 56.812113 -0.000000 12.200000 58.042113 -0.000000 12.300000 59.292113 -0.000000 12.400000 60.562113 -0.000000 12.500000 61.852113 -0.000000 12.600000 63.162113 -0.000000 12.700000 64.492113 -0.000000 12.800000 65.842113 -0.000000 12.900000 67.212113 -0.000000 13.000000 68.602113 -0.000000 13.100000 70.012113 -0.000000 13.200000 71.442113 -0.000000 13.300000 72.892113 -0.000000 13.400000 74.362113 -0.000000 13.500000 75.852113 -0.000000 13.600000 77.362113 -0.000000 13.700000 78.892113 -0.000000 13.800000 80.442113 -0.000000 13.900000 82.012113 -0.000000 14.000000 83.602113 -0.000000 14.100000 85.212113 -0.000000 14.200000 86.842113 -0.000000 14.300000 88.492113 -0.000000 14.400000 90.162113 -0.000000 14.500000 91.852113 -0.000000 14.600000 93.562113 -0.000000 14.700000 95.292113 -0.000000 14.800000 97.042113 -0.000000 14.900000 98.812113 -0.000000 15.000000 100.602113 0.100000 -5.000000 137.106075 0.100000 -4.900000 134.947647 0.100000 -4.800000 132.809220 0.100000 -4.700000 130.690793 0.100000 -4.600000 128.592365 0.100000 -4.500000 126.513938 0.100000 -4.400000 124.455510 0.100000 -4.300000 122.417083 0.100000 -4.200000 120.398656 0.100000 -4.100000 118.400228 0.100000 -4.000000 116.421801 0.100000 -3.900000 114.463373 0.100000 -3.800000 112.524946 0.100000 -3.700000 110.606519 0.100000 -3.600000 108.708091 0.100000 -3.500000 106.829664 0.100000 -3.400000 104.971237 0.100000 -3.300000 103.132809 0.100000 -3.200000 101.314382 0.100000 -3.100000 99.515954 0.100000 -3.000000 97.737527 0.100000 -2.900000 95.979100 0.100000 -2.800000 94.240672 0.100000 -2.700000 92.522245 0.100000 -2.600000 90.823818 0.100000 -2.500000 89.145390 0.100000 -2.400000 87.486963 0.100000 -2.300000 85.848535 0.100000 -2.200000 84.230108 0.100000 -2.100000 82.631681 0.100000 -2.000000 81.053253 0.100000 -1.900000 79.494826 0.100000 -1.800000 77.956399 0.100000 -1.700000 76.437971 0.100000 -1.600000 74.939544 0.100000 -1.500000 73.461116 0.100000 -1.400000 72.002689 0.100000 -1.300000 70.564262 0.100000 -1.200000 69.145834 0.100000 -1.100000 67.747407 0.100000 -1.000000 66.368979 0.100000 -0.900000 65.010552 0.100000 -0.800000 63.672125 0.100000 -0.700000 62.353697 0.100000 -0.600000 61.055270 0.100000 -0.500000 59.776843 0.100000 -0.400000 58.518415 0.100000 -0.300000 57.279988 0.100000 -0.200000 56.061560 0.100000 -0.100000 54.863133 0.100000 -0.000000 53.684706 0.100000 0.100000 52.526278 0.100000 0.200000 51.387851 0.100000 0.300000 50.269424 0.100000 0.400000 49.170996 0.100000 0.500000 48.092569 0.100000 0.600000 47.034141 0.100000 0.700000 45.995714 0.100000 0.800000 44.977287 0.100000 0.900000 43.978859 0.100000 1.000000 43.000432 0.100000 1.100000 42.042004 0.100000 1.200000 41.103577 0.100000 1.300000 40.185150 0.100000 1.400000 39.286722 0.100000 1.500000 38.408295 0.100000 1.600000 37.549868 0.100000 1.700000 36.711440 0.100000 1.800000 35.893013 0.100000 1.900000 35.094585 0.100000 2.000000 34.316158 0.100000 2.100000 33.557731 0.100000 2.200000 32.819303 0.100000 2.300000 32.100876 0.100000 2.400000 31.402449 0.100000 2.500000 30.724021 0.100000 2.600000 30.065594 0.100000 2.700000 29.427166 0.100000 2.800000 28.808739 0.100000 2.900000 28.210312 0.100000 3.000000 27.631884 0.100000 3.100000 27.073457 0.100000 3.200000 26.535029 0.100000 3.300000 26.016602 0.100000 3.400000 25.518175 0.100000 3.500000 25.039747 0.100000 3.600000 24.581320 0.100000 3.700000 24.142893 0.100000 3.800000 23.724465 0.100000 3.900000 23.326038 0.100000 4.000000 22.947610 0.100000 4.100000 22.589183 0.100000 4.200000 22.250756 0.100000 4.300000 21.932328 0.100000 4.400000 21.633901 0.100000 4.500000 21.355474 0.100000 4.600000 21.097046 0.100000 4.700000 20.858619 0.100000 4.800000 20.640191 0.100000 4.900000 20.441764 0.100000 5.000000 20.263337 0.100000 5.100000 20.104909 0.100000 5.200000 19.966482 0.100000 5.300000 19.848054 0.100000 5.400000 19.749627 0.100000 5.500000 19.671200 0.100000 5.600000 19.612772 0.100000 5.700000 19.574345 0.100000 5.800000 19.555918 0.100000 5.900000 19.557490 0.100000 6.000000 19.579063 0.100000 6.100000 19.620635 0.100000 6.200000 19.682208 0.100000 6.300000 19.763781 0.100000 6.400000 19.865353 0.100000 6.500000 19.986926 0.100000 6.600000 20.128499 0.100000 6.700000 20.290071 0.100000 6.800000 20.471644 0.100000 6.900000 20.673216 0.100000 7.000000 20.894789 0.100000 7.100000 21.136362 0.100000 7.200000 21.397934 0.100000 7.300000 21.679507 0.100000 7.400000 21.981080 0.100000 7.500000 22.302652 0.100000 7.600000 22.644225 0.100000 7.700000 23.005797 0.100000 7.800000 23.387370 0.100000 7.900000 23.788943 0.100000 8.000000 24.210515 0.100000 8.100000 24.652088 0.100000 8.200000 25.113660 0.100000 8.300000 25.595233 0.100000 8.400000 26.096806 0.100000 8.500000 26.618378 0.100000 8.600000 27.159951 0.100000 8.700000 27.721524 0.100000 8.800000 28.303096 0.100000 8.900000 28.904669 0.100000 9.000000 29.526241 0.100000 9.100000 30.167814 0.100000 9.200000 30.829387 0.100000 9.300000 31.510959 0.100000 9.400000 32.212532 0.100000 9.500000 32.934105 0.100000 9.600000 33.675677 0.100000 9.700000 34.437250 0.100000 9.800000 35.218822 0.100000 9.900000 36.020395 0.100000 10.000000 36.841968 0.100000 10.100000 37.683540 0.100000 10.200000 38.545113 0.100000 10.300000 39.426685 0.100000 10.400000 40.328258 0.100000 10.500000 41.249831 0.100000 10.600000 42.191403 0.100000 10.700000 43.152976 0.100000 10.800000 44.134549 0.100000 10.900000 45.136121 0.100000 11.000000 46.157694 0.100000 11.100000 47.199266 0.100000 11.200000 48.260839 0.100000 11.300000 49.342412 0.100000 11.400000 50.443984 0.100000 11.500000 51.565557 0.100000 11.600000 52.707130 0.100000 11.700000 53.868702 0.100000 11.800000 55.050275 0.100000 11.900000 56.251847 0.100000 12.000000 57.473420 0.100000 12.100000 58.714993 0.100000 12.200000 59.976565 0.100000 12.300000 61.258138 0.100000 12.400000 62.559710 0.100000 12.500000 63.881283 0.100000 12.600000 65.222856 0.100000 12.700000 66.584428 0.100000 12.800000 67.966001 0.100000 12.900000 69.367574 0.100000 13.000000 70.789146 0.100000 13.100000 72.230719 0.100000 13.200000 73.692291 0.100000 13.300000 75.173864 0.100000 13.400000 76.675437 0.100000 13.500000 78.197009 0.100000 13.600000 79.738582 0.100000 13.700000 81.300155 0.100000 13.800000 82.881727 0.100000 13.900000 84.483300 0.100000 14.000000 86.104872 0.100000 14.100000 87.746445 0.100000 14.200000 89.408018 0.100000 14.300000 91.089590 0.100000 14.400000 92.791163 0.100000 14.500000 94.512735 0.100000 14.600000 96.254308 0.100000 14.700000 98.015881 0.100000 14.800000 99.797453 0.100000 14.900000 101.599026 0.100000 15.000000 103.420599 0.200000 -5.000000 133.619633 0.200000 -4.900000 131.492261 0.200000 -4.800000 129.384890 0.200000 -4.700000 127.297518 0.200000 -4.600000 125.230147 0.200000 -4.500000 123.182775 0.200000 -4.400000 121.155404 0.200000 -4.300000 119.148032 0.200000 -4.200000 117.160661 0.200000 -4.100000 115.193289 0.200000 -4.000000 113.245918 0.200000 -3.900000 111.318546 0.200000 -3.800000 109.411175 0.200000 -3.700000 107.523803 0.200000 -3.600000 105.656432 0.200000 -3.500000 103.809060 0.200000 -3.400000 101.981689 0.200000 -3.300000 100.174317 0.200000 -3.200000 98.386946 0.200000 -3.100000 96.619574 0.200000 -3.000000 94.872203 0.200000 -2.900000 93.144831 0.200000 -2.800000 91.437460 0.200000 -2.700000 89.750088 0.200000 -2.600000 88.082717 0.200000 -2.500000 86.435345 0.200000 -2.400000 84.807974 0.200000 -2.300000 83.200602 0.200000 -2.200000 81.613231 0.200000 -2.100000 80.045859 0.200000 -2.000000 78.498488 0.200000 -1.900000 76.971116 0.200000 -1.800000 75.463745 0.200000 -1.700000 73.976373 0.200000 -1.600000 72.509002 0.200000 -1.500000 71.061630 0.200000 -1.400000 69.634259 0.200000 -1.300000 68.226887 0.200000 -1.200000 66.839516 0.200000 -1.100000 65.472144 0.200000 -1.000000 64.124773 0.200000 -0.900000 62.797401 0.200000 -0.800000 61.490030 0.200000 -0.700000 60.202658 0.200000 -0.600000 58.935287 0.200000 -0.500000 57.687915 0.200000 -0.400000 56.460544 0.200000 -0.300000 55.253172 0.200000 -0.200000 54.065801 0.200000 -0.100000 52.898429 0.200000 -0.000000 51.751058 0.200000 0.100000 50.623686 0.200000 0.200000 49.516315 0.200000 0.300000 48.428943 0.200000 0.400000 47.361572 0.200000 0.500000 46.314200 0.200000 0.600000 45.286829 0.200000 0.700000 44.279457 0.200000 0.800000 43.292086 0.200000 0.900000 42.324714 0.200000 1.000000 41.377343 0.200000 1.100000 40.449971 0.200000 1.200000 39.542600 0.200000 1.300000 38.655228 0.200000 1.400000 37.787857 0.200000 1.500000 36.940485 0.200000 1.600000 36.113114 0.200000 1.700000 35.305742 0.200000 1.800000 34.518371 0.200000 1.900000 33.750999 0.200000 2.000000 33.003628 0.200000 2.100000 32.276256 0.200000 2.200000 31.568885 0.200000 2.300000 30.881513 0.200000 2.400000 30.214142 0.200000 2.500000 29.566770 0.200000 2.600000 28.939399 0.200000 2.700000 28.332027 0.200000 2.800000 27.744656 0.200000 2.900000 27.177284 0.200000 3.000000 26.629913 0.200000 3.100000 26.102541 0.200000 3.200000 25.595170 0.200000 3.300000 25.107798 0.200000 3.400000 24.640427 0.200000 3.500000 24.193055 0.200000 3.600000 23.765684 0.200000 3.700000 23.358312 0.200000 3.800000 22.970941 0.200000 3.900000 22.603569 0.200000 4.000000 22.256198 0.200000 4.100000 21.928826 0.200000 4.200000 21.621455 0.200000 4.300000 21.334083 0.200000 4.400000 21.066712 0.200000 4.500000 20.819340 0.200000 4.600000 20.591969 0.200000 4.700000 20.384597 0.200000 4.800000 20.197226 0.200000 4.900000 20.029854 0.200000 5.000000 19.882483 0.200000 5.100000 19.755111 0.200000 5.200000 19.647740 0.200000 5.300000 19.560368 0.200000 5.400000 19.492997 0.200000 5.500000 19.445625 0.200000 5.600000 19.418254 0.200000 5.700000 19.410882 0.200000 5.800000 19.423511 0.200000 5.900000 19.456139 0.200000 6.000000 19.508768 0.200000 6.100000 19.581396 0.200000 6.200000 19.674025 0.200000 6.300000 19.786653 0.200000 6.400000 19.919282 0.200000 6.500000 20.071910 0.200000 6.600000 20.244539 0.200000 6.700000 20.437167 0.200000 6.800000 20.649796 0.200000 6.900000 20.882424 0.200000 7.000000 21.135053 0.200000 7.100000 21.407681 0.200000 7.200000 21.700310 0.200000 7.300000 22.012938 0.200000 7.400000 22.345567 0.200000 7.500000 22.698195 0.200000 7.600000 23.070824 0.200000 7.700000 23.463452 0.200000 7.800000 23.876081 0.200000 7.900000 24.308709 0.200000 8.000000 24.761338 0.200000 8.100000 25.233966 0.200000 8.200000 25.726595 0.200000 8.300000 26.239223 0.200000 8.400000 26.771852 0.200000 8.500000 27.324480 0.200000 8.600000 27.897109 0.200000 8.700000 28.489737 0.200000 8.800000 29.102366 0.200000 8.900000 29.734994 0.200000 9.000000 30.387623 0.200000 9.100000 31.060251 0.200000 9.200000 31.752880 0.200000 9.300000 32.465508 0.200000 9.400000 33.198137 0.200000 9.500000 33.950765 0.200000 9.600000 34.723394 0.200000 9.700000 35.516022 0.200000 9.800000 36.328651 0.200000 9.900000 37.161279 0.200000 10.000000 38.013908 0.200000 10.100000 38.886536 0.200000 10.200000 39.779165 0.200000 10.300000 40.691793 0.200000 10.400000 41.624422 0.200000 10.500000 42.577050 0.200000 10.600000 43.549679 0.200000 10.700000 44.542307 0.200000 10.800000 45.554936 0.200000 10.900000 46.587564 0.200000 11.000000 47.640193 0.200000 11.100000 48.712821 0.200000 11.200000 49.805450 0.200000 11.300000 50.918078 0.200000 11.400000 52.050707 0.200000 11.500000 53.203335 0.200000 11.600000 54.375964 0.200000 11.700000 55.568592 0.200000 11.800000 56.781221 0.200000 11.900000 58.013849 0.200000 12.000000 59.266478 0.200000 12.100000 60.539106 0.200000 12.200000 61.831735 0.200000 12.300000 63.144363 0.200000 12.400000 64.476992 0.200000 12.500000 65.829620 0.200000 12.600000 67.202249 0.200000 12.700000 68.594877 0.200000 12.800000 70.007506 0.200000 12.900000 71.440134 0.200000 13.000000 72.892763 0.200000 13.100000 74.365391 0.200000 13.200000 75.858020 0.200000 13.300000 77.370648 0.200000 13.400000 78.903277 0.200000 13.500000 80.455905 0.200000 13.600000 82.028534 0.200000 13.700000 83.621162 0.200000 13.800000 85.233791 0.200000 13.900000 86.866419 0.200000 14.000000 88.519048 0.200000 14.100000 90.191677 0.200000 14.200000 91.884305 0.200000 14.300000 93.596934 0.200000 14.400000 95.329562 0.200000 14.500000 97.082191 0.200000 14.600000 98.854819 0.200000 14.700000 100.647448 0.200000 14.800000 102.460076 0.200000 14.900000 104.292705 0.200000 15.000000 106.145333 0.300000 -5.000000 130.141813 0.300000 -4.900000 128.044981 0.300000 -4.800000 125.968148 0.300000 -4.700000 123.911316 0.300000 -4.600000 121.874483 0.300000 -4.500000 119.857651 0.300000 -4.400000 117.860819 0.300000 -4.300000 115.883986 0.300000 -4.200000 113.927154 0.300000 -4.100000 111.990322 0.300000 -4.000000 110.073489 0.300000 -3.900000 108.176657 0.300000 -3.800000 106.299825 0.300000 -3.700000 104.442992 0.300000 -3.600000 102.606160 0.300000 -3.500000 100.789328 0.300000 -3.400000 98.992495 0.300000 -3.300000 97.215663 0.300000 -3.200000 95.458831 0.300000 -3.100000 93.721998 0.300000 -3.000000 92.005166 0.300000 -2.900000 90.308333 0.300000 -2.800000 88.631501 0.300000 -2.700000 86.974669 0.300000 -2.600000 85.337836 0.300000 -2.500000 83.721004 0.300000 -2.400000 82.124172 0.300000 -2.300000 80.547339 0.300000 -2.200000 78.990507 0.300000 -2.100000 77.453675 0.300000 -2.000000 75.936842 0.300000 -1.900000 74.440010 0.300000 -1.800000 72.963178 0.300000 -1.700000 71.506345 0.300000 -1.600000 70.069513 0.300000 -1.500000 68.652680 0.300000 -1.400000 67.255848 0.300000 -1.300000 65.879016 0.300000 -1.200000 64.522183 0.300000 -1.100000 63.185351 0.300000 -1.000000 61.868519 0.300000 -0.900000 60.571686 0.300000 -0.800000 59.294854 0.300000 -0.700000 58.038022 0.300000 -0.600000 56.801189 0.300000 -0.500000 55.584357 0.300000 -0.400000 54.387525 0.300000 -0.300000 53.210692 0.300000 -0.200000 52.053860 0.300000 -0.100000 50.917028 0.300000 -0.000000 49.800195 0.300000 0.100000 48.703363 0.300000 0.200000 47.626530 0.300000 0.300000 46.569698 0.300000 0.400000 45.532866 0.300000 0.500000 44.516033 0.300000 0.600000 43.519201 0.300000 0.700000 42.542369 0.300000 0.800000 41.585536 0.300000 0.900000 40.648704 0.300000 1.000000 39.731872 0.300000 1.100000 38.835039 0.300000 1.200000 37.958207 0.300000 1.300000 37.101375 0.300000 1.400000 36.264542 0.300000 1.500000 35.447710 0.300000 1.600000 34.650877 0.300000 1.700000 33.874045 0.300000 1.800000 33.117213 0.300000 1.900000 32.380380 0.300000 2.000000 31.663548 0.300000 2.100000 30.966716 0.300000 2.200000 30.289883 0.300000 2.300000 29.633051 0.300000 2.400000 28.996219 0.300000 2.500000 28.379386 0.300000 2.600000 27.782554 0.300000 2.700000 27.205722 0.300000 2.800000 26.648889 0.300000 2.900000 26.112057 0.300000 3.000000 25.595224 0.300000 3.100000 25.098392 0.300000 3.200000 24.621560 0.300000 3.300000 24.164727 0.300000 3.400000 23.727895 0.300000 3.500000 23.311063 0.300000 3.600000 22.914230 0.300000 3.700000 22.537398 0.300000 3.800000 22.180566 0.300000 3.900000 21.843733 0.300000 4.000000 21.526901 0.300000 4.100000 21.230069 0.300000 4.200000 20.953236 0.300000 4.300000 20.696404 0.300000 4.400000 20.459572 0.300000 4.500000 20.242739 0.300000 4.600000 20.045907 0.300000 4.700000 19.869074 0.300000 4.800000 19.712242 0.300000 4.900000 19.575410 0.300000 5.000000 19.458577 0.300000 5.100000 19.361745 0.300000 5.200000 19.284913 0.300000 5.300000 19.228080 0.300000 5.400000 19.191248 0.300000 5.500000 19.174416 0.300000 5.600000 19.177583 0.300000 5.700000 19.200751 0.300000 5.800000 19.243919 0.300000 5.900000 19.307086 0.300000 6.000000 19.390254 0.300000 6.100000 19.493421 0.300000 6.200000 19.616589 0.300000 6.300000 19.759757 0.300000 6.400000 19.922924 0.300000 6.500000 20.106092 0.300000 6.600000 20.309260 0.300000 6.700000 20.532427 0.300000 6.800000 20.775595 0.300000 6.900000 21.038763 0.300000 7.000000 21.321930 0.300000 7.100000 21.625098 0.300000 7.200000 21.948266 0.300000 7.300000 22.291433 0.300000 7.400000 22.654601 0.300000 7.500000 23.037769 0.300000 7.600000 23.440936 0.300000 7.700000 23.864104 0.300000 7.800000 24.307271 0.300000 7.900000 24.770439 0.300000 8.000000 25.253607 0.300000 8.100000 25.756774 0.300000 8.200000 26.279942 0.300000 8.300000 26.823110 0.300000 8.400000 27.386277 0.300000 8.500000 27.969445 0.300000 8.600000 28.572613 0.300000 8.700000 29.195780 0.300000 8.800000 29.838948 0.300000 8.900000 30.502116 0.300000 9.000000 31.185283 0.300000 9.100000 31.888451 0.300000 9.200000 32.611618 0.300000 9.300000 33.354786 0.300000 9.400000 34.117954 0.300000 9.500000 34.901121 0.300000 9.600000 35.704289 0.300000 9.700000 36.527457 0.300000 9.800000 37.370624 0.300000 9.900000 38.233792 0.300000 10.000000 39.116960 0.300000 10.100000 40.020127 0.300000 10.200000 40.943295 0.300000 10.300000 41.886463 0.300000 10.400000 42.849630 0.300000 10.500000 43.832798 0.300000 10.600000 44.835965 0.300000 10.700000 45.859133 0.300000 10.800000 46.902301 0.300000 10.900000 47.965468 0.300000 11.000000 49.048636 0.300000 11.100000 50.151804 0.300000 11.200000 51.274971 0.300000 11.300000 52.418139 0.300000 11.400000 53.581307 0.300000 11.500000 54.764474 0.300000 11.600000 55.967642 0.300000 11.700000 57.190810 0.300000 11.800000 58.433977 0.300000 11.900000 59.697145 0.300000 12.000000 60.980313 0.300000 12.100000 62.283480 0.300000 12.200000 63.606648 0.300000 12.300000 64.949815 0.300000 12.400000 66.312983 0.300000 12.500000 67.696151 0.300000 12.600000 69.099318 0.300000 12.700000 70.522486 0.300000 12.800000 71.965654 0.300000 12.900000 73.428821 0.300000 13.000000 74.911989 0.300000 13.100000 76.415157 0.300000 13.200000 77.938324 0.300000 13.300000 79.481492 0.300000 13.400000 81.044660 0.300000 13.500000 82.627827 0.300000 13.600000 84.230995 0.300000 13.700000 85.854162 0.300000 13.800000 87.497330 0.300000 13.900000 89.160498 0.300000 14.000000 90.843665 0.300000 14.100000 92.546833 0.300000 14.200000 94.270001 0.300000 14.300000 96.013168 0.300000 14.400000 97.776336 0.300000 14.500000 99.559504 0.300000 14.600000 101.362671 0.300000 14.700000 103.185839 0.300000 14.800000 105.029007 0.300000 14.900000 106.892174 0.300000 15.000000 108.775342 0.400000 -5.000000 126.672621 0.400000 -4.900000 124.605811 0.400000 -4.800000 122.559001 0.400000 -4.700000 120.532191 0.400000 -4.600000 118.525381 0.400000 -4.500000 116.538571 0.400000 -4.400000 114.571761 0.400000 -4.300000 112.624951 0.400000 -4.200000 110.698141 0.400000 -4.100000 108.791331 0.400000 -4.000000 106.904521 0.400000 -3.900000 105.037711 0.400000 -3.800000 103.190901 0.400000 -3.700000 101.364091 0.400000 -3.600000 99.557281 0.400000 -3.500000 97.770471 0.400000 -3.400000 96.003661 0.400000 -3.300000 94.256851 0.400000 -3.200000 92.530042 0.400000 -3.100000 90.823232 0.400000 -3.000000 89.136422 0.400000 -2.900000 87.469612 0.400000 -2.800000 85.822802 0.400000 -2.700000 84.195992 0.400000 -2.600000 82.589182 0.400000 -2.500000 81.002372 0.400000 -2.400000 79.435562 0.400000 -2.300000 77.888752 0.400000 -2.200000 76.361942 0.400000 -2.100000 74.855132 0.400000 -2.000000 73.368322 0.400000 -1.900000 71.901512 0.400000 -1.800000 70.454702 0.400000 -1.700000 69.027892 0.400000 -1.600000 67.621082 0.400000 -1.500000 66.234272 0.400000 -1.400000 64.867462 0.400000 -1.300000 63.520652 0.400000 -1.200000 62.193843 0.400000 -1.100000 60.887033 0.400000 -1.000000 59.600223 0.400000 -0.900000 58.333413 0.400000 -0.800000 57.086603 0.400000 -0.700000 55.859793 0.400000 -0.600000 54.652983 0.400000 -0.500000 53.466173 0.400000 -0.400000 52.299363 0.400000 -0.300000 51.152553 0.400000 -0.200000 50.025743 0.400000 -0.100000 48.918933 0.400000 -0.000000 47.832123 0.400000 0.100000 46.765313 0.400000 0.200000 45.718503 0.400000 0.300000 44.691693 0.400000 0.400000 43.684883 0.400000 0.500000 42.698073 0.400000 0.600000 41.731263 0.400000 0.700000 40.784453 0.400000 0.800000 39.857644 0.400000 0.900000 38.950834 0.400000 1.000000 38.064024 0.400000 1.100000 37.197214 0.400000 1.200000 36.350404 0.400000 1.300000 35.523594 0.400000 1.400000 34.716784 0.400000 1.500000 33.929974 0.400000 1.600000 33.163164 0.400000 1.700000 32.416354 0.400000 1.800000 31.689544 0.400000 1.900000 30.982734 0.400000 2.000000 30.295924 0.400000 2.100000 29.629114 0.400000 2.200000 28.982304 0.400000 2.300000 28.355494 0.400000 2.400000 27.748684 0.400000 2.500000 27.161874 0.400000 2.600000 26.595064 0.400000 2.700000 26.048254 0.400000 2.800000 25.521445 0.400000 2.900000 25.014635 0.400000 3.000000 24.527825 0.400000 3.100000 24.061015 0.400000 3.200000 23.614205 0.400000 3.300000 23.187395 0.400000 3.400000 22.780585 0.400000 3.500000 22.393775 0.400000 3.600000 22.026965 0.400000 3.700000 21.680155 0.400000 3.800000 21.353345 0.400000 3.900000 21.046535 0.400000 4.000000 20.759725 0.400000 4.100000 20.492915 0.400000 4.200000 20.246105 0.400000 4.300000 20.019295 0.400000 4.400000 19.812485 0.400000 4.500000 19.625675 0.400000 4.600000 19.458865 0.400000 4.700000 19.312055 0.400000 4.800000 19.185246 0.400000 4.900000 19.078436 0.400000 5.000000 18.991626 0.400000 5.100000 18.924816 0.400000 5.200000 18.878006 0.400000 5.300000 18.851196 0.400000 5.400000 18.844386 0.400000 5.500000 18.857576 0.400000 5.600000 18.890766 0.400000 5.700000 18.943956 0.400000 5.800000 19.017146 0.400000 5.900000 19.110336 0.400000 6.000000 19.223526 0.400000 6.100000 19.356716 0.400000 6.200000 19.509906 0.400000 6.300000 19.683096 0.400000 6.400000 19.876286 0.400000 6.500000 20.089476 0.400000 6.600000 20.322666 0.400000 6.700000 20.575856 0.400000 6.800000 20.849047 0.400000 6.900000 21.142237 0.400000 7.000000 21.455427 0.400000 7.100000 21.788617 0.400000 7.200000 22.141807 0.400000 7.300000 22.514997 0.400000 7.400000 22.908187 0.400000 7.500000 23.321377 0.400000 7.600000 23.754567 0.400000 7.700000 24.207757 0.400000 7.800000 24.680947 0.400000 7.900000 25.174137 0.400000 8.000000 25.687327 0.400000 8.100000 26.220517 0.400000 8.200000 26.773707 0.400000 8.300000 27.346897 0.400000 8.400000 27.940087 0.400000 8.500000 28.553277 0.400000 8.600000 29.186467 0.400000 8.700000 29.839657 0.400000 8.800000 30.512848 0.400000 8.900000 31.206038 0.400000 9.000000 31.919228 0.400000 9.100000 32.652418 0.400000 9.200000 33.405608 0.400000 9.300000 34.178798 0.400000 9.400000 34.971988 0.400000 9.500000 35.785178 0.400000 9.600000 36.618368 0.400000 9.700000 37.471558 0.400000 9.800000 38.344748 0.400000 9.900000 39.237938 0.400000 10.000000 40.151128 0.400000 10.100000 41.084318 0.400000 10.200000 42.037508 0.400000 10.300000 43.010698 0.400000 10.400000 44.003888 0.400000 10.500000 45.017078 0.400000 10.600000 46.050268 0.400000 10.700000 47.103458 0.400000 10.800000 48.176649 0.400000 10.900000 49.269839 0.400000 11.000000 50.383029 0.400000 11.100000 51.516219 0.400000 11.200000 52.669409 0.400000 11.300000 53.842599 0.400000 11.400000 55.035789 0.400000 11.500000 56.248979 0.400000 11.600000 57.482169 0.400000 11.700000 58.735359 0.400000 11.800000 60.008549 0.400000 11.900000 61.301739 0.400000 12.000000 62.614929 0.400000 12.100000 63.948119 0.400000 12.200000 65.301309 0.400000 12.300000 66.674499 0.400000 12.400000 68.067689 0.400000 12.500000 69.480879 0.400000 12.600000 70.914069 0.400000 12.700000 72.367259 0.400000 12.800000 73.840450 0.400000 12.900000 75.333640 0.400000 13.000000 76.846830 0.400000 13.100000 78.380020 0.400000 13.200000 79.933210 0.400000 13.300000 81.506400 0.400000 13.400000 83.099590 0.400000 13.500000 84.712780 0.400000 13.600000 86.345970 0.400000 13.700000 87.999160 0.400000 13.800000 89.672350 0.400000 13.900000 91.365540 0.400000 14.000000 93.078730 0.400000 14.100000 94.811920 0.400000 14.200000 96.565110 0.400000 14.300000 98.338300 0.400000 14.400000 100.131490 0.400000 14.500000 101.944680 0.400000 14.600000 103.777870 0.400000 14.700000 105.631060 0.400000 14.800000 107.504251 0.400000 14.900000 109.397441 0.400000 15.000000 111.310631 0.500000 -5.000000 123.213017 0.500000 -4.900000 121.175713 0.500000 -4.800000 119.158409 0.500000 -4.700000 117.161104 0.500000 -4.600000 115.183800 0.500000 -4.500000 113.226496 0.500000 -4.400000 111.289192 0.500000 -4.300000 109.371887 0.500000 -4.200000 107.474583 0.500000 -4.100000 105.597279 0.500000 -4.000000 103.739974 0.500000 -3.900000 101.902670 0.500000 -3.800000 100.085366 0.500000 -3.700000 98.288062 0.500000 -3.600000 96.510757 0.500000 -3.500000 94.753453 0.500000 -3.400000 93.016149 0.500000 -3.300000 91.298844 0.500000 -3.200000 89.601540 0.500000 -3.100000 87.924236 0.500000 -3.000000 86.266932 0.500000 -2.900000 84.629627 0.500000 -2.800000 83.012323 0.500000 -2.700000 81.415019 0.500000 -2.600000 79.837714 0.500000 -2.500000 78.280410 0.500000 -2.400000 76.743106 0.500000 -2.300000 75.225802 0.500000 -2.200000 73.728497 0.500000 -2.100000 72.251193 0.500000 -2.000000 70.793889 0.500000 -1.900000 69.356584 0.500000 -1.800000 67.939280 0.500000 -1.700000 66.541976 0.500000 -1.600000 65.164672 0.500000 -1.500000 63.807367 0.500000 -1.400000 62.470063 0.500000 -1.300000 61.152759 0.500000 -1.200000 59.855454 0.500000 -1.100000 58.578150 0.500000 -1.000000 57.320846 0.500000 -0.900000 56.083542 0.500000 -0.800000 54.866237 0.500000 -0.700000 53.668933 0.500000 -0.600000 52.491629 0.500000 -0.500000 51.334325 0.500000 -0.400000 50.197020 0.500000 -0.300000 49.079716 0.500000 -0.200000 47.982412 0.500000 -0.100000 46.905107 0.500000 -0.000000 45.847803 0.500000 0.100000 44.810499 0.500000 0.200000 43.793195 0.500000 0.300000 42.795890 0.500000 0.400000 41.818586 0.500000 0.500000 40.861282 0.500000 0.600000 39.923977 0.500000 0.700000 39.006673 0.500000 0.800000 38.109369 0.500000 0.900000 37.232065 0.500000 1.000000 36.374760 0.500000 1.100000 35.537456 0.500000 1.200000 34.720152 0.500000 1.300000 33.922847 0.500000 1.400000 33.145543 0.500000 1.500000 32.388239 0.500000 1.600000 31.650935 0.500000 1.700000 30.933630 0.500000 1.800000 30.236326 0.500000 1.900000 29.559022 0.500000 2.000000 28.901717 0.500000 2.100000 28.264413 0.500000 2.200000 27.647109 0.500000 2.300000 27.049805 0.500000 2.400000 26.472500 0.500000 2.500000 25.915196 0.500000 2.600000 25.377892 0.500000 2.700000 24.860587 0.500000 2.800000 24.363283 0.500000 2.900000 23.885979 0.500000 3.000000 23.428675 0.500000 3.100000 22.991370 0.500000 3.200000 22.574066 0.500000 3.300000 22.176762 0.500000 3.400000 21.799458 0.500000 3.500000 21.442153 0.500000 3.600000 21.104849 0.500000 3.700000 20.787545 0.500000 3.800000 20.490240 0.500000 3.900000 20.212936 0.500000 4.000000 19.955632 0.500000 4.100000 19.718328 0.500000 4.200000 19.501023 0.500000 4.300000 19.303719 0.500000 4.400000 19.126415 0.500000 4.500000 18.969110 0.500000 4.600000 18.831806 0.500000 4.700000 18.714502 0.500000 4.800000 18.617198 0.500000 4.900000 18.539893 0.500000 5.000000 18.482589 0.500000 5.100000 18.445285 0.500000 5.200000 18.427980 0.500000 5.300000 18.430676 0.500000 5.400000 18.453372 0.500000 5.500000 18.496068 0.500000 5.600000 18.558763 0.500000 5.700000 18.641459 0.500000 5.800000 18.744155 0.500000 5.900000 18.866850 0.500000 6.000000 19.009546 0.500000 6.100000 19.172242 0.500000 6.200000 19.354938 0.500000 6.300000 19.557633 0.500000 6.400000 19.780329 0.500000 6.500000 20.023025 0.500000 6.600000 20.285720 0.500000 6.700000 20.568416 0.500000 6.800000 20.871112 0.500000 6.900000 21.193808 0.500000 7.000000 21.536503 0.500000 7.100000 21.899199 0.500000 7.200000 22.281895 0.500000 7.300000 22.684590 0.500000 7.400000 23.107286 0.500000 7.500000 23.549982 0.500000 7.600000 24.012678 0.500000 7.700000 24.495373 0.500000 7.800000 24.998069 0.500000 7.900000 25.520765 0.500000 8.000000 26.063461 0.500000 8.100000 26.626156 0.500000 8.200000 27.208852 0.500000 8.300000 27.811548 0.500000 8.400000 28.434243 0.500000 8.500000 29.076939 0.500000 8.600000 29.739635 0.500000 8.700000 30.422331 0.500000 8.800000 31.125026 0.500000 8.900000 31.847722 0.500000 9.000000 32.590418 0.500000 9.100000 33.353113 0.500000 9.200000 34.135809 0.500000 9.300000 34.938505 0.500000 9.400000 35.761201 0.500000 9.500000 36.603896 0.500000 9.600000 37.466592 0.500000 9.700000 38.349288 0.500000 9.800000 39.251983 0.500000 9.900000 40.174679 0.500000 10.000000 41.117375 0.500000 10.100000 42.080071 0.500000 10.200000 43.062766 0.500000 10.300000 44.065462 0.500000 10.400000 45.088158 0.500000 10.500000 46.130853 0.500000 10.600000 47.193549 0.500000 10.700000 48.276245 0.500000 10.800000 49.378941 0.500000 10.900000 50.501636 0.500000 11.000000 51.644332 0.500000 11.100000 52.807028 0.500000 11.200000 53.989723 0.500000 11.300000 55.192419 0.500000 11.400000 56.415115 0.500000 11.500000 57.657811 0.500000 11.600000 58.920506 0.500000 11.700000 60.203202 0.500000 11.800000 61.505898 0.500000 11.900000 62.828594 0.500000 12.000000 64.171289 0.500000 12.100000 65.533985 0.500000 12.200000 66.916681 0.500000 12.300000 68.319376 0.500000 12.400000 69.742072 0.500000 12.500000 71.184768 0.500000 12.600000 72.647464 0.500000 12.700000 74.130159 0.500000 12.800000 75.632855 0.500000 12.900000 77.155551 0.500000 13.000000 78.698246 0.500000 13.100000 80.260942 0.500000 13.200000 81.843638 0.500000 13.300000 83.446334 0.500000 13.400000 85.069029 0.500000 13.500000 86.711725 0.500000 13.600000 88.374421 0.500000 13.700000 90.057116 0.500000 13.800000 91.759812 0.500000 13.900000 93.482508 0.500000 14.000000 95.225204 0.500000 14.100000 96.987899 0.500000 14.200000 98.770595 0.500000 14.300000 100.573291 0.500000 14.400000 102.395986 0.500000 14.500000 104.238682 0.500000 14.600000 106.101378 0.500000 14.700000 107.984074 0.500000 14.800000 109.886769 0.500000 14.900000 111.809465 0.500000 15.000000 113.752161 0.600000 -5.000000 119.764887 0.600000 -4.900000 117.756572 0.600000 -4.800000 115.768256 0.600000 -4.700000 113.799941 0.600000 -4.600000 111.851626 0.600000 -4.500000 109.923310 0.600000 -4.400000 108.014995 0.600000 -4.300000 106.126680 0.600000 -4.200000 104.258364 0.600000 -4.100000 102.410049 0.600000 -4.000000 100.581734 0.600000 -3.900000 98.773418 0.600000 -3.800000 96.985103 0.600000 -3.700000 95.216788 0.600000 -3.600000 93.468472 0.600000 -3.500000 91.740157 0.600000 -3.400000 90.031841 0.600000 -3.300000 88.343526 0.600000 -3.200000 86.675211 0.600000 -3.100000 85.026895 0.600000 -3.000000 83.398580 0.600000 -2.900000 81.790265 0.600000 -2.800000 80.201949 0.600000 -2.700000 78.633634 0.600000 -2.600000 77.085319 0.600000 -2.500000 75.557003 0.600000 -2.400000 74.048688 0.600000 -2.300000 72.560373 0.600000 -2.200000 71.092057 0.600000 -2.100000 69.643742 0.600000 -2.000000 68.215427 0.600000 -1.900000 66.807111 0.600000 -1.800000 65.418796 0.600000 -1.700000 64.050480 0.600000 -1.600000 62.702165 0.600000 -1.500000 61.373850 0.600000 -1.400000 60.065534 0.600000 -1.300000 58.777219 0.600000 -1.200000 57.508904 0.600000 -1.100000 56.260588 0.600000 -1.000000 55.032273 0.600000 -0.900000 53.823958 0.600000 -0.800000 52.635642 0.600000 -0.700000 51.467327 0.600000 -0.600000 50.319012 0.600000 -0.500000 49.190696 0.600000 -0.400000 48.082381 0.600000 -0.300000 46.994066 0.600000 -0.200000 45.925750 0.600000 -0.100000 44.877435 0.600000 -0.000000 43.849119 0.600000 0.100000 42.840804 0.600000 0.200000 41.852489 0.600000 0.300000 40.884173 0.600000 0.400000 39.935858 0.600000 0.500000 39.007543 0.600000 0.600000 38.099227 0.600000 0.700000 37.210912 0.600000 0.800000 36.342597 0.600000 0.900000 35.494281 0.600000 1.000000 34.665966 0.600000 1.100000 33.857651 0.600000 1.200000 33.069335 0.600000 1.300000 32.301020 0.600000 1.400000 31.552705 0.600000 1.500000 30.824389 0.600000 1.600000 30.116074 0.600000 1.700000 29.427758 0.600000 1.800000 28.759443 0.600000 1.900000 28.111128 0.600000 2.000000 27.482812 0.600000 2.100000 26.874497 0.600000 2.200000 26.286182 0.600000 2.300000 25.717866 0.600000 2.400000 25.169551 0.600000 2.500000 24.641236 0.600000 2.600000 24.132920 0.600000 2.700000 23.644605 0.600000 2.800000 23.176290 0.600000 2.900000 22.727974 0.600000 3.000000 22.299659 0.600000 3.100000 21.891344 0.600000 3.200000 21.503028 0.600000 3.300000 21.134713 0.600000 3.400000 20.786397 0.600000 3.500000 20.458082 0.600000 3.600000 20.149767 0.600000 3.700000 19.861451 0.600000 3.800000 19.593136 0.600000 3.900000 19.344821 0.600000 4.000000 19.116505 0.600000 4.100000 18.908190 0.600000 4.200000 18.719875 0.600000 4.300000 18.551559 0.600000 4.400000 18.403244 0.600000 4.500000 18.274929 0.600000 4.600000 18.166613 0.600000 4.700000 18.078298 0.600000 4.800000 18.009983 0.600000 4.900000 17.961667 0.600000 5.000000 17.933352 0.600000 5.100000 17.925036 0.600000 5.200000 17.936721 0.600000 5.300000 17.968406 0.600000 5.400000 18.020090 0.600000 5.500000 18.091775 0.600000 5.600000 18.183460 0.600000 5.700000 18.295144 0.600000 5.800000 18.426829 0.600000 5.900000 18.578514 0.600000 6.000000 18.750198 0.600000 6.100000 18.941883 0.600000 6.200000 19.153568 0.600000 6.300000 19.385252 0.600000 6.400000 19.636937 0.600000 6.500000 19.908622 0.600000 6.600000 20.200306 0.600000 6.700000 20.511991 0.600000 6.800000 20.843675 0.600000 6.900000 21.195360 0.600000 7.000000 21.567045 0.600000 7.100000 21.958729 0.600000 7.200000 22.370414 0.600000 7.300000 22.802099 0.600000 7.400000 23.253783 0.600000 7.500000 23.725468 0.600000 7.600000 24.217153 0.600000 7.700000 24.728837 0.600000 7.800000 25.260522 0.600000 7.900000 25.812207 0.600000 8.000000 26.383891 0.600000 8.100000 26.975576 0.600000 8.200000 27.587261 0.600000 8.300000 28.218945 0.600000 8.400000 28.870630 0.600000 8.500000 29.542314 0.600000 8.600000 30.233999 0.600000 8.700000 30.945684 0.600000 8.800000 31.677368 0.600000 8.900000 32.429053 0.600000 9.000000 33.200738 0.600000 9.100000 33.992422 0.600000 9.200000 34.804107 0.600000 9.300000 35.635792 0.600000 9.400000 36.487476 0.600000 9.500000 37.359161 0.600000 9.600000 38.250846 0.600000 9.700000 39.162530 0.600000 9.800000 40.094215 0.600000 9.900000 41.045900 0.600000 10.000000 42.017584 0.600000 10.100000 43.009269 0.600000 10.200000 44.020953 0.600000 10.300000 45.052638 0.600000 10.400000 46.104323 0.600000 10.500000 47.176007 0.600000 10.600000 48.267692 0.600000 10.700000 49.379377 0.600000 10.800000 50.511061 0.600000 10.900000 51.662746 0.600000 11.000000 52.834431 0.600000 11.100000 54.026115 0.600000 11.200000 55.237800 0.600000 11.300000 56.469485 0.600000 11.400000 57.721169 0.600000 11.500000 58.992854 0.600000 11.600000 60.284539 0.600000 11.700000 61.596223 0.600000 11.800000 62.927908 0.600000 11.900000 64.279592 0.600000 12.000000 65.651277 0.600000 12.100000 67.042962 0.600000 12.200000 68.454646 0.600000 12.300000 69.886331 0.600000 12.400000 71.338016 0.600000 12.500000 72.809700 0.600000 12.600000 74.301385 0.600000 12.700000 75.813070 0.600000 12.800000 77.344754 0.600000 12.900000 78.896439 0.600000 13.000000 80.468124 0.600000 13.100000 82.059808 0.600000 13.200000 83.671493 0.600000 13.300000 85.303178 0.600000 13.400000 86.954862 0.600000 13.500000 88.626547 0.600000 13.600000 90.318231 0.600000 13.700000 92.029916 0.600000 13.800000 93.761601 0.600000 13.900000 95.513285 0.600000 14.000000 97.284970 0.600000 14.100000 99.076655 0.600000 14.200000 100.888339 0.600000 14.300000 102.720024 0.600000 14.400000 104.571709 0.600000 14.500000 106.443393 0.600000 14.600000 108.335078 0.600000 14.700000 110.246763 0.600000 14.800000 112.178447 0.600000 14.900000 114.130132 0.600000 15.000000 116.101817 0.700000 -5.000000 116.330996 0.700000 -4.900000 114.351153 0.700000 -4.800000 112.391310 0.700000 -4.700000 110.451467 0.700000 -4.600000 108.531623 0.700000 -4.500000 106.631780 0.700000 -4.400000 104.751937 0.700000 -4.300000 102.892094 0.700000 -4.200000 101.052251 0.700000 -4.100000 99.232408 0.700000 -4.000000 97.432564 0.700000 -3.900000 95.652721 0.700000 -3.800000 93.892878 0.700000 -3.700000 92.153035 0.700000 -3.600000 90.433192 0.700000 -3.500000 88.733349 0.700000 -3.400000 87.053505 0.700000 -3.300000 85.393662 0.700000 -3.200000 83.753819 0.700000 -3.100000 82.133976 0.700000 -3.000000 80.534133 0.700000 -2.900000 78.954290 0.700000 -2.800000 77.394446 0.700000 -2.700000 75.854603 0.700000 -2.600000 74.334760 0.700000 -2.500000 72.834917 0.700000 -2.400000 71.355074 0.700000 -2.300000 69.895231 0.700000 -2.200000 68.455388 0.700000 -2.100000 67.035544 0.700000 -2.000000 65.635701 0.700000 -1.900000 64.255858 0.700000 -1.800000 62.896015 0.700000 -1.700000 61.556172 0.700000 -1.600000 60.236329 0.700000 -1.500000 58.936485 0.700000 -1.400000 57.656642 0.700000 -1.300000 56.396799 0.700000 -1.200000 55.156956 0.700000 -1.100000 53.937113 0.700000 -1.000000 52.737270 0.700000 -0.900000 51.557426 0.700000 -0.800000 50.397583 0.700000 -0.700000 49.257740 0.700000 -0.600000 48.137897 0.700000 -0.500000 47.038054 0.700000 -0.400000 45.958211 0.700000 -0.300000 44.898367 0.700000 -0.200000 43.858524 0.700000 -0.100000 42.838681 0.700000 -0.000000 41.838838 0.700000 0.100000 40.858995 0.700000 0.200000 39.899152 0.700000 0.300000 38.959308 0.700000 0.400000 38.039465 0.700000 0.500000 37.139622 0.700000 0.600000 36.259779 0.700000 0.700000 35.399936 0.700000 0.800000 34.560093 0.700000 0.900000 33.740249 0.700000 1.000000 32.940406 0.700000 1.100000 32.160563 0.700000 1.200000 31.400720 0.700000 1.300000 30.660877 0.700000 1.400000 29.941034 0.700000 1.500000 29.241191 0.700000 1.600000 28.561347 0.700000 1.700000 27.901504 0.700000 1.800000 27.261661 0.700000 1.900000 26.641818 0.700000 2.000000 26.041975 0.700000 2.100000 25.462132 0.700000 2.200000 24.902288 0.700000 2.300000 24.362445 0.700000 2.400000 23.842602 0.700000 2.500000 23.342759 0.700000 2.600000 22.862916 0.700000 2.700000 22.403073 0.700000 2.800000 21.963229 0.700000 2.900000 21.543386 0.700000 3.000000 21.143543 0.700000 3.100000 20.763700 0.700000 3.200000 20.403857 0.700000 3.300000 20.064014 0.700000 3.400000 19.744170 0.700000 3.500000 19.444327 0.700000 3.600000 19.164484 0.700000 3.700000 18.904641 0.700000 3.800000 18.664798 0.700000 3.900000 18.444955 0.700000 4.000000 18.245111 0.700000 4.100000 18.065268 0.700000 4.200000 17.905425 0.700000 4.300000 17.765582 0.700000 4.400000 17.645739 0.700000 4.500000 17.545896 0.700000 4.600000 17.466053 0.700000 4.700000 17.406209 0.700000 4.800000 17.366366 0.700000 4.900000 17.346523 0.700000 5.000000 17.346680 0.700000 5.100000 17.366837 0.700000 5.200000 17.406994 0.700000 5.300000 17.467150 0.700000 5.400000 17.547307 0.700000 5.500000 17.647464 0.700000 5.600000 17.767621 0.700000 5.700000 17.907778 0.700000 5.800000 18.067935 0.700000 5.900000 18.248091 0.700000 6.000000 18.448248 0.700000 6.100000 18.668405 0.700000 6.200000 18.908562 0.700000 6.300000 19.168719 0.700000 6.400000 19.448876 0.700000 6.500000 19.749032 0.700000 6.600000 20.069189 0.700000 6.700000 20.409346 0.700000 6.800000 20.769503 0.700000 6.900000 21.149660 0.700000 7.000000 21.549817 0.700000 7.100000 21.969973 0.700000 7.200000 22.410130 0.700000 7.300000 22.870287 0.700000 7.400000 23.350444 0.700000 7.500000 23.850601 0.700000 7.600000 24.370758 0.700000 7.700000 24.910915 0.700000 7.800000 25.471071 0.700000 7.900000 26.051228 0.700000 8.000000 26.651385 0.700000 8.100000 27.271542 0.700000 8.200000 27.911699 0.700000 8.300000 28.571856 0.700000 8.400000 29.252012 0.700000 8.500000 29.952169 0.700000 8.600000 30.672326 0.700000 8.700000 31.412483 0.700000 8.800000 32.172640 0.700000 8.900000 32.952797 0.700000 9.000000 33.752953 0.700000 9.100000 34.573110 0.700000 9.200000 35.413267 0.700000 9.300000 36.273424 0.700000 9.400000 37.153581 0.700000 9.500000 38.053738 0.700000 9.600000 38.973894 0.700000 9.700000 39.914051 0.700000 9.800000 40.874208 0.700000 9.900000 41.854365 0.700000 10.000000 42.854522 0.700000 10.100000 43.874679 0.700000 10.200000 44.914835 0.700000 10.300000 45.974992 0.700000 10.400000 47.055149 0.700000 10.500000 48.155306 0.700000 10.600000 49.275463 0.700000 10.700000 50.415620 0.700000 10.800000 51.575776 0.700000 10.900000 52.755933 0.700000 11.000000 53.956090 0.700000 11.100000 55.176247 0.700000 11.200000 56.416404 0.700000 11.300000 57.676561 0.700000 11.400000 58.956718 0.700000 11.500000 60.256874 0.700000 11.600000 61.577031 0.700000 11.700000 62.917188 0.700000 11.800000 64.277345 0.700000 11.900000 65.657502 0.700000 12.000000 67.057659 0.700000 12.100000 68.477815 0.700000 12.200000 69.917972 0.700000 12.300000 71.378129 0.700000 12.400000 72.858286 0.700000 12.500000 74.358443 0.700000 12.600000 75.878600 0.700000 12.700000 77.418756 0.700000 12.800000 78.978913 0.700000 12.900000 80.559070 0.700000 13.000000 82.159227 0.700000 13.100000 83.779384 0.700000 13.200000 85.419541 0.700000 13.300000 87.079697 0.700000 13.400000 88.759854 0.700000 13.500000 90.460011 0.700000 13.600000 92.180168 0.700000 13.700000 93.920325 0.700000 13.800000 95.680482 0.700000 13.900000 97.460638 0.700000 14.000000 99.260795 0.700000 14.100000 101.080952 0.700000 14.200000 102.921109 0.700000 14.300000 104.781266 0.700000 14.400000 106.661423 0.700000 14.500000 108.561580 0.700000 14.600000 110.481736 0.700000 14.700000 112.421893 0.700000 14.800000 114.382050 0.700000 14.900000 116.362207 0.700000 15.000000 118.362364 0.800000 -5.000000 112.914941 0.800000 -4.900000 110.963053 0.800000 -4.800000 109.031165 0.800000 -4.700000 107.119278 0.800000 -4.600000 105.227390 0.800000 -4.500000 103.355502 0.800000 -4.400000 101.503615 0.800000 -4.300000 99.671727 0.800000 -4.200000 97.859839 0.800000 -4.100000 96.067951 0.800000 -4.000000 94.296064 0.800000 -3.900000 92.544176 0.800000 -3.800000 90.812288 0.800000 -3.700000 89.100401 0.800000 -3.600000 87.408513 0.800000 -3.500000 85.736625 0.800000 -3.400000 84.084737 0.800000 -3.300000 82.452850 0.800000 -3.200000 80.840962 0.800000 -3.100000 79.249074 0.800000 -3.000000 77.677187 0.800000 -2.900000 76.125299 0.800000 -2.800000 74.593411 0.800000 -2.700000 73.081524 0.800000 -2.600000 71.589636 0.800000 -2.500000 70.117748 0.800000 -2.400000 68.665860 0.800000 -2.300000 67.233973 0.800000 -2.200000 65.822085 0.800000 -2.100000 64.430197 0.800000 -2.000000 63.058310 0.800000 -1.900000 61.706422 0.800000 -1.800000 60.374534 0.800000 -1.700000 59.062646 0.800000 -1.600000 57.770759 0.800000 -1.500000 56.498871 0.800000 -1.400000 55.246983 0.800000 -1.300000 54.015096 0.800000 -1.200000 52.803208 0.800000 -1.100000 51.611320 0.800000 -1.000000 50.439432 0.800000 -0.900000 49.287545 0.800000 -0.800000 48.155657 0.800000 -0.700000 47.043769 0.800000 -0.600000 45.951882 0.800000 -0.500000 44.879994 0.800000 -0.400000 43.828106 0.800000 -0.300000 42.796219 0.800000 -0.200000 41.784331 0.800000 -0.100000 40.792443 0.800000 -0.000000 39.820555 0.800000 0.100000 38.868668 0.800000 0.200000 37.936780 0.800000 0.300000 37.024892 0.800000 0.400000 36.133005 0.800000 0.500000 35.261117 0.800000 0.600000 34.409229 0.800000 0.700000 33.577341 0.800000 0.800000 32.765454 0.800000 0.900000 31.973566 0.800000 1.000000 31.201678 0.800000 1.100000 30.449791 0.800000 1.200000 29.717903 0.800000 1.300000 29.006015 0.800000 1.400000 28.314127 0.800000 1.500000 27.642240 0.800000 1.600000 26.990352 0.800000 1.700000 26.358464 0.800000 1.800000 25.746577 0.800000 1.900000 25.154689 0.800000 2.000000 24.582801 0.800000 2.100000 24.030914 0.800000 2.200000 23.499026 0.800000 2.300000 22.987138 0.800000 2.400000 22.495250 0.800000 2.500000 22.023363 0.800000 2.600000 21.571475 0.800000 2.700000 21.139587 0.800000 2.800000 20.727700 0.800000 2.900000 20.335812 0.800000 3.000000 19.963924 0.800000 3.100000 19.612036 0.800000 3.200000 19.280149 0.800000 3.300000 18.968261 0.800000 3.400000 18.676373 0.800000 3.500000 18.404486 0.800000 3.600000 18.152598 0.800000 3.700000 17.920710 0.800000 3.800000 17.708822 0.800000 3.900000 17.516935 0.800000 4.000000 17.345047 0.800000 4.100000 17.193159 0.800000 4.200000 17.061272 0.800000 4.300000 16.949384 0.800000 4.400000 16.857496 0.800000 4.500000 16.785609 0.800000 4.600000 16.733721 0.800000 4.700000 16.701833 0.800000 4.800000 16.689945 0.800000 4.900000 16.698058 0.800000 5.000000 16.726170 0.800000 5.100000 16.774282 0.800000 5.200000 16.842395 0.800000 5.300000 16.930507 0.800000 5.400000 17.038619 0.800000 5.500000 17.166731 0.800000 5.600000 17.314844 0.800000 5.700000 17.482956 0.800000 5.800000 17.671068 0.800000 5.900000 17.879181 0.800000 6.000000 18.107293 0.800000 6.100000 18.355405 0.800000 6.200000 18.623517 0.800000 6.300000 18.911630 0.800000 6.400000 19.219742 0.800000 6.500000 19.547854 0.800000 6.600000 19.895967 0.800000 6.700000 20.264079 0.800000 6.800000 20.652191 0.800000 6.900000 21.060304 0.800000 7.000000 21.488416 0.800000 7.100000 21.936528 0.800000 7.200000 22.404640 0.800000 7.300000 22.892753 0.800000 7.400000 23.400865 0.800000 7.500000 23.928977 0.800000 7.600000 24.477090 0.800000 7.700000 25.045202 0.800000 7.800000 25.633314 0.800000 7.900000 26.241426 0.800000 8.000000 26.869539 0.800000 8.100000 27.517651 0.800000 8.200000 28.185763 0.800000 8.300000 28.873876 0.800000 8.400000 29.581988 0.800000 8.500000 30.310100 0.800000 8.600000 31.058212 0.800000 8.700000 31.826325 0.800000 8.800000 32.614437 0.800000 8.900000 33.422549 0.800000 9.000000 34.250662 0.800000 9.100000 35.098774 0.800000 9.200000 35.966886 0.800000 9.300000 36.854999 0.800000 9.400000 37.763111 0.800000 9.500000 38.691223 0.800000 9.600000 39.639335 0.800000 9.700000 40.607448 0.800000 9.800000 41.595560 0.800000 9.900000 42.603672 0.800000 10.000000 43.631785 0.800000 10.100000 44.679897 0.800000 10.200000 45.748009 0.800000 10.300000 46.836121 0.800000 10.400000 47.944234 0.800000 10.500000 49.072346 0.800000 10.600000 50.220458 0.800000 10.700000 51.388571 0.800000 10.800000 52.576683 0.800000 10.900000 53.784795 0.800000 11.000000 55.012907 0.800000 11.100000 56.261020 0.800000 11.200000 57.529132 0.800000 11.300000 58.817244 0.800000 11.400000 60.125357 0.800000 11.500000 61.453469 0.800000 11.600000 62.801581 0.800000 11.700000 64.169694 0.800000 11.800000 65.557806 0.800000 11.900000 66.965918 0.800000 12.000000 68.394030 0.800000 12.100000 69.842143 0.800000 12.200000 71.310255 0.800000 12.300000 72.798367 0.800000 12.400000 74.306480 0.800000 12.500000 75.834592 0.800000 12.600000 77.382704 0.800000 12.700000 78.950816 0.800000 12.800000 80.538929 0.800000 12.900000 82.147041 0.800000 13.000000 83.775153 0.800000 13.100000 85.423266 0.800000 13.200000 87.091378 0.800000 13.300000 88.779490 0.800000 13.400000 90.487602 0.800000 13.500000 92.215715 0.800000 13.600000 93.963827 0.800000 13.700000 95.731939 0.800000 13.800000 97.520052 0.800000 13.900000 99.328164 0.800000 14.000000 101.156276 0.800000 14.100000 103.004389 0.800000 14.200000 104.872501 0.800000 14.300000 106.760613 0.800000 14.400000 108.668725 0.800000 14.500000 110.596838 0.800000 14.600000 112.544950 0.800000 14.700000 114.513062 0.800000 14.800000 116.501175 0.800000 14.900000 118.509287 0.800000 15.000000 120.537399 0.900000 -5.000000 109.521092 0.900000 -4.900000 107.596643 0.900000 -4.800000 105.692194 0.900000 -4.700000 103.807745 0.900000 -4.600000 101.943296 0.900000 -4.500000 100.098847 0.900000 -4.400000 98.274398 0.900000 -4.300000 96.469949 0.900000 -4.200000 94.685500 0.900000 -4.100000 92.921051 0.900000 -4.000000 91.176602 0.900000 -3.900000 89.452153 0.900000 -3.800000 87.747704 0.900000 -3.700000 86.063255 0.900000 -3.600000 84.398806 0.900000 -3.500000 82.754357 0.900000 -3.400000 81.129908 0.900000 -3.300000 79.525459 0.900000 -3.200000 77.941010 0.900000 -3.100000 76.376561 0.900000 -3.000000 74.832112 0.900000 -2.900000 73.307663 0.900000 -2.800000 71.803214 0.900000 -2.700000 70.318765 0.900000 -2.600000 68.854316 0.900000 -2.500000 67.409867 0.900000 -2.400000 65.985418 0.900000 -2.300000 64.580969 0.900000 -2.200000 63.196520 0.900000 -2.100000 61.832071 0.900000 -2.000000 60.487622 0.900000 -1.900000 59.163173 0.900000 -1.800000 57.858724 0.900000 -1.700000 56.574275 0.900000 -1.600000 55.309826 0.900000 -1.500000 54.065377 0.900000 -1.400000 52.840928 0.900000 -1.300000 51.636479 0.900000 -1.200000 50.452030 0.900000 -1.100000 49.287581 0.900000 -1.000000 48.143132 0.900000 -0.900000 47.018683 0.900000 -0.800000 45.914234 0.900000 -0.700000 44.829785 0.900000 -0.600000 43.765336 0.900000 -0.500000 42.720887 0.900000 -0.400000 41.696438 0.900000 -0.300000 40.691989 0.900000 -0.200000 39.707540 0.900000 -0.100000 38.743091 0.900000 -0.000000 37.798642 0.900000 0.100000 36.874193 0.900000 0.200000 35.969744 0.900000 0.300000 35.085295 0.900000 0.400000 34.220846 0.900000 0.500000 33.376397 0.900000 0.600000 32.551948 0.900000 0.700000 31.747499 0.900000 0.800000 30.963050 0.900000 0.900000 30.198601 0.900000 1.000000 29.454152 0.900000 1.100000 28.729703 0.900000 1.200000 28.025254 0.900000 1.300000 27.340805 0.900000 1.400000 26.676356 0.900000 1.500000 26.031907 0.900000 1.600000 25.407458 0.900000 1.700000 24.803009 0.900000 1.800000 24.218560 0.900000 1.900000 23.654111 0.900000 2.000000 23.109662 0.900000 2.100000 22.585213 0.900000 2.200000 22.080764 0.900000 2.300000 21.596315 0.900000 2.400000 21.131866 0.900000 2.500000 20.687417 0.900000 2.600000 20.262968 0.900000 2.700000 19.858519 0.900000 2.800000 19.474070 0.900000 2.900000 19.109621 0.900000 3.000000 18.765172 0.900000 3.100000 18.440723 0.900000 3.200000 18.136274 0.900000 3.300000 17.851825 0.900000 3.400000 17.587376 0.900000 3.500000 17.342927 0.900000 3.600000 17.118478 0.900000 3.700000 16.914029 0.900000 3.800000 16.729580 0.900000 3.900000 16.565131 0.900000 4.000000 16.420682 0.900000 4.100000 16.296233 0.900000 4.200000 16.191784 0.900000 4.300000 16.107335 0.900000 4.400000 16.042886 0.900000 4.500000 15.998437 0.900000 4.600000 15.973988 0.900000 4.700000 15.969539 0.900000 4.800000 15.985090 0.900000 4.900000 16.020641 0.900000 5.000000 16.076192 0.900000 5.100000 16.151743 0.900000 5.200000 16.247294 0.900000 5.300000 16.362845 0.900000 5.400000 16.498396 0.900000 5.500000 16.653947 0.900000 5.600000 16.829498 0.900000 5.700000 17.025049 0.900000 5.800000 17.240600 0.900000 5.900000 17.476151 0.900000 6.000000 17.731702 0.900000 6.100000 18.007253 0.900000 6.200000 18.302804 0.900000 6.300000 18.618355 0.900000 6.400000 18.953906 0.900000 6.500000 19.309457 0.900000 6.600000 19.685008 0.900000 6.700000 20.080559 0.900000 6.800000 20.496110 0.900000 6.900000 20.931661 0.900000 7.000000 21.387212 0.900000 7.100000 21.862763 0.900000 7.200000 22.358314 0.900000 7.300000 22.873865 0.900000 7.400000 23.409416 0.900000 7.500000 23.964967 0.900000 7.600000 24.540518 0.900000 7.700000 25.136069 0.900000 7.800000 25.751620 0.900000 7.900000 26.387172 0.900000 8.000000 27.042723 0.900000 8.100000 27.718274 0.900000 8.200000 28.413825 0.900000 8.300000 29.129376 0.900000 8.400000 29.864927 0.900000 8.500000 30.620478 0.900000 8.600000 31.396029 0.900000 8.700000 32.191580 0.900000 8.800000 33.007131 0.900000 8.900000 33.842682 0.900000 9.000000 34.698233 0.900000 9.100000 35.573784 0.900000 9.200000 36.469335 0.900000 9.300000 37.384886 0.900000 9.400000 38.320437 0.900000 9.500000 39.275988 0.900000 9.600000 40.251539 0.900000 9.700000 41.247090 0.900000 9.800000 42.262641 0.900000 9.900000 43.298192 0.900000 10.000000 44.353743 0.900000 10.100000 45.429294 0.900000 10.200000 46.524845 0.900000 10.300000 47.640396 0.900000 10.400000 48.775947 0.900000 10.500000 49.931498 0.900000 10.600000 51.107049 0.900000 10.700000 52.302600 0.900000 10.800000 53.518151 0.900000 10.900000 54.753702 0.900000 11.000000 56.009253 0.900000 11.100000 57.284804 0.900000 11.200000 58.580355 0.900000 11.300000 59.895906 0.900000 11.400000 61.231457 0.900000 11.500000 62.587008 0.900000 11.600000 63.962559 0.900000 11.700000 65.358110 0.900000 11.800000 66.773661 0.900000 11.900000 68.209212 0.900000 12.000000 69.664763 0.900000 12.100000 71.140314 0.900000 12.200000 72.635865 0.900000 12.300000 74.151416 0.900000 12.400000 75.686967 0.900000 12.500000 77.242518 0.900000 12.600000 78.818069 0.900000 12.700000 80.413620 0.900000 12.800000 82.029171 0.900000 12.900000 83.664722 0.900000 13.000000 85.320273 0.900000 13.100000 86.995824 0.900000 13.200000 88.691375 0.900000 13.300000 90.406926 0.900000 13.400000 92.142477 0.900000 13.500000 93.898028 0.900000 13.600000 95.673579 0.900000 13.700000 97.469130 0.900000 13.800000 99.284681 0.900000 13.900000 101.120232 0.900000 14.000000 102.975783 0.900000 14.100000 104.851334 0.900000 14.200000 106.746885 0.900000 14.300000 108.662436 0.900000 14.400000 110.597987 0.900000 14.500000 112.553538 0.900000 14.600000 114.529089 0.900000 14.700000 116.524640 0.900000 14.800000 118.540191 0.900000 14.900000 120.575742 0.900000 15.000000 122.631293 1.000000 -5.000000 106.154526 1.000000 -4.900000 104.256999 1.000000 -4.800000 102.379472 1.000000 -4.700000 100.521945 1.000000 -4.600000 98.684418 1.000000 -4.500000 96.866891 1.000000 -4.400000 95.069364 1.000000 -4.300000 93.291837 1.000000 -4.200000 91.534310 1.000000 -4.100000 89.796783 1.000000 -4.000000 88.079256 1.000000 -3.900000 86.381729 1.000000 -3.800000 84.704202 1.000000 -3.700000 83.046675 1.000000 -3.600000 81.409148 1.000000 -3.500000 79.791621 1.000000 -3.400000 78.194094 1.000000 -3.300000 76.616567 1.000000 -3.200000 75.059040 1.000000 -3.100000 73.521513 1.000000 -3.000000 72.003986 1.000000 -2.900000 70.506459 1.000000 -2.800000 69.028932 1.000000 -2.700000 67.571405 1.000000 -2.600000 66.133878 1.000000 -2.500000 64.716351 1.000000 -2.400000 63.318824 1.000000 -2.300000 61.941297 1.000000 -2.200000 60.583770 1.000000 -2.100000 59.246243 1.000000 -2.000000 57.928716 1.000000 -1.900000 56.631189 1.000000 -1.800000 55.353662 1.000000 -1.700000 54.096135 1.000000 -1.600000 52.858608 1.000000 -1.500000 51.641081 1.000000 -1.400000 50.443554 1.000000 -1.300000 49.266027 1.000000 -1.200000 48.108500 1.000000 -1.100000 46.970973 1.000000 -1.000000 45.853446 1.000000 -0.900000 44.755919 1.000000 -0.800000 43.678392 1.000000 -0.700000 42.620865 1.000000 -0.600000 41.583338 1.000000 -0.500000 40.565811 1.000000 -0.400000 39.568284 1.000000 -0.300000 38.590757 1.000000 -0.200000 37.633230 1.000000 -0.100000 36.695703 1.000000 -0.000000 35.778176 1.000000 0.100000 34.880649 1.000000 0.200000 34.003122 1.000000 0.300000 33.145595 1.000000 0.400000 32.308068 1.000000 0.500000 31.490541 1.000000 0.600000 30.693014 1.000000 0.700000 29.915487 1.000000 0.800000 29.157960 1.000000 0.900000 28.420433 1.000000 1.000000 27.702906 1.000000 1.100000 27.005379 1.000000 1.200000 26.327852 1.000000 1.300000 25.670325 1.000000 1.400000 25.032797 1.000000 1.500000 24.415270 1.000000 1.600000 23.817743 1.000000 1.700000 23.240216 1.000000 1.800000 22.682689 1.000000 1.900000 22.145162 1.000000 2.000000 21.627635 1.000000 2.100000 21.130108 1.000000 2.200000 20.652581 1.000000 2.300000 20.195054 1.000000 2.400000 19.757527 1.000000 2.500000 19.340000 1.000000 2.600000 18.942473 1.000000 2.700000 18.564946 1.000000 2.800000 18.207419 1.000000 2.900000 17.869892 1.000000 3.000000 17.552365 1.000000 3.100000 17.254838 1.000000 3.200000 16.977311 1.000000 3.300000 16.719784 1.000000 3.400000 16.482257 1.000000 3.500000 16.264730 1.000000 3.600000 16.067203 1.000000 3.700000 15.889676 1.000000 3.800000 15.732149 1.000000 3.900000 15.594622 1.000000 4.000000 15.477095 1.000000 4.100000 15.379568 1.000000 4.200000 15.302041 1.000000 4.300000 15.244514 1.000000 4.400000 15.206987 1.000000 4.500000 15.189460 1.000000 4.600000 15.191933 1.000000 4.700000 15.214406 1.000000 4.800000 15.256879 1.000000 4.900000 15.319352 1.000000 5.000000 15.401825 1.000000 5.100000 15.504298 1.000000 5.200000 15.626771 1.000000 5.300000 15.769244 1.000000 5.400000 15.931717 1.000000 5.500000 16.114190 1.000000 5.600000 16.316663 1.000000 5.700000 16.539136 1.000000 5.800000 16.781609 1.000000 5.900000 17.044082 1.000000 6.000000 17.326555 1.000000 6.100000 17.629028 1.000000 6.200000 17.951501 1.000000 6.300000 18.293974 1.000000 6.400000 18.656447 1.000000 6.500000 19.038920 1.000000 6.600000 19.441393 1.000000 6.700000 19.863866 1.000000 6.800000 20.306339 1.000000 6.900000 20.768812 1.000000 7.000000 21.251285 1.000000 7.100000 21.753758 1.000000 7.200000 22.276231 1.000000 7.300000 22.818704 1.000000 7.400000 23.381177 1.000000 7.500000 23.963650 1.000000 7.600000 24.566123 1.000000 7.700000 25.188596 1.000000 7.800000 25.831068 1.000000 7.900000 26.493541 1.000000 8.000000 27.176014 1.000000 8.100000 27.878487 1.000000 8.200000 28.600960 1.000000 8.300000 29.343433 1.000000 8.400000 30.105906 1.000000 8.500000 30.888379 1.000000 8.600000 31.690852 1.000000 8.700000 32.513325 1.000000 8.800000 33.355798 1.000000 8.900000 34.218271 1.000000 9.000000 35.100744 1.000000 9.100000 36.003217 1.000000 9.200000 36.925690 1.000000 9.300000 37.868163 1.000000 9.400000 38.830636 1.000000 9.500000 39.813109 1.000000 9.600000 40.815582 1.000000 9.700000 41.838055 1.000000 9.800000 42.880528 1.000000 9.900000 43.943001 1.000000 10.000000 45.025474 1.000000 10.100000 46.127947 1.000000 10.200000 47.250420 1.000000 10.300000 48.392893 1.000000 10.400000 49.555366 1.000000 10.500000 50.737839 1.000000 10.600000 51.940312 1.000000 10.700000 53.162785 1.000000 10.800000 54.405258 1.000000 10.900000 55.667731 1.000000 11.000000 56.950204 1.000000 11.100000 58.252677 1.000000 11.200000 59.575150 1.000000 11.300000 60.917623 1.000000 11.400000 62.280096 1.000000 11.500000 63.662569 1.000000 11.600000 65.065042 1.000000 11.700000 66.487515 1.000000 11.800000 67.929988 1.000000 11.900000 69.392461 1.000000 12.000000 70.874934 1.000000 12.100000 72.377407 1.000000 12.200000 73.899880 1.000000 12.300000 75.442353 1.000000 12.400000 77.004826 1.000000 12.500000 78.587299 1.000000 12.600000 80.189772 1.000000 12.700000 81.812245 1.000000 12.800000 83.454718 1.000000 12.900000 85.117191 1.000000 13.000000 86.799664 1.000000 13.100000 88.502137 1.000000 13.200000 90.224610 1.000000 13.300000 91.967083 1.000000 13.400000 93.729556 1.000000 13.500000 95.512029 1.000000 13.600000 97.314502 1.000000 13.700000 99.136975 1.000000 13.800000 100.979448 1.000000 13.900000 102.841921 1.000000 14.000000 104.724394 1.000000 14.100000 106.626866 1.000000 14.200000 108.549339 1.000000 14.300000 110.491812 1.000000 14.400000 112.454285 1.000000 14.500000 114.436758 1.000000 14.600000 116.439231 1.000000 14.700000 118.461704 1.000000 14.800000 120.504177 1.000000 14.900000 122.566650 1.000000 15.000000 124.649123 1.100000 -5.000000 102.820959 1.100000 -4.900000 100.949838 1.100000 -4.800000 99.098716 1.100000 -4.700000 97.267594 1.100000 -4.600000 95.456472 1.100000 -4.500000 93.665351 1.100000 -4.400000 91.894229 1.100000 -4.300000 90.143107 1.100000 -4.200000 88.411985 1.100000 -4.100000 86.700864 1.100000 -4.000000 85.009742 1.100000 -3.900000 83.338620 1.100000 -3.800000 81.687498 1.100000 -3.700000 80.056376 1.100000 -3.600000 78.445255 1.100000 -3.500000 76.854133 1.100000 -3.400000 75.283011 1.100000 -3.300000 73.731889 1.100000 -3.200000 72.200768 1.100000 -3.100000 70.689646 1.100000 -3.000000 69.198524 1.100000 -2.900000 67.727402 1.100000 -2.800000 66.276280 1.100000 -2.700000 64.845159 1.100000 -2.600000 63.434037 1.100000 -2.500000 62.042915 1.100000 -2.400000 60.671793 1.100000 -2.300000 59.320672 1.100000 -2.200000 57.989550 1.100000 -2.100000 56.678428 1.100000 -2.000000 55.387306 1.100000 -1.900000 54.116184 1.100000 -1.800000 52.865063 1.100000 -1.700000 51.633941 1.100000 -1.600000 50.422819 1.100000 -1.500000 49.231697 1.100000 -1.400000 48.060576 1.100000 -1.300000 46.909454 1.100000 -1.200000 45.778332 1.100000 -1.100000 44.667210 1.100000 -1.000000 43.576088 1.100000 -0.900000 42.504967 1.100000 -0.800000 41.453845 1.100000 -0.700000 40.422723 1.100000 -0.600000 39.411601 1.100000 -0.500000 38.420480 1.100000 -0.400000 37.449358 1.100000 -0.300000 36.498236 1.100000 -0.200000 35.567114 1.100000 -0.100000 34.655992 1.100000 -0.000000 33.764871 1.100000 0.100000 32.893749 1.100000 0.200000 32.042627 1.100000 0.300000 31.211505 1.100000 0.400000 30.400384 1.100000 0.500000 29.609262 1.100000 0.600000 28.838140 1.100000 0.700000 28.087018 1.100000 0.800000 27.355896 1.100000 0.900000 26.644775 1.100000 1.000000 25.953653 1.100000 1.100000 25.282531 1.100000 1.200000 24.631409 1.100000 1.300000 24.000288 1.100000 1.400000 23.389166 1.100000 1.500000 22.798044 1.100000 1.600000 22.226922 1.100000 1.700000 21.675800 1.100000 1.800000 21.144679 1.100000 1.900000 20.633557 1.100000 2.000000 20.142435 1.100000 2.100000 19.671313 1.100000 2.200000 19.220192 1.100000 2.300000 18.789070 1.100000 2.400000 18.377948 1.100000 2.500000 17.986826 1.100000 2.600000 17.615704 1.100000 2.700000 17.264583 1.100000 2.800000 16.933461 1.100000 2.900000 16.622339 1.100000 3.000000 16.331217 1.100000 3.100000 16.060096 1.100000 3.200000 15.808974 1.100000 3.300000 15.577852 1.100000 3.400000 15.366730 1.100000 3.500000 15.175608 1.100000 3.600000 15.004487 1.100000 3.700000 14.853365 1.100000 3.800000 14.722243 1.100000 3.900000 14.611121 1.100000 4.000000 14.520000 1.100000 4.100000 14.448878 1.100000 4.200000 14.397756 1.100000 4.300000 14.366634 1.100000 4.400000 14.355513 1.100000 4.500000 14.364391 1.100000 4.600000 14.393269 1.100000 4.700000 14.442147 1.100000 4.800000 14.511025 1.100000 4.900000 14.599904 1.100000 5.000000 14.708782 1.100000 5.100000 14.837660 1.100000 5.200000 14.986538 1.100000 5.300000 15.155417 1.100000 5.400000 15.344295 1.100000 5.500000 15.553173 1.100000 5.600000 15.782051 1.100000 5.700000 16.030929 1.100000 5.800000 16.299808 1.100000 5.900000 16.588686 1.100000 6.000000 16.897564 1.100000 6.100000 17.226442 1.100000 6.200000 17.575321 1.100000 6.300000 17.944199 1.100000 6.400000 18.333077 1.100000 6.500000 18.741955 1.100000 6.600000 19.170833 1.100000 6.700000 19.619712 1.100000 6.800000 20.088590 1.100000 6.900000 20.577468 1.100000 7.000000 21.086346 1.100000 7.100000 21.615225 1.100000 7.200000 22.164103 1.100000 7.300000 22.732981 1.100000 7.400000 23.321859 1.100000 7.500000 23.930737 1.100000 7.600000 24.559616 1.100000 7.700000 25.208494 1.100000 7.800000 25.877372 1.100000 7.900000 26.566250 1.100000 8.000000 27.275129 1.100000 8.100000 28.004007 1.100000 8.200000 28.752885 1.100000 8.300000 29.521763 1.100000 8.400000 30.310641 1.100000 8.500000 31.119520 1.100000 8.600000 31.948398 1.100000 8.700000 32.797276 1.100000 8.800000 33.666154 1.100000 8.900000 34.555033 1.100000 9.000000 35.463911 1.100000 9.100000 36.392789 1.100000 9.200000 37.341667 1.100000 9.300000 38.310545 1.100000 9.400000 39.299424 1.100000 9.500000 40.308302 1.100000 9.600000 41.337180 1.100000 9.700000 42.386058 1.100000 9.800000 43.454937 1.100000 9.900000 44.543815 1.100000 10.000000 45.652693 1.100000 10.100000 46.781571 1.100000 10.200000 47.930449 1.100000 10.300000 49.099328 1.100000 10.400000 50.288206 1.100000 10.500000 51.497084 1.100000 10.600000 52.725962 1.100000 10.700000 53.974841 1.100000 10.800000 55.243719 1.100000 10.900000 56.532597 1.100000 11.000000 57.841475 1.100000 11.100000 59.170353 1.100000 11.200000 60.519232 1.100000 11.300000 61.888110 1.100000 11.400000 63.276988 1.100000 11.500000 64.685866 1.100000 11.600000 66.114745 1.100000 11.700000 67.563623 1.100000 11.800000 69.032501 1.100000 11.900000 70.521379 1.100000 12.000000 72.030258 1.100000 12.100000 73.559136 1.100000 12.200000 75.108014 1.100000 12.300000 76.676892 1.100000 12.400000 78.265770 1.100000 12.500000 79.874649 1.100000 12.600000 81.503527 1.100000 12.700000 83.152405 1.100000 12.800000 84.821283 1.100000 12.900000 86.510162 1.100000 13.000000 88.219040 1.100000 13.100000 89.947918 1.100000 13.200000 91.696796 1.100000 13.300000 93.465674 1.100000 13.400000 95.254553 1.100000 13.500000 97.063431 1.100000 13.600000 98.892309 1.100000 13.700000 100.741187 1.100000 13.800000 102.610066 1.100000 13.900000 104.498944 1.100000 14.000000 106.407822 1.100000 14.100000 108.336700 1.100000 14.200000 110.285578 1.100000 14.300000 112.254457 1.100000 14.400000 114.243335 1.100000 14.500000 116.252213 1.100000 14.600000 118.281091 1.100000 14.700000 120.329970 1.100000 14.800000 122.398848 1.100000 14.900000 124.487726 1.100000 15.000000 126.596604 1.200000 -5.000000 99.526663 1.200000 -4.900000 97.681429 1.200000 -4.800000 95.856196 1.200000 -4.700000 94.050963 1.200000 -4.600000 92.265730 1.200000 -4.500000 90.500496 1.200000 -4.400000 88.755263 1.200000 -4.300000 87.030030 1.200000 -4.200000 85.324796 1.200000 -4.100000 83.639563 1.200000 -4.000000 81.974330 1.200000 -3.900000 80.329097 1.200000 -3.800000 78.703863 1.200000 -3.700000 77.098630 1.200000 -3.600000 75.513397 1.200000 -3.500000 73.948163 1.200000 -3.400000 72.402930 1.200000 -3.300000 70.877697 1.200000 -3.200000 69.372464 1.200000 -3.100000 67.887230 1.200000 -3.000000 66.421997 1.200000 -2.900000 64.976764 1.200000 -2.800000 63.551531 1.200000 -2.700000 62.146297 1.200000 -2.600000 60.761064 1.200000 -2.500000 59.395831 1.200000 -2.400000 58.050597 1.200000 -2.300000 56.725364 1.200000 -2.200000 55.420131 1.200000 -2.100000 54.134898 1.200000 -2.000000 52.869664 1.200000 -1.900000 51.624431 1.200000 -1.800000 50.399198 1.200000 -1.700000 49.193965 1.200000 -1.600000 48.008731 1.200000 -1.500000 46.843498 1.200000 -1.400000 45.698265 1.200000 -1.300000 44.573031 1.200000 -1.200000 43.467798 1.200000 -1.100000 42.382565 1.200000 -1.000000 41.317332 1.200000 -0.900000 40.272098 1.200000 -0.800000 39.246865 1.200000 -0.700000 38.241632 1.200000 -0.600000 37.256399 1.200000 -0.500000 36.291165 1.200000 -0.400000 35.345932 1.200000 -0.300000 34.420699 1.200000 -0.200000 33.515465 1.200000 -0.100000 32.630232 1.200000 -0.000000 31.764999 1.200000 0.100000 30.919766 1.200000 0.200000 30.094532 1.200000 0.300000 29.289299 1.200000 0.400000 28.504066 1.200000 0.500000 27.738832 1.200000 0.600000 26.993599 1.200000 0.700000 26.268366 1.200000 0.800000 25.563133 1.200000 0.900000 24.877899 1.200000 1.000000 24.212666 1.200000 1.100000 23.567433 1.200000 1.200000 22.942200 1.200000 1.300000 22.336966 1.200000 1.400000 21.751733 1.200000 1.500000 21.186500 1.200000 1.600000 20.641266 1.200000 1.700000 20.116033 1.200000 1.800000 19.610800 1.200000 1.900000 19.125567 1.200000 2.000000 18.660333 1.200000 2.100000 18.215100 1.200000 2.200000 17.789867 1.200000 2.300000 17.384634 1.200000 2.400000 16.999400 1.200000 2.500000 16.634167 1.200000 2.600000 16.288934 1.200000 2.700000 15.963700 1.200000 2.800000 15.658467 1.200000 2.900000 15.373234 1.200000 3.000000 15.108001 1.200000 3.100000 14.862767 1.200000 3.200000 14.637534 1.200000 3.300000 14.432301 1.200000 3.400000 14.247067 1.200000 3.500000 14.081834 1.200000 3.600000 13.936601 1.200000 3.700000 13.811368 1.200000 3.800000 13.706134 1.200000 3.900000 13.620901 1.200000 4.000000 13.555668 1.200000 4.100000 13.510435 1.200000 4.200000 13.485201 1.200000 4.300000 13.479968 1.200000 4.400000 13.494735 1.200000 4.500000 13.529501 1.200000 4.600000 13.584268 1.200000 4.700000 13.659035 1.200000 4.800000 13.753802 1.200000 4.900000 13.868568 1.200000 5.000000 14.003335 1.200000 5.100000 14.158102 1.200000 5.200000 14.332869 1.200000 5.300000 14.527635 1.200000 5.400000 14.742402 1.200000 5.500000 14.977169 1.200000 5.600000 15.231935 1.200000 5.700000 15.506702 1.200000 5.800000 15.801469 1.200000 5.900000 16.116236 1.200000 6.000000 16.451002 1.200000 6.100000 16.805769 1.200000 6.200000 17.180536 1.200000 6.300000 17.575303 1.200000 6.400000 17.990069 1.200000 6.500000 18.424836 1.200000 6.600000 18.879603 1.200000 6.700000 19.354369 1.200000 6.800000 19.849136 1.200000 6.900000 20.363903 1.200000 7.000000 20.898670 1.200000 7.100000 21.453436 1.200000 7.200000 22.028203 1.200000 7.300000 22.622970 1.200000 7.400000 23.237736 1.200000 7.500000 23.872503 1.200000 7.600000 24.527270 1.200000 7.700000 25.202037 1.200000 7.800000 25.896803 1.200000 7.900000 26.611570 1.200000 8.000000 27.346337 1.200000 8.100000 28.101104 1.200000 8.200000 28.875870 1.200000 8.300000 29.670637 1.200000 8.400000 30.485404 1.200000 8.500000 31.320170 1.200000 8.600000 32.174937 1.200000 8.700000 33.049704 1.200000 8.800000 33.944471 1.200000 8.900000 34.859237 1.200000 9.000000 35.794004 1.200000 9.100000 36.748771 1.200000 9.200000 37.723538 1.200000 9.300000 38.718304 1.200000 9.400000 39.733071 1.200000 9.500000 40.767838 1.200000 9.600000 41.822604 1.200000 9.700000 42.897371 1.200000 9.800000 43.992138 1.200000 9.900000 45.106905 1.200000 10.000000 46.241671 1.200000 10.100000 47.396438 1.200000 10.200000 48.571205 1.200000 10.300000 49.765972 1.200000 10.400000 50.980738 1.200000 10.500000 52.215505 1.200000 10.600000 53.470272 1.200000 10.700000 54.745038 1.200000 10.800000 56.039805 1.200000 10.900000 57.354572 1.200000 11.000000 58.689339 1.200000 11.100000 60.044105 1.200000 11.200000 61.418872 1.200000 11.300000 62.813639 1.200000 11.400000 64.228405 1.200000 11.500000 65.663172 1.200000 11.600000 67.117939 1.200000 11.700000 68.592706 1.200000 11.800000 70.087472 1.200000 11.900000 71.602239 1.200000 12.000000 73.137006 1.200000 12.100000 74.691773 1.200000 12.200000 76.266539 1.200000 12.300000 77.861306 1.200000 12.400000 79.476073 1.200000 12.500000 81.110839 1.200000 12.600000 82.765606 1.200000 12.700000 84.440373 1.200000 12.800000 86.135140 1.200000 12.900000 87.849906 1.200000 13.000000 89.584673 1.200000 13.100000 91.339440 1.200000 13.200000 93.114207 1.200000 13.300000 94.908973 1.200000 13.400000 96.723740 1.200000 13.500000 98.558507 1.200000 13.600000 100.413273 1.200000 13.700000 102.288040 1.200000 13.800000 104.182807 1.200000 13.900000 106.097574 1.200000 14.000000 108.032340 1.200000 14.100000 109.987107 1.200000 14.200000 111.961874 1.200000 14.300000 113.956640 1.200000 14.400000 115.971407 1.200000 14.500000 118.006174 1.200000 14.600000 120.060941 1.200000 14.700000 122.135707 1.200000 14.800000 124.230474 1.200000 14.900000 126.345241 1.200000 15.000000 128.480008 1.300000 -5.000000 96.278383 1.300000 -4.900000 94.458521 1.300000 -4.800000 92.658660 1.300000 -4.700000 90.878798 1.300000 -4.600000 89.118937 1.300000 -4.500000 87.379075 1.300000 -4.400000 85.659214 1.300000 -4.300000 83.959352 1.300000 -4.200000 82.279491 1.300000 -4.100000 80.619629 1.300000 -4.000000 78.979768 1.300000 -3.900000 77.359906 1.300000 -3.800000 75.760045 1.300000 -3.700000 74.180183 1.300000 -3.600000 72.620322 1.300000 -3.500000 71.080460 1.300000 -3.400000 69.560599 1.300000 -3.300000 68.060737 1.300000 -3.200000 66.580875 1.300000 -3.100000 65.121014 1.300000 -3.000000 63.681152 1.300000 -2.900000 62.261291 1.300000 -2.800000 60.861429 1.300000 -2.700000 59.481568 1.300000 -2.600000 58.121706 1.300000 -2.500000 56.781845 1.300000 -2.400000 55.461983 1.300000 -2.300000 54.162122 1.300000 -2.200000 52.882260 1.300000 -2.100000 51.622399 1.300000 -2.000000 50.382537 1.300000 -1.900000 49.162676 1.300000 -1.800000 47.962814 1.300000 -1.700000 46.782953 1.300000 -1.600000 45.623091 1.300000 -1.500000 44.483230 1.300000 -1.400000 43.363368 1.300000 -1.300000 42.263507 1.300000 -1.200000 41.183645 1.300000 -1.100000 40.123784 1.300000 -1.000000 39.083922 1.300000 -0.900000 38.064061 1.300000 -0.800000 37.064199 1.300000 -0.700000 36.084338 1.300000 -0.600000 35.124476 1.300000 -0.500000 34.184615 1.300000 -0.400000 33.264753 1.300000 -0.300000 32.364892 1.300000 -0.200000 31.485030 1.300000 -0.100000 30.625169 1.300000 -0.000000 29.785307 1.300000 0.100000 28.965446 1.300000 0.200000 28.165584 1.300000 0.300000 27.385723 1.300000 0.400000 26.625861 1.300000 0.500000 25.886000 1.300000 0.600000 25.166138 1.300000 0.700000 24.466277 1.300000 0.800000 23.786415 1.300000 0.900000 23.126554 1.300000 1.000000 22.486692 1.300000 1.100000 21.866830 1.300000 1.200000 21.266969 1.300000 1.300000 20.687107 1.300000 1.400000 20.127246 1.300000 1.500000 19.587384 1.300000 1.600000 19.067523 1.300000 1.700000 18.567661 1.300000 1.800000 18.087800 1.300000 1.900000 17.627938 1.300000 2.000000 17.188077 1.300000 2.100000 16.768215 1.300000 2.200000 16.368354 1.300000 2.300000 15.988492 1.300000 2.400000 15.628631 1.300000 2.500000 15.288769 1.300000 2.600000 14.968908 1.300000 2.700000 14.669046 1.300000 2.800000 14.389185 1.300000 2.900000 14.129323 1.300000 3.000000 13.889462 1.300000 3.100000 13.669600 1.300000 3.200000 13.469739 1.300000 3.300000 13.289877 1.300000 3.400000 13.130016 1.300000 3.500000 12.990154 1.300000 3.600000 12.870293 1.300000 3.700000 12.770431 1.300000 3.800000 12.690570 1.300000 3.900000 12.630708 1.300000 4.000000 12.590847 1.300000 4.100000 12.570985 1.300000 4.200000 12.571124 1.300000 4.300000 12.591262 1.300000 4.400000 12.631401 1.300000 4.500000 12.691539 1.300000 4.600000 12.771678 1.300000 4.700000 12.871816 1.300000 4.800000 12.991955 1.300000 4.900000 13.132093 1.300000 5.000000 13.292232 1.300000 5.100000 13.472370 1.300000 5.200000 13.672508 1.300000 5.300000 13.892647 1.300000 5.400000 14.132785 1.300000 5.500000 14.392924 1.300000 5.600000 14.673062 1.300000 5.700000 14.973201 1.300000 5.800000 15.293339 1.300000 5.900000 15.633478 1.300000 6.000000 15.993616 1.300000 6.100000 16.373755 1.300000 6.200000 16.773893 1.300000 6.300000 17.194032 1.300000 6.400000 17.634170 1.300000 6.500000 18.094309 1.300000 6.600000 18.574447 1.300000 6.700000 19.074586 1.300000 6.800000 19.594724 1.300000 6.900000 20.134863 1.300000 7.000000 20.695001 1.300000 7.100000 21.275140 1.300000 7.200000 21.875278 1.300000 7.300000 22.495417 1.300000 7.400000 23.135555 1.300000 7.500000 23.795694 1.300000 7.600000 24.475832 1.300000 7.700000 25.175971 1.300000 7.800000 25.896109 1.300000 7.900000 26.636248 1.300000 8.000000 27.396386 1.300000 8.100000 28.176525 1.300000 8.200000 28.976663 1.300000 8.300000 29.796802 1.300000 8.400000 30.636940 1.300000 8.500000 31.497079 1.300000 8.600000 32.377217 1.300000 8.700000 33.277356 1.300000 8.800000 34.197494 1.300000 8.900000 35.137633 1.300000 9.000000 36.097771 1.300000 9.100000 37.077910 1.300000 9.200000 38.078048 1.300000 9.300000 39.098186 1.300000 9.400000 40.138325 1.300000 9.500000 41.198463 1.300000 9.600000 42.278602 1.300000 9.700000 43.378740 1.300000 9.800000 44.498879 1.300000 9.900000 45.639017 1.300000 10.000000 46.799156 1.300000 10.100000 47.979294 1.300000 10.200000 49.179433 1.300000 10.300000 50.399571 1.300000 10.400000 51.639710 1.300000 10.500000 52.899848 1.300000 10.600000 54.179987 1.300000 10.700000 55.480125 1.300000 10.800000 56.800264 1.300000 10.900000 58.140402 1.300000 11.000000 59.500541 1.300000 11.100000 60.880679 1.300000 11.200000 62.280818 1.300000 11.300000 63.700956 1.300000 11.400000 65.141095 1.300000 11.500000 66.601233 1.300000 11.600000 68.081372 1.300000 11.700000 69.581510 1.300000 11.800000 71.101649 1.300000 11.900000 72.641787 1.300000 12.000000 74.201926 1.300000 12.100000 75.782064 1.300000 12.200000 77.382203 1.300000 12.300000 79.002341 1.300000 12.400000 80.642480 1.300000 12.500000 82.302618 1.300000 12.600000 83.982757 1.300000 12.700000 85.682895 1.300000 12.800000 87.403034 1.300000 12.900000 89.143172 1.300000 13.000000 90.903311 1.300000 13.100000 92.683449 1.300000 13.200000 94.483588 1.300000 13.300000 96.303726 1.300000 13.400000 98.143864 1.300000 13.500000 100.004003 1.300000 13.600000 101.884141 1.300000 13.700000 103.784280 1.300000 13.800000 105.704418 1.300000 13.900000 107.644557 1.300000 14.000000 109.604695 1.300000 14.100000 111.584834 1.300000 14.200000 113.584972 1.300000 14.300000 115.605111 1.300000 14.400000 117.645249 1.300000 14.500000 119.705388 1.300000 14.600000 121.785526 1.300000 14.700000 123.885665 1.300000 14.800000 126.005803 1.300000 14.900000 128.145942 1.300000 15.000000 130.306080 1.400000 -5.000000 93.083254 1.400000 -4.900000 91.288248 1.400000 -4.800000 89.513241 1.400000 -4.700000 87.758235 1.400000 -4.600000 86.023228 1.400000 -4.500000 84.308222 1.400000 -4.400000 82.613215 1.400000 -4.300000 80.938209 1.400000 -4.200000 79.283202 1.400000 -4.100000 77.648196 1.400000 -4.000000 76.033189 1.400000 -3.900000 74.438183 1.400000 -3.800000 72.863176 1.400000 -3.700000 71.308170 1.400000 -3.600000 69.773163 1.400000 -3.500000 68.258157 1.400000 -3.400000 66.763150 1.400000 -3.300000 65.288144 1.400000 -3.200000 63.833137 1.400000 -3.100000 62.398131 1.400000 -3.000000 60.983124 1.400000 -2.900000 59.588118 1.400000 -2.800000 58.213111 1.400000 -2.700000 56.858105 1.400000 -2.600000 55.523098 1.400000 -2.500000 54.208092 1.400000 -2.400000 52.913085 1.400000 -2.300000 51.638079 1.400000 -2.200000 50.383072 1.400000 -2.100000 49.148066 1.400000 -2.000000 47.933059 1.400000 -1.900000 46.738053 1.400000 -1.800000 45.563047 1.400000 -1.700000 44.408040 1.400000 -1.600000 43.273034 1.400000 -1.500000 42.158027 1.400000 -1.400000 41.063021 1.400000 -1.300000 39.988014 1.400000 -1.200000 38.933008 1.400000 -1.100000 37.898001 1.400000 -1.000000 36.882995 1.400000 -0.900000 35.887988 1.400000 -0.800000 34.912982 1.400000 -0.700000 33.957975 1.400000 -0.600000 33.022969 1.400000 -0.500000 32.107962 1.400000 -0.400000 31.212956 1.400000 -0.300000 30.337949 1.400000 -0.200000 29.482943 1.400000 -0.100000 28.647936 1.400000 -0.000000 27.832930 1.400000 0.100000 27.037923 1.400000 0.200000 26.262917 1.400000 0.300000 25.507910 1.400000 0.400000 24.772904 1.400000 0.500000 24.057897 1.400000 0.600000 23.362891 1.400000 0.700000 22.687884 1.400000 0.800000 22.032878 1.400000 0.900000 21.397871 1.400000 1.000000 20.782865 1.400000 1.100000 20.187858 1.400000 1.200000 19.612852 1.400000 1.300000 19.057845 1.400000 1.400000 18.522839 1.400000 1.500000 18.007832 1.400000 1.600000 17.512826 1.400000 1.700000 17.037819 1.400000 1.800000 16.582813 1.400000 1.900000 16.147806 1.400000 2.000000 15.732800 1.400000 2.100000 15.337794 1.400000 2.200000 14.962787 1.400000 2.300000 14.607781 1.400000 2.400000 14.272774 1.400000 2.500000 13.957768 1.400000 2.600000 13.662761 1.400000 2.700000 13.387755 1.400000 2.800000 13.132748 1.400000 2.900000 12.897742 1.400000 3.000000 12.682735 1.400000 3.100000 12.487729 1.400000 3.200000 12.312722 1.400000 3.300000 12.157716 1.400000 3.400000 12.022709 1.400000 3.500000 11.907703 1.400000 3.600000 11.812696 1.400000 3.700000 11.737690 1.400000 3.800000 11.682683 1.400000 3.900000 11.647677 1.400000 4.000000 11.632670 1.400000 4.100000 11.637664 1.400000 4.200000 11.662657 1.400000 4.300000 11.707651 1.400000 4.400000 11.772644 1.400000 4.500000 11.857638 1.400000 4.600000 11.962631 1.400000 4.700000 12.087625 1.400000 4.800000 12.232618 1.400000 4.900000 12.397612 1.400000 5.000000 12.582605 1.400000 5.100000 12.787599 1.400000 5.200000 13.012592 1.400000 5.300000 13.257586 1.400000 5.400000 13.522579 1.400000 5.500000 13.807573 1.400000 5.600000 14.112566 1.400000 5.700000 14.437560 1.400000 5.800000 14.782554 1.400000 5.900000 15.147547 1.400000 6.000000 15.532541 1.400000 6.100000 15.937534 1.400000 6.200000 16.362528 1.400000 6.300000 16.807521 1.400000 6.400000 17.272515 1.400000 6.500000 17.757508 1.400000 6.600000 18.262502 1.400000 6.700000 18.787495 1.400000 6.800000 19.332489 1.400000 6.900000 19.897482 1.400000 7.000000 20.482476 1.400000 7.100000 21.087469 1.400000 7.200000 21.712463 1.400000 7.300000 22.357456 1.400000 7.400000 23.022450 1.400000 7.500000 23.707443 1.400000 7.600000 24.412437 1.400000 7.700000 25.137430 1.400000 7.800000 25.882424 1.400000 7.900000 26.647417 1.400000 8.000000 27.432411 1.400000 8.100000 28.237404 1.400000 8.200000 29.062398 1.400000 8.300000 29.907391 1.400000 8.400000 30.772385 1.400000 8.500000 31.657378 1.400000 8.600000 32.562372 1.400000 8.700000 33.487365 1.400000 8.800000 34.432359 1.400000 8.900000 35.397352 1.400000 9.000000 36.382346 1.400000 9.100000 37.387339 1.400000 9.200000 38.412333 1.400000 9.300000 39.457326 1.400000 9.400000 40.522320 1.400000 9.500000 41.607313 1.400000 9.600000 42.712307 1.400000 9.700000 43.837301 1.400000 9.800000 44.982294 1.400000 9.900000 46.147288 1.400000 10.000000 47.332281 1.400000 10.100000 48.537275 1.400000 10.200000 49.762268 1.400000 10.300000 51.007262 1.400000 10.400000 52.272255 1.400000 10.500000 53.557249 1.400000 10.600000 54.862242 1.400000 10.700000 56.187236 1.400000 10.800000 57.532229 1.400000 10.900000 58.897223 1.400000 11.000000 60.282216 1.400000 11.100000 61.687210 1.400000 11.200000 63.112203 1.400000 11.300000 64.557197 1.400000 11.400000 66.022190 1.400000 11.500000 67.507184 1.400000 11.600000 69.012177 1.400000 11.700000 70.537171 1.400000 11.800000 72.082164 1.400000 11.900000 73.647158 1.400000 12.000000 75.232151 1.400000 12.100000 76.837145 1.400000 12.200000 78.462138 1.400000 12.300000 80.107132 1.400000 12.400000 81.772125 1.400000 12.500000 83.457119 1.400000 12.600000 85.162112 1.400000 12.700000 86.887106 1.400000 12.800000 88.632099 1.400000 12.900000 90.397093 1.400000 13.000000 92.182086 1.400000 13.100000 93.987080 1.400000 13.200000 95.812073 1.400000 13.300000 97.657067 1.400000 13.400000 99.522061 1.400000 13.500000 101.407054 1.400000 13.600000 103.312048 1.400000 13.700000 105.237041 1.400000 13.800000 107.182035 1.400000 13.900000 109.147028 1.400000 14.000000 111.132022 1.400000 14.100000 113.137015 1.400000 14.200000 115.162009 1.400000 14.300000 117.207002 1.400000 14.400000 119.271996 1.400000 14.500000 121.356989 1.400000 14.600000 123.461983 1.400000 14.700000 125.586976 1.400000 14.800000 127.731970 1.400000 14.900000 129.896963 1.400000 15.000000 132.081957 1.500000 -5.000000 89.948708 1.500000 -4.900000 88.178039 1.500000 -4.800000 86.427371 1.500000 -4.700000 84.696703 1.500000 -4.600000 82.986035 1.500000 -4.500000 81.295367 1.500000 -4.400000 79.624698 1.500000 -4.300000 77.974030 1.500000 -4.200000 76.343362 1.500000 -4.100000 74.732694 1.500000 -4.000000 73.142026 1.500000 -3.900000 71.571357 1.500000 -3.800000 70.020689 1.500000 -3.700000 68.490021 1.500000 -3.600000 66.979353 1.500000 -3.500000 65.488685 1.500000 -3.400000 64.018016 1.500000 -3.300000 62.567348 1.500000 -3.200000 61.136680 1.500000 -3.100000 59.726012 1.500000 -3.000000 58.335344 1.500000 -2.900000 56.964675 1.500000 -2.800000 55.614007 1.500000 -2.700000 54.283339 1.500000 -2.600000 52.972671 1.500000 -2.500000 51.682003 1.500000 -2.400000 50.411334 1.500000 -2.300000 49.160666 1.500000 -2.200000 47.929998 1.500000 -2.100000 46.719330 1.500000 -2.000000 45.528662 1.500000 -1.900000 44.357993 1.500000 -1.800000 43.207325 1.500000 -1.700000 42.076657 1.500000 -1.600000 40.965989 1.500000 -1.500000 39.875321 1.500000 -1.400000 38.804652 1.500000 -1.300000 37.753984 1.500000 -1.200000 36.723316 1.500000 -1.100000 35.712648 1.500000 -1.000000 34.721980 1.500000 -0.900000 33.751311 1.500000 -0.800000 32.800643 1.500000 -0.700000 31.869975 1.500000 -0.600000 30.959307 1.500000 -0.500000 30.068639 1.500000 -0.400000 29.197970 1.500000 -0.300000 28.347302 1.500000 -0.200000 27.516634 1.500000 -0.100000 26.705966 1.500000 -0.000000 25.915298 1.500000 0.100000 25.144629 1.500000 0.200000 24.393961 1.500000 0.300000 23.663293 1.500000 0.400000 22.952625 1.500000 0.500000 22.261957 1.500000 0.600000 21.591288 1.500000 0.700000 20.940620 1.500000 0.800000 20.309952 1.500000 0.900000 19.699284 1.500000 1.000000 19.108616 1.500000 1.100000 18.537947 1.500000 1.200000 17.987279 1.500000 1.300000 17.456611 1.500000 1.400000 16.945943 1.500000 1.500000 16.455275 1.500000 1.600000 15.984606 1.500000 1.700000 15.533938 1.500000 1.800000 15.103270 1.500000 1.900000 14.692602 1.500000 2.000000 14.301934 1.500000 2.100000 13.931265 1.500000 2.200000 13.580597 1.500000 2.300000 13.249929 1.500000 2.400000 12.939261 1.500000 2.500000 12.648593 1.500000 2.600000 12.377924 1.500000 2.700000 12.127256 1.500000 2.800000 11.896588 1.500000 2.900000 11.685920 1.500000 3.000000 11.495252 1.500000 3.100000 11.324583 1.500000 3.200000 11.173915 1.500000 3.300000 11.043247 1.500000 3.400000 10.932579 1.500000 3.500000 10.841911 1.500000 3.600000 10.771242 1.500000 3.700000 10.720574 1.500000 3.800000 10.689906 1.500000 3.900000 10.679238 1.500000 4.000000 10.688570 1.500000 4.100000 10.717901 1.500000 4.200000 10.767233 1.500000 4.300000 10.836565 1.500000 4.400000 10.925897 1.500000 4.500000 11.035229 1.500000 4.600000 11.164560 1.500000 4.700000 11.313892 1.500000 4.800000 11.483224 1.500000 4.900000 11.672556 1.500000 5.000000 11.881888 1.500000 5.100000 12.111219 1.500000 5.200000 12.360551 1.500000 5.300000 12.629883 1.500000 5.400000 12.919215 1.500000 5.500000 13.228547 1.500000 5.600000 13.557878 1.500000 5.700000 13.907210 1.500000 5.800000 14.276542 1.500000 5.900000 14.665874 1.500000 6.000000 15.075206 1.500000 6.100000 15.504537 1.500000 6.200000 15.953869 1.500000 6.300000 16.423201 1.500000 6.400000 16.912533 1.500000 6.500000 17.421865 1.500000 6.600000 17.951196 1.500000 6.700000 18.500528 1.500000 6.800000 19.069860 1.500000 6.900000 19.659192 1.500000 7.000000 20.268524 1.500000 7.100000 20.897855 1.500000 7.200000 21.547187 1.500000 7.300000 22.216519 1.500000 7.400000 22.905851 1.500000 7.500000 23.615183 1.500000 7.600000 24.344514 1.500000 7.700000 25.093846 1.500000 7.800000 25.863178 1.500000 7.900000 26.652510 1.500000 8.000000 27.461842 1.500000 8.100000 28.291173 1.500000 8.200000 29.140505 1.500000 8.300000 30.009837 1.500000 8.400000 30.899169 1.500000 8.500000 31.808501 1.500000 8.600000 32.737832 1.500000 8.700000 33.687164 1.500000 8.800000 34.656496 1.500000 8.900000 35.645828 1.500000 9.000000 36.655160 1.500000 9.100000 37.684491 1.500000 9.200000 38.733823 1.500000 9.300000 39.803155 1.500000 9.400000 40.892487 1.500000 9.500000 42.001819 1.500000 9.600000 43.131150 1.500000 9.700000 44.280482 1.500000 9.800000 45.449814 1.500000 9.900000 46.639146 1.500000 10.000000 47.848478 1.500000 10.100000 49.077809 1.500000 10.200000 50.327141 1.500000 10.300000 51.596473 1.500000 10.400000 52.885805 1.500000 10.500000 54.195137 1.500000 10.600000 55.524468 1.500000 10.700000 56.873800 1.500000 10.800000 58.243132 1.500000 10.900000 59.632464 1.500000 11.000000 61.041796 1.500000 11.100000 62.471127 1.500000 11.200000 63.920459 1.500000 11.300000 65.389791 1.500000 11.400000 66.879123 1.500000 11.500000 68.388455 1.500000 11.600000 69.917786 1.500000 11.700000 71.467118 1.500000 11.800000 73.036450 1.500000 11.900000 74.625782 1.500000 12.000000 76.235114 1.500000 12.100000 77.864445 1.500000 12.200000 79.513777 1.500000 12.300000 81.183109 1.500000 12.400000 82.872441 1.500000 12.500000 84.581773 1.500000 12.600000 86.311104 1.500000 12.700000 88.060436 1.500000 12.800000 89.829768 1.500000 12.900000 91.619100 1.500000 13.000000 93.428432 1.500000 13.100000 95.257763 1.500000 13.200000 97.107095 1.500000 13.300000 98.976427 1.500000 13.400000 100.865759 1.500000 13.500000 102.775091 1.500000 13.600000 104.704422 1.500000 13.700000 106.653754 1.500000 13.800000 108.623086 1.500000 13.900000 110.612418 1.500000 14.000000 112.621750 1.500000 14.100000 114.651081 1.500000 14.200000 116.700413 1.500000 14.300000 118.769745 1.500000 14.400000 120.859077 1.500000 14.500000 122.968409 1.500000 14.600000 125.097740 1.500000 14.700000 127.247072 1.500000 14.800000 129.416404 1.500000 14.900000 131.605736 1.500000 15.000000 133.815068 1.600000 -5.000000 86.882377 1.600000 -4.900000 85.135530 1.600000 -4.800000 83.408683 1.600000 -4.700000 81.701837 1.600000 -4.600000 80.014990 1.600000 -4.500000 78.348144 1.600000 -4.400000 76.701297 1.600000 -4.300000 75.074450 1.600000 -4.200000 73.467604 1.600000 -4.100000 71.880757 1.600000 -4.000000 70.313910 1.600000 -3.900000 68.767064 1.600000 -3.800000 67.240217 1.600000 -3.700000 65.733370 1.600000 -3.600000 64.246524 1.600000 -3.500000 62.779677 1.600000 -3.400000 61.332830 1.600000 -3.300000 59.905984 1.600000 -3.200000 58.499137 1.600000 -3.100000 57.112290 1.600000 -3.000000 55.745444 1.600000 -2.900000 54.398597 1.600000 -2.800000 53.071750 1.600000 -2.700000 51.764904 1.600000 -2.600000 50.478057 1.600000 -2.500000 49.211210 1.600000 -2.400000 47.964364 1.600000 -2.300000 46.737517 1.600000 -2.200000 45.530671 1.600000 -2.100000 44.343824 1.600000 -2.000000 43.176977 1.600000 -1.900000 42.030131 1.600000 -1.800000 40.903284 1.600000 -1.700000 39.796437 1.600000 -1.600000 38.709591 1.600000 -1.500000 37.642744 1.600000 -1.400000 36.595897 1.600000 -1.300000 35.569051 1.600000 -1.200000 34.562204 1.600000 -1.100000 33.575357 1.600000 -1.000000 32.608511 1.600000 -0.900000 31.661664 1.600000 -0.800000 30.734817 1.600000 -0.700000 29.827971 1.600000 -0.600000 28.941124 1.600000 -0.500000 28.074277 1.600000 -0.400000 27.227431 1.600000 -0.300000 26.400584 1.600000 -0.200000 25.593738 1.600000 -0.100000 24.806891 1.600000 -0.000000 24.040044 1.600000 0.100000 23.293198 1.600000 0.200000 22.566351 1.600000 0.300000 21.859504 1.600000 0.400000 21.172658 1.600000 0.500000 20.505811 1.600000 0.600000 19.858964 1.600000 0.700000 19.232118 1.600000 0.800000 18.625271 1.600000 0.900000 18.038424 1.600000 1.000000 17.471578 1.600000 1.100000 16.924731 1.600000 1.200000 16.397884 1.600000 1.300000 15.891038 1.600000 1.400000 15.404191 1.600000 1.500000 14.937344 1.600000 1.600000 14.490498 1.600000 1.700000 14.063651 1.600000 1.800000 13.656805 1.600000 1.900000 13.269958 1.600000 2.000000 12.903111 1.600000 2.100000 12.556265 1.600000 2.200000 12.229418 1.600000 2.300000 11.922571 1.600000 2.400000 11.635725 1.600000 2.500000 11.368878 1.600000 2.600000 11.122031 1.600000 2.700000 10.895185 1.600000 2.800000 10.688338 1.600000 2.900000 10.501491 1.600000 3.000000 10.334645 1.600000 3.100000 10.187798 1.600000 3.200000 10.060951 1.600000 3.300000 9.954105 1.600000 3.400000 9.867258 1.600000 3.500000 9.800411 1.600000 3.600000 9.753565 1.600000 3.700000 9.726718 1.600000 3.800000 9.719871 1.600000 3.900000 9.733025 1.600000 4.000000 9.766178 1.600000 4.100000 9.819332 1.600000 4.200000 9.892485 1.600000 4.300000 9.985638 1.600000 4.400000 10.098792 1.600000 4.500000 10.231945 1.600000 4.600000 10.385098 1.600000 4.700000 10.558252 1.600000 4.800000 10.751405 1.600000 4.900000 10.964558 1.600000 5.000000 11.197712 1.600000 5.100000 11.450865 1.600000 5.200000 11.724018 1.600000 5.300000 12.017172 1.600000 5.400000 12.330325 1.600000 5.500000 12.663478 1.600000 5.600000 13.016632 1.600000 5.700000 13.389785 1.600000 5.800000 13.782938 1.600000 5.900000 14.196092 1.600000 6.000000 14.629245 1.600000 6.100000 15.082399 1.600000 6.200000 15.555552 1.600000 6.300000 16.048705 1.600000 6.400000 16.561859 1.600000 6.500000 17.095012 1.600000 6.600000 17.648165 1.600000 6.700000 18.221319 1.600000 6.800000 18.814472 1.600000 6.900000 19.427625 1.600000 7.000000 20.060779 1.600000 7.100000 20.713932 1.600000 7.200000 21.387085 1.600000 7.300000 22.080239 1.600000 7.400000 22.793392 1.600000 7.500000 23.526545 1.600000 7.600000 24.279699 1.600000 7.700000 25.052852 1.600000 7.800000 25.846005 1.600000 7.900000 26.659159 1.600000 8.000000 27.492312 1.600000 8.100000 28.345466 1.600000 8.200000 29.218619 1.600000 8.300000 30.111772 1.600000 8.400000 31.024926 1.600000 8.500000 31.958079 1.600000 8.600000 32.911232 1.600000 8.700000 33.884386 1.600000 8.800000 34.877539 1.600000 8.900000 35.890692 1.600000 9.000000 36.923846 1.600000 9.100000 37.976999 1.600000 9.200000 39.050152 1.600000 9.300000 40.143306 1.600000 9.400000 41.256459 1.600000 9.500000 42.389612 1.600000 9.600000 43.542766 1.600000 9.700000 44.715919 1.600000 9.800000 45.909072 1.600000 9.900000 47.122226 1.600000 10.000000 48.355379 1.600000 10.100000 49.608532 1.600000 10.200000 50.881686 1.600000 10.300000 52.174839 1.600000 10.400000 53.487993 1.600000 10.500000 54.821146 1.600000 10.600000 56.174299 1.600000 10.700000 57.547453 1.600000 10.800000 58.940606 1.600000 10.900000 60.353759 1.600000 11.000000 61.786913 1.600000 11.100000 63.240066 1.600000 11.200000 64.713219 1.600000 11.300000 66.206373 1.600000 11.400000 67.719526 1.600000 11.500000 69.252679 1.600000 11.600000 70.805833 1.600000 11.700000 72.378986 1.600000 11.800000 73.972139 1.600000 11.900000 75.585293 1.600000 12.000000 77.218446 1.600000 12.100000 78.871599 1.600000 12.200000 80.544753 1.600000 12.300000 82.237906 1.600000 12.400000 83.951060 1.600000 12.500000 85.684213 1.600000 12.600000 87.437366 1.600000 12.700000 89.210520 1.600000 12.800000 91.003673 1.600000 12.900000 92.816826 1.600000 13.000000 94.649980 1.600000 13.100000 96.503133 1.600000 13.200000 98.376286 1.600000 13.300000 100.269440 1.600000 13.400000 102.182593 1.600000 13.500000 104.115746 1.600000 13.600000 106.068900 1.600000 13.700000 108.042053 1.600000 13.800000 110.035206 1.600000 13.900000 112.048360 1.600000 14.000000 114.081513 1.600000 14.100000 116.134666 1.600000 14.200000 118.207820 1.600000 14.300000 120.300973 1.600000 14.400000 122.414127 1.600000 14.500000 124.547280 1.600000 14.600000 126.700433 1.600000 14.700000 128.873587 1.600000 14.800000 131.066740 1.600000 14.900000 133.279893 1.600000 15.000000 135.513047 1.700000 -5.000000 83.892003 1.700000 -4.900000 82.168462 1.700000 -4.800000 80.464920 1.700000 -4.700000 78.781378 1.700000 -4.600000 77.117836 1.700000 -4.500000 75.474294 1.700000 -4.400000 73.850752 1.700000 -4.300000 72.247211 1.700000 -4.200000 70.663669 1.700000 -4.100000 69.100127 1.700000 -4.000000 67.556585 1.700000 -3.900000 66.033043 1.700000 -3.800000 64.529501 1.700000 -3.700000 63.045959 1.700000 -3.600000 61.582418 1.700000 -3.500000 60.138876 1.700000 -3.400000 58.715334 1.700000 -3.300000 57.311792 1.700000 -3.200000 55.928250 1.700000 -3.100000 54.564708 1.700000 -3.000000 53.221167 1.700000 -2.900000 51.897625 1.700000 -2.800000 50.594083 1.700000 -2.700000 49.310541 1.700000 -2.600000 48.046999 1.700000 -2.500000 46.803457 1.700000 -2.400000 45.579916 1.700000 -2.300000 44.376374 1.700000 -2.200000 43.192832 1.700000 -2.100000 42.029290 1.700000 -2.000000 40.885748 1.700000 -1.900000 39.762206 1.700000 -1.800000 38.658665 1.700000 -1.700000 37.575123 1.700000 -1.600000 36.511581 1.700000 -1.500000 35.468039 1.700000 -1.400000 34.444497 1.700000 -1.300000 33.440955 1.700000 -1.200000 32.457413 1.700000 -1.100000 31.493872 1.700000 -1.000000 30.550330 1.700000 -0.900000 29.626788 1.700000 -0.800000 28.723246 1.700000 -0.700000 27.839704 1.700000 -0.600000 26.976162 1.700000 -0.500000 26.132621 1.700000 -0.400000 25.309079 1.700000 -0.300000 24.505537 1.700000 -0.200000 23.721995 1.700000 -0.100000 22.958453 1.700000 -0.000000 22.214911 1.700000 0.100000 21.491370 1.700000 0.200000 20.787828 1.700000 0.300000 20.104286 1.700000 0.400000 19.440744 1.700000 0.500000 18.797202 1.700000 0.600000 18.173660 1.700000 0.700000 17.570119 1.700000 0.800000 16.986577 1.700000 0.900000 16.423035 1.700000 1.000000 15.879493 1.700000 1.100000 15.355951 1.700000 1.200000 14.852409 1.700000 1.300000 14.368868 1.700000 1.400000 13.905326 1.700000 1.500000 13.461784 1.700000 1.600000 13.038242 1.700000 1.700000 12.634700 1.700000 1.800000 12.251158 1.700000 1.900000 11.887616 1.700000 2.000000 11.544075 1.700000 2.100000 11.220533 1.700000 2.200000 10.916991 1.700000 2.300000 10.633449 1.700000 2.400000 10.369907 1.700000 2.500000 10.126365 1.700000 2.600000 9.902824 1.700000 2.700000 9.699282 1.700000 2.800000 9.515740 1.700000 2.900000 9.352198 1.700000 3.000000 9.208656 1.700000 3.100000 9.085114 1.700000 3.200000 8.981573 1.700000 3.300000 8.898031 1.700000 3.400000 8.834489 1.700000 3.500000 8.790947 1.700000 3.600000 8.767405 1.700000 3.700000 8.763863 1.700000 3.800000 8.780322 1.700000 3.900000 8.816780 1.700000 4.000000 8.873238 1.700000 4.100000 8.949696 1.700000 4.200000 9.046154 1.700000 4.300000 9.162612 1.700000 4.400000 9.299070 1.700000 4.500000 9.455529 1.700000 4.600000 9.631987 1.700000 4.700000 9.828445 1.700000 4.800000 10.044903 1.700000 4.900000 10.281361 1.700000 5.000000 10.537819 1.700000 5.100000 10.814278 1.700000 5.200000 11.110736 1.700000 5.300000 11.427194 1.700000 5.400000 11.763652 1.700000 5.500000 12.120110 1.700000 5.600000 12.496568 1.700000 5.700000 12.893027 1.700000 5.800000 13.309485 1.700000 5.900000 13.745943 1.700000 6.000000 14.202401 1.700000 6.100000 14.678859 1.700000 6.200000 15.175317 1.700000 6.300000 15.691776 1.700000 6.400000 16.228234 1.700000 6.500000 16.784692 1.700000 6.600000 17.361150 1.700000 6.700000 17.957608 1.700000 6.800000 18.574066 1.700000 6.900000 19.210524 1.700000 7.000000 19.866983 1.700000 7.100000 20.543441 1.700000 7.200000 21.239899 1.700000 7.300000 21.956357 1.700000 7.400000 22.692815 1.700000 7.500000 23.449273 1.700000 7.600000 24.225732 1.700000 7.700000 25.022190 1.700000 7.800000 25.838648 1.700000 7.900000 26.675106 1.700000 8.000000 27.531564 1.700000 8.100000 28.408022 1.700000 8.200000 29.304481 1.700000 8.300000 30.220939 1.700000 8.400000 31.157397 1.700000 8.500000 32.113855 1.700000 8.600000 33.090313 1.700000 8.700000 34.086771 1.700000 8.800000 35.103230 1.700000 8.900000 36.139688 1.700000 9.000000 37.196146 1.700000 9.100000 38.272604 1.700000 9.200000 39.369062 1.700000 9.300000 40.485520 1.700000 9.400000 41.621978 1.700000 9.500000 42.778437 1.700000 9.600000 43.954895 1.700000 9.700000 45.151353 1.700000 9.800000 46.367811 1.700000 9.900000 47.604269 1.700000 10.000000 48.860727 1.700000 10.100000 50.137186 1.700000 10.200000 51.433644 1.700000 10.300000 52.750102 1.700000 10.400000 54.086560 1.700000 10.500000 55.443018 1.700000 10.600000 56.819476 1.700000 10.700000 58.215935 1.700000 10.800000 59.632393 1.700000 10.900000 61.068851 1.700000 11.000000 62.525309 1.700000 11.100000 64.001767 1.700000 11.200000 65.498225 1.700000 11.300000 67.014684 1.700000 11.400000 68.551142 1.700000 11.500000 70.107600 1.700000 11.600000 71.684058 1.700000 11.700000 73.280516 1.700000 11.800000 74.896974 1.700000 11.900000 76.533432 1.700000 12.000000 78.189891 1.700000 12.100000 79.866349 1.700000 12.200000 81.562807 1.700000 12.300000 83.279265 1.700000 12.400000 85.015723 1.700000 12.500000 86.772181 1.700000 12.600000 88.548640 1.700000 12.700000 90.345098 1.700000 12.800000 92.161556 1.700000 12.900000 93.998014 1.700000 13.000000 95.854472 1.700000 13.100000 97.730930 1.700000 13.200000 99.627389 1.700000 13.300000 101.543847 1.700000 13.400000 103.480305 1.700000 13.500000 105.436763 1.700000 13.600000 107.413221 1.700000 13.700000 109.409679 1.700000 13.800000 111.426138 1.700000 13.900000 113.462596 1.700000 14.000000 115.519054 1.700000 14.100000 117.595512 1.700000 14.200000 119.691970 1.700000 14.300000 121.808428 1.700000 14.400000 123.944886 1.700000 14.500000 126.101345 1.700000 14.600000 128.277803 1.700000 14.700000 130.474261 1.700000 14.800000 132.690719 1.700000 14.900000 134.927177 1.700000 15.000000 137.183635 1.800000 -5.000000 80.985341 1.800000 -4.900000 79.284587 1.800000 -4.800000 77.603834 1.800000 -4.700000 75.943080 1.800000 -4.600000 74.302326 1.800000 -4.500000 72.681572 1.800000 -4.400000 71.080819 1.800000 -4.300000 69.500065 1.800000 -4.200000 67.939311 1.800000 -4.100000 66.398557 1.800000 -4.000000 64.877803 1.800000 -3.900000 63.377050 1.800000 -3.800000 61.896296 1.800000 -3.700000 60.435542 1.800000 -3.600000 58.994788 1.800000 -3.500000 57.574035 1.800000 -3.400000 56.173281 1.800000 -3.300000 54.792527 1.800000 -3.200000 53.431773 1.800000 -3.100000 52.091020 1.800000 -3.000000 50.770266 1.800000 -2.900000 49.469512 1.800000 -2.800000 48.188758 1.800000 -2.700000 46.928005 1.800000 -2.600000 45.687251 1.800000 -2.500000 44.466497 1.800000 -2.400000 43.265743 1.800000 -2.300000 42.084989 1.800000 -2.200000 40.924236 1.800000 -2.100000 39.783482 1.800000 -2.000000 38.662728 1.800000 -1.900000 37.561974 1.800000 -1.800000 36.481221 1.800000 -1.700000 35.420467 1.800000 -1.600000 34.379713 1.800000 -1.500000 33.358959 1.800000 -1.400000 32.358206 1.800000 -1.300000 31.377452 1.800000 -1.200000 30.416698 1.800000 -1.100000 29.475944 1.800000 -1.000000 28.555190 1.800000 -0.900000 27.654437 1.800000 -0.800000 26.773683 1.800000 -0.700000 25.912929 1.800000 -0.600000 25.072175 1.800000 -0.500000 24.251422 1.800000 -0.400000 23.450668 1.800000 -0.300000 22.669914 1.800000 -0.200000 21.909160 1.800000 -0.100000 21.168407 1.800000 -0.000000 20.447653 1.800000 0.100000 19.746899 1.800000 0.200000 19.066145 1.800000 0.300000 18.405392 1.800000 0.400000 17.764638 1.800000 0.500000 17.143884 1.800000 0.600000 16.543130 1.800000 0.700000 15.962376 1.800000 0.800000 15.401623 1.800000 0.900000 14.860869 1.800000 1.000000 14.340115 1.800000 1.100000 13.839361 1.800000 1.200000 13.358608 1.800000 1.300000 12.897854 1.800000 1.400000 12.457100 1.800000 1.500000 12.036346 1.800000 1.600000 11.635593 1.800000 1.700000 11.254839 1.800000 1.800000 10.894085 1.800000 1.900000 10.553331 1.800000 2.000000 10.232577 1.800000 2.100000 9.931824 1.800000 2.200000 9.651070 1.800000 2.300000 9.390316 1.800000 2.400000 9.149562 1.800000 2.500000 8.928809 1.800000 2.600000 8.728055 1.800000 2.700000 8.547301 1.800000 2.800000 8.386547 1.800000 2.900000 8.245794 1.800000 3.000000 8.125040 1.800000 3.100000 8.024286 1.800000 3.200000 7.943532 1.800000 3.300000 7.882779 1.800000 3.400000 7.842025 1.800000 3.500000 7.821271 1.800000 3.600000 7.820517 1.800000 3.700000 7.839763 1.800000 3.800000 7.879010 1.800000 3.900000 7.938256 1.800000 4.000000 8.017502 1.800000 4.100000 8.116748 1.800000 4.200000 8.235995 1.800000 4.300000 8.375241 1.800000 4.400000 8.534487 1.800000 4.500000 8.713733 1.800000 4.600000 8.912980 1.800000 4.700000 9.132226 1.800000 4.800000 9.371472 1.800000 4.900000 9.630718 1.800000 5.000000 9.909964 1.800000 5.100000 10.209211 1.800000 5.200000 10.528457 1.800000 5.300000 10.867703 1.800000 5.400000 11.226949 1.800000 5.500000 11.606196 1.800000 5.600000 12.005442 1.800000 5.700000 12.424688 1.800000 5.800000 12.863934 1.800000 5.900000 13.323181 1.800000 6.000000 13.802427 1.800000 6.100000 14.301673 1.800000 6.200000 14.820919 1.800000 6.300000 15.360166 1.800000 6.400000 15.919412 1.800000 6.500000 16.498658 1.800000 6.600000 17.097904 1.800000 6.700000 17.717150 1.800000 6.800000 18.356397 1.800000 6.900000 19.015643 1.800000 7.000000 19.694889 1.800000 7.100000 20.394135 1.800000 7.200000 21.113382 1.800000 7.300000 21.852628 1.800000 7.400000 22.611874 1.800000 7.500000 23.391120 1.800000 7.600000 24.190367 1.800000 7.700000 25.009613 1.800000 7.800000 25.848859 1.800000 7.900000 26.708105 1.800000 8.000000 27.587351 1.800000 8.100000 28.486598 1.800000 8.200000 29.405844 1.800000 8.300000 30.345090 1.800000 8.400000 31.304336 1.800000 8.500000 32.283583 1.800000 8.600000 33.282829 1.800000 8.700000 34.302075 1.800000 8.800000 35.341321 1.800000 8.900000 36.400568 1.800000 9.000000 37.479814 1.800000 9.100000 38.579060 1.800000 9.200000 39.698306 1.800000 9.300000 40.837553 1.800000 9.400000 41.996799 1.800000 9.500000 43.176045 1.800000 9.600000 44.375291 1.800000 9.700000 45.594537 1.800000 9.800000 46.833784 1.800000 9.900000 48.093030 1.800000 10.000000 49.372276 1.800000 10.100000 50.671522 1.800000 10.200000 51.990769 1.800000 10.300000 53.330015 1.800000 10.400000 54.689261 1.800000 10.500000 56.068507 1.800000 10.600000 57.467754 1.800000 10.700000 58.887000 1.800000 10.800000 60.326246 1.800000 10.900000 61.785492 1.800000 11.000000 63.264738 1.800000 11.100000 64.763985 1.800000 11.200000 66.283231 1.800000 11.300000 67.822477 1.800000 11.400000 69.381723 1.800000 11.500000 70.960970 1.800000 11.600000 72.560216 1.800000 11.700000 74.179462 1.800000 11.800000 75.818708 1.800000 11.900000 77.477955 1.800000 12.000000 79.157201 1.800000 12.100000 80.856447 1.800000 12.200000 82.575693 1.800000 12.300000 84.314940 1.800000 12.400000 86.074186 1.800000 12.500000 87.853432 1.800000 12.600000 89.652678 1.800000 12.700000 91.471924 1.800000 12.800000 93.311171 1.800000 12.900000 95.170417 1.800000 13.000000 97.049663 1.800000 13.100000 98.948909 1.800000 13.200000 100.868156 1.800000 13.300000 102.807402 1.800000 13.400000 104.766648 1.800000 13.500000 106.745894 1.800000 13.600000 108.745141 1.800000 13.700000 110.764387 1.800000 13.800000 112.803633 1.800000 13.900000 114.862879 1.800000 14.000000 116.942125 1.800000 14.100000 119.041372 1.800000 14.200000 121.160618 1.800000 14.300000 123.299864 1.800000 14.400000 125.459110 1.800000 14.500000 127.638357 1.800000 14.600000 129.837603 1.800000 14.700000 132.056849 1.800000 14.800000 134.296095 1.800000 14.900000 136.555342 1.800000 15.000000 138.834588 1.900000 -5.000000 78.170060 1.900000 -4.900000 76.491578 1.900000 -4.800000 74.833095 1.900000 -4.700000 73.194613 1.900000 -4.600000 71.576131 1.900000 -4.500000 69.977648 1.900000 -4.400000 68.399166 1.900000 -4.300000 66.840683 1.900000 -4.200000 65.302201 1.900000 -4.100000 63.783718 1.900000 -4.000000 62.285236 1.900000 -3.900000 60.806753 1.900000 -3.800000 59.348271 1.900000 -3.700000 57.909789 1.900000 -3.600000 56.491306 1.900000 -3.500000 55.092824 1.900000 -3.400000 53.714341 1.900000 -3.300000 52.355859 1.900000 -3.200000 51.017376 1.900000 -3.100000 49.698894 1.900000 -3.000000 48.400412 1.900000 -2.900000 47.121929 1.900000 -2.800000 45.863447 1.900000 -2.700000 44.624964 1.900000 -2.600000 43.406482 1.900000 -2.500000 42.207999 1.900000 -2.400000 41.029517 1.900000 -2.300000 39.871035 1.900000 -2.200000 38.732552 1.900000 -2.100000 37.614070 1.900000 -2.000000 36.515587 1.900000 -1.900000 35.437105 1.900000 -1.800000 34.378622 1.900000 -1.700000 33.340140 1.900000 -1.600000 32.321658 1.900000 -1.500000 31.323175 1.900000 -1.400000 30.344693 1.900000 -1.300000 29.386210 1.900000 -1.200000 28.447728 1.900000 -1.100000 27.529245 1.900000 -1.000000 26.630763 1.900000 -0.900000 25.752281 1.900000 -0.800000 24.893798 1.900000 -0.700000 24.055316 1.900000 -0.600000 23.236833 1.900000 -0.500000 22.438351 1.900000 -0.400000 21.659868 1.900000 -0.300000 20.901386 1.900000 -0.200000 20.162904 1.900000 -0.100000 19.444421 1.900000 -0.000000 18.745939 1.900000 0.100000 18.067456 1.900000 0.200000 17.408974 1.900000 0.300000 16.770491 1.900000 0.400000 16.152009 1.900000 0.500000 15.553526 1.900000 0.600000 14.975044 1.900000 0.700000 14.416562 1.900000 0.800000 13.878079 1.900000 0.900000 13.359597 1.900000 1.000000 12.861114 1.900000 1.100000 12.382632 1.900000 1.200000 11.924149 1.900000 1.300000 11.485667 1.900000 1.400000 11.067185 1.900000 1.500000 10.668702 1.900000 1.600000 10.290220 1.900000 1.700000 9.931737 1.900000 1.800000 9.593255 1.900000 1.900000 9.274772 1.900000 2.000000 8.976290 1.900000 2.100000 8.697808 1.900000 2.200000 8.439325 1.900000 2.300000 8.200843 1.900000 2.400000 7.982360 1.900000 2.500000 7.783878 1.900000 2.600000 7.605395 1.900000 2.700000 7.446913 1.900000 2.800000 7.308431 1.900000 2.900000 7.189948 1.900000 3.000000 7.091466 1.900000 3.100000 7.012983 1.900000 3.200000 6.954501 1.900000 3.300000 6.916018 1.900000 3.400000 6.897536 1.900000 3.500000 6.899054 1.900000 3.600000 6.920571 1.900000 3.700000 6.962089 1.900000 3.800000 7.023606 1.900000 3.900000 7.105124 1.900000 4.000000 7.206641 1.900000 4.100000 7.328159 1.900000 4.200000 7.469676 1.900000 4.300000 7.631194 1.900000 4.400000 7.812712 1.900000 4.500000 8.014229 1.900000 4.600000 8.235747 1.900000 4.700000 8.477264 1.900000 4.800000 8.738782 1.900000 4.900000 9.020299 1.900000 5.000000 9.321817 1.900000 5.100000 9.643335 1.900000 5.200000 9.984852 1.900000 5.300000 10.346370 1.900000 5.400000 10.727887 1.900000 5.500000 11.129405 1.900000 5.600000 11.550922 1.900000 5.700000 11.992440 1.900000 5.800000 12.453958 1.900000 5.900000 12.935475 1.900000 6.000000 13.436993 1.900000 6.100000 13.958510 1.900000 6.200000 14.500028 1.900000 6.300000 15.061545 1.900000 6.400000 15.643063 1.900000 6.500000 16.244581 1.900000 6.600000 16.866098 1.900000 6.700000 17.507616 1.900000 6.800000 18.169133 1.900000 6.900000 18.850651 1.900000 7.000000 19.552168 1.900000 7.100000 20.273686 1.900000 7.200000 21.015204 1.900000 7.300000 21.776721 1.900000 7.400000 22.558239 1.900000 7.500000 23.359756 1.900000 7.600000 24.181274 1.900000 7.700000 25.022791 1.900000 7.800000 25.884309 1.900000 7.900000 26.765827 1.900000 8.000000 27.667344 1.900000 8.100000 28.588862 1.900000 8.200000 29.530379 1.900000 8.300000 30.491897 1.900000 8.400000 31.473414 1.900000 8.500000 32.474932 1.900000 8.600000 33.496449 1.900000 8.700000 34.537967 1.900000 8.800000 35.599485 1.900000 8.900000 36.681002 1.900000 9.000000 37.782520 1.900000 9.100000 38.904037 1.900000 9.200000 40.045555 1.900000 9.300000 41.207072 1.900000 9.400000 42.388590 1.900000 9.500000 43.590108 1.900000 9.600000 44.811625 1.900000 9.700000 46.053143 1.900000 9.800000 47.314660 1.900000 9.900000 48.596178 1.900000 10.000000 49.897695 1.900000 10.100000 51.219213 1.900000 10.200000 52.560731 1.900000 10.300000 53.922248 1.900000 10.400000 55.303766 1.900000 10.500000 56.705283 1.900000 10.600000 58.126801 1.900000 10.700000 59.568318 1.900000 10.800000 61.029836 1.900000 10.900000 62.511354 1.900000 11.000000 64.012871 1.900000 11.100000 65.534389 1.900000 11.200000 67.075906 1.900000 11.300000 68.637424 1.900000 11.400000 70.218941 1.900000 11.500000 71.820459 1.900000 11.600000 73.441977 1.900000 11.700000 75.083494 1.900000 11.800000 76.745012 1.900000 11.900000 78.426529 1.900000 12.000000 80.128047 1.900000 12.100000 81.849564 1.900000 12.200000 83.591082 1.900000 12.300000 85.352600 1.900000 12.400000 87.134117 1.900000 12.500000 88.935635 1.900000 12.600000 90.757152 1.900000 12.700000 92.598670 1.900000 12.800000 94.460187 1.900000 12.900000 96.341705 1.900000 13.000000 98.243222 1.900000 13.100000 100.164740 1.900000 13.200000 102.106258 1.900000 13.300000 104.067775 1.900000 13.400000 106.049293 1.900000 13.500000 108.050810 1.900000 13.600000 110.072328 1.900000 13.700000 112.113845 1.900000 13.800000 114.175363 1.900000 13.900000 116.256881 1.900000 14.000000 118.358398 1.900000 14.100000 120.479916 1.900000 14.200000 122.621433 1.900000 14.300000 124.782951 1.900000 14.400000 126.964468 1.900000 14.500000 129.165986 1.900000 14.600000 131.387504 1.900000 14.700000 133.629021 1.900000 14.800000 135.890539 1.900000 14.900000 138.172056 1.900000 15.000000 140.473574 2.000000 -5.000000 75.453653 2.000000 -4.900000 73.796925 2.000000 -4.800000 72.160197 2.000000 -4.700000 70.543470 2.000000 -4.600000 68.946742 2.000000 -4.500000 67.370014 2.000000 -4.400000 65.813286 2.000000 -4.300000 64.276558 2.000000 -4.200000 62.759830 2.000000 -4.100000 61.263103 2.000000 -4.000000 59.786375 2.000000 -3.900000 58.329647 2.000000 -3.800000 56.892919 2.000000 -3.700000 55.476191 2.000000 -3.600000 54.079463 2.000000 -3.500000 52.702736 2.000000 -3.400000 51.346008 2.000000 -3.300000 50.009280 2.000000 -3.200000 48.692552 2.000000 -3.100000 47.395824 2.000000 -3.000000 46.119096 2.000000 -2.900000 44.862369 2.000000 -2.800000 43.625641 2.000000 -2.700000 42.408913 2.000000 -2.600000 41.212185 2.000000 -2.500000 40.035457 2.000000 -2.400000 38.878729 2.000000 -2.300000 37.742002 2.000000 -2.200000 36.625274 2.000000 -2.100000 35.528546 2.000000 -2.000000 34.451818 2.000000 -1.900000 33.395090 2.000000 -1.800000 32.358362 2.000000 -1.700000 31.341635 2.000000 -1.600000 30.344907 2.000000 -1.500000 29.368179 2.000000 -1.400000 28.411451 2.000000 -1.300000 27.474723 2.000000 -1.200000 26.557995 2.000000 -1.100000 25.661268 2.000000 -1.000000 24.784540 2.000000 -0.900000 23.927812 2.000000 -0.800000 23.091084 2.000000 -0.700000 22.274356 2.000000 -0.600000 21.477628 2.000000 -0.500000 20.700901 2.000000 -0.400000 19.944173 2.000000 -0.300000 19.207445 2.000000 -0.200000 18.490717 2.000000 -0.100000 17.793989 2.000000 -0.000000 17.117261 2.000000 0.100000 16.460534 2.000000 0.200000 15.823806 2.000000 0.300000 15.207078 2.000000 0.400000 14.610350 2.000000 0.500000 14.033622 2.000000 0.600000 13.476894 2.000000 0.700000 12.940167 2.000000 0.800000 12.423439 2.000000 0.900000 11.926711 2.000000 1.000000 11.449983 2.000000 1.100000 10.993255 2.000000 1.200000 10.556527 2.000000 1.300000 10.139799 2.000000 1.400000 9.743072 2.000000 1.500000 9.366344 2.000000 1.600000 9.009616 2.000000 1.700000 8.672888 2.000000 1.800000 8.356160 2.000000 1.900000 8.059432 2.000000 2.000000 7.782705 2.000000 2.100000 7.525977 2.000000 2.200000 7.289249 2.000000 2.300000 7.072521 2.000000 2.400000 6.875793 2.000000 2.500000 6.699065 2.000000 2.600000 6.542338 2.000000 2.700000 6.405610 2.000000 2.800000 6.288882 2.000000 2.900000 6.192154 2.000000 3.000000 6.115426 2.000000 3.100000 6.058698 2.000000 3.200000 6.021971 2.000000 3.300000 6.005243 2.000000 3.400000 6.008515 2.000000 3.500000 6.031787 2.000000 3.600000 6.075059 2.000000 3.700000 6.138331 2.000000 3.800000 6.221604 2.000000 3.900000 6.324876 2.000000 4.000000 6.448148 2.000000 4.100000 6.591420 2.000000 4.200000 6.754692 2.000000 4.300000 6.937964 2.000000 4.400000 7.141237 2.000000 4.500000 7.364509 2.000000 4.600000 7.607781 2.000000 4.700000 7.871053 2.000000 4.800000 8.154325 2.000000 4.900000 8.457597 2.000000 5.000000 8.780870 2.000000 5.100000 9.124142 2.000000 5.200000 9.487414 2.000000 5.300000 9.870686 2.000000 5.400000 10.273958 2.000000 5.500000 10.697230 2.000000 5.600000 11.140503 2.000000 5.700000 11.603775 2.000000 5.800000 12.087047 2.000000 5.900000 12.590319 2.000000 6.000000 13.113591 2.000000 6.100000 13.656863 2.000000 6.200000 14.220136 2.000000 6.300000 14.803408 2.000000 6.400000 15.406680 2.000000 6.500000 16.029952 2.000000 6.600000 16.673224 2.000000 6.700000 17.336496 2.000000 6.800000 18.019769 2.000000 6.900000 18.723041 2.000000 7.000000 19.446313 2.000000 7.100000 20.189585 2.000000 7.200000 20.952857 2.000000 7.300000 21.736129 2.000000 7.400000 22.539402 2.000000 7.500000 23.362674 2.000000 7.600000 24.205946 2.000000 7.700000 25.069218 2.000000 7.800000 25.952490 2.000000 7.900000 26.855762 2.000000 8.000000 27.779035 2.000000 8.100000 28.722307 2.000000 8.200000 29.685579 2.000000 8.300000 30.668851 2.000000 8.400000 31.672123 2.000000 8.500000 32.695395 2.000000 8.600000 33.738668 2.000000 8.700000 34.801940 2.000000 8.800000 35.885212 2.000000 8.900000 36.988484 2.000000 9.000000 38.111756 2.000000 9.100000 39.255028 2.000000 9.200000 40.418301 2.000000 9.300000 41.601573 2.000000 9.400000 42.804845 2.000000 9.500000 44.028117 2.000000 9.600000 45.271389 2.000000 9.700000 46.534661 2.000000 9.800000 47.817934 2.000000 9.900000 49.121206 2.000000 10.000000 50.444478 2.000000 10.100000 51.787750 2.000000 10.200000 53.151022 2.000000 10.300000 54.534294 2.000000 10.400000 55.937567 2.000000 10.500000 57.360839 2.000000 10.600000 58.804111 2.000000 10.700000 60.267383 2.000000 10.800000 61.750655 2.000000 10.900000 63.253927 2.000000 11.000000 64.777200 2.000000 11.100000 66.320472 2.000000 11.200000 67.883744 2.000000 11.300000 69.467016 2.000000 11.400000 71.070288 2.000000 11.500000 72.693560 2.000000 11.600000 74.336832 2.000000 11.700000 76.000105 2.000000 11.800000 77.683377 2.000000 11.900000 79.386649 2.000000 12.000000 81.109921 2.000000 12.100000 82.853193 2.000000 12.200000 84.616465 2.000000 12.300000 86.399738 2.000000 12.400000 88.203010 2.000000 12.500000 90.026282 2.000000 12.600000 91.869554 2.000000 12.700000 93.732826 2.000000 12.800000 95.616098 2.000000 12.900000 97.519371 2.000000 13.000000 99.442643 2.000000 13.100000 101.385915 2.000000 13.200000 103.349187 2.000000 13.300000 105.332459 2.000000 13.400000 107.335731 2.000000 13.500000 109.359004 2.000000 13.600000 111.402276 2.000000 13.700000 113.465548 2.000000 13.800000 115.548820 2.000000 13.900000 117.652092 2.000000 14.000000 119.775364 2.000000 14.100000 121.918637 2.000000 14.200000 124.081909 2.000000 14.300000 126.265181 2.000000 14.400000 128.468453 2.000000 14.500000 130.691725 2.000000 14.600000 132.934997 2.000000 14.700000 135.198270 2.000000 14.800000 137.481542 2.000000 14.900000 139.784814 2.000000 15.000000 142.108086 2.100000 -5.000000 72.843342 2.100000 -4.900000 71.207852 2.100000 -4.800000 69.592362 2.100000 -4.700000 67.996872 2.100000 -4.600000 66.421382 2.100000 -4.500000 64.865892 2.100000 -4.400000 63.330403 2.100000 -4.300000 61.814913 2.100000 -4.200000 60.319423 2.100000 -4.100000 58.843933 2.100000 -4.000000 57.388443 2.100000 -3.900000 55.952953 2.100000 -3.800000 54.537463 2.100000 -3.700000 53.141973 2.100000 -3.600000 51.766483 2.100000 -3.500000 50.410993 2.100000 -3.400000 49.075503 2.100000 -3.300000 47.760013 2.100000 -3.200000 46.464523 2.100000 -3.100000 45.189033 2.100000 -3.000000 43.933543 2.100000 -2.900000 42.698053 2.100000 -2.800000 41.482563 2.100000 -2.700000 40.287073 2.100000 -2.600000 39.111583 2.100000 -2.500000 37.956093 2.100000 -2.400000 36.820603 2.100000 -2.300000 35.705113 2.100000 -2.200000 34.609623 2.100000 -2.100000 33.534133 2.100000 -2.000000 32.478643 2.100000 -1.900000 31.443153 2.100000 -1.800000 30.427663 2.100000 -1.700000 29.432173 2.100000 -1.600000 28.456683 2.100000 -1.500000 27.501193 2.100000 -1.400000 26.565703 2.100000 -1.300000 25.650213 2.100000 -1.200000 24.754723 2.100000 -1.100000 23.879233 2.100000 -1.000000 23.023743 2.100000 -0.900000 22.188253 2.100000 -0.800000 21.372763 2.100000 -0.700000 20.577273 2.100000 -0.600000 19.801783 2.100000 -0.500000 19.046293 2.100000 -0.400000 18.310803 2.100000 -0.300000 17.595313 2.100000 -0.200000 16.899824 2.100000 -0.100000 16.224334 2.100000 -0.000000 15.568844 2.100000 0.100000 14.933354 2.100000 0.200000 14.317864 2.100000 0.300000 13.722374 2.100000 0.400000 13.146884 2.100000 0.500000 12.591394 2.100000 0.600000 12.055904 2.100000 0.700000 11.540414 2.100000 0.800000 11.044924 2.100000 0.900000 10.569434 2.100000 1.000000 10.113944 2.100000 1.100000 9.678454 2.100000 1.200000 9.262964 2.100000 1.300000 8.867474 2.100000 1.400000 8.491984 2.100000 1.500000 8.136494 2.100000 1.600000 7.801004 2.100000 1.700000 7.485514 2.100000 1.800000 7.190024 2.100000 1.900000 6.914534 2.100000 2.000000 6.659044 2.100000 2.100000 6.423554 2.100000 2.200000 6.208064 2.100000 2.300000 6.012574 2.100000 2.400000 5.837084 2.100000 2.500000 5.681594 2.100000 2.600000 5.546104 2.100000 2.700000 5.430614 2.100000 2.800000 5.335124 2.100000 2.900000 5.259634 2.100000 3.000000 5.204144 2.100000 3.100000 5.168654 2.100000 3.200000 5.153164 2.100000 3.300000 5.157674 2.100000 3.400000 5.182184 2.100000 3.500000 5.226694 2.100000 3.600000 5.291204 2.100000 3.700000 5.375714 2.100000 3.800000 5.480224 2.100000 3.900000 5.604735 2.100000 4.000000 5.749245 2.100000 4.100000 5.913755 2.100000 4.200000 6.098265 2.100000 4.300000 6.302775 2.100000 4.400000 6.527285 2.100000 4.500000 6.771795 2.100000 4.600000 7.036305 2.100000 4.700000 7.320815 2.100000 4.800000 7.625325 2.100000 4.900000 7.949835 2.100000 5.000000 8.294345 2.100000 5.100000 8.658855 2.100000 5.200000 9.043365 2.100000 5.300000 9.447875 2.100000 5.400000 9.872385 2.100000 5.500000 10.316895 2.100000 5.600000 10.781405 2.100000 5.700000 11.265915 2.100000 5.800000 11.770425 2.100000 5.900000 12.294935 2.100000 6.000000 12.839445 2.100000 6.100000 13.403955 2.100000 6.200000 13.988465 2.100000 6.300000 14.592975 2.100000 6.400000 15.217485 2.100000 6.500000 15.861995 2.100000 6.600000 16.526505 2.100000 6.700000 17.211015 2.100000 6.800000 17.915525 2.100000 6.900000 18.640035 2.100000 7.000000 19.384545 2.100000 7.100000 20.149055 2.100000 7.200000 20.933565 2.100000 7.300000 21.738075 2.100000 7.400000 22.562585 2.100000 7.500000 23.407095 2.100000 7.600000 24.271605 2.100000 7.700000 25.156115 2.100000 7.800000 26.060625 2.100000 7.900000 26.985135 2.100000 8.000000 27.929645 2.100000 8.100000 28.894156 2.100000 8.200000 29.878666 2.100000 8.300000 30.883176 2.100000 8.400000 31.907686 2.100000 8.500000 32.952196 2.100000 8.600000 34.016706 2.100000 8.700000 35.101216 2.100000 8.800000 36.205726 2.100000 8.900000 37.330236 2.100000 9.000000 38.474746 2.100000 9.100000 39.639256 2.100000 9.200000 40.823766 2.100000 9.300000 42.028276 2.100000 9.400000 43.252786 2.100000 9.500000 44.497296 2.100000 9.600000 45.761806 2.100000 9.700000 47.046316 2.100000 9.800000 48.350826 2.100000 9.900000 49.675336 2.100000 10.000000 51.019846 2.100000 10.100000 52.384356 2.100000 10.200000 53.768866 2.100000 10.300000 55.173376 2.100000 10.400000 56.597886 2.100000 10.500000 58.042396 2.100000 10.600000 59.506906 2.100000 10.700000 60.991416 2.100000 10.800000 62.495926 2.100000 10.900000 64.020436 2.100000 11.000000 65.564946 2.100000 11.100000 67.129456 2.100000 11.200000 68.713966 2.100000 11.300000 70.318476 2.100000 11.400000 71.942986 2.100000 11.500000 73.587496 2.100000 11.600000 75.252006 2.100000 11.700000 76.936516 2.100000 11.800000 78.641026 2.100000 11.900000 80.365536 2.100000 12.000000 82.110046 2.100000 12.100000 83.874556 2.100000 12.200000 85.659066 2.100000 12.300000 87.463577 2.100000 12.400000 89.288087 2.100000 12.500000 91.132597 2.100000 12.600000 92.997107 2.100000 12.700000 94.881617 2.100000 12.800000 96.786127 2.100000 12.900000 98.710637 2.100000 13.000000 100.655147 2.100000 13.100000 102.619657 2.100000 13.200000 104.604167 2.100000 13.300000 106.608677 2.100000 13.400000 108.633187 2.100000 13.500000 110.677697 2.100000 13.600000 112.742207 2.100000 13.700000 114.826717 2.100000 13.800000 116.931227 2.100000 13.900000 119.055737 2.100000 14.000000 121.200247 2.100000 14.100000 123.364757 2.100000 14.200000 125.549267 2.100000 14.300000 127.753777 2.100000 14.400000 129.978287 2.100000 14.500000 132.222797 2.100000 14.600000 134.487307 2.100000 14.700000 136.771817 2.100000 14.800000 139.076327 2.100000 14.900000 141.400837 2.100000 15.000000 143.745347 2.200000 -5.000000 70.345992 2.200000 -4.900000 68.731223 2.200000 -4.800000 67.136454 2.200000 -4.700000 65.561685 2.200000 -4.600000 64.006916 2.200000 -4.500000 62.472148 2.200000 -4.400000 60.957379 2.200000 -4.300000 59.462610 2.200000 -4.200000 57.987841 2.200000 -4.100000 56.533072 2.200000 -4.000000 55.098303 2.200000 -3.900000 53.683534 2.200000 -3.800000 52.288766 2.200000 -3.700000 50.913997 2.200000 -3.600000 49.559228 2.200000 -3.500000 48.224459 2.200000 -3.400000 46.909690 2.200000 -3.300000 45.614921 2.200000 -3.200000 44.340152 2.200000 -3.100000 43.085384 2.200000 -3.000000 41.850615 2.200000 -2.900000 40.635846 2.200000 -2.800000 39.441077 2.200000 -2.700000 38.266308 2.200000 -2.600000 37.111539 2.200000 -2.500000 35.976770 2.200000 -2.400000 34.862002 2.200000 -2.300000 33.767233 2.200000 -2.200000 32.692464 2.200000 -2.100000 31.637695 2.200000 -2.000000 30.602926 2.200000 -1.900000 29.588157 2.200000 -1.800000 28.593388 2.200000 -1.700000 27.618620 2.200000 -1.600000 26.663851 2.200000 -1.500000 25.729082 2.200000 -1.400000 24.814313 2.200000 -1.300000 23.919544 2.200000 -1.200000 23.044775 2.200000 -1.100000 22.190006 2.200000 -1.000000 21.355238 2.200000 -0.900000 20.540469 2.200000 -0.800000 19.745700 2.200000 -0.700000 18.970931 2.200000 -0.600000 18.216162 2.200000 -0.500000 17.481393 2.200000 -0.400000 16.766624 2.200000 -0.300000 16.071856 2.200000 -0.200000 15.397087 2.200000 -0.100000 14.742318 2.200000 -0.000000 14.107549 2.200000 0.100000 13.492780 2.200000 0.200000 12.898011 2.200000 0.300000 12.323242 2.200000 0.400000 11.768474 2.200000 0.500000 11.233705 2.200000 0.600000 10.718936 2.200000 0.700000 10.224167 2.200000 0.800000 9.749398 2.200000 0.900000 9.294629 2.200000 1.000000 8.859860 2.200000 1.100000 8.445092 2.200000 1.200000 8.050323 2.200000 1.300000 7.675554 2.200000 1.400000 7.320785 2.200000 1.500000 6.986016 2.200000 1.600000 6.671247 2.200000 1.700000 6.376479 2.200000 1.800000 6.101710 2.200000 1.900000 5.846941 2.200000 2.000000 5.612172 2.200000 2.100000 5.397403 2.200000 2.200000 5.202634 2.200000 2.300000 5.027865 2.200000 2.400000 4.873097 2.200000 2.500000 4.738328 2.200000 2.600000 4.623559 2.200000 2.700000 4.528790 2.200000 2.800000 4.454021 2.200000 2.900000 4.399252 2.200000 3.000000 4.364483 2.200000 3.100000 4.349715 2.200000 3.200000 4.354946 2.200000 3.300000 4.380177 2.200000 3.400000 4.425408 2.200000 3.500000 4.490639 2.200000 3.600000 4.575870 2.200000 3.700000 4.681101 2.200000 3.800000 4.806333 2.200000 3.900000 4.951564 2.200000 4.000000 5.116795 2.200000 4.100000 5.302026 2.200000 4.200000 5.507257 2.200000 4.300000 5.732488 2.200000 4.400000 5.977719 2.200000 4.500000 6.242951 2.200000 4.600000 6.528182 2.200000 4.700000 6.833413 2.200000 4.800000 7.158644 2.200000 4.900000 7.503875 2.200000 5.000000 7.869106 2.200000 5.100000 8.254337 2.200000 5.200000 8.659569 2.200000 5.300000 9.084800 2.200000 5.400000 9.530031 2.200000 5.500000 9.995262 2.200000 5.600000 10.480493 2.200000 5.700000 10.985724 2.200000 5.800000 11.510955 2.200000 5.900000 12.056187 2.200000 6.000000 12.621418 2.200000 6.100000 13.206649 2.200000 6.200000 13.811880 2.200000 6.300000 14.437111 2.200000 6.400000 15.082342 2.200000 6.500000 15.747573 2.200000 6.600000 16.432805 2.200000 6.700000 17.138036 2.200000 6.800000 17.863267 2.200000 6.900000 18.608498 2.200000 7.000000 19.373729 2.200000 7.100000 20.158960 2.200000 7.200000 20.964191 2.200000 7.300000 21.789423 2.200000 7.400000 22.634654 2.200000 7.500000 23.499885 2.200000 7.600000 24.385116 2.200000 7.700000 25.290347 2.200000 7.800000 26.215578 2.200000 7.900000 27.160809 2.200000 8.000000 28.126041 2.200000 8.100000 29.111272 2.200000 8.200000 30.116503 2.200000 8.300000 31.141734 2.200000 8.400000 32.186965 2.200000 8.500000 33.252196 2.200000 8.600000 34.337427 2.200000 8.700000 35.442659 2.200000 8.800000 36.567890 2.200000 8.900000 37.713121 2.200000 9.000000 38.878352 2.200000 9.100000 40.063583 2.200000 9.200000 41.268814 2.200000 9.300000 42.494046 2.200000 9.400000 43.739277 2.200000 9.500000 45.004508 2.200000 9.600000 46.289739 2.200000 9.700000 47.594970 2.200000 9.800000 48.920201 2.200000 9.900000 50.265432 2.200000 10.000000 51.630664 2.200000 10.100000 53.015895 2.200000 10.200000 54.421126 2.200000 10.300000 55.846357 2.200000 10.400000 57.291588 2.200000 10.500000 58.756819 2.200000 10.600000 60.242050 2.200000 10.700000 61.747282 2.200000 10.800000 63.272513 2.200000 10.900000 64.817744 2.200000 11.000000 66.382975 2.200000 11.100000 67.968206 2.200000 11.200000 69.573437 2.200000 11.300000 71.198668 2.200000 11.400000 72.843900 2.200000 11.500000 74.509131 2.200000 11.600000 76.194362 2.200000 11.700000 77.899593 2.200000 11.800000 79.624824 2.200000 11.900000 81.370055 2.200000 12.000000 83.135286 2.200000 12.100000 84.920518 2.200000 12.200000 86.725749 2.200000 12.300000 88.550980 2.200000 12.400000 90.396211 2.200000 12.500000 92.261442 2.200000 12.600000 94.146673 2.200000 12.700000 96.051904 2.200000 12.800000 97.977136 2.200000 12.900000 99.922367 2.200000 13.000000 101.887598 2.200000 13.100000 103.872829 2.200000 13.200000 105.878060 2.200000 13.300000 107.903291 2.200000 13.400000 109.948522 2.200000 13.500000 112.013754 2.200000 13.600000 114.098985 2.200000 13.700000 116.204216 2.200000 13.800000 118.329447 2.200000 13.900000 120.474678 2.200000 14.000000 122.639909 2.200000 14.100000 124.825140 2.200000 14.200000 127.030372 2.200000 14.300000 129.255603 2.200000 14.400000 131.500834 2.200000 14.500000 133.766065 2.200000 14.600000 136.051296 2.200000 14.700000 138.356527 2.200000 14.800000 140.681758 2.200000 14.900000 143.026990 2.200000 15.000000 145.392221 2.300000 -5.000000 67.968021 2.300000 -4.900000 66.373457 2.300000 -4.800000 64.798892 2.300000 -4.700000 63.244328 2.300000 -4.600000 61.709763 2.300000 -4.500000 60.195199 2.300000 -4.400000 58.700634 2.300000 -4.300000 57.226070 2.300000 -4.200000 55.771505 2.300000 -4.100000 54.336941 2.300000 -4.000000 52.922377 2.300000 -3.900000 51.527812 2.300000 -3.800000 50.153248 2.300000 -3.700000 48.798683 2.300000 -3.600000 47.464119 2.300000 -3.500000 46.149554 2.300000 -3.400000 44.854990 2.300000 -3.300000 43.580425 2.300000 -3.200000 42.325861 2.300000 -3.100000 41.091296 2.300000 -3.000000 39.876732 2.300000 -2.900000 38.682167 2.300000 -2.800000 37.507603 2.300000 -2.700000 36.353038 2.300000 -2.600000 35.218474 2.300000 -2.500000 34.103909 2.300000 -2.400000 33.009345 2.300000 -2.300000 31.934780 2.300000 -2.200000 30.880216 2.300000 -2.100000 29.845652 2.300000 -2.000000 28.831087 2.300000 -1.900000 27.836523 2.300000 -1.800000 26.861958 2.300000 -1.700000 25.907394 2.300000 -1.600000 24.972829 2.300000 -1.500000 24.058265 2.300000 -1.400000 23.163700 2.300000 -1.300000 22.289136 2.300000 -1.200000 21.434571 2.300000 -1.100000 20.600007 2.300000 -1.000000 19.785442 2.300000 -0.900000 18.990878 2.300000 -0.800000 18.216313 2.300000 -0.700000 17.461749 2.300000 -0.600000 16.727184 2.300000 -0.500000 16.012620 2.300000 -0.400000 15.318056 2.300000 -0.300000 14.643491 2.300000 -0.200000 13.988927 2.300000 -0.100000 13.354362 2.300000 -0.000000 12.739798 2.300000 0.100000 12.145233 2.300000 0.200000 11.570669 2.300000 0.300000 11.016104 2.300000 0.400000 10.481540 2.300000 0.500000 9.966975 2.300000 0.600000 9.472411 2.300000 0.700000 8.997846 2.300000 0.800000 8.543282 2.300000 0.900000 8.108717 2.300000 1.000000 7.694153 2.300000 1.100000 7.299588 2.300000 1.200000 6.925024 2.300000 1.300000 6.570459 2.300000 1.400000 6.235895 2.300000 1.500000 5.921331 2.300000 1.600000 5.626766 2.300000 1.700000 5.352202 2.300000 1.800000 5.097637 2.300000 1.900000 4.863073 2.300000 2.000000 4.648508 2.300000 2.100000 4.453944 2.300000 2.200000 4.279379 2.300000 2.300000 4.124815 2.300000 2.400000 3.990250 2.300000 2.500000 3.875686 2.300000 2.600000 3.781121 2.300000 2.700000 3.706557 2.300000 2.800000 3.651992 2.300000 2.900000 3.617428 2.300000 3.000000 3.602863 2.300000 3.100000 3.608299 2.300000 3.200000 3.633735 2.300000 3.300000 3.679170 2.300000 3.400000 3.744606 2.300000 3.500000 3.830041 2.300000 3.600000 3.935477 2.300000 3.700000 4.060912 2.300000 3.800000 4.206348 2.300000 3.900000 4.371783 2.300000 4.000000 4.557219 2.300000 4.100000 4.762654 2.300000 4.200000 4.988090 2.300000 4.300000 5.233525 2.300000 4.400000 5.498961 2.300000 4.500000 5.784396 2.300000 4.600000 6.089832 2.300000 4.700000 6.415267 2.300000 4.800000 6.760703 2.300000 4.900000 7.126138 2.300000 5.000000 7.511574 2.300000 5.100000 7.917010 2.300000 5.200000 8.342445 2.300000 5.300000 8.787881 2.300000 5.400000 9.253316 2.300000 5.500000 9.738752 2.300000 5.600000 10.244187 2.300000 5.700000 10.769623 2.300000 5.800000 11.315058 2.300000 5.900000 11.880494 2.300000 6.000000 12.465929 2.300000 6.100000 13.071365 2.300000 6.200000 13.696800 2.300000 6.300000 14.342236 2.300000 6.400000 15.007671 2.300000 6.500000 15.693107 2.300000 6.600000 16.398542 2.300000 6.700000 17.123978 2.300000 6.800000 17.869413 2.300000 6.900000 18.634849 2.300000 7.000000 19.420285 2.300000 7.100000 20.225720 2.300000 7.200000 21.051156 2.300000 7.300000 21.896591 2.300000 7.400000 22.762027 2.300000 7.500000 23.647462 2.300000 7.600000 24.552898 2.300000 7.700000 25.478333 2.300000 7.800000 26.423769 2.300000 7.900000 27.389204 2.300000 8.000000 28.374640 2.300000 8.100000 29.380075 2.300000 8.200000 30.405511 2.300000 8.300000 31.450946 2.300000 8.400000 32.516382 2.300000 8.500000 33.601817 2.300000 8.600000 34.707253 2.300000 8.700000 35.832689 2.300000 8.800000 36.978124 2.300000 8.900000 38.143560 2.300000 9.000000 39.328995 2.300000 9.100000 40.534431 2.300000 9.200000 41.759866 2.300000 9.300000 43.005302 2.300000 9.400000 44.270737 2.300000 9.500000 45.556173 2.300000 9.600000 46.861608 2.300000 9.700000 48.187044 2.300000 9.800000 49.532479 2.300000 9.900000 50.897915 2.300000 10.000000 52.283350 2.300000 10.100000 53.688786 2.300000 10.200000 55.114221 2.300000 10.300000 56.559657 2.300000 10.400000 58.025092 2.300000 10.500000 59.510528 2.300000 10.600000 61.015964 2.300000 10.700000 62.541399 2.300000 10.800000 64.086835 2.300000 10.900000 65.652270 2.300000 11.000000 67.237706 2.300000 11.100000 68.843141 2.300000 11.200000 70.468577 2.300000 11.300000 72.114012 2.300000 11.400000 73.779448 2.300000 11.500000 75.464883 2.300000 11.600000 77.170319 2.300000 11.700000 78.895754 2.300000 11.800000 80.641190 2.300000 11.900000 82.406625 2.300000 12.000000 84.192061 2.300000 12.100000 85.997496 2.300000 12.200000 87.822932 2.300000 12.300000 89.668368 2.300000 12.400000 91.533803 2.300000 12.500000 93.419239 2.300000 12.600000 95.324674 2.300000 12.700000 97.250110 2.300000 12.800000 99.195545 2.300000 12.900000 101.160981 2.300000 13.000000 103.146416 2.300000 13.100000 105.151852 2.300000 13.200000 107.177287 2.300000 13.300000 109.222723 2.300000 13.400000 111.288158 2.300000 13.500000 113.373594 2.300000 13.600000 115.479029 2.300000 13.700000 117.604465 2.300000 13.800000 119.749900 2.300000 13.900000 121.915336 2.300000 14.000000 124.100771 2.300000 14.100000 126.306207 2.300000 14.200000 128.531643 2.300000 14.300000 130.777078 2.300000 14.400000 133.042514 2.300000 14.500000 135.327949 2.300000 14.600000 137.633385 2.300000 14.700000 139.958820 2.300000 14.800000 142.304256 2.300000 14.900000 144.669691 2.300000 15.000000 147.055127 2.400000 -5.000000 65.715326 2.400000 -4.900000 64.140450 2.400000 -4.800000 62.585573 2.400000 -4.700000 61.050696 2.400000 -4.600000 59.535819 2.400000 -4.500000 58.040942 2.400000 -4.400000 56.566065 2.400000 -4.300000 55.111189 2.400000 -4.200000 53.676312 2.400000 -4.100000 52.261435 2.400000 -4.000000 50.866558 2.400000 -3.900000 49.491681 2.400000 -3.800000 48.136805 2.400000 -3.700000 46.801928 2.400000 -3.600000 45.487051 2.400000 -3.500000 44.192174 2.400000 -3.400000 42.917297 2.400000 -3.300000 41.662420 2.400000 -3.200000 40.427544 2.400000 -3.100000 39.212667 2.400000 -3.000000 38.017790 2.400000 -2.900000 36.842913 2.400000 -2.800000 35.688036 2.400000 -2.700000 34.553159 2.400000 -2.600000 33.438283 2.400000 -2.500000 32.343406 2.400000 -2.400000 31.268529 2.400000 -2.300000 30.213652 2.400000 -2.200000 29.178775 2.400000 -2.100000 28.163898 2.400000 -2.000000 27.169022 2.400000 -1.900000 26.194145 2.400000 -1.800000 25.239268 2.400000 -1.700000 24.304391 2.400000 -1.600000 23.389514 2.400000 -1.500000 22.494637 2.400000 -1.400000 21.619761 2.400000 -1.300000 20.764884 2.400000 -1.200000 19.930007 2.400000 -1.100000 19.115130 2.400000 -1.000000 18.320253 2.400000 -0.900000 17.545377 2.400000 -0.800000 16.790500 2.400000 -0.700000 16.055623 2.400000 -0.600000 15.340746 2.400000 -0.500000 14.645869 2.400000 -0.400000 13.970992 2.400000 -0.300000 13.316116 2.400000 -0.200000 12.681239 2.400000 -0.100000 12.066362 2.400000 -0.000000 11.471485 2.400000 0.100000 10.896608 2.400000 0.200000 10.341731 2.400000 0.300000 9.806855 2.400000 0.400000 9.291978 2.400000 0.500000 8.797101 2.400000 0.600000 8.322224 2.400000 0.700000 7.867347 2.400000 0.800000 7.432470 2.400000 0.900000 7.017594 2.400000 1.000000 6.622717 2.400000 1.100000 6.247840 2.400000 1.200000 5.892963 2.400000 1.300000 5.558086 2.400000 1.400000 5.243209 2.400000 1.500000 4.948333 2.400000 1.600000 4.673456 2.400000 1.700000 4.418579 2.400000 1.800000 4.183702 2.400000 1.900000 3.968825 2.400000 2.000000 3.773949 2.400000 2.100000 3.599072 2.400000 2.200000 3.444195 2.400000 2.300000 3.309318 2.400000 2.400000 3.194441 2.400000 2.500000 3.099564 2.400000 2.600000 3.024688 2.400000 2.700000 2.969811 2.400000 2.800000 2.934934 2.400000 2.900000 2.920057 2.400000 3.000000 2.925180 2.400000 3.100000 2.950303 2.400000 3.200000 2.995427 2.400000 3.300000 3.060550 2.400000 3.400000 3.145673 2.400000 3.500000 3.250796 2.400000 3.600000 3.375919 2.400000 3.700000 3.521042 2.400000 3.800000 3.686166 2.400000 3.900000 3.871289 2.400000 4.000000 4.076412 2.400000 4.100000 4.301535 2.400000 4.200000 4.546658 2.400000 4.300000 4.811781 2.400000 4.400000 5.096905 2.400000 4.500000 5.402028 2.400000 4.600000 5.727151 2.400000 4.700000 6.072274 2.400000 4.800000 6.437397 2.400000 4.900000 6.822521 2.400000 5.000000 7.227644 2.400000 5.100000 7.652767 2.400000 5.200000 8.097890 2.400000 5.300000 8.563013 2.400000 5.400000 9.048136 2.400000 5.500000 9.553260 2.400000 5.600000 10.078383 2.400000 5.700000 10.623506 2.400000 5.800000 11.188629 2.400000 5.900000 11.773752 2.400000 6.000000 12.378875 2.400000 6.100000 13.003999 2.400000 6.200000 13.649122 2.400000 6.300000 14.314245 2.400000 6.400000 14.999368 2.400000 6.500000 15.704491 2.400000 6.600000 16.429614 2.400000 6.700000 17.174738 2.400000 6.800000 17.939861 2.400000 6.900000 18.724984 2.400000 7.000000 19.530107 2.400000 7.100000 20.355230 2.400000 7.200000 21.200353 2.400000 7.300000 22.065477 2.400000 7.400000 22.950600 2.400000 7.500000 23.855723 2.400000 7.600000 24.780846 2.400000 7.700000 25.725969 2.400000 7.800000 26.691093 2.400000 7.900000 27.676216 2.400000 8.000000 28.681339 2.400000 8.100000 29.706462 2.400000 8.200000 30.751585 2.400000 8.300000 31.816708 2.400000 8.400000 32.901832 2.400000 8.500000 34.006955 2.400000 8.600000 35.132078 2.400000 8.700000 36.277201 2.400000 8.800000 37.442324 2.400000 8.900000 38.627447 2.400000 9.000000 39.832571 2.400000 9.100000 41.057694 2.400000 9.200000 42.302817 2.400000 9.300000 43.567940 2.400000 9.400000 44.853063 2.400000 9.500000 46.158186 2.400000 9.600000 47.483310 2.400000 9.700000 48.828433 2.400000 9.800000 50.193556 2.400000 9.900000 51.578679 2.400000 10.000000 52.983802 2.400000 10.100000 54.408925 2.400000 10.200000 55.854049 2.400000 10.300000 57.319172 2.400000 10.400000 58.804295 2.400000 10.500000 60.309418 2.400000 10.600000 61.834541 2.400000 10.700000 63.379665 2.400000 10.800000 64.944788 2.400000 10.900000 66.529911 2.400000 11.000000 68.135034 2.400000 11.100000 69.760157 2.400000 11.200000 71.405280 2.400000 11.300000 73.070404 2.400000 11.400000 74.755527 2.400000 11.500000 76.460650 2.400000 11.600000 78.185773 2.400000 11.700000 79.930896 2.400000 11.800000 81.696019 2.400000 11.900000 83.481143 2.400000 12.000000 85.286266 2.400000 12.100000 87.111389 2.400000 12.200000 88.956512 2.400000 12.300000 90.821635 2.400000 12.400000 92.706758 2.400000 12.500000 94.611882 2.400000 12.600000 96.537005 2.400000 12.700000 98.482128 2.400000 12.800000 100.447251 2.400000 12.900000 102.432374 2.400000 13.000000 104.437497 2.400000 13.100000 106.462621 2.400000 13.200000 108.507744 2.400000 13.300000 110.572867 2.400000 13.400000 112.657990 2.400000 13.500000 114.763113 2.400000 13.600000 116.888237 2.400000 13.700000 119.033360 2.400000 13.800000 121.198483 2.400000 13.900000 123.383606 2.400000 14.000000 125.588729 2.400000 14.100000 127.813852 2.400000 14.200000 130.058976 2.400000 14.300000 132.324099 2.400000 14.400000 134.609222 2.400000 14.500000 136.914345 2.400000 14.600000 139.239468 2.400000 14.700000 141.584591 2.400000 14.800000 143.949715 2.400000 14.900000 146.334838 2.400000 15.000000 148.739961 2.500000 -5.000000 63.593205 2.500000 -4.900000 62.037499 2.500000 -4.800000 60.501793 2.500000 -4.700000 58.986087 2.500000 -4.600000 57.490381 2.500000 -4.500000 56.014675 2.500000 -4.400000 54.558969 2.500000 -4.300000 53.123263 2.500000 -4.200000 51.707557 2.500000 -4.100000 50.311851 2.500000 -4.000000 48.936145 2.500000 -3.900000 47.580439 2.500000 -3.800000 46.244733 2.500000 -3.700000 44.929028 2.500000 -3.600000 43.633322 2.500000 -3.500000 42.357616 2.500000 -3.400000 41.101910 2.500000 -3.300000 39.866204 2.500000 -3.200000 38.650498 2.500000 -3.100000 37.454792 2.500000 -3.000000 36.279086 2.500000 -2.900000 35.123380 2.500000 -2.800000 33.987674 2.500000 -2.700000 32.871968 2.500000 -2.600000 31.776262 2.500000 -2.500000 30.700557 2.500000 -2.400000 29.644851 2.500000 -2.300000 28.609145 2.500000 -2.200000 27.593439 2.500000 -2.100000 26.597733 2.500000 -2.000000 25.622027 2.500000 -1.900000 24.666321 2.500000 -1.800000 23.730615 2.500000 -1.700000 22.814909 2.500000 -1.600000 21.919203 2.500000 -1.500000 21.043497 2.500000 -1.400000 20.187791 2.500000 -1.300000 19.352085 2.500000 -1.200000 18.536380 2.500000 -1.100000 17.740674 2.500000 -1.000000 16.964968 2.500000 -0.900000 16.209262 2.500000 -0.800000 15.473556 2.500000 -0.700000 14.757850 2.500000 -0.600000 14.062144 2.500000 -0.500000 13.386438 2.500000 -0.400000 12.730732 2.500000 -0.300000 12.095026 2.500000 -0.200000 11.479320 2.500000 -0.100000 10.883614 2.500000 -0.000000 10.307908 2.500000 0.100000 9.752203 2.500000 0.200000 9.216497 2.500000 0.300000 8.700791 2.500000 0.400000 8.205085 2.500000 0.500000 7.729379 2.500000 0.600000 7.273673 2.500000 0.700000 6.837967 2.500000 0.800000 6.422261 2.500000 0.900000 6.026555 2.500000 1.000000 5.650849 2.500000 1.100000 5.295143 2.500000 1.200000 4.959437 2.500000 1.300000 4.643732 2.500000 1.400000 4.348026 2.500000 1.500000 4.072320 2.500000 1.600000 3.816614 2.500000 1.700000 3.580908 2.500000 1.800000 3.365202 2.500000 1.900000 3.169496 2.500000 2.000000 2.993790 2.500000 2.100000 2.838084 2.500000 2.200000 2.702378 2.500000 2.300000 2.586672 2.500000 2.400000 2.490966 2.500000 2.500000 2.415260 2.500000 2.600000 2.359555 2.500000 2.700000 2.323849 2.500000 2.800000 2.308143 2.500000 2.900000 2.312437 2.500000 3.000000 2.336731 2.500000 3.100000 2.381025 2.500000 3.200000 2.445319 2.500000 3.300000 2.529613 2.500000 3.400000 2.633907 2.500000 3.500000 2.758201 2.500000 3.600000 2.902495 2.500000 3.700000 3.066789 2.500000 3.800000 3.251083 2.500000 3.900000 3.455378 2.500000 4.000000 3.679672 2.500000 4.100000 3.923966 2.500000 4.200000 4.188260 2.500000 4.300000 4.472554 2.500000 4.400000 4.776848 2.500000 4.500000 5.101142 2.500000 4.600000 5.445436 2.500000 4.700000 5.809730 2.500000 4.800000 6.194024 2.500000 4.900000 6.598318 2.500000 5.000000 7.022612 2.500000 5.100000 7.466907 2.500000 5.200000 7.931201 2.500000 5.300000 8.415495 2.500000 5.400000 8.919789 2.500000 5.500000 9.444083 2.500000 5.600000 9.988377 2.500000 5.700000 10.552671 2.500000 5.800000 11.136965 2.500000 5.900000 11.741259 2.500000 6.000000 12.365553 2.500000 6.100000 13.009847 2.500000 6.200000 13.674141 2.500000 6.300000 14.358435 2.500000 6.400000 15.062730 2.500000 6.500000 15.787024 2.500000 6.600000 16.531318 2.500000 6.700000 17.295612 2.500000 6.800000 18.079906 2.500000 6.900000 18.884200 2.500000 7.000000 19.708494 2.500000 7.100000 20.552788 2.500000 7.200000 21.417082 2.500000 7.300000 22.301376 2.500000 7.400000 23.205670 2.500000 7.500000 24.129964 2.500000 7.600000 25.074258 2.500000 7.700000 26.038553 2.500000 7.800000 27.022847 2.500000 7.900000 28.027141 2.500000 8.000000 29.051435 2.500000 8.100000 30.095729 2.500000 8.200000 31.160023 2.500000 8.300000 32.244317 2.500000 8.400000 33.348611 2.500000 8.500000 34.472905 2.500000 8.600000 35.617199 2.500000 8.700000 36.781493 2.500000 8.800000 37.965787 2.500000 8.900000 39.170082 2.500000 9.000000 40.394376 2.500000 9.100000 41.638670 2.500000 9.200000 42.902964 2.500000 9.300000 44.187258 2.500000 9.400000 45.491552 2.500000 9.500000 46.815846 2.500000 9.600000 48.160140 2.500000 9.700000 49.524434 2.500000 9.800000 50.908728 2.500000 9.900000 52.313022 2.500000 10.000000 53.737316 2.500000 10.100000 55.181610 2.500000 10.200000 56.645905 2.500000 10.300000 58.130199 2.500000 10.400000 59.634493 2.500000 10.500000 61.158787 2.500000 10.600000 62.703081 2.500000 10.700000 64.267375 2.500000 10.800000 65.851669 2.500000 10.900000 67.455963 2.500000 11.000000 69.080257 2.500000 11.100000 70.724551 2.500000 11.200000 72.388845 2.500000 11.300000 74.073139 2.500000 11.400000 75.777433 2.500000 11.500000 77.501728 2.500000 11.600000 79.246022 2.500000 11.700000 81.010316 2.500000 11.800000 82.794610 2.500000 11.900000 84.598904 2.500000 12.000000 86.423198 2.500000 12.100000 88.267492 2.500000 12.200000 90.131786 2.500000 12.300000 92.016080 2.500000 12.400000 93.920374 2.500000 12.500000 95.844668 2.500000 12.600000 97.788962 2.500000 12.700000 99.753257 2.500000 12.800000 101.737551 2.500000 12.900000 103.741845 2.500000 13.000000 105.766139 2.500000 13.100000 107.810433 2.500000 13.200000 109.874727 2.500000 13.300000 111.959021 2.500000 13.400000 114.063315 2.500000 13.500000 116.187609 2.500000 13.600000 118.331903 2.500000 13.700000 120.496197 2.500000 13.800000 122.680491 2.500000 13.900000 124.884785 2.500000 14.000000 127.109080 2.500000 14.100000 129.353374 2.500000 14.200000 131.617668 2.500000 14.300000 133.901962 2.500000 14.400000 136.206256 2.500000 14.500000 138.530550 2.500000 14.600000 140.874844 2.500000 14.700000 143.239138 2.500000 14.800000 145.623432 2.500000 14.900000 148.027726 2.500000 15.000000 150.452020 2.600000 -5.000000 61.606286 2.600000 -4.900000 60.069234 2.600000 -4.800000 58.552182 2.600000 -4.700000 57.055131 2.600000 -4.600000 55.578079 2.600000 -4.500000 54.121027 2.600000 -4.400000 52.683975 2.600000 -4.300000 51.266924 2.600000 -4.200000 49.869872 2.600000 -4.100000 48.492820 2.600000 -4.000000 47.135768 2.600000 -3.900000 45.798716 2.600000 -3.800000 44.481665 2.600000 -3.700000 43.184613 2.600000 -3.600000 41.907561 2.600000 -3.500000 40.650509 2.600000 -3.400000 39.413458 2.600000 -3.300000 38.196406 2.600000 -3.200000 36.999354 2.600000 -3.100000 35.822302 2.600000 -3.000000 34.665251 2.600000 -2.900000 33.528199 2.600000 -2.800000 32.411147 2.600000 -2.700000 31.314095 2.600000 -2.600000 30.237044 2.600000 -2.500000 29.179992 2.600000 -2.400000 28.142940 2.600000 -2.300000 27.125888 2.600000 -2.200000 26.128837 2.600000 -2.100000 25.151785 2.600000 -2.000000 24.194733 2.600000 -1.900000 23.257681 2.600000 -1.800000 22.340630 2.600000 -1.700000 21.443578 2.600000 -1.600000 20.566526 2.600000 -1.500000 19.709474 2.600000 -1.400000 18.872423 2.600000 -1.300000 18.055371 2.600000 -1.200000 17.258319 2.600000 -1.100000 16.481267 2.600000 -1.000000 15.724216 2.600000 -0.900000 14.987164 2.600000 -0.800000 14.270112 2.600000 -0.700000 13.573060 2.600000 -0.600000 12.896009 2.600000 -0.500000 12.238957 2.600000 -0.400000 11.601905 2.600000 -0.300000 10.984853 2.600000 -0.200000 10.387802 2.600000 -0.100000 9.810750 2.600000 -0.000000 9.253698 2.600000 0.100000 8.716646 2.600000 0.200000 8.199595 2.600000 0.300000 7.702543 2.600000 0.400000 7.225491 2.600000 0.500000 6.768439 2.600000 0.600000 6.331388 2.600000 0.700000 5.914336 2.600000 0.800000 5.517284 2.600000 0.900000 5.140232 2.600000 1.000000 4.783181 2.600000 1.100000 4.446129 2.600000 1.200000 4.129077 2.600000 1.300000 3.832025 2.600000 1.400000 3.554974 2.600000 1.500000 3.297922 2.600000 1.600000 3.060870 2.600000 1.700000 2.843818 2.600000 1.800000 2.646767 2.600000 1.900000 2.469715 2.600000 2.000000 2.312663 2.600000 2.100000 2.175611 2.600000 2.200000 2.058560 2.600000 2.300000 1.961508 2.600000 2.400000 1.884456 2.600000 2.500000 1.827404 2.600000 2.600000 1.790353 2.600000 2.700000 1.773301 2.600000 2.800000 1.776249 2.600000 2.900000 1.799197 2.600000 3.000000 1.842146 2.600000 3.100000 1.905094 2.600000 3.200000 1.988042 2.600000 3.300000 2.090990 2.600000 3.400000 2.213939 2.600000 3.500000 2.356887 2.600000 3.600000 2.519835 2.600000 3.700000 2.702783 2.600000 3.800000 2.905732 2.600000 3.900000 3.128680 2.600000 4.000000 3.371628 2.600000 4.100000 3.634576 2.600000 4.200000 3.917525 2.600000 4.300000 4.220473 2.600000 4.400000 4.543421 2.600000 4.500000 4.886369 2.600000 4.600000 5.249318 2.600000 4.700000 5.632266 2.600000 4.800000 6.035214 2.600000 4.900000 6.458162 2.600000 5.000000 6.901111 2.600000 5.100000 7.364059 2.600000 5.200000 7.847007 2.600000 5.300000 8.349955 2.600000 5.400000 8.872904 2.600000 5.500000 9.415852 2.600000 5.600000 9.978800 2.600000 5.700000 10.561748 2.600000 5.800000 11.164697 2.600000 5.900000 11.787645 2.600000 6.000000 12.430593 2.600000 6.100000 13.093541 2.600000 6.200000 13.776490 2.600000 6.300000 14.479438 2.600000 6.400000 15.202386 2.600000 6.500000 15.945334 2.600000 6.600000 16.708283 2.600000 6.700000 17.491231 2.600000 6.800000 18.294179 2.600000 6.900000 19.117127 2.600000 7.000000 19.960076 2.600000 7.100000 20.823024 2.600000 7.200000 21.705972 2.600000 7.300000 22.608920 2.600000 7.400000 23.531868 2.600000 7.500000 24.474817 2.600000 7.600000 25.437765 2.600000 7.700000 26.420713 2.600000 7.800000 27.423661 2.600000 7.900000 28.446610 2.600000 8.000000 29.489558 2.600000 8.100000 30.552506 2.600000 8.200000 31.635454 2.600000 8.300000 32.738403 2.600000 8.400000 33.861351 2.600000 8.500000 35.004299 2.600000 8.600000 36.167247 2.600000 8.700000 37.350196 2.600000 8.800000 38.553144 2.600000 8.900000 39.776092 2.600000 9.000000 41.019040 2.600000 9.100000 42.281989 2.600000 9.200000 43.564937 2.600000 9.300000 44.867885 2.600000 9.400000 46.190833 2.600000 9.500000 47.533782 2.600000 9.600000 48.896730 2.600000 9.700000 50.279678 2.600000 9.800000 51.682626 2.600000 9.900000 53.105575 2.600000 10.000000 54.548523 2.600000 10.100000 56.011471 2.600000 10.200000 57.494419 2.600000 10.300000 58.997368 2.600000 10.400000 60.520316 2.600000 10.500000 62.063264 2.600000 10.600000 63.626212 2.600000 10.700000 65.209161 2.600000 10.800000 66.812109 2.600000 10.900000 68.435057 2.600000 11.000000 70.078005 2.600000 11.100000 71.740954 2.600000 11.200000 73.423902 2.600000 11.300000 75.126850 2.600000 11.400000 76.849798 2.600000 11.500000 78.592747 2.600000 11.600000 80.355695 2.600000 11.700000 82.138643 2.600000 11.800000 83.941591 2.600000 11.900000 85.764540 2.600000 12.000000 87.607488 2.600000 12.100000 89.470436 2.600000 12.200000 91.353384 2.600000 12.300000 93.256333 2.600000 12.400000 95.179281 2.600000 12.500000 97.122229 2.600000 12.600000 99.085177 2.600000 12.700000 101.068126 2.600000 12.800000 103.071074 2.600000 12.900000 105.094022 2.600000 13.000000 107.136970 2.600000 13.100000 109.199919 2.600000 13.200000 111.282867 2.600000 13.300000 113.385815 2.600000 13.400000 115.508763 2.600000 13.500000 117.651712 2.600000 13.600000 119.814660 2.600000 13.700000 121.997608 2.600000 13.800000 124.200556 2.600000 13.900000 126.423505 2.600000 14.000000 128.666453 2.600000 14.100000 130.929401 2.600000 14.200000 133.212349 2.600000 14.300000 135.515298 2.600000 14.400000 137.838246 2.600000 14.500000 140.181194 2.600000 14.600000 142.544142 2.600000 14.700000 144.927091 2.600000 14.800000 147.330039 2.600000 14.900000 149.752987 2.600000 15.000000 152.195935 2.700000 -5.000000 59.758473 2.700000 -4.900000 58.239558 2.700000 -4.800000 56.740644 2.700000 -4.700000 55.261730 2.700000 -4.600000 53.802815 2.700000 -4.500000 52.363901 2.700000 -4.400000 50.944987 2.700000 -4.300000 49.546072 2.700000 -4.200000 48.167158 2.700000 -4.100000 46.808244 2.700000 -4.000000 45.469329 2.700000 -3.900000 44.150415 2.700000 -3.800000 42.851501 2.700000 -3.700000 41.572586 2.700000 -3.600000 40.313672 2.700000 -3.500000 39.074758 2.700000 -3.400000 37.855843 2.700000 -3.300000 36.656929 2.700000 -3.200000 35.478015 2.700000 -3.100000 34.319100 2.700000 -3.000000 33.180186 2.700000 -2.900000 32.061272 2.700000 -2.800000 30.962357 2.700000 -2.700000 29.883443 2.700000 -2.600000 28.824529 2.700000 -2.500000 27.785614 2.700000 -2.400000 26.766700 2.700000 -2.300000 25.767786 2.700000 -2.200000 24.788872 2.700000 -2.100000 23.829957 2.700000 -2.000000 22.891043 2.700000 -1.900000 21.972129 2.700000 -1.800000 21.073214 2.700000 -1.700000 20.194300 2.700000 -1.600000 19.335386 2.700000 -1.500000 18.496471 2.700000 -1.400000 17.677557 2.700000 -1.300000 16.878643 2.700000 -1.200000 16.099728 2.700000 -1.100000 15.340814 2.700000 -1.000000 14.601900 2.700000 -0.900000 13.882985 2.700000 -0.800000 13.184071 2.700000 -0.700000 12.505157 2.700000 -0.600000 11.846242 2.700000 -0.500000 11.207328 2.700000 -0.400000 10.588414 2.700000 -0.300000 9.989499 2.700000 -0.200000 9.410585 2.700000 -0.100000 8.851671 2.700000 -0.000000 8.312756 2.700000 0.100000 7.793842 2.700000 0.200000 7.294928 2.700000 0.300000 6.816013 2.700000 0.400000 6.357099 2.700000 0.500000 5.918185 2.700000 0.600000 5.499271 2.700000 0.700000 5.100356 2.700000 0.800000 4.721442 2.700000 0.900000 4.362528 2.700000 1.000000 4.023613 2.700000 1.100000 3.704699 2.700000 1.200000 3.405785 2.700000 1.300000 3.126870 2.700000 1.400000 2.867956 2.700000 1.500000 2.629042 2.700000 1.600000 2.410127 2.700000 1.700000 2.211213 2.700000 1.800000 2.032299 2.700000 1.900000 1.873384 2.700000 2.000000 1.734470 2.700000 2.100000 1.615556 2.700000 2.200000 1.516641 2.700000 2.300000 1.437727 2.700000 2.400000 1.378813 2.700000 2.500000 1.339898 2.700000 2.600000 1.320984 2.700000 2.700000 1.322070 2.700000 2.800000 1.343155 2.700000 2.900000 1.384241 2.700000 3.000000 1.445327 2.700000 3.100000 1.526412 2.700000 3.200000 1.627498 2.700000 3.300000 1.748584 2.700000 3.400000 1.889670 2.700000 3.500000 2.050755 2.700000 3.600000 2.231841 2.700000 3.700000 2.432927 2.700000 3.800000 2.654012 2.700000 3.900000 2.895098 2.700000 4.000000 3.156184 2.700000 4.100000 3.437269 2.700000 4.200000 3.738355 2.700000 4.300000 4.059441 2.700000 4.400000 4.400526 2.700000 4.500000 4.761612 2.700000 4.600000 5.142698 2.700000 4.700000 5.543783 2.700000 4.800000 5.964869 2.700000 4.900000 6.405955 2.700000 5.000000 6.867040 2.700000 5.100000 7.348126 2.700000 5.200000 7.849212 2.700000 5.300000 8.370297 2.700000 5.400000 8.911383 2.700000 5.500000 9.472469 2.700000 5.600000 10.053554 2.700000 5.700000 10.654640 2.700000 5.800000 11.275726 2.700000 5.900000 11.916811 2.700000 6.000000 12.577897 2.700000 6.100000 13.258983 2.700000 6.200000 13.960069 2.700000 6.300000 14.681154 2.700000 6.400000 15.422240 2.700000 6.500000 16.183326 2.700000 6.600000 16.964411 2.700000 6.700000 17.765497 2.700000 6.800000 18.586583 2.700000 6.900000 19.427668 2.700000 7.000000 20.288754 2.700000 7.100000 21.169840 2.700000 7.200000 22.070925 2.700000 7.300000 22.992011 2.700000 7.400000 23.933097 2.700000 7.500000 24.894182 2.700000 7.600000 25.875268 2.700000 7.700000 26.876354 2.700000 7.800000 27.897439 2.700000 7.900000 28.938525 2.700000 8.000000 29.999611 2.700000 8.100000 31.080696 2.700000 8.200000 32.181782 2.700000 8.300000 33.302868 2.700000 8.400000 34.443953 2.700000 8.500000 35.605039 2.700000 8.600000 36.786125 2.700000 8.700000 37.987210 2.700000 8.800000 39.208296 2.700000 8.900000 40.449382 2.700000 9.000000 41.710467 2.700000 9.100000 42.991553 2.700000 9.200000 44.292639 2.700000 9.300000 45.613725 2.700000 9.400000 46.954810 2.700000 9.500000 48.315896 2.700000 9.600000 49.696982 2.700000 9.700000 51.098067 2.700000 9.800000 52.519153 2.700000 9.900000 53.960239 2.700000 10.000000 55.421324 2.700000 10.100000 56.902410 2.700000 10.200000 58.403496 2.700000 10.300000 59.924581 2.700000 10.400000 61.465667 2.700000 10.500000 63.026753 2.700000 10.600000 64.607838 2.700000 10.700000 66.208924 2.700000 10.800000 67.830010 2.700000 10.900000 69.471095 2.700000 11.000000 71.132181 2.700000 11.100000 72.813267 2.700000 11.200000 74.514352 2.700000 11.300000 76.235438 2.700000 11.400000 77.976524 2.700000 11.500000 79.737609 2.700000 11.600000 81.518695 2.700000 11.700000 83.319781 2.700000 11.800000 85.140866 2.700000 11.900000 86.981952 2.700000 12.000000 88.843038 2.700000 12.100000 90.724124 2.700000 12.200000 92.625209 2.700000 12.300000 94.546295 2.700000 12.400000 96.487381 2.700000 12.500000 98.448466 2.700000 12.600000 100.429552 2.700000 12.700000 102.430638 2.700000 12.800000 104.451723 2.700000 12.900000 106.492809 2.700000 13.000000 108.553895 2.700000 13.100000 110.634980 2.700000 13.200000 112.736066 2.700000 13.300000 114.857152 2.700000 13.400000 116.998237 2.700000 13.500000 119.159323 2.700000 13.600000 121.340409 2.700000 13.700000 123.541494 2.700000 13.800000 125.762580 2.700000 13.900000 128.003666 2.700000 14.000000 130.264751 2.700000 14.100000 132.545837 2.700000 14.200000 134.846923 2.700000 14.300000 137.168008 2.700000 14.400000 139.509094 2.700000 14.500000 141.870180 2.700000 14.600000 144.251265 2.700000 14.700000 146.652351 2.700000 14.800000 149.073437 2.700000 14.900000 151.514523 2.700000 15.000000 153.975608 2.800000 -5.000000 58.052886 2.800000 -4.900000 56.551592 2.800000 -4.800000 55.070299 2.800000 -4.700000 53.609005 2.800000 -4.600000 52.167711 2.800000 -4.500000 50.746418 2.800000 -4.400000 49.345124 2.800000 -4.300000 47.963830 2.800000 -4.200000 46.602537 2.800000 -4.100000 45.261243 2.800000 -4.000000 43.939949 2.800000 -3.900000 42.638656 2.800000 -3.800000 41.357362 2.800000 -3.700000 40.096069 2.800000 -3.600000 38.854775 2.800000 -3.500000 37.633481 2.800000 -3.400000 36.432188 2.800000 -3.300000 35.250894 2.800000 -3.200000 34.089600 2.800000 -3.100000 32.948307 2.800000 -3.000000 31.827013 2.800000 -2.900000 30.725720 2.800000 -2.800000 29.644426 2.800000 -2.700000 28.583132 2.800000 -2.600000 27.541839 2.800000 -2.500000 26.520545 2.800000 -2.400000 25.519251 2.800000 -2.300000 24.537958 2.800000 -2.200000 23.576664 2.800000 -2.100000 22.635371 2.800000 -2.000000 21.714077 2.800000 -1.900000 20.812783 2.800000 -1.800000 19.931490 2.800000 -1.700000 19.070196 2.800000 -1.600000 18.228902 2.800000 -1.500000 17.407609 2.800000 -1.400000 16.606315 2.800000 -1.300000 15.825022 2.800000 -1.200000 15.063728 2.800000 -1.100000 14.322434 2.800000 -1.000000 13.601141 2.800000 -0.900000 12.899847 2.800000 -0.800000 12.218553 2.800000 -0.700000 11.557260 2.800000 -0.600000 10.915966 2.800000 -0.500000 10.294672 2.800000 -0.400000 9.693379 2.800000 -0.300000 9.112085 2.800000 -0.200000 8.550792 2.800000 -0.100000 8.009498 2.800000 -0.000000 7.488204 2.800000 0.100000 6.986911 2.800000 0.200000 6.505617 2.800000 0.300000 6.044323 2.800000 0.400000 5.603030 2.800000 0.500000 5.181736 2.800000 0.600000 4.780443 2.800000 0.700000 4.399149 2.800000 0.800000 4.037855 2.800000 0.900000 3.696562 2.800000 1.000000 3.375268 2.800000 1.100000 3.073974 2.800000 1.200000 2.792681 2.800000 1.300000 2.531387 2.800000 1.400000 2.290094 2.800000 1.500000 2.068800 2.800000 1.600000 1.867506 2.800000 1.700000 1.686213 2.800000 1.800000 1.524919 2.800000 1.900000 1.383625 2.800000 2.000000 1.262332 2.800000 2.100000 1.161038 2.800000 2.200000 1.079744 2.800000 2.300000 1.018451 2.800000 2.400000 0.977157 2.800000 2.500000 0.955864 2.800000 2.600000 0.954570 2.800000 2.700000 0.973276 2.800000 2.800000 1.011983 2.800000 2.900000 1.070689 2.800000 3.000000 1.149395 2.800000 3.100000 1.248102 2.800000 3.200000 1.366808 2.800000 3.300000 1.505515 2.800000 3.400000 1.664221 2.800000 3.500000 1.842927 2.800000 3.600000 2.041634 2.800000 3.700000 2.260340 2.800000 3.800000 2.499046 2.800000 3.900000 2.757753 2.800000 4.000000 3.036459 2.800000 4.100000 3.335166 2.800000 4.200000 3.653872 2.800000 4.300000 3.992578 2.800000 4.400000 4.351285 2.800000 4.500000 4.729991 2.800000 4.600000 5.128697 2.800000 4.700000 5.547404 2.800000 4.800000 5.986110 2.800000 4.900000 6.444817 2.800000 5.000000 6.923523 2.800000 5.100000 7.422229 2.800000 5.200000 7.940936 2.800000 5.300000 8.479642 2.800000 5.400000 9.038348 2.800000 5.500000 9.617055 2.800000 5.600000 10.215761 2.800000 5.700000 10.834467 2.800000 5.800000 11.473174 2.800000 5.900000 12.131880 2.800000 6.000000 12.810587 2.800000 6.100000 13.509293 2.800000 6.200000 14.227999 2.800000 6.300000 14.966706 2.800000 6.400000 15.725412 2.800000 6.500000 16.504118 2.800000 6.600000 17.302825 2.800000 6.700000 18.121531 2.800000 6.800000 18.960238 2.800000 6.900000 19.818944 2.800000 7.000000 20.697650 2.800000 7.100000 21.596357 2.800000 7.200000 22.515063 2.800000 7.300000 23.453769 2.800000 7.400000 24.412476 2.800000 7.500000 25.391182 2.800000 7.600000 26.389889 2.800000 7.700000 27.408595 2.800000 7.800000 28.447301 2.800000 7.900000 29.506008 2.800000 8.000000 30.584714 2.800000 8.100000 31.683420 2.800000 8.200000 32.802127 2.800000 8.300000 33.940833 2.800000 8.400000 35.099539 2.800000 8.500000 36.278246 2.800000 8.600000 37.476952 2.800000 8.700000 38.695659 2.800000 8.800000 39.934365 2.800000 8.900000 41.193071 2.800000 9.000000 42.471778 2.800000 9.100000 43.770484 2.800000 9.200000 45.089190 2.800000 9.300000 46.427897 2.800000 9.400000 47.786603 2.800000 9.500000 49.165310 2.800000 9.600000 50.564016 2.800000 9.700000 51.982722 2.800000 9.800000 53.421429 2.800000 9.900000 54.880135 2.800000 10.000000 56.358841 2.800000 10.100000 57.857548 2.800000 10.200000 59.376254 2.800000 10.300000 60.914961 2.800000 10.400000 62.473667 2.800000 10.500000 64.052373 2.800000 10.600000 65.651080 2.800000 10.700000 67.269786 2.800000 10.800000 68.908492 2.800000 10.900000 70.567199 2.800000 11.000000 72.245905 2.800000 11.100000 73.944612 2.800000 11.200000 75.663318 2.800000 11.300000 77.402024 2.800000 11.400000 79.160731 2.800000 11.500000 80.939437 2.800000 11.600000 82.738143 2.800000 11.700000 84.556850 2.800000 11.800000 86.395556 2.800000 11.900000 88.254262 2.800000 12.000000 90.132969 2.800000 12.100000 92.031675 2.800000 12.200000 93.950382 2.800000 12.300000 95.889088 2.800000 12.400000 97.847794 2.800000 12.500000 99.826501 2.800000 12.600000 101.825207 2.800000 12.700000 103.843913 2.800000 12.800000 105.882620 2.800000 12.900000 107.941326 2.800000 13.000000 110.020033 2.800000 13.100000 112.118739 2.800000 13.200000 114.237445 2.800000 13.300000 116.376152 2.800000 13.400000 118.534858 2.800000 13.500000 120.713564 2.800000 13.600000 122.912271 2.800000 13.700000 125.130977 2.800000 13.800000 127.369684 2.800000 13.900000 129.628390 2.800000 14.000000 131.907096 2.800000 14.100000 134.205803 2.800000 14.200000 136.524509 2.800000 14.300000 138.863215 2.800000 14.400000 141.221922 2.800000 14.500000 143.600628 2.800000 14.600000 145.999334 2.800000 14.700000 148.418041 2.800000 14.800000 150.856747 2.800000 14.900000 153.315454 2.800000 15.000000 155.794160 2.900000 -5.000000 56.491820 2.900000 -4.900000 55.007630 2.900000 -4.800000 53.543441 2.900000 -4.700000 52.099251 2.900000 -4.600000 50.675061 2.900000 -4.500000 49.270872 2.900000 -4.400000 47.886682 2.900000 -4.300000 46.522492 2.900000 -4.200000 45.178303 2.900000 -4.100000 43.854113 2.900000 -4.000000 42.549923 2.900000 -3.900000 41.265733 2.900000 -3.800000 40.001544 2.900000 -3.700000 38.757354 2.900000 -3.600000 37.533164 2.900000 -3.500000 36.328975 2.900000 -3.400000 35.144785 2.900000 -3.300000 33.980595 2.900000 -3.200000 32.836406 2.900000 -3.100000 31.712216 2.900000 -3.000000 30.608026 2.900000 -2.900000 29.523837 2.900000 -2.800000 28.459647 2.900000 -2.700000 27.415457 2.900000 -2.600000 26.391268 2.900000 -2.500000 25.387078 2.900000 -2.400000 24.402888 2.900000 -2.300000 23.438699 2.900000 -2.200000 22.494509 2.900000 -2.100000 21.570319 2.900000 -2.000000 20.666130 2.900000 -1.900000 19.781940 2.900000 -1.800000 18.917750 2.900000 -1.700000 18.073561 2.900000 -1.600000 17.249371 2.900000 -1.500000 16.445181 2.900000 -1.400000 15.660992 2.900000 -1.300000 14.896802 2.900000 -1.200000 14.152612 2.900000 -1.100000 13.428423 2.900000 -1.000000 12.724233 2.900000 -0.900000 12.040043 2.900000 -0.800000 11.375854 2.900000 -0.700000 10.731664 2.900000 -0.600000 10.107474 2.900000 -0.500000 9.503285 2.900000 -0.400000 8.919095 2.900000 -0.300000 8.354905 2.900000 -0.200000 7.810716 2.900000 -0.100000 7.286526 2.900000 -0.000000 6.782336 2.900000 0.100000 6.298147 2.900000 0.200000 5.833957 2.900000 0.300000 5.389767 2.900000 0.400000 4.965577 2.900000 0.500000 4.561388 2.900000 0.600000 4.177198 2.900000 0.700000 3.813008 2.900000 0.800000 3.468819 2.900000 0.900000 3.144629 2.900000 1.000000 2.840439 2.900000 1.100000 2.556250 2.900000 1.200000 2.292060 2.900000 1.300000 2.047870 2.900000 1.400000 1.823681 2.900000 1.500000 1.619491 2.900000 1.600000 1.435301 2.900000 1.700000 1.271112 2.900000 1.800000 1.126922 2.900000 1.900000 1.002732 2.900000 2.000000 0.898543 2.900000 2.100000 0.814353 2.900000 2.200000 0.750163 2.900000 2.300000 0.705974 2.900000 2.400000 0.681784 2.900000 2.500000 0.677594 2.900000 2.600000 0.693405 2.900000 2.700000 0.729215 2.900000 2.800000 0.785025 2.900000 2.900000 0.860836 2.900000 3.000000 0.956646 2.900000 3.100000 1.072456 2.900000 3.200000 1.208267 2.900000 3.300000 1.364077 2.900000 3.400000 1.539887 2.900000 3.500000 1.735698 2.900000 3.600000 1.951508 2.900000 3.700000 2.187318 2.900000 3.800000 2.443129 2.900000 3.900000 2.718939 2.900000 4.000000 3.014749 2.900000 4.100000 3.330560 2.900000 4.200000 3.666370 2.900000 4.300000 4.022180 2.900000 4.400000 4.397991 2.900000 4.500000 4.793801 2.900000 4.600000 5.209611 2.900000 4.700000 5.645421 2.900000 4.800000 6.101232 2.900000 4.900000 6.577042 2.900000 5.000000 7.072852 2.900000 5.100000 7.588663 2.900000 5.200000 8.124473 2.900000 5.300000 8.680283 2.900000 5.400000 9.256094 2.900000 5.500000 9.851904 2.900000 5.600000 10.467714 2.900000 5.700000 11.103525 2.900000 5.800000 11.759335 2.900000 5.900000 12.435145 2.900000 6.000000 13.130956 2.900000 6.100000 13.846766 2.900000 6.200000 14.582576 2.900000 6.300000 15.338387 2.900000 6.400000 16.114197 2.900000 6.500000 16.910007 2.900000 6.600000 17.725818 2.900000 6.700000 18.561628 2.900000 6.800000 19.417438 2.900000 6.900000 20.293249 2.900000 7.000000 21.189059 2.900000 7.100000 22.104869 2.900000 7.200000 23.040680 2.900000 7.300000 23.996490 2.900000 7.400000 24.972300 2.900000 7.500000 25.968111 2.900000 7.600000 26.983921 2.900000 7.700000 28.019731 2.900000 7.800000 29.075542 2.900000 7.900000 30.151352 2.900000 8.000000 31.247162 2.900000 8.100000 32.362973 2.900000 8.200000 33.498783 2.900000 8.300000 34.654593 2.900000 8.400000 35.830404 2.900000 8.500000 37.026214 2.900000 8.600000 38.242024 2.900000 8.700000 39.477835 2.900000 8.800000 40.733645 2.900000 8.900000 42.009455 2.900000 9.000000 43.305265 2.900000 9.100000 44.621076 2.900000 9.200000 45.956886 2.900000 9.300000 47.312696 2.900000 9.400000 48.688507 2.900000 9.500000 50.084317 2.900000 9.600000 51.500127 2.900000 9.700000 52.935938 2.900000 9.800000 54.391748 2.900000 9.900000 55.867558 2.900000 10.000000 57.363369 2.900000 10.100000 58.879179 2.900000 10.200000 60.414989 2.900000 10.300000 61.970800 2.900000 10.400000 63.546610 2.900000 10.500000 65.142420 2.900000 10.600000 66.758231 2.900000 10.700000 68.394041 2.900000 10.800000 70.049851 2.900000 10.900000 71.725662 2.900000 11.000000 73.421472 2.900000 11.100000 75.137282 2.900000 11.200000 76.873093 2.900000 11.300000 78.628903 2.900000 11.400000 80.404713 2.900000 11.500000 82.200524 2.900000 11.600000 84.016334 2.900000 11.700000 85.852144 2.900000 11.800000 87.707955 2.900000 11.900000 89.583765 2.900000 12.000000 91.479575 2.900000 12.100000 93.395386 2.900000 12.200000 95.331196 2.900000 12.300000 97.287006 2.900000 12.400000 99.262817 2.900000 12.500000 101.258627 2.900000 12.600000 103.274437 2.900000 12.700000 105.310248 2.900000 12.800000 107.366058 2.900000 12.900000 109.441868 2.900000 13.000000 111.537679 2.900000 13.100000 113.653489 2.900000 13.200000 115.789299 2.900000 13.300000 117.945109 2.900000 13.400000 120.120920 2.900000 13.500000 122.316730 2.900000 13.600000 124.532540 2.900000 13.700000 126.768351 2.900000 13.800000 129.024161 2.900000 13.900000 131.299971 2.900000 14.000000 133.595782 2.900000 14.100000 135.911592 2.900000 14.200000 138.247402 2.900000 14.300000 140.603213 2.900000 14.400000 142.979023 2.900000 14.500000 145.374833 2.900000 14.600000 147.790644 2.900000 14.700000 150.226454 2.900000 14.800000 152.682264 2.900000 14.900000 155.158075 2.900000 15.000000 157.653885 3.000000 -5.000000 55.076706 3.000000 -4.900000 53.609104 3.000000 -4.800000 52.161501 3.000000 -4.700000 50.733899 3.000000 -4.600000 49.326296 3.000000 -4.500000 47.938694 3.000000 -4.400000 46.571091 3.000000 -4.300000 45.223489 3.000000 -4.200000 43.895886 3.000000 -4.100000 42.588284 3.000000 -4.000000 41.300682 3.000000 -3.900000 40.033079 3.000000 -3.800000 38.785477 3.000000 -3.700000 37.557874 3.000000 -3.600000 36.350272 3.000000 -3.500000 35.162669 3.000000 -3.400000 33.995067 3.000000 -3.300000 32.847464 3.000000 -3.200000 31.719862 3.000000 -3.100000 30.612259 3.000000 -3.000000 29.524657 3.000000 -2.900000 28.457055 3.000000 -2.800000 27.409452 3.000000 -2.700000 26.381850 3.000000 -2.600000 25.374247 3.000000 -2.500000 24.386645 3.000000 -2.400000 23.419042 3.000000 -2.300000 22.471440 3.000000 -2.200000 21.543837 3.000000 -2.100000 20.636235 3.000000 -2.000000 19.748632 3.000000 -1.900000 18.881030 3.000000 -1.800000 18.033427 3.000000 -1.700000 17.205825 3.000000 -1.600000 16.398223 3.000000 -1.500000 15.610620 3.000000 -1.400000 14.843018 3.000000 -1.300000 14.095415 3.000000 -1.200000 13.367813 3.000000 -1.100000 12.660210 3.000000 -1.000000 11.972608 3.000000 -0.900000 11.305005 3.000000 -0.800000 10.657403 3.000000 -0.700000 10.029800 3.000000 -0.600000 9.422198 3.000000 -0.500000 8.834596 3.000000 -0.400000 8.266993 3.000000 -0.300000 7.719391 3.000000 -0.200000 7.191788 3.000000 -0.100000 6.684186 3.000000 -0.000000 6.196583 3.000000 0.100000 5.728981 3.000000 0.200000 5.281378 3.000000 0.300000 4.853776 3.000000 0.400000 4.446173 3.000000 0.500000 4.058571 3.000000 0.600000 3.690968 3.000000 0.700000 3.343366 3.000000 0.800000 3.015764 3.000000 0.900000 2.708161 3.000000 1.000000 2.420559 3.000000 1.100000 2.152956 3.000000 1.200000 1.905354 3.000000 1.300000 1.677751 3.000000 1.400000 1.470149 3.000000 1.500000 1.282546 3.000000 1.600000 1.114944 3.000000 1.700000 0.967341 3.000000 1.800000 0.839739 3.000000 1.900000 0.732137 3.000000 2.000000 0.644534 3.000000 2.100000 0.576932 3.000000 2.200000 0.529329 3.000000 2.300000 0.501727 3.000000 2.400000 0.494124 3.000000 2.500000 0.506522 3.000000 2.600000 0.538919 3.000000 2.700000 0.591317 3.000000 2.800000 0.663714 3.000000 2.900000 0.756112 3.000000 3.000000 0.868509 3.000000 3.100000 1.000907 3.000000 3.200000 1.153305 3.000000 3.300000 1.325702 3.000000 3.400000 1.518100 3.000000 3.500000 1.730497 3.000000 3.600000 1.962895 3.000000 3.700000 2.215292 3.000000 3.800000 2.487690 3.000000 3.900000 2.780087 3.000000 4.000000 3.092485 3.000000 4.100000 3.424882 3.000000 4.200000 3.777280 3.000000 4.300000 4.149678 3.000000 4.400000 4.542075 3.000000 4.500000 4.954473 3.000000 4.600000 5.386870 3.000000 4.700000 5.839268 3.000000 4.800000 6.311665 3.000000 4.900000 6.804063 3.000000 5.000000 7.316460 3.000000 5.100000 7.848858 3.000000 5.200000 8.401255 3.000000 5.300000 8.973653 3.000000 5.400000 9.566051 3.000000 5.500000 10.178448 3.000000 5.600000 10.810846 3.000000 5.700000 11.463243 3.000000 5.800000 12.135641 3.000000 5.900000 12.828038 3.000000 6.000000 13.540436 3.000000 6.100000 14.272833 3.000000 6.200000 15.025231 3.000000 6.300000 15.797628 3.000000 6.400000 16.590026 3.000000 6.500000 17.402423 3.000000 6.600000 18.234821 3.000000 6.700000 19.087219 3.000000 6.800000 19.959616 3.000000 6.900000 20.852014 3.000000 7.000000 21.764411 3.000000 7.100000 22.696809 3.000000 7.200000 23.649206 3.000000 7.300000 24.621604 3.000000 7.400000 25.614001 3.000000 7.500000 26.626399 3.000000 7.600000 27.658796 3.000000 7.700000 28.711194 3.000000 7.800000 29.783592 3.000000 7.900000 30.875989 3.000000 8.000000 31.988387 3.000000 8.100000 33.120784 3.000000 8.200000 34.273182 3.000000 8.300000 35.445579 3.000000 8.400000 36.637977 3.000000 8.500000 37.850374 3.000000 8.600000 39.082772 3.000000 8.700000 40.335169 3.000000 8.800000 41.607567 3.000000 8.900000 42.899964 3.000000 9.000000 44.212362 3.000000 9.100000 45.544760 3.000000 9.200000 46.897157 3.000000 9.300000 48.269555 3.000000 9.400000 49.661952 3.000000 9.500000 51.074350 3.000000 9.600000 52.506747 3.000000 9.700000 53.959145 3.000000 9.800000 55.431542 3.000000 9.900000 56.923940 3.000000 10.000000 58.436337 3.000000 10.100000 59.968735 3.000000 10.200000 61.521133 3.000000 10.300000 63.093530 3.000000 10.400000 64.685928 3.000000 10.500000 66.298325 3.000000 10.600000 67.930723 3.000000 10.700000 69.583120 3.000000 10.800000 71.255518 3.000000 10.900000 72.947915 3.000000 11.000000 74.660313 3.000000 11.100000 76.392710 3.000000 11.200000 78.145108 3.000000 11.300000 79.917505 3.000000 11.400000 81.709903 3.000000 11.500000 83.522301 3.000000 11.600000 85.354698 3.000000 11.700000 87.207096 3.000000 11.800000 89.079493 3.000000 11.900000 90.971891 3.000000 12.000000 92.884288 3.000000 12.100000 94.816686 3.000000 12.200000 96.769083 3.000000 12.300000 98.741481 3.000000 12.400000 100.733878 3.000000 12.500000 102.746276 3.000000 12.600000 104.778674 3.000000 12.700000 106.831071 3.000000 12.800000 108.903469 3.000000 12.900000 110.995866 3.000000 13.000000 113.108264 3.000000 13.100000 115.240661 3.000000 13.200000 117.393059 3.000000 13.300000 119.565456 3.000000 13.400000 121.757854 3.000000 13.500000 123.970251 3.000000 13.600000 126.202649 3.000000 13.700000 128.455046 3.000000 13.800000 130.727444 3.000000 13.900000 133.019842 3.000000 14.000000 135.332239 3.000000 14.100000 137.664637 3.000000 14.200000 140.017034 3.000000 14.300000 142.389432 3.000000 14.400000 144.781829 3.000000 14.500000 147.194227 3.000000 14.600000 149.626624 3.000000 14.700000 152.079022 3.000000 14.800000 154.551419 3.000000 14.900000 157.043817 3.000000 15.000000 159.556215 3.100000 -5.000000 53.808085 3.100000 -4.900000 52.356553 3.100000 -4.800000 50.925021 3.100000 -4.700000 49.513489 3.100000 -4.600000 48.121957 3.100000 -4.500000 46.750425 3.100000 -4.400000 45.398893 3.100000 -4.300000 44.067361 3.100000 -4.200000 42.755829 3.100000 -4.100000 41.464297 3.100000 -4.000000 40.192765 3.100000 -3.900000 38.941233 3.100000 -3.800000 37.709701 3.100000 -3.700000 36.498169 3.100000 -3.600000 35.306637 3.100000 -3.500000 34.135105 3.100000 -3.400000 32.983573 3.100000 -3.300000 31.852041 3.100000 -3.200000 30.740509 3.100000 -3.100000 29.648977 3.100000 -3.000000 28.577445 3.100000 -2.900000 27.525913 3.100000 -2.800000 26.494381 3.100000 -2.700000 25.482849 3.100000 -2.600000 24.491317 3.100000 -2.500000 23.519785 3.100000 -2.400000 22.568253 3.100000 -2.300000 21.636721 3.100000 -2.200000 20.725189 3.100000 -2.100000 19.833658 3.100000 -2.000000 18.962126 3.100000 -1.900000 18.110594 3.100000 -1.800000 17.279062 3.100000 -1.700000 16.467530 3.100000 -1.600000 15.675998 3.100000 -1.500000 14.904466 3.100000 -1.400000 14.152934 3.100000 -1.300000 13.421402 3.100000 -1.200000 12.709870 3.100000 -1.100000 12.018338 3.100000 -1.000000 11.346806 3.100000 -0.900000 10.695274 3.100000 -0.800000 10.063742 3.100000 -0.700000 9.452210 3.100000 -0.600000 8.860678 3.100000 -0.500000 8.289146 3.100000 -0.400000 7.737614 3.100000 -0.300000 7.206082 3.100000 -0.200000 6.694550 3.100000 -0.100000 6.203018 3.100000 -0.000000 5.731486 3.100000 0.100000 5.279954 3.100000 0.200000 4.848422 3.100000 0.300000 4.436890 3.100000 0.400000 4.045358 3.100000 0.500000 3.673826 3.100000 0.600000 3.322294 3.100000 0.700000 2.990762 3.100000 0.800000 2.679230 3.100000 0.900000 2.387698 3.100000 1.000000 2.116166 3.100000 1.100000 1.864634 3.100000 1.200000 1.633102 3.100000 1.300000 1.421570 3.100000 1.400000 1.230038 3.100000 1.500000 1.058506 3.100000 1.600000 0.906974 3.100000 1.700000 0.775442 3.100000 1.800000 0.663910 3.100000 1.900000 0.572378 3.100000 2.000000 0.500846 3.100000 2.100000 0.449314 3.100000 2.200000 0.417782 3.100000 2.300000 0.406250 3.100000 2.400000 0.414718 3.100000 2.500000 0.443186 3.100000 2.600000 0.491654 3.100000 2.700000 0.560122 3.100000 2.800000 0.648591 3.100000 2.900000 0.757059 3.100000 3.000000 0.885527 3.100000 3.100000 1.033995 3.100000 3.200000 1.202463 3.100000 3.300000 1.390931 3.100000 3.400000 1.599399 3.100000 3.500000 1.827867 3.100000 3.600000 2.076335 3.100000 3.700000 2.344803 3.100000 3.800000 2.633271 3.100000 3.900000 2.941739 3.100000 4.000000 3.270207 3.100000 4.100000 3.618675 3.100000 4.200000 3.987143 3.100000 4.300000 4.375611 3.100000 4.400000 4.784079 3.100000 4.500000 5.212547 3.100000 4.600000 5.661015 3.100000 4.700000 6.129483 3.100000 4.800000 6.617951 3.100000 4.900000 7.126419 3.100000 5.000000 7.654887 3.100000 5.100000 8.203355 3.100000 5.200000 8.771823 3.100000 5.300000 9.360291 3.100000 5.400000 9.968759 3.100000 5.500000 10.597227 3.100000 5.600000 11.245695 3.100000 5.700000 11.914163 3.100000 5.800000 12.602631 3.100000 5.900000 13.311099 3.100000 6.000000 14.039567 3.100000 6.100000 14.788035 3.100000 6.200000 15.556503 3.100000 6.300000 16.344971 3.100000 6.400000 17.153439 3.100000 6.500000 17.981907 3.100000 6.600000 18.830375 3.100000 6.700000 19.698843 3.100000 6.800000 20.587311 3.100000 6.900000 21.495779 3.100000 7.000000 22.424247 3.100000 7.100000 23.372715 3.100000 7.200000 24.341183 3.100000 7.300000 25.329651 3.100000 7.400000 26.338119 3.100000 7.500000 27.366587 3.100000 7.600000 28.415056 3.100000 7.700000 29.483524 3.100000 7.800000 30.571992 3.100000 7.900000 31.680460 3.100000 8.000000 32.808928 3.100000 8.100000 33.957396 3.100000 8.200000 35.125864 3.100000 8.300000 36.314332 3.100000 8.400000 37.522800 3.100000 8.500000 38.751268 3.100000 8.600000 39.999736 3.100000 8.700000 41.268204 3.100000 8.800000 42.556672 3.100000 8.900000 43.865140 3.100000 9.000000 45.193608 3.100000 9.100000 46.542076 3.100000 9.200000 47.910544 3.100000 9.300000 49.299012 3.100000 9.400000 50.707480 3.100000 9.500000 52.135948 3.100000 9.600000 53.584416 3.100000 9.700000 55.052884 3.100000 9.800000 56.541352 3.100000 9.900000 58.049820 3.100000 10.000000 59.578288 3.100000 10.100000 61.126756 3.100000 10.200000 62.695224 3.100000 10.300000 64.283692 3.100000 10.400000 65.892160 3.100000 10.500000 67.520628 3.100000 10.600000 69.169096 3.100000 10.700000 70.837564 3.100000 10.800000 72.526032 3.100000 10.900000 74.234500 3.100000 11.000000 75.962968 3.100000 11.100000 77.711436 3.100000 11.200000 79.479904 3.100000 11.300000 81.268372 3.100000 11.400000 83.076840 3.100000 11.500000 84.905308 3.100000 11.600000 86.753776 3.100000 11.700000 88.622244 3.100000 11.800000 90.510712 3.100000 11.900000 92.419180 3.100000 12.000000 94.347648 3.100000 12.100000 96.296116 3.100000 12.200000 98.264584 3.100000 12.300000 100.253052 3.100000 12.400000 102.261520 3.100000 12.500000 104.289989 3.100000 12.600000 106.338457 3.100000 12.700000 108.406925 3.100000 12.800000 110.495393 3.100000 12.900000 112.603861 3.100000 13.000000 114.732329 3.100000 13.100000 116.880797 3.100000 13.200000 119.049265 3.100000 13.300000 121.237733 3.100000 13.400000 123.446201 3.100000 13.500000 125.674669 3.100000 13.600000 127.923137 3.100000 13.700000 130.191605 3.100000 13.800000 132.480073 3.100000 13.900000 134.788541 3.100000 14.000000 137.117009 3.100000 14.100000 139.465477 3.100000 14.200000 141.833945 3.100000 14.300000 144.222413 3.100000 14.400000 146.630881 3.100000 14.500000 149.059349 3.100000 14.600000 151.507817 3.100000 14.700000 153.976285 3.100000 14.800000 156.464753 3.100000 14.900000 158.973221 3.100000 15.000000 161.501689 3.200000 -5.000000 52.685588 3.200000 -4.900000 51.249610 3.200000 -4.800000 49.833631 3.200000 -4.700000 48.437653 3.200000 -4.600000 47.061675 3.200000 -4.500000 45.705697 3.200000 -4.400000 44.369718 3.200000 -4.300000 43.053740 3.200000 -4.200000 41.757762 3.200000 -4.100000 40.481784 3.200000 -4.000000 39.225805 3.200000 -3.900000 37.989827 3.200000 -3.800000 36.773849 3.200000 -3.700000 35.577871 3.200000 -3.600000 34.401892 3.200000 -3.500000 33.245914 3.200000 -3.400000 32.109936 3.200000 -3.300000 30.993958 3.200000 -3.200000 29.897979 3.200000 -3.100000 28.822001 3.200000 -3.000000 27.766023 3.200000 -2.900000 26.730045 3.200000 -2.800000 25.714067 3.200000 -2.700000 24.718088 3.200000 -2.600000 23.742110 3.200000 -2.500000 22.786132 3.200000 -2.400000 21.850154 3.200000 -2.300000 20.934175 3.200000 -2.200000 20.038197 3.200000 -2.100000 19.162219 3.200000 -2.000000 18.306241 3.200000 -1.900000 17.470262 3.200000 -1.800000 16.654284 3.200000 -1.700000 15.858306 3.200000 -1.600000 15.082328 3.200000 -1.500000 14.326349 3.200000 -1.400000 13.590371 3.200000 -1.300000 12.874393 3.200000 -1.200000 12.178415 3.200000 -1.100000 11.502436 3.200000 -1.000000 10.846458 3.200000 -0.900000 10.210480 3.200000 -0.800000 9.594502 3.200000 -0.700000 8.998524 3.200000 -0.600000 8.422545 3.200000 -0.500000 7.866567 3.200000 -0.400000 7.330589 3.200000 -0.300000 6.814611 3.200000 -0.200000 6.318632 3.200000 -0.100000 5.842654 3.200000 -0.000000 5.386676 3.200000 0.100000 4.950698 3.200000 0.200000 4.534719 3.200000 0.300000 4.138741 3.200000 0.400000 3.762763 3.200000 0.500000 3.406785 3.200000 0.600000 3.070806 3.200000 0.700000 2.754828 3.200000 0.800000 2.458850 3.200000 0.900000 2.182872 3.200000 1.000000 1.926893 3.200000 1.100000 1.690915 3.200000 1.200000 1.474937 3.200000 1.300000 1.278959 3.200000 1.400000 1.102981 3.200000 1.500000 0.947002 3.200000 1.600000 0.811024 3.200000 1.700000 0.695046 3.200000 1.800000 0.599068 3.200000 1.900000 0.523089 3.200000 2.000000 0.467111 3.200000 2.100000 0.431133 3.200000 2.200000 0.415155 3.200000 2.300000 0.419176 3.200000 2.400000 0.443198 3.200000 2.500000 0.487220 3.200000 2.600000 0.551242 3.200000 2.700000 0.635263 3.200000 2.800000 0.739285 3.200000 2.900000 0.863307 3.200000 3.000000 1.007329 3.200000 3.100000 1.171350 3.200000 3.200000 1.355372 3.200000 3.300000 1.559394 3.200000 3.400000 1.783416 3.200000 3.500000 2.027437 3.200000 3.600000 2.291459 3.200000 3.700000 2.575481 3.200000 3.800000 2.879503 3.200000 3.900000 3.203525 3.200000 4.000000 3.547546 3.200000 4.100000 3.911568 3.200000 4.200000 4.295590 3.200000 4.300000 4.699612 3.200000 4.400000 5.123633 3.200000 4.500000 5.567655 3.200000 4.600000 6.031677 3.200000 4.700000 6.515699 3.200000 4.800000 7.019720 3.200000 4.900000 7.543742 3.200000 5.000000 8.087764 3.200000 5.100000 8.651786 3.200000 5.200000 9.235807 3.200000 5.300000 9.839829 3.200000 5.400000 10.463851 3.200000 5.500000 11.107873 3.200000 5.600000 11.771894 3.200000 5.700000 12.455916 3.200000 5.800000 13.159938 3.200000 5.900000 13.883960 3.200000 6.000000 14.627982 3.200000 6.100000 15.392003 3.200000 6.200000 16.176025 3.200000 6.300000 16.980047 3.200000 6.400000 17.804069 3.200000 6.500000 18.648090 3.200000 6.600000 19.512112 3.200000 6.700000 20.396134 3.200000 6.800000 21.300156 3.200000 6.900000 22.224177 3.200000 7.000000 23.168199 3.200000 7.100000 24.132221 3.200000 7.200000 25.116243 3.200000 7.300000 26.120264 3.200000 7.400000 27.144286 3.200000 7.500000 28.188308 3.200000 7.600000 29.252330 3.200000 7.700000 30.336351 3.200000 7.800000 31.440373 3.200000 7.900000 32.564395 3.200000 8.000000 33.708417 3.200000 8.100000 34.872438 3.200000 8.200000 36.056460 3.200000 8.300000 37.260482 3.200000 8.400000 38.484504 3.200000 8.500000 39.728526 3.200000 8.600000 40.992547 3.200000 8.700000 42.276569 3.200000 8.800000 43.580591 3.200000 8.900000 44.904613 3.200000 9.000000 46.248634 3.200000 9.100000 47.612656 3.200000 9.200000 48.996678 3.200000 9.300000 50.400700 3.200000 9.400000 51.824721 3.200000 9.500000 53.268743 3.200000 9.600000 54.732765 3.200000 9.700000 56.216787 3.200000 9.800000 57.720808 3.200000 9.900000 59.244830 3.200000 10.000000 60.788852 3.200000 10.100000 62.352874 3.200000 10.200000 63.936895 3.200000 10.300000 65.540917 3.200000 10.400000 67.164939 3.200000 10.500000 68.808961 3.200000 10.600000 70.472983 3.200000 10.700000 72.157004 3.200000 10.800000 73.861026 3.200000 10.900000 75.585048 3.200000 11.000000 77.329070 3.200000 11.100000 79.093091 3.200000 11.200000 80.877113 3.200000 11.300000 82.681135 3.200000 11.400000 84.505157 3.200000 11.500000 86.349178 3.200000 11.600000 88.213200 3.200000 11.700000 90.097222 3.200000 11.800000 92.001244 3.200000 11.900000 93.925265 3.200000 12.000000 95.869287 3.200000 12.100000 97.833309 3.200000 12.200000 99.817331 3.200000 12.300000 101.821352 3.200000 12.400000 103.845374 3.200000 12.500000 105.889396 3.200000 12.600000 107.953418 3.200000 12.700000 110.037440 3.200000 12.800000 112.141461 3.200000 12.900000 114.265483 3.200000 13.000000 116.409505 3.200000 13.100000 118.573527 3.200000 13.200000 120.757548 3.200000 13.300000 122.961570 3.200000 13.400000 125.185592 3.200000 13.500000 127.429614 3.200000 13.600000 129.693635 3.200000 13.700000 131.977657 3.200000 13.800000 134.281679 3.200000 13.900000 136.605701 3.200000 14.000000 138.949722 3.200000 14.100000 141.313744 3.200000 14.200000 143.697766 3.200000 14.300000 146.101788 3.200000 14.400000 148.525809 3.200000 14.500000 150.969831 3.200000 14.600000 153.433853 3.200000 14.700000 155.917875 3.200000 14.800000 158.421896 3.200000 14.900000 160.945918 3.200000 15.000000 163.489940 3.300000 -5.000000 51.707929 3.300000 -4.900000 50.286987 3.300000 -4.800000 48.886046 3.300000 -4.700000 47.505105 3.300000 -4.600000 46.144164 3.300000 -4.500000 44.803222 3.300000 -4.400000 43.482281 3.300000 -4.300000 42.181340 3.300000 -4.200000 40.900399 3.300000 -4.100000 39.639457 3.300000 -4.000000 38.398516 3.300000 -3.900000 37.177575 3.300000 -3.800000 35.976634 3.300000 -3.700000 34.795693 3.300000 -3.600000 33.634751 3.300000 -3.500000 32.493810 3.300000 -3.400000 31.372869 3.300000 -3.300000 30.271928 3.300000 -3.200000 29.190986 3.300000 -3.100000 28.130045 3.300000 -3.000000 27.089104 3.300000 -2.900000 26.068163 3.300000 -2.800000 25.067221 3.300000 -2.700000 24.086280 3.300000 -2.600000 23.125339 3.300000 -2.500000 22.184398 3.300000 -2.400000 21.263456 3.300000 -2.300000 20.362515 3.300000 -2.200000 19.481574 3.300000 -2.100000 18.620633 3.300000 -2.000000 17.779691 3.300000 -1.900000 16.958750 3.300000 -1.800000 16.157809 3.300000 -1.700000 15.376868 3.300000 -1.600000 14.615927 3.300000 -1.500000 13.874985 3.300000 -1.400000 13.154044 3.300000 -1.300000 12.453103 3.300000 -1.200000 11.772162 3.300000 -1.100000 11.111220 3.300000 -1.000000 10.470279 3.300000 -0.900000 9.849338 3.300000 -0.800000 9.248397 3.300000 -0.700000 8.667455 3.300000 -0.600000 8.106514 3.300000 -0.500000 7.565573 3.300000 -0.400000 7.044632 3.300000 -0.300000 6.543690 3.300000 -0.200000 6.062749 3.300000 -0.100000 5.601808 3.300000 -0.000000 5.160867 3.300000 0.100000 4.739926 3.300000 0.200000 4.338984 3.300000 0.300000 3.958043 3.300000 0.400000 3.597102 3.300000 0.500000 3.256161 3.300000 0.600000 2.935219 3.300000 0.700000 2.634278 3.300000 0.800000 2.353337 3.300000 0.900000 2.092396 3.300000 1.000000 1.851454 3.300000 1.100000 1.630513 3.300000 1.200000 1.429572 3.300000 1.300000 1.248631 3.300000 1.400000 1.087689 3.300000 1.500000 0.946748 3.300000 1.600000 0.825807 3.300000 1.700000 0.724866 3.300000 1.800000 0.643924 3.300000 1.900000 0.582983 3.300000 2.000000 0.542042 3.300000 2.100000 0.521101 3.300000 2.200000 0.520160 3.300000 2.300000 0.539218 3.300000 2.400000 0.578277 3.300000 2.500000 0.637336 3.300000 2.600000 0.716395 3.300000 2.700000 0.815453 3.300000 2.800000 0.934512 3.300000 2.900000 1.073571 3.300000 3.000000 1.232630 3.300000 3.100000 1.411688 3.300000 3.200000 1.610747 3.300000 3.300000 1.829806 3.300000 3.400000 2.068865 3.300000 3.500000 2.327923 3.300000 3.600000 2.606982 3.300000 3.700000 2.906041 3.300000 3.800000 3.225100 3.300000 3.900000 3.564159 3.300000 4.000000 3.923217 3.300000 4.100000 4.302276 3.300000 4.200000 4.701335 3.300000 4.300000 5.120394 3.300000 4.400000 5.559452 3.300000 4.500000 6.018511 3.300000 4.600000 6.497570 3.300000 4.700000 6.996629 3.300000 4.800000 7.515687 3.300000 4.900000 8.054746 3.300000 5.000000 8.613805 3.300000 5.100000 9.192864 3.300000 5.200000 9.791922 3.300000 5.300000 10.410981 3.300000 5.400000 11.050040 3.300000 5.500000 11.709099 3.300000 5.600000 12.388158 3.300000 5.700000 13.087216 3.300000 5.800000 13.806275 3.300000 5.900000 14.545334 3.300000 6.000000 15.304393 3.300000 6.100000 16.083451 3.300000 6.200000 16.882510 3.300000 6.300000 17.701569 3.300000 6.400000 18.540628 3.300000 6.500000 19.399686 3.300000 6.600000 20.278745 3.300000 6.700000 21.177804 3.300000 6.800000 22.096863 3.300000 6.900000 23.035921 3.300000 7.000000 23.994980 3.300000 7.100000 24.974039 3.300000 7.200000 25.973098 3.300000 7.300000 26.992156 3.300000 7.400000 28.031215 3.300000 7.500000 29.090274 3.300000 7.600000 30.169333 3.300000 7.700000 31.268392 3.300000 7.800000 32.387450 3.300000 7.900000 33.526509 3.300000 8.000000 34.685568 3.300000 8.100000 35.864627 3.300000 8.200000 37.063685 3.300000 8.300000 38.282744 3.300000 8.400000 39.521803 3.300000 8.500000 40.780862 3.300000 8.600000 42.059920 3.300000 8.700000 43.358979 3.300000 8.800000 44.678038 3.300000 8.900000 46.017097 3.300000 9.000000 47.376155 3.300000 9.100000 48.755214 3.300000 9.200000 50.154273 3.300000 9.300000 51.573332 3.300000 9.400000 53.012391 3.300000 9.500000 54.471449 3.300000 9.600000 55.950508 3.300000 9.700000 57.449567 3.300000 9.800000 58.968626 3.300000 9.900000 60.507684 3.300000 10.000000 62.066743 3.300000 10.100000 63.645802 3.300000 10.200000 65.244861 3.300000 10.300000 66.863919 3.300000 10.400000 68.502978 3.300000 10.500000 70.162037 3.300000 10.600000 71.841096 3.300000 10.700000 73.540154 3.300000 10.800000 75.259213 3.300000 10.900000 76.998272 3.300000 11.000000 78.757331 3.300000 11.100000 80.536389 3.300000 11.200000 82.335448 3.300000 11.300000 84.154507 3.300000 11.400000 85.993566 3.300000 11.500000 87.852625 3.300000 11.600000 89.731683 3.300000 11.700000 91.630742 3.300000 11.800000 93.549801 3.300000 11.900000 95.488860 3.300000 12.000000 97.447918 3.300000 12.100000 99.426977 3.300000 12.200000 101.426036 3.300000 12.300000 103.445095 3.300000 12.400000 105.484153 3.300000 12.500000 107.543212 3.300000 12.600000 109.622271 3.300000 12.700000 111.721330 3.300000 12.800000 113.840388 3.300000 12.900000 115.979447 3.300000 13.000000 118.138506 3.300000 13.100000 120.317565 3.300000 13.200000 122.516624 3.300000 13.300000 124.735682 3.300000 13.400000 126.974741 3.300000 13.500000 129.233800 3.300000 13.600000 131.512859 3.300000 13.700000 133.811917 3.300000 13.800000 136.130976 3.300000 13.900000 138.470035 3.300000 14.000000 140.829094 3.300000 14.100000 143.208152 3.300000 14.200000 145.607211 3.300000 14.300000 148.026270 3.300000 14.400000 150.465329 3.300000 14.500000 152.924387 3.300000 14.600000 155.403446 3.300000 14.700000 157.902505 3.300000 14.800000 160.421564 3.300000 14.900000 162.960623 3.300000 15.000000 165.519681 3.400000 -5.000000 50.872904 3.400000 -4.900000 49.466483 3.400000 -4.800000 48.080062 3.400000 -4.700000 46.713641 3.400000 -4.600000 45.367220 3.400000 -4.500000 44.040799 3.400000 -4.400000 42.734378 3.400000 -4.300000 41.447957 3.400000 -4.200000 40.181536 3.400000 -4.100000 38.935115 3.400000 -4.000000 37.708694 3.400000 -3.900000 36.502273 3.400000 -3.800000 35.315852 3.400000 -3.700000 34.149431 3.400000 -3.600000 33.003010 3.400000 -3.500000 31.876590 3.400000 -3.400000 30.770169 3.400000 -3.300000 29.683748 3.400000 -3.200000 28.617327 3.400000 -3.100000 27.570906 3.400000 -3.000000 26.544485 3.400000 -2.900000 25.538064 3.400000 -2.800000 24.551643 3.400000 -2.700000 23.585222 3.400000 -2.600000 22.638801 3.400000 -2.500000 21.712380 3.400000 -2.400000 20.805959 3.400000 -2.300000 19.919538 3.400000 -2.200000 19.053117 3.400000 -2.100000 18.206696 3.400000 -2.000000 17.380275 3.400000 -1.900000 16.573854 3.400000 -1.800000 15.787433 3.400000 -1.700000 15.021012 3.400000 -1.600000 14.274591 3.400000 -1.500000 13.548170 3.400000 -1.400000 12.841749 3.400000 -1.300000 12.155328 3.400000 -1.200000 11.488907 3.400000 -1.100000 10.842486 3.400000 -1.000000 10.216065 3.400000 -0.900000 9.609644 3.400000 -0.800000 9.023223 3.400000 -0.700000 8.456802 3.400000 -0.600000 7.910381 3.400000 -0.500000 7.383960 3.400000 -0.400000 6.877539 3.400000 -0.300000 6.391118 3.400000 -0.200000 5.924697 3.400000 -0.100000 5.478276 3.400000 -0.000000 5.051856 3.400000 0.100000 4.645435 3.400000 0.200000 4.259014 3.400000 0.300000 3.892593 3.400000 0.400000 3.546172 3.400000 0.500000 3.219751 3.400000 0.600000 2.913330 3.400000 0.700000 2.626909 3.400000 0.800000 2.360488 3.400000 0.900000 2.114067 3.400000 1.000000 1.887646 3.400000 1.100000 1.681225 3.400000 1.200000 1.494804 3.400000 1.300000 1.328383 3.400000 1.400000 1.181962 3.400000 1.500000 1.055541 3.400000 1.600000 0.949120 3.400000 1.700000 0.862699 3.400000 1.800000 0.796278 3.400000 1.900000 0.749857 3.400000 2.000000 0.723436 3.400000 2.100000 0.717015 3.400000 2.200000 0.730594 3.400000 2.300000 0.764173 3.400000 2.400000 0.817752 3.400000 2.500000 0.891331 3.400000 2.600000 0.984910 3.400000 2.700000 1.098489 3.400000 2.800000 1.232068 3.400000 2.900000 1.385647 3.400000 3.000000 1.559226 3.400000 3.100000 1.752805 3.400000 3.200000 1.966384 3.400000 3.300000 2.199963 3.400000 3.400000 2.453542 3.400000 3.500000 2.727121 3.400000 3.600000 3.020701 3.400000 3.700000 3.334280 3.400000 3.800000 3.667859 3.400000 3.900000 4.021438 3.400000 4.000000 4.395017 3.400000 4.100000 4.788596 3.400000 4.200000 5.202175 3.400000 4.300000 5.635754 3.400000 4.400000 6.089333 3.400000 4.500000 6.562912 3.400000 4.600000 7.056491 3.400000 4.700000 7.570070 3.400000 4.800000 8.103649 3.400000 4.900000 8.657228 3.400000 5.000000 9.230807 3.400000 5.100000 9.824386 3.400000 5.200000 10.437965 3.400000 5.300000 11.071544 3.400000 5.400000 11.725123 3.400000 5.500000 12.398702 3.400000 5.600000 13.092281 3.400000 5.700000 13.805860 3.400000 5.800000 14.539439 3.400000 5.900000 15.293018 3.400000 6.000000 16.066597 3.400000 6.100000 16.860176 3.400000 6.200000 17.673755 3.400000 6.300000 18.507334 3.400000 6.400000 19.360913 3.400000 6.500000 20.234492 3.400000 6.600000 21.128071 3.400000 6.700000 22.041650 3.400000 6.800000 22.975229 3.400000 6.900000 23.928808 3.400000 7.000000 24.902387 3.400000 7.100000 25.895966 3.400000 7.200000 26.909546 3.400000 7.300000 27.943125 3.400000 7.400000 28.996704 3.400000 7.500000 30.070283 3.400000 7.600000 31.163862 3.400000 7.700000 32.277441 3.400000 7.800000 33.411020 3.400000 7.900000 34.564599 3.400000 8.000000 35.738178 3.400000 8.100000 36.931757 3.400000 8.200000 38.145336 3.400000 8.300000 39.378915 3.400000 8.400000 40.632494 3.400000 8.500000 41.906073 3.400000 8.600000 43.199652 3.400000 8.700000 44.513231 3.400000 8.800000 45.846810 3.400000 8.900000 47.200389 3.400000 9.000000 48.573968 3.400000 9.100000 49.967547 3.400000 9.200000 51.381126 3.400000 9.300000 52.814705 3.400000 9.400000 54.268284 3.400000 9.500000 55.741863 3.400000 9.600000 57.235442 3.400000 9.700000 58.749021 3.400000 9.800000 60.282600 3.400000 9.900000 61.836179 3.400000 10.000000 63.409758 3.400000 10.100000 65.003337 3.400000 10.200000 66.616916 3.400000 10.300000 68.250495 3.400000 10.400000 69.904074 3.400000 10.500000 71.577653 3.400000 10.600000 73.271232 3.400000 10.700000 74.984811 3.400000 10.800000 76.718391 3.400000 10.900000 78.471970 3.400000 11.000000 80.245549 3.400000 11.100000 82.039128 3.400000 11.200000 83.852707 3.400000 11.300000 85.686286 3.400000 11.400000 87.539865 3.400000 11.500000 89.413444 3.400000 11.600000 91.307023 3.400000 11.700000 93.220602 3.400000 11.800000 95.154181 3.400000 11.900000 97.107760 3.400000 12.000000 99.081339 3.400000 12.100000 101.074918 3.400000 12.200000 103.088497 3.400000 12.300000 105.122076 3.400000 12.400000 107.175655 3.400000 12.500000 109.249234 3.400000 12.600000 111.342813 3.400000 12.700000 113.456392 3.400000 12.800000 115.589971 3.400000 12.900000 117.743550 3.400000 13.000000 119.917129 3.400000 13.100000 122.110708 3.400000 13.200000 124.324287 3.400000 13.300000 126.557866 3.400000 13.400000 128.811445 3.400000 13.500000 131.085024 3.400000 13.600000 133.378603 3.400000 13.700000 135.692182 3.400000 13.800000 138.025761 3.400000 13.900000 140.379340 3.400000 14.000000 142.752919 3.400000 14.100000 145.146498 3.400000 14.200000 147.560077 3.400000 14.300000 149.993656 3.400000 14.400000 152.447236 3.400000 14.500000 154.920815 3.400000 14.600000 157.414394 3.400000 14.700000 159.927973 3.400000 14.800000 162.461552 3.400000 14.900000 165.015131 3.400000 15.000000 167.588710 3.500000 -5.000000 50.177405 3.500000 -4.900000 48.784987 3.500000 -4.800000 47.412570 3.500000 -4.700000 46.060152 3.500000 -4.600000 44.727735 3.500000 -4.500000 43.415317 3.500000 -4.400000 42.122900 3.500000 -4.300000 40.850483 3.500000 -4.200000 39.598065 3.500000 -4.100000 38.365648 3.500000 -4.000000 37.153230 3.500000 -3.900000 35.960813 3.500000 -3.800000 34.788395 3.500000 -3.700000 33.635978 3.500000 -3.600000 32.503560 3.500000 -3.500000 31.391143 3.500000 -3.400000 30.298726 3.500000 -3.300000 29.226308 3.500000 -3.200000 28.173891 3.500000 -3.100000 27.141473 3.500000 -3.000000 26.129056 3.500000 -2.900000 25.136638 3.500000 -2.800000 24.164221 3.500000 -2.700000 23.211803 3.500000 -2.600000 22.279386 3.500000 -2.500000 21.366969 3.500000 -2.400000 20.474551 3.500000 -2.300000 19.602134 3.500000 -2.200000 18.749716 3.500000 -2.100000 17.917299 3.500000 -2.000000 17.104881 3.500000 -1.900000 16.312464 3.500000 -1.800000 15.540046 3.500000 -1.700000 14.787629 3.500000 -1.600000 14.055212 3.500000 -1.500000 13.342794 3.500000 -1.400000 12.650377 3.500000 -1.300000 11.977959 3.500000 -1.200000 11.325542 3.500000 -1.100000 10.693124 3.500000 -1.000000 10.080707 3.500000 -0.900000 9.488289 3.500000 -0.800000 8.915872 3.500000 -0.700000 8.363455 3.500000 -0.600000 7.831037 3.500000 -0.500000 7.318620 3.500000 -0.400000 6.826202 3.500000 -0.300000 6.353785 3.500000 -0.200000 5.901367 3.500000 -0.100000 5.468950 3.500000 -0.000000 5.056532 3.500000 0.100000 4.664115 3.500000 0.200000 4.291698 3.500000 0.300000 3.939280 3.500000 0.400000 3.606863 3.500000 0.500000 3.294445 3.500000 0.600000 3.002028 3.500000 0.700000 2.729610 3.500000 0.800000 2.477193 3.500000 0.900000 2.244775 3.500000 1.000000 2.032358 3.500000 1.100000 1.839941 3.500000 1.200000 1.667523 3.500000 1.300000 1.515106 3.500000 1.400000 1.382688 3.500000 1.500000 1.270271 3.500000 1.600000 1.177853 3.500000 1.700000 1.105436 3.500000 1.800000 1.053018 3.500000 1.900000 1.020601 3.500000 2.000000 1.008184 3.500000 2.100000 1.015766 3.500000 2.200000 1.043349 3.500000 2.300000 1.090931 3.500000 2.400000 1.158514 3.500000 2.500000 1.246096 3.500000 2.600000 1.353679 3.500000 2.700000 1.481261 3.500000 2.800000 1.628844 3.500000 2.900000 1.796426 3.500000 3.000000 1.984009 3.500000 3.100000 2.191592 3.500000 3.200000 2.419174 3.500000 3.300000 2.666757 3.500000 3.400000 2.934339 3.500000 3.500000 3.221922 3.500000 3.600000 3.529504 3.500000 3.700000 3.857087 3.500000 3.800000 4.204669 3.500000 3.900000 4.572252 3.500000 4.000000 4.959835 3.500000 4.100000 5.367417 3.500000 4.200000 5.795000 3.500000 4.300000 6.242582 3.500000 4.400000 6.710165 3.500000 4.500000 7.197747 3.500000 4.600000 7.705330 3.500000 4.700000 8.232912 3.500000 4.800000 8.780495 3.500000 4.900000 9.348078 3.500000 5.000000 9.935660 3.500000 5.100000 10.543243 3.500000 5.200000 11.170825 3.500000 5.300000 11.818408 3.500000 5.400000 12.485990 3.500000 5.500000 13.173573 3.500000 5.600000 13.881155 3.500000 5.700000 14.608738 3.500000 5.800000 15.356321 3.500000 5.900000 16.123903 3.500000 6.000000 16.911486 3.500000 6.100000 17.719068 3.500000 6.200000 18.546651 3.500000 6.300000 19.394233 3.500000 6.400000 20.261816 3.500000 6.500000 21.149398 3.500000 6.600000 22.056981 3.500000 6.700000 22.984564 3.500000 6.800000 23.932146 3.500000 6.900000 24.899729 3.500000 7.000000 25.887311 3.500000 7.100000 26.894894 3.500000 7.200000 27.922476 3.500000 7.300000 28.970059 3.500000 7.400000 30.037641 3.500000 7.500000 31.125224 3.500000 7.600000 32.232807 3.500000 7.700000 33.360389 3.500000 7.800000 34.507972 3.500000 7.900000 35.675554 3.500000 8.000000 36.863137 3.500000 8.100000 38.070719 3.500000 8.200000 39.298302 3.500000 8.300000 40.545884 3.500000 8.400000 41.813467 3.500000 8.500000 43.101050 3.500000 8.600000 44.408632 3.500000 8.700000 45.736215 3.500000 8.800000 47.083797 3.500000 8.900000 48.451380 3.500000 9.000000 49.838962 3.500000 9.100000 51.246545 3.500000 9.200000 52.674127 3.500000 9.300000 54.121710 3.500000 9.400000 55.589293 3.500000 9.500000 57.076875 3.500000 9.600000 58.584458 3.500000 9.700000 60.112040 3.500000 9.800000 61.659623 3.500000 9.900000 63.227205 3.500000 10.000000 64.814788 3.500000 10.100000 66.422370 3.500000 10.200000 68.049953 3.500000 10.300000 69.697536 3.500000 10.400000 71.365118 3.500000 10.500000 73.052701 3.500000 10.600000 74.760283 3.500000 10.700000 76.487866 3.500000 10.800000 78.235448 3.500000 10.900000 80.003031 3.500000 11.000000 81.790613 3.500000 11.100000 83.598196 3.500000 11.200000 85.425778 3.500000 11.300000 87.273361 3.500000 11.400000 89.140944 3.500000 11.500000 91.028526 3.500000 11.600000 92.936109 3.500000 11.700000 94.863691 3.500000 11.800000 96.811274 3.500000 11.900000 98.778856 3.500000 12.000000 100.766439 3.500000 12.100000 102.774021 3.500000 12.200000 104.801604 3.500000 12.300000 106.849187 3.500000 12.400000 108.916769 3.500000 12.500000 111.004352 3.500000 12.600000 113.111934 3.500000 12.700000 115.239517 3.500000 12.800000 117.387099 3.500000 12.900000 119.554682 3.500000 13.000000 121.742264 3.500000 13.100000 123.949847 3.500000 13.200000 126.177430 3.500000 13.300000 128.425012 3.500000 13.400000 130.692595 3.500000 13.500000 132.980177 3.500000 13.600000 135.287760 3.500000 13.700000 137.615342 3.500000 13.800000 139.962925 3.500000 13.900000 142.330507 3.500000 14.000000 144.718090 3.500000 14.100000 147.125673 3.500000 14.200000 149.553255 3.500000 14.300000 152.000838 3.500000 14.400000 154.468420 3.500000 14.500000 156.956003 3.500000 14.600000 159.463585 3.500000 14.700000 161.991168 3.500000 14.800000 164.538750 3.500000 14.900000 167.106333 3.500000 15.000000 169.693916 3.600000 -5.000000 49.617434 3.600000 -4.900000 48.238503 3.600000 -4.800000 46.879573 3.600000 -4.700000 45.540642 3.600000 -4.600000 44.221711 3.600000 -4.500000 42.922781 3.600000 -4.400000 41.643850 3.600000 -4.300000 40.384919 3.600000 -4.200000 39.145989 3.600000 -4.100000 37.927058 3.600000 -4.000000 36.728127 3.600000 -3.900000 35.549197 3.600000 -3.800000 34.390266 3.600000 -3.700000 33.251335 3.600000 -3.600000 32.132405 3.600000 -3.500000 31.033474 3.600000 -3.400000 29.954543 3.600000 -3.300000 28.895613 3.600000 -3.200000 27.856682 3.600000 -3.100000 26.837751 3.600000 -3.000000 25.838821 3.600000 -2.900000 24.859890 3.600000 -2.800000 23.900959 3.600000 -2.700000 22.962029 3.600000 -2.600000 22.043098 3.600000 -2.500000 21.144168 3.600000 -2.400000 20.265237 3.600000 -2.300000 19.406306 3.600000 -2.200000 18.567376 3.600000 -2.100000 17.748445 3.600000 -2.000000 16.949514 3.600000 -1.900000 16.170584 3.600000 -1.800000 15.411653 3.600000 -1.700000 14.672722 3.600000 -1.600000 13.953792 3.600000 -1.500000 13.254861 3.600000 -1.400000 12.575930 3.600000 -1.300000 11.917000 3.600000 -1.200000 11.278069 3.600000 -1.100000 10.659138 3.600000 -1.000000 10.060208 3.600000 -0.900000 9.481277 3.600000 -0.800000 8.922346 3.600000 -0.700000 8.383416 3.600000 -0.600000 7.864485 3.600000 -0.500000 7.365554 3.600000 -0.400000 6.886624 3.600000 -0.300000 6.427693 3.600000 -0.200000 5.988762 3.600000 -0.100000 5.569832 3.600000 -0.000000 5.170901 3.600000 0.100000 4.791970 3.600000 0.200000 4.433040 3.600000 0.300000 4.094109 3.600000 0.400000 3.775178 3.600000 0.500000 3.476248 3.600000 0.600000 3.197317 3.600000 0.700000 2.938386 3.600000 0.800000 2.699456 3.600000 0.900000 2.480525 3.600000 1.000000 2.281595 3.600000 1.100000 2.102664 3.600000 1.200000 1.943733 3.600000 1.300000 1.804803 3.600000 1.400000 1.685872 3.600000 1.500000 1.586941 3.600000 1.600000 1.508011 3.600000 1.700000 1.449080 3.600000 1.800000 1.410149 3.600000 1.900000 1.391219 3.600000 2.000000 1.392288 3.600000 2.100000 1.413357 3.600000 2.200000 1.454427 3.600000 2.300000 1.515496 3.600000 2.400000 1.596565 3.600000 2.500000 1.697635 3.600000 2.600000 1.818704 3.600000 2.700000 1.959773 3.600000 2.800000 2.120843 3.600000 2.900000 2.301912 3.600000 3.000000 2.502981 3.600000 3.100000 2.724051 3.600000 3.200000 2.965120 3.600000 3.300000 3.226189 3.600000 3.400000 3.507259 3.600000 3.500000 3.808328 3.600000 3.600000 4.129397 3.600000 3.700000 4.470467 3.600000 3.800000 4.831536 3.600000 3.900000 5.212605 3.600000 4.000000 5.613675 3.600000 4.100000 6.034744 3.600000 4.200000 6.475813 3.600000 4.300000 6.936883 3.600000 4.400000 7.417952 3.600000 4.500000 7.919021 3.600000 4.600000 8.440091 3.600000 4.700000 8.981160 3.600000 4.800000 9.542230 3.600000 4.900000 10.123299 3.600000 5.000000 10.724368 3.600000 5.100000 11.345438 3.600000 5.200000 11.986507 3.600000 5.300000 12.647576 3.600000 5.400000 13.328646 3.600000 5.500000 14.029715 3.600000 5.600000 14.750784 3.600000 5.700000 15.491854 3.600000 5.800000 16.252923 3.600000 5.900000 17.033992 3.600000 6.000000 17.835062 3.600000 6.100000 18.656131 3.600000 6.200000 19.497200 3.600000 6.300000 20.358270 3.600000 6.400000 21.239339 3.600000 6.500000 22.140408 3.600000 6.600000 23.061478 3.600000 6.700000 24.002547 3.600000 6.800000 24.963616 3.600000 6.900000 25.944686 3.600000 7.000000 26.945755 3.600000 7.100000 27.966824 3.600000 7.200000 29.007894 3.600000 7.300000 30.068963 3.600000 7.400000 31.150032 3.600000 7.500000 32.251102 3.600000 7.600000 33.372171 3.600000 7.700000 34.513240 3.600000 7.800000 35.674310 3.600000 7.900000 36.855379 3.600000 8.000000 38.056448 3.600000 8.100000 39.277518 3.600000 8.200000 40.518587 3.600000 8.300000 41.779657 3.600000 8.400000 43.060726 3.600000 8.500000 44.361795 3.600000 8.600000 45.682865 3.600000 8.700000 47.023934 3.600000 8.800000 48.385003 3.600000 8.900000 49.766073 3.600000 9.000000 51.167142 3.600000 9.100000 52.588211 3.600000 9.200000 54.029281 3.600000 9.300000 55.490350 3.600000 9.400000 56.971419 3.600000 9.500000 58.472489 3.600000 9.600000 59.993558 3.600000 9.700000 61.534627 3.600000 9.800000 63.095697 3.600000 9.900000 64.676766 3.600000 10.000000 66.277835 3.600000 10.100000 67.898905 3.600000 10.200000 69.539974 3.600000 10.300000 71.201043 3.600000 10.400000 72.882113 3.600000 10.500000 74.583182 3.600000 10.600000 76.304251 3.600000 10.700000 78.045321 3.600000 10.800000 79.806390 3.600000 10.900000 81.587459 3.600000 11.000000 83.388529 3.600000 11.100000 85.209598 3.600000 11.200000 87.050667 3.600000 11.300000 88.911737 3.600000 11.400000 90.792806 3.600000 11.500000 92.693875 3.600000 11.600000 94.614945 3.600000 11.700000 96.556014 3.600000 11.800000 98.517084 3.600000 11.900000 100.498153 3.600000 12.000000 102.499222 3.600000 12.100000 104.520292 3.600000 12.200000 106.561361 3.600000 12.300000 108.622430 3.600000 12.400000 110.703500 3.600000 12.500000 112.804569 3.600000 12.600000 114.925638 3.600000 12.700000 117.066708 3.600000 12.800000 119.227777 3.600000 12.900000 121.408846 3.600000 13.000000 123.609916 3.600000 13.100000 125.830985 3.600000 13.200000 128.072054 3.600000 13.300000 130.333124 3.600000 13.400000 132.614193 3.600000 13.500000 134.915262 3.600000 13.600000 137.236332 3.600000 13.700000 139.577401 3.600000 13.800000 141.938470 3.600000 13.900000 144.319540 3.600000 14.000000 146.720609 3.600000 14.100000 149.141678 3.600000 14.200000 151.582748 3.600000 14.300000 154.043817 3.600000 14.400000 156.524886 3.600000 14.500000 159.025956 3.600000 14.600000 161.547025 3.600000 14.700000 164.088094 3.600000 14.800000 166.649164 3.600000 14.900000 169.230233 3.600000 15.000000 171.831302 3.700000 -5.000000 49.188138 3.700000 -4.900000 47.822177 3.700000 -4.800000 46.476217 3.700000 -4.700000 45.150256 3.700000 -4.600000 43.844295 3.700000 -4.500000 42.558335 3.700000 -4.400000 41.292374 3.700000 -4.300000 40.046414 3.700000 -4.200000 38.820453 3.700000 -4.100000 37.614492 3.700000 -4.000000 36.428532 3.700000 -3.900000 35.262571 3.700000 -3.800000 34.116610 3.700000 -3.700000 32.990650 3.700000 -3.600000 31.884689 3.700000 -3.500000 30.798729 3.700000 -3.400000 29.732768 3.700000 -3.300000 28.686807 3.700000 -3.200000 27.660847 3.700000 -3.100000 26.654886 3.700000 -3.000000 25.668926 3.700000 -2.900000 24.702965 3.700000 -2.800000 23.757004 3.700000 -2.700000 22.831044 3.700000 -2.600000 21.925083 3.700000 -2.500000 21.039123 3.700000 -2.400000 20.173162 3.700000 -2.300000 19.327201 3.700000 -2.200000 18.501241 3.700000 -2.100000 17.695280 3.700000 -2.000000 16.909320 3.700000 -1.900000 16.143359 3.700000 -1.800000 15.397398 3.700000 -1.700000 14.671438 3.700000 -1.600000 13.965477 3.700000 -1.500000 13.279517 3.700000 -1.400000 12.613556 3.700000 -1.300000 11.967595 3.700000 -1.200000 11.341635 3.700000 -1.100000 10.735674 3.700000 -1.000000 10.149713 3.700000 -0.900000 9.583753 3.700000 -0.800000 9.037792 3.700000 -0.700000 8.511832 3.700000 -0.600000 8.005871 3.700000 -0.500000 7.519910 3.700000 -0.400000 7.053950 3.700000 -0.300000 6.607989 3.700000 -0.200000 6.182029 3.700000 -0.100000 5.776068 3.700000 -0.000000 5.390107 3.700000 0.100000 5.024147 3.700000 0.200000 4.678186 3.700000 0.300000 4.352226 3.700000 0.400000 4.046265 3.700000 0.500000 3.760304 3.700000 0.600000 3.494344 3.700000 0.700000 3.248383 3.700000 0.800000 3.022423 3.700000 0.900000 2.816462 3.700000 1.000000 2.630501 3.700000 1.100000 2.464541 3.700000 1.200000 2.318580 3.700000 1.300000 2.192620 3.700000 1.400000 2.086659 3.700000 1.500000 2.000698 3.700000 1.600000 1.934738 3.700000 1.700000 1.888777 3.700000 1.800000 1.862816 3.700000 1.900000 1.856856 3.700000 2.000000 1.870895 3.700000 2.100000 1.904935 3.700000 2.200000 1.958974 3.700000 2.300000 2.033013 3.700000 2.400000 2.127053 3.700000 2.500000 2.241092 3.700000 2.600000 2.375132 3.700000 2.700000 2.529171 3.700000 2.800000 2.703210 3.700000 2.900000 2.897250 3.700000 3.000000 3.111289 3.700000 3.100000 3.345329 3.700000 3.200000 3.599368 3.700000 3.300000 3.873407 3.700000 3.400000 4.167447 3.700000 3.500000 4.481486 3.700000 3.600000 4.815526 3.700000 3.700000 5.169565 3.700000 3.800000 5.543604 3.700000 3.900000 5.937644 3.700000 4.000000 6.351683 3.700000 4.100000 6.785723 3.700000 4.200000 7.239762 3.700000 4.300000 7.713801 3.700000 4.400000 8.207841 3.700000 4.500000 8.721880 3.700000 4.600000 9.255919 3.700000 4.700000 9.809959 3.700000 4.800000 10.383998 3.700000 4.900000 10.978038 3.700000 5.000000 11.592077 3.700000 5.100000 12.226116 3.700000 5.200000 12.880156 3.700000 5.300000 13.554195 3.700000 5.400000 14.248235 3.700000 5.500000 14.962274 3.700000 5.600000 15.696313 3.700000 5.700000 16.450353 3.700000 5.800000 17.224392 3.700000 5.900000 18.018432 3.700000 6.000000 18.832471 3.700000 6.100000 19.666510 3.700000 6.200000 20.520550 3.700000 6.300000 21.394589 3.700000 6.400000 22.288629 3.700000 6.500000 23.202668 3.700000 6.600000 24.136707 3.700000 6.700000 25.090747 3.700000 6.800000 26.064786 3.700000 6.900000 27.058826 3.700000 7.000000 28.072865 3.700000 7.100000 29.106904 3.700000 7.200000 30.160944 3.700000 7.300000 31.234983 3.700000 7.400000 32.329022 3.700000 7.500000 33.443062 3.700000 7.600000 34.577101 3.700000 7.700000 35.731141 3.700000 7.800000 36.905180 3.700000 7.900000 38.099219 3.700000 8.000000 39.313259 3.700000 8.100000 40.547298 3.700000 8.200000 41.801338 3.700000 8.300000 43.075377 3.700000 8.400000 44.369416 3.700000 8.500000 45.683456 3.700000 8.600000 47.017495 3.700000 8.700000 48.371535 3.700000 8.800000 49.745574 3.700000 8.900000 51.139613 3.700000 9.000000 52.553653 3.700000 9.100000 53.987692 3.700000 9.200000 55.441732 3.700000 9.300000 56.915771 3.700000 9.400000 58.409810 3.700000 9.500000 59.923850 3.700000 9.600000 61.457889 3.700000 9.700000 63.011929 3.700000 9.800000 64.585968 3.700000 9.900000 66.180007 3.700000 10.000000 67.794047 3.700000 10.100000 69.428086 3.700000 10.200000 71.082125 3.700000 10.300000 72.756165 3.700000 10.400000 74.450204 3.700000 10.500000 76.164244 3.700000 10.600000 77.898283 3.700000 10.700000 79.652322 3.700000 10.800000 81.426362 3.700000 10.900000 83.220401 3.700000 11.000000 85.034441 3.700000 11.100000 86.868480 3.700000 11.200000 88.722519 3.700000 11.300000 90.596559 3.700000 11.400000 92.490598 3.700000 11.500000 94.404638 3.700000 11.600000 96.338677 3.700000 11.700000 98.292716 3.700000 11.800000 100.266756 3.700000 11.900000 102.260795 3.700000 12.000000 104.274835 3.700000 12.100000 106.308874 3.700000 12.200000 108.362913 3.700000 12.300000 110.436953 3.700000 12.400000 112.530992 3.700000 12.500000 114.645032 3.700000 12.600000 116.779071 3.700000 12.700000 118.933110 3.700000 12.800000 121.107150 3.700000 12.900000 123.301189 3.700000 13.000000 125.515228 3.700000 13.100000 127.749268 3.700000 13.200000 130.003307 3.700000 13.300000 132.277347 3.700000 13.400000 134.571386 3.700000 13.500000 136.885425 3.700000 13.600000 139.219465 3.700000 13.700000 141.573504 3.700000 13.800000 143.947544 3.700000 13.900000 146.341583 3.700000 14.000000 148.755622 3.700000 14.100000 151.189662 3.700000 14.200000 153.643701 3.700000 14.300000 156.117741 3.700000 14.400000 158.611780 3.700000 14.500000 161.125819 3.700000 14.600000 163.659859 3.700000 14.700000 166.213898 3.700000 14.800000 168.787938 3.700000 14.900000 171.381977 3.700000 15.000000 173.996016 3.800000 -5.000000 48.883843 3.800000 -4.900000 47.530335 3.800000 -4.800000 46.196828 3.800000 -4.700000 44.883321 3.800000 -4.600000 43.589813 3.800000 -4.500000 42.316306 3.800000 -4.400000 41.062799 3.800000 -4.300000 39.829291 3.800000 -4.200000 38.615784 3.800000 -4.100000 37.422277 3.800000 -4.000000 36.248770 3.800000 -3.900000 35.095262 3.800000 -3.800000 33.961755 3.800000 -3.700000 32.848248 3.800000 -3.600000 31.754740 3.800000 -3.500000 30.681233 3.800000 -3.400000 29.627726 3.800000 -3.300000 28.594219 3.800000 -3.200000 27.580711 3.800000 -3.100000 26.587204 3.800000 -3.000000 25.613697 3.800000 -2.900000 24.660189 3.800000 -2.800000 23.726682 3.800000 -2.700000 22.813175 3.800000 -2.600000 21.919667 3.800000 -2.500000 21.046160 3.800000 -2.400000 20.192653 3.800000 -2.300000 19.359146 3.800000 -2.200000 18.545638 3.800000 -2.100000 17.752131 3.800000 -2.000000 16.978624 3.800000 -1.900000 16.225116 3.800000 -1.800000 15.491609 3.800000 -1.700000 14.778102 3.800000 -1.600000 14.084594 3.800000 -1.500000 13.411087 3.800000 -1.400000 12.757580 3.800000 -1.300000 12.124073 3.800000 -1.200000 11.510565 3.800000 -1.100000 10.917058 3.800000 -1.000000 10.343551 3.800000 -0.900000 9.790043 3.800000 -0.800000 9.256536 3.800000 -0.700000 8.743029 3.800000 -0.600000 8.249522 3.800000 -0.500000 7.776014 3.800000 -0.400000 7.322507 3.800000 -0.300000 6.889000 3.800000 -0.200000 6.475492 3.800000 -0.100000 6.081985 3.800000 -0.000000 5.708478 3.800000 0.100000 5.354970 3.800000 0.200000 5.021463 3.800000 0.300000 4.707956 3.800000 0.400000 4.414449 3.800000 0.500000 4.140941 3.800000 0.600000 3.887434 3.800000 0.700000 3.653927 3.800000 0.800000 3.440419 3.800000 0.900000 3.246912 3.800000 1.000000 3.073405 3.800000 1.100000 2.919898 3.800000 1.200000 2.786390 3.800000 1.300000 2.672883 3.800000 1.400000 2.579376 3.800000 1.500000 2.505868 3.800000 1.600000 2.452361 3.800000 1.700000 2.418854 3.800000 1.800000 2.405346 3.800000 1.900000 2.411839 3.800000 2.000000 2.438332 3.800000 2.100000 2.484825 3.800000 2.200000 2.551317 3.800000 2.300000 2.637810 3.800000 2.400000 2.744303 3.800000 2.500000 2.870795 3.800000 2.600000 3.017288 3.800000 2.700000 3.183781 3.800000 2.800000 3.370274 3.800000 2.900000 3.576766 3.800000 3.000000 3.803259 3.800000 3.100000 4.049752 3.800000 3.200000 4.316244 3.800000 3.300000 4.602737 3.800000 3.400000 4.909230 3.800000 3.500000 5.235722 3.800000 3.600000 5.582215 3.800000 3.700000 5.948708 3.800000 3.800000 6.335201 3.800000 3.900000 6.741693 3.800000 4.000000 7.168186 3.800000 4.100000 7.614679 3.800000 4.200000 8.081171 3.800000 4.300000 8.567664 3.800000 4.400000 9.074157 3.800000 4.500000 9.600649 3.800000 4.600000 10.147142 3.800000 4.700000 10.713635 3.800000 4.800000 11.300128 3.800000 4.900000 11.906620 3.800000 5.000000 12.533113 3.800000 5.100000 13.179606 3.800000 5.200000 13.846098 3.800000 5.300000 14.532591 3.800000 5.400000 15.239084 3.800000 5.500000 15.965577 3.800000 5.600000 16.712069 3.800000 5.700000 17.478562 3.800000 5.800000 18.265055 3.800000 5.900000 19.071547 3.800000 6.000000 19.898040 3.800000 6.100000 20.744533 3.800000 6.200000 21.611025 3.800000 6.300000 22.497518 3.800000 6.400000 23.404011 3.800000 6.500000 24.330504 3.800000 6.600000 25.276996 3.800000 6.700000 26.243489 3.800000 6.800000 27.229982 3.800000 6.900000 28.236474 3.800000 7.000000 29.262967 3.800000 7.100000 30.309460 3.800000 7.200000 31.375953 3.800000 7.300000 32.462445 3.800000 7.400000 33.568938 3.800000 7.500000 34.695431 3.800000 7.600000 35.841923 3.800000 7.700000 37.008416 3.800000 7.800000 38.194909 3.800000 7.900000 39.401401 3.800000 8.000000 40.627894 3.800000 8.100000 41.874387 3.800000 8.200000 43.140880 3.800000 8.300000 44.427372 3.800000 8.400000 45.733865 3.800000 8.500000 47.060358 3.800000 8.600000 48.406850 3.800000 8.700000 49.773343 3.800000 8.800000 51.159836 3.800000 8.900000 52.566329 3.800000 9.000000 53.992821 3.800000 9.100000 55.439314 3.800000 9.200000 56.905807 3.800000 9.300000 58.392299 3.800000 9.400000 59.898792 3.800000 9.500000 61.425285 3.800000 9.600000 62.971777 3.800000 9.700000 64.538270 3.800000 9.800000 66.124763 3.800000 9.900000 67.731256 3.800000 10.000000 69.357748 3.800000 10.100000 71.004241 3.800000 10.200000 72.670734 3.800000 10.300000 74.357226 3.800000 10.400000 76.063719 3.800000 10.500000 77.790212 3.800000 10.600000 79.536705 3.800000 10.700000 81.303197 3.800000 10.800000 83.089690 3.800000 10.900000 84.896183 3.800000 11.000000 86.722675 3.800000 11.100000 88.569168 3.800000 11.200000 90.435661 3.800000 11.300000 92.322153 3.800000 11.400000 94.228646 3.800000 11.500000 96.155139 3.800000 11.600000 98.101632 3.800000 11.700000 100.068124 3.800000 11.800000 102.054617 3.800000 11.900000 104.061110 3.800000 12.000000 106.087602 3.800000 12.100000 108.134095 3.800000 12.200000 110.200588 3.800000 12.300000 112.287080 3.800000 12.400000 114.393573 3.800000 12.500000 116.520066 3.800000 12.600000 118.666559 3.800000 12.700000 120.833051 3.800000 12.800000 123.019544 3.800000 12.900000 125.226037 3.800000 13.000000 127.452529 3.800000 13.100000 129.699022 3.800000 13.200000 131.965515 3.800000 13.300000 134.252008 3.800000 13.400000 136.558500 3.800000 13.500000 138.884993 3.800000 13.600000 141.231486 3.800000 13.700000 143.597978 3.800000 13.800000 145.984471 3.800000 13.900000 148.390964 3.800000 14.000000 150.817456 3.800000 14.100000 153.263949 3.800000 14.200000 155.730442 3.800000 14.300000 158.216935 3.800000 14.400000 160.723427 3.800000 14.500000 163.249920 3.800000 14.600000 165.796413 3.800000 14.700000 168.362905 3.800000 14.800000 170.949398 3.800000 14.900000 173.555891 3.800000 15.000000 176.182384 3.900000 -5.000000 48.698102 3.900000 -4.900000 47.356531 3.900000 -4.800000 46.034960 3.900000 -4.700000 44.733389 3.900000 -4.600000 43.451819 3.900000 -4.500000 42.190248 3.900000 -4.400000 40.948677 3.900000 -4.300000 39.727107 3.900000 -4.200000 38.525536 3.900000 -4.100000 37.343965 3.900000 -4.000000 36.182394 3.900000 -3.900000 35.040824 3.900000 -3.800000 33.919253 3.900000 -3.700000 32.817682 3.900000 -3.600000 31.736111 3.900000 -3.500000 30.674541 3.900000 -3.400000 29.632970 3.900000 -3.300000 28.611399 3.900000 -3.200000 27.609829 3.900000 -3.100000 26.628258 3.900000 -3.000000 25.666687 3.900000 -2.900000 24.725116 3.900000 -2.800000 23.803546 3.900000 -2.700000 22.901975 3.900000 -2.600000 22.020404 3.900000 -2.500000 21.158834 3.900000 -2.400000 20.317263 3.900000 -2.300000 19.495692 3.900000 -2.200000 18.694121 3.900000 -2.100000 17.912551 3.900000 -2.000000 17.150980 3.900000 -1.900000 16.409409 3.900000 -1.800000 15.687839 3.900000 -1.700000 14.986268 3.900000 -1.600000 14.304697 3.900000 -1.500000 13.643126 3.900000 -1.400000 13.001556 3.900000 -1.300000 12.379985 3.900000 -1.200000 11.778414 3.900000 -1.100000 11.196843 3.900000 -1.000000 10.635273 3.900000 -0.900000 10.093702 3.900000 -0.800000 9.572131 3.900000 -0.700000 9.070561 3.900000 -0.600000 8.588990 3.900000 -0.500000 8.127419 3.900000 -0.400000 7.685848 3.900000 -0.300000 7.264278 3.900000 -0.200000 6.862707 3.900000 -0.100000 6.481136 3.900000 -0.000000 6.119566 3.900000 0.100000 5.777995 3.900000 0.200000 5.456424 3.900000 0.300000 5.154853 3.900000 0.400000 4.873283 3.900000 0.500000 4.611712 3.900000 0.600000 4.370141 3.900000 0.700000 4.148570 3.900000 0.800000 3.947000 3.900000 0.900000 3.765429 3.900000 1.000000 3.603858 3.900000 1.100000 3.462288 3.900000 1.200000 3.340717 3.900000 1.300000 3.239146 3.900000 1.400000 3.157575 3.900000 1.500000 3.096005 3.900000 1.600000 3.054434 3.900000 1.700000 3.032863 3.900000 1.800000 3.031293 3.900000 1.900000 3.049722 3.900000 2.000000 3.088151 3.900000 2.100000 3.146580 3.900000 2.200000 3.225010 3.900000 2.300000 3.323439 3.900000 2.400000 3.441868 3.900000 2.500000 3.580298 3.900000 2.600000 3.738727 3.900000 2.700000 3.917156 3.900000 2.800000 4.115585 3.900000 2.900000 4.334015 3.900000 3.000000 4.572444 3.900000 3.100000 4.830873 3.900000 3.200000 5.109302 3.900000 3.300000 5.407732 3.900000 3.400000 5.726161 3.900000 3.500000 6.064590 3.900000 3.600000 6.423020 3.900000 3.700000 6.801449 3.900000 3.800000 7.199878 3.900000 3.900000 7.618307 3.900000 4.000000 8.056737 3.900000 4.100000 8.515166 3.900000 4.200000 8.993595 3.900000 4.300000 9.492025 3.900000 4.400000 10.010454 3.900000 4.500000 10.548883 3.900000 4.600000 11.107312 3.900000 4.700000 11.685742 3.900000 4.800000 12.284171 3.900000 4.900000 12.902600 3.900000 5.000000 13.541030 3.900000 5.100000 14.199459 3.900000 5.200000 14.877888 3.900000 5.300000 15.576317 3.900000 5.400000 16.294747 3.900000 5.500000 17.033176 3.900000 5.600000 17.791605 3.900000 5.700000 18.570034 3.900000 5.800000 19.368464 3.900000 5.900000 20.186893 3.900000 6.000000 21.025322 3.900000 6.100000 21.883752 3.900000 6.200000 22.762181 3.900000 6.300000 23.660610 3.900000 6.400000 24.579039 3.900000 6.500000 25.517469 3.900000 6.600000 26.475898 3.900000 6.700000 27.454327 3.900000 6.800000 28.452757 3.900000 6.900000 29.471186 3.900000 7.000000 30.509615 3.900000 7.100000 31.568044 3.900000 7.200000 32.646474 3.900000 7.300000 33.744903 3.900000 7.400000 34.863332 3.900000 7.500000 36.001761 3.900000 7.600000 37.160191 3.900000 7.700000 38.338620 3.900000 7.800000 39.537049 3.900000 7.900000 40.755479 3.900000 8.000000 41.993908 3.900000 8.100000 43.252337 3.900000 8.200000 44.530766 3.900000 8.300000 45.829196 3.900000 8.400000 47.147625 3.900000 8.500000 48.486054 3.900000 8.600000 49.844484 3.900000 8.700000 51.222913 3.900000 8.800000 52.621342 3.900000 8.900000 54.039771 3.900000 9.000000 55.478201 3.900000 9.100000 56.936630 3.900000 9.200000 58.415059 3.900000 9.300000 59.913489 3.900000 9.400000 61.431918 3.900000 9.500000 62.970347 3.900000 9.600000 64.528776 3.900000 9.700000 66.107206 3.900000 9.800000 67.705635 3.900000 9.900000 69.324064 3.900000 10.000000 70.962493 3.900000 10.100000 72.620923 3.900000 10.200000 74.299352 3.900000 10.300000 75.997781 3.900000 10.400000 77.716211 3.900000 10.500000 79.454640 3.900000 10.600000 81.213069 3.900000 10.700000 82.991498 3.900000 10.800000 84.789928 3.900000 10.900000 86.608357 3.900000 11.000000 88.446786 3.900000 11.100000 90.305216 3.900000 11.200000 92.183645 3.900000 11.300000 94.082074 3.900000 11.400000 96.000503 3.900000 11.500000 97.938933 3.900000 11.600000 99.897362 3.900000 11.700000 101.875791 3.900000 11.800000 103.874220 3.900000 11.900000 105.892650 3.900000 12.000000 107.931079 3.900000 12.100000 109.989508 3.900000 12.200000 112.067938 3.900000 12.300000 114.166367 3.900000 12.400000 116.284796 3.900000 12.500000 118.423225 3.900000 12.600000 120.581655 3.900000 12.700000 122.760084 3.900000 12.800000 124.958513 3.900000 12.900000 127.176943 3.900000 13.000000 129.415372 3.900000 13.100000 131.673801 3.900000 13.200000 133.952230 3.900000 13.300000 136.250660 3.900000 13.400000 138.569089 3.900000 13.500000 140.907518 3.900000 13.600000 143.265948 3.900000 13.700000 145.644377 3.900000 13.800000 148.042806 3.900000 13.900000 150.461235 3.900000 14.000000 152.899665 3.900000 14.100000 155.358094 3.900000 14.200000 157.836523 3.900000 14.300000 160.334952 3.900000 14.400000 162.853382 3.900000 14.500000 165.391811 3.900000 14.600000 167.950240 3.900000 14.700000 170.528670 3.900000 14.800000 173.127099 3.900000 14.900000 175.745528 3.900000 15.000000 178.383957 4.000000 -5.000000 48.623750 4.000000 -4.900000 47.293599 4.000000 -4.800000 45.983448 4.000000 -4.700000 44.693298 4.000000 -4.600000 43.423147 4.000000 -4.500000 42.172996 4.000000 -4.400000 40.942845 4.000000 -4.300000 39.732694 4.000000 -4.200000 38.542543 4.000000 -4.100000 37.372392 4.000000 -4.000000 36.222241 4.000000 -3.900000 35.092090 4.000000 -3.800000 33.981940 4.000000 -3.700000 32.891789 4.000000 -3.600000 31.821638 4.000000 -3.500000 30.771487 4.000000 -3.400000 29.741336 4.000000 -3.300000 28.731185 4.000000 -3.200000 27.741034 4.000000 -3.100000 26.770883 4.000000 -3.000000 25.820732 4.000000 -2.900000 24.890582 4.000000 -2.800000 23.980431 4.000000 -2.700000 23.090280 4.000000 -2.600000 22.220129 4.000000 -2.500000 21.369978 4.000000 -2.400000 20.539827 4.000000 -2.300000 19.729676 4.000000 -2.200000 18.939525 4.000000 -2.100000 18.169375 4.000000 -2.000000 17.419224 4.000000 -1.900000 16.689073 4.000000 -1.800000 15.978922 4.000000 -1.700000 15.288771 4.000000 -1.600000 14.618620 4.000000 -1.500000 13.968469 4.000000 -1.400000 13.338318 4.000000 -1.300000 12.728167 4.000000 -1.200000 12.138017 4.000000 -1.100000 11.567866 4.000000 -1.000000 11.017715 4.000000 -0.900000 10.487564 4.000000 -0.800000 9.977413 4.000000 -0.700000 9.487262 4.000000 -0.600000 9.017111 4.000000 -0.500000 8.566960 4.000000 -0.400000 8.136809 4.000000 -0.300000 7.726659 4.000000 -0.200000 7.336508 4.000000 -0.100000 6.966357 4.000000 -0.000000 6.616206 4.000000 0.100000 6.286055 4.000000 0.200000 5.975904 4.000000 0.300000 5.685753 4.000000 0.400000 5.415602 4.000000 0.500000 5.165452 4.000000 0.600000 4.935301 4.000000 0.700000 4.725150 4.000000 0.800000 4.534999 4.000000 0.900000 4.364848 4.000000 1.000000 4.214697 4.000000 1.100000 4.084546 4.000000 1.200000 3.974395 4.000000 1.300000 3.884244 4.000000 1.400000 3.814094 4.000000 1.500000 3.763943 4.000000 1.600000 3.733792 4.000000 1.700000 3.723641 4.000000 1.800000 3.733490 4.000000 1.900000 3.763339 4.000000 2.000000 3.813188 4.000000 2.100000 3.883037 4.000000 2.200000 3.972886 4.000000 2.300000 4.082736 4.000000 2.400000 4.212585 4.000000 2.500000 4.362434 4.000000 2.600000 4.532283 4.000000 2.700000 4.722132 4.000000 2.800000 4.931981 4.000000 2.900000 5.161830 4.000000 3.000000 5.411679 4.000000 3.100000 5.681529 4.000000 3.200000 5.971378 4.000000 3.300000 6.281227 4.000000 3.400000 6.611076 4.000000 3.500000 6.960925 4.000000 3.600000 7.330774 4.000000 3.700000 7.720623 4.000000 3.800000 8.130472 4.000000 3.900000 8.560321 4.000000 4.000000 9.010171 4.000000 4.100000 9.480020 4.000000 4.200000 9.969869 4.000000 4.300000 10.479718 4.000000 4.400000 11.009567 4.000000 4.500000 11.559416 4.000000 4.600000 12.129265 4.000000 4.700000 12.719114 4.000000 4.800000 13.328963 4.000000 4.900000 13.958813 4.000000 5.000000 14.608662 4.000000 5.100000 15.278511 4.000000 5.200000 15.968360 4.000000 5.300000 16.678209 4.000000 5.400000 17.408058 4.000000 5.500000 18.157907 4.000000 5.600000 18.927756 4.000000 5.700000 19.717606 4.000000 5.800000 20.527455 4.000000 5.900000 21.357304 4.000000 6.000000 22.207153 4.000000 6.100000 23.077002 4.000000 6.200000 23.966851 4.000000 6.300000 24.876700 4.000000 6.400000 25.806549 4.000000 6.500000 26.756398 4.000000 6.600000 27.726248 4.000000 6.700000 28.716097 4.000000 6.800000 29.725946 4.000000 6.900000 30.755795 4.000000 7.000000 31.805644 4.000000 7.100000 32.875493 4.000000 7.200000 33.965342 4.000000 7.300000 35.075191 4.000000 7.400000 36.205040 4.000000 7.500000 37.354890 4.000000 7.600000 38.524739 4.000000 7.700000 39.714588 4.000000 7.800000 40.924437 4.000000 7.900000 42.154286 4.000000 8.000000 43.404135 4.000000 8.100000 44.673984 4.000000 8.200000 45.963833 4.000000 8.300000 47.273683 4.000000 8.400000 48.603532 4.000000 8.500000 49.953381 4.000000 8.600000 51.323230 4.000000 8.700000 52.713079 4.000000 8.800000 54.122928 4.000000 8.900000 55.552777 4.000000 9.000000 57.002626 4.000000 9.100000 58.472475 4.000000 9.200000 59.962325 4.000000 9.300000 61.472174 4.000000 9.400000 63.002023 4.000000 9.500000 64.551872 4.000000 9.600000 66.121721 4.000000 9.700000 67.711570 4.000000 9.800000 69.321419 4.000000 9.900000 70.951268 4.000000 10.000000 72.601117 4.000000 10.100000 74.270967 4.000000 10.200000 75.960816 4.000000 10.300000 77.670665 4.000000 10.400000 79.400514 4.000000 10.500000 81.150363 4.000000 10.600000 82.920212 4.000000 10.700000 84.710061 4.000000 10.800000 86.519910 4.000000 10.900000 88.349760 4.000000 11.000000 90.199609 4.000000 11.100000 92.069458 4.000000 11.200000 93.959307 4.000000 11.300000 95.869156 4.000000 11.400000 97.799005 4.000000 11.500000 99.748854 4.000000 11.600000 101.718703 4.000000 11.700000 103.708552 4.000000 11.800000 105.718402 4.000000 11.900000 107.748251 4.000000 12.000000 109.798100 4.000000 12.100000 111.867949 4.000000 12.200000 113.957798 4.000000 12.300000 116.067647 4.000000 12.400000 118.197496 4.000000 12.500000 120.347345 4.000000 12.600000 122.517194 4.000000 12.700000 124.707044 4.000000 12.800000 126.916893 4.000000 12.900000 129.146742 4.000000 13.000000 131.396591 4.000000 13.100000 133.666440 4.000000 13.200000 135.956289 4.000000 13.300000 138.266138 4.000000 13.400000 140.595987 4.000000 13.500000 142.945837 4.000000 13.600000 145.315686 4.000000 13.700000 147.705535 4.000000 13.800000 150.115384 4.000000 13.900000 152.545233 4.000000 14.000000 154.995082 4.000000 14.100000 157.464931 4.000000 14.200000 159.954780 4.000000 14.300000 162.464629 4.000000 14.400000 164.994479 4.000000 14.500000 167.544328 4.000000 14.600000 170.114177 4.000000 14.700000 172.704026 4.000000 14.800000 175.313875 4.000000 14.900000 177.943724 4.000000 15.000000 180.593573 4.100000 -5.000000 48.652968 4.100000 -4.900000 47.333720 4.100000 -4.800000 46.034472 4.100000 -4.700000 44.755224 4.100000 -4.600000 43.495977 4.100000 -4.500000 42.256729 4.100000 -4.400000 41.037481 4.100000 -4.300000 39.838233 4.100000 -4.200000 38.658985 4.100000 -4.100000 37.499738 4.100000 -4.000000 36.360490 4.100000 -3.900000 35.241242 4.100000 -3.800000 34.141994 4.100000 -3.700000 33.062746 4.100000 -3.600000 32.003499 4.100000 -3.500000 30.964251 4.100000 -3.400000 29.945003 4.100000 -3.300000 28.945755 4.100000 -3.200000 27.966508 4.100000 -3.100000 27.007260 4.100000 -3.000000 26.068012 4.100000 -2.900000 25.148764 4.100000 -2.800000 24.249516 4.100000 -2.700000 23.370269 4.100000 -2.600000 22.511021 4.100000 -2.500000 21.671773 4.100000 -2.400000 20.852525 4.100000 -2.300000 20.053277 4.100000 -2.200000 19.274030 4.100000 -2.100000 18.514782 4.100000 -2.000000 17.775534 4.100000 -1.900000 17.056286 4.100000 -1.800000 16.357038 4.100000 -1.700000 15.677791 4.100000 -1.600000 15.018543 4.100000 -1.500000 14.379295 4.100000 -1.400000 13.760047 4.100000 -1.300000 13.160800 4.100000 -1.200000 12.581552 4.100000 -1.100000 12.022304 4.100000 -1.000000 11.483056 4.100000 -0.900000 10.963808 4.100000 -0.800000 10.464561 4.100000 -0.700000 9.985313 4.100000 -0.600000 9.526065 4.100000 -0.500000 9.086817 4.100000 -0.400000 8.667569 4.100000 -0.300000 8.268322 4.100000 -0.200000 7.889074 4.100000 -0.100000 7.529826 4.100000 -0.000000 7.190578 4.100000 0.100000 6.871331 4.100000 0.200000 6.572083 4.100000 0.300000 6.292835 4.100000 0.400000 6.033587 4.100000 0.500000 5.794339 4.100000 0.600000 5.575092 4.100000 0.700000 5.375844 4.100000 0.800000 5.196596 4.100000 0.900000 5.037348 4.100000 1.000000 4.898100 4.100000 1.100000 4.778853 4.100000 1.200000 4.679605 4.100000 1.300000 4.600357 4.100000 1.400000 4.541109 4.100000 1.500000 4.501862 4.100000 1.600000 4.482614 4.100000 1.700000 4.483366 4.100000 1.800000 4.504118 4.100000 1.900000 4.544870 4.100000 2.000000 4.605623 4.100000 2.100000 4.686375 4.100000 2.200000 4.787127 4.100000 2.300000 4.907879 4.100000 2.400000 5.048631 4.100000 2.500000 5.209384 4.100000 2.600000 5.390136 4.100000 2.700000 5.590888 4.100000 2.800000 5.811640 4.100000 2.900000 6.052393 4.100000 3.000000 6.313145 4.100000 3.100000 6.593897 4.100000 3.200000 6.894649 4.100000 3.300000 7.215401 4.100000 3.400000 7.556154 4.100000 3.500000 7.916906 4.100000 3.600000 8.297658 4.100000 3.700000 8.698410 4.100000 3.800000 9.119162 4.100000 3.900000 9.559915 4.100000 4.000000 10.020667 4.100000 4.100000 10.501419 4.100000 4.200000 11.002171 4.100000 4.300000 11.522924 4.100000 4.400000 12.063676 4.100000 4.500000 12.624428 4.100000 4.600000 13.205180 4.100000 4.700000 13.805932 4.100000 4.800000 14.426685 4.100000 4.900000 15.067437 4.100000 5.000000 15.728189 4.100000 5.100000 16.408941 4.100000 5.200000 17.109693 4.100000 5.300000 17.830446 4.100000 5.400000 18.571198 4.100000 5.500000 19.331950 4.100000 5.600000 20.112702 4.100000 5.700000 20.913455 4.100000 5.800000 21.734207 4.100000 5.900000 22.574959 4.100000 6.000000 23.435711 4.100000 6.100000 24.316463 4.100000 6.200000 25.217216 4.100000 6.300000 26.137968 4.100000 6.400000 27.078720 4.100000 6.500000 28.039472 4.100000 6.600000 29.020224 4.100000 6.700000 30.020977 4.100000 6.800000 31.041729 4.100000 6.900000 32.082481 4.100000 7.000000 33.143233 4.100000 7.100000 34.223986 4.100000 7.200000 35.324738 4.100000 7.300000 36.445490 4.100000 7.400000 37.586242 4.100000 7.500000 38.746994 4.100000 7.600000 39.927747 4.100000 7.700000 41.128499 4.100000 7.800000 42.349251 4.100000 7.900000 43.590003 4.100000 8.000000 44.850755 4.100000 8.100000 46.131508 4.100000 8.200000 47.432260 4.100000 8.300000 48.753012 4.100000 8.400000 50.093764 4.100000 8.500000 51.454516 4.100000 8.600000 52.835269 4.100000 8.700000 54.236021 4.100000 8.800000 55.656773 4.100000 8.900000 57.097525 4.100000 9.000000 58.558278 4.100000 9.100000 60.039030 4.100000 9.200000 61.539782 4.100000 9.300000 63.060534 4.100000 9.400000 64.601286 4.100000 9.500000 66.162039 4.100000 9.600000 67.742791 4.100000 9.700000 69.343543 4.100000 9.800000 70.964295 4.100000 9.900000 72.605047 4.100000 10.000000 74.265800 4.100000 10.100000 75.946552 4.100000 10.200000 77.647304 4.100000 10.300000 79.368056 4.100000 10.400000 81.108809 4.100000 10.500000 82.869561 4.100000 10.600000 84.650313 4.100000 10.700000 86.451065 4.100000 10.800000 88.271817 4.100000 10.900000 90.112570 4.100000 11.000000 91.973322 4.100000 11.100000 93.854074 4.100000 11.200000 95.754826 4.100000 11.300000 97.675578 4.100000 11.400000 99.616331 4.100000 11.500000 101.577083 4.100000 11.600000 103.557835 4.100000 11.700000 105.558587 4.100000 11.800000 107.579340 4.100000 11.900000 109.620092 4.100000 12.000000 111.680844 4.100000 12.100000 113.761596 4.100000 12.200000 115.862348 4.100000 12.300000 117.983101 4.100000 12.400000 120.123853 4.100000 12.500000 122.284605 4.100000 12.600000 124.465357 4.100000 12.700000 126.666109 4.100000 12.800000 128.886862 4.100000 12.900000 131.127614 4.100000 13.000000 133.388366 4.100000 13.100000 135.669118 4.100000 13.200000 137.969871 4.100000 13.300000 140.290623 4.100000 13.400000 142.631375 4.100000 13.500000 144.992127 4.100000 13.600000 147.372879 4.100000 13.700000 149.773632 4.100000 13.800000 152.194384 4.100000 13.900000 154.635136 4.100000 14.000000 157.095888 4.100000 14.100000 159.576640 4.100000 14.200000 162.077393 4.100000 14.300000 164.598145 4.100000 14.400000 167.138897 4.100000 14.500000 169.699649 4.100000 14.600000 172.280402 4.100000 14.700000 174.881154 4.100000 14.800000 177.501906 4.100000 14.900000 180.142658 4.100000 15.000000 182.803410 4.200000 -5.000000 48.777347 4.200000 -4.900000 47.468485 4.200000 -4.800000 46.179624 4.200000 -4.700000 44.910763 4.200000 -4.600000 43.661901 4.200000 -4.500000 42.433040 4.200000 -4.400000 41.224178 4.200000 -4.300000 40.035317 4.200000 -4.200000 38.866456 4.200000 -4.100000 37.717594 4.200000 -4.000000 36.588733 4.200000 -3.900000 35.479871 4.200000 -3.800000 34.391010 4.200000 -3.700000 33.322148 4.200000 -3.600000 32.273287 4.200000 -3.500000 31.244426 4.200000 -3.400000 30.235564 4.200000 -3.300000 29.246703 4.200000 -3.200000 28.277841 4.200000 -3.100000 27.328980 4.200000 -3.000000 26.400118 4.200000 -2.900000 25.491257 4.200000 -2.800000 24.602396 4.200000 -2.700000 23.733534 4.200000 -2.600000 22.884673 4.200000 -2.500000 22.055811 4.200000 -2.400000 21.246950 4.200000 -2.300000 20.458088 4.200000 -2.200000 19.689227 4.200000 -2.100000 18.940366 4.200000 -2.000000 18.211504 4.200000 -1.900000 17.502643 4.200000 -1.800000 16.813781 4.200000 -1.700000 16.144920 4.200000 -1.600000 15.496058 4.200000 -1.500000 14.867197 4.200000 -1.400000 14.258336 4.200000 -1.300000 13.669474 4.200000 -1.200000 13.100613 4.200000 -1.100000 12.551751 4.200000 -1.000000 12.022890 4.200000 -0.900000 11.514028 4.200000 -0.800000 11.025167 4.200000 -0.700000 10.556306 4.200000 -0.600000 10.107444 4.200000 -0.500000 9.678583 4.200000 -0.400000 9.269721 4.200000 -0.300000 8.880860 4.200000 -0.200000 8.511998 4.200000 -0.100000 8.163137 4.200000 -0.000000 7.834276 4.200000 0.100000 7.525414 4.200000 0.200000 7.236553 4.200000 0.300000 6.967691 4.200000 0.400000 6.718830 4.200000 0.500000 6.489968 4.200000 0.600000 6.281107 4.200000 0.700000 6.092246 4.200000 0.800000 5.923384 4.200000 0.900000 5.774523 4.200000 1.000000 5.645661 4.200000 1.100000 5.536800 4.200000 1.200000 5.447938 4.200000 1.300000 5.379077 4.200000 1.400000 5.330216 4.200000 1.500000 5.301354 4.200000 1.600000 5.292493 4.200000 1.700000 5.303631 4.200000 1.800000 5.334770 4.200000 1.900000 5.385908 4.200000 2.000000 5.457047 4.200000 2.100000 5.548186 4.200000 2.200000 5.659324 4.200000 2.300000 5.790463 4.200000 2.400000 5.941601 4.200000 2.500000 6.112740 4.200000 2.600000 6.303879 4.200000 2.700000 6.515017 4.200000 2.800000 6.746156 4.200000 2.900000 6.997294 4.200000 3.000000 7.268433 4.200000 3.100000 7.559571 4.200000 3.200000 7.870710 4.200000 3.300000 8.201849 4.200000 3.400000 8.552987 4.200000 3.500000 8.924126 4.200000 3.600000 9.315264 4.200000 3.700000 9.726403 4.200000 3.800000 10.157541 4.200000 3.900000 10.608680 4.200000 4.000000 11.079819 4.200000 4.100000 11.570957 4.200000 4.200000 12.082096 4.200000 4.300000 12.613234 4.200000 4.400000 13.164373 4.200000 4.500000 13.735511 4.200000 4.600000 14.326650 4.200000 4.700000 14.937789 4.200000 4.800000 15.568927 4.200000 4.900000 16.220066 4.200000 5.000000 16.891204 4.200000 5.100000 17.582343 4.200000 5.200000 18.293481 4.200000 5.300000 19.024620 4.200000 5.400000 19.775759 4.200000 5.500000 20.546897 4.200000 5.600000 21.338036 4.200000 5.700000 22.149174 4.200000 5.800000 22.980313 4.200000 5.900000 23.831451 4.200000 6.000000 24.702590 4.200000 6.100000 25.593729 4.200000 6.200000 26.504867 4.200000 6.300000 27.436006 4.200000 6.400000 28.387144 4.200000 6.500000 29.358283 4.200000 6.600000 30.349421 4.200000 6.700000 31.360560 4.200000 6.800000 32.391699 4.200000 6.900000 33.442837 4.200000 7.000000 34.513976 4.200000 7.100000 35.605114 4.200000 7.200000 36.716253 4.200000 7.300000 37.847391 4.200000 7.400000 38.998530 4.200000 7.500000 40.169669 4.200000 7.600000 41.360807 4.200000 7.700000 42.571946 4.200000 7.800000 43.803084 4.200000 7.900000 45.054223 4.200000 8.000000 46.325361 4.200000 8.100000 47.616500 4.200000 8.200000 48.927639 4.200000 8.300000 50.258777 4.200000 8.400000 51.609916 4.200000 8.500000 52.981054 4.200000 8.600000 54.372193 4.200000 8.700000 55.783332 4.200000 8.800000 57.214470 4.200000 8.900000 58.665609 4.200000 9.000000 60.136747 4.200000 9.100000 61.627886 4.200000 9.200000 63.139024 4.200000 9.300000 64.670163 4.200000 9.400000 66.221302 4.200000 9.500000 67.792440 4.200000 9.600000 69.383579 4.200000 9.700000 70.994717 4.200000 9.800000 72.625856 4.200000 9.900000 74.276994 4.200000 10.000000 75.948133 4.200000 10.100000 77.639272 4.200000 10.200000 79.350410 4.200000 10.300000 81.081549 4.200000 10.400000 82.832687 4.200000 10.500000 84.603826 4.200000 10.600000 86.394964 4.200000 10.700000 88.206103 4.200000 10.800000 90.037242 4.200000 10.900000 91.888380 4.200000 11.000000 93.759519 4.200000 11.100000 95.650657 4.200000 11.200000 97.561796 4.200000 11.300000 99.492934 4.200000 11.400000 101.444073 4.200000 11.500000 103.415212 4.200000 11.600000 105.406350 4.200000 11.700000 107.417489 4.200000 11.800000 109.448627 4.200000 11.900000 111.499766 4.200000 12.000000 113.570904 4.200000 12.100000 115.662043 4.200000 12.200000 117.773182 4.200000 12.300000 119.904320 4.200000 12.400000 122.055459 4.200000 12.500000 124.226597 4.200000 12.600000 126.417736 4.200000 12.700000 128.628874 4.200000 12.800000 130.860013 4.200000 12.900000 133.111152 4.200000 13.000000 135.382290 4.200000 13.100000 137.673429 4.200000 13.200000 139.984567 4.200000 13.300000 142.315706 4.200000 13.400000 144.666844 4.200000 13.500000 147.037983 4.200000 13.600000 149.429122 4.200000 13.700000 151.840260 4.200000 13.800000 154.271399 4.200000 13.900000 156.722537 4.200000 14.000000 159.193676 4.200000 14.100000 161.684814 4.200000 14.200000 164.195953 4.200000 14.300000 166.727092 4.200000 14.400000 169.278230 4.200000 14.500000 171.849369 4.200000 14.600000 174.440507 4.200000 14.700000 177.051646 4.200000 14.800000 179.682785 4.200000 14.900000 182.333923 4.200000 15.000000 185.005062 4.300000 -5.000000 48.987970 4.300000 -4.900000 47.688978 4.300000 -4.800000 46.409986 4.300000 -4.700000 45.150994 4.300000 -4.600000 43.912003 4.300000 -4.500000 42.693011 4.300000 -4.400000 41.494019 4.300000 -4.300000 40.315027 4.300000 -4.200000 39.156035 4.300000 -4.100000 38.017044 4.300000 -4.000000 36.898052 4.300000 -3.900000 35.799060 4.300000 -3.800000 34.720068 4.300000 -3.700000 33.661076 4.300000 -3.600000 32.622085 4.300000 -3.500000 31.603093 4.300000 -3.400000 30.604101 4.300000 -3.300000 29.625109 4.300000 -3.200000 28.666117 4.300000 -3.100000 27.727126 4.300000 -3.000000 26.808134 4.300000 -2.900000 25.909142 4.300000 -2.800000 25.030150 4.300000 -2.700000 24.171158 4.300000 -2.600000 23.332166 4.300000 -2.500000 22.513175 4.300000 -2.400000 21.714183 4.300000 -2.300000 20.935191 4.300000 -2.200000 20.176199 4.300000 -2.100000 19.437207 4.300000 -2.000000 18.718216 4.300000 -1.900000 18.019224 4.300000 -1.800000 17.340232 4.300000 -1.700000 16.681240 4.300000 -1.600000 16.042248 4.300000 -1.500000 15.423257 4.300000 -1.400000 14.824265 4.300000 -1.300000 14.245273 4.300000 -1.200000 13.686281 4.300000 -1.100000 13.147289 4.300000 -1.000000 12.628298 4.300000 -0.900000 12.129306 4.300000 -0.800000 11.650314 4.300000 -0.700000 11.191322 4.300000 -0.600000 10.752330 4.300000 -0.500000 10.333339 4.300000 -0.400000 9.934347 4.300000 -0.300000 9.555355 4.300000 -0.200000 9.196363 4.300000 -0.100000 8.857371 4.300000 -0.000000 8.538380 4.300000 0.100000 8.239388 4.300000 0.200000 7.960396 4.300000 0.300000 7.701404 4.300000 0.400000 7.462412 4.300000 0.500000 7.243421 4.300000 0.600000 7.044429 4.300000 0.700000 6.865437 4.300000 0.800000 6.706445 4.300000 0.900000 6.567453 4.300000 1.000000 6.448462 4.300000 1.100000 6.349470 4.300000 1.200000 6.270478 4.300000 1.300000 6.211486 4.300000 1.400000 6.172494 4.300000 1.500000 6.153503 4.300000 1.600000 6.154511 4.300000 1.700000 6.175519 4.300000 1.800000 6.216527 4.300000 1.900000 6.277535 4.300000 2.000000 6.358543 4.300000 2.100000 6.459552 4.300000 2.200000 6.580560 4.300000 2.300000 6.721568 4.300000 2.400000 6.882576 4.300000 2.500000 7.063584 4.300000 2.600000 7.264593 4.300000 2.700000 7.485601 4.300000 2.800000 7.726609 4.300000 2.900000 7.987617 4.300000 3.000000 8.268625 4.300000 3.100000 8.569634 4.300000 3.200000 8.890642 4.300000 3.300000 9.231650 4.300000 3.400000 9.592658 4.300000 3.500000 9.973666 4.300000 3.600000 10.374675 4.300000 3.700000 10.795683 4.300000 3.800000 11.236691 4.300000 3.900000 11.697699 4.300000 4.000000 12.178707 4.300000 4.100000 12.679716 4.300000 4.200000 13.200724 4.300000 4.300000 13.741732 4.300000 4.400000 14.302740 4.300000 4.500000 14.883748 4.300000 4.600000 15.484757 4.300000 4.700000 16.105765 4.300000 4.800000 16.746773 4.300000 4.900000 17.407781 4.300000 5.000000 18.088789 4.300000 5.100000 18.789798 4.300000 5.200000 19.510806 4.300000 5.300000 20.251814 4.300000 5.400000 21.012822 4.300000 5.500000 21.793830 4.300000 5.600000 22.594839 4.300000 5.700000 23.415847 4.300000 5.800000 24.256855 4.300000 5.900000 25.117863 4.300000 6.000000 25.998871 4.300000 6.100000 26.899880 4.300000 6.200000 27.820888 4.300000 6.300000 28.761896 4.300000 6.400000 29.722904 4.300000 6.500000 30.703912 4.300000 6.600000 31.704921 4.300000 6.700000 32.725929 4.300000 6.800000 33.766937 4.300000 6.900000 34.827945 4.300000 7.000000 35.908953 4.300000 7.100000 37.009961 4.300000 7.200000 38.130970 4.300000 7.300000 39.271978 4.300000 7.400000 40.432986 4.300000 7.500000 41.613994 4.300000 7.600000 42.815002 4.300000 7.700000 44.036011 4.300000 7.800000 45.277019 4.300000 7.900000 46.538027 4.300000 8.000000 47.819035 4.300000 8.100000 49.120043 4.300000 8.200000 50.441052 4.300000 8.300000 51.782060 4.300000 8.400000 53.143068 4.300000 8.500000 54.524076 4.300000 8.600000 55.925084 4.300000 8.700000 57.346093 4.300000 8.800000 58.787101 4.300000 8.900000 60.248109 4.300000 9.000000 61.729117 4.300000 9.100000 63.230125 4.300000 9.200000 64.751134 4.300000 9.300000 66.292142 4.300000 9.400000 67.853150 4.300000 9.500000 69.434158 4.300000 9.600000 71.035166 4.300000 9.700000 72.656175 4.300000 9.800000 74.297183 4.300000 9.900000 75.958191 4.300000 10.000000 77.639199 4.300000 10.100000 79.340207 4.300000 10.200000 81.061216 4.300000 10.300000 82.802224 4.300000 10.400000 84.563232 4.300000 10.500000 86.344240 4.300000 10.600000 88.145248 4.300000 10.700000 89.966257 4.300000 10.800000 91.807265 4.300000 10.900000 93.668273 4.300000 11.000000 95.549281 4.300000 11.100000 97.450289 4.300000 11.200000 99.371298 4.300000 11.300000 101.312306 4.300000 11.400000 103.273314 4.300000 11.500000 105.254322 4.300000 11.600000 107.255330 4.300000 11.700000 109.276338 4.300000 11.800000 111.317347 4.300000 11.900000 113.378355 4.300000 12.000000 115.459363 4.300000 12.100000 117.560371 4.300000 12.200000 119.681379 4.300000 12.300000 121.822388 4.300000 12.400000 123.983396 4.300000 12.500000 126.164404 4.300000 12.600000 128.365412 4.300000 12.700000 130.586420 4.300000 12.800000 132.827429 4.300000 12.900000 135.088437 4.300000 13.000000 137.369445 4.300000 13.100000 139.670453 4.300000 13.200000 141.991461 4.300000 13.300000 144.332470 4.300000 13.400000 146.693478 4.300000 13.500000 149.074486 4.300000 13.600000 151.475494 4.300000 13.700000 153.896502 4.300000 13.800000 156.337511 4.300000 13.900000 158.798519 4.300000 14.000000 161.279527 4.300000 14.100000 163.780535 4.300000 14.200000 166.301543 4.300000 14.300000 168.842552 4.300000 14.400000 171.403560 4.300000 14.500000 173.984568 4.300000 14.600000 176.585576 4.300000 14.700000 179.206584 4.300000 14.800000 181.847593 4.300000 14.900000 184.508601 4.300000 15.000000 187.189609 4.400000 -5.000000 49.275488 4.400000 -4.900000 47.985849 4.400000 -4.800000 46.716210 4.400000 -4.700000 45.466571 4.400000 -4.600000 44.236933 4.400000 -4.500000 43.027294 4.400000 -4.400000 41.837655 4.400000 -4.300000 40.668016 4.400000 -4.200000 39.518377 4.400000 -4.100000 38.388738 4.400000 -4.000000 37.279099 4.400000 -3.900000 36.189460 4.400000 -3.800000 35.119821 4.400000 -3.700000 34.070182 4.400000 -3.600000 33.040543 4.400000 -3.500000 32.030904 4.400000 -3.400000 31.041266 4.400000 -3.300000 30.071627 4.400000 -3.200000 29.121988 4.400000 -3.100000 28.192349 4.400000 -3.000000 27.282710 4.400000 -2.900000 26.393071 4.400000 -2.800000 25.523432 4.400000 -2.700000 24.673793 4.400000 -2.600000 23.844154 4.400000 -2.500000 23.034515 4.400000 -2.400000 22.244876 4.400000 -2.300000 21.475237 4.400000 -2.200000 20.725598 4.400000 -2.100000 19.995960 4.400000 -2.000000 19.286321 4.400000 -1.900000 18.596682 4.400000 -1.800000 17.927043 4.400000 -1.700000 17.277404 4.400000 -1.600000 16.647765 4.400000 -1.500000 16.038126 4.400000 -1.400000 15.448487 4.400000 -1.300000 14.878848 4.400000 -1.200000 14.329209 4.400000 -1.100000 13.799570 4.400000 -1.000000 13.289931 4.400000 -0.900000 12.800293 4.400000 -0.800000 12.330654 4.400000 -0.700000 11.881015 4.400000 -0.600000 11.451376 4.400000 -0.500000 11.041737 4.400000 -0.400000 10.652098 4.400000 -0.300000 10.282459 4.400000 -0.200000 9.932820 4.400000 -0.100000 9.603181 4.400000 -0.000000 9.293542 4.400000 0.100000 9.003903 4.400000 0.200000 8.734264 4.400000 0.300000 8.484625 4.400000 0.400000 8.254987 4.400000 0.500000 8.045348 4.400000 0.600000 7.855709 4.400000 0.700000 7.686070 4.400000 0.800000 7.536431 4.400000 0.900000 7.406792 4.400000 1.000000 7.297153 4.400000 1.100000 7.207514 4.400000 1.200000 7.137875 4.400000 1.300000 7.088236 4.400000 1.400000 7.058597 4.400000 1.500000 7.048958 4.400000 1.600000 7.059320 4.400000 1.700000 7.089681 4.400000 1.800000 7.140042 4.400000 1.900000 7.210403 4.400000 2.000000 7.300764 4.400000 2.100000 7.411125 4.400000 2.200000 7.541486 4.400000 2.300000 7.691847 4.400000 2.400000 7.862208 4.400000 2.500000 8.052569 4.400000 2.600000 8.262930 4.400000 2.700000 8.493291 4.400000 2.800000 8.743652 4.400000 2.900000 9.014014 4.400000 3.000000 9.304375 4.400000 3.100000 9.614736 4.400000 3.200000 9.945097 4.400000 3.300000 10.295458 4.400000 3.400000 10.665819 4.400000 3.500000 11.056180 4.400000 3.600000 11.466541 4.400000 3.700000 11.896902 4.400000 3.800000 12.347263 4.400000 3.900000 12.817624 4.400000 4.000000 13.307985 4.400000 4.100000 13.818346 4.400000 4.200000 14.348708 4.400000 4.300000 14.899069 4.400000 4.400000 15.469430 4.400000 4.500000 16.059791 4.400000 4.600000 16.670152 4.400000 4.700000 17.300513 4.400000 4.800000 17.950874 4.400000 4.900000 18.621235 4.400000 5.000000 19.311596 4.400000 5.100000 20.021957 4.400000 5.200000 20.752318 4.400000 5.300000 21.502679 4.400000 5.400000 22.273041 4.400000 5.500000 23.063402 4.400000 5.600000 23.873763 4.400000 5.700000 24.704124 4.400000 5.800000 25.554485 4.400000 5.900000 26.424846 4.400000 6.000000 27.315207 4.400000 6.100000 28.225568 4.400000 6.200000 29.155929 4.400000 6.300000 30.106290 4.400000 6.400000 31.076651 4.400000 6.500000 32.067012 4.400000 6.600000 33.077373 4.400000 6.700000 34.107735 4.400000 6.800000 35.158096 4.400000 6.900000 36.228457 4.400000 7.000000 37.318818 4.400000 7.100000 38.429179 4.400000 7.200000 39.559540 4.400000 7.300000 40.709901 4.400000 7.400000 41.880262 4.400000 7.500000 43.070623 4.400000 7.600000 44.280984 4.400000 7.700000 45.511345 4.400000 7.800000 46.761706 4.400000 7.900000 48.032068 4.400000 8.000000 49.322429 4.400000 8.100000 50.632790 4.400000 8.200000 51.963151 4.400000 8.300000 53.313512 4.400000 8.400000 54.683873 4.400000 8.500000 56.074234 4.400000 8.600000 57.484595 4.400000 8.700000 58.914956 4.400000 8.800000 60.365317 4.400000 8.900000 61.835678 4.400000 9.000000 63.326039 4.400000 9.100000 64.836400 4.400000 9.200000 66.366762 4.400000 9.300000 67.917123 4.400000 9.400000 69.487484 4.400000 9.500000 71.077845 4.400000 9.600000 72.688206 4.400000 9.700000 74.318567 4.400000 9.800000 75.968928 4.400000 9.900000 77.639289 4.400000 10.000000 79.329650 4.400000 10.100000 81.040011 4.400000 10.200000 82.770372 4.400000 10.300000 84.520733 4.400000 10.400000 86.291095 4.400000 10.500000 88.081456 4.400000 10.600000 89.891817 4.400000 10.700000 91.722178 4.400000 10.800000 93.572539 4.400000 10.900000 95.442900 4.400000 11.000000 97.333261 4.400000 11.100000 99.243622 4.400000 11.200000 101.173983 4.400000 11.300000 103.124344 4.400000 11.400000 105.094705 4.400000 11.500000 107.085066 4.400000 11.600000 109.095427 4.400000 11.700000 111.125789 4.400000 11.800000 113.176150 4.400000 11.900000 115.246511 4.400000 12.000000 117.336872 4.400000 12.100000 119.447233 4.400000 12.200000 121.577594 4.400000 12.300000 123.727955 4.400000 12.400000 125.898316 4.400000 12.500000 128.088677 4.400000 12.600000 130.299038 4.400000 12.700000 132.529399 4.400000 12.800000 134.779760 4.400000 12.900000 137.050122 4.400000 13.000000 139.340483 4.400000 13.100000 141.650844 4.400000 13.200000 143.981205 4.400000 13.300000 146.331566 4.400000 13.400000 148.701927 4.400000 13.500000 151.092288 4.400000 13.600000 153.502649 4.400000 13.700000 155.933010 4.400000 13.800000 158.383371 4.400000 13.900000 160.853732 4.400000 14.000000 163.344093 4.400000 14.100000 165.854454 4.400000 14.200000 168.384816 4.400000 14.300000 170.935177 4.400000 14.400000 173.505538 4.400000 14.500000 176.095899 4.400000 14.600000 178.706260 4.400000 14.700000 181.336621 4.400000 14.800000 183.986982 4.400000 14.900000 186.657343 4.400000 15.000000 189.347704 4.500000 -5.000000 49.630210 4.500000 -4.900000 48.349407 4.500000 -4.800000 47.088604 4.500000 -4.700000 45.847802 4.500000 -4.600000 44.626999 4.500000 -4.500000 43.426196 4.500000 -4.400000 42.245393 4.500000 -4.300000 41.084591 4.500000 -4.200000 39.943788 4.500000 -4.100000 38.822985 4.500000 -4.000000 37.722182 4.500000 -3.900000 36.641380 4.500000 -3.800000 35.580577 4.500000 -3.700000 34.539774 4.500000 -3.600000 33.518971 4.500000 -3.500000 32.518168 4.500000 -3.400000 31.537366 4.500000 -3.300000 30.576563 4.500000 -3.200000 29.635760 4.500000 -3.100000 28.714957 4.500000 -3.000000 27.814155 4.500000 -2.900000 26.933352 4.500000 -2.800000 26.072549 4.500000 -2.700000 25.231746 4.500000 -2.600000 24.410943 4.500000 -2.500000 23.610141 4.500000 -2.400000 22.829338 4.500000 -2.300000 22.068535 4.500000 -2.200000 21.327732 4.500000 -2.100000 20.606930 4.500000 -2.000000 19.906127 4.500000 -1.900000 19.225324 4.500000 -1.800000 18.564521 4.500000 -1.700000 17.923718 4.500000 -1.600000 17.302916 4.500000 -1.500000 16.702113 4.500000 -1.400000 16.121310 4.500000 -1.300000 15.560507 4.500000 -1.200000 15.019705 4.500000 -1.100000 14.498902 4.500000 -1.000000 13.998099 4.500000 -0.900000 13.517296 4.500000 -0.800000 13.056494 4.500000 -0.700000 12.615691 4.500000 -0.600000 12.194888 4.500000 -0.500000 11.794085 4.500000 -0.400000 11.413282 4.500000 -0.300000 11.052480 4.500000 -0.200000 10.711677 4.500000 -0.100000 10.390874 4.500000 -0.000000 10.090071 4.500000 0.100000 9.809269 4.500000 0.200000 9.548466 4.500000 0.300000 9.307663 4.500000 0.400000 9.086860 4.500000 0.500000 8.886057 4.500000 0.600000 8.705255 4.500000 0.700000 8.544452 4.500000 0.800000 8.403649 4.500000 0.900000 8.282846 4.500000 1.000000 8.182044 4.500000 1.100000 8.101241 4.500000 1.200000 8.040438 4.500000 1.300000 7.999635 4.500000 1.400000 7.978832 4.500000 1.500000 7.978030 4.500000 1.600000 7.997227 4.500000 1.700000 8.036424 4.500000 1.800000 8.095621 4.500000 1.900000 8.174819 4.500000 2.000000 8.274016 4.500000 2.100000 8.393213 4.500000 2.200000 8.532410 4.500000 2.300000 8.691608 4.500000 2.400000 8.870805 4.500000 2.500000 9.070002 4.500000 2.600000 9.289199 4.500000 2.700000 9.528396 4.500000 2.800000 9.787594 4.500000 2.900000 10.066791 4.500000 3.000000 10.365988 4.500000 3.100000 10.685185 4.500000 3.200000 11.024383 4.500000 3.300000 11.383580 4.500000 3.400000 11.762777 4.500000 3.500000 12.161974 4.500000 3.600000 12.581171 4.500000 3.700000 13.020369 4.500000 3.800000 13.479566 4.500000 3.900000 13.958763 4.500000 4.000000 14.457960 4.500000 4.100000 14.977158 4.500000 4.200000 15.516355 4.500000 4.300000 16.075552 4.500000 4.400000 16.654749 4.500000 4.500000 17.253946 4.500000 4.600000 17.873144 4.500000 4.700000 18.512341 4.500000 4.800000 19.171538 4.500000 4.900000 19.850735 4.500000 5.000000 20.549933 4.500000 5.100000 21.269130 4.500000 5.200000 22.008327 4.500000 5.300000 22.767524 4.500000 5.400000 23.546722 4.500000 5.500000 24.345919 4.500000 5.600000 25.165116 4.500000 5.700000 26.004313 4.500000 5.800000 26.863510 4.500000 5.900000 27.742708 4.500000 6.000000 28.641905 4.500000 6.100000 29.561102 4.500000 6.200000 30.500299 4.500000 6.300000 31.459497 4.500000 6.400000 32.438694 4.500000 6.500000 33.437891 4.500000 6.600000 34.457088 4.500000 6.700000 35.496285 4.500000 6.800000 36.555483 4.500000 6.900000 37.634680 4.500000 7.000000 38.733877 4.500000 7.100000 39.853074 4.500000 7.200000 40.992272 4.500000 7.300000 42.151469 4.500000 7.400000 43.330666 4.500000 7.500000 44.529863 4.500000 7.600000 45.749060 4.500000 7.700000 46.988258 4.500000 7.800000 48.247455 4.500000 7.900000 49.526652 4.500000 8.000000 50.825849 4.500000 8.100000 52.145047 4.500000 8.200000 53.484244 4.500000 8.300000 54.843441 4.500000 8.400000 56.222638 4.500000 8.500000 57.621836 4.500000 8.600000 59.041033 4.500000 8.700000 60.480230 4.500000 8.800000 61.939427 4.500000 8.900000 63.418624 4.500000 9.000000 64.917822 4.500000 9.100000 66.437019 4.500000 9.200000 67.976216 4.500000 9.300000 69.535413 4.500000 9.400000 71.114611 4.500000 9.500000 72.713808 4.500000 9.600000 74.333005 4.500000 9.700000 75.972202 4.500000 9.800000 77.631399 4.500000 9.900000 79.310597 4.500000 10.000000 81.009794 4.500000 10.100000 82.728991 4.500000 10.200000 84.468188 4.500000 10.300000 86.227386 4.500000 10.400000 88.006583 4.500000 10.500000 89.805780 4.500000 10.600000 91.624977 4.500000 10.700000 93.464174 4.500000 10.800000 95.323372 4.500000 10.900000 97.202569 4.500000 11.000000 99.101766 4.500000 11.100000 101.020963 4.500000 11.200000 102.960161 4.500000 11.300000 104.919358 4.500000 11.400000 106.898555 4.500000 11.500000 108.897752 4.500000 11.600000 110.916950 4.500000 11.700000 112.956147 4.500000 11.800000 115.015344 4.500000 11.900000 117.094541 4.500000 12.000000 119.193738 4.500000 12.100000 121.312936 4.500000 12.200000 123.452133 4.500000 12.300000 125.611330 4.500000 12.400000 127.790527 4.500000 12.500000 129.989725 4.500000 12.600000 132.208922 4.500000 12.700000 134.448119 4.500000 12.800000 136.707316 4.500000 12.900000 138.986513 4.500000 13.000000 141.285711 4.500000 13.100000 143.604908 4.500000 13.200000 145.944105 4.500000 13.300000 148.303302 4.500000 13.400000 150.682500 4.500000 13.500000 153.081697 4.500000 13.600000 155.500894 4.500000 13.700000 157.940091 4.500000 13.800000 160.399288 4.500000 13.900000 162.878486 4.500000 14.000000 165.377683 4.500000 14.100000 167.896880 4.500000 14.200000 170.436077 4.500000 14.300000 172.995275 4.500000 14.400000 175.574472 4.500000 14.500000 178.173669 4.500000 14.600000 180.792866 4.500000 14.700000 183.432064 4.500000 14.800000 186.091261 4.500000 14.900000 188.770458 4.500000 15.000000 191.469655 4.600000 -5.000000 50.042188 4.600000 -4.900000 48.769705 4.600000 -4.800000 47.517222 4.600000 -4.700000 46.284738 4.600000 -4.600000 45.072255 4.600000 -4.500000 43.879772 4.600000 -4.400000 42.707288 4.600000 -4.300000 41.554805 4.600000 -4.200000 40.422321 4.600000 -4.100000 39.309838 4.600000 -4.000000 38.217355 4.600000 -3.900000 37.144871 4.600000 -3.800000 36.092388 4.600000 -3.700000 35.059905 4.600000 -3.600000 34.047421 4.600000 -3.500000 33.054938 4.600000 -3.400000 32.082455 4.600000 -3.300000 31.129971 4.600000 -3.200000 30.197488 4.600000 -3.100000 29.285004 4.600000 -3.000000 28.392521 4.600000 -2.900000 27.520038 4.600000 -2.800000 26.667554 4.600000 -2.700000 25.835071 4.600000 -2.600000 25.022588 4.600000 -2.500000 24.230104 4.600000 -2.400000 23.457621 4.600000 -2.300000 22.705138 4.600000 -2.200000 21.972654 4.600000 -2.100000 21.260171 4.600000 -2.000000 20.567687 4.600000 -1.900000 19.895204 4.600000 -1.800000 19.242721 4.600000 -1.700000 18.610237 4.600000 -1.600000 17.997754 4.600000 -1.500000 17.405271 4.600000 -1.400000 16.832787 4.600000 -1.300000 16.280304 4.600000 -1.200000 15.747821 4.600000 -1.100000 15.235337 4.600000 -1.000000 14.742854 4.600000 -0.900000 14.270370 4.600000 -0.800000 13.817887 4.600000 -0.700000 13.385404 4.600000 -0.600000 12.972920 4.600000 -0.500000 12.580437 4.600000 -0.400000 12.207954 4.600000 -0.300000 11.855470 4.600000 -0.200000 11.522987 4.600000 -0.100000 11.210503 4.600000 -0.000000 10.918020 4.600000 0.100000 10.645537 4.600000 0.200000 10.393053 4.600000 0.300000 10.160570 4.600000 0.400000 9.948087 4.600000 0.500000 9.755603 4.600000 0.600000 9.583120 4.600000 0.700000 9.430637 4.600000 0.800000 9.298153 4.600000 0.900000 9.185670 4.600000 1.000000 9.093186 4.600000 1.100000 9.020703 4.600000 1.200000 8.968220 4.600000 1.300000 8.935736 4.600000 1.400000 8.923253 4.600000 1.500000 8.930770 4.600000 1.600000 8.958286 4.600000 1.700000 9.005803 4.600000 1.800000 9.073320 4.600000 1.900000 9.160836 4.600000 2.000000 9.268353 4.600000 2.100000 9.395869 4.600000 2.200000 9.543386 4.600000 2.300000 9.710903 4.600000 2.400000 9.898419 4.600000 2.500000 10.105936 4.600000 2.600000 10.333453 4.600000 2.700000 10.580969 4.600000 2.800000 10.848486 4.600000 2.900000 11.136002 4.600000 3.000000 11.443519 4.600000 3.100000 11.771036 4.600000 3.200000 12.118552 4.600000 3.300000 12.486069 4.600000 3.400000 12.873586 4.600000 3.500000 13.281102 4.600000 3.600000 13.708619 4.600000 3.700000 14.156136 4.600000 3.800000 14.623652 4.600000 3.900000 15.111169 4.600000 4.000000 15.618685 4.600000 4.100000 16.146202 4.600000 4.200000 16.693719 4.600000 4.300000 17.261235 4.600000 4.400000 17.848752 4.600000 4.500000 18.456269 4.600000 4.600000 19.083785 4.600000 4.700000 19.731302 4.600000 4.800000 20.398819 4.600000 4.900000 21.086335 4.600000 5.000000 21.793852 4.600000 5.100000 22.521368 4.600000 5.200000 23.268885 4.600000 5.300000 24.036402 4.600000 5.400000 24.823918 4.600000 5.500000 25.631435 4.600000 5.600000 26.458952 4.600000 5.700000 27.306468 4.600000 5.800000 28.173985 4.600000 5.900000 29.061501 4.600000 6.000000 29.969018 4.600000 6.100000 30.896535 4.600000 6.200000 31.844051 4.600000 6.300000 32.811568 4.600000 6.400000 33.799085 4.600000 6.500000 34.806601 4.600000 6.600000 35.834118 4.600000 6.700000 36.881635 4.600000 6.800000 37.949151 4.600000 6.900000 39.036668 4.600000 7.000000 40.144184 4.600000 7.100000 41.271701 4.600000 7.200000 42.419218 4.600000 7.300000 43.586734 4.600000 7.400000 44.774251 4.600000 7.500000 45.981768 4.600000 7.600000 47.209284 4.600000 7.700000 48.456801 4.600000 7.800000 49.724318 4.600000 7.900000 51.011834 4.600000 8.000000 52.319351 4.600000 8.100000 53.646867 4.600000 8.200000 54.994384 4.600000 8.300000 56.361901 4.600000 8.400000 57.749417 4.600000 8.500000 59.156934 4.600000 8.600000 60.584451 4.600000 8.700000 62.031967 4.600000 8.800000 63.499484 4.600000 8.900000 64.987001 4.600000 9.000000 66.494517 4.600000 9.100000 68.022034 4.600000 9.200000 69.569550 4.600000 9.300000 71.137067 4.600000 9.400000 72.724584 4.600000 9.500000 74.332100 4.600000 9.600000 75.959617 4.600000 9.700000 77.607134 4.600000 9.800000 79.274650 4.600000 9.900000 80.962167 4.600000 10.000000 82.669683 4.600000 10.100000 84.397200 4.600000 10.200000 86.144717 4.600000 10.300000 87.912233 4.600000 10.400000 89.699750 4.600000 10.500000 91.507267 4.600000 10.600000 93.334783 4.600000 10.700000 95.182300 4.600000 10.800000 97.049817 4.600000 10.900000 98.937333 4.600000 11.000000 100.844850 4.600000 11.100000 102.772366 4.600000 11.200000 104.719883 4.600000 11.300000 106.687400 4.600000 11.400000 108.674916 4.600000 11.500000 110.682433 4.600000 11.600000 112.709950 4.600000 11.700000 114.757466 4.600000 11.800000 116.824983 4.600000 11.900000 118.912500 4.600000 12.000000 121.020016 4.600000 12.100000 123.147533 4.600000 12.200000 125.295049 4.600000 12.300000 127.462566 4.600000 12.400000 129.650083 4.600000 12.500000 131.857599 4.600000 12.600000 134.085116 4.600000 12.700000 136.332633 4.600000 12.800000 138.600149 4.600000 12.900000 140.887666 4.600000 13.000000 143.195182 4.600000 13.100000 145.522699 4.600000 13.200000 147.870216 4.600000 13.300000 150.237732 4.600000 13.400000 152.625249 4.600000 13.500000 155.032766 4.600000 13.600000 157.460282 4.600000 13.700000 159.907799 4.600000 13.800000 162.375316 4.600000 13.900000 164.862832 4.600000 14.000000 167.370349 4.600000 14.100000 169.897865 4.600000 14.200000 172.445382 4.600000 14.300000 175.012899 4.600000 14.400000 177.600415 4.600000 14.500000 180.207932 4.600000 14.600000 182.835449 4.600000 14.700000 185.482965 4.600000 14.800000 188.150482 4.600000 14.900000 190.837999 4.600000 15.000000 193.545515 4.700000 -5.000000 50.501315 4.700000 -4.900000 49.236634 4.700000 -4.800000 47.991953 4.700000 -4.700000 46.767273 4.700000 -4.600000 45.562592 4.700000 -4.500000 44.377911 4.700000 -4.400000 43.213230 4.700000 -4.300000 42.068550 4.700000 -4.200000 40.943869 4.700000 -4.100000 39.839188 4.700000 -4.000000 38.754508 4.700000 -3.900000 37.689827 4.700000 -3.800000 36.645146 4.700000 -3.700000 35.620466 4.700000 -3.600000 34.615785 4.700000 -3.500000 33.631104 4.700000 -3.400000 32.666423 4.700000 -3.300000 31.721743 4.700000 -3.200000 30.797062 4.700000 -3.100000 29.892381 4.700000 -3.000000 29.007701 4.700000 -2.900000 28.143020 4.700000 -2.800000 27.298339 4.700000 -2.700000 26.473659 4.700000 -2.600000 25.668978 4.700000 -2.500000 24.884297 4.700000 -2.400000 24.119616 4.700000 -2.300000 23.374936 4.700000 -2.200000 22.650255 4.700000 -2.100000 21.945574 4.700000 -2.000000 21.260894 4.700000 -1.900000 20.596213 4.700000 -1.800000 19.951532 4.700000 -1.700000 19.326852 4.700000 -1.600000 18.722171 4.700000 -1.500000 18.137490 4.700000 -1.400000 17.572810 4.700000 -1.300000 17.028129 4.700000 -1.200000 16.503448 4.700000 -1.100000 15.998767 4.700000 -1.000000 15.514087 4.700000 -0.900000 15.049406 4.700000 -0.800000 14.604725 4.700000 -0.700000 14.180045 4.700000 -0.600000 13.775364 4.700000 -0.500000 13.390683 4.700000 -0.400000 13.026003 4.700000 -0.300000 12.681322 4.700000 -0.200000 12.356641 4.700000 -0.100000 12.051960 4.700000 -0.000000 11.767280 4.700000 0.100000 11.502599 4.700000 0.200000 11.257918 4.700000 0.300000 11.033238 4.700000 0.400000 10.828557 4.700000 0.500000 10.643876 4.700000 0.600000 10.479196 4.700000 0.700000 10.334515 4.700000 0.800000 10.209834 4.700000 0.900000 10.105154 4.700000 1.000000 10.020473 4.700000 1.100000 9.955792 4.700000 1.200000 9.911111 4.700000 1.300000 9.886431 4.700000 1.400000 9.881750 4.700000 1.500000 9.897069 4.700000 1.600000 9.932389 4.700000 1.700000 9.987708 4.700000 1.800000 10.063027 4.700000 1.900000 10.158347 4.700000 2.000000 10.273666 4.700000 2.100000 10.408985 4.700000 2.200000 10.564304 4.700000 2.300000 10.739624 4.700000 2.400000 10.934943 4.700000 2.500000 11.150262 4.700000 2.600000 11.385582 4.700000 2.700000 11.640901 4.700000 2.800000 11.916220 4.700000 2.900000 12.211540 4.700000 3.000000 12.526859 4.700000 3.100000 12.862178 4.700000 3.200000 13.217497 4.700000 3.300000 13.592817 4.700000 3.400000 13.988136 4.700000 3.500000 14.403455 4.700000 3.600000 14.838775 4.700000 3.700000 15.294094 4.700000 3.800000 15.769413 4.700000 3.900000 16.264733 4.700000 4.000000 16.780052 4.700000 4.100000 17.315371 4.700000 4.200000 17.870691 4.700000 4.300000 18.446010 4.700000 4.400000 19.041329 4.700000 4.500000 19.656648 4.700000 4.600000 20.291968 4.700000 4.700000 20.947287 4.700000 4.800000 21.622606 4.700000 4.900000 22.317926 4.700000 5.000000 23.033245 4.700000 5.100000 23.768564 4.700000 5.200000 24.523884 4.700000 5.300000 25.299203 4.700000 5.400000 26.094522 4.700000 5.500000 26.909841 4.700000 5.600000 27.745161 4.700000 5.700000 28.600480 4.700000 5.800000 29.475799 4.700000 5.900000 30.371119 4.700000 6.000000 31.286438 4.700000 6.100000 32.221757 4.700000 6.200000 33.177077 4.700000 6.300000 34.152396 4.700000 6.400000 35.147715 4.700000 6.500000 36.163035 4.700000 6.600000 37.198354 4.700000 6.700000 38.253673 4.700000 6.800000 39.328992 4.700000 6.900000 40.424312 4.700000 7.000000 41.539631 4.700000 7.100000 42.674950 4.700000 7.200000 43.830270 4.700000 7.300000 45.005589 4.700000 7.400000 46.200908 4.700000 7.500000 47.416228 4.700000 7.600000 48.651547 4.700000 7.700000 49.906866 4.700000 7.800000 51.182185 4.700000 7.900000 52.477505 4.700000 8.000000 53.792824 4.700000 8.100000 55.128143 4.700000 8.200000 56.483463 4.700000 8.300000 57.858782 4.700000 8.400000 59.254101 4.700000 8.500000 60.669421 4.700000 8.600000 62.104740 4.700000 8.700000 63.560059 4.700000 8.800000 65.035379 4.700000 8.900000 66.530698 4.700000 9.000000 68.046017 4.700000 9.100000 69.581336 4.700000 9.200000 71.136656 4.700000 9.300000 72.711975 4.700000 9.400000 74.307294 4.700000 9.500000 75.922614 4.700000 9.600000 77.557933 4.700000 9.700000 79.213252 4.700000 9.800000 80.888572 4.700000 9.900000 82.583891 4.700000 10.000000 84.299210 4.700000 10.100000 86.034529 4.700000 10.200000 87.789849 4.700000 10.300000 89.565168 4.700000 10.400000 91.360487 4.700000 10.500000 93.175807 4.700000 10.600000 95.011126 4.700000 10.700000 96.866445 4.700000 10.800000 98.741765 4.700000 10.900000 100.637084 4.700000 11.000000 102.552403 4.700000 11.100000 104.487722 4.700000 11.200000 106.443042 4.700000 11.300000 108.418361 4.700000 11.400000 110.413680 4.700000 11.500000 112.429000 4.700000 11.600000 114.464319 4.700000 11.700000 116.519638 4.700000 11.800000 118.594958 4.700000 11.900000 120.690277 4.700000 12.000000 122.805596 4.700000 12.100000 124.940916 4.700000 12.200000 127.096235 4.700000 12.300000 129.271554 4.700000 12.400000 131.466873 4.700000 12.500000 133.682193 4.700000 12.600000 135.917512 4.700000 12.700000 138.172831 4.700000 12.800000 140.448151 4.700000 12.900000 142.743470 4.700000 13.000000 145.058789 4.700000 13.100000 147.394109 4.700000 13.200000 149.749428 4.700000 13.300000 152.124747 4.700000 13.400000 154.520066 4.700000 13.500000 156.935386 4.700000 13.600000 159.370705 4.700000 13.700000 161.826024 4.700000 13.800000 164.301344 4.700000 13.900000 166.796663 4.700000 14.000000 169.311982 4.700000 14.100000 171.847302 4.700000 14.200000 174.402621 4.700000 14.300000 176.977940 4.700000 14.400000 179.573260 4.700000 14.500000 182.188579 4.700000 14.600000 184.823898 4.700000 14.700000 187.479217 4.700000 14.800000 190.154537 4.700000 14.900000 192.849856 4.700000 15.000000 195.565175 4.800000 -5.000000 50.997412 4.800000 -4.900000 49.740018 4.800000 -4.800000 48.502623 4.800000 -4.700000 47.285228 4.800000 -4.600000 46.087833 4.800000 -4.500000 44.910438 4.800000 -4.400000 43.753044 4.800000 -4.300000 42.615649 4.800000 -4.200000 41.498254 4.800000 -4.100000 40.400859 4.800000 -4.000000 39.323465 4.800000 -3.900000 38.266070 4.800000 -3.800000 37.228675 4.800000 -3.700000 36.211280 4.800000 -3.600000 35.213886 4.800000 -3.500000 34.236491 4.800000 -3.400000 33.279096 4.800000 -3.300000 32.341701 4.800000 -3.200000 31.424307 4.800000 -3.100000 30.526912 4.800000 -3.000000 29.649517 4.800000 -2.900000 28.792122 4.800000 -2.800000 27.954728 4.800000 -2.700000 27.137333 4.800000 -2.600000 26.339938 4.800000 -2.500000 25.562543 4.800000 -2.400000 24.805148 4.800000 -2.300000 24.067754 4.800000 -2.200000 23.350359 4.800000 -2.100000 22.652964 4.800000 -2.000000 21.975569 4.800000 -1.900000 21.318175 4.800000 -1.800000 20.680780 4.800000 -1.700000 20.063385 4.800000 -1.600000 19.465990 4.800000 -1.500000 18.888596 4.800000 -1.400000 18.331201 4.800000 -1.300000 17.793806 4.800000 -1.200000 17.276411 4.800000 -1.100000 16.779017 4.800000 -1.000000 16.301622 4.800000 -0.900000 15.844227 4.800000 -0.800000 15.406832 4.800000 -0.700000 14.989437 4.800000 -0.600000 14.592043 4.800000 -0.500000 14.214648 4.800000 -0.400000 13.857253 4.800000 -0.300000 13.519858 4.800000 -0.200000 13.202464 4.800000 -0.100000 12.905069 4.800000 -0.000000 12.627674 4.800000 0.100000 12.370279 4.800000 0.200000 12.132885 4.800000 0.300000 11.915490 4.800000 0.400000 11.718095 4.800000 0.500000 11.540700 4.800000 0.600000 11.383306 4.800000 0.700000 11.245911 4.800000 0.800000 11.128516 4.800000 0.900000 11.031121 4.800000 1.000000 10.953726 4.800000 1.100000 10.896332 4.800000 1.200000 10.858937 4.800000 1.300000 10.841542 4.800000 1.400000 10.844147 4.800000 1.500000 10.866753 4.800000 1.600000 10.909358 4.800000 1.700000 10.971963 4.800000 1.800000 11.054568 4.800000 1.900000 11.157174 4.800000 2.000000 11.279779 4.800000 2.100000 11.422384 4.800000 2.200000 11.584989 4.800000 2.300000 11.767595 4.800000 2.400000 11.970200 4.800000 2.500000 12.192805 4.800000 2.600000 12.435410 4.800000 2.700000 12.698015 4.800000 2.800000 12.980621 4.800000 2.900000 13.283226 4.800000 3.000000 13.605831 4.800000 3.100000 13.948436 4.800000 3.200000 14.311042 4.800000 3.300000 14.693647 4.800000 3.400000 15.096252 4.800000 3.500000 15.518857 4.800000 3.600000 15.961463 4.800000 3.700000 16.424068 4.800000 3.800000 16.906673 4.800000 3.900000 17.409278 4.800000 4.000000 17.931884 4.800000 4.100000 18.474489 4.800000 4.200000 19.037094 4.800000 4.300000 19.619699 4.800000 4.400000 20.222304 4.800000 4.500000 20.844910 4.800000 4.600000 21.487515 4.800000 4.700000 22.150120 4.800000 4.800000 22.832725 4.800000 4.900000 23.535331 4.800000 5.000000 24.257936 4.800000 5.100000 25.000541 4.800000 5.200000 25.763146 4.800000 5.300000 26.545752 4.800000 5.400000 27.348357 4.800000 5.500000 28.170962 4.800000 5.600000 29.013567 4.800000 5.700000 29.876173 4.800000 5.800000 30.758778 4.800000 5.900000 31.661383 4.800000 6.000000 32.583988 4.800000 6.100000 33.526593 4.800000 6.200000 34.489199 4.800000 6.300000 35.471804 4.800000 6.400000 36.474409 4.800000 6.500000 37.497014 4.800000 6.600000 38.539620 4.800000 6.700000 39.602225 4.800000 6.800000 40.684830 4.800000 6.900000 41.787435 4.800000 7.000000 42.910041 4.800000 7.100000 44.052646 4.800000 7.200000 45.215251 4.800000 7.300000 46.397856 4.800000 7.400000 47.600462 4.800000 7.500000 48.823067 4.800000 7.600000 50.065672 4.800000 7.700000 51.328277 4.800000 7.800000 52.610882 4.800000 7.900000 53.913488 4.800000 8.000000 55.236093 4.800000 8.100000 56.578698 4.800000 8.200000 57.941303 4.800000 8.300000 59.323909 4.800000 8.400000 60.726514 4.800000 8.500000 62.149119 4.800000 8.600000 63.591724 4.800000 8.700000 65.054330 4.800000 8.800000 66.536935 4.800000 8.900000 68.039540 4.800000 9.000000 69.562145 4.800000 9.100000 71.104751 4.800000 9.200000 72.667356 4.800000 9.300000 74.249961 4.800000 9.400000 75.852566 4.800000 9.500000 77.475171 4.800000 9.600000 79.117777 4.800000 9.700000 80.780382 4.800000 9.800000 82.462987 4.800000 9.900000 84.165592 4.800000 10.000000 85.888198 4.800000 10.100000 87.630803 4.800000 10.200000 89.393408 4.800000 10.300000 91.176013 4.800000 10.400000 92.978619 4.800000 10.500000 94.801224 4.800000 10.600000 96.643829 4.800000 10.700000 98.506434 4.800000 10.800000 100.389040 4.800000 10.900000 102.291645 4.800000 11.000000 104.214250 4.800000 11.100000 106.156855 4.800000 11.200000 108.119460 4.800000 11.300000 110.102066 4.800000 11.400000 112.104671 4.800000 11.500000 114.127276 4.800000 11.600000 116.169881 4.800000 11.700000 118.232487 4.800000 11.800000 120.315092 4.800000 11.900000 122.417697 4.800000 12.000000 124.540302 4.800000 12.100000 126.682908 4.800000 12.200000 128.845513 4.800000 12.300000 131.028118 4.800000 12.400000 133.230723 4.800000 12.500000 135.453329 4.800000 12.600000 137.695934 4.800000 12.700000 139.958539 4.800000 12.800000 142.241144 4.800000 12.900000 144.543749 4.800000 13.000000 146.866355 4.800000 13.100000 149.208960 4.800000 13.200000 151.571565 4.800000 13.300000 153.954170 4.800000 13.400000 156.356776 4.800000 13.500000 158.779381 4.800000 13.600000 161.221986 4.800000 13.700000 163.684591 4.800000 13.800000 166.167197 4.800000 13.900000 168.669802 4.800000 14.000000 171.192407 4.800000 14.100000 173.735012 4.800000 14.200000 176.297618 4.800000 14.300000 178.880223 4.800000 14.400000 181.482828 4.800000 14.500000 184.105433 4.800000 14.600000 186.748038 4.800000 14.700000 189.410644 4.800000 14.800000 192.093249 4.800000 14.900000 194.795854 4.800000 15.000000 197.518459 4.900000 -5.000000 51.520334 4.900000 -4.900000 50.269708 4.900000 -4.800000 49.039082 4.900000 -4.700000 47.828457 4.900000 -4.600000 46.637831 4.900000 -4.500000 45.467206 4.900000 -4.400000 44.316580 4.900000 -4.300000 43.185955 4.900000 -4.200000 42.075329 4.900000 -4.100000 40.984703 4.900000 -4.000000 39.914078 4.900000 -3.900000 38.863452 4.900000 -3.800000 37.832827 4.900000 -3.700000 36.822201 4.900000 -3.600000 35.831576 4.900000 -3.500000 34.860950 4.900000 -3.400000 33.910324 4.900000 -3.300000 32.979699 4.900000 -3.200000 32.069073 4.900000 -3.100000 31.178448 4.900000 -3.000000 30.307822 4.900000 -2.900000 29.457197 4.900000 -2.800000 28.626571 4.900000 -2.700000 27.815945 4.900000 -2.600000 27.025320 4.900000 -2.500000 26.254694 4.900000 -2.400000 25.504069 4.900000 -2.300000 24.773443 4.900000 -2.200000 24.062818 4.900000 -2.100000 23.372192 4.900000 -2.000000 22.701566 4.900000 -1.900000 22.050941 4.900000 -1.800000 21.420315 4.900000 -1.700000 20.809690 4.900000 -1.600000 20.219064 4.900000 -1.500000 19.648439 4.900000 -1.400000 19.097813 4.900000 -1.300000 18.567187 4.900000 -1.200000 18.056562 4.900000 -1.100000 17.565936 4.900000 -1.000000 17.095311 4.900000 -0.900000 16.644685 4.900000 -0.800000 16.214060 4.900000 -0.700000 15.803434 4.900000 -0.600000 15.412808 4.900000 -0.500000 15.042183 4.900000 -0.400000 14.691557 4.900000 -0.300000 14.360932 4.900000 -0.200000 14.050306 4.900000 -0.100000 13.759681 4.900000 -0.000000 13.489055 4.900000 0.100000 13.238429 4.900000 0.200000 13.007804 4.900000 0.300000 12.797178 4.900000 0.400000 12.606553 4.900000 0.500000 12.435927 4.900000 0.600000 12.285302 4.900000 0.700000 12.154676 4.900000 0.800000 12.044050 4.900000 0.900000 11.953425 4.900000 1.000000 11.882799 4.900000 1.100000 11.832174 4.900000 1.200000 11.801548 4.900000 1.300000 11.790923 4.900000 1.400000 11.800297 4.900000 1.500000 11.829671 4.900000 1.600000 11.879046 4.900000 1.700000 11.948420 4.900000 1.800000 12.037795 4.900000 1.900000 12.147169 4.900000 2.000000 12.276544 4.900000 2.100000 12.425918 4.900000 2.200000 12.595292 4.900000 2.300000 12.784667 4.900000 2.400000 12.994041 4.900000 2.500000 13.223416 4.900000 2.600000 13.472790 4.900000 2.700000 13.742165 4.900000 2.800000 14.031539 4.900000 2.900000 14.340913 4.900000 3.000000 14.670288 4.900000 3.100000 15.019662 4.900000 3.200000 15.389037 4.900000 3.300000 15.778411 4.900000 3.400000 16.187786 4.900000 3.500000 16.617160 4.900000 3.600000 17.066534 4.900000 3.700000 17.535909 4.900000 3.800000 18.025283 4.900000 3.900000 18.534658 4.900000 4.000000 19.064032 4.900000 4.100000 19.613407 4.900000 4.200000 20.182781 4.900000 4.300000 20.772155 4.900000 4.400000 21.381530 4.900000 4.500000 22.010904 4.900000 4.600000 22.660279 4.900000 4.700000 23.329653 4.900000 4.800000 24.019028 4.900000 4.900000 24.728402 4.900000 5.000000 25.457776 4.900000 5.100000 26.207151 4.900000 5.200000 26.976525 4.900000 5.300000 27.765900 4.900000 5.400000 28.575274 4.900000 5.500000 29.404649 4.900000 5.600000 30.254023 4.900000 5.700000 31.123397 4.900000 5.800000 32.012772 4.900000 5.900000 32.922146 4.900000 6.000000 33.851521 4.900000 6.100000 34.800895 4.900000 6.200000 35.770270 4.900000 6.300000 36.759644 4.900000 6.400000 37.769018 4.900000 6.500000 38.798393 4.900000 6.600000 39.847767 4.900000 6.700000 40.917142 4.900000 6.800000 42.006516 4.900000 6.900000 43.115891 4.900000 7.000000 44.245265 4.900000 7.100000 45.394639 4.900000 7.200000 46.564014 4.900000 7.300000 47.753388 4.900000 7.400000 48.962763 4.900000 7.500000 50.192137 4.900000 7.600000 51.441512 4.900000 7.700000 52.710886 4.900000 7.800000 54.000260 4.900000 7.900000 55.309635 4.900000 8.000000 56.639009 4.900000 8.100000 57.988384 4.900000 8.200000 59.357758 4.900000 8.300000 60.747133 4.900000 8.400000 62.156507 4.900000 8.500000 63.585881 4.900000 8.600000 65.035256 4.900000 8.700000 66.504630 4.900000 8.800000 67.994005 4.900000 8.900000 69.503379 4.900000 9.000000 71.032754 4.900000 9.100000 72.582128 4.900000 9.200000 74.151502 4.900000 9.300000 75.740877 4.900000 9.400000 77.350251 4.900000 9.500000 78.979626 4.900000 9.600000 80.629000 4.900000 9.700000 82.298375 4.900000 9.800000 83.987749 4.900000 9.900000 85.697123 4.900000 10.000000 87.426498 4.900000 10.100000 89.175872 4.900000 10.200000 90.945247 4.900000 10.300000 92.734621 4.900000 10.400000 94.543996 4.900000 10.500000 96.373370 4.900000 10.600000 98.222744 4.900000 10.700000 100.092119 4.900000 10.800000 101.981493 4.900000 10.900000 103.890868 4.900000 11.000000 105.820242 4.900000 11.100000 107.769617 4.900000 11.200000 109.738991 4.900000 11.300000 111.728366 4.900000 11.400000 113.737740 4.900000 11.500000 115.767114 4.900000 11.600000 117.816489 4.900000 11.700000 119.885863 4.900000 11.800000 121.975238 4.900000 11.900000 124.084612 4.900000 12.000000 126.213987 4.900000 12.100000 128.363361 4.900000 12.200000 130.532735 4.900000 12.300000 132.722110 4.900000 12.400000 134.931484 4.900000 12.500000 137.160859 4.900000 12.600000 139.410233 4.900000 12.700000 141.679608 4.900000 12.800000 143.968982 4.900000 12.900000 146.278356 4.900000 13.000000 148.607731 4.900000 13.100000 150.957105 4.900000 13.200000 153.326480 4.900000 13.300000 155.715854 4.900000 13.400000 158.125229 4.900000 13.500000 160.554603 4.900000 13.600000 163.003977 4.900000 13.700000 165.473352 4.900000 13.800000 167.962726 4.900000 13.900000 170.472101 4.900000 14.000000 173.001475 4.900000 14.100000 175.550850 4.900000 14.200000 178.120224 4.900000 14.300000 180.709598 4.900000 14.400000 183.318973 4.900000 14.500000 185.948347 4.900000 14.600000 188.597722 4.900000 14.700000 191.267096 4.900000 14.800000 193.956471 4.900000 14.900000 196.665845 4.900000 15.000000 199.395219 5.000000 -5.000000 52.060054 5.000000 -4.900000 50.815681 5.000000 -4.800000 49.591308 5.000000 -4.700000 48.386935 5.000000 -4.600000 47.202562 5.000000 -4.500000 46.038188 5.000000 -4.400000 44.893815 5.000000 -4.300000 43.769442 5.000000 -4.200000 42.665069 5.000000 -4.100000 41.580696 5.000000 -4.000000 40.516323 5.000000 -3.900000 39.471950 5.000000 -3.800000 38.447577 5.000000 -3.700000 37.443204 5.000000 -3.600000 36.458830 5.000000 -3.500000 35.494457 5.000000 -3.400000 34.550084 5.000000 -3.300000 33.625711 5.000000 -3.200000 32.721338 5.000000 -3.100000 31.836965 5.000000 -3.000000 30.972592 5.000000 -2.900000 30.128219 5.000000 -2.800000 29.303846 5.000000 -2.700000 28.499472 5.000000 -2.600000 27.715099 5.000000 -2.500000 26.950726 5.000000 -2.400000 26.206353 5.000000 -2.300000 25.481980 5.000000 -2.200000 24.777607 5.000000 -2.100000 24.093234 5.000000 -2.000000 23.428861 5.000000 -1.900000 22.784487 5.000000 -1.800000 22.160114 5.000000 -1.700000 21.555741 5.000000 -1.600000 20.971368 5.000000 -1.500000 20.406995 5.000000 -1.400000 19.862622 5.000000 -1.300000 19.338249 5.000000 -1.200000 18.833876 5.000000 -1.100000 18.349503 5.000000 -1.000000 17.885129 5.000000 -0.900000 17.440756 5.000000 -0.800000 17.016383 5.000000 -0.700000 16.612010 5.000000 -0.600000 16.227637 5.000000 -0.500000 15.863264 5.000000 -0.400000 15.518891 5.000000 -0.300000 15.194518 5.000000 -0.200000 14.890145 5.000000 -0.100000 14.605771 5.000000 -0.000000 14.341398 5.000000 0.100000 14.097025 5.000000 0.200000 13.872652 5.000000 0.300000 13.668279 5.000000 0.400000 13.483906 5.000000 0.500000 13.319533 5.000000 0.600000 13.175160 5.000000 0.700000 13.050786 5.000000 0.800000 12.946413 5.000000 0.900000 12.862040 5.000000 1.000000 12.797667 5.000000 1.100000 12.753294 5.000000 1.200000 12.728921 5.000000 1.300000 12.724548 5.000000 1.400000 12.740175 5.000000 1.500000 12.775802 5.000000 1.600000 12.831428 5.000000 1.700000 12.907055 5.000000 1.800000 13.002682 5.000000 1.900000 13.118309 5.000000 2.000000 13.253936 5.000000 2.100000 13.409563 5.000000 2.200000 13.585190 5.000000 2.300000 13.780817 5.000000 2.400000 13.996444 5.000000 2.500000 14.232070 5.000000 2.600000 14.487697 5.000000 2.700000 14.763324 5.000000 2.800000 15.058951 5.000000 2.900000 15.374578 5.000000 3.000000 15.710205 5.000000 3.100000 16.065832 5.000000 3.200000 16.441459 5.000000 3.300000 16.837086 5.000000 3.400000 17.252712 5.000000 3.500000 17.688339 5.000000 3.600000 18.143966 5.000000 3.700000 18.619593 5.000000 3.800000 19.115220 5.000000 3.900000 19.630847 5.000000 4.000000 20.166474 5.000000 4.100000 20.722101 5.000000 4.200000 21.297727 5.000000 4.300000 21.893354 5.000000 4.400000 22.508981 5.000000 4.500000 23.144608 5.000000 4.600000 23.800235 5.000000 4.700000 24.475862 5.000000 4.800000 25.171489 5.000000 4.900000 25.887116 5.000000 5.000000 26.622743 5.000000 5.100000 27.378369 5.000000 5.200000 28.153996 5.000000 5.300000 28.949623 5.000000 5.400000 29.765250 5.000000 5.500000 30.600877 5.000000 5.600000 31.456504 5.000000 5.700000 32.332131 5.000000 5.800000 33.227758 5.000000 5.900000 34.143385 5.000000 6.000000 35.079011 5.000000 6.100000 36.034638 5.000000 6.200000 37.010265 5.000000 6.300000 38.005892 5.000000 6.400000 39.021519 5.000000 6.500000 40.057146 5.000000 6.600000 41.112773 5.000000 6.700000 42.188400 5.000000 6.800000 43.284026 5.000000 6.900000 44.399653 5.000000 7.000000 45.535280 5.000000 7.100000 46.690907 5.000000 7.200000 47.866534 5.000000 7.300000 49.062161 5.000000 7.400000 50.277788 5.000000 7.500000 51.513415 5.000000 7.600000 52.769042 5.000000 7.700000 54.044668 5.000000 7.800000 55.340295 5.000000 7.900000 56.655922 5.000000 8.000000 57.991549 5.000000 8.100000 59.347176 5.000000 8.200000 60.722803 5.000000 8.300000 62.118430 5.000000 8.400000 63.534057 5.000000 8.500000 64.969684 5.000000 8.600000 66.425310 5.000000 8.700000 67.900937 5.000000 8.800000 69.396564 5.000000 8.900000 70.912191 5.000000 9.000000 72.447818 5.000000 9.100000 74.003445 5.000000 9.200000 75.579072 5.000000 9.300000 77.174699 5.000000 9.400000 78.790326 5.000000 9.500000 80.425952 5.000000 9.600000 82.081579 5.000000 9.700000 83.757206 5.000000 9.800000 85.452833 5.000000 9.900000 87.168460 5.000000 10.000000 88.904087 5.000000 10.100000 90.659714 5.000000 10.200000 92.435341 5.000000 10.300000 94.230967 5.000000 10.400000 96.046594 5.000000 10.500000 97.882221 5.000000 10.600000 99.737848 5.000000 10.700000 101.613475 5.000000 10.800000 103.509102 5.000000 10.900000 105.424729 5.000000 11.000000 107.360356 5.000000 11.100000 109.315983 5.000000 11.200000 111.291609 5.000000 11.300000 113.287236 5.000000 11.400000 115.302863 5.000000 11.500000 117.338490 5.000000 11.600000 119.394117 5.000000 11.700000 121.469744 5.000000 11.800000 123.565371 5.000000 11.900000 125.680998 5.000000 12.000000 127.816625 5.000000 12.100000 129.972251 5.000000 12.200000 132.147878 5.000000 12.300000 134.343505 5.000000 12.400000 136.559132 5.000000 12.500000 138.794759 5.000000 12.600000 141.050386 5.000000 12.700000 143.326013 5.000000 12.800000 145.621640 5.000000 12.900000 147.937266 5.000000 13.000000 150.272893 5.000000 13.100000 152.628520 5.000000 13.200000 155.004147 5.000000 13.300000 157.399774 5.000000 13.400000 159.815401 5.000000 13.500000 162.251028 5.000000 13.600000 164.706655 5.000000 13.700000 167.182282 5.000000 13.800000 169.677908 5.000000 13.900000 172.193535 5.000000 14.000000 174.729162 5.000000 14.100000 177.284789 5.000000 14.200000 179.860416 5.000000 14.300000 182.456043 5.000000 14.400000 185.071670 5.000000 14.500000 187.707297 5.000000 14.600000 190.362924 5.000000 14.700000 193.038550 5.000000 14.800000 195.734177 5.000000 14.900000 198.449804 5.000000 15.000000 201.185431 5.100000 -5.000000 52.606769 5.100000 -4.900000 51.368131 5.100000 -4.800000 50.149494 5.100000 -4.700000 48.950856 5.100000 -4.600000 47.772219 5.100000 -4.500000 46.613582 5.100000 -4.400000 45.474944 5.100000 -4.300000 44.356307 5.100000 -4.200000 43.257669 5.100000 -4.100000 42.179032 5.100000 -4.000000 41.120395 5.100000 -3.900000 40.081757 5.100000 -3.800000 39.063120 5.100000 -3.700000 38.064482 5.100000 -3.600000 37.085845 5.100000 -3.500000 36.127208 5.100000 -3.400000 35.188570 5.100000 -3.300000 34.269933 5.100000 -3.200000 33.371295 5.100000 -3.100000 32.492658 5.100000 -3.000000 31.634021 5.100000 -2.900000 30.795383 5.100000 -2.800000 29.976746 5.100000 -2.700000 29.178108 5.100000 -2.600000 28.399471 5.100000 -2.500000 27.640834 5.100000 -2.400000 26.902196 5.100000 -2.300000 26.183559 5.100000 -2.200000 25.484921 5.100000 -2.100000 24.806284 5.100000 -2.000000 24.147647 5.100000 -1.900000 23.509009 5.100000 -1.800000 22.890372 5.100000 -1.700000 22.291734 5.100000 -1.600000 21.713097 5.100000 -1.500000 21.154460 5.100000 -1.400000 20.615822 5.100000 -1.300000 20.097185 5.100000 -1.200000 19.598548 5.100000 -1.100000 19.119910 5.100000 -1.000000 18.661273 5.100000 -0.900000 18.222635 5.100000 -0.800000 17.803998 5.100000 -0.700000 17.405361 5.100000 -0.600000 17.026723 5.100000 -0.500000 16.668086 5.100000 -0.400000 16.329448 5.100000 -0.300000 16.010811 5.100000 -0.200000 15.712174 5.100000 -0.100000 15.433536 5.100000 -0.000000 15.174899 5.100000 0.100000 14.936261 5.100000 0.200000 14.717624 5.100000 0.300000 14.518987 5.100000 0.400000 14.340349 5.100000 0.500000 14.181712 5.100000 0.600000 14.043074 5.100000 0.700000 13.924437 5.100000 0.800000 13.825800 5.100000 0.900000 13.747162 5.100000 1.000000 13.688525 5.100000 1.100000 13.649887 5.100000 1.200000 13.631250 5.100000 1.300000 13.632613 5.100000 1.400000 13.653975 5.100000 1.500000 13.695338 5.100000 1.600000 13.756700 5.100000 1.700000 13.838063 5.100000 1.800000 13.939426 5.100000 1.900000 14.060788 5.100000 2.000000 14.202151 5.100000 2.100000 14.363513 5.100000 2.200000 14.544876 5.100000 2.300000 14.746239 5.100000 2.400000 14.967601 5.100000 2.500000 15.208964 5.100000 2.600000 15.470326 5.100000 2.700000 15.751689 5.100000 2.800000 16.053052 5.100000 2.900000 16.374414 5.100000 3.000000 16.715777 5.100000 3.100000 17.077139 5.100000 3.200000 17.458502 5.100000 3.300000 17.859865 5.100000 3.400000 18.281227 5.100000 3.500000 18.722590 5.100000 3.600000 19.183952 5.100000 3.700000 19.665315 5.100000 3.800000 20.166678 5.100000 3.900000 20.688040 5.100000 4.000000 21.229403 5.100000 4.100000 21.790765 5.100000 4.200000 22.372128 5.100000 4.300000 22.973491 5.100000 4.400000 23.594853 5.100000 4.500000 24.236216 5.100000 4.600000 24.897578 5.100000 4.700000 25.578941 5.100000 4.800000 26.280304 5.100000 4.900000 27.001666 5.100000 5.000000 27.743029 5.100000 5.100000 28.504391 5.100000 5.200000 29.285754 5.100000 5.300000 30.087117 5.100000 5.400000 30.908479 5.100000 5.500000 31.749842 5.100000 5.600000 32.611205 5.100000 5.700000 33.492567 5.100000 5.800000 34.393930 5.100000 5.900000 35.315292 5.100000 6.000000 36.256655 5.100000 6.100000 37.218018 5.100000 6.200000 38.199380 5.100000 6.300000 39.200743 5.100000 6.400000 40.222105 5.100000 6.500000 41.263468 5.100000 6.600000 42.324831 5.100000 6.700000 43.406193 5.100000 6.800000 44.507556 5.100000 6.900000 45.628918 5.100000 7.000000 46.770281 5.100000 7.100000 47.931644 5.100000 7.200000 49.113006 5.100000 7.300000 50.314369 5.100000 7.400000 51.535731 5.100000 7.500000 52.777094 5.100000 7.600000 54.038457 5.100000 7.700000 55.319819 5.100000 7.800000 56.621182 5.100000 7.900000 57.942544 5.100000 8.000000 59.283907 5.100000 8.100000 60.645270 5.100000 8.200000 62.026632 5.100000 8.300000 63.427995 5.100000 8.400000 64.849357 5.100000 8.500000 66.290720 5.100000 8.600000 67.752083 5.100000 8.700000 69.233445 5.100000 8.800000 70.734808 5.100000 8.900000 72.256170 5.100000 9.000000 73.797533 5.100000 9.100000 75.358896 5.100000 9.200000 76.940258 5.100000 9.300000 78.541621 5.100000 9.400000 80.162983 5.100000 9.500000 81.804346 5.100000 9.600000 83.465709 5.100000 9.700000 85.147071 5.100000 9.800000 86.848434 5.100000 9.900000 88.569796 5.100000 10.000000 90.311159 5.100000 10.100000 92.072522 5.100000 10.200000 93.853884 5.100000 10.300000 95.655247 5.100000 10.400000 97.476609 5.100000 10.500000 99.317972 5.100000 10.600000 101.179335 5.100000 10.700000 103.060697 5.100000 10.800000 104.962060 5.100000 10.900000 106.883422 5.100000 11.000000 108.824785 5.100000 11.100000 110.786148 5.100000 11.200000 112.767510 5.100000 11.300000 114.768873 5.100000 11.400000 116.790235 5.100000 11.500000 118.831598 5.100000 11.600000 120.892961 5.100000 11.700000 122.974323 5.100000 11.800000 125.075686 5.100000 11.900000 127.197048 5.100000 12.000000 129.338411 5.100000 12.100000 131.499774 5.100000 12.200000 133.681136 5.100000 12.300000 135.882499 5.100000 12.400000 138.103862 5.100000 12.500000 140.345224 5.100000 12.600000 142.606587 5.100000 12.700000 144.887949 5.100000 12.800000 147.189312 5.100000 12.900000 149.510675 5.100000 13.000000 151.852037 5.100000 13.100000 154.213400 5.100000 13.200000 156.594762 5.100000 13.300000 158.996125 5.100000 13.400000 161.417488 5.100000 13.500000 163.858850 5.100000 13.600000 166.320213 5.100000 13.700000 168.801575 5.100000 13.800000 171.302938 5.100000 13.900000 173.824301 5.100000 14.000000 176.365663 5.100000 14.100000 178.927026 5.100000 14.200000 181.508388 5.100000 14.300000 184.109751 5.100000 14.400000 186.731114 5.100000 14.500000 189.372476 5.100000 14.600000 192.033839 5.100000 14.700000 194.715201 5.100000 14.800000 197.416564 5.100000 14.900000 200.137927 5.100000 15.000000 202.879289 5.200000 -5.000000 53.150984 5.200000 -4.900000 51.917565 5.200000 -4.800000 50.704147 5.200000 -4.700000 49.510729 5.200000 -4.600000 48.337310 5.200000 -4.500000 47.183892 5.200000 -4.400000 46.050473 5.200000 -4.300000 44.937055 5.200000 -4.200000 43.843637 5.200000 -4.100000 42.770218 5.200000 -4.000000 41.716800 5.200000 -3.900000 40.683381 5.200000 -3.800000 39.669963 5.200000 -3.700000 38.676544 5.200000 -3.600000 37.703126 5.200000 -3.500000 36.749708 5.200000 -3.400000 35.816289 5.200000 -3.300000 34.902871 5.200000 -3.200000 34.009452 5.200000 -3.100000 33.136034 5.200000 -3.000000 32.282616 5.200000 -2.900000 31.449197 5.200000 -2.800000 30.635779 5.200000 -2.700000 29.842360 5.200000 -2.600000 29.068942 5.200000 -2.500000 28.315523 5.200000 -2.400000 27.582105 5.200000 -2.300000 26.868687 5.200000 -2.200000 26.175268 5.200000 -2.100000 25.501850 5.200000 -2.000000 24.848431 5.200000 -1.900000 24.215013 5.200000 -1.800000 23.601595 5.200000 -1.700000 23.008176 5.200000 -1.600000 22.434758 5.200000 -1.500000 21.881339 5.200000 -1.400000 21.347921 5.200000 -1.300000 20.834502 5.200000 -1.200000 20.341084 5.200000 -1.100000 19.867666 5.200000 -1.000000 19.414247 5.200000 -0.900000 18.980829 5.200000 -0.800000 18.567410 5.200000 -0.700000 18.173992 5.200000 -0.600000 17.800574 5.200000 -0.500000 17.447155 5.200000 -0.400000 17.113737 5.200000 -0.300000 16.800318 5.200000 -0.200000 16.506900 5.200000 -0.100000 16.233481 5.200000 -0.000000 15.980063 5.200000 0.100000 15.746645 5.200000 0.200000 15.533226 5.200000 0.300000 15.339808 5.200000 0.400000 15.166389 5.200000 0.500000 15.012971 5.200000 0.600000 14.879552 5.200000 0.700000 14.766134 5.200000 0.800000 14.672716 5.200000 0.900000 14.599297 5.200000 1.000000 14.545879 5.200000 1.100000 14.512460 5.200000 1.200000 14.499042 5.200000 1.300000 14.505624 5.200000 1.400000 14.532205 5.200000 1.500000 14.578787 5.200000 1.600000 14.645368 5.200000 1.700000 14.731950 5.200000 1.800000 14.838531 5.200000 1.900000 14.965113 5.200000 2.000000 15.111695 5.200000 2.100000 15.278276 5.200000 2.200000 15.464858 5.200000 2.300000 15.671439 5.200000 2.400000 15.898021 5.200000 2.500000 16.144603 5.200000 2.600000 16.411184 5.200000 2.700000 16.697766 5.200000 2.800000 17.004347 5.200000 2.900000 17.330929 5.200000 3.000000 17.677510 5.200000 3.100000 18.044092 5.200000 3.200000 18.430674 5.200000 3.300000 18.837255 5.200000 3.400000 19.263837 5.200000 3.500000 19.710418 5.200000 3.600000 20.177000 5.200000 3.700000 20.663582 5.200000 3.800000 21.170163 5.200000 3.900000 21.696745 5.200000 4.000000 22.243326 5.200000 4.100000 22.809908 5.200000 4.200000 23.396489 5.200000 4.300000 24.003071 5.200000 4.400000 24.629653 5.200000 4.500000 25.276234 5.200000 4.600000 25.942816 5.200000 4.700000 26.629397 5.200000 4.800000 27.335979 5.200000 4.900000 28.062561 5.200000 5.000000 28.809142 5.200000 5.100000 29.575724 5.200000 5.200000 30.362305 5.200000 5.300000 31.168887 5.200000 5.400000 31.995468 5.200000 5.500000 32.842050 5.200000 5.600000 33.708632 5.200000 5.700000 34.595213 5.200000 5.800000 35.501795 5.200000 5.900000 36.428376 5.200000 6.000000 37.374958 5.200000 6.100000 38.341540 5.200000 6.200000 39.328121 5.200000 6.300000 40.334703 5.200000 6.400000 41.361284 5.200000 6.500000 42.407866 5.200000 6.600000 43.474447 5.200000 6.700000 44.561029 5.200000 6.800000 45.667611 5.200000 6.900000 46.794192 5.200000 7.000000 47.940774 5.200000 7.100000 49.107355 5.200000 7.200000 50.293937 5.200000 7.300000 51.500519 5.200000 7.400000 52.727100 5.200000 7.500000 53.973682 5.200000 7.600000 55.240263 5.200000 7.700000 56.526845 5.200000 7.800000 57.833426 5.200000 7.900000 59.160008 5.200000 8.000000 60.506590 5.200000 8.100000 61.873171 5.200000 8.200000 63.259753 5.200000 8.300000 64.666334 5.200000 8.400000 66.092916 5.200000 8.500000 67.539498 5.200000 8.600000 69.006079 5.200000 8.700000 70.492661 5.200000 8.800000 71.999242 5.200000 8.900000 73.525824 5.200000 9.000000 75.072405 5.200000 9.100000 76.638987 5.200000 9.200000 78.225569 5.200000 9.300000 79.832150 5.200000 9.400000 81.458732 5.200000 9.500000 83.105313 5.200000 9.600000 84.771895 5.200000 9.700000 86.458477 5.200000 9.800000 88.165058 5.200000 9.900000 89.891640 5.200000 10.000000 91.638221 5.200000 10.100000 93.404803 5.200000 10.200000 95.191384 5.200000 10.300000 96.997966 5.200000 10.400000 98.824548 5.200000 10.500000 100.671129 5.200000 10.600000 102.537711 5.200000 10.700000 104.424292 5.200000 10.800000 106.330874 5.200000 10.900000 108.257456 5.200000 11.000000 110.204037 5.200000 11.100000 112.170619 5.200000 11.200000 114.157200 5.200000 11.300000 116.163782 5.200000 11.400000 118.190363 5.200000 11.500000 120.236945 5.200000 11.600000 122.303527 5.200000 11.700000 124.390108 5.200000 11.800000 126.496690 5.200000 11.900000 128.623271 5.200000 12.000000 130.769853 5.200000 12.100000 132.936435 5.200000 12.200000 135.123016 5.200000 12.300000 137.329598 5.200000 12.400000 139.556179 5.200000 12.500000 141.802761 5.200000 12.600000 144.069342 5.200000 12.700000 146.355924 5.200000 12.800000 148.662506 5.200000 12.900000 150.989087 5.200000 13.000000 153.335669 5.200000 13.100000 155.702250 5.200000 13.200000 158.088832 5.200000 13.300000 160.495413 5.200000 13.400000 162.921995 5.200000 13.500000 165.368577 5.200000 13.600000 167.835158 5.200000 13.700000 170.321740 5.200000 13.800000 172.828321 5.200000 13.900000 175.354903 5.200000 14.000000 177.901485 5.200000 14.100000 180.468066 5.200000 14.200000 183.054648 5.200000 14.300000 185.661229 5.200000 14.400000 188.287811 5.200000 14.500000 190.934392 5.200000 14.600000 193.600974 5.200000 14.700000 196.287556 5.200000 14.800000 198.994137 5.200000 14.900000 201.720719 5.200000 15.000000 204.467300 5.300000 -5.000000 53.683609 5.300000 -4.900000 52.454893 5.300000 -4.800000 51.246177 5.300000 -4.700000 50.057460 5.300000 -4.600000 48.888744 5.300000 -4.500000 47.740028 5.300000 -4.400000 46.611312 5.300000 -4.300000 45.502596 5.300000 -4.200000 44.413880 5.300000 -4.100000 43.345163 5.300000 -4.000000 42.296447 5.300000 -3.900000 41.267731 5.300000 -3.800000 40.259015 5.300000 -3.700000 39.270299 5.300000 -3.600000 38.301582 5.300000 -3.500000 37.352866 5.300000 -3.400000 36.424150 5.300000 -3.300000 35.515434 5.300000 -3.200000 34.626718 5.300000 -3.100000 33.758002 5.300000 -3.000000 32.909285 5.300000 -2.900000 32.080569 5.300000 -2.800000 31.271853 5.300000 -2.700000 30.483137 5.300000 -2.600000 29.714421 5.300000 -2.500000 28.965705 5.300000 -2.400000 28.236988 5.300000 -2.300000 27.528272 5.300000 -2.200000 26.839556 5.300000 -2.100000 26.170840 5.300000 -2.000000 25.522124 5.300000 -1.900000 24.893407 5.300000 -1.800000 24.284691 5.300000 -1.700000 23.695975 5.300000 -1.600000 23.127259 5.300000 -1.500000 22.578543 5.300000 -1.400000 22.049827 5.300000 -1.300000 21.541110 5.300000 -1.200000 21.052394 5.300000 -1.100000 20.583678 5.300000 -1.000000 20.134962 5.300000 -0.900000 19.706246 5.300000 -0.800000 19.297530 5.300000 -0.700000 18.908813 5.300000 -0.600000 18.540097 5.300000 -0.500000 18.191381 5.300000 -0.400000 17.862665 5.300000 -0.300000 17.553949 5.300000 -0.200000 17.265232 5.300000 -0.100000 16.996516 5.300000 -0.000000 16.747800 5.300000 0.100000 16.519084 5.300000 0.200000 16.310368 5.300000 0.300000 16.121652 5.300000 0.400000 15.952935 5.300000 0.500000 15.804219 5.300000 0.600000 15.675503 5.300000 0.700000 15.566787 5.300000 0.800000 15.478071 5.300000 0.900000 15.409355 5.300000 1.000000 15.360638 5.300000 1.100000 15.331922 5.300000 1.200000 15.323206 5.300000 1.300000 15.334490 5.300000 1.400000 15.365774 5.300000 1.500000 15.417058 5.300000 1.600000 15.488341 5.300000 1.700000 15.579625 5.300000 1.800000 15.690909 5.300000 1.900000 15.822193 5.300000 2.000000 15.973477 5.300000 2.100000 16.144760 5.300000 2.200000 16.336044 5.300000 2.300000 16.547328 5.300000 2.400000 16.778612 5.300000 2.500000 17.029896 5.300000 2.600000 17.301180 5.300000 2.700000 17.592463 5.300000 2.800000 17.903747 5.300000 2.900000 18.235031 5.300000 3.000000 18.586315 5.300000 3.100000 18.957599 5.300000 3.200000 19.348883 5.300000 3.300000 19.760166 5.300000 3.400000 20.191450 5.300000 3.500000 20.642734 5.300000 3.600000 21.114018 5.300000 3.700000 21.605302 5.300000 3.800000 22.116585 5.300000 3.900000 22.647869 5.300000 4.000000 23.199153 5.300000 4.100000 23.770437 5.300000 4.200000 24.361721 5.300000 4.300000 24.973005 5.300000 4.400000 25.604288 5.300000 4.500000 26.255572 5.300000 4.600000 26.926856 5.300000 4.700000 27.618140 5.300000 4.800000 28.329424 5.300000 4.900000 29.060708 5.300000 5.000000 29.811991 5.300000 5.100000 30.583275 5.300000 5.200000 31.374559 5.300000 5.300000 32.185843 5.300000 5.400000 33.017127 5.300000 5.500000 33.868410 5.300000 5.600000 34.739694 5.300000 5.700000 35.630978 5.300000 5.800000 36.542262 5.300000 5.900000 37.473546 5.300000 6.000000 38.424830 5.300000 6.100000 39.396113 5.300000 6.200000 40.387397 5.300000 6.300000 41.398681 5.300000 6.400000 42.429965 5.300000 6.500000 43.481249 5.300000 6.600000 44.552533 5.300000 6.700000 45.643816 5.300000 6.800000 46.755100 5.300000 6.900000 47.886384 5.300000 7.000000 49.037668 5.300000 7.100000 50.208952 5.300000 7.200000 51.400235 5.300000 7.300000 52.611519 5.300000 7.400000 53.842803 5.300000 7.500000 55.094087 5.300000 7.600000 56.365371 5.300000 7.700000 57.656655 5.300000 7.800000 58.967938 5.300000 7.900000 60.299222 5.300000 8.000000 61.650506 5.300000 8.100000 63.021790 5.300000 8.200000 64.413074 5.300000 8.300000 65.824358 5.300000 8.400000 67.255641 5.300000 8.500000 68.706925 5.300000 8.600000 70.178209 5.300000 8.700000 71.669493 5.300000 8.800000 73.180777 5.300000 8.900000 74.712061 5.300000 9.000000 76.263344 5.300000 9.100000 77.834628 5.300000 9.200000 79.425912 5.300000 9.300000 81.037196 5.300000 9.400000 82.668480 5.300000 9.500000 84.319763 5.300000 9.600000 85.991047 5.300000 9.700000 87.682331 5.300000 9.800000 89.393615 5.300000 9.900000 91.124899 5.300000 10.000000 92.876183 5.300000 10.100000 94.647466 5.300000 10.200000 96.438750 5.300000 10.300000 98.250034 5.300000 10.400000 100.081318 5.300000 10.500000 101.932602 5.300000 10.600000 103.803886 5.300000 10.700000 105.695169 5.300000 10.800000 107.606453 5.300000 10.900000 109.537737 5.300000 11.000000 111.489021 5.300000 11.100000 113.460305 5.300000 11.200000 115.451588 5.300000 11.300000 117.462872 5.300000 11.400000 119.494156 5.300000 11.500000 121.545440 5.300000 11.600000 123.616724 5.300000 11.700000 125.708008 5.300000 11.800000 127.819291 5.300000 11.900000 129.950575 5.300000 12.000000 132.101859 5.300000 12.100000 134.273143 5.300000 12.200000 136.464427 5.300000 12.300000 138.675711 5.300000 12.400000 140.906994 5.300000 12.500000 143.158278 5.300000 12.600000 145.429562 5.300000 12.700000 147.720846 5.300000 12.800000 150.032130 5.300000 12.900000 152.363413 5.300000 13.000000 154.714697 5.300000 13.100000 157.085981 5.300000 13.200000 159.477265 5.300000 13.300000 161.888549 5.300000 13.400000 164.319833 5.300000 13.500000 166.771116 5.300000 13.600000 169.242400 5.300000 13.700000 171.733684 5.300000 13.800000 174.244968 5.300000 13.900000 176.776252 5.300000 14.000000 179.327536 5.300000 14.100000 181.898819 5.300000 14.200000 184.490103 5.300000 14.300000 187.101387 5.300000 14.400000 189.732671 5.300000 14.500000 192.383955 5.300000 14.600000 195.055238 5.300000 14.700000 197.746522 5.300000 14.800000 200.457806 5.300000 14.900000 203.189090 5.300000 15.000000 205.940374 5.400000 -5.000000 54.196042 5.400000 -4.900000 52.971511 5.400000 -4.800000 51.766981 5.400000 -4.700000 50.582450 5.400000 -4.600000 49.417919 5.400000 -4.500000 48.273389 5.400000 -4.400000 47.148858 5.400000 -4.300000 46.044327 5.400000 -4.200000 44.959797 5.400000 -4.100000 43.895266 5.400000 -4.000000 42.850735 5.400000 -3.900000 41.826205 5.400000 -3.800000 40.821674 5.400000 -3.700000 39.837143 5.400000 -3.600000 38.872613 5.400000 -3.500000 37.928082 5.400000 -3.400000 37.003551 5.400000 -3.300000 36.099021 5.400000 -3.200000 35.214490 5.400000 -3.100000 34.349959 5.400000 -3.000000 33.505429 5.400000 -2.900000 32.680898 5.400000 -2.800000 31.876367 5.400000 -2.700000 31.091837 5.400000 -2.600000 30.327306 5.400000 -2.500000 29.582775 5.400000 -2.400000 28.858245 5.400000 -2.300000 28.153714 5.400000 -2.200000 27.469183 5.400000 -2.100000 26.804653 5.400000 -2.000000 26.160122 5.400000 -1.900000 25.535591 5.400000 -1.800000 24.931060 5.400000 -1.700000 24.346530 5.400000 -1.600000 23.781999 5.400000 -1.500000 23.237468 5.400000 -1.400000 22.712938 5.400000 -1.300000 22.208407 5.400000 -1.200000 21.723876 5.400000 -1.100000 21.259346 5.400000 -1.000000 20.814815 5.400000 -0.900000 20.390284 5.400000 -0.800000 19.985754 5.400000 -0.700000 19.601223 5.400000 -0.600000 19.236692 5.400000 -0.500000 18.892162 5.400000 -0.400000 18.567631 5.400000 -0.300000 18.263100 5.400000 -0.200000 17.978570 5.400000 -0.100000 17.714039 5.400000 -0.000000 17.469508 5.400000 0.100000 17.244978 5.400000 0.200000 17.040447 5.400000 0.300000 16.855916 5.400000 0.400000 16.691386 5.400000 0.500000 16.546855 5.400000 0.600000 16.422324 5.400000 0.700000 16.317794 5.400000 0.800000 16.233263 5.400000 0.900000 16.168732 5.400000 1.000000 16.124202 5.400000 1.100000 16.099671 5.400000 1.200000 16.095140 5.400000 1.300000 16.110610 5.400000 1.400000 16.146079 5.400000 1.500000 16.201548 5.400000 1.600000 16.277018 5.400000 1.700000 16.372487 5.400000 1.800000 16.487956 5.400000 1.900000 16.623426 5.400000 2.000000 16.778895 5.400000 2.100000 16.954364 5.400000 2.200000 17.149834 5.400000 2.300000 17.365303 5.400000 2.400000 17.600772 5.400000 2.500000 17.856242 5.400000 2.600000 18.131711 5.400000 2.700000 18.427180 5.400000 2.800000 18.742650 5.400000 2.900000 19.078119 5.400000 3.000000 19.433588 5.400000 3.100000 19.809058 5.400000 3.200000 20.204527 5.400000 3.300000 20.619996 5.400000 3.400000 21.055466 5.400000 3.500000 21.510935 5.400000 3.600000 21.986404 5.400000 3.700000 22.481874 5.400000 3.800000 22.997343 5.400000 3.900000 23.532812 5.400000 4.000000 24.088282 5.400000 4.100000 24.663751 5.400000 4.200000 25.259220 5.400000 4.300000 25.874689 5.400000 4.400000 26.510159 5.400000 4.500000 27.165628 5.400000 4.600000 27.841097 5.400000 4.700000 28.536567 5.400000 4.800000 29.252036 5.400000 4.900000 29.987505 5.400000 5.000000 30.742975 5.400000 5.100000 31.518444 5.400000 5.200000 32.313913 5.400000 5.300000 33.129383 5.400000 5.400000 33.964852 5.400000 5.500000 34.820321 5.400000 5.600000 35.695791 5.400000 5.700000 36.591260 5.400000 5.800000 37.506729 5.400000 5.900000 38.442199 5.400000 6.000000 39.397668 5.400000 6.100000 40.373137 5.400000 6.200000 41.368607 5.400000 6.300000 42.384076 5.400000 6.400000 43.419545 5.400000 6.500000 44.475015 5.400000 6.600000 45.550484 5.400000 6.700000 46.645953 5.400000 6.800000 47.761423 5.400000 6.900000 48.896892 5.400000 7.000000 50.052361 5.400000 7.100000 51.227831 5.400000 7.200000 52.423300 5.400000 7.300000 53.638769 5.400000 7.400000 54.874239 5.400000 7.500000 56.129708 5.400000 7.600000 57.405177 5.400000 7.700000 58.700647 5.400000 7.800000 60.016116 5.400000 7.900000 61.351585 5.400000 8.000000 62.707055 5.400000 8.100000 64.082524 5.400000 8.200000 65.477993 5.400000 8.300000 66.893463 5.400000 8.400000 68.328932 5.400000 8.500000 69.784401 5.400000 8.600000 71.259871 5.400000 8.700000 72.755340 5.400000 8.800000 74.270809 5.400000 8.900000 75.806279 5.400000 9.000000 77.361748 5.400000 9.100000 78.937217 5.400000 9.200000 80.532687 5.400000 9.300000 82.148156 5.400000 9.400000 83.783625 5.400000 9.500000 85.439095 5.400000 9.600000 87.114564 5.400000 9.700000 88.810033 5.400000 9.800000 90.525503 5.400000 9.900000 92.260972 5.400000 10.000000 94.016441 5.400000 10.100000 95.791911 5.400000 10.200000 97.587380 5.400000 10.300000 99.402849 5.400000 10.400000 101.238319 5.400000 10.500000 103.093788 5.400000 10.600000 104.969257 5.400000 10.700000 106.864726 5.400000 10.800000 108.780196 5.400000 10.900000 110.715665 5.400000 11.000000 112.671134 5.400000 11.100000 114.646604 5.400000 11.200000 116.642073 5.400000 11.300000 118.657542 5.400000 11.400000 120.693012 5.400000 11.500000 122.748481 5.400000 11.600000 124.823950 5.400000 11.700000 126.919420 5.400000 11.800000 129.034889 5.400000 11.900000 131.170358 5.400000 12.000000 133.325828 5.400000 12.100000 135.501297 5.400000 12.200000 137.696766 5.400000 12.300000 139.912236 5.400000 12.400000 142.147705 5.400000 12.500000 144.403174 5.400000 12.600000 146.678644 5.400000 12.700000 148.974113 5.400000 12.800000 151.289582 5.400000 12.900000 153.625052 5.400000 13.000000 155.980521 5.400000 13.100000 158.355990 5.400000 13.200000 160.751460 5.400000 13.300000 163.166929 5.400000 13.400000 165.602398 5.400000 13.500000 168.057868 5.400000 13.600000 170.533337 5.400000 13.700000 173.028806 5.400000 13.800000 175.544276 5.400000 13.900000 178.079745 5.400000 14.000000 180.635214 5.400000 14.100000 183.210684 5.400000 14.200000 185.806153 5.400000 14.300000 188.421622 5.400000 14.400000 191.057092 5.400000 14.500000 193.712561 5.400000 14.600000 196.388030 5.400000 14.700000 199.083500 5.400000 14.800000 201.798969 5.400000 14.900000 204.534438 5.400000 15.000000 207.289908 5.500000 -5.000000 54.680253 5.500000 -4.900000 53.459391 5.500000 -4.800000 52.258529 5.500000 -4.700000 51.077667 5.500000 -4.600000 49.916805 5.500000 -4.500000 48.775943 5.500000 -4.400000 47.655081 5.500000 -4.300000 46.554219 5.500000 -4.200000 45.473358 5.500000 -4.100000 44.412496 5.500000 -4.000000 43.371634 5.500000 -3.900000 42.350772 5.500000 -3.800000 41.349910 5.500000 -3.700000 40.369048 5.500000 -3.600000 39.408186 5.500000 -3.500000 38.467324 5.500000 -3.400000 37.546462 5.500000 -3.300000 36.645600 5.500000 -3.200000 35.764738 5.500000 -3.100000 34.903877 5.500000 -3.000000 34.063015 5.500000 -2.900000 33.242153 5.500000 -2.800000 32.441291 5.500000 -2.700000 31.660429 5.500000 -2.600000 30.899567 5.500000 -2.500000 30.158705 5.500000 -2.400000 29.437843 5.500000 -2.300000 28.736981 5.500000 -2.200000 28.056119 5.500000 -2.100000 27.395258 5.500000 -2.000000 26.754396 5.500000 -1.900000 26.133534 5.500000 -1.800000 25.532672 5.500000 -1.700000 24.951810 5.500000 -1.600000 24.390948 5.500000 -1.500000 23.850086 5.500000 -1.400000 23.329224 5.500000 -1.300000 22.828362 5.500000 -1.200000 22.347500 5.500000 -1.100000 21.886638 5.500000 -1.000000 21.445777 5.500000 -0.900000 21.024915 5.500000 -0.800000 20.624053 5.500000 -0.700000 20.243191 5.500000 -0.600000 19.882329 5.500000 -0.500000 19.541467 5.500000 -0.400000 19.220605 5.500000 -0.300000 18.919743 5.500000 -0.200000 18.638881 5.500000 -0.100000 18.378019 5.500000 -0.000000 18.137157 5.500000 0.100000 17.916296 5.500000 0.200000 17.715434 5.500000 0.300000 17.534572 5.500000 0.400000 17.373710 5.500000 0.500000 17.232848 5.500000 0.600000 17.111986 5.500000 0.700000 17.011124 5.500000 0.800000 16.930262 5.500000 0.900000 16.869400 5.500000 1.000000 16.828538 5.500000 1.100000 16.807677 5.500000 1.200000 16.806815 5.500000 1.300000 16.825953 5.500000 1.400000 16.865091 5.500000 1.500000 16.924229 5.500000 1.600000 17.003367 5.500000 1.700000 17.102505 5.500000 1.800000 17.221643 5.500000 1.900000 17.360781 5.500000 2.000000 17.519919 5.500000 2.100000 17.699057 5.500000 2.200000 17.898196 5.500000 2.300000 18.117334 5.500000 2.400000 18.356472 5.500000 2.500000 18.615610 5.500000 2.600000 18.894748 5.500000 2.700000 19.193886 5.500000 2.800000 19.513024 5.500000 2.900000 19.852162 5.500000 3.000000 20.211300 5.500000 3.100000 20.590438 5.500000 3.200000 20.989576 5.500000 3.300000 21.408715 5.500000 3.400000 21.847853 5.500000 3.500000 22.306991 5.500000 3.600000 22.786129 5.500000 3.700000 23.285267 5.500000 3.800000 23.804405 5.500000 3.900000 24.343543 5.500000 4.000000 24.902681 5.500000 4.100000 25.481819 5.500000 4.200000 26.080957 5.500000 4.300000 26.700096 5.500000 4.400000 27.339234 5.500000 4.500000 27.998372 5.500000 4.600000 28.677510 5.500000 4.700000 29.376648 5.500000 4.800000 30.095786 5.500000 4.900000 30.834924 5.500000 5.000000 31.594062 5.500000 5.100000 32.373200 5.500000 5.200000 33.172338 5.500000 5.300000 33.991476 5.500000 5.400000 34.830615 5.500000 5.500000 35.689753 5.500000 5.600000 36.568891 5.500000 5.700000 37.468029 5.500000 5.800000 38.387167 5.500000 5.900000 39.326305 5.500000 6.000000 40.285443 5.500000 6.100000 41.264581 5.500000 6.200000 42.263719 5.500000 6.300000 43.282857 5.500000 6.400000 44.321995 5.500000 6.500000 45.381134 5.500000 6.600000 46.460272 5.500000 6.700000 47.559410 5.500000 6.800000 48.678548 5.500000 6.900000 49.817686 5.500000 7.000000 50.976824 5.500000 7.100000 52.155962 5.500000 7.200000 53.355100 5.500000 7.300000 54.574238 5.500000 7.400000 55.813376 5.500000 7.500000 57.072515 5.500000 7.600000 58.351653 5.500000 7.700000 59.650791 5.500000 7.800000 60.969929 5.500000 7.900000 62.309067 5.500000 8.000000 63.668205 5.500000 8.100000 65.047343 5.500000 8.200000 66.446481 5.500000 8.300000 67.865619 5.500000 8.400000 69.304757 5.500000 8.500000 70.763895 5.500000 8.600000 72.243034 5.500000 8.700000 73.742172 5.500000 8.800000 75.261310 5.500000 8.900000 76.800448 5.500000 9.000000 78.359586 5.500000 9.100000 79.938724 5.500000 9.200000 81.537862 5.500000 9.300000 83.157000 5.500000 9.400000 84.796138 5.500000 9.500000 86.455276 5.500000 9.600000 88.134414 5.500000 9.700000 89.833553 5.500000 9.800000 91.552691 5.500000 9.900000 93.291829 5.500000 10.000000 95.050967 5.500000 10.100000 96.830105 5.500000 10.200000 98.629243 5.500000 10.300000 100.448381 5.500000 10.400000 102.287519 5.500000 10.500000 104.146657 5.500000 10.600000 106.025795 5.500000 10.700000 107.924934 5.500000 10.800000 109.844072 5.500000 10.900000 111.783210 5.500000 11.000000 113.742348 5.500000 11.100000 115.721486 5.500000 11.200000 117.720624 5.500000 11.300000 119.739762 5.500000 11.400000 121.778900 5.500000 11.500000 123.838038 5.500000 11.600000 125.917176 5.500000 11.700000 128.016314 5.500000 11.800000 130.135453 5.500000 11.900000 132.274591 5.500000 12.000000 134.433729 5.500000 12.100000 136.612867 5.500000 12.200000 138.812005 5.500000 12.300000 141.031143 5.500000 12.400000 143.270281 5.500000 12.500000 145.529419 5.500000 12.600000 147.808557 5.500000 12.700000 150.107695 5.500000 12.800000 152.426833 5.500000 12.900000 154.765972 5.500000 13.000000 157.125110 5.500000 13.100000 159.504248 5.500000 13.200000 161.903386 5.500000 13.300000 164.322524 5.500000 13.400000 166.761662 5.500000 13.500000 169.220800 5.500000 13.600000 171.699938 5.500000 13.700000 174.199076 5.500000 13.800000 176.718214 5.500000 13.900000 179.257353 5.500000 14.000000 181.816491 5.500000 14.100000 184.395629 5.500000 14.200000 186.994767 5.500000 14.300000 189.613905 5.500000 14.400000 192.253043 5.500000 14.500000 194.912181 5.500000 14.600000 197.591319 5.500000 14.700000 200.290457 5.500000 14.800000 203.009595 5.500000 14.900000 205.748733 5.500000 15.000000 208.507872 5.600000 -5.000000 55.128860 5.600000 -4.900000 53.911150 5.600000 -4.800000 52.713440 5.600000 -4.700000 51.535730 5.600000 -4.600000 50.378020 5.600000 -4.500000 49.240310 5.600000 -4.400000 48.122600 5.600000 -4.300000 47.024890 5.600000 -4.200000 45.947181 5.600000 -4.100000 44.889471 5.600000 -4.000000 43.851761 5.600000 -3.900000 42.834051 5.600000 -3.800000 41.836341 5.600000 -3.700000 40.858631 5.600000 -3.600000 39.900921 5.600000 -3.500000 38.963211 5.600000 -3.400000 38.045502 5.600000 -3.300000 37.147792 5.600000 -3.200000 36.270082 5.600000 -3.100000 35.412372 5.600000 -3.000000 34.574662 5.600000 -2.900000 33.756952 5.600000 -2.800000 32.959242 5.600000 -2.700000 32.181532 5.600000 -2.600000 31.423822 5.600000 -2.500000 30.686113 5.600000 -2.400000 29.968403 5.600000 -2.300000 29.270693 5.600000 -2.200000 28.592983 5.600000 -2.100000 27.935273 5.600000 -2.000000 27.297563 5.600000 -1.900000 26.679853 5.600000 -1.800000 26.082143 5.600000 -1.700000 25.504434 5.600000 -1.600000 24.946724 5.600000 -1.500000 24.409014 5.600000 -1.400000 23.891304 5.600000 -1.300000 23.393594 5.600000 -1.200000 22.915884 5.600000 -1.100000 22.458174 5.600000 -1.000000 22.020464 5.600000 -0.900000 21.602755 5.600000 -0.800000 21.205045 5.600000 -0.700000 20.827335 5.600000 -0.600000 20.469625 5.600000 -0.500000 20.131915 5.600000 -0.400000 19.814205 5.600000 -0.300000 19.516495 5.600000 -0.200000 19.238785 5.600000 -0.100000 18.981076 5.600000 -0.000000 18.743366 5.600000 0.100000 18.525656 5.600000 0.200000 18.327946 5.600000 0.300000 18.150236 5.600000 0.400000 17.992526 5.600000 0.500000 17.854816 5.600000 0.600000 17.737106 5.600000 0.700000 17.639396 5.600000 0.800000 17.561687 5.600000 0.900000 17.503977 5.600000 1.000000 17.466267 5.600000 1.100000 17.448557 5.600000 1.200000 17.450847 5.600000 1.300000 17.473137 5.600000 1.400000 17.515427 5.600000 1.500000 17.577717 5.600000 1.600000 17.660008 5.600000 1.700000 17.762298 5.600000 1.800000 17.884588 5.600000 1.900000 18.026878 5.600000 2.000000 18.189168 5.600000 2.100000 18.371458 5.600000 2.200000 18.573748 5.600000 2.300000 18.796038 5.600000 2.400000 19.038329 5.600000 2.500000 19.300619 5.600000 2.600000 19.582909 5.600000 2.700000 19.885199 5.600000 2.800000 20.207489 5.600000 2.900000 20.549779 5.600000 3.000000 20.912069 5.600000 3.100000 21.294359 5.600000 3.200000 21.696650 5.600000 3.300000 22.118940 5.600000 3.400000 22.561230 5.600000 3.500000 23.023520 5.600000 3.600000 23.505810 5.600000 3.700000 24.008100 5.600000 3.800000 24.530390 5.600000 3.900000 25.072680 5.600000 4.000000 25.634970 5.600000 4.100000 26.217261 5.600000 4.200000 26.819551 5.600000 4.300000 27.441841 5.600000 4.400000 28.084131 5.600000 4.500000 28.746421 5.600000 4.600000 29.428711 5.600000 4.700000 30.131001 5.600000 4.800000 30.853291 5.600000 4.900000 31.595582 5.600000 5.000000 32.357872 5.600000 5.100000 33.140162 5.600000 5.200000 33.942452 5.600000 5.300000 34.764742 5.600000 5.400000 35.607032 5.600000 5.500000 36.469322 5.600000 5.600000 37.351612 5.600000 5.700000 38.253903 5.600000 5.800000 39.176193 5.600000 5.900000 40.118483 5.600000 6.000000 41.080773 5.600000 6.100000 42.063063 5.600000 6.200000 43.065353 5.600000 6.300000 44.087643 5.600000 6.400000 45.129933 5.600000 6.500000 46.192224 5.600000 6.600000 47.274514 5.600000 6.700000 48.376804 5.600000 6.800000 49.499094 5.600000 6.900000 50.641384 5.600000 7.000000 51.803674 5.600000 7.100000 52.985964 5.600000 7.200000 54.188254 5.600000 7.300000 55.410545 5.600000 7.400000 56.652835 5.600000 7.500000 57.915125 5.600000 7.600000 59.197415 5.600000 7.700000 60.499705 5.600000 7.800000 61.821995 5.600000 7.900000 63.164285 5.600000 8.000000 64.526575 5.600000 8.100000 65.908865 5.600000 8.200000 67.311156 5.600000 8.300000 68.733446 5.600000 8.400000 70.175736 5.600000 8.500000 71.638026 5.600000 8.600000 73.120316 5.600000 8.700000 74.622606 5.600000 8.800000 76.144896 5.600000 8.900000 77.687186 5.600000 9.000000 79.249477 5.600000 9.100000 80.831767 5.600000 9.200000 82.434057 5.600000 9.300000 84.056347 5.600000 9.400000 85.698637 5.600000 9.500000 87.360927 5.600000 9.600000 89.043217 5.600000 9.700000 90.745507 5.600000 9.800000 92.467798 5.600000 9.900000 94.210088 5.600000 10.000000 95.972378 5.600000 10.100000 97.754668 5.600000 10.200000 99.556958 5.600000 10.300000 101.379248 5.600000 10.400000 103.221538 5.600000 10.500000 105.083828 5.600000 10.600000 106.966119 5.600000 10.700000 108.868409 5.600000 10.800000 110.790699 5.600000 10.900000 112.732989 5.600000 11.000000 114.695279 5.600000 11.100000 116.677569 5.600000 11.200000 118.679859 5.600000 11.300000 120.702149 5.600000 11.400000 122.744439 5.600000 11.500000 124.806730 5.600000 11.600000 126.889020 5.600000 11.700000 128.991310 5.600000 11.800000 131.113600 5.600000 11.900000 133.255890 5.600000 12.000000 135.418180 5.600000 12.100000 137.600470 5.600000 12.200000 139.802760 5.600000 12.300000 142.025051 5.600000 12.400000 144.267341 5.600000 12.500000 146.529631 5.600000 12.600000 148.811921 5.600000 12.700000 151.114211 5.600000 12.800000 153.436501 5.600000 12.900000 155.778791 5.600000 13.000000 158.141081 5.600000 13.100000 160.523372 5.600000 13.200000 162.925662 5.600000 13.300000 165.347952 5.600000 13.400000 167.790242 5.600000 13.500000 170.252532 5.600000 13.600000 172.734822 5.600000 13.700000 175.237112 5.600000 13.800000 177.759402 5.600000 13.900000 180.301693 5.600000 14.000000 182.863983 5.600000 14.100000 185.446273 5.600000 14.200000 188.048563 5.600000 14.300000 190.670853 5.600000 14.400000 193.313143 5.600000 14.500000 195.975433 5.600000 14.600000 198.657723 5.600000 14.700000 201.360013 5.600000 14.800000 204.082304 5.600000 14.900000 206.824594 5.600000 15.000000 209.586884 5.700000 -5.000000 55.535200 5.700000 -4.900000 54.320125 5.700000 -4.800000 53.125051 5.700000 -4.700000 51.949976 5.700000 -4.600000 50.794902 5.700000 -4.500000 49.659827 5.700000 -4.400000 48.544752 5.700000 -4.300000 47.449678 5.700000 -4.200000 46.374603 5.700000 -4.100000 45.319529 5.700000 -4.000000 44.284454 5.700000 -3.900000 43.269379 5.700000 -3.800000 42.274305 5.700000 -3.700000 41.299230 5.700000 -3.600000 40.344156 5.700000 -3.500000 39.409081 5.700000 -3.400000 38.494006 5.700000 -3.300000 37.598932 5.700000 -3.200000 36.723857 5.700000 -3.100000 35.868783 5.700000 -3.000000 35.033708 5.700000 -2.900000 34.218634 5.700000 -2.800000 33.423559 5.700000 -2.700000 32.648484 5.700000 -2.600000 31.893410 5.700000 -2.500000 31.158335 5.700000 -2.400000 30.443261 5.700000 -2.300000 29.748186 5.700000 -2.200000 29.073111 5.700000 -2.100000 28.418037 5.700000 -2.000000 27.782962 5.700000 -1.900000 27.167888 5.700000 -1.800000 26.572813 5.700000 -1.700000 25.997738 5.700000 -1.600000 25.442664 5.700000 -1.500000 24.907589 5.700000 -1.400000 24.392515 5.700000 -1.300000 23.897440 5.700000 -1.200000 23.422366 5.700000 -1.100000 22.967291 5.700000 -1.000000 22.532216 5.700000 -0.900000 22.117142 5.700000 -0.800000 21.722067 5.700000 -0.700000 21.346993 5.700000 -0.600000 20.991918 5.700000 -0.500000 20.656843 5.700000 -0.400000 20.341769 5.700000 -0.300000 20.046694 5.700000 -0.200000 19.771620 5.700000 -0.100000 19.516545 5.700000 -0.000000 19.281470 5.700000 0.100000 19.066396 5.700000 0.200000 18.871321 5.700000 0.300000 18.696247 5.700000 0.400000 18.541172 5.700000 0.500000 18.406098 5.700000 0.600000 18.291023 5.700000 0.700000 18.195948 5.700000 0.800000 18.120874 5.700000 0.900000 18.065799 5.700000 1.000000 18.030725 5.700000 1.100000 18.015650 5.700000 1.200000 18.020575 5.700000 1.300000 18.045501 5.700000 1.400000 18.090426 5.700000 1.500000 18.155352 5.700000 1.600000 18.240277 5.700000 1.700000 18.345202 5.700000 1.800000 18.470128 5.700000 1.900000 18.615053 5.700000 2.000000 18.779979 5.700000 2.100000 18.964904 5.700000 2.200000 19.169829 5.700000 2.300000 19.394755 5.700000 2.400000 19.639680 5.700000 2.500000 19.904606 5.700000 2.600000 20.189531 5.700000 2.700000 20.494457 5.700000 2.800000 20.819382 5.700000 2.900000 21.164307 5.700000 3.000000 21.529233 5.700000 3.100000 21.914158 5.700000 3.200000 22.319084 5.700000 3.300000 22.744009 5.700000 3.400000 23.188934 5.700000 3.500000 23.653860 5.700000 3.600000 24.138785 5.700000 3.700000 24.643711 5.700000 3.800000 25.168636 5.700000 3.900000 25.713561 5.700000 4.000000 26.278487 5.700000 4.100000 26.863412 5.700000 4.200000 27.468338 5.700000 4.300000 28.093263 5.700000 4.400000 28.738189 5.700000 4.500000 29.403114 5.700000 4.600000 30.088039 5.700000 4.700000 30.792965 5.700000 4.800000 31.517890 5.700000 4.900000 32.262816 5.700000 5.000000 33.027741 5.700000 5.100000 33.812666 5.700000 5.200000 34.617592 5.700000 5.300000 35.442517 5.700000 5.400000 36.287443 5.700000 5.500000 37.152368 5.700000 5.600000 38.037293 5.700000 5.700000 38.942219 5.700000 5.800000 39.867144 5.700000 5.900000 40.812070 5.700000 6.000000 41.776995 5.700000 6.100000 42.761921 5.700000 6.200000 43.766846 5.700000 6.300000 44.791771 5.700000 6.400000 45.836697 5.700000 6.500000 46.901622 5.700000 6.600000 47.986548 5.700000 6.700000 49.091473 5.700000 6.800000 50.216398 5.700000 6.900000 51.361324 5.700000 7.000000 52.526249 5.700000 7.100000 53.711175 5.700000 7.200000 54.916100 5.700000 7.300000 56.141025 5.700000 7.400000 57.385951 5.700000 7.500000 58.650876 5.700000 7.600000 59.935802 5.700000 7.700000 61.240727 5.700000 7.800000 62.565652 5.700000 7.900000 63.910578 5.700000 8.000000 65.275503 5.700000 8.100000 66.660429 5.700000 8.200000 68.065354 5.700000 8.300000 69.490280 5.700000 8.400000 70.935205 5.700000 8.500000 72.400130 5.700000 8.600000 73.885056 5.700000 8.700000 75.389981 5.700000 8.800000 76.914907 5.700000 8.900000 78.459832 5.700000 9.000000 80.024757 5.700000 9.100000 81.609683 5.700000 9.200000 83.214608 5.700000 9.300000 84.839534 5.700000 9.400000 86.484459 5.700000 9.500000 88.149384 5.700000 9.600000 89.834310 5.700000 9.700000 91.539235 5.700000 9.800000 93.264161 5.700000 9.900000 95.009086 5.700000 10.000000 96.774012 5.700000 10.100000 98.558937 5.700000 10.200000 100.363862 5.700000 10.300000 102.188788 5.700000 10.400000 104.033713 5.700000 10.500000 105.898639 5.700000 10.600000 107.783564 5.700000 10.700000 109.688489 5.700000 10.800000 111.613415 5.700000 10.900000 113.558340 5.700000 11.000000 115.523266 5.700000 11.100000 117.508191 5.700000 11.200000 119.513116 5.700000 11.300000 121.538042 5.700000 11.400000 123.582967 5.700000 11.500000 125.647893 5.700000 11.600000 127.732818 5.700000 11.700000 129.837744 5.700000 11.800000 131.962669 5.700000 11.900000 134.107594 5.700000 12.000000 136.272520 5.700000 12.100000 138.457445 5.700000 12.200000 140.662371 5.700000 12.300000 142.887296 5.700000 12.400000 145.132221 5.700000 12.500000 147.397147 5.700000 12.600000 149.682072 5.700000 12.700000 151.986998 5.700000 12.800000 154.311923 5.700000 12.900000 156.656848 5.700000 13.000000 159.021774 5.700000 13.100000 161.406699 5.700000 13.200000 163.811625 5.700000 13.300000 166.236550 5.700000 13.400000 168.681476 5.700000 13.500000 171.146401 5.700000 13.600000 173.631326 5.700000 13.700000 176.136252 5.700000 13.800000 178.661177 5.700000 13.900000 181.206103 5.700000 14.000000 183.771028 5.700000 14.100000 186.355953 5.700000 14.200000 188.960879 5.700000 14.300000 191.585804 5.700000 14.400000 194.230730 5.700000 14.500000 196.895655 5.700000 14.600000 199.580580 5.700000 14.700000 202.285506 5.700000 14.800000 205.010431 5.700000 14.900000 207.755357 5.700000 15.000000 210.520282 5.800000 -5.000000 55.893395 5.800000 -4.900000 54.680439 5.800000 -4.800000 53.487483 5.800000 -4.700000 52.314527 5.800000 -4.600000 51.161571 5.800000 -4.500000 50.028615 5.800000 -4.400000 48.915659 5.800000 -4.300000 47.822703 5.800000 -4.200000 46.749747 5.800000 -4.100000 45.696791 5.800000 -4.000000 44.663835 5.800000 -3.900000 43.650878 5.800000 -3.800000 42.657922 5.800000 -3.700000 41.684966 5.800000 -3.600000 40.732010 5.800000 -3.500000 39.799054 5.800000 -3.400000 38.886098 5.800000 -3.300000 37.993142 5.800000 -3.200000 37.120186 5.800000 -3.100000 36.267230 5.800000 -3.000000 35.434274 5.800000 -2.900000 34.621318 5.800000 -2.800000 33.828362 5.800000 -2.700000 33.055406 5.800000 -2.600000 32.302450 5.800000 -2.500000 31.569494 5.800000 -2.400000 30.856538 5.800000 -2.300000 30.163582 5.800000 -2.200000 29.490626 5.800000 -2.100000 28.837670 5.800000 -2.000000 28.204714 5.800000 -1.900000 27.591758 5.800000 -1.800000 26.998802 5.800000 -1.700000 26.425846 5.800000 -1.600000 25.872890 5.800000 -1.500000 25.339934 5.800000 -1.400000 24.826978 5.800000 -1.300000 24.334022 5.800000 -1.200000 23.861065 5.800000 -1.100000 23.408109 5.800000 -1.000000 22.975153 5.800000 -0.900000 22.562197 5.800000 -0.800000 22.169241 5.800000 -0.700000 21.796285 5.800000 -0.600000 21.443329 5.800000 -0.500000 21.110373 5.800000 -0.400000 20.797417 5.800000 -0.300000 20.504461 5.800000 -0.200000 20.231505 5.800000 -0.100000 19.978549 5.800000 -0.000000 19.745593 5.800000 0.100000 19.532637 5.800000 0.200000 19.339681 5.800000 0.300000 19.166725 5.800000 0.400000 19.013769 5.800000 0.500000 18.880813 5.800000 0.600000 18.767857 5.800000 0.700000 18.674901 5.800000 0.800000 18.601945 5.800000 0.900000 18.548989 5.800000 1.000000 18.516033 5.800000 1.100000 18.503077 5.800000 1.200000 18.510121 5.800000 1.300000 18.537165 5.800000 1.400000 18.584208 5.800000 1.500000 18.651252 5.800000 1.600000 18.738296 5.800000 1.700000 18.845340 5.800000 1.800000 18.972384 5.800000 1.900000 19.119428 5.800000 2.000000 19.286472 5.800000 2.100000 19.473516 5.800000 2.200000 19.680560 5.800000 2.300000 19.907604 5.800000 2.400000 20.154648 5.800000 2.500000 20.421692 5.800000 2.600000 20.708736 5.800000 2.700000 21.015780 5.800000 2.800000 21.342824 5.800000 2.900000 21.689868 5.800000 3.000000 22.056912 5.800000 3.100000 22.443956 5.800000 3.200000 22.851000 5.800000 3.300000 23.278044 5.800000 3.400000 23.725088 5.800000 3.500000 24.192132 5.800000 3.600000 24.679176 5.800000 3.700000 25.186220 5.800000 3.800000 25.713264 5.800000 3.900000 26.260308 5.800000 4.000000 26.827352 5.800000 4.100000 27.414395 5.800000 4.200000 28.021439 5.800000 4.300000 28.648483 5.800000 4.400000 29.295527 5.800000 4.500000 29.962571 5.800000 4.600000 30.649615 5.800000 4.700000 31.356659 5.800000 4.800000 32.083703 5.800000 4.900000 32.830747 5.800000 5.000000 33.597791 5.800000 5.100000 34.384835 5.800000 5.200000 35.191879 5.800000 5.300000 36.018923 5.800000 5.400000 36.865967 5.800000 5.500000 37.733011 5.800000 5.600000 38.620055 5.800000 5.700000 39.527099 5.800000 5.800000 40.454143 5.800000 5.900000 41.401187 5.800000 6.000000 42.368231 5.800000 6.100000 43.355275 5.800000 6.200000 44.362319 5.800000 6.300000 45.389363 5.800000 6.400000 46.436407 5.800000 6.500000 47.503451 5.800000 6.600000 48.590495 5.800000 6.700000 49.697538 5.800000 6.800000 50.824582 5.800000 6.900000 51.971626 5.800000 7.000000 53.138670 5.800000 7.100000 54.325714 5.800000 7.200000 55.532758 5.800000 7.300000 56.759802 5.800000 7.400000 58.006846 5.800000 7.500000 59.273890 5.800000 7.600000 60.560934 5.800000 7.700000 61.867978 5.800000 7.800000 63.195022 5.800000 7.900000 64.542066 5.800000 8.000000 65.909110 5.800000 8.100000 67.296154 5.800000 8.200000 68.703198 5.800000 8.300000 70.130242 5.800000 8.400000 71.577286 5.800000 8.500000 73.044330 5.800000 8.600000 74.531374 5.800000 8.700000 76.038418 5.800000 8.800000 77.565462 5.800000 8.900000 79.112506 5.800000 9.000000 80.679550 5.800000 9.100000 82.266594 5.800000 9.200000 83.873638 5.800000 9.300000 85.500682 5.800000 9.400000 87.147725 5.800000 9.500000 88.814769 5.800000 9.600000 90.501813 5.800000 9.700000 92.208857 5.800000 9.800000 93.935901 5.800000 9.900000 95.682945 5.800000 10.000000 97.449989 5.800000 10.100000 99.237033 5.800000 10.200000 101.044077 5.800000 10.300000 102.871121 5.800000 10.400000 104.718165 5.800000 10.500000 106.585209 5.800000 10.600000 108.472253 5.800000 10.700000 110.379297 5.800000 10.800000 112.306341 5.800000 10.900000 114.253385 5.800000 11.000000 116.220429 5.800000 11.100000 118.207473 5.800000 11.200000 120.214517 5.800000 11.300000 122.241561 5.800000 11.400000 124.288605 5.800000 11.500000 126.355649 5.800000 11.600000 128.442693 5.800000 11.700000 130.549737 5.800000 11.800000 132.676781 5.800000 11.900000 134.823825 5.800000 12.000000 136.990868 5.800000 12.100000 139.177912 5.800000 12.200000 141.384956 5.800000 12.300000 143.612000 5.800000 12.400000 145.859044 5.800000 12.500000 148.126088 5.800000 12.600000 150.413132 5.800000 12.700000 152.720176 5.800000 12.800000 155.047220 5.800000 12.900000 157.394264 5.800000 13.000000 159.761308 5.800000 13.100000 162.148352 5.800000 13.200000 164.555396 5.800000 13.300000 166.982440 5.800000 13.400000 169.429484 5.800000 13.500000 171.896528 5.800000 13.600000 174.383572 5.800000 13.700000 176.890616 5.800000 13.800000 179.417660 5.800000 13.900000 181.964704 5.800000 14.000000 184.531748 5.800000 14.100000 187.118792 5.800000 14.200000 189.725836 5.800000 14.300000 192.352880 5.800000 14.400000 194.999924 5.800000 14.500000 197.666968 5.800000 14.600000 200.354012 5.800000 14.700000 203.061055 5.800000 14.800000 205.788099 5.800000 14.900000 208.535143 5.800000 15.000000 211.302187 5.900000 -5.000000 56.198406 5.900000 -4.900000 54.987052 5.900000 -4.800000 53.795697 5.900000 -4.700000 52.624343 5.900000 -4.600000 51.472989 5.900000 -4.500000 50.341635 5.900000 -4.400000 49.230281 5.900000 -4.300000 48.138926 5.900000 -4.200000 47.067572 5.900000 -4.100000 46.016218 5.900000 -4.000000 44.984864 5.900000 -3.900000 43.973509 5.900000 -3.800000 42.982155 5.900000 -3.700000 42.010801 5.900000 -3.600000 41.059447 5.900000 -3.500000 40.128093 5.900000 -3.400000 39.216738 5.900000 -3.300000 38.325384 5.900000 -3.200000 37.454030 5.900000 -3.100000 36.602676 5.900000 -3.000000 35.771321 5.900000 -2.900000 34.959967 5.900000 -2.800000 34.168613 5.900000 -2.700000 33.397259 5.900000 -2.600000 32.645905 5.900000 -2.500000 31.914550 5.900000 -2.400000 31.203196 5.900000 -2.300000 30.511842 5.900000 -2.200000 29.840488 5.900000 -2.100000 29.189133 5.900000 -2.000000 28.557779 5.900000 -1.900000 27.946425 5.900000 -1.800000 27.355071 5.900000 -1.700000 26.783716 5.900000 -1.600000 26.232362 5.900000 -1.500000 25.701008 5.900000 -1.400000 25.189654 5.900000 -1.300000 24.698300 5.900000 -1.200000 24.226945 5.900000 -1.100000 23.775591 5.900000 -1.000000 23.344237 5.900000 -0.900000 22.932883 5.900000 -0.800000 22.541528 5.900000 -0.700000 22.170174 5.900000 -0.600000 21.818820 5.900000 -0.500000 21.487466 5.900000 -0.400000 21.176112 5.900000 -0.300000 20.884757 5.900000 -0.200000 20.613403 5.900000 -0.100000 20.362049 5.900000 -0.000000 20.130695 5.900000 0.100000 19.919340 5.900000 0.200000 19.727986 5.900000 0.300000 19.556632 5.900000 0.400000 19.405278 5.900000 0.500000 19.273924 5.900000 0.600000 19.162569 5.900000 0.700000 19.071215 5.900000 0.800000 18.999861 5.900000 0.900000 18.948507 5.900000 1.000000 18.917152 5.900000 1.100000 18.905798 5.900000 1.200000 18.914444 5.900000 1.300000 18.943090 5.900000 1.400000 18.991736 5.900000 1.500000 19.060381 5.900000 1.600000 19.149027 5.900000 1.700000 19.257673 5.900000 1.800000 19.386319 5.900000 1.900000 19.534964 5.900000 2.000000 19.703610 5.900000 2.100000 19.892256 5.900000 2.200000 20.100902 5.900000 2.300000 20.329548 5.900000 2.400000 20.578193 5.900000 2.500000 20.846839 5.900000 2.600000 21.135485 5.900000 2.700000 21.444131 5.900000 2.800000 21.772776 5.900000 2.900000 22.121422 5.900000 3.000000 22.490068 5.900000 3.100000 22.878714 5.900000 3.200000 23.287360 5.900000 3.300000 23.716005 5.900000 3.400000 24.164651 5.900000 3.500000 24.633297 5.900000 3.600000 25.121943 5.900000 3.700000 25.630588 5.900000 3.800000 26.159234 5.900000 3.900000 26.707880 5.900000 4.000000 27.276526 5.900000 4.100000 27.865171 5.900000 4.200000 28.473817 5.900000 4.300000 29.102463 5.900000 4.400000 29.751109 5.900000 4.500000 30.419755 5.900000 4.600000 31.108400 5.900000 4.700000 31.817046 5.900000 4.800000 32.545692 5.900000 4.900000 33.294338 5.900000 5.000000 34.062983 5.900000 5.100000 34.851629 5.900000 5.200000 35.660275 5.900000 5.300000 36.488921 5.900000 5.400000 37.337567 5.900000 5.500000 38.206212 5.900000 5.600000 39.094858 5.900000 5.700000 40.003504 5.900000 5.800000 40.932150 5.900000 5.900000 41.880795 5.900000 6.000000 42.849441 5.900000 6.100000 43.838087 5.900000 6.200000 44.846733 5.900000 6.300000 45.875379 5.900000 6.400000 46.924024 5.900000 6.500000 47.992670 5.900000 6.600000 49.081316 5.900000 6.700000 50.189962 5.900000 6.800000 51.318607 5.900000 6.900000 52.467253 5.900000 7.000000 53.635899 5.900000 7.100000 54.824545 5.900000 7.200000 56.033191 5.900000 7.300000 57.261836 5.900000 7.400000 58.510482 5.900000 7.500000 59.779128 5.900000 7.600000 61.067774 5.900000 7.700000 62.376419 5.900000 7.800000 63.705065 5.900000 7.900000 65.053711 5.900000 8.000000 66.422357 5.900000 8.100000 67.811003 5.900000 8.200000 69.219648 5.900000 8.300000 70.648294 5.900000 8.400000 72.096940 5.900000 8.500000 73.565586 5.900000 8.600000 75.054231 5.900000 8.700000 76.562877 5.900000 8.800000 78.091523 5.900000 8.900000 79.640169 5.900000 9.000000 81.208815 5.900000 9.100000 82.797460 5.900000 9.200000 84.406106 5.900000 9.300000 86.034752 5.900000 9.400000 87.683398 5.900000 9.500000 89.352043 5.900000 9.600000 91.040689 5.900000 9.700000 92.749335 5.900000 9.800000 94.477981 5.900000 9.900000 96.226626 5.900000 10.000000 97.995272 5.900000 10.100000 99.783918 5.900000 10.200000 101.592564 5.900000 10.300000 103.421210 5.900000 10.400000 105.269855 5.900000 10.500000 107.138501 5.900000 10.600000 109.027147 5.900000 10.700000 110.935793 5.900000 10.800000 112.864438 5.900000 10.900000 114.813084 5.900000 11.000000 116.781730 5.900000 11.100000 118.770376 5.900000 11.200000 120.779022 5.900000 11.300000 122.807667 5.900000 11.400000 124.856313 5.900000 11.500000 126.924959 5.900000 11.600000 129.013605 5.900000 11.700000 131.122250 5.900000 11.800000 133.250896 5.900000 11.900000 135.399542 5.900000 12.000000 137.568188 5.900000 12.100000 139.756834 5.900000 12.200000 141.965479 5.900000 12.300000 144.194125 5.900000 12.400000 146.442771 5.900000 12.500000 148.711417 5.900000 12.600000 151.000062 5.900000 12.700000 153.308708 5.900000 12.800000 155.637354 5.900000 12.900000 157.986000 5.900000 13.000000 160.354646 5.900000 13.100000 162.743291 5.900000 13.200000 165.151937 5.900000 13.300000 167.580583 5.900000 13.400000 170.029229 5.900000 13.500000 172.497874 5.900000 13.600000 174.986520 5.900000 13.700000 177.495166 5.900000 13.800000 180.023812 5.900000 13.900000 182.572458 5.900000 14.000000 185.141103 5.900000 14.100000 187.729749 5.900000 14.200000 190.338395 5.900000 14.300000 192.967041 5.900000 14.400000 195.615686 5.900000 14.500000 198.284332 5.900000 14.600000 200.972978 5.900000 14.700000 203.681624 5.900000 14.800000 206.410270 5.900000 14.900000 209.158915 5.900000 15.000000 211.927561 6.000000 -5.000000 56.446083 6.000000 -4.900000 55.235814 6.000000 -4.800000 54.045545 6.000000 -4.700000 52.875276 6.000000 -4.600000 51.725007 6.000000 -4.500000 50.594737 6.000000 -4.400000 49.484468 6.000000 -4.300000 48.394199 6.000000 -4.200000 47.323930 6.000000 -4.100000 46.273661 6.000000 -4.000000 45.243392 6.000000 -3.900000 44.233122 6.000000 -3.800000 43.242853 6.000000 -3.700000 42.272584 6.000000 -3.600000 41.322315 6.000000 -3.500000 40.392046 6.000000 -3.400000 39.481777 6.000000 -3.300000 38.591508 6.000000 -3.200000 37.721238 6.000000 -3.100000 36.870969 6.000000 -3.000000 36.040700 6.000000 -2.900000 35.230431 6.000000 -2.800000 34.440162 6.000000 -2.700000 33.669893 6.000000 -2.600000 32.919624 6.000000 -2.500000 32.189354 6.000000 -2.400000 31.479085 6.000000 -2.300000 30.788816 6.000000 -2.200000 30.118547 6.000000 -2.100000 29.468278 6.000000 -2.000000 28.838009 6.000000 -1.900000 28.227740 6.000000 -1.800000 27.637470 6.000000 -1.700000 27.067201 6.000000 -1.600000 26.516932 6.000000 -1.500000 25.986663 6.000000 -1.400000 25.476394 6.000000 -1.300000 24.986125 6.000000 -1.200000 24.515855 6.000000 -1.100000 24.065586 6.000000 -1.000000 23.635317 6.000000 -0.900000 23.225048 6.000000 -0.800000 22.834779 6.000000 -0.700000 22.464510 6.000000 -0.600000 22.114241 6.000000 -0.500000 21.783971 6.000000 -0.400000 21.473702 6.000000 -0.300000 21.183433 6.000000 -0.200000 20.913164 6.000000 -0.100000 20.662895 6.000000 -0.000000 20.432626 6.000000 0.100000 20.222357 6.000000 0.200000 20.032087 6.000000 0.300000 19.861818 6.000000 0.400000 19.711549 6.000000 0.500000 19.581280 6.000000 0.600000 19.471011 6.000000 0.700000 19.380742 6.000000 0.800000 19.310473 6.000000 0.900000 19.260203 6.000000 1.000000 19.229934 6.000000 1.100000 19.219665 6.000000 1.200000 19.229396 6.000000 1.300000 19.259127 6.000000 1.400000 19.308858 6.000000 1.500000 19.378588 6.000000 1.600000 19.468319 6.000000 1.700000 19.578050 6.000000 1.800000 19.707781 6.000000 1.900000 19.857512 6.000000 2.000000 20.027243 6.000000 2.100000 20.216974 6.000000 2.200000 20.426704 6.000000 2.300000 20.656435 6.000000 2.400000 20.906166 6.000000 2.500000 21.175897 6.000000 2.600000 21.465628 6.000000 2.700000 21.775359 6.000000 2.800000 22.105090 6.000000 2.900000 22.454820 6.000000 3.000000 22.824551 6.000000 3.100000 23.214282 6.000000 3.200000 23.624013 6.000000 3.300000 24.053744 6.000000 3.400000 24.503475 6.000000 3.500000 24.973205 6.000000 3.600000 25.462936 6.000000 3.700000 25.972667 6.000000 3.800000 26.502398 6.000000 3.900000 27.052129 6.000000 4.000000 27.621860 6.000000 4.100000 28.211591 6.000000 4.200000 28.821321 6.000000 4.300000 29.451052 6.000000 4.400000 30.100783 6.000000 4.500000 30.770514 6.000000 4.600000 31.460245 6.000000 4.700000 32.169976 6.000000 4.800000 32.899707 6.000000 4.900000 33.649437 6.000000 5.000000 34.419168 6.000000 5.100000 35.208899 6.000000 5.200000 36.018630 6.000000 5.300000 36.848361 6.000000 5.400000 37.698092 6.000000 5.500000 38.567823 6.000000 5.600000 39.457553 6.000000 5.700000 40.367284 6.000000 5.800000 41.297015 6.000000 5.900000 42.246746 6.000000 6.000000 43.216477 6.000000 6.100000 44.206208 6.000000 6.200000 45.215938 6.000000 6.300000 46.245669 6.000000 6.400000 47.295400 6.000000 6.500000 48.365131 6.000000 6.600000 49.454862 6.000000 6.700000 50.564593 6.000000 6.800000 51.694324 6.000000 6.900000 52.844054 6.000000 7.000000 54.013785 6.000000 7.100000 55.203516 6.000000 7.200000 56.413247 6.000000 7.300000 57.642978 6.000000 7.400000 58.892709 6.000000 7.500000 60.162440 6.000000 7.600000 61.452170 6.000000 7.700000 62.761901 6.000000 7.800000 64.091632 6.000000 7.900000 65.441363 6.000000 8.000000 66.811094 6.000000 8.100000 68.200825 6.000000 8.200000 69.610555 6.000000 8.300000 71.040286 6.000000 8.400000 72.490017 6.000000 8.500000 73.959748 6.000000 8.600000 75.449479 6.000000 8.700000 76.959210 6.000000 8.800000 78.488941 6.000000 8.900000 80.038671 6.000000 9.000000 81.608402 6.000000 9.100000 83.198133 6.000000 9.200000 84.807864 6.000000 9.300000 86.437595 6.000000 9.400000 88.087326 6.000000 9.500000 89.757057 6.000000 9.600000 91.446787 6.000000 9.700000 93.156518 6.000000 9.800000 94.886249 6.000000 9.900000 96.635980 6.000000 10.000000 98.405711 6.000000 10.100000 100.195442 6.000000 10.200000 102.005173 6.000000 10.300000 103.834903 6.000000 10.400000 105.684634 6.000000 10.500000 107.554365 6.000000 10.600000 109.444096 6.000000 10.700000 111.353827 6.000000 10.800000 113.283558 6.000000 10.900000 115.233288 6.000000 11.000000 117.203019 6.000000 11.100000 119.192750 6.000000 11.200000 121.202481 6.000000 11.300000 123.232212 6.000000 11.400000 125.281943 6.000000 11.500000 127.351674 6.000000 11.600000 129.441404 6.000000 11.700000 131.551135 6.000000 11.800000 133.680866 6.000000 11.900000 135.830597 6.000000 12.000000 138.000328 6.000000 12.100000 140.190059 6.000000 12.200000 142.399790 6.000000 12.300000 144.629520 6.000000 12.400000 146.879251 6.000000 12.500000 149.148982 6.000000 12.600000 151.438713 6.000000 12.700000 153.748444 6.000000 12.800000 156.078175 6.000000 12.900000 158.427906 6.000000 13.000000 160.797636 6.000000 13.100000 163.187367 6.000000 13.200000 165.597098 6.000000 13.300000 168.026829 6.000000 13.400000 170.476560 6.000000 13.500000 172.946291 6.000000 13.600000 175.436021 6.000000 13.700000 177.945752 6.000000 13.800000 180.475483 6.000000 13.900000 183.025214 6.000000 14.000000 185.594945 6.000000 14.100000 188.184676 6.000000 14.200000 190.794407 6.000000 14.300000 193.424137 6.000000 14.400000 196.073868 6.000000 14.500000 198.743599 6.000000 14.600000 201.433330 6.000000 14.700000 204.143061 6.000000 14.800000 206.872792 6.000000 14.900000 209.622523 6.000000 15.000000 212.392253 6.100000 -5.000000 56.633206 6.100000 -4.900000 55.423505 6.100000 -4.800000 54.233804 6.100000 -4.700000 53.064104 6.100000 -4.600000 51.914403 6.100000 -4.500000 50.784702 6.100000 -4.400000 49.675001 6.100000 -4.300000 48.585300 6.100000 -4.200000 47.515600 6.100000 -4.100000 46.465899 6.100000 -4.000000 45.436198 6.100000 -3.900000 44.426497 6.100000 -3.800000 43.436796 6.100000 -3.700000 42.467095 6.100000 -3.600000 41.517395 6.100000 -3.500000 40.587694 6.100000 -3.400000 39.677993 6.100000 -3.300000 38.788292 6.100000 -3.200000 37.918591 6.100000 -3.100000 37.068891 6.100000 -3.000000 36.239190 6.100000 -2.900000 35.429489 6.100000 -2.800000 34.639788 6.100000 -2.700000 33.870087 6.100000 -2.600000 33.120387 6.100000 -2.500000 32.390686 6.100000 -2.400000 31.680985 6.100000 -2.300000 30.991284 6.100000 -2.200000 30.321583 6.100000 -2.100000 29.671883 6.100000 -2.000000 29.042182 6.100000 -1.900000 28.432481 6.100000 -1.800000 27.842780 6.100000 -1.700000 27.273079 6.100000 -1.600000 26.723378 6.100000 -1.500000 26.193678 6.100000 -1.400000 25.683977 6.100000 -1.300000 25.194276 6.100000 -1.200000 24.724575 6.100000 -1.100000 24.274874 6.100000 -1.000000 23.845174 6.100000 -0.900000 23.435473 6.100000 -0.800000 23.045772 6.100000 -0.700000 22.676071 6.100000 -0.600000 22.326370 6.100000 -0.500000 21.996670 6.100000 -0.400000 21.686969 6.100000 -0.300000 21.397268 6.100000 -0.200000 21.127567 6.100000 -0.100000 20.877866 6.100000 -0.000000 20.648165 6.100000 0.100000 20.438465 6.100000 0.200000 20.248764 6.100000 0.300000 20.079063 6.100000 0.400000 19.929362 6.100000 0.500000 19.799661 6.100000 0.600000 19.689961 6.100000 0.700000 19.600260 6.100000 0.800000 19.530559 6.100000 0.900000 19.480858 6.100000 1.000000 19.451157 6.100000 1.100000 19.441457 6.100000 1.200000 19.451756 6.100000 1.300000 19.482055 6.100000 1.400000 19.532354 6.100000 1.500000 19.602653 6.100000 1.600000 19.692952 6.100000 1.700000 19.803252 6.100000 1.800000 19.933551 6.100000 1.900000 20.083850 6.100000 2.000000 20.254149 6.100000 2.100000 20.444448 6.100000 2.200000 20.654748 6.100000 2.300000 20.885047 6.100000 2.400000 21.135346 6.100000 2.500000 21.405645 6.100000 2.600000 21.695944 6.100000 2.700000 22.006244 6.100000 2.800000 22.336543 6.100000 2.900000 22.686842 6.100000 3.000000 23.057141 6.100000 3.100000 23.447440 6.100000 3.200000 23.857740 6.100000 3.300000 24.288039 6.100000 3.400000 24.738338 6.100000 3.500000 25.208637 6.100000 3.600000 25.698936 6.100000 3.700000 26.209235 6.100000 3.800000 26.739535 6.100000 3.900000 27.289834 6.100000 4.000000 27.860133 6.100000 4.100000 28.450432 6.100000 4.200000 29.060731 6.100000 4.300000 29.691031 6.100000 4.400000 30.341330 6.100000 4.500000 31.011629 6.100000 4.600000 31.701928 6.100000 4.700000 32.412227 6.100000 4.800000 33.142527 6.100000 4.900000 33.892826 6.100000 5.000000 34.663125 6.100000 5.100000 35.453424 6.100000 5.200000 36.263723 6.100000 5.300000 37.094022 6.100000 5.400000 37.944322 6.100000 5.500000 38.814621 6.100000 5.600000 39.704920 6.100000 5.700000 40.615219 6.100000 5.800000 41.545518 6.100000 5.900000 42.495818 6.100000 6.000000 43.466117 6.100000 6.100000 44.456416 6.100000 6.200000 45.466715 6.100000 6.300000 46.497014 6.100000 6.400000 47.547314 6.100000 6.500000 48.617613 6.100000 6.600000 49.707912 6.100000 6.700000 50.818211 6.100000 6.800000 51.948510 6.100000 6.900000 53.098809 6.100000 7.000000 54.269109 6.100000 7.100000 55.459408 6.100000 7.200000 56.669707 6.100000 7.300000 57.900006 6.100000 7.400000 59.150305 6.100000 7.500000 60.420605 6.100000 7.600000 61.710904 6.100000 7.700000 63.021203 6.100000 7.800000 64.351502 6.100000 7.900000 65.701801 6.100000 8.000000 67.072101 6.100000 8.100000 68.462400 6.100000 8.200000 69.872699 6.100000 8.300000 71.302998 6.100000 8.400000 72.753297 6.100000 8.500000 74.223597 6.100000 8.600000 75.713896 6.100000 8.700000 77.224195 6.100000 8.800000 78.754494 6.100000 8.900000 80.304793 6.100000 9.000000 81.875092 6.100000 9.100000 83.465392 6.100000 9.200000 85.075691 6.100000 9.300000 86.705990 6.100000 9.400000 88.356289 6.100000 9.500000 90.026588 6.100000 9.600000 91.716888 6.100000 9.700000 93.427187 6.100000 9.800000 95.157486 6.100000 9.900000 96.907785 6.100000 10.000000 98.678084 6.100000 10.100000 100.468384 6.100000 10.200000 102.278683 6.100000 10.300000 104.108982 6.100000 10.400000 105.959281 6.100000 10.500000 107.829580 6.100000 10.600000 109.719879 6.100000 10.700000 111.630179 6.100000 10.800000 113.560478 6.100000 10.900000 115.510777 6.100000 11.000000 117.481076 6.100000 11.100000 119.471375 6.100000 11.200000 121.481675 6.100000 11.300000 123.511974 6.100000 11.400000 125.562273 6.100000 11.500000 127.632572 6.100000 11.600000 129.722871 6.100000 11.700000 131.833171 6.100000 11.800000 133.963470 6.100000 11.900000 136.113769 6.100000 12.000000 138.284068 6.100000 12.100000 140.474367 6.100000 12.200000 142.684666 6.100000 12.300000 144.914966 6.100000 12.400000 147.165265 6.100000 12.500000 149.435564 6.100000 12.600000 151.725863 6.100000 12.700000 154.036162 6.100000 12.800000 156.366462 6.100000 12.900000 158.716761 6.100000 13.000000 161.087060 6.100000 13.100000 163.477359 6.100000 13.200000 165.887658 6.100000 13.300000 168.317958 6.100000 13.400000 170.768257 6.100000 13.500000 173.238556 6.100000 13.600000 175.728855 6.100000 13.700000 178.239154 6.100000 13.800000 180.769454 6.100000 13.900000 183.319753 6.100000 14.000000 185.890052 6.100000 14.100000 188.480351 6.100000 14.200000 191.090650 6.100000 14.300000 193.720949 6.100000 14.400000 196.371249 6.100000 14.500000 199.041548 6.100000 14.600000 201.731847 6.100000 14.700000 204.442146 6.100000 14.800000 207.172445 6.100000 14.900000 209.922745 6.100000 15.000000 212.693044 6.200000 -5.000000 56.757514 6.200000 -4.900000 55.547865 6.200000 -4.800000 54.358216 6.200000 -4.700000 53.188567 6.200000 -4.600000 52.038918 6.200000 -4.500000 50.909268 6.200000 -4.400000 49.799619 6.200000 -4.300000 48.709970 6.200000 -4.200000 47.640321 6.200000 -4.100000 46.590672 6.200000 -4.000000 45.561022 6.200000 -3.900000 44.551373 6.200000 -3.800000 43.561724 6.200000 -3.700000 42.592075 6.200000 -3.600000 41.642426 6.200000 -3.500000 40.712776 6.200000 -3.400000 39.803127 6.200000 -3.300000 38.913478 6.200000 -3.200000 38.043829 6.200000 -3.100000 37.194179 6.200000 -3.000000 36.364530 6.200000 -2.900000 35.554881 6.200000 -2.800000 34.765232 6.200000 -2.700000 33.995583 6.200000 -2.600000 33.245933 6.200000 -2.500000 32.516284 6.200000 -2.400000 31.806635 6.200000 -2.300000 31.116986 6.200000 -2.200000 30.447337 6.200000 -2.100000 29.797687 6.200000 -2.000000 29.168038 6.200000 -1.900000 28.558389 6.200000 -1.800000 27.968740 6.200000 -1.700000 27.399090 6.200000 -1.600000 26.849441 6.200000 -1.500000 26.319792 6.200000 -1.400000 25.810143 6.200000 -1.300000 25.320494 6.200000 -1.200000 24.850844 6.200000 -1.100000 24.401195 6.200000 -1.000000 23.971546 6.200000 -0.900000 23.561897 6.200000 -0.800000 23.172248 6.200000 -0.700000 22.802598 6.200000 -0.600000 22.452949 6.200000 -0.500000 22.123300 6.200000 -0.400000 21.813651 6.200000 -0.300000 21.524002 6.200000 -0.200000 21.254352 6.200000 -0.100000 21.004703 6.200000 -0.000000 20.775054 6.200000 0.100000 20.565405 6.200000 0.200000 20.375755 6.200000 0.300000 20.206106 6.200000 0.400000 20.056457 6.200000 0.500000 19.926808 6.200000 0.600000 19.817159 6.200000 0.700000 19.727509 6.200000 0.800000 19.657860 6.200000 0.900000 19.608211 6.200000 1.000000 19.578562 6.200000 1.100000 19.568913 6.200000 1.200000 19.579263 6.200000 1.300000 19.609614 6.200000 1.400000 19.659965 6.200000 1.500000 19.730316 6.200000 1.600000 19.820666 6.200000 1.700000 19.931017 6.200000 1.800000 20.061368 6.200000 1.900000 20.211719 6.200000 2.000000 20.382070 6.200000 2.100000 20.572420 6.200000 2.200000 20.782771 6.200000 2.300000 21.013122 6.200000 2.400000 21.263473 6.200000 2.500000 21.533824 6.200000 2.600000 21.824174 6.200000 2.700000 22.134525 6.200000 2.800000 22.464876 6.200000 2.900000 22.815227 6.200000 3.000000 23.185578 6.200000 3.100000 23.575928 6.200000 3.200000 23.986279 6.200000 3.300000 24.416630 6.200000 3.400000 24.866981 6.200000 3.500000 25.337331 6.200000 3.600000 25.827682 6.200000 3.700000 26.338033 6.200000 3.800000 26.868384 6.200000 3.900000 27.418735 6.200000 4.000000 27.989085 6.200000 4.100000 28.579436 6.200000 4.200000 29.189787 6.200000 4.300000 29.820138 6.200000 4.400000 30.470489 6.200000 4.500000 31.140839 6.200000 4.600000 31.831190 6.200000 4.700000 32.541541 6.200000 4.800000 33.271892 6.200000 4.900000 34.022242 6.200000 5.000000 34.792593 6.200000 5.100000 35.582944 6.200000 5.200000 36.393295 6.200000 5.300000 37.223646 6.200000 5.400000 38.073996 6.200000 5.500000 38.944347 6.200000 5.600000 39.834698 6.200000 5.700000 40.745049 6.200000 5.800000 41.675400 6.200000 5.900000 42.625750 6.200000 6.000000 43.596101 6.200000 6.100000 44.586452 6.200000 6.200000 45.596803 6.200000 6.300000 46.627154 6.200000 6.400000 47.677504 6.200000 6.500000 48.747855 6.200000 6.600000 49.838206 6.200000 6.700000 50.948557 6.200000 6.800000 52.078907 6.200000 6.900000 53.229258 6.200000 7.000000 54.399609 6.200000 7.100000 55.589960 6.200000 7.200000 56.800311 6.200000 7.300000 58.030661 6.200000 7.400000 59.281012 6.200000 7.500000 60.551363 6.200000 7.600000 61.841714 6.200000 7.700000 63.152065 6.200000 7.800000 64.482415 6.200000 7.900000 65.832766 6.200000 8.000000 67.203117 6.200000 8.100000 68.593468 6.200000 8.200000 70.003818 6.200000 8.300000 71.434169 6.200000 8.400000 72.884520 6.200000 8.500000 74.354871 6.200000 8.600000 75.845222 6.200000 8.700000 77.355572 6.200000 8.800000 78.885923 6.200000 8.900000 80.436274 6.200000 9.000000 82.006625 6.200000 9.100000 83.596976 6.200000 9.200000 85.207326 6.200000 9.300000 86.837677 6.200000 9.400000 88.488028 6.200000 9.500000 90.158379 6.200000 9.600000 91.848730 6.200000 9.700000 93.559080 6.200000 9.800000 95.289431 6.200000 9.900000 97.039782 6.200000 10.000000 98.810133 6.200000 10.100000 100.600483 6.200000 10.200000 102.410834 6.200000 10.300000 104.241185 6.200000 10.400000 106.091536 6.200000 10.500000 107.961887 6.200000 10.600000 109.852237 6.200000 10.700000 111.762588 6.200000 10.800000 113.692939 6.200000 10.900000 115.643290 6.200000 11.000000 117.613641 6.200000 11.100000 119.603991 6.200000 11.200000 121.614342 6.200000 11.300000 123.644693 6.200000 11.400000 125.695044 6.200000 11.500000 127.765395 6.200000 11.600000 129.855745 6.200000 11.700000 131.966096 6.200000 11.800000 134.096447 6.200000 11.900000 136.246798 6.200000 12.000000 138.417148 6.200000 12.100000 140.607499 6.200000 12.200000 142.817850 6.200000 12.300000 145.048201 6.200000 12.400000 147.298552 6.200000 12.500000 149.568902 6.200000 12.600000 151.859253 6.200000 12.700000 154.169604 6.200000 12.800000 156.499955 6.200000 12.900000 158.850306 6.200000 13.000000 161.220656 6.200000 13.100000 163.611007 6.200000 13.200000 166.021358 6.200000 13.300000 168.451709 6.200000 13.400000 170.902059 6.200000 13.500000 173.372410 6.200000 13.600000 175.862761 6.200000 13.700000 178.373112 6.200000 13.800000 180.903463 6.200000 13.900000 183.453813 6.200000 14.000000 186.024164 6.200000 14.100000 188.614515 6.200000 14.200000 191.224866 6.200000 14.300000 193.855217 6.200000 14.400000 196.505567 6.200000 14.500000 199.175918 6.200000 14.600000 201.866269 6.200000 14.700000 204.576620 6.200000 14.800000 207.306971 6.200000 14.900000 210.057321 6.200000 15.000000 212.827672 6.300000 -5.000000 56.817731 6.300000 -4.900000 55.607617 6.300000 -4.800000 54.417502 6.300000 -4.700000 53.247388 6.300000 -4.600000 52.097274 6.300000 -4.500000 50.967159 6.300000 -4.400000 49.857045 6.300000 -4.300000 48.766931 6.300000 -4.200000 47.696816 6.300000 -4.100000 46.646702 6.300000 -4.000000 45.616587 6.300000 -3.900000 44.606473 6.300000 -3.800000 43.616359 6.300000 -3.700000 42.646244 6.300000 -3.600000 41.696130 6.300000 -3.500000 40.766016 6.300000 -3.400000 39.855901 6.300000 -3.300000 38.965787 6.300000 -3.200000 38.095673 6.300000 -3.100000 37.245558 6.300000 -3.000000 36.415444 6.300000 -2.900000 35.605330 6.300000 -2.800000 34.815215 6.300000 -2.700000 34.045101 6.300000 -2.600000 33.294987 6.300000 -2.500000 32.564872 6.300000 -2.400000 31.854758 6.300000 -2.300000 31.164644 6.300000 -2.200000 30.494529 6.300000 -2.100000 29.844415 6.300000 -2.000000 29.214300 6.300000 -1.900000 28.604186 6.300000 -1.800000 28.014072 6.300000 -1.700000 27.443957 6.300000 -1.600000 26.893843 6.300000 -1.500000 26.363729 6.300000 -1.400000 25.853614 6.300000 -1.300000 25.363500 6.300000 -1.200000 24.893386 6.300000 -1.100000 24.443271 6.300000 -1.000000 24.013157 6.300000 -0.900000 23.603043 6.300000 -0.800000 23.212928 6.300000 -0.700000 22.842814 6.300000 -0.600000 22.492700 6.300000 -0.500000 22.162585 6.300000 -0.400000 21.852471 6.300000 -0.300000 21.562356 6.300000 -0.200000 21.292242 6.300000 -0.100000 21.042128 6.300000 -0.000000 20.812013 6.300000 0.100000 20.601899 6.300000 0.200000 20.411785 6.300000 0.300000 20.241670 6.300000 0.400000 20.091556 6.300000 0.500000 19.961442 6.300000 0.600000 19.851327 6.300000 0.700000 19.761213 6.300000 0.800000 19.691099 6.300000 0.900000 19.640984 6.300000 1.000000 19.610870 6.300000 1.100000 19.600756 6.300000 1.200000 19.610641 6.300000 1.300000 19.640527 6.300000 1.400000 19.690413 6.300000 1.500000 19.760298 6.300000 1.600000 19.850184 6.300000 1.700000 19.960069 6.300000 1.800000 20.089955 6.300000 1.900000 20.239841 6.300000 2.000000 20.409726 6.300000 2.100000 20.599612 6.300000 2.200000 20.809498 6.300000 2.300000 21.039383 6.300000 2.400000 21.289269 6.300000 2.500000 21.559155 6.300000 2.600000 21.849040 6.300000 2.700000 22.158926 6.300000 2.800000 22.488812 6.300000 2.900000 22.838697 6.300000 3.000000 23.208583 6.300000 3.100000 23.598469 6.300000 3.200000 24.008354 6.300000 3.300000 24.438240 6.300000 3.400000 24.888126 6.300000 3.500000 25.358011 6.300000 3.600000 25.847897 6.300000 3.700000 26.357782 6.300000 3.800000 26.887668 6.300000 3.900000 27.437554 6.300000 4.000000 28.007439 6.300000 4.100000 28.597325 6.300000 4.200000 29.207211 6.300000 4.300000 29.837096 6.300000 4.400000 30.486982 6.300000 4.500000 31.156868 6.300000 4.600000 31.846753 6.300000 4.700000 32.556639 6.300000 4.800000 33.286525 6.300000 4.900000 34.036410 6.300000 5.000000 34.806296 6.300000 5.100000 35.596182 6.300000 5.200000 36.406067 6.300000 5.300000 37.235953 6.300000 5.400000 38.085839 6.300000 5.500000 38.955724 6.300000 5.600000 39.845610 6.300000 5.700000 40.755495 6.300000 5.800000 41.685381 6.300000 5.900000 42.635267 6.300000 6.000000 43.605152 6.300000 6.100000 44.595038 6.300000 6.200000 45.604924 6.300000 6.300000 46.634809 6.300000 6.400000 47.684695 6.300000 6.500000 48.754581 6.300000 6.600000 49.844466 6.300000 6.700000 50.954352 6.300000 6.800000 52.084238 6.300000 6.900000 53.234123 6.300000 7.000000 54.404009 6.300000 7.100000 55.593895 6.300000 7.200000 56.803780 6.300000 7.300000 58.033666 6.300000 7.400000 59.283551 6.300000 7.500000 60.553437 6.300000 7.600000 61.843323 6.300000 7.700000 63.153208 6.300000 7.800000 64.483094 6.300000 7.900000 65.832980 6.300000 8.000000 67.202865 6.300000 8.100000 68.592751 6.300000 8.200000 70.002637 6.300000 8.300000 71.432522 6.300000 8.400000 72.882408 6.300000 8.500000 74.352294 6.300000 8.600000 75.842179 6.300000 8.700000 77.352065 6.300000 8.800000 78.881951 6.300000 8.900000 80.431836 6.300000 9.000000 82.001722 6.300000 9.100000 83.591608 6.300000 9.200000 85.201493 6.300000 9.300000 86.831379 6.300000 9.400000 88.481264 6.300000 9.500000 90.151150 6.300000 9.600000 91.841036 6.300000 9.700000 93.550921 6.300000 9.800000 95.280807 6.300000 9.900000 97.030693 6.300000 10.000000 98.800578 6.300000 10.100000 100.590464 6.300000 10.200000 102.400350 6.300000 10.300000 104.230235 6.300000 10.400000 106.080121 6.300000 10.500000 107.950007 6.300000 10.600000 109.839892 6.300000 10.700000 111.749778 6.300000 10.800000 113.679664 6.300000 10.900000 115.629549 6.300000 11.000000 117.599435 6.300000 11.100000 119.589321 6.300000 11.200000 121.599206 6.300000 11.300000 123.629092 6.300000 11.400000 125.678977 6.300000 11.500000 127.748863 6.300000 11.600000 129.838749 6.300000 11.700000 131.948634 6.300000 11.800000 134.078520 6.300000 11.900000 136.228406 6.300000 12.000000 138.398291 6.300000 12.100000 140.588177 6.300000 12.200000 142.798063 6.300000 12.300000 145.027948 6.300000 12.400000 147.277834 6.300000 12.500000 149.547720 6.300000 12.600000 151.837605 6.300000 12.700000 154.147491 6.300000 12.800000 156.477377 6.300000 12.900000 158.827262 6.300000 13.000000 161.197148 6.300000 13.100000 163.587034 6.300000 13.200000 165.996919 6.300000 13.300000 168.426805 6.300000 13.400000 170.876690 6.300000 13.500000 173.346576 6.300000 13.600000 175.836462 6.300000 13.700000 178.346347 6.300000 13.800000 180.876233 6.300000 13.900000 183.426119 6.300000 14.000000 185.996004 6.300000 14.100000 188.585890 6.300000 14.200000 191.195776 6.300000 14.300000 193.825661 6.300000 14.400000 196.475547 6.300000 14.500000 199.145433 6.300000 14.600000 201.835318 6.300000 14.700000 204.545204 6.300000 14.800000 207.275090 6.300000 14.900000 210.024975 6.300000 15.000000 212.794861 6.400000 -5.000000 56.813573 6.400000 -4.900000 55.602477 6.400000 -4.800000 54.411381 6.400000 -4.700000 53.240285 6.400000 -4.600000 52.089188 6.400000 -4.500000 50.958092 6.400000 -4.400000 49.846996 6.400000 -4.300000 48.755900 6.400000 -4.200000 47.684804 6.400000 -4.100000 46.633707 6.400000 -4.000000 45.602611 6.400000 -3.900000 44.591515 6.400000 -3.800000 43.600419 6.400000 -3.700000 42.629322 6.400000 -3.600000 41.678226 6.400000 -3.500000 40.747130 6.400000 -3.400000 39.836034 6.400000 -3.300000 38.944938 6.400000 -3.200000 38.073841 6.400000 -3.100000 37.222745 6.400000 -3.000000 36.391649 6.400000 -2.900000 35.580553 6.400000 -2.800000 34.789456 6.400000 -2.700000 34.018360 6.400000 -2.600000 33.267264 6.400000 -2.500000 32.536168 6.400000 -2.400000 31.825071 6.400000 -2.300000 31.133975 6.400000 -2.200000 30.462879 6.400000 -2.100000 29.811783 6.400000 -2.000000 29.180687 6.400000 -1.900000 28.569590 6.400000 -1.800000 27.978494 6.400000 -1.700000 27.407398 6.400000 -1.600000 26.856302 6.400000 -1.500000 26.325205 6.400000 -1.400000 25.814109 6.400000 -1.300000 25.323013 6.400000 -1.200000 24.851917 6.400000 -1.100000 24.400821 6.400000 -1.000000 23.969724 6.400000 -0.900000 23.558628 6.400000 -0.800000 23.167532 6.400000 -0.700000 22.796436 6.400000 -0.600000 22.445339 6.400000 -0.500000 22.114243 6.400000 -0.400000 21.803147 6.400000 -0.300000 21.512051 6.400000 -0.200000 21.240954 6.400000 -0.100000 20.989858 6.400000 -0.000000 20.758762 6.400000 0.100000 20.547666 6.400000 0.200000 20.356570 6.400000 0.300000 20.185473 6.400000 0.400000 20.034377 6.400000 0.500000 19.903281 6.400000 0.600000 19.792185 6.400000 0.700000 19.701088 6.400000 0.800000 19.629992 6.400000 0.900000 19.578896 6.400000 1.000000 19.547800 6.400000 1.100000 19.536704 6.400000 1.200000 19.545607 6.400000 1.300000 19.574511 6.400000 1.400000 19.623415 6.400000 1.500000 19.692319 6.400000 1.600000 19.781222 6.400000 1.700000 19.890126 6.400000 1.800000 20.019030 6.400000 1.900000 20.167934 6.400000 2.000000 20.336837 6.400000 2.100000 20.525741 6.400000 2.200000 20.734645 6.400000 2.300000 20.963549 6.400000 2.400000 21.212453 6.400000 2.500000 21.481356 6.400000 2.600000 21.770260 6.400000 2.700000 22.079164 6.400000 2.800000 22.408068 6.400000 2.900000 22.756971 6.400000 3.000000 23.125875 6.400000 3.100000 23.514779 6.400000 3.200000 23.923683 6.400000 3.300000 24.352587 6.400000 3.400000 24.801490 6.400000 3.500000 25.270394 6.400000 3.600000 25.759298 6.400000 3.700000 26.268202 6.400000 3.800000 26.797105 6.400000 3.900000 27.346009 6.400000 4.000000 27.914913 6.400000 4.100000 28.503817 6.400000 4.200000 29.112720 6.400000 4.300000 29.741624 6.400000 4.400000 30.390528 6.400000 4.500000 31.059432 6.400000 4.600000 31.748336 6.400000 4.700000 32.457239 6.400000 4.800000 33.186143 6.400000 4.900000 33.935047 6.400000 5.000000 34.703951 6.400000 5.100000 35.492854 6.400000 5.200000 36.301758 6.400000 5.300000 37.130662 6.400000 5.400000 37.979566 6.400000 5.500000 38.848470 6.400000 5.600000 39.737373 6.400000 5.700000 40.646277 6.400000 5.800000 41.575181 6.400000 5.900000 42.524085 6.400000 6.000000 43.492988 6.400000 6.100000 44.481892 6.400000 6.200000 45.490796 6.400000 6.300000 46.519700 6.400000 6.400000 47.568603 6.400000 6.500000 48.637507 6.400000 6.600000 49.726411 6.400000 6.700000 50.835315 6.400000 6.800000 51.964219 6.400000 6.900000 53.113122 6.400000 7.000000 54.282026 6.400000 7.100000 55.470930 6.400000 7.200000 56.679834 6.400000 7.300000 57.908737 6.400000 7.400000 59.157641 6.400000 7.500000 60.426545 6.400000 7.600000 61.715449 6.400000 7.700000 63.024353 6.400000 7.800000 64.353256 6.400000 7.900000 65.702160 6.400000 8.000000 67.071064 6.400000 8.100000 68.459968 6.400000 8.200000 69.868871 6.400000 8.300000 71.297775 6.400000 8.400000 72.746679 6.400000 8.500000 74.215583 6.400000 8.600000 75.704486 6.400000 8.700000 77.213390 6.400000 8.800000 78.742294 6.400000 8.900000 80.291198 6.400000 9.000000 81.860102 6.400000 9.100000 83.449005 6.400000 9.200000 85.057909 6.400000 9.300000 86.686813 6.400000 9.400000 88.335717 6.400000 9.500000 90.004620 6.400000 9.600000 91.693524 6.400000 9.700000 93.402428 6.400000 9.800000 95.131332 6.400000 9.900000 96.880236 6.400000 10.000000 98.649139 6.400000 10.100000 100.438043 6.400000 10.200000 102.246947 6.400000 10.300000 104.075851 6.400000 10.400000 105.924754 6.400000 10.500000 107.793658 6.400000 10.600000 109.682562 6.400000 10.700000 111.591466 6.400000 10.800000 113.520369 6.400000 10.900000 115.469273 6.400000 11.000000 117.438177 6.400000 11.100000 119.427081 6.400000 11.200000 121.435985 6.400000 11.300000 123.464888 6.400000 11.400000 125.513792 6.400000 11.500000 127.582696 6.400000 11.600000 129.671600 6.400000 11.700000 131.780503 6.400000 11.800000 133.909407 6.400000 11.900000 136.058311 6.400000 12.000000 138.227215 6.400000 12.100000 140.416119 6.400000 12.200000 142.625022 6.400000 12.300000 144.853926 6.400000 12.400000 147.102830 6.400000 12.500000 149.371734 6.400000 12.600000 151.660637 6.400000 12.700000 153.969541 6.400000 12.800000 156.298445 6.400000 12.900000 158.647349 6.400000 13.000000 161.016252 6.400000 13.100000 163.405156 6.400000 13.200000 165.814060 6.400000 13.300000 168.242964 6.400000 13.400000 170.691868 6.400000 13.500000 173.160771 6.400000 13.600000 175.649675 6.400000 13.700000 178.158579 6.400000 13.800000 180.687483 6.400000 13.900000 183.236386 6.400000 14.000000 185.805290 6.400000 14.100000 188.394194 6.400000 14.200000 191.003098 6.400000 14.300000 193.632001 6.400000 14.400000 196.280905 6.400000 14.500000 198.949809 6.400000 14.600000 201.638713 6.400000 14.700000 204.347617 6.400000 14.800000 207.076520 6.400000 14.900000 209.825424 6.400000 15.000000 212.594328 6.500000 -5.000000 56.745758 6.500000 -4.900000 55.533163 6.500000 -4.800000 54.340568 6.500000 -4.700000 53.167974 6.500000 -4.600000 52.015379 6.500000 -4.500000 50.882784 6.500000 -4.400000 49.770189 6.500000 -4.300000 48.677594 6.500000 -4.200000 47.604999 6.500000 -4.100000 46.552405 6.500000 -4.000000 45.519810 6.500000 -3.900000 44.507215 6.500000 -3.800000 43.514620 6.500000 -3.700000 42.542025 6.500000 -3.600000 41.589430 6.500000 -3.500000 40.656835 6.500000 -3.400000 39.744241 6.500000 -3.300000 38.851646 6.500000 -3.200000 37.979051 6.500000 -3.100000 37.126456 6.500000 -3.000000 36.293861 6.500000 -2.900000 35.481266 6.500000 -2.800000 34.688672 6.500000 -2.700000 33.916077 6.500000 -2.600000 33.163482 6.500000 -2.500000 32.430887 6.500000 -2.400000 31.718292 6.500000 -2.300000 31.025697 6.500000 -2.200000 30.353103 6.500000 -2.100000 29.700508 6.500000 -2.000000 29.067913 6.500000 -1.900000 28.455318 6.500000 -1.800000 27.862723 6.500000 -1.700000 27.290128 6.500000 -1.600000 26.737533 6.500000 -1.500000 26.204939 6.500000 -1.400000 25.692344 6.500000 -1.300000 25.199749 6.500000 -1.200000 24.727154 6.500000 -1.100000 24.274559 6.500000 -1.000000 23.841964 6.500000 -0.900000 23.429370 6.500000 -0.800000 23.036775 6.500000 -0.700000 22.664180 6.500000 -0.600000 22.311585 6.500000 -0.500000 21.978990 6.500000 -0.400000 21.666395 6.500000 -0.300000 21.373801 6.500000 -0.200000 21.101206 6.500000 -0.100000 20.848611 6.500000 -0.000000 20.616016 6.500000 0.100000 20.403421 6.500000 0.200000 20.210826 6.500000 0.300000 20.038231 6.500000 0.400000 19.885637 6.500000 0.500000 19.753042 6.500000 0.600000 19.640447 6.500000 0.700000 19.547852 6.500000 0.800000 19.475257 6.500000 0.900000 19.422662 6.500000 1.000000 19.390068 6.500000 1.100000 19.377473 6.500000 1.200000 19.384878 6.500000 1.300000 19.412283 6.500000 1.400000 19.459688 6.500000 1.500000 19.527093 6.500000 1.600000 19.614499 6.500000 1.700000 19.721904 6.500000 1.800000 19.849309 6.500000 1.900000 19.996714 6.500000 2.000000 20.164119 6.500000 2.100000 20.351524 6.500000 2.200000 20.558929 6.500000 2.300000 20.786335 6.500000 2.400000 21.033740 6.500000 2.500000 21.301145 6.500000 2.600000 21.588550 6.500000 2.700000 21.895955 6.500000 2.800000 22.223360 6.500000 2.900000 22.570766 6.500000 3.000000 22.938171 6.500000 3.100000 23.325576 6.500000 3.200000 23.732981 6.500000 3.300000 24.160386 6.500000 3.400000 24.607791 6.500000 3.500000 25.075197 6.500000 3.600000 25.562602 6.500000 3.700000 26.070007 6.500000 3.800000 26.597412 6.500000 3.900000 27.144817 6.500000 4.000000 27.712222 6.500000 4.100000 28.299627 6.500000 4.200000 28.907033 6.500000 4.300000 29.534438 6.500000 4.400000 30.181843 6.500000 4.500000 30.849248 6.500000 4.600000 31.536653 6.500000 4.700000 32.244058 6.500000 4.800000 32.971464 6.500000 4.900000 33.718869 6.500000 5.000000 34.486274 6.500000 5.100000 35.273679 6.500000 5.200000 36.081084 6.500000 5.300000 36.908489 6.500000 5.400000 37.755895 6.500000 5.500000 38.623300 6.500000 5.600000 39.510705 6.500000 5.700000 40.418110 6.500000 5.800000 41.345515 6.500000 5.900000 42.292920 6.500000 6.000000 43.260325 6.500000 6.100000 44.247731 6.500000 6.200000 45.255136 6.500000 6.300000 46.282541 6.500000 6.400000 47.329946 6.500000 6.500000 48.397351 6.500000 6.600000 49.484756 6.500000 6.700000 50.592162 6.500000 6.800000 51.719567 6.500000 6.900000 52.866972 6.500000 7.000000 54.034377 6.500000 7.100000 55.221782 6.500000 7.200000 56.429187 6.500000 7.300000 57.656593 6.500000 7.400000 58.903998 6.500000 7.500000 60.171403 6.500000 7.600000 61.458808 6.500000 7.700000 62.766213 6.500000 7.800000 64.093618 6.500000 7.900000 65.441023 6.500000 8.000000 66.808429 6.500000 8.100000 68.195834 6.500000 8.200000 69.603239 6.500000 8.300000 71.030644 6.500000 8.400000 72.478049 6.500000 8.500000 73.945454 6.500000 8.600000 75.432860 6.500000 8.700000 76.940265 6.500000 8.800000 78.467670 6.500000 8.900000 80.015075 6.500000 9.000000 81.582480 6.500000 9.100000 83.169885 6.500000 9.200000 84.777291 6.500000 9.300000 86.404696 6.500000 9.400000 88.052101 6.500000 9.500000 89.719506 6.500000 9.600000 91.406911 6.500000 9.700000 93.114316 6.500000 9.800000 94.841721 6.500000 9.900000 96.589127 6.500000 10.000000 98.356532 6.500000 10.100000 100.143937 6.500000 10.200000 101.951342 6.500000 10.300000 103.778747 6.500000 10.400000 105.626152 6.500000 10.500000 107.493558 6.500000 10.600000 109.380963 6.500000 10.700000 111.288368 6.500000 10.800000 113.215773 6.500000 10.900000 115.163178 6.500000 11.000000 117.130583 6.500000 11.100000 119.117989 6.500000 11.200000 121.125394 6.500000 11.300000 123.152799 6.500000 11.400000 125.200204 6.500000 11.500000 127.267609 6.500000 11.600000 129.355014 6.500000 11.700000 131.462419 6.500000 11.800000 133.589825 6.500000 11.900000 135.737230 6.500000 12.000000 137.904635 6.500000 12.100000 140.092040 6.500000 12.200000 142.299445 6.500000 12.300000 144.526850 6.500000 12.400000 146.774256 6.500000 12.500000 149.041661 6.500000 12.600000 151.329066 6.500000 12.700000 153.636471 6.500000 12.800000 155.963876 6.500000 12.900000 158.311281 6.500000 13.000000 160.678687 6.500000 13.100000 163.066092 6.500000 13.200000 165.473497 6.500000 13.300000 167.900902 6.500000 13.400000 170.348307 6.500000 13.500000 172.815712 6.500000 13.600000 175.303117 6.500000 13.700000 177.810523 6.500000 13.800000 180.337928 6.500000 13.900000 182.885333 6.500000 14.000000 185.452738 6.500000 14.100000 188.040143 6.500000 14.200000 190.647548 6.500000 14.300000 193.274954 6.500000 14.400000 195.922359 6.500000 14.500000 198.589764 6.500000 14.600000 201.277169 6.500000 14.700000 203.984574 6.500000 14.800000 206.711979 6.500000 14.900000 209.459385 6.500000 15.000000 212.226790 6.600000 -5.000000 56.615994 6.600000 -4.900000 55.401383 6.600000 -4.800000 54.206773 6.600000 -4.700000 53.032163 6.600000 -4.600000 51.877553 6.600000 -4.500000 50.742943 6.600000 -4.400000 49.628332 6.600000 -4.300000 48.533722 6.600000 -4.200000 47.459112 6.600000 -4.100000 46.404502 6.600000 -4.000000 45.369892 6.600000 -3.900000 44.355281 6.600000 -3.800000 43.360671 6.600000 -3.700000 42.386061 6.600000 -3.600000 41.431451 6.600000 -3.500000 40.496841 6.600000 -3.400000 39.582230 6.600000 -3.300000 38.687620 6.600000 -3.200000 37.813010 6.600000 -3.100000 36.958400 6.600000 -3.000000 36.123790 6.600000 -2.900000 35.309180 6.600000 -2.800000 34.514569 6.600000 -2.700000 33.739959 6.600000 -2.600000 32.985349 6.600000 -2.500000 32.250739 6.600000 -2.400000 31.536129 6.600000 -2.300000 30.841518 6.600000 -2.200000 30.166908 6.600000 -2.100000 29.512298 6.600000 -2.000000 28.877688 6.600000 -1.900000 28.263078 6.600000 -1.800000 27.668467 6.600000 -1.700000 27.093857 6.600000 -1.600000 26.539247 6.600000 -1.500000 26.004637 6.600000 -1.400000 25.490027 6.600000 -1.300000 24.995416 6.600000 -1.200000 24.520806 6.600000 -1.100000 24.066196 6.600000 -1.000000 23.631586 6.600000 -0.900000 23.216976 6.600000 -0.800000 22.822365 6.600000 -0.700000 22.447755 6.600000 -0.600000 22.093145 6.600000 -0.500000 21.758535 6.600000 -0.400000 21.443925 6.600000 -0.300000 21.149314 6.600000 -0.200000 20.874704 6.600000 -0.100000 20.620094 6.600000 -0.000000 20.385484 6.600000 0.100000 20.170874 6.600000 0.200000 19.976263 6.600000 0.300000 19.801653 6.600000 0.400000 19.647043 6.600000 0.500000 19.512433 6.600000 0.600000 19.397823 6.600000 0.700000 19.303213 6.600000 0.800000 19.228602 6.600000 0.900000 19.173992 6.600000 1.000000 19.139382 6.600000 1.100000 19.124772 6.600000 1.200000 19.130162 6.600000 1.300000 19.155551 6.600000 1.400000 19.200941 6.600000 1.500000 19.266331 6.600000 1.600000 19.351721 6.600000 1.700000 19.457111 6.600000 1.800000 19.582500 6.600000 1.900000 19.727890 6.600000 2.000000 19.893280 6.600000 2.100000 20.078670 6.600000 2.200000 20.284060 6.600000 2.300000 20.509449 6.600000 2.400000 20.754839 6.600000 2.500000 21.020229 6.600000 2.600000 21.305619 6.600000 2.700000 21.611009 6.600000 2.800000 21.936398 6.600000 2.900000 22.281788 6.600000 3.000000 22.647178 6.600000 3.100000 23.032568 6.600000 3.200000 23.437958 6.600000 3.300000 23.863347 6.600000 3.400000 24.308737 6.600000 3.500000 24.774127 6.600000 3.600000 25.259517 6.600000 3.700000 25.764907 6.600000 3.800000 26.290296 6.600000 3.900000 26.835686 6.600000 4.000000 27.401076 6.600000 4.100000 27.986466 6.600000 4.200000 28.591856 6.600000 4.300000 29.217245 6.600000 4.400000 29.862635 6.600000 4.500000 30.528025 6.600000 4.600000 31.213415 6.600000 4.700000 31.918805 6.600000 4.800000 32.644195 6.600000 4.900000 33.389584 6.600000 5.000000 34.154974 6.600000 5.100000 34.940364 6.600000 5.200000 35.745754 6.600000 5.300000 36.571144 6.600000 5.400000 37.416533 6.600000 5.500000 38.281923 6.600000 5.600000 39.167313 6.600000 5.700000 40.072703 6.600000 5.800000 40.998093 6.600000 5.900000 41.943482 6.600000 6.000000 42.908872 6.600000 6.100000 43.894262 6.600000 6.200000 44.899652 6.600000 6.300000 45.925042 6.600000 6.400000 46.970431 6.600000 6.500000 48.035821 6.600000 6.600000 49.121211 6.600000 6.700000 50.226601 6.600000 6.800000 51.351991 6.600000 6.900000 52.497380 6.600000 7.000000 53.662770 6.600000 7.100000 54.848160 6.600000 7.200000 56.053550 6.600000 7.300000 57.278940 6.600000 7.400000 58.524329 6.600000 7.500000 59.789719 6.600000 7.600000 61.075109 6.600000 7.700000 62.380499 6.600000 7.800000 63.705889 6.600000 7.900000 65.051278 6.600000 8.000000 66.416668 6.600000 8.100000 67.802058 6.600000 8.200000 69.207448 6.600000 8.300000 70.632838 6.600000 8.400000 72.078228 6.600000 8.500000 73.543617 6.600000 8.600000 75.029007 6.600000 8.700000 76.534397 6.600000 8.800000 78.059787 6.600000 8.900000 79.605177 6.600000 9.000000 81.170566 6.600000 9.100000 82.755956 6.600000 9.200000 84.361346 6.600000 9.300000 85.986736 6.600000 9.400000 87.632126 6.600000 9.500000 89.297515 6.600000 9.600000 90.982905 6.600000 9.700000 92.688295 6.600000 9.800000 94.413685 6.600000 9.900000 96.159075 6.600000 10.000000 97.924464 6.600000 10.100000 99.709854 6.600000 10.200000 101.515244 6.600000 10.300000 103.340634 6.600000 10.400000 105.186024 6.600000 10.500000 107.051413 6.600000 10.600000 108.936803 6.600000 10.700000 110.842193 6.600000 10.800000 112.767583 6.600000 10.900000 114.712973 6.600000 11.000000 116.678362 6.600000 11.100000 118.663752 6.600000 11.200000 120.669142 6.600000 11.300000 122.694532 6.600000 11.400000 124.739922 6.600000 11.500000 126.805311 6.600000 11.600000 128.890701 6.600000 11.700000 130.996091 6.600000 11.800000 133.121481 6.600000 11.900000 135.266871 6.600000 12.000000 137.432260 6.600000 12.100000 139.617650 6.600000 12.200000 141.823040 6.600000 12.300000 144.048430 6.600000 12.400000 146.293820 6.600000 12.500000 148.559210 6.600000 12.600000 150.844599 6.600000 12.700000 153.149989 6.600000 12.800000 155.475379 6.600000 12.900000 157.820769 6.600000 13.000000 160.186159 6.600000 13.100000 162.571548 6.600000 13.200000 164.976938 6.600000 13.300000 167.402328 6.600000 13.400000 169.847718 6.600000 13.500000 172.313108 6.600000 13.600000 174.798497 6.600000 13.700000 177.303887 6.600000 13.800000 179.829277 6.600000 13.900000 182.374667 6.600000 14.000000 184.940057 6.600000 14.100000 187.525446 6.600000 14.200000 190.130836 6.600000 14.300000 192.756226 6.600000 14.400000 195.401616 6.600000 14.500000 198.067006 6.600000 14.600000 200.752395 6.600000 14.700000 203.457785 6.600000 14.800000 206.183175 6.600000 14.900000 208.928565 6.600000 15.000000 211.693955 6.700000 -5.000000 56.426965 6.700000 -4.900000 55.209822 6.700000 -4.800000 54.012680 6.700000 -4.700000 52.835538 6.700000 -4.600000 51.678396 6.700000 -4.500000 50.541253 6.700000 -4.400000 49.424111 6.700000 -4.300000 48.326969 6.700000 -4.200000 47.249826 6.700000 -4.100000 46.192684 6.700000 -4.000000 45.155542 6.700000 -3.900000 44.138400 6.700000 -3.800000 43.141257 6.700000 -3.700000 42.164115 6.700000 -3.600000 41.206973 6.700000 -3.500000 40.269830 6.700000 -3.400000 39.352688 6.700000 -3.300000 38.455546 6.700000 -3.200000 37.578404 6.700000 -3.100000 36.721261 6.700000 -3.000000 35.884119 6.700000 -2.900000 35.066977 6.700000 -2.800000 34.269834 6.700000 -2.700000 33.492692 6.700000 -2.600000 32.735550 6.700000 -2.500000 31.998408 6.700000 -2.400000 31.281265 6.700000 -2.300000 30.584123 6.700000 -2.200000 29.906981 6.700000 -2.100000 29.249838 6.700000 -2.000000 28.612696 6.700000 -1.900000 27.995554 6.700000 -1.800000 27.398412 6.700000 -1.700000 26.821269 6.700000 -1.600000 26.264127 6.700000 -1.500000 25.726985 6.700000 -1.400000 25.209842 6.700000 -1.300000 24.712700 6.700000 -1.200000 24.235558 6.700000 -1.100000 23.778416 6.700000 -1.000000 23.341273 6.700000 -0.900000 22.924131 6.700000 -0.800000 22.526989 6.700000 -0.700000 22.149846 6.700000 -0.600000 21.792704 6.700000 -0.500000 21.455562 6.700000 -0.400000 21.138420 6.700000 -0.300000 20.841277 6.700000 -0.200000 20.564135 6.700000 -0.100000 20.306993 6.700000 -0.000000 20.069850 6.700000 0.100000 19.852708 6.700000 0.200000 19.655566 6.700000 0.300000 19.478424 6.700000 0.400000 19.321281 6.700000 0.500000 19.184139 6.700000 0.600000 19.066997 6.700000 0.700000 18.969854 6.700000 0.800000 18.892712 6.700000 0.900000 18.835570 6.700000 1.000000 18.798428 6.700000 1.100000 18.781285 6.700000 1.200000 18.784143 6.700000 1.300000 18.807001 6.700000 1.400000 18.849858 6.700000 1.500000 18.912716 6.700000 1.600000 18.995574 6.700000 1.700000 19.098432 6.700000 1.800000 19.221289 6.700000 1.900000 19.364147 6.700000 2.000000 19.527005 6.700000 2.100000 19.709862 6.700000 2.200000 19.912720 6.700000 2.300000 20.135578 6.700000 2.400000 20.378436 6.700000 2.500000 20.641293 6.700000 2.600000 20.924151 6.700000 2.700000 21.227009 6.700000 2.800000 21.549866 6.700000 2.900000 21.892724 6.700000 3.000000 22.255582 6.700000 3.100000 22.638440 6.700000 3.200000 23.041297 6.700000 3.300000 23.464155 6.700000 3.400000 23.907013 6.700000 3.500000 24.369870 6.700000 3.600000 24.852728 6.700000 3.700000 25.355586 6.700000 3.800000 25.878444 6.700000 3.900000 26.421301 6.700000 4.000000 26.984159 6.700000 4.100000 27.567017 6.700000 4.200000 28.169874 6.700000 4.300000 28.792732 6.700000 4.400000 29.435590 6.700000 4.500000 30.098448 6.700000 4.600000 30.781305 6.700000 4.700000 31.484163 6.700000 4.800000 32.207021 6.700000 4.900000 32.949878 6.700000 5.000000 33.712736 6.700000 5.100000 34.495594 6.700000 5.200000 35.298452 6.700000 5.300000 36.121309 6.700000 5.400000 36.964167 6.700000 5.500000 37.827025 6.700000 5.600000 38.709882 6.700000 5.700000 39.612740 6.700000 5.800000 40.535598 6.700000 5.900000 41.478456 6.700000 6.000000 42.441313 6.700000 6.100000 43.424171 6.700000 6.200000 44.427029 6.700000 6.300000 45.449886 6.700000 6.400000 46.492744 6.700000 6.500000 47.555602 6.700000 6.600000 48.638460 6.700000 6.700000 49.741317 6.700000 6.800000 50.864175 6.700000 6.900000 52.007033 6.700000 7.000000 53.169890 6.700000 7.100000 54.352748 6.700000 7.200000 55.555606 6.700000 7.300000 56.778464 6.700000 7.400000 58.021321 6.700000 7.500000 59.284179 6.700000 7.600000 60.567037 6.700000 7.700000 61.869894 6.700000 7.800000 63.192752 6.700000 7.900000 64.535610 6.700000 8.000000 65.898468 6.700000 8.100000 67.281325 6.700000 8.200000 68.684183 6.700000 8.300000 70.107041 6.700000 8.400000 71.549898 6.700000 8.500000 73.012756 6.700000 8.600000 74.495614 6.700000 8.700000 75.998472 6.700000 8.800000 77.521329 6.700000 8.900000 79.064187 6.700000 9.000000 80.627045 6.700000 9.100000 82.209902 6.700000 9.200000 83.812760 6.700000 9.300000 85.435618 6.700000 9.400000 87.078476 6.700000 9.500000 88.741333 6.700000 9.600000 90.424191 6.700000 9.700000 92.127049 6.700000 9.800000 93.849906 6.700000 9.900000 95.592764 6.700000 10.000000 97.355622 6.700000 10.100000 99.138480 6.700000 10.200000 100.941337 6.700000 10.300000 102.764195 6.700000 10.400000 104.607053 6.700000 10.500000 106.469910 6.700000 10.600000 108.352768 6.700000 10.700000 110.255626 6.700000 10.800000 112.178484 6.700000 10.900000 114.121341 6.700000 11.000000 116.084199 6.700000 11.100000 118.067057 6.700000 11.200000 120.069914 6.700000 11.300000 122.092772 6.700000 11.400000 124.135630 6.700000 11.500000 126.198488 6.700000 11.600000 128.281345 6.700000 11.700000 130.384203 6.700000 11.800000 132.507061 6.700000 11.900000 134.649918 6.700000 12.000000 136.812776 6.700000 12.100000 138.995634 6.700000 12.200000 141.198492 6.700000 12.300000 143.421349 6.700000 12.400000 145.664207 6.700000 12.500000 147.927065 6.700000 12.600000 150.209922 6.700000 12.700000 152.512780 6.700000 12.800000 154.835638 6.700000 12.900000 157.178496 6.700000 13.000000 159.541353 6.700000 13.100000 161.924211 6.700000 13.200000 164.327069 6.700000 13.300000 166.749926 6.700000 13.400000 169.192784 6.700000 13.500000 171.655642 6.700000 13.600000 174.138500 6.700000 13.700000 176.641357 6.700000 13.800000 179.164215 6.700000 13.900000 181.707073 6.700000 14.000000 184.269930 6.700000 14.100000 186.852788 6.700000 14.200000 189.455646 6.700000 14.300000 192.078504 6.700000 14.400000 194.721361 6.700000 14.500000 197.384219 6.700000 14.600000 200.067077 6.700000 14.700000 202.769934 6.700000 14.800000 205.492792 6.700000 14.900000 208.235650 6.700000 15.000000 210.998508 6.800000 -5.000000 56.182307 6.800000 -4.900000 54.962116 6.800000 -4.800000 53.761925 6.800000 -4.700000 52.581734 6.800000 -4.600000 51.421543 6.800000 -4.500000 50.281352 6.800000 -4.400000 49.161160 6.800000 -4.300000 48.060969 6.800000 -4.200000 46.980778 6.800000 -4.100000 45.920587 6.800000 -4.000000 44.880396 6.800000 -3.900000 43.860205 6.800000 -3.800000 42.860014 6.800000 -3.700000 41.879823 6.800000 -3.600000 40.919631 6.800000 -3.500000 39.979440 6.800000 -3.400000 39.059249 6.800000 -3.300000 38.159058 6.800000 -3.200000 37.278867 6.800000 -3.100000 36.418676 6.800000 -3.000000 35.578485 6.800000 -2.900000 34.758294 6.800000 -2.800000 33.958103 6.800000 -2.700000 33.177911 6.800000 -2.600000 32.417720 6.800000 -2.500000 31.677529 6.800000 -2.400000 30.957338 6.800000 -2.300000 30.257147 6.800000 -2.200000 29.576956 6.800000 -2.100000 28.916765 6.800000 -2.000000 28.276574 6.800000 -1.900000 27.656383 6.800000 -1.800000 27.056191 6.800000 -1.700000 26.476000 6.800000 -1.600000 25.915809 6.800000 -1.500000 25.375618 6.800000 -1.400000 24.855427 6.800000 -1.300000 24.355236 6.800000 -1.200000 23.875045 6.800000 -1.100000 23.414854 6.800000 -1.000000 22.974663 6.800000 -0.900000 22.554471 6.800000 -0.800000 22.154280 6.800000 -0.700000 21.774089 6.800000 -0.600000 21.413898 6.800000 -0.500000 21.073707 6.800000 -0.400000 20.753516 6.800000 -0.300000 20.453325 6.800000 -0.200000 20.173134 6.800000 -0.100000 19.912942 6.800000 -0.000000 19.672751 6.800000 0.100000 19.452560 6.800000 0.200000 19.252369 6.800000 0.300000 19.072178 6.800000 0.400000 18.911987 6.800000 0.500000 18.771796 6.800000 0.600000 18.651605 6.800000 0.700000 18.551414 6.800000 0.800000 18.471222 6.800000 0.900000 18.411031 6.800000 1.000000 18.370840 6.800000 1.100000 18.350649 6.800000 1.200000 18.350458 6.800000 1.300000 18.370267 6.800000 1.400000 18.410076 6.800000 1.500000 18.469885 6.800000 1.600000 18.549694 6.800000 1.700000 18.649502 6.800000 1.800000 18.769311 6.800000 1.900000 18.909120 6.800000 2.000000 19.068929 6.800000 2.100000 19.248738 6.800000 2.200000 19.448547 6.800000 2.300000 19.668356 6.800000 2.400000 19.908165 6.800000 2.500000 20.167974 6.800000 2.600000 20.447782 6.800000 2.700000 20.747591 6.800000 2.800000 21.067400 6.800000 2.900000 21.407209 6.800000 3.000000 21.767018 6.800000 3.100000 22.146827 6.800000 3.200000 22.546636 6.800000 3.300000 22.966445 6.800000 3.400000 23.406253 6.800000 3.500000 23.866062 6.800000 3.600000 24.345871 6.800000 3.700000 24.845680 6.800000 3.800000 25.365489 6.800000 3.900000 25.905298 6.800000 4.000000 26.465107 6.800000 4.100000 27.044916 6.800000 4.200000 27.644725 6.800000 4.300000 28.264533 6.800000 4.400000 28.904342 6.800000 4.500000 29.564151 6.800000 4.600000 30.243960 6.800000 4.700000 30.943769 6.800000 4.800000 31.663578 6.800000 4.900000 32.403387 6.800000 5.000000 33.163196 6.800000 5.100000 33.943005 6.800000 5.200000 34.742813 6.800000 5.300000 35.562622 6.800000 5.400000 36.402431 6.800000 5.500000 37.262240 6.800000 5.600000 38.142049 6.800000 5.700000 39.041858 6.800000 5.800000 39.961667 6.800000 5.900000 40.901476 6.800000 6.000000 41.861284 6.800000 6.100000 42.841093 6.800000 6.200000 43.840902 6.800000 6.300000 44.860711 6.800000 6.400000 45.900520 6.800000 6.500000 46.960329 6.800000 6.600000 48.040138 6.800000 6.700000 49.139947 6.800000 6.800000 50.259756 6.800000 6.900000 51.399564 6.800000 7.000000 52.559373 6.800000 7.100000 53.739182 6.800000 7.200000 54.938991 6.800000 7.300000 56.158800 6.800000 7.400000 57.398609 6.800000 7.500000 58.658418 6.800000 7.600000 59.938227 6.800000 7.700000 61.238036 6.800000 7.800000 62.557844 6.800000 7.900000 63.897653 6.800000 8.000000 65.257462 6.800000 8.100000 66.637271 6.800000 8.200000 68.037080 6.800000 8.300000 69.456889 6.800000 8.400000 70.896698 6.800000 8.500000 72.356507 6.800000 8.600000 73.836316 6.800000 8.700000 75.336124 6.800000 8.800000 76.855933 6.800000 8.900000 78.395742 6.800000 9.000000 79.955551 6.800000 9.100000 81.535360 6.800000 9.200000 83.135169 6.800000 9.300000 84.754978 6.800000 9.400000 86.394787 6.800000 9.500000 88.054595 6.800000 9.600000 89.734404 6.800000 9.700000 91.434213 6.800000 9.800000 93.154022 6.800000 9.900000 94.893831 6.800000 10.000000 96.653640 6.800000 10.100000 98.433449 6.800000 10.200000 100.233258 6.800000 10.300000 102.053067 6.800000 10.400000 103.892875 6.800000 10.500000 105.752684 6.800000 10.600000 107.632493 6.800000 10.700000 109.532302 6.800000 10.800000 111.452111 6.800000 10.900000 113.391920 6.800000 11.000000 115.351729 6.800000 11.100000 117.331538 6.800000 11.200000 119.331347 6.800000 11.300000 121.351155 6.800000 11.400000 123.390964 6.800000 11.500000 125.450773 6.800000 11.600000 127.530582 6.800000 11.700000 129.630391 6.800000 11.800000 131.750200 6.800000 11.900000 133.890009 6.800000 12.000000 136.049818 6.800000 12.100000 138.229627 6.800000 12.200000 140.429435 6.800000 12.300000 142.649244 6.800000 12.400000 144.889053 6.800000 12.500000 147.148862 6.800000 12.600000 149.428671 6.800000 12.700000 151.728480 6.800000 12.800000 154.048289 6.800000 12.900000 156.388098 6.800000 13.000000 158.747906 6.800000 13.100000 161.127715 6.800000 13.200000 163.527524 6.800000 13.300000 165.947333 6.800000 13.400000 168.387142 6.800000 13.500000 170.846951 6.800000 13.600000 173.326760 6.800000 13.700000 175.826569 6.800000 13.800000 178.346378 6.800000 13.900000 180.886186 6.800000 14.000000 183.445995 6.800000 14.100000 186.025804 6.800000 14.200000 188.625613 6.800000 14.300000 191.245422 6.800000 14.400000 193.885231 6.800000 14.500000 196.545040 6.800000 14.600000 199.224849 6.800000 14.700000 201.924658 6.800000 14.800000 204.644466 6.800000 14.900000 207.384275 6.800000 15.000000 210.144084 6.900000 -5.000000 55.886573 6.900000 -4.900000 54.662816 6.900000 -4.800000 53.459060 6.900000 -4.700000 52.275303 6.900000 -4.600000 51.111546 6.900000 -4.500000 49.967790 6.900000 -4.400000 48.844033 6.900000 -4.300000 47.740276 6.900000 -4.200000 46.656520 6.900000 -4.100000 45.592763 6.900000 -4.000000 44.549006 6.900000 -3.900000 43.525250 6.900000 -3.800000 42.521493 6.900000 -3.700000 41.537736 6.900000 -3.600000 40.573979 6.900000 -3.500000 39.630223 6.900000 -3.400000 38.706466 6.900000 -3.300000 37.802709 6.900000 -3.200000 36.918953 6.900000 -3.100000 36.055196 6.900000 -3.000000 35.211439 6.900000 -2.900000 34.387683 6.900000 -2.800000 33.583926 6.900000 -2.700000 32.800169 6.900000 -2.600000 32.036413 6.900000 -2.500000 31.292656 6.900000 -2.400000 30.568899 6.900000 -2.300000 29.865143 6.900000 -2.200000 29.181386 6.900000 -2.100000 28.517629 6.900000 -2.000000 27.873873 6.900000 -1.900000 27.250116 6.900000 -1.800000 26.646359 6.900000 -1.700000 26.062603 6.900000 -1.600000 25.498846 6.900000 -1.500000 24.955089 6.900000 -1.400000 24.431332 6.900000 -1.300000 23.927576 6.900000 -1.200000 23.443819 6.900000 -1.100000 22.980062 6.900000 -1.000000 22.536306 6.900000 -0.900000 22.112549 6.900000 -0.800000 21.708792 6.900000 -0.700000 21.325036 6.900000 -0.600000 20.961279 6.900000 -0.500000 20.617522 6.900000 -0.400000 20.293766 6.900000 -0.300000 19.990009 6.900000 -0.200000 19.706252 6.900000 -0.100000 19.442496 6.900000 -0.000000 19.198739 6.900000 0.100000 18.974982 6.900000 0.200000 18.771226 6.900000 0.300000 18.587469 6.900000 0.400000 18.423712 6.900000 0.500000 18.279956 6.900000 0.600000 18.156199 6.900000 0.700000 18.052442 6.900000 0.800000 17.968685 6.900000 0.900000 17.904929 6.900000 1.000000 17.861172 6.900000 1.100000 17.837415 6.900000 1.200000 17.833659 6.900000 1.300000 17.849902 6.900000 1.400000 17.886145 6.900000 1.500000 17.942389 6.900000 1.600000 18.018632 6.900000 1.700000 18.114875 6.900000 1.800000 18.231119 6.900000 1.900000 18.367362 6.900000 2.000000 18.523605 6.900000 2.100000 18.699849 6.900000 2.200000 18.896092 6.900000 2.300000 19.112335 6.900000 2.400000 19.348579 6.900000 2.500000 19.604822 6.900000 2.600000 19.881065 6.900000 2.700000 20.177309 6.900000 2.800000 20.493552 6.900000 2.900000 20.829795 6.900000 3.000000 21.186039 6.900000 3.100000 21.562282 6.900000 3.200000 21.958525 6.900000 3.300000 22.374768 6.900000 3.400000 22.811012 6.900000 3.500000 23.267255 6.900000 3.600000 23.743498 6.900000 3.700000 24.239742 6.900000 3.800000 24.755985 6.900000 3.900000 25.292228 6.900000 4.000000 25.848472 6.900000 4.100000 26.424715 6.900000 4.200000 27.020958 6.900000 4.300000 27.637202 6.900000 4.400000 28.273445 6.900000 4.500000 28.929688 6.900000 4.600000 29.605932 6.900000 4.700000 30.302175 6.900000 4.800000 31.018418 6.900000 4.900000 31.754662 6.900000 5.000000 32.510905 6.900000 5.100000 33.287148 6.900000 5.200000 34.083392 6.900000 5.300000 34.899635 6.900000 5.400000 35.735878 6.900000 5.500000 36.592121 6.900000 5.600000 37.468365 6.900000 5.700000 38.364608 6.900000 5.800000 39.280851 6.900000 5.900000 40.217095 6.900000 6.000000 41.173338 6.900000 6.100000 42.149581 6.900000 6.200000 43.145825 6.900000 6.300000 44.162068 6.900000 6.400000 45.198311 6.900000 6.500000 46.254555 6.900000 6.600000 47.330798 6.900000 6.700000 48.427041 6.900000 6.800000 49.543285 6.900000 6.900000 50.679528 6.900000 7.000000 51.835771 6.900000 7.100000 53.012015 6.900000 7.200000 54.208258 6.900000 7.300000 55.424501 6.900000 7.400000 56.660745 6.900000 7.500000 57.916988 6.900000 7.600000 59.193231 6.900000 7.700000 60.489474 6.900000 7.800000 61.805718 6.900000 7.900000 63.141961 6.900000 8.000000 64.498204 6.900000 8.100000 65.874448 6.900000 8.200000 67.270691 6.900000 8.300000 68.686934 6.900000 8.400000 70.123178 6.900000 8.500000 71.579421 6.900000 8.600000 73.055664 6.900000 8.700000 74.551908 6.900000 8.800000 76.068151 6.900000 8.900000 77.604394 6.900000 9.000000 79.160638 6.900000 9.100000 80.736881 6.900000 9.200000 82.333124 6.900000 9.300000 83.949368 6.900000 9.400000 85.585611 6.900000 9.500000 87.241854 6.900000 9.600000 88.918098 6.900000 9.700000 90.614341 6.900000 9.800000 92.330584 6.900000 9.900000 94.066827 6.900000 10.000000 95.823071 6.900000 10.100000 97.599314 6.900000 10.200000 99.395557 6.900000 10.300000 101.211801 6.900000 10.400000 103.048044 6.900000 10.500000 104.904287 6.900000 10.600000 106.780531 6.900000 10.700000 108.676774 6.900000 10.800000 110.593017 6.900000 10.900000 112.529261 6.900000 11.000000 114.485504 6.900000 11.100000 116.461747 6.900000 11.200000 118.457991 6.900000 11.300000 120.474234 6.900000 11.400000 122.510477 6.900000 11.500000 124.566721 6.900000 11.600000 126.642964 6.900000 11.700000 128.739207 6.900000 11.800000 130.855451 6.900000 11.900000 132.991694 6.900000 12.000000 135.147937 6.900000 12.100000 137.324180 6.900000 12.200000 139.520424 6.900000 12.300000 141.736667 6.900000 12.400000 143.972910 6.900000 12.500000 146.229154 6.900000 12.600000 148.505397 6.900000 12.700000 150.801640 6.900000 12.800000 153.117884 6.900000 12.900000 155.454127 6.900000 13.000000 157.810370 6.900000 13.100000 160.186614 6.900000 13.200000 162.582857 6.900000 13.300000 164.999100 6.900000 13.400000 167.435344 6.900000 13.500000 169.891587 6.900000 13.600000 172.367830 6.900000 13.700000 174.864074 6.900000 13.800000 177.380317 6.900000 13.900000 179.916560 6.900000 14.000000 182.472804 6.900000 14.100000 185.049047 6.900000 14.200000 187.645290 6.900000 14.300000 190.261534 6.900000 14.400000 192.897777 6.900000 14.500000 195.554020 6.900000 14.600000 198.230263 6.900000 14.700000 200.926507 6.900000 14.800000 203.642750 6.900000 14.900000 206.378993 6.900000 15.000000 209.135237 7.000000 -5.000000 55.545188 7.000000 -4.900000 54.317349 7.000000 -4.800000 53.109510 7.000000 -4.700000 51.921671 7.000000 -4.600000 50.753832 7.000000 -4.500000 49.605993 7.000000 -4.400000 48.478154 7.000000 -4.300000 47.370315 7.000000 -4.200000 46.282476 7.000000 -4.100000 45.214637 7.000000 -4.000000 44.166798 7.000000 -3.900000 43.138959 7.000000 -3.800000 42.131120 7.000000 -3.700000 41.143281 7.000000 -3.600000 40.175442 7.000000 -3.500000 39.227603 7.000000 -3.400000 38.299764 7.000000 -3.300000 37.391926 7.000000 -3.200000 36.504087 7.000000 -3.100000 35.636248 7.000000 -3.000000 34.788409 7.000000 -2.900000 33.960570 7.000000 -2.800000 33.152731 7.000000 -2.700000 32.364892 7.000000 -2.600000 31.597053 7.000000 -2.500000 30.849214 7.000000 -2.400000 30.121375 7.000000 -2.300000 29.413536 7.000000 -2.200000 28.725697 7.000000 -2.100000 28.057858 7.000000 -2.000000 27.410019 7.000000 -1.900000 26.782180 7.000000 -1.800000 26.174341 7.000000 -1.700000 25.586502 7.000000 -1.600000 25.018663 7.000000 -1.500000 24.470824 7.000000 -1.400000 23.942985 7.000000 -1.300000 23.435146 7.000000 -1.200000 22.947307 7.000000 -1.100000 22.479468 7.000000 -1.000000 22.031629 7.000000 -0.900000 21.603790 7.000000 -0.800000 21.195951 7.000000 -0.700000 20.808112 7.000000 -0.600000 20.440273 7.000000 -0.500000 20.092434 7.000000 -0.400000 19.764595 7.000000 -0.300000 19.456756 7.000000 -0.200000 19.168917 7.000000 -0.100000 18.901078 7.000000 -0.000000 18.653239 7.000000 0.100000 18.425400 7.000000 0.200000 18.217561 7.000000 0.300000 18.029722 7.000000 0.400000 17.861883 7.000000 0.500000 17.714044 7.000000 0.600000 17.586205 7.000000 0.700000 17.478366 7.000000 0.800000 17.390527 7.000000 0.900000 17.322688 7.000000 1.000000 17.274849 7.000000 1.100000 17.247010 7.000000 1.200000 17.239171 7.000000 1.300000 17.251332 7.000000 1.400000 17.283493 7.000000 1.500000 17.335654 7.000000 1.600000 17.407815 7.000000 1.700000 17.499976 7.000000 1.800000 17.612137 7.000000 1.900000 17.744298 7.000000 2.000000 17.896459 7.000000 2.100000 18.068620 7.000000 2.200000 18.260781 7.000000 2.300000 18.472942 7.000000 2.400000 18.705103 7.000000 2.500000 18.957264 7.000000 2.600000 19.229425 7.000000 2.700000 19.521586 7.000000 2.800000 19.833747 7.000000 2.900000 20.165908 7.000000 3.000000 20.518069 7.000000 3.100000 20.890230 7.000000 3.200000 21.282391 7.000000 3.300000 21.694552 7.000000 3.400000 22.126713 7.000000 3.500000 22.578874 7.000000 3.600000 23.051035 7.000000 3.700000 23.543196 7.000000 3.800000 24.055357 7.000000 3.900000 24.587518 7.000000 4.000000 25.139679 7.000000 4.100000 25.711841 7.000000 4.200000 26.304002 7.000000 4.300000 26.916163 7.000000 4.400000 27.548324 7.000000 4.500000 28.200485 7.000000 4.600000 28.872646 7.000000 4.700000 29.564807 7.000000 4.800000 30.276968 7.000000 4.900000 31.009129 7.000000 5.000000 31.761290 7.000000 5.100000 32.533451 7.000000 5.200000 33.325612 7.000000 5.300000 34.137773 7.000000 5.400000 34.969934 7.000000 5.500000 35.822095 7.000000 5.600000 36.694256 7.000000 5.700000 37.586417 7.000000 5.800000 38.498578 7.000000 5.900000 39.430739 7.000000 6.000000 40.382900 7.000000 6.100000 41.355061 7.000000 6.200000 42.347222 7.000000 6.300000 43.359383 7.000000 6.400000 44.391544 7.000000 6.500000 45.443705 7.000000 6.600000 46.515866 7.000000 6.700000 47.608027 7.000000 6.800000 48.720188 7.000000 6.900000 49.852349 7.000000 7.000000 51.004510 7.000000 7.100000 52.176671 7.000000 7.200000 53.368832 7.000000 7.300000 54.580993 7.000000 7.400000 55.813154 7.000000 7.500000 57.065315 7.000000 7.600000 58.337476 7.000000 7.700000 59.629637 7.000000 7.800000 60.941798 7.000000 7.900000 62.273959 7.000000 8.000000 63.626120 7.000000 8.100000 64.998281 7.000000 8.200000 66.390442 7.000000 8.300000 67.802603 7.000000 8.400000 69.234764 7.000000 8.500000 70.686925 7.000000 8.600000 72.159086 7.000000 8.700000 73.651247 7.000000 8.800000 75.163408 7.000000 8.900000 76.695569 7.000000 9.000000 78.247730 7.000000 9.100000 79.819891 7.000000 9.200000 81.412052 7.000000 9.300000 83.024213 7.000000 9.400000 84.656374 7.000000 9.500000 86.308535 7.000000 9.600000 87.980696 7.000000 9.700000 89.672857 7.000000 9.800000 91.385018 7.000000 9.900000 93.117179 7.000000 10.000000 94.869340 7.000000 10.100000 96.641501 7.000000 10.200000 98.433662 7.000000 10.300000 100.245823 7.000000 10.400000 102.077984 7.000000 10.500000 103.930145 7.000000 10.600000 105.802306 7.000000 10.700000 107.694467 7.000000 10.800000 109.606628 7.000000 10.900000 111.538789 7.000000 11.000000 113.490950 7.000000 11.100000 115.463111 7.000000 11.200000 117.455272 7.000000 11.300000 119.467433 7.000000 11.400000 121.499595 7.000000 11.500000 123.551756 7.000000 11.600000 125.623917 7.000000 11.700000 127.716078 7.000000 11.800000 129.828239 7.000000 11.900000 131.960400 7.000000 12.000000 134.112561 7.000000 12.100000 136.284722 7.000000 12.200000 138.476883 7.000000 12.300000 140.689044 7.000000 12.400000 142.921205 7.000000 12.500000 145.173366 7.000000 12.600000 147.445527 7.000000 12.700000 149.737688 7.000000 12.800000 152.049849 7.000000 12.900000 154.382010 7.000000 13.000000 156.734171 7.000000 13.100000 159.106332 7.000000 13.200000 161.498493 7.000000 13.300000 163.910654 7.000000 13.400000 166.342815 7.000000 13.500000 168.794976 7.000000 13.600000 171.267137 7.000000 13.700000 173.759298 7.000000 13.800000 176.271459 7.000000 13.900000 178.803620 7.000000 14.000000 181.355781 7.000000 14.100000 183.927942 7.000000 14.200000 186.520103 7.000000 14.300000 189.132264 7.000000 14.400000 191.764425 7.000000 14.500000 194.416586 7.000000 14.600000 197.088747 7.000000 14.700000 199.780908 7.000000 14.800000 202.493069 7.000000 14.900000 205.225230 7.000000 15.000000 207.977391 7.100000 -5.000000 55.164401 7.100000 -4.900000 53.931963 7.100000 -4.800000 52.719525 7.100000 -4.700000 51.527087 7.100000 -4.600000 50.354648 7.100000 -4.500000 49.202210 7.100000 -4.400000 48.069772 7.100000 -4.300000 46.957334 7.100000 -4.200000 45.864896 7.100000 -4.100000 44.792458 7.100000 -4.000000 43.740020 7.100000 -3.900000 42.707582 7.100000 -3.800000 41.695144 7.100000 -3.700000 40.702706 7.100000 -3.600000 39.730268 7.100000 -3.500000 38.777830 7.100000 -3.400000 37.845392 7.100000 -3.300000 36.932954 7.100000 -3.200000 36.040516 7.100000 -3.100000 35.168078 7.100000 -3.000000 34.315640 7.100000 -2.900000 33.483202 7.100000 -2.800000 32.670764 7.100000 -2.700000 31.878326 7.100000 -2.600000 31.105888 7.100000 -2.500000 30.353450 7.100000 -2.400000 29.621012 7.100000 -2.300000 28.908574 7.100000 -2.200000 28.216136 7.100000 -2.100000 27.543698 7.100000 -2.000000 26.891260 7.100000 -1.900000 26.258822 7.100000 -1.800000 25.646384 7.100000 -1.700000 25.053946 7.100000 -1.600000 24.481508 7.100000 -1.500000 23.929070 7.100000 -1.400000 23.396632 7.100000 -1.300000 22.884194 7.100000 -1.200000 22.391756 7.100000 -1.100000 21.919317 7.100000 -1.000000 21.466879 7.100000 -0.900000 21.034441 7.100000 -0.800000 20.622003 7.100000 -0.700000 20.229565 7.100000 -0.600000 19.857127 7.100000 -0.500000 19.504689 7.100000 -0.400000 19.172251 7.100000 -0.300000 18.859813 7.100000 -0.200000 18.567375 7.100000 -0.100000 18.294937 7.100000 -0.000000 18.042499 7.100000 0.100000 17.810061 7.100000 0.200000 17.597623 7.100000 0.300000 17.405185 7.100000 0.400000 17.232747 7.100000 0.500000 17.080309 7.100000 0.600000 16.947871 7.100000 0.700000 16.835433 7.100000 0.800000 16.742995 7.100000 0.900000 16.670557 7.100000 1.000000 16.618119 7.100000 1.100000 16.585681 7.100000 1.200000 16.573243 7.100000 1.300000 16.580805 7.100000 1.400000 16.608367 7.100000 1.500000 16.655929 7.100000 1.600000 16.723491 7.100000 1.700000 16.811053 7.100000 1.800000 16.918615 7.100000 1.900000 17.046177 7.100000 2.000000 17.193739 7.100000 2.100000 17.361301 7.100000 2.200000 17.548863 7.100000 2.300000 17.756424 7.100000 2.400000 17.983986 7.100000 2.500000 18.231548 7.100000 2.600000 18.499110 7.100000 2.700000 18.786672 7.100000 2.800000 19.094234 7.100000 2.900000 19.421796 7.100000 3.000000 19.769358 7.100000 3.100000 20.136920 7.100000 3.200000 20.524482 7.100000 3.300000 20.932044 7.100000 3.400000 21.359606 7.100000 3.500000 21.807168 7.100000 3.600000 22.274730 7.100000 3.700000 22.762292 7.100000 3.800000 23.269854 7.100000 3.900000 23.797416 7.100000 4.000000 24.344978 7.100000 4.100000 24.912540 7.100000 4.200000 25.500102 7.100000 4.300000 26.107664 7.100000 4.400000 26.735226 7.100000 4.500000 27.382788 7.100000 4.600000 28.050350 7.100000 4.700000 28.737912 7.100000 4.800000 29.445474 7.100000 4.900000 30.173036 7.100000 5.000000 30.920598 7.100000 5.100000 31.688160 7.100000 5.200000 32.475722 7.100000 5.300000 33.283284 7.100000 5.400000 34.110846 7.100000 5.500000 34.958408 7.100000 5.600000 35.825970 7.100000 5.700000 36.713531 7.100000 5.800000 37.621093 7.100000 5.900000 38.548655 7.100000 6.000000 39.496217 7.100000 6.100000 40.463779 7.100000 6.200000 41.451341 7.100000 6.300000 42.458903 7.100000 6.400000 43.486465 7.100000 6.500000 44.534027 7.100000 6.600000 45.601589 7.100000 6.700000 46.689151 7.100000 6.800000 47.796713 7.100000 6.900000 48.924275 7.100000 7.000000 50.071837 7.100000 7.100000 51.239399 7.100000 7.200000 52.426961 7.100000 7.300000 53.634523 7.100000 7.400000 54.862085 7.100000 7.500000 56.109647 7.100000 7.600000 57.377209 7.100000 7.700000 58.664771 7.100000 7.800000 59.972333 7.100000 7.900000 61.299895 7.100000 8.000000 62.647457 7.100000 8.100000 64.015019 7.100000 8.200000 65.402581 7.100000 8.300000 66.810143 7.100000 8.400000 68.237705 7.100000 8.500000 69.685267 7.100000 8.600000 71.152829 7.100000 8.700000 72.640391 7.100000 8.800000 74.147953 7.100000 8.900000 75.675515 7.100000 9.000000 77.223077 7.100000 9.100000 78.790638 7.100000 9.200000 80.378200 7.100000 9.300000 81.985762 7.100000 9.400000 83.613324 7.100000 9.500000 85.260886 7.100000 9.600000 86.928448 7.100000 9.700000 88.616010 7.100000 9.800000 90.323572 7.100000 9.900000 92.051134 7.100000 10.000000 93.798696 7.100000 10.100000 95.566258 7.100000 10.200000 97.353820 7.100000 10.300000 99.161382 7.100000 10.400000 100.988944 7.100000 10.500000 102.836506 7.100000 10.600000 104.704068 7.100000 10.700000 106.591630 7.100000 10.800000 108.499192 7.100000 10.900000 110.426754 7.100000 11.000000 112.374316 7.100000 11.100000 114.341878 7.100000 11.200000 116.329440 7.100000 11.300000 118.337002 7.100000 11.400000 120.364564 7.100000 11.500000 122.412126 7.100000 11.600000 124.479688 7.100000 11.700000 126.567250 7.100000 11.800000 128.674812 7.100000 11.900000 130.802374 7.100000 12.000000 132.949936 7.100000 12.100000 135.117498 7.100000 12.200000 137.305060 7.100000 12.300000 139.512622 7.100000 12.400000 141.740184 7.100000 12.500000 143.987745 7.100000 12.600000 146.255307 7.100000 12.700000 148.542869 7.100000 12.800000 150.850431 7.100000 12.900000 153.177993 7.100000 13.000000 155.525555 7.100000 13.100000 157.893117 7.100000 13.200000 160.280679 7.100000 13.300000 162.688241 7.100000 13.400000 165.115803 7.100000 13.500000 167.563365 7.100000 13.600000 170.030927 7.100000 13.700000 172.518489 7.100000 13.800000 175.026051 7.100000 13.900000 177.553613 7.100000 14.000000 180.101175 7.100000 14.100000 182.668737 7.100000 14.200000 185.256299 7.100000 14.300000 187.863861 7.100000 14.400000 190.491423 7.100000 14.500000 193.138985 7.100000 14.600000 195.806547 7.100000 14.700000 198.494109 7.100000 14.800000 201.201671 7.100000 14.900000 203.929233 7.100000 15.000000 206.676795 7.200000 -5.000000 54.751221 7.200000 -4.900000 53.513667 7.200000 -4.800000 52.296113 7.200000 -4.700000 51.098559 7.200000 -4.600000 49.921005 7.200000 -4.500000 48.763452 7.200000 -4.400000 47.625898 7.200000 -4.300000 46.508344 7.200000 -4.200000 45.410790 7.200000 -4.100000 44.333236 7.200000 -4.000000 43.275682 7.200000 -3.900000 42.238129 7.200000 -3.800000 41.220575 7.200000 -3.700000 40.223021 7.200000 -3.600000 39.245467 7.200000 -3.500000 38.287913 7.200000 -3.400000 37.350360 7.200000 -3.300000 36.432806 7.200000 -3.200000 35.535252 7.200000 -3.100000 34.657698 7.200000 -3.000000 33.800144 7.200000 -2.900000 32.962591 7.200000 -2.800000 32.145037 7.200000 -2.700000 31.347483 7.200000 -2.600000 30.569929 7.200000 -2.500000 29.812375 7.200000 -2.400000 29.074822 7.200000 -2.300000 28.357268 7.200000 -2.200000 27.659714 7.200000 -2.100000 26.982160 7.200000 -2.000000 26.324606 7.200000 -1.900000 25.687052 7.200000 -1.800000 25.069499 7.200000 -1.700000 24.471945 7.200000 -1.600000 23.894391 7.200000 -1.500000 23.336837 7.200000 -1.400000 22.799283 7.200000 -1.300000 22.281730 7.200000 -1.200000 21.784176 7.200000 -1.100000 21.306622 7.200000 -1.000000 20.849068 7.200000 -0.900000 20.411514 7.200000 -0.800000 19.993961 7.200000 -0.700000 19.596407 7.200000 -0.600000 19.218853 7.200000 -0.500000 18.861299 7.200000 -0.400000 18.523745 7.200000 -0.300000 18.206192 7.200000 -0.200000 17.908638 7.200000 -0.100000 17.631084 7.200000 -0.000000 17.373530 7.200000 0.100000 17.135976 7.200000 0.200000 16.918422 7.200000 0.300000 16.720869 7.200000 0.400000 16.543315 7.200000 0.500000 16.385761 7.200000 0.600000 16.248207 7.200000 0.700000 16.130653 7.200000 0.800000 16.033100 7.200000 0.900000 15.955546 7.200000 1.000000 15.897992 7.200000 1.100000 15.860438 7.200000 1.200000 15.842884 7.200000 1.300000 15.845331 7.200000 1.400000 15.867777 7.200000 1.500000 15.910223 7.200000 1.600000 15.972669 7.200000 1.700000 16.055115 7.200000 1.800000 16.157561 7.200000 1.900000 16.280008 7.200000 2.000000 16.422454 7.200000 2.100000 16.584900 7.200000 2.200000 16.767346 7.200000 2.300000 16.969792 7.200000 2.400000 17.192239 7.200000 2.500000 17.434685 7.200000 2.600000 17.697131 7.200000 2.700000 17.979577 7.200000 2.800000 18.282023 7.200000 2.900000 18.604470 7.200000 3.000000 18.946916 7.200000 3.100000 19.309362 7.200000 3.200000 19.691808 7.200000 3.300000 20.094254 7.200000 3.400000 20.516701 7.200000 3.500000 20.959147 7.200000 3.600000 21.421593 7.200000 3.700000 21.904039 7.200000 3.800000 22.406485 7.200000 3.900000 22.928931 7.200000 4.000000 23.471378 7.200000 4.100000 24.033824 7.200000 4.200000 24.616270 7.200000 4.300000 25.218716 7.200000 4.400000 25.841162 7.200000 4.500000 26.483609 7.200000 4.600000 27.146055 7.200000 4.700000 27.828501 7.200000 4.800000 28.530947 7.200000 4.900000 29.253393 7.200000 5.000000 29.995840 7.200000 5.100000 30.758286 7.200000 5.200000 31.540732 7.200000 5.300000 32.343178 7.200000 5.400000 33.165624 7.200000 5.500000 34.008071 7.200000 5.600000 34.870517 7.200000 5.700000 35.752963 7.200000 5.800000 36.655409 7.200000 5.900000 37.577855 7.200000 6.000000 38.520301 7.200000 6.100000 39.482748 7.200000 6.200000 40.465194 7.200000 6.300000 41.467640 7.200000 6.400000 42.490086 7.200000 6.500000 43.532532 7.200000 6.600000 44.594979 7.200000 6.700000 45.677425 7.200000 6.800000 46.779871 7.200000 6.900000 47.902317 7.200000 7.000000 49.044763 7.200000 7.100000 50.207210 7.200000 7.200000 51.389656 7.200000 7.300000 52.592102 7.200000 7.400000 53.814548 7.200000 7.500000 55.056994 7.200000 7.600000 56.319440 7.200000 7.700000 57.601887 7.200000 7.800000 58.904333 7.200000 7.900000 60.226779 7.200000 8.000000 61.569225 7.200000 8.100000 62.931671 7.200000 8.200000 64.314118 7.200000 8.300000 65.716564 7.200000 8.400000 67.139010 7.200000 8.500000 68.581456 7.200000 8.600000 70.043902 7.200000 8.700000 71.526349 7.200000 8.800000 73.028795 7.200000 8.900000 74.551241 7.200000 9.000000 76.093687 7.200000 9.100000 77.656133 7.200000 9.200000 79.238580 7.200000 9.300000 80.841026 7.200000 9.400000 82.463472 7.200000 9.500000 84.105918 7.200000 9.600000 85.768364 7.200000 9.700000 87.450810 7.200000 9.800000 89.153257 7.200000 9.900000 90.875703 7.200000 10.000000 92.618149 7.200000 10.100000 94.380595 7.200000 10.200000 96.163041 7.200000 10.300000 97.965488 7.200000 10.400000 99.787934 7.200000 10.500000 101.630380 7.200000 10.600000 103.492826 7.200000 10.700000 105.375272 7.200000 10.800000 107.277719 7.200000 10.900000 109.200165 7.200000 11.000000 111.142611 7.200000 11.100000 113.105057 7.200000 11.200000 115.087503 7.200000 11.300000 117.089950 7.200000 11.400000 119.112396 7.200000 11.500000 121.154842 7.200000 11.600000 123.217288 7.200000 11.700000 125.299734 7.200000 11.800000 127.402180 7.200000 11.900000 129.524627 7.200000 12.000000 131.667073 7.200000 12.100000 133.829519 7.200000 12.200000 136.011965 7.200000 12.300000 138.214411 7.200000 12.400000 140.436858 7.200000 12.500000 142.679304 7.200000 12.600000 144.941750 7.200000 12.700000 147.224196 7.200000 12.800000 149.526642 7.200000 12.900000 151.849089 7.200000 13.000000 154.191535 7.200000 13.100000 156.553981 7.200000 13.200000 158.936427 7.200000 13.300000 161.338873 7.200000 13.400000 163.761319 7.200000 13.500000 166.203766 7.200000 13.600000 168.666212 7.200000 13.700000 171.148658 7.200000 13.800000 173.651104 7.200000 13.900000 176.173550 7.200000 14.000000 178.715997 7.200000 14.100000 181.278443 7.200000 14.200000 183.860889 7.200000 14.300000 186.463335 7.200000 14.400000 189.085781 7.200000 14.500000 191.728228 7.200000 14.600000 194.390674 7.200000 14.700000 197.073120 7.200000 14.800000 199.775566 7.200000 14.900000 202.498012 7.200000 15.000000 205.240459 7.300000 -5.000000 54.313355 7.300000 -4.900000 53.070169 7.300000 -4.800000 51.846982 7.300000 -4.700000 50.643796 7.300000 -4.600000 49.460610 7.300000 -4.500000 48.297423 7.300000 -4.400000 47.154237 7.300000 -4.300000 46.031051 7.300000 -4.200000 44.927864 7.300000 -4.100000 43.844678 7.300000 -4.000000 42.781492 7.300000 -3.900000 41.738305 7.300000 -3.800000 40.715119 7.300000 -3.700000 39.711933 7.300000 -3.600000 38.728746 7.300000 -3.500000 37.765560 7.300000 -3.400000 36.822374 7.300000 -3.300000 35.899187 7.300000 -3.200000 34.996001 7.300000 -3.100000 34.112815 7.300000 -3.000000 33.249628 7.300000 -2.900000 32.406442 7.300000 -2.800000 31.583256 7.300000 -2.700000 30.780069 7.300000 -2.600000 29.996883 7.300000 -2.500000 29.233697 7.300000 -2.400000 28.490510 7.300000 -2.300000 27.767324 7.300000 -2.200000 27.064138 7.300000 -2.100000 26.380951 7.300000 -2.000000 25.717765 7.300000 -1.900000 25.074579 7.300000 -1.800000 24.451392 7.300000 -1.700000 23.848206 7.300000 -1.600000 23.265020 7.300000 -1.500000 22.701833 7.300000 -1.400000 22.158647 7.300000 -1.300000 21.635461 7.300000 -1.200000 21.132274 7.300000 -1.100000 20.649088 7.300000 -1.000000 20.185902 7.300000 -0.900000 19.742715 7.300000 -0.800000 19.319529 7.300000 -0.700000 18.916343 7.300000 -0.600000 18.533156 7.300000 -0.500000 18.169970 7.300000 -0.400000 17.826784 7.300000 -0.300000 17.503598 7.300000 -0.200000 17.200411 7.300000 -0.100000 16.917225 7.300000 -0.000000 16.654039 7.300000 0.100000 16.410852 7.300000 0.200000 16.187666 7.300000 0.300000 15.984480 7.300000 0.400000 15.801293 7.300000 0.500000 15.638107 7.300000 0.600000 15.494921 7.300000 0.700000 15.371734 7.300000 0.800000 15.268548 7.300000 0.900000 15.185362 7.300000 1.000000 15.122175 7.300000 1.100000 15.078989 7.300000 1.200000 15.055803 7.300000 1.300000 15.052616 7.300000 1.400000 15.069430 7.300000 1.500000 15.106244 7.300000 1.600000 15.163057 7.300000 1.700000 15.239871 7.300000 1.800000 15.336685 7.300000 1.900000 15.453498 7.300000 2.000000 15.590312 7.300000 2.100000 15.747126 7.300000 2.200000 15.923939 7.300000 2.300000 16.120753 7.300000 2.400000 16.337567 7.300000 2.500000 16.574380 7.300000 2.600000 16.831194 7.300000 2.700000 17.108008 7.300000 2.800000 17.404821 7.300000 2.900000 17.721635 7.300000 3.000000 18.058449 7.300000 3.100000 18.415262 7.300000 3.200000 18.792076 7.300000 3.300000 19.188890 7.300000 3.400000 19.605703 7.300000 3.500000 20.042517 7.300000 3.600000 20.499331 7.300000 3.700000 20.976144 7.300000 3.800000 21.472958 7.300000 3.900000 21.989772 7.300000 4.000000 22.526585 7.300000 4.100000 23.083399 7.300000 4.200000 23.660213 7.300000 4.300000 24.257026 7.300000 4.400000 24.873840 7.300000 4.500000 25.510654 7.300000 4.600000 26.167467 7.300000 4.700000 26.844281 7.300000 4.800000 27.541095 7.300000 4.900000 28.257908 7.300000 5.000000 28.994722 7.300000 5.100000 29.751536 7.300000 5.200000 30.528349 7.300000 5.300000 31.325163 7.300000 5.400000 32.141977 7.300000 5.500000 32.978790 7.300000 5.600000 33.835604 7.300000 5.700000 34.712418 7.300000 5.800000 35.609231 7.300000 5.900000 36.526045 7.300000 6.000000 37.462859 7.300000 6.100000 38.419672 7.300000 6.200000 39.396486 7.300000 6.300000 40.393300 7.300000 6.400000 41.410113 7.300000 6.500000 42.446927 7.300000 6.600000 43.503741 7.300000 6.700000 44.580554 7.300000 6.800000 45.677368 7.300000 6.900000 46.794182 7.300000 7.000000 47.930995 7.300000 7.100000 49.087809 7.300000 7.200000 50.264623 7.300000 7.300000 51.461436 7.300000 7.400000 52.678250 7.300000 7.500000 53.915064 7.300000 7.600000 55.171877 7.300000 7.700000 56.448691 7.300000 7.800000 57.745505 7.300000 7.900000 59.062318 7.300000 8.000000 60.399132 7.300000 8.100000 61.755946 7.300000 8.200000 63.132760 7.300000 8.300000 64.529573 7.300000 8.400000 65.946387 7.300000 8.500000 67.383201 7.300000 8.600000 68.840014 7.300000 8.700000 70.316828 7.300000 8.800000 71.813642 7.300000 8.900000 73.330455 7.300000 9.000000 74.867269 7.300000 9.100000 76.424083 7.300000 9.200000 78.000896 7.300000 9.300000 79.597710 7.300000 9.400000 81.214524 7.300000 9.500000 82.851337 7.300000 9.600000 84.508151 7.300000 9.700000 86.184965 7.300000 9.800000 87.881778 7.300000 9.900000 89.598592 7.300000 10.000000 91.335406 7.300000 10.100000 93.092219 7.300000 10.200000 94.869033 7.300000 10.300000 96.665847 7.300000 10.400000 98.482660 7.300000 10.500000 100.319474 7.300000 10.600000 102.176288 7.300000 10.700000 104.053101 7.300000 10.800000 105.949915 7.300000 10.900000 107.866729 7.300000 11.000000 109.803542 7.300000 11.100000 111.760356 7.300000 11.200000 113.737170 7.300000 11.300000 115.733983 7.300000 11.400000 117.750797 7.300000 11.500000 119.787611 7.300000 11.600000 121.844424 7.300000 11.700000 123.921238 7.300000 11.800000 126.018052 7.300000 11.900000 128.134865 7.300000 12.000000 130.271679 7.300000 12.100000 132.428493 7.300000 12.200000 134.605306 7.300000 12.300000 136.802120 7.300000 12.400000 139.018934 7.300000 12.500000 141.255747 7.300000 12.600000 143.512561 7.300000 12.700000 145.789375 7.300000 12.800000 148.086188 7.300000 12.900000 150.403002 7.300000 13.000000 152.739816 7.300000 13.100000 155.096629 7.300000 13.200000 157.473443 7.300000 13.300000 159.870257 7.300000 13.400000 162.287070 7.300000 13.500000 164.723884 7.300000 13.600000 167.180698 7.300000 13.700000 169.657511 7.300000 13.800000 172.154325 7.300000 13.900000 174.671139 7.300000 14.000000 177.207952 7.300000 14.100000 179.764766 7.300000 14.200000 182.341580 7.300000 14.300000 184.938393 7.300000 14.400000 187.555207 7.300000 14.500000 190.192021 7.300000 14.600000 192.848834 7.300000 14.700000 195.525648 7.300000 14.800000 198.222462 7.300000 14.900000 200.939275 7.300000 15.000000 203.676089 7.400000 -5.000000 53.859134 7.400000 -4.900000 52.609798 7.400000 -4.800000 51.380463 7.400000 -4.700000 50.171127 7.400000 -4.600000 48.981791 7.400000 -4.500000 47.812456 7.400000 -4.400000 46.663120 7.400000 -4.300000 45.533785 7.400000 -4.200000 44.424449 7.400000 -4.100000 43.335114 7.400000 -4.000000 42.265778 7.400000 -3.900000 41.216442 7.400000 -3.800000 40.187107 7.400000 -3.700000 39.177771 7.400000 -3.600000 38.188436 7.400000 -3.500000 37.219100 7.400000 -3.400000 36.269764 7.400000 -3.300000 35.340429 7.400000 -3.200000 34.431093 7.400000 -3.100000 33.541758 7.400000 -3.000000 32.672422 7.400000 -2.900000 31.823087 7.400000 -2.800000 30.993751 7.400000 -2.700000 30.184415 7.400000 -2.600000 29.395080 7.400000 -2.500000 28.625744 7.400000 -2.400000 27.876409 7.400000 -2.300000 27.147073 7.400000 -2.200000 26.437737 7.400000 -2.100000 25.748402 7.400000 -2.000000 25.079066 7.400000 -1.900000 24.429731 7.400000 -1.800000 23.800395 7.400000 -1.700000 23.191059 7.400000 -1.600000 22.601724 7.400000 -1.500000 22.032388 7.400000 -1.400000 21.483053 7.400000 -1.300000 20.953717 7.400000 -1.200000 20.444382 7.400000 -1.100000 19.955046 7.400000 -1.000000 19.485710 7.400000 -0.900000 19.036375 7.400000 -0.800000 18.607039 7.400000 -0.700000 18.197704 7.400000 -0.600000 17.808368 7.400000 -0.500000 17.439032 7.400000 -0.400000 17.089697 7.400000 -0.300000 16.760361 7.400000 -0.200000 16.451026 7.400000 -0.100000 16.161690 7.400000 -0.000000 15.892354 7.400000 0.100000 15.643019 7.400000 0.200000 15.413683 7.400000 0.300000 15.204348 7.400000 0.400000 15.015012 7.400000 0.500000 14.845677 7.400000 0.600000 14.696341 7.400000 0.700000 14.567005 7.400000 0.800000 14.457670 7.400000 0.900000 14.368334 7.400000 1.000000 14.298999 7.400000 1.100000 14.249663 7.400000 1.200000 14.220327 7.400000 1.300000 14.210992 7.400000 1.400000 14.221656 7.400000 1.500000 14.252321 7.400000 1.600000 14.302985 7.400000 1.700000 14.373650 7.400000 1.800000 14.464314 7.400000 1.900000 14.574978 7.400000 2.000000 14.705643 7.400000 2.100000 14.856307 7.400000 2.200000 15.026972 7.400000 2.300000 15.217636 7.400000 2.400000 15.428300 7.400000 2.500000 15.658965 7.400000 2.600000 15.909629 7.400000 2.700000 16.180294 7.400000 2.800000 16.470958 7.400000 2.900000 16.781622 7.400000 3.000000 17.112287 7.400000 3.100000 17.462951 7.400000 3.200000 17.833616 7.400000 3.300000 18.224280 7.400000 3.400000 18.634945 7.400000 3.500000 19.065609 7.400000 3.600000 19.516273 7.400000 3.700000 19.986938 7.400000 3.800000 20.477602 7.400000 3.900000 20.988267 7.400000 4.000000 21.518931 7.400000 4.100000 22.069595 7.400000 4.200000 22.640260 7.400000 4.300000 23.230924 7.400000 4.400000 23.841589 7.400000 4.500000 24.472253 7.400000 4.600000 25.122918 7.400000 4.700000 25.793582 7.400000 4.800000 26.484246 7.400000 4.900000 27.194911 7.400000 5.000000 27.925575 7.400000 5.100000 28.676240 7.400000 5.200000 29.446904 7.400000 5.300000 30.237568 7.400000 5.400000 31.048233 7.400000 5.500000 31.878897 7.400000 5.600000 32.729562 7.400000 5.700000 33.600226 7.400000 5.800000 34.490890 7.400000 5.900000 35.401555 7.400000 6.000000 36.332219 7.400000 6.100000 37.282884 7.400000 6.200000 38.253548 7.400000 6.300000 39.244213 7.400000 6.400000 40.254877 7.400000 6.500000 41.285541 7.400000 6.600000 42.336206 7.400000 6.700000 43.406870 7.400000 6.800000 44.497535 7.400000 6.900000 45.608199 7.400000 7.000000 46.738863 7.400000 7.100000 47.889528 7.400000 7.200000 49.060192 7.400000 7.300000 50.250857 7.400000 7.400000 51.461521 7.400000 7.500000 52.692186 7.400000 7.600000 53.942850 7.400000 7.700000 55.213514 7.400000 7.800000 56.504179 7.400000 7.900000 57.814843 7.400000 8.000000 59.145508 7.400000 8.100000 60.496172 7.400000 8.200000 61.866836 7.400000 8.300000 63.257501 7.400000 8.400000 64.668165 7.400000 8.500000 66.098830 7.400000 8.600000 67.549494 7.400000 8.700000 69.020158 7.400000 8.800000 70.510823 7.400000 8.900000 72.021487 7.400000 9.000000 73.552152 7.400000 9.100000 75.102816 7.400000 9.200000 76.673481 7.400000 9.300000 78.264145 7.400000 9.400000 79.874809 7.400000 9.500000 81.505474 7.400000 9.600000 83.156138 7.400000 9.700000 84.826803 7.400000 9.800000 86.517467 7.400000 9.900000 88.228131 7.400000 10.000000 89.958796 7.400000 10.100000 91.709460 7.400000 10.200000 93.480125 7.400000 10.300000 95.270789 7.400000 10.400000 97.081454 7.400000 10.500000 98.912118 7.400000 10.600000 100.762782 7.400000 10.700000 102.633447 7.400000 10.800000 104.524111 7.400000 10.900000 106.434776 7.400000 11.000000 108.365440 7.400000 11.100000 110.316104 7.400000 11.200000 112.286769 7.400000 11.300000 114.277433 7.400000 11.400000 116.288098 7.400000 11.500000 118.318762 7.400000 11.600000 120.369426 7.400000 11.700000 122.440091 7.400000 11.800000 124.530755 7.400000 11.900000 126.641420 7.400000 12.000000 128.772084 7.400000 12.100000 130.922749 7.400000 12.200000 133.093413 7.400000 12.300000 135.284077 7.400000 12.400000 137.494742 7.400000 12.500000 139.725406 7.400000 12.600000 141.976071 7.400000 12.700000 144.246735 7.400000 12.800000 146.537399 7.400000 12.900000 148.848064 7.400000 13.000000 151.178728 7.400000 13.100000 153.529393 7.400000 13.200000 155.900057 7.400000 13.300000 158.290722 7.400000 13.400000 160.701386 7.400000 13.500000 163.132050 7.400000 13.600000 165.582715 7.400000 13.700000 168.053379 7.400000 13.800000 170.544044 7.400000 13.900000 173.054708 7.400000 14.000000 175.585372 7.400000 14.100000 178.136037 7.400000 14.200000 180.706701 7.400000 14.300000 183.297366 7.400000 14.400000 185.908030 7.400000 14.500000 188.538694 7.400000 14.600000 191.189359 7.400000 14.700000 193.860023 7.400000 14.800000 196.550688 7.400000 14.900000 199.261352 7.400000 15.000000 201.992017 7.500000 -5.000000 53.397431 7.500000 -4.900000 52.141430 7.500000 -4.800000 50.905428 7.500000 -4.700000 49.689427 7.500000 -4.600000 48.493425 7.500000 -4.500000 47.317424 7.500000 -4.400000 46.161422 7.500000 -4.300000 45.025420 7.500000 -4.200000 43.909419 7.500000 -4.100000 42.813417 7.500000 -4.000000 41.737416 7.500000 -3.900000 40.681414 7.500000 -3.800000 39.645412 7.500000 -3.700000 38.629411 7.500000 -3.600000 37.633409 7.500000 -3.500000 36.657408 7.500000 -3.400000 35.701406 7.500000 -3.300000 34.765405 7.500000 -3.200000 33.849403 7.500000 -3.100000 32.953401 7.500000 -3.000000 32.077400 7.500000 -2.900000 31.221398 7.500000 -2.800000 30.385397 7.500000 -2.700000 29.569395 7.500000 -2.600000 28.773394 7.500000 -2.500000 27.997392 7.500000 -2.400000 27.241390 7.500000 -2.300000 26.505389 7.500000 -2.200000 25.789387 7.500000 -2.100000 25.093386 7.500000 -2.000000 24.417384 7.500000 -1.900000 23.761382 7.500000 -1.800000 23.125381 7.500000 -1.700000 22.509379 7.500000 -1.600000 21.913378 7.500000 -1.500000 21.337376 7.500000 -1.400000 20.781375 7.500000 -1.300000 20.245373 7.500000 -1.200000 19.729371 7.500000 -1.100000 19.233370 7.500000 -1.000000 18.757368 7.500000 -0.900000 18.301367 7.500000 -0.800000 17.865365 7.500000 -0.700000 17.449363 7.500000 -0.600000 17.053362 7.500000 -0.500000 16.677360 7.500000 -0.400000 16.321359 7.500000 -0.300000 15.985357 7.500000 -0.200000 15.669356 7.500000 -0.100000 15.373354 7.500000 -0.000000 15.097352 7.500000 0.100000 14.841351 7.500000 0.200000 14.605349 7.500000 0.300000 14.389348 7.500000 0.400000 14.193346 7.500000 0.500000 14.017344 7.500000 0.600000 13.861343 7.500000 0.700000 13.725341 7.500000 0.800000 13.609340 7.500000 0.900000 13.513338 7.500000 1.000000 13.437337 7.500000 1.100000 13.381335 7.500000 1.200000 13.345333 7.500000 1.300000 13.329332 7.500000 1.400000 13.333330 7.500000 1.500000 13.357329 7.500000 1.600000 13.401327 7.500000 1.700000 13.465326 7.500000 1.800000 13.549324 7.500000 1.900000 13.653322 7.500000 2.000000 13.777321 7.500000 2.100000 13.921319 7.500000 2.200000 14.085318 7.500000 2.300000 14.269316 7.500000 2.400000 14.473314 7.500000 2.500000 14.697313 7.500000 2.600000 14.941311 7.500000 2.700000 15.205310 7.500000 2.800000 15.489308 7.500000 2.900000 15.793307 7.500000 3.000000 16.117305 7.500000 3.100000 16.461303 7.500000 3.200000 16.825302 7.500000 3.300000 17.209300 7.500000 3.400000 17.613299 7.500000 3.500000 18.037297 7.500000 3.600000 18.481295 7.500000 3.700000 18.945294 7.500000 3.800000 19.429292 7.500000 3.900000 19.933291 7.500000 4.000000 20.457289 7.500000 4.100000 21.001288 7.500000 4.200000 21.565286 7.500000 4.300000 22.149284 7.500000 4.400000 22.753283 7.500000 4.500000 23.377281 7.500000 4.600000 24.021280 7.500000 4.700000 24.685278 7.500000 4.800000 25.369276 7.500000 4.900000 26.073275 7.500000 5.000000 26.797273 7.500000 5.100000 27.541272 7.500000 5.200000 28.305270 7.500000 5.300000 29.089269 7.500000 5.400000 29.893267 7.500000 5.500000 30.717265 7.500000 5.600000 31.561264 7.500000 5.700000 32.425262 7.500000 5.800000 33.309261 7.500000 5.900000 34.213259 7.500000 6.000000 35.137258 7.500000 6.100000 36.081256 7.500000 6.200000 37.045254 7.500000 6.300000 38.029253 7.500000 6.400000 39.033251 7.500000 6.500000 40.057250 7.500000 6.600000 41.101248 7.500000 6.700000 42.165246 7.500000 6.800000 43.249245 7.500000 6.900000 44.353243 7.500000 7.000000 45.477242 7.500000 7.100000 46.621240 7.500000 7.200000 47.785239 7.500000 7.300000 48.969237 7.500000 7.400000 50.173235 7.500000 7.500000 51.397234 7.500000 7.600000 52.641232 7.500000 7.700000 53.905231 7.500000 7.800000 55.189229 7.500000 7.900000 56.493227 7.500000 8.000000 57.817226 7.500000 8.100000 59.161224 7.500000 8.200000 60.525223 7.500000 8.300000 61.909221 7.500000 8.400000 63.313220 7.500000 8.500000 64.737218 7.500000 8.600000 66.181216 7.500000 8.700000 67.645215 7.500000 8.800000 69.129213 7.500000 8.900000 70.633212 7.500000 9.000000 72.157210 7.500000 9.100000 73.701208 7.500000 9.200000 75.265207 7.500000 9.300000 76.849205 7.500000 9.400000 78.453204 7.500000 9.500000 80.077202 7.500000 9.600000 81.721201 7.500000 9.700000 83.385199 7.500000 9.800000 85.069197 7.500000 9.900000 86.773196 7.500000 10.000000 88.497194 7.500000 10.100000 90.241193 7.500000 10.200000 92.005191 7.500000 10.300000 93.789190 7.500000 10.400000 95.593188 7.500000 10.500000 97.417186 7.500000 10.600000 99.261185 7.500000 10.700000 101.125183 7.500000 10.800000 103.009182 7.500000 10.900000 104.913180 7.500000 11.000000 106.837178 7.500000 11.100000 108.781177 7.500000 11.200000 110.745175 7.500000 11.300000 112.729174 7.500000 11.400000 114.733172 7.500000 11.500000 116.757171 7.500000 11.600000 118.801169 7.500000 11.700000 120.865167 7.500000 11.800000 122.949166 7.500000 11.900000 125.053164 7.500000 12.000000 127.177163 7.500000 12.100000 129.321161 7.500000 12.200000 131.485159 7.500000 12.300000 133.669158 7.500000 12.400000 135.873156 7.500000 12.500000 138.097155 7.500000 12.600000 140.341153 7.500000 12.700000 142.605152 7.500000 12.800000 144.889150 7.500000 12.900000 147.193148 7.500000 13.000000 149.517147 7.500000 13.100000 151.861145 7.500000 13.200000 154.225144 7.500000 13.300000 156.609142 7.500000 13.400000 159.013140 7.500000 13.500000 161.437139 7.500000 13.600000 163.881137 7.500000 13.700000 166.345136 7.500000 13.800000 168.829134 7.500000 13.900000 171.333133 7.500000 14.000000 173.857131 7.500000 14.100000 176.401129 7.500000 14.200000 178.965128 7.500000 14.300000 181.549126 7.500000 14.400000 184.153125 7.500000 14.500000 186.777123 7.500000 14.600000 189.421122 7.500000 14.700000 192.085120 7.500000 14.800000 194.769118 7.500000 14.900000 197.473117 7.500000 15.000000 200.197115 7.600000 -5.000000 52.937583 7.600000 -4.900000 51.674398 7.600000 -4.800000 50.431214 7.600000 -4.700000 49.208030 7.600000 -4.600000 48.004846 7.600000 -4.500000 46.821661 7.600000 -4.400000 45.658477 7.600000 -4.300000 44.515293 7.600000 -4.200000 43.392108 7.600000 -4.100000 42.288924 7.600000 -4.000000 41.205740 7.600000 -3.900000 40.142555 7.600000 -3.800000 39.099371 7.600000 -3.700000 38.076187 7.600000 -3.600000 37.073002 7.600000 -3.500000 36.089818 7.600000 -3.400000 35.126634 7.600000 -3.300000 34.183449 7.600000 -3.200000 33.260265 7.600000 -3.100000 32.357081 7.600000 -3.000000 31.473896 7.600000 -2.900000 30.610712 7.600000 -2.800000 29.767528 7.600000 -2.700000 28.944344 7.600000 -2.600000 28.141159 7.600000 -2.500000 27.357975 7.600000 -2.400000 26.594791 7.600000 -2.300000 25.851606 7.600000 -2.200000 25.128422 7.600000 -2.100000 24.425238 7.600000 -2.000000 23.742053 7.600000 -1.900000 23.078869 7.600000 -1.800000 22.435685 7.600000 -1.700000 21.812500 7.600000 -1.600000 21.209316 7.600000 -1.500000 20.626132 7.600000 -1.400000 20.062947 7.600000 -1.300000 19.519763 7.600000 -1.200000 18.996579 7.600000 -1.100000 18.493395 7.600000 -1.000000 18.010210 7.600000 -0.900000 17.547026 7.600000 -0.800000 17.103842 7.600000 -0.700000 16.680657 7.600000 -0.600000 16.277473 7.600000 -0.500000 15.894289 7.600000 -0.400000 15.531104 7.600000 -0.300000 15.187920 7.600000 -0.200000 14.864736 7.600000 -0.100000 14.561551 7.600000 -0.000000 14.278367 7.600000 0.100000 14.015183 7.600000 0.200000 13.771998 7.600000 0.300000 13.548814 7.600000 0.400000 13.345630 7.600000 0.500000 13.162445 7.600000 0.600000 12.999261 7.600000 0.700000 12.856077 7.600000 0.800000 12.732893 7.600000 0.900000 12.629708 7.600000 1.000000 12.546524 7.600000 1.100000 12.483340 7.600000 1.200000 12.440155 7.600000 1.300000 12.416971 7.600000 1.400000 12.413787 7.600000 1.500000 12.430602 7.600000 1.600000 12.467418 7.600000 1.700000 12.524234 7.600000 1.800000 12.601049 7.600000 1.900000 12.697865 7.600000 2.000000 12.814681 7.600000 2.100000 12.951496 7.600000 2.200000 13.108312 7.600000 2.300000 13.285128 7.600000 2.400000 13.481944 7.600000 2.500000 13.698759 7.600000 2.600000 13.935575 7.600000 2.700000 14.192391 7.600000 2.800000 14.469206 7.600000 2.900000 14.766022 7.600000 3.000000 15.082838 7.600000 3.100000 15.419653 7.600000 3.200000 15.776469 7.600000 3.300000 16.153285 7.600000 3.400000 16.550100 7.600000 3.500000 16.966916 7.600000 3.600000 17.403732 7.600000 3.700000 17.860547 7.600000 3.800000 18.337363 7.600000 3.900000 18.834179 7.600000 4.000000 19.350994 7.600000 4.100000 19.887810 7.600000 4.200000 20.444626 7.600000 4.300000 21.021442 7.600000 4.400000 21.618257 7.600000 4.500000 22.235073 7.600000 4.600000 22.871889 7.600000 4.700000 23.528704 7.600000 4.800000 24.205520 7.600000 4.900000 24.902336 7.600000 5.000000 25.619151 7.600000 5.100000 26.355967 7.600000 5.200000 27.112783 7.600000 5.300000 27.889598 7.600000 5.400000 28.686414 7.600000 5.500000 29.503230 7.600000 5.600000 30.340045 7.600000 5.700000 31.196861 7.600000 5.800000 32.073677 7.600000 5.900000 32.970492 7.600000 6.000000 33.887308 7.600000 6.100000 34.824124 7.600000 6.200000 35.780940 7.600000 6.300000 36.757755 7.600000 6.400000 37.754571 7.600000 6.500000 38.771387 7.600000 6.600000 39.808202 7.600000 6.700000 40.865018 7.600000 6.800000 41.941834 7.600000 6.900000 43.038649 7.600000 7.000000 44.155465 7.600000 7.100000 45.292281 7.600000 7.200000 46.449096 7.600000 7.300000 47.625912 7.600000 7.400000 48.822728 7.600000 7.500000 50.039543 7.600000 7.600000 51.276359 7.600000 7.700000 52.533175 7.600000 7.800000 53.809991 7.600000 7.900000 55.106806 7.600000 8.000000 56.423622 7.600000 8.100000 57.760438 7.600000 8.200000 59.117253 7.600000 8.300000 60.494069 7.600000 8.400000 61.890885 7.600000 8.500000 63.307700 7.600000 8.600000 64.744516 7.600000 8.700000 66.201332 7.600000 8.800000 67.678147 7.600000 8.900000 69.174963 7.600000 9.000000 70.691779 7.600000 9.100000 72.228594 7.600000 9.200000 73.785410 7.600000 9.300000 75.362226 7.600000 9.400000 76.959041 7.600000 9.500000 78.575857 7.600000 9.600000 80.212673 7.600000 9.700000 81.869489 7.600000 9.800000 83.546304 7.600000 9.900000 85.243120 7.600000 10.000000 86.959936 7.600000 10.100000 88.696751 7.600000 10.200000 90.453567 7.600000 10.300000 92.230383 7.600000 10.400000 94.027198 7.600000 10.500000 95.844014 7.600000 10.600000 97.680830 7.600000 10.700000 99.537645 7.600000 10.800000 101.414461 7.600000 10.900000 103.311277 7.600000 11.000000 105.228092 7.600000 11.100000 107.164908 7.600000 11.200000 109.121724 7.600000 11.300000 111.098540 7.600000 11.400000 113.095355 7.600000 11.500000 115.112171 7.600000 11.600000 117.148987 7.600000 11.700000 119.205802 7.600000 11.800000 121.282618 7.600000 11.900000 123.379434 7.600000 12.000000 125.496249 7.600000 12.100000 127.633065 7.600000 12.200000 129.789881 7.600000 12.300000 131.966696 7.600000 12.400000 134.163512 7.600000 12.500000 136.380328 7.600000 12.600000 138.617143 7.600000 12.700000 140.873959 7.600000 12.800000 143.150775 7.600000 12.900000 145.447590 7.600000 13.000000 147.764406 7.600000 13.100000 150.101222 7.600000 13.200000 152.458038 7.600000 13.300000 154.834853 7.600000 13.400000 157.231669 7.600000 13.500000 159.648485 7.600000 13.600000 162.085300 7.600000 13.700000 164.542116 7.600000 13.800000 167.018932 7.600000 13.900000 169.515747 7.600000 14.000000 172.032563 7.600000 14.100000 174.569379 7.600000 14.200000 177.126194 7.600000 14.300000 179.703010 7.600000 14.400000 182.299826 7.600000 14.500000 184.916641 7.600000 14.600000 187.553457 7.600000 14.700000 190.210273 7.600000 14.800000 192.887088 7.600000 14.900000 195.583904 7.600000 15.000000 198.300720 7.700000 -5.000000 52.489295 7.700000 -4.900000 51.218411 7.700000 -4.800000 49.967527 7.700000 -4.700000 48.736644 7.700000 -4.600000 47.525760 7.700000 -4.500000 46.334876 7.700000 -4.400000 45.163992 7.700000 -4.300000 44.013108 7.700000 -4.200000 42.882225 7.700000 -4.100000 41.771341 7.700000 -4.000000 40.680457 7.700000 -3.900000 39.609573 7.700000 -3.800000 38.558689 7.700000 -3.700000 37.527806 7.700000 -3.600000 36.516922 7.700000 -3.500000 35.526038 7.700000 -3.400000 34.555154 7.700000 -3.300000 33.604271 7.700000 -3.200000 32.673387 7.700000 -3.100000 31.762503 7.700000 -3.000000 30.871619 7.700000 -2.900000 30.000735 7.700000 -2.800000 29.149852 7.700000 -2.700000 28.318968 7.700000 -2.600000 27.508084 7.700000 -2.500000 26.717200 7.700000 -2.400000 25.946316 7.700000 -2.300000 25.195433 7.700000 -2.200000 24.464549 7.700000 -2.100000 23.753665 7.700000 -2.000000 23.062781 7.700000 -1.900000 22.391898 7.700000 -1.800000 21.741014 7.700000 -1.700000 21.110130 7.700000 -1.600000 20.499246 7.700000 -1.500000 19.908362 7.700000 -1.400000 19.337479 7.700000 -1.300000 18.786595 7.700000 -1.200000 18.255711 7.700000 -1.100000 17.744827 7.700000 -1.000000 17.253943 7.700000 -0.900000 16.783060 7.700000 -0.800000 16.332176 7.700000 -0.700000 15.901292 7.700000 -0.600000 15.490408 7.700000 -0.500000 15.099525 7.700000 -0.400000 14.728641 7.700000 -0.300000 14.377757 7.700000 -0.200000 14.046873 7.700000 -0.100000 13.735989 7.700000 -0.000000 13.445106 7.700000 0.100000 13.174222 7.700000 0.200000 12.923338 7.700000 0.300000 12.692454 7.700000 0.400000 12.481570 7.700000 0.500000 12.290687 7.700000 0.600000 12.119803 7.700000 0.700000 11.968919 7.700000 0.800000 11.838035 7.700000 0.900000 11.727152 7.700000 1.000000 11.636268 7.700000 1.100000 11.565384 7.700000 1.200000 11.514500 7.700000 1.300000 11.483616 7.700000 1.400000 11.472733 7.700000 1.500000 11.481849 7.700000 1.600000 11.510965 7.700000 1.700000 11.560081 7.700000 1.800000 11.629197 7.700000 1.900000 11.718314 7.700000 2.000000 11.827430 7.700000 2.100000 11.956546 7.700000 2.200000 12.105662 7.700000 2.300000 12.274779 7.700000 2.400000 12.463895 7.700000 2.500000 12.673011 7.700000 2.600000 12.902127 7.700000 2.700000 13.151243 7.700000 2.800000 13.420360 7.700000 2.900000 13.709476 7.700000 3.000000 14.018592 7.700000 3.100000 14.347708 7.700000 3.200000 14.696824 7.700000 3.300000 15.065941 7.700000 3.400000 15.455057 7.700000 3.500000 15.864173 7.700000 3.600000 16.293289 7.700000 3.700000 16.742406 7.700000 3.800000 17.211522 7.700000 3.900000 17.700638 7.700000 4.000000 18.209754 7.700000 4.100000 18.738870 7.700000 4.200000 19.287987 7.700000 4.300000 19.857103 7.700000 4.400000 20.446219 7.700000 4.500000 21.055335 7.700000 4.600000 21.684451 7.700000 4.700000 22.333568 7.700000 4.800000 23.002684 7.700000 4.900000 23.691800 7.700000 5.000000 24.400916 7.700000 5.100000 25.130033 7.700000 5.200000 25.879149 7.700000 5.300000 26.648265 7.700000 5.400000 27.437381 7.700000 5.500000 28.246497 7.700000 5.600000 29.075614 7.700000 5.700000 29.924730 7.700000 5.800000 30.793846 7.700000 5.900000 31.682962 7.700000 6.000000 32.592078 7.700000 6.100000 33.521195 7.700000 6.200000 34.470311 7.700000 6.300000 35.439427 7.700000 6.400000 36.428543 7.700000 6.500000 37.437660 7.700000 6.600000 38.466776 7.700000 6.700000 39.515892 7.700000 6.800000 40.585008 7.700000 6.900000 41.674124 7.700000 7.000000 42.783241 7.700000 7.100000 43.912357 7.700000 7.200000 45.061473 7.700000 7.300000 46.230589 7.700000 7.400000 47.419705 7.700000 7.500000 48.628822 7.700000 7.600000 49.857938 7.700000 7.700000 51.107054 7.700000 7.800000 52.376170 7.700000 7.900000 53.665287 7.700000 8.000000 54.974403 7.700000 8.100000 56.303519 7.700000 8.200000 57.652635 7.700000 8.300000 59.021751 7.700000 8.400000 60.410868 7.700000 8.500000 61.819984 7.700000 8.600000 63.249100 7.700000 8.700000 64.698216 7.700000 8.800000 66.167332 7.700000 8.900000 67.656449 7.700000 9.000000 69.165565 7.700000 9.100000 70.694681 7.700000 9.200000 72.243797 7.700000 9.300000 73.812914 7.700000 9.400000 75.402030 7.700000 9.500000 77.011146 7.700000 9.600000 78.640262 7.700000 9.700000 80.289378 7.700000 9.800000 81.958495 7.700000 9.900000 83.647611 7.700000 10.000000 85.356727 7.700000 10.100000 87.085843 7.700000 10.200000 88.834959 7.700000 10.300000 90.604076 7.700000 10.400000 92.393192 7.700000 10.500000 94.202308 7.700000 10.600000 96.031424 7.700000 10.700000 97.880541 7.700000 10.800000 99.749657 7.700000 10.900000 101.638773 7.700000 11.000000 103.547889 7.700000 11.100000 105.477005 7.700000 11.200000 107.426122 7.700000 11.300000 109.395238 7.700000 11.400000 111.384354 7.700000 11.500000 113.393470 7.700000 11.600000 115.422586 7.700000 11.700000 117.471703 7.700000 11.800000 119.540819 7.700000 11.900000 121.629935 7.700000 12.000000 123.739051 7.700000 12.100000 125.868168 7.700000 12.200000 128.017284 7.700000 12.300000 130.186400 7.700000 12.400000 132.375516 7.700000 12.500000 134.584632 7.700000 12.600000 136.813749 7.700000 12.700000 139.062865 7.700000 12.800000 141.331981 7.700000 12.900000 143.621097 7.700000 13.000000 145.930213 7.700000 13.100000 148.259330 7.700000 13.200000 150.608446 7.700000 13.300000 152.977562 7.700000 13.400000 155.366678 7.700000 13.500000 157.775795 7.700000 13.600000 160.204911 7.700000 13.700000 162.654027 7.700000 13.800000 165.123143 7.700000 13.900000 167.612259 7.700000 14.000000 170.121376 7.700000 14.100000 172.650492 7.700000 14.200000 175.199608 7.700000 14.300000 177.768724 7.700000 14.400000 180.357840 7.700000 14.500000 182.966957 7.700000 14.600000 185.596073 7.700000 14.700000 188.245189 7.700000 14.800000 190.914305 7.700000 14.900000 193.603422 7.700000 15.000000 196.312538 7.800000 -5.000000 52.062556 7.800000 -4.900000 50.783456 7.800000 -4.800000 49.524356 7.800000 -4.700000 48.285256 7.800000 -4.600000 47.066156 7.800000 -4.500000 45.867056 7.800000 -4.400000 44.687956 7.800000 -4.300000 43.528856 7.800000 -4.200000 42.389756 7.800000 -4.100000 41.270656 7.800000 -4.000000 40.171556 7.800000 -3.900000 39.092456 7.800000 -3.800000 38.033356 7.800000 -3.700000 36.994256 7.800000 -3.600000 35.975156 7.800000 -3.500000 34.976056 7.800000 -3.400000 33.996956 7.800000 -3.300000 33.037856 7.800000 -3.200000 32.098756 7.800000 -3.100000 31.179656 7.800000 -3.000000 30.280556 7.800000 -2.900000 29.401456 7.800000 -2.800000 28.542356 7.800000 -2.700000 27.703256 7.800000 -2.600000 26.884156 7.800000 -2.500000 26.085056 7.800000 -2.400000 25.305956 7.800000 -2.300000 24.546856 7.800000 -2.200000 23.807756 7.800000 -2.100000 23.088656 7.800000 -2.000000 22.389556 7.800000 -1.900000 21.710456 7.800000 -1.800000 21.051356 7.800000 -1.700000 20.412256 7.800000 -1.600000 19.793156 7.800000 -1.500000 19.194056 7.800000 -1.400000 18.614956 7.800000 -1.300000 18.055856 7.800000 -1.200000 17.516756 7.800000 -1.100000 16.997656 7.800000 -1.000000 16.498556 7.800000 -0.900000 16.019456 7.800000 -0.800000 15.560356 7.800000 -0.700000 15.121256 7.800000 -0.600000 14.702156 7.800000 -0.500000 14.303056 7.800000 -0.400000 13.923956 7.800000 -0.300000 13.564856 7.800000 -0.200000 13.225756 7.800000 -0.100000 12.906656 7.800000 -0.000000 12.607556 7.800000 0.100000 12.328456 7.800000 0.200000 12.069356 7.800000 0.300000 11.830256 7.800000 0.400000 11.611156 7.800000 0.500000 11.412056 7.800000 0.600000 11.232956 7.800000 0.700000 11.073856 7.800000 0.800000 10.934756 7.800000 0.900000 10.815656 7.800000 1.000000 10.716556 7.800000 1.100000 10.637456 7.800000 1.200000 10.578356 7.800000 1.300000 10.539256 7.800000 1.400000 10.520156 7.800000 1.500000 10.521056 7.800000 1.600000 10.541956 7.800000 1.700000 10.582856 7.800000 1.800000 10.643756 7.800000 1.900000 10.724656 7.800000 2.000000 10.825556 7.800000 2.100000 10.946456 7.800000 2.200000 11.087356 7.800000 2.300000 11.248256 7.800000 2.400000 11.429156 7.800000 2.500000 11.630056 7.800000 2.600000 11.850956 7.800000 2.700000 12.091856 7.800000 2.800000 12.352756 7.800000 2.900000 12.633656 7.800000 3.000000 12.934556 7.800000 3.100000 13.255456 7.800000 3.200000 13.596356 7.800000 3.300000 13.957256 7.800000 3.400000 14.338156 7.800000 3.500000 14.739056 7.800000 3.600000 15.159956 7.800000 3.700000 15.600856 7.800000 3.800000 16.061756 7.800000 3.900000 16.542656 7.800000 4.000000 17.043556 7.800000 4.100000 17.564456 7.800000 4.200000 18.105356 7.800000 4.300000 18.666256 7.800000 4.400000 19.247156 7.800000 4.500000 19.848056 7.800000 4.600000 20.468956 7.800000 4.700000 21.109856 7.800000 4.800000 21.770756 7.800000 4.900000 22.451656 7.800000 5.000000 23.152556 7.800000 5.100000 23.873456 7.800000 5.200000 24.614356 7.800000 5.300000 25.375256 7.800000 5.400000 26.156156 7.800000 5.500000 26.957056 7.800000 5.600000 27.777956 7.800000 5.700000 28.618856 7.800000 5.800000 29.479756 7.800000 5.900000 30.360656 7.800000 6.000000 31.261557 7.800000 6.100000 32.182457 7.800000 6.200000 33.123357 7.800000 6.300000 34.084257 7.800000 6.400000 35.065157 7.800000 6.500000 36.066057 7.800000 6.600000 37.086957 7.800000 6.700000 38.127857 7.800000 6.800000 39.188757 7.800000 6.900000 40.269657 7.800000 7.000000 41.370557 7.800000 7.100000 42.491457 7.800000 7.200000 43.632357 7.800000 7.300000 44.793257 7.800000 7.400000 45.974157 7.800000 7.500000 47.175057 7.800000 7.600000 48.395957 7.800000 7.700000 49.636857 7.800000 7.800000 50.897757 7.800000 7.900000 52.178657 7.800000 8.000000 53.479557 7.800000 8.100000 54.800457 7.800000 8.200000 56.141357 7.800000 8.300000 57.502257 7.800000 8.400000 58.883157 7.800000 8.500000 60.284057 7.800000 8.600000 61.704957 7.800000 8.700000 63.145857 7.800000 8.800000 64.606757 7.800000 8.900000 66.087657 7.800000 9.000000 67.588557 7.800000 9.100000 69.109457 7.800000 9.200000 70.650357 7.800000 9.300000 72.211257 7.800000 9.400000 73.792157 7.800000 9.500000 75.393057 7.800000 9.600000 77.013957 7.800000 9.700000 78.654857 7.800000 9.800000 80.315757 7.800000 9.900000 81.996657 7.800000 10.000000 83.697557 7.800000 10.100000 85.418457 7.800000 10.200000 87.159357 7.800000 10.300000 88.920257 7.800000 10.400000 90.701157 7.800000 10.500000 92.502057 7.800000 10.600000 94.322957 7.800000 10.700000 96.163857 7.800000 10.800000 98.024757 7.800000 10.900000 99.905657 7.800000 11.000000 101.806557 7.800000 11.100000 103.727457 7.800000 11.200000 105.668357 7.800000 11.300000 107.629257 7.800000 11.400000 109.610157 7.800000 11.500000 111.611057 7.800000 11.600000 113.631957 7.800000 11.700000 115.672857 7.800000 11.800000 117.733757 7.800000 11.900000 119.814657 7.800000 12.000000 121.915557 7.800000 12.100000 124.036457 7.800000 12.200000 126.177357 7.800000 12.300000 128.338257 7.800000 12.400000 130.519157 7.800000 12.500000 132.720057 7.800000 12.600000 134.940957 7.800000 12.700000 137.181857 7.800000 12.800000 139.442757 7.800000 12.900000 141.723657 7.800000 13.000000 144.024557 7.800000 13.100000 146.345457 7.800000 13.200000 148.686357 7.800000 13.300000 151.047257 7.800000 13.400000 153.428157 7.800000 13.500000 155.829057 7.800000 13.600000 158.249957 7.800000 13.700000 160.690857 7.800000 13.800000 163.151757 7.800000 13.900000 165.632657 7.800000 14.000000 168.133557 7.800000 14.100000 170.654457 7.800000 14.200000 173.195357 7.800000 14.300000 175.756257 7.800000 14.400000 178.337157 7.800000 14.500000 180.938057 7.800000 14.600000 183.558957 7.800000 14.700000 186.199857 7.800000 14.800000 188.860757 7.800000 14.900000 191.541657 7.800000 15.000000 194.242557 7.900000 -5.000000 51.667541 7.900000 -4.900000 50.379708 7.900000 -4.800000 49.111875 7.900000 -4.700000 47.864042 7.900000 -4.600000 46.636209 7.900000 -4.500000 45.428376 7.900000 -4.400000 44.240543 7.900000 -4.300000 43.072710 7.900000 -4.200000 41.924878 7.900000 -4.100000 40.797045 7.900000 -4.000000 39.689212 7.900000 -3.900000 38.601379 7.900000 -3.800000 37.533546 7.900000 -3.700000 36.485713 7.900000 -3.600000 35.457880 7.900000 -3.500000 34.450047 7.900000 -3.400000 33.462214 7.900000 -3.300000 32.494381 7.900000 -3.200000 31.546548 7.900000 -3.100000 30.618715 7.900000 -3.000000 29.710882 7.900000 -2.900000 28.823049 7.900000 -2.800000 27.955216 7.900000 -2.700000 27.107383 7.900000 -2.600000 26.279550 7.900000 -2.500000 25.471718 7.900000 -2.400000 24.683885 7.900000 -2.300000 23.916052 7.900000 -2.200000 23.168219 7.900000 -2.100000 22.440386 7.900000 -2.000000 21.732553 7.900000 -1.900000 21.044720 7.900000 -1.800000 20.376887 7.900000 -1.700000 19.729054 7.900000 -1.600000 19.101221 7.900000 -1.500000 18.493388 7.900000 -1.400000 17.905555 7.900000 -1.300000 17.337722 7.900000 -1.200000 16.789889 7.900000 -1.100000 16.262056 7.900000 -1.000000 15.754223 7.900000 -0.900000 15.266390 7.900000 -0.800000 14.798557 7.900000 -0.700000 14.350725 7.900000 -0.600000 13.922892 7.900000 -0.500000 13.515059 7.900000 -0.400000 13.127226 7.900000 -0.300000 12.759393 7.900000 -0.200000 12.411560 7.900000 -0.100000 12.083727 7.900000 -0.000000 11.775894 7.900000 0.100000 11.488061 7.900000 0.200000 11.220228 7.900000 0.300000 10.972395 7.900000 0.400000 10.744562 7.900000 0.500000 10.536729 7.900000 0.600000 10.348896 7.900000 0.700000 10.181063 7.900000 0.800000 10.033230 7.900000 0.900000 9.905397 7.900000 1.000000 9.797565 7.900000 1.100000 9.709732 7.900000 1.200000 9.641899 7.900000 1.300000 9.594066 7.900000 1.400000 9.566233 7.900000 1.500000 9.558400 7.900000 1.600000 9.570567 7.900000 1.700000 9.602734 7.900000 1.800000 9.654901 7.900000 1.900000 9.727068 7.900000 2.000000 9.819235 7.900000 2.100000 9.931402 7.900000 2.200000 10.063569 7.900000 2.300000 10.215736 7.900000 2.400000 10.387903 7.900000 2.500000 10.580070 7.900000 2.600000 10.792237 7.900000 2.700000 11.024405 7.900000 2.800000 11.276572 7.900000 2.900000 11.548739 7.900000 3.000000 11.840906 7.900000 3.100000 12.153073 7.900000 3.200000 12.485240 7.900000 3.300000 12.837407 7.900000 3.400000 13.209574 7.900000 3.500000 13.601741 7.900000 3.600000 14.013908 7.900000 3.700000 14.446075 7.900000 3.800000 14.898242 7.900000 3.900000 15.370409 7.900000 4.000000 15.862576 7.900000 4.100000 16.374743 7.900000 4.200000 16.906910 7.900000 4.300000 17.459077 7.900000 4.400000 18.031244 7.900000 4.500000 18.623412 7.900000 4.600000 19.235579 7.900000 4.700000 19.867746 7.900000 4.800000 20.519913 7.900000 4.900000 21.192080 7.900000 5.000000 21.884247 7.900000 5.100000 22.596414 7.900000 5.200000 23.328581 7.900000 5.300000 24.080748 7.900000 5.400000 24.852915 7.900000 5.500000 25.645082 7.900000 5.600000 26.457249 7.900000 5.700000 27.289416 7.900000 5.800000 28.141583 7.900000 5.900000 29.013750 7.900000 6.000000 29.905917 7.900000 6.100000 30.818084 7.900000 6.200000 31.750252 7.900000 6.300000 32.702419 7.900000 6.400000 33.674586 7.900000 6.500000 34.666753 7.900000 6.600000 35.678920 7.900000 6.700000 36.711087 7.900000 6.800000 37.763254 7.900000 6.900000 38.835421 7.900000 7.000000 39.927588 7.900000 7.100000 41.039755 7.900000 7.200000 42.171922 7.900000 7.300000 43.324089 7.900000 7.400000 44.496256 7.900000 7.500000 45.688423 7.900000 7.600000 46.900590 7.900000 7.700000 48.132757 7.900000 7.800000 49.384924 7.900000 7.900000 50.657092 7.900000 8.000000 51.949259 7.900000 8.100000 53.261426 7.900000 8.200000 54.593593 7.900000 8.300000 55.945760 7.900000 8.400000 57.317927 7.900000 8.500000 58.710094 7.900000 8.600000 60.122261 7.900000 8.700000 61.554428 7.900000 8.800000 63.006595 7.900000 8.900000 64.478762 7.900000 9.000000 65.970929 7.900000 9.100000 67.483096 7.900000 9.200000 69.015263 7.900000 9.300000 70.567430 7.900000 9.400000 72.139597 7.900000 9.500000 73.731764 7.900000 9.600000 75.343931 7.900000 9.700000 76.976099 7.900000 9.800000 78.628266 7.900000 9.900000 80.300433 7.900000 10.000000 81.992600 7.900000 10.100000 83.704767 7.900000 10.200000 85.436934 7.900000 10.300000 87.189101 7.900000 10.400000 88.961268 7.900000 10.500000 90.753435 7.900000 10.600000 92.565602 7.900000 10.700000 94.397769 7.900000 10.800000 96.249936 7.900000 10.900000 98.122103 7.900000 11.000000 100.014270 7.900000 11.100000 101.926437 7.900000 11.200000 103.858604 7.900000 11.300000 105.810771 7.900000 11.400000 107.782939 7.900000 11.500000 109.775106 7.900000 11.600000 111.787273 7.900000 11.700000 113.819440 7.900000 11.800000 115.871607 7.900000 11.900000 117.943774 7.900000 12.000000 120.035941 7.900000 12.100000 122.148108 7.900000 12.200000 124.280275 7.900000 12.300000 126.432442 7.900000 12.400000 128.604609 7.900000 12.500000 130.796776 7.900000 12.600000 133.008943 7.900000 12.700000 135.241110 7.900000 12.800000 137.493277 7.900000 12.900000 139.765444 7.900000 13.000000 142.057611 7.900000 13.100000 144.369779 7.900000 13.200000 146.701946 7.900000 13.300000 149.054113 7.900000 13.400000 151.426280 7.900000 13.500000 153.818447 7.900000 13.600000 156.230614 7.900000 13.700000 158.662781 7.900000 13.800000 161.114948 7.900000 13.900000 163.587115 7.900000 14.000000 166.079282 7.900000 14.100000 168.591449 7.900000 14.200000 171.123616 7.900000 14.300000 173.675783 7.900000 14.400000 176.247950 7.900000 14.500000 178.840117 7.900000 14.600000 181.452284 7.900000 14.700000 184.084451 7.900000 14.800000 186.736618 7.900000 14.900000 189.408786 7.900000 15.000000 192.100953 8.000000 -5.000000 51.314517 8.000000 -4.900000 50.017435 8.000000 -4.800000 48.740352 8.000000 -4.700000 47.483269 8.000000 -4.600000 46.246187 8.000000 -4.500000 45.029104 8.000000 -4.400000 43.832021 8.000000 -4.300000 42.654939 8.000000 -4.200000 41.497856 8.000000 -4.100000 40.360774 8.000000 -4.000000 39.243691 8.000000 -3.900000 38.146608 8.000000 -3.800000 37.069526 8.000000 -3.700000 36.012443 8.000000 -3.600000 34.975360 8.000000 -3.500000 33.958278 8.000000 -3.400000 32.961195 8.000000 -3.300000 31.984112 8.000000 -3.200000 31.027030 8.000000 -3.100000 30.089947 8.000000 -3.000000 29.172865 8.000000 -2.900000 28.275782 8.000000 -2.800000 27.398699 8.000000 -2.700000 26.541617 8.000000 -2.600000 25.704534 8.000000 -2.500000 24.887451 8.000000 -2.400000 24.090369 8.000000 -2.300000 23.313286 8.000000 -2.200000 22.556204 8.000000 -2.100000 21.819121 8.000000 -2.000000 21.102038 8.000000 -1.900000 20.404956 8.000000 -1.800000 19.727873 8.000000 -1.700000 19.070790 8.000000 -1.600000 18.433708 8.000000 -1.500000 17.816625 8.000000 -1.400000 17.219543 8.000000 -1.300000 16.642460 8.000000 -1.200000 16.085377 8.000000 -1.100000 15.548295 8.000000 -1.000000 15.031212 8.000000 -0.900000 14.534129 8.000000 -0.800000 14.057047 8.000000 -0.700000 13.599964 8.000000 -0.600000 13.162882 8.000000 -0.500000 12.745799 8.000000 -0.400000 12.348716 8.000000 -0.300000 11.971634 8.000000 -0.200000 11.614551 8.000000 -0.100000 11.277468 8.000000 -0.000000 10.960386 8.000000 0.100000 10.663303 8.000000 0.200000 10.386221 8.000000 0.300000 10.129138 8.000000 0.400000 9.892055 8.000000 0.500000 9.674973 8.000000 0.600000 9.477890 8.000000 0.700000 9.300807 8.000000 0.800000 9.143725 8.000000 0.900000 9.006642 8.000000 1.000000 8.889560 8.000000 1.100000 8.792477 8.000000 1.200000 8.715394 8.000000 1.300000 8.658312 8.000000 1.400000 8.621229 8.000000 1.500000 8.604146 8.000000 1.600000 8.607064 8.000000 1.700000 8.629981 8.000000 1.800000 8.672898 8.000000 1.900000 8.735816 8.000000 2.000000 8.818733 8.000000 2.100000 8.921651 8.000000 2.200000 9.044568 8.000000 2.300000 9.187485 8.000000 2.400000 9.350403 8.000000 2.500000 9.533320 8.000000 2.600000 9.736237 8.000000 2.700000 9.959155 8.000000 2.800000 10.202072 8.000000 2.900000 10.464990 8.000000 3.000000 10.747907 8.000000 3.100000 11.050824 8.000000 3.200000 11.373742 8.000000 3.300000 11.716659 8.000000 3.400000 12.079576 8.000000 3.500000 12.462494 8.000000 3.600000 12.865411 8.000000 3.700000 13.288329 8.000000 3.800000 13.731246 8.000000 3.900000 14.194163 8.000000 4.000000 14.677081 8.000000 4.100000 15.179998 8.000000 4.200000 15.702915 8.000000 4.300000 16.245833 8.000000 4.400000 16.808750 8.000000 4.500000 17.391668 8.000000 4.600000 17.994585 8.000000 4.700000 18.617502 8.000000 4.800000 19.260420 8.000000 4.900000 19.923337 8.000000 5.000000 20.606254 8.000000 5.100000 21.309172 8.000000 5.200000 22.032089 8.000000 5.300000 22.775007 8.000000 5.400000 23.537924 8.000000 5.500000 24.320841 8.000000 5.600000 25.123759 8.000000 5.700000 25.946676 8.000000 5.800000 26.789593 8.000000 5.900000 27.652511 8.000000 6.000000 28.535428 8.000000 6.100000 29.438346 8.000000 6.200000 30.361263 8.000000 6.300000 31.304180 8.000000 6.400000 32.267098 8.000000 6.500000 33.250015 8.000000 6.600000 34.252932 8.000000 6.700000 35.275850 8.000000 6.800000 36.318767 8.000000 6.900000 37.381684 8.000000 7.000000 38.464602 8.000000 7.100000 39.567519 8.000000 7.200000 40.690437 8.000000 7.300000 41.833354 8.000000 7.400000 42.996271 8.000000 7.500000 44.179189 8.000000 7.600000 45.382106 8.000000 7.700000 46.605023 8.000000 7.800000 47.847941 8.000000 7.900000 49.110858 8.000000 8.000000 50.393776 8.000000 8.100000 51.696693 8.000000 8.200000 53.019610 8.000000 8.300000 54.362528 8.000000 8.400000 55.725445 8.000000 8.500000 57.108362 8.000000 8.600000 58.511280 8.000000 8.700000 59.934197 8.000000 8.800000 61.377115 8.000000 8.900000 62.840032 8.000000 9.000000 64.322949 8.000000 9.100000 65.825867 8.000000 9.200000 67.348784 8.000000 9.300000 68.891701 8.000000 9.400000 70.454619 8.000000 9.500000 72.037536 8.000000 9.600000 73.640454 8.000000 9.700000 75.263371 8.000000 9.800000 76.906288 8.000000 9.900000 78.569206 8.000000 10.000000 80.252123 8.000000 10.100000 81.955040 8.000000 10.200000 83.677958 8.000000 10.300000 85.420875 8.000000 10.400000 87.183793 8.000000 10.500000 88.966710 8.000000 10.600000 90.769627 8.000000 10.700000 92.592545 8.000000 10.800000 94.435462 8.000000 10.900000 96.298379 8.000000 11.000000 98.181297 8.000000 11.100000 100.084214 8.000000 11.200000 102.007132 8.000000 11.300000 103.950049 8.000000 11.400000 105.912966 8.000000 11.500000 107.895884 8.000000 11.600000 109.898801 8.000000 11.700000 111.921718 8.000000 11.800000 113.964636 8.000000 11.900000 116.027553 8.000000 12.000000 118.110470 8.000000 12.100000 120.213388 8.000000 12.200000 122.336305 8.000000 12.300000 124.479223 8.000000 12.400000 126.642140 8.000000 12.500000 128.825057 8.000000 12.600000 131.027975 8.000000 12.700000 133.250892 8.000000 12.800000 135.493809 8.000000 12.900000 137.756727 8.000000 13.000000 140.039644 8.000000 13.100000 142.342562 8.000000 13.200000 144.665479 8.000000 13.300000 147.008396 8.000000 13.400000 149.371314 8.000000 13.500000 151.754231 8.000000 13.600000 154.157148 8.000000 13.700000 156.580066 8.000000 13.800000 159.022983 8.000000 13.900000 161.485901 8.000000 14.000000 163.968818 8.000000 14.100000 166.471735 8.000000 14.200000 168.994653 8.000000 14.300000 171.537570 8.000000 14.400000 174.100487 8.000000 14.500000 176.683405 8.000000 14.600000 179.286322 8.000000 14.700000 181.909240 8.000000 14.800000 184.552157 8.000000 14.900000 187.215074 8.000000 15.000000 189.897992 8.100000 -5.000000 51.013747 8.100000 -4.900000 49.706898 8.100000 -4.800000 48.420049 8.100000 -4.700000 47.153200 8.100000 -4.600000 45.906351 8.100000 -4.500000 44.679502 8.100000 -4.400000 43.472653 8.100000 -4.300000 42.285804 8.100000 -4.200000 41.118955 8.100000 -4.100000 39.972106 8.100000 -4.000000 38.845257 8.100000 -3.900000 37.738408 8.100000 -3.800000 36.651559 8.100000 -3.700000 35.584710 8.100000 -3.600000 34.537860 8.100000 -3.500000 33.511011 8.100000 -3.400000 32.504162 8.100000 -3.300000 31.517313 8.100000 -3.200000 30.550464 8.100000 -3.100000 29.603615 8.100000 -3.000000 28.676766 8.100000 -2.900000 27.769917 8.100000 -2.800000 26.883068 8.100000 -2.700000 26.016219 8.100000 -2.600000 25.169370 8.100000 -2.500000 24.342521 8.100000 -2.400000 23.535672 8.100000 -2.300000 22.748823 8.100000 -2.200000 21.981974 8.100000 -2.100000 21.235125 8.100000 -2.000000 20.508276 8.100000 -1.900000 19.801427 8.100000 -1.800000 19.114578 8.100000 -1.700000 18.447728 8.100000 -1.600000 17.800879 8.100000 -1.500000 17.174030 8.100000 -1.400000 16.567181 8.100000 -1.300000 15.980332 8.100000 -1.200000 15.413483 8.100000 -1.100000 14.866634 8.100000 -1.000000 14.339785 8.100000 -0.900000 13.832936 8.100000 -0.800000 13.346087 8.100000 -0.700000 12.879238 8.100000 -0.600000 12.432389 8.100000 -0.500000 12.005540 8.100000 -0.400000 11.598691 8.100000 -0.300000 11.211842 8.100000 -0.200000 10.844993 8.100000 -0.100000 10.498144 8.100000 -0.000000 10.171295 8.100000 0.100000 9.864446 8.100000 0.200000 9.577597 8.100000 0.300000 9.310747 8.100000 0.400000 9.063898 8.100000 0.500000 8.837049 8.100000 0.600000 8.630200 8.100000 0.700000 8.443351 8.100000 0.800000 8.276502 8.100000 0.900000 8.129653 8.100000 1.000000 8.002804 8.100000 1.100000 7.895955 8.100000 1.200000 7.809106 8.100000 1.300000 7.742257 8.100000 1.400000 7.695408 8.100000 1.500000 7.668559 8.100000 1.600000 7.661710 8.100000 1.700000 7.674861 8.100000 1.800000 7.708012 8.100000 1.900000 7.761163 8.100000 2.000000 7.834314 8.100000 2.100000 7.927465 8.100000 2.200000 8.040616 8.100000 2.300000 8.173766 8.100000 2.400000 8.326917 8.100000 2.500000 8.500068 8.100000 2.600000 8.693219 8.100000 2.700000 8.906370 8.100000 2.800000 9.139521 8.100000 2.900000 9.392672 8.100000 3.000000 9.665823 8.100000 3.100000 9.958974 8.100000 3.200000 10.272125 8.100000 3.300000 10.605276 8.100000 3.400000 10.958427 8.100000 3.500000 11.331578 8.100000 3.600000 11.724729 8.100000 3.700000 12.137880 8.100000 3.800000 12.571031 8.100000 3.900000 13.024182 8.100000 4.000000 13.497333 8.100000 4.100000 13.990484 8.100000 4.200000 14.503634 8.100000 4.300000 15.036785 8.100000 4.400000 15.589936 8.100000 4.500000 16.163087 8.100000 4.600000 16.756238 8.100000 4.700000 17.369389 8.100000 4.800000 18.002540 8.100000 4.900000 18.655691 8.100000 5.000000 19.328842 8.100000 5.100000 20.021993 8.100000 5.200000 20.735144 8.100000 5.300000 21.468295 8.100000 5.400000 22.221446 8.100000 5.500000 22.994597 8.100000 5.600000 23.787748 8.100000 5.700000 24.600899 8.100000 5.800000 25.434050 8.100000 5.900000 26.287201 8.100000 6.000000 27.160352 8.100000 6.100000 28.053503 8.100000 6.200000 28.966653 8.100000 6.300000 29.899804 8.100000 6.400000 30.852955 8.100000 6.500000 31.826106 8.100000 6.600000 32.819257 8.100000 6.700000 33.832408 8.100000 6.800000 34.865559 8.100000 6.900000 35.918710 8.100000 7.000000 36.991861 8.100000 7.100000 38.085012 8.100000 7.200000 39.198163 8.100000 7.300000 40.331314 8.100000 7.400000 41.484465 8.100000 7.500000 42.657616 8.100000 7.600000 43.850767 8.100000 7.700000 45.063918 8.100000 7.800000 46.297069 8.100000 7.900000 47.550220 8.100000 8.000000 48.823371 8.100000 8.100000 50.116522 8.100000 8.200000 51.429672 8.100000 8.300000 52.762823 8.100000 8.400000 54.115974 8.100000 8.500000 55.489125 8.100000 8.600000 56.882276 8.100000 8.700000 58.295427 8.100000 8.800000 59.728578 8.100000 8.900000 61.181729 8.100000 9.000000 62.654880 8.100000 9.100000 64.148031 8.100000 9.200000 65.661182 8.100000 9.300000 67.194333 8.100000 9.400000 68.747484 8.100000 9.500000 70.320635 8.100000 9.600000 71.913786 8.100000 9.700000 73.526937 8.100000 9.800000 75.160088 8.100000 9.900000 76.813239 8.100000 10.000000 78.486390 8.100000 10.100000 80.179540 8.100000 10.200000 81.892691 8.100000 10.300000 83.625842 8.100000 10.400000 85.378993 8.100000 10.500000 87.152144 8.100000 10.600000 88.945295 8.100000 10.700000 90.758446 8.100000 10.800000 92.591597 8.100000 10.900000 94.444748 8.100000 11.000000 96.317899 8.100000 11.100000 98.211050 8.100000 11.200000 100.124201 8.100000 11.300000 102.057352 8.100000 11.400000 104.010503 8.100000 11.500000 105.983654 8.100000 11.600000 107.976805 8.100000 11.700000 109.989956 8.100000 11.800000 112.023107 8.100000 11.900000 114.076258 8.100000 12.000000 116.149409 8.100000 12.100000 118.242559 8.100000 12.200000 120.355710 8.100000 12.300000 122.488861 8.100000 12.400000 124.642012 8.100000 12.500000 126.815163 8.100000 12.600000 129.008314 8.100000 12.700000 131.221465 8.100000 12.800000 133.454616 8.100000 12.900000 135.707767 8.100000 13.000000 137.980918 8.100000 13.100000 140.274069 8.100000 13.200000 142.587220 8.100000 13.300000 144.920371 8.100000 13.400000 147.273522 8.100000 13.500000 149.646673 8.100000 13.600000 152.039824 8.100000 13.700000 154.452975 8.100000 13.800000 156.886126 8.100000 13.900000 159.339277 8.100000 14.000000 161.812428 8.100000 14.100000 164.305578 8.100000 14.200000 166.818729 8.100000 14.300000 169.351880 8.100000 14.400000 171.905031 8.100000 14.500000 174.478182 8.100000 14.600000 177.071333 8.100000 14.700000 179.684484 8.100000 14.800000 182.317635 8.100000 14.900000 184.970786 8.100000 15.000000 187.643937 8.200000 -5.000000 50.775395 8.200000 -4.900000 49.458262 8.200000 -4.800000 48.161130 8.200000 -4.700000 46.883998 8.200000 -4.600000 45.626866 8.200000 -4.500000 44.389733 8.200000 -4.400000 43.172601 8.200000 -4.300000 41.975469 8.200000 -4.200000 40.798337 8.200000 -4.100000 39.641205 8.200000 -4.000000 38.504072 8.200000 -3.900000 37.386940 8.200000 -3.800000 36.289808 8.200000 -3.700000 35.212676 8.200000 -3.600000 34.155544 8.200000 -3.500000 33.118411 8.200000 -3.400000 32.101279 8.200000 -3.300000 31.104147 8.200000 -3.200000 30.127015 8.200000 -3.100000 29.169883 8.200000 -3.000000 28.232750 8.200000 -2.900000 27.315618 8.200000 -2.800000 26.418486 8.200000 -2.700000 25.541354 8.200000 -2.600000 24.684221 8.200000 -2.500000 23.847089 8.200000 -2.400000 23.029957 8.200000 -2.300000 22.232825 8.200000 -2.200000 21.455693 8.200000 -2.100000 20.698560 8.200000 -2.000000 19.961428 8.200000 -1.900000 19.244296 8.200000 -1.800000 18.547164 8.200000 -1.700000 17.870032 8.200000 -1.600000 17.212899 8.200000 -1.500000 16.575767 8.200000 -1.400000 15.958635 8.200000 -1.300000 15.361503 8.200000 -1.200000 14.784370 8.200000 -1.100000 14.227238 8.200000 -1.000000 13.690106 8.200000 -0.900000 13.172974 8.200000 -0.800000 12.675842 8.200000 -0.700000 12.198709 8.200000 -0.600000 11.741577 8.200000 -0.500000 11.304445 8.200000 -0.400000 10.887313 8.200000 -0.300000 10.490181 8.200000 -0.200000 10.113048 8.200000 -0.100000 9.755916 8.200000 -0.000000 9.418784 8.200000 0.100000 9.101652 8.200000 0.200000 8.804520 8.200000 0.300000 8.527387 8.200000 0.400000 8.270255 8.200000 0.500000 8.033123 8.200000 0.600000 7.815991 8.200000 0.700000 7.618858 8.200000 0.800000 7.441726 8.200000 0.900000 7.284594 8.200000 1.000000 7.147462 8.200000 1.100000 7.030330 8.200000 1.200000 6.933197 8.200000 1.300000 6.856065 8.200000 1.400000 6.798933 8.200000 1.500000 6.761801 8.200000 1.600000 6.744669 8.200000 1.700000 6.747536 8.200000 1.800000 6.770404 8.200000 1.900000 6.813272 8.200000 2.000000 6.876140 8.200000 2.100000 6.959007 8.200000 2.200000 7.061875 8.200000 2.300000 7.184743 8.200000 2.400000 7.327611 8.200000 2.500000 7.490479 8.200000 2.600000 7.673346 8.200000 2.700000 7.876214 8.200000 2.800000 8.099082 8.200000 2.900000 8.341950 8.200000 3.000000 8.604818 8.200000 3.100000 8.887685 8.200000 3.200000 9.190553 8.200000 3.300000 9.513421 8.200000 3.400000 9.856289 8.200000 3.500000 10.219156 8.200000 3.600000 10.602024 8.200000 3.700000 11.004892 8.200000 3.800000 11.427760 8.200000 3.900000 11.870628 8.200000 4.000000 12.333495 8.200000 4.100000 12.816363 8.200000 4.200000 13.319231 8.200000 4.300000 13.842099 8.200000 4.400000 14.384967 8.200000 4.500000 14.947834 8.200000 4.600000 15.530702 8.200000 4.700000 16.133570 8.200000 4.800000 16.756438 8.200000 4.900000 17.399306 8.200000 5.000000 18.062173 8.200000 5.100000 18.745041 8.200000 5.200000 19.447909 8.200000 5.300000 20.170777 8.200000 5.400000 20.913644 8.200000 5.500000 21.676512 8.200000 5.600000 22.459380 8.200000 5.700000 23.262248 8.200000 5.800000 24.085116 8.200000 5.900000 24.927983 8.200000 6.000000 25.790851 8.200000 6.100000 26.673719 8.200000 6.200000 27.576587 8.200000 6.300000 28.499455 8.200000 6.400000 29.442322 8.200000 6.500000 30.405190 8.200000 6.600000 31.388058 8.200000 6.700000 32.390926 8.200000 6.800000 33.413793 8.200000 6.900000 34.456661 8.200000 7.000000 35.519529 8.200000 7.100000 36.602397 8.200000 7.200000 37.705265 8.200000 7.300000 38.828132 8.200000 7.400000 39.971000 8.200000 7.500000 41.133868 8.200000 7.600000 42.316736 8.200000 7.700000 43.519604 8.200000 7.800000 44.742471 8.200000 7.900000 45.985339 8.200000 8.000000 47.248207 8.200000 8.100000 48.531075 8.200000 8.200000 49.833943 8.200000 8.300000 51.156810 8.200000 8.400000 52.499678 8.200000 8.500000 53.862546 8.200000 8.600000 55.245414 8.200000 8.700000 56.648281 8.200000 8.800000 58.071149 8.200000 8.900000 59.514017 8.200000 9.000000 60.976885 8.200000 9.100000 62.459753 8.200000 9.200000 63.962620 8.200000 9.300000 65.485488 8.200000 9.400000 67.028356 8.200000 9.500000 68.591224 8.200000 9.600000 70.174092 8.200000 9.700000 71.776959 8.200000 9.800000 73.399827 8.200000 9.900000 75.042695 8.200000 10.000000 76.705563 8.200000 10.100000 78.388430 8.200000 10.200000 80.091298 8.200000 10.300000 81.814166 8.200000 10.400000 83.557034 8.200000 10.500000 85.319902 8.200000 10.600000 87.102769 8.200000 10.700000 88.905637 8.200000 10.800000 90.728505 8.200000 10.900000 92.571373 8.200000 11.000000 94.434241 8.200000 11.100000 96.317108 8.200000 11.200000 98.219976 8.200000 11.300000 100.142844 8.200000 11.400000 102.085712 8.200000 11.500000 104.048580 8.200000 11.600000 106.031447 8.200000 11.700000 108.034315 8.200000 11.800000 110.057183 8.200000 11.900000 112.100051 8.200000 12.000000 114.162918 8.200000 12.100000 116.245786 8.200000 12.200000 118.348654 8.200000 12.300000 120.471522 8.200000 12.400000 122.614390 8.200000 12.500000 124.777257 8.200000 12.600000 126.960125 8.200000 12.700000 129.162993 8.200000 12.800000 131.385861 8.200000 12.900000 133.628729 8.200000 13.000000 135.891596 8.200000 13.100000 138.174464 8.200000 13.200000 140.477332 8.200000 13.300000 142.800200 8.200000 13.400000 145.143067 8.200000 13.500000 147.505935 8.200000 13.600000 149.888803 8.200000 13.700000 152.291671 8.200000 13.800000 154.714539 8.200000 13.900000 157.157406 8.200000 14.000000 159.620274 8.200000 14.100000 162.103142 8.200000 14.200000 164.606010 8.200000 14.300000 167.128878 8.200000 14.400000 169.671745 8.200000 14.500000 172.234613 8.200000 14.600000 174.817481 8.200000 14.700000 177.420349 8.200000 14.800000 180.043217 8.200000 14.900000 182.686084 8.200000 15.000000 185.348952 8.300000 -5.000000 50.609429 8.300000 -4.900000 49.281497 8.300000 -4.800000 47.973565 8.300000 -4.700000 46.685633 8.300000 -4.600000 45.417701 8.300000 -4.500000 44.169769 8.300000 -4.400000 42.941837 8.300000 -4.300000 41.733905 8.300000 -4.200000 40.545972 8.300000 -4.100000 39.378040 8.300000 -4.000000 38.230108 8.300000 -3.900000 37.102176 8.300000 -3.800000 35.994244 8.300000 -3.700000 34.906312 8.300000 -3.600000 33.838380 8.300000 -3.500000 32.790448 8.300000 -3.400000 31.762516 8.300000 -3.300000 30.754583 8.300000 -3.200000 29.766651 8.300000 -3.100000 28.798719 8.300000 -3.000000 27.850787 8.300000 -2.900000 26.922855 8.300000 -2.800000 26.014923 8.300000 -2.700000 25.126991 8.300000 -2.600000 24.259059 8.300000 -2.500000 23.411127 8.300000 -2.400000 22.583194 8.300000 -2.300000 21.775262 8.300000 -2.200000 20.987330 8.300000 -2.100000 20.219398 8.300000 -2.000000 19.471466 8.300000 -1.900000 18.743534 8.300000 -1.800000 18.035602 8.300000 -1.700000 17.347670 8.300000 -1.600000 16.679738 8.300000 -1.500000 16.031805 8.300000 -1.400000 15.403873 8.300000 -1.300000 14.795941 8.300000 -1.200000 14.208009 8.300000 -1.100000 13.640077 8.300000 -1.000000 13.092145 8.300000 -0.900000 12.564213 8.300000 -0.800000 12.056281 8.300000 -0.700000 11.568349 8.300000 -0.600000 11.100416 8.300000 -0.500000 10.652484 8.300000 -0.400000 10.224552 8.300000 -0.300000 9.816620 8.300000 -0.200000 9.428688 8.300000 -0.100000 9.060756 8.300000 -0.000000 8.712824 8.300000 0.100000 8.384892 8.300000 0.200000 8.076960 8.300000 0.300000 7.789027 8.300000 0.400000 7.521095 8.300000 0.500000 7.273163 8.300000 0.600000 7.045231 8.300000 0.700000 6.837299 8.300000 0.800000 6.649367 8.300000 0.900000 6.481435 8.300000 1.000000 6.333503 8.300000 1.100000 6.205571 8.300000 1.200000 6.097638 8.300000 1.300000 6.009706 8.300000 1.400000 5.941774 8.300000 1.500000 5.893842 8.300000 1.600000 5.865910 8.300000 1.700000 5.857978 8.300000 1.800000 5.870046 8.300000 1.900000 5.902114 8.300000 2.000000 5.954182 8.300000 2.100000 6.026249 8.300000 2.200000 6.118317 8.300000 2.300000 6.230385 8.300000 2.400000 6.362453 8.300000 2.500000 6.514521 8.300000 2.600000 6.686589 8.300000 2.700000 6.878657 8.300000 2.800000 7.090725 8.300000 2.900000 7.322793 8.300000 3.000000 7.574860 8.300000 3.100000 7.846928 8.300000 3.200000 8.138996 8.300000 3.300000 8.451064 8.300000 3.400000 8.783132 8.300000 3.500000 9.135200 8.300000 3.600000 9.507268 8.300000 3.700000 9.899336 8.300000 3.800000 10.311404 8.300000 3.900000 10.743471 8.300000 4.000000 11.195539 8.300000 4.100000 11.667607 8.300000 4.200000 12.159675 8.300000 4.300000 12.671743 8.300000 4.400000 13.203811 8.300000 4.500000 13.755879 8.300000 4.600000 14.327947 8.300000 4.700000 14.920014 8.300000 4.800000 15.532082 8.300000 4.900000 16.164150 8.300000 5.000000 16.816218 8.300000 5.100000 17.488286 8.300000 5.200000 18.180354 8.300000 5.300000 18.892422 8.300000 5.400000 19.624490 8.300000 5.500000 20.376558 8.300000 5.600000 21.148625 8.300000 5.700000 21.940693 8.300000 5.800000 22.752761 8.300000 5.900000 23.584829 8.300000 6.000000 24.436897 8.300000 6.100000 25.308965 8.300000 6.200000 26.201033 8.300000 6.300000 27.113101 8.300000 6.400000 28.045169 8.300000 6.500000 28.997236 8.300000 6.600000 29.969304 8.300000 6.700000 30.961372 8.300000 6.800000 31.973440 8.300000 6.900000 33.005508 8.300000 7.000000 34.057576 8.300000 7.100000 35.129644 8.300000 7.200000 36.221712 8.300000 7.300000 37.333780 8.300000 7.400000 38.465847 8.300000 7.500000 39.617915 8.300000 7.600000 40.789983 8.300000 7.700000 41.982051 8.300000 7.800000 43.194119 8.300000 7.900000 44.426187 8.300000 8.000000 45.678255 8.300000 8.100000 46.950323 8.300000 8.200000 48.242391 8.300000 8.300000 49.554458 8.300000 8.400000 50.886526 8.300000 8.500000 52.238594 8.300000 8.600000 53.610662 8.300000 8.700000 55.002730 8.300000 8.800000 56.414798 8.300000 8.900000 57.846866 8.300000 9.000000 59.298934 8.300000 9.100000 60.771002 8.300000 9.200000 62.263069 8.300000 9.300000 63.775137 8.300000 9.400000 65.307205 8.300000 9.500000 66.859273 8.300000 9.600000 68.431341 8.300000 9.700000 70.023409 8.300000 9.800000 71.635477 8.300000 9.900000 73.267545 8.300000 10.000000 74.919613 8.300000 10.100000 76.591680 8.300000 10.200000 78.283748 8.300000 10.300000 79.995816 8.300000 10.400000 81.727884 8.300000 10.500000 83.479952 8.300000 10.600000 85.252020 8.300000 10.700000 87.044088 8.300000 10.800000 88.856156 8.300000 10.900000 90.688224 8.300000 11.000000 92.540291 8.300000 11.100000 94.412359 8.300000 11.200000 96.304427 8.300000 11.300000 98.216495 8.300000 11.400000 100.148563 8.300000 11.500000 102.100631 8.300000 11.600000 104.072699 8.300000 11.700000 106.064767 8.300000 11.800000 108.076835 8.300000 11.900000 110.108902 8.300000 12.000000 112.160970 8.300000 12.100000 114.233038 8.300000 12.200000 116.325106 8.300000 12.300000 118.437174 8.300000 12.400000 120.569242 8.300000 12.500000 122.721310 8.300000 12.600000 124.893378 8.300000 12.700000 127.085446 8.300000 12.800000 129.297513 8.300000 12.900000 131.529581 8.300000 13.000000 133.781649 8.300000 13.100000 136.053717 8.300000 13.200000 138.345785 8.300000 13.300000 140.657853 8.300000 13.400000 142.989921 8.300000 13.500000 145.341989 8.300000 13.600000 147.714057 8.300000 13.700000 150.106124 8.300000 13.800000 152.518192 8.300000 13.900000 154.950260 8.300000 14.000000 157.402328 8.300000 14.100000 159.874396 8.300000 14.200000 162.366464 8.300000 14.300000 164.878532 8.300000 14.400000 167.410600 8.300000 14.500000 169.962668 8.300000 14.600000 172.534735 8.300000 14.700000 175.126803 8.300000 14.800000 177.738871 8.300000 14.900000 180.370939 8.300000 15.000000 183.023007 8.400000 -5.000000 50.525537 8.400000 -4.900000 49.186288 8.400000 -4.800000 47.867039 8.400000 -4.700000 46.567790 8.400000 -4.600000 45.288542 8.400000 -4.500000 44.029293 8.400000 -4.400000 42.790044 8.400000 -4.300000 41.570795 8.400000 -4.200000 40.371547 8.400000 -4.100000 39.192298 8.400000 -4.000000 38.033049 8.400000 -3.900000 36.893800 8.400000 -3.800000 35.774552 8.400000 -3.700000 34.675303 8.400000 -3.600000 33.596054 8.400000 -3.500000 32.536805 8.400000 -3.400000 31.497557 8.400000 -3.300000 30.478308 8.400000 -3.200000 29.479059 8.400000 -3.100000 28.499810 8.400000 -3.000000 27.540562 8.400000 -2.900000 26.601313 8.400000 -2.800000 25.682064 8.400000 -2.700000 24.782815 8.400000 -2.600000 23.903567 8.400000 -2.500000 23.044318 8.400000 -2.400000 22.205069 8.400000 -2.300000 21.385820 8.400000 -2.200000 20.586572 8.400000 -2.100000 19.807323 8.400000 -2.000000 19.048074 8.400000 -1.900000 18.308825 8.400000 -1.800000 17.589577 8.400000 -1.700000 16.890328 8.400000 -1.600000 16.211079 8.400000 -1.500000 15.551830 8.400000 -1.400000 14.912582 8.400000 -1.300000 14.293333 8.400000 -1.200000 13.694084 8.400000 -1.100000 13.114835 8.400000 -1.000000 12.555587 8.400000 -0.900000 12.016338 8.400000 -0.800000 11.497089 8.400000 -0.700000 10.997840 8.400000 -0.600000 10.518592 8.400000 -0.500000 10.059343 8.400000 -0.400000 9.620094 8.400000 -0.300000 9.200845 8.400000 -0.200000 8.801597 8.400000 -0.100000 8.422348 8.400000 -0.000000 8.063099 8.400000 0.100000 7.723850 8.400000 0.200000 7.404602 8.400000 0.300000 7.105353 8.400000 0.400000 6.826104 8.400000 0.500000 6.566855 8.400000 0.600000 6.327607 8.400000 0.700000 6.108358 8.400000 0.800000 5.909109 8.400000 0.900000 5.729860 8.400000 1.000000 5.570612 8.400000 1.100000 5.431363 8.400000 1.200000 5.312114 8.400000 1.300000 5.212865 8.400000 1.400000 5.133617 8.400000 1.500000 5.074368 8.400000 1.600000 5.035119 8.400000 1.700000 5.015870 8.400000 1.800000 5.016622 8.400000 1.900000 5.037373 8.400000 2.000000 5.078124 8.400000 2.100000 5.138875 8.400000 2.200000 5.219627 8.400000 2.300000 5.320378 8.400000 2.400000 5.441129 8.400000 2.500000 5.581880 8.400000 2.600000 5.742632 8.400000 2.700000 5.923383 8.400000 2.800000 6.124134 8.400000 2.900000 6.344885 8.400000 3.000000 6.585637 8.400000 3.100000 6.846388 8.400000 3.200000 7.127139 8.400000 3.300000 7.427890 8.400000 3.400000 7.748642 8.400000 3.500000 8.089393 8.400000 3.600000 8.450144 8.400000 3.700000 8.830895 8.400000 3.800000 9.231647 8.400000 3.900000 9.652398 8.400000 4.000000 10.093149 8.400000 4.100000 10.553900 8.400000 4.200000 11.034652 8.400000 4.300000 11.535403 8.400000 4.400000 12.056154 8.400000 4.500000 12.596905 8.400000 4.600000 13.157657 8.400000 4.700000 13.738408 8.400000 4.800000 14.339159 8.400000 4.900000 14.959910 8.400000 5.000000 15.600662 8.400000 5.100000 16.261413 8.400000 5.200000 16.942164 8.400000 5.300000 17.642915 8.400000 5.400000 18.363667 8.400000 5.500000 19.104418 8.400000 5.600000 19.865169 8.400000 5.700000 20.645920 8.400000 5.800000 21.446672 8.400000 5.900000 22.267423 8.400000 6.000000 23.108174 8.400000 6.100000 23.968925 8.400000 6.200000 24.849677 8.400000 6.300000 25.750428 8.400000 6.400000 26.671179 8.400000 6.500000 27.611930 8.400000 6.600000 28.572682 8.400000 6.700000 29.553433 8.400000 6.800000 30.554184 8.400000 6.900000 31.574935 8.400000 7.000000 32.615687 8.400000 7.100000 33.676438 8.400000 7.200000 34.757189 8.400000 7.300000 35.857940 8.400000 7.400000 36.978692 8.400000 7.500000 38.119443 8.400000 7.600000 39.280194 8.400000 7.700000 40.460945 8.400000 7.800000 41.661697 8.400000 7.900000 42.882448 8.400000 8.000000 44.123199 8.400000 8.100000 45.383950 8.400000 8.200000 46.664702 8.400000 8.300000 47.965453 8.400000 8.400000 49.286204 8.400000 8.500000 50.626955 8.400000 8.600000 51.987707 8.400000 8.700000 53.368458 8.400000 8.800000 54.769209 8.400000 8.900000 56.189960 8.400000 9.000000 57.630712 8.400000 9.100000 59.091463 8.400000 9.200000 60.572214 8.400000 9.300000 62.072965 8.400000 9.400000 63.593717 8.400000 9.500000 65.134468 8.400000 9.600000 66.695219 8.400000 9.700000 68.275970 8.400000 9.800000 69.876722 8.400000 9.900000 71.497473 8.400000 10.000000 73.138224 8.400000 10.100000 74.798975 8.400000 10.200000 76.479727 8.400000 10.300000 78.180478 8.400000 10.400000 79.901229 8.400000 10.500000 81.641980 8.400000 10.600000 83.402732 8.400000 10.700000 85.183483 8.400000 10.800000 86.984234 8.400000 10.900000 88.804985 8.400000 11.000000 90.645737 8.400000 11.100000 92.506488 8.400000 11.200000 94.387239 8.400000 11.300000 96.287990 8.400000 11.400000 98.208742 8.400000 11.500000 100.149493 8.400000 11.600000 102.110244 8.400000 11.700000 104.090995 8.400000 11.800000 106.091747 8.400000 11.900000 108.112498 8.400000 12.000000 110.153249 8.400000 12.100000 112.214000 8.400000 12.200000 114.294752 8.400000 12.300000 116.395503 8.400000 12.400000 118.516254 8.400000 12.500000 120.657005 8.400000 12.600000 122.817757 8.400000 12.700000 124.998508 8.400000 12.800000 127.199259 8.400000 12.900000 129.420010 8.400000 13.000000 131.660762 8.400000 13.100000 133.921513 8.400000 13.200000 136.202264 8.400000 13.300000 138.503015 8.400000 13.400000 140.823767 8.400000 13.500000 143.164518 8.400000 13.600000 145.525269 8.400000 13.700000 147.906020 8.400000 13.800000 150.306772 8.400000 13.900000 152.727523 8.400000 14.000000 155.168274 8.400000 14.100000 157.629025 8.400000 14.200000 160.109777 8.400000 14.300000 162.610528 8.400000 14.400000 165.131279 8.400000 14.500000 167.672030 8.400000 14.600000 170.232782 8.400000 14.700000 172.813533 8.400000 14.800000 175.414284 8.400000 14.900000 178.035035 8.400000 15.000000 180.675787 8.500000 -5.000000 50.533028 8.500000 -4.900000 49.181946 8.500000 -4.800000 47.850863 8.500000 -4.700000 46.539781 8.500000 -4.600000 45.248699 8.500000 -4.500000 43.977617 8.500000 -4.400000 42.726535 8.500000 -4.300000 41.495453 8.500000 -4.200000 40.284371 8.500000 -4.100000 39.093289 8.500000 -4.000000 37.922206 8.500000 -3.900000 36.771124 8.500000 -3.800000 35.640042 8.500000 -3.700000 34.528960 8.500000 -3.600000 33.437878 8.500000 -3.500000 32.366796 8.500000 -3.400000 31.315714 8.500000 -3.300000 30.284632 8.500000 -3.200000 29.273549 8.500000 -3.100000 28.282467 8.500000 -3.000000 27.311385 8.500000 -2.900000 26.360303 8.500000 -2.800000 25.429221 8.500000 -2.700000 24.518139 8.500000 -2.600000 23.627057 8.500000 -2.500000 22.755975 8.500000 -2.400000 21.904892 8.500000 -2.300000 21.073810 8.500000 -2.200000 20.262728 8.500000 -2.100000 19.471646 8.500000 -2.000000 18.700564 8.500000 -1.900000 17.949482 8.500000 -1.800000 17.218400 8.500000 -1.700000 16.507318 8.500000 -1.600000 15.816235 8.500000 -1.500000 15.145153 8.500000 -1.400000 14.494071 8.500000 -1.300000 13.862989 8.500000 -1.200000 13.251907 8.500000 -1.100000 12.660825 8.500000 -1.000000 12.089743 8.500000 -0.900000 11.538661 8.500000 -0.800000 11.007578 8.500000 -0.700000 10.496496 8.500000 -0.600000 10.005414 8.500000 -0.500000 9.534332 8.500000 -0.400000 9.083250 8.500000 -0.300000 8.652168 8.500000 -0.200000 8.241086 8.500000 -0.100000 7.850004 8.500000 -0.000000 7.478921 8.500000 0.100000 7.127839 8.500000 0.200000 6.796757 8.500000 0.300000 6.485675 8.500000 0.400000 6.194593 8.500000 0.500000 5.923511 8.500000 0.600000 5.672429 8.500000 0.700000 5.441347 8.500000 0.800000 5.230264 8.500000 0.900000 5.039182 8.500000 1.000000 4.868100 8.500000 1.100000 4.717018 8.500000 1.200000 4.585936 8.500000 1.300000 4.474854 8.500000 1.400000 4.383772 8.500000 1.500000 4.312690 8.500000 1.600000 4.261607 8.500000 1.700000 4.230525 8.500000 1.800000 4.219443 8.500000 1.900000 4.228361 8.500000 2.000000 4.257279 8.500000 2.100000 4.306197 8.500000 2.200000 4.375115 8.500000 2.300000 4.464033 8.500000 2.400000 4.572950 8.500000 2.500000 4.701868 8.500000 2.600000 4.850786 8.500000 2.700000 5.019704 8.500000 2.800000 5.208622 8.500000 2.900000 5.417540 8.500000 3.000000 5.646458 8.500000 3.100000 5.895376 8.500000 3.200000 6.164293 8.500000 3.300000 6.453211 8.500000 3.400000 6.762129 8.500000 3.500000 7.091047 8.500000 3.600000 7.439965 8.500000 3.700000 7.808883 8.500000 3.800000 8.197801 8.500000 3.900000 8.606719 8.500000 4.000000 9.035636 8.500000 4.100000 9.484554 8.500000 4.200000 9.953472 8.500000 4.300000 10.442390 8.500000 4.400000 10.951308 8.500000 4.500000 11.480226 8.500000 4.600000 12.029144 8.500000 4.700000 12.598062 8.500000 4.800000 13.186979 8.500000 4.900000 13.795897 8.500000 5.000000 14.424815 8.500000 5.100000 15.073733 8.500000 5.200000 15.742651 8.500000 5.300000 16.431569 8.500000 5.400000 17.140487 8.500000 5.500000 17.869405 8.500000 5.600000 18.618322 8.500000 5.700000 19.387240 8.500000 5.800000 20.176158 8.500000 5.900000 20.985076 8.500000 6.000000 21.813994 8.500000 6.100000 22.662912 8.500000 6.200000 23.531830 8.500000 6.300000 24.420748 8.500000 6.400000 25.329665 8.500000 6.500000 26.258583 8.500000 6.600000 27.207501 8.500000 6.700000 28.176419 8.500000 6.800000 29.165337 8.500000 6.900000 30.174255 8.500000 7.000000 31.203173 8.500000 7.100000 32.252091 8.500000 7.200000 33.321008 8.500000 7.300000 34.409926 8.500000 7.400000 35.518844 8.500000 7.500000 36.647762 8.500000 7.600000 37.796680 8.500000 7.700000 38.965598 8.500000 7.800000 40.154516 8.500000 7.900000 41.363434 8.500000 8.000000 42.592351 8.500000 8.100000 43.841269 8.500000 8.200000 45.110187 8.500000 8.300000 46.399105 8.500000 8.400000 47.708023 8.500000 8.500000 49.036941 8.500000 8.600000 50.385859 8.500000 8.700000 51.754777 8.500000 8.800000 53.143694 8.500000 8.900000 54.552612 8.500000 9.000000 55.981530 8.500000 9.100000 57.430448 8.500000 9.200000 58.899366 8.500000 9.300000 60.388284 8.500000 9.400000 61.897202 8.500000 9.500000 63.426120 8.500000 9.600000 64.975037 8.500000 9.700000 66.543955 8.500000 9.800000 68.132873 8.500000 9.900000 69.741791 8.500000 10.000000 71.370709 8.500000 10.100000 73.019627 8.500000 10.200000 74.688545 8.500000 10.300000 76.377463 8.500000 10.400000 78.086380 8.500000 10.500000 79.815298 8.500000 10.600000 81.564216 8.500000 10.700000 83.333134 8.500000 10.800000 85.122052 8.500000 10.900000 86.930970 8.500000 11.000000 88.759888 8.500000 11.100000 90.608806 8.500000 11.200000 92.477723 8.500000 11.300000 94.366641 8.500000 11.400000 96.275559 8.500000 11.500000 98.204477 8.500000 11.600000 100.153395 8.500000 11.700000 102.122313 8.500000 11.800000 104.111231 8.500000 11.900000 106.120149 8.500000 12.000000 108.149066 8.500000 12.100000 110.197984 8.500000 12.200000 112.266902 8.500000 12.300000 114.355820 8.500000 12.400000 116.464738 8.500000 12.500000 118.593656 8.500000 12.600000 120.742574 8.500000 12.700000 122.911492 8.500000 12.800000 125.100409 8.500000 12.900000 127.309327 8.500000 13.000000 129.538245 8.500000 13.100000 131.787163 8.500000 13.200000 134.056081 8.500000 13.300000 136.344999 8.500000 13.400000 138.653917 8.500000 13.500000 140.982835 8.500000 13.600000 143.331752 8.500000 13.700000 145.700670 8.500000 13.800000 148.089588 8.500000 13.900000 150.498506 8.500000 14.000000 152.927424 8.500000 14.100000 155.376342 8.500000 14.200000 157.845260 8.500000 14.300000 160.334178 8.500000 14.400000 162.843095 8.500000 14.500000 165.372013 8.500000 14.600000 167.920931 8.500000 14.700000 170.489849 8.500000 14.800000 173.078767 8.500000 14.900000 175.687685 8.500000 15.000000 178.316603 8.600000 -5.000000 50.640756 8.600000 -4.900000 49.277324 8.600000 -4.800000 47.933892 8.600000 -4.700000 46.610460 8.600000 -4.600000 45.307028 8.600000 -4.500000 44.023595 8.600000 -4.400000 42.760163 8.600000 -4.300000 41.516731 8.600000 -4.200000 40.293299 8.600000 -4.100000 39.089866 8.600000 -4.000000 37.906434 8.600000 -3.900000 36.743002 8.600000 -3.800000 35.599570 8.600000 -3.700000 34.476137 8.600000 -3.600000 33.372705 8.600000 -3.500000 32.289273 8.600000 -3.400000 31.225841 8.600000 -3.300000 30.182408 8.600000 -3.200000 29.158976 8.600000 -3.100000 28.155544 8.600000 -3.000000 27.172112 8.600000 -2.900000 26.208679 8.600000 -2.800000 25.265247 8.600000 -2.700000 24.341815 8.600000 -2.600000 23.438383 8.600000 -2.500000 22.554951 8.600000 -2.400000 21.691518 8.600000 -2.300000 20.848086 8.600000 -2.200000 20.024654 8.600000 -2.100000 19.221222 8.600000 -2.000000 18.437789 8.600000 -1.900000 17.674357 8.600000 -1.800000 16.930925 8.600000 -1.700000 16.207493 8.600000 -1.600000 15.504060 8.600000 -1.500000 14.820628 8.600000 -1.400000 14.157196 8.600000 -1.300000 13.513764 8.600000 -1.200000 12.890331 8.600000 -1.100000 12.286899 8.600000 -1.000000 11.703467 8.600000 -0.900000 11.140035 8.600000 -0.800000 10.596602 8.600000 -0.700000 10.073170 8.600000 -0.600000 9.569738 8.600000 -0.500000 9.086306 8.600000 -0.400000 8.622874 8.600000 -0.300000 8.179441 8.600000 -0.200000 7.756009 8.600000 -0.100000 7.352577 8.600000 -0.000000 6.969145 8.600000 0.100000 6.605712 8.600000 0.200000 6.262280 8.600000 0.300000 5.938848 8.600000 0.400000 5.635416 8.600000 0.500000 5.351983 8.600000 0.600000 5.088551 8.600000 0.700000 4.845119 8.600000 0.800000 4.621687 8.600000 0.900000 4.418254 8.600000 1.000000 4.234822 8.600000 1.100000 4.071390 8.600000 1.200000 3.927958 8.600000 1.300000 3.804525 8.600000 1.400000 3.701093 8.600000 1.500000 3.617661 8.600000 1.600000 3.554229 8.600000 1.700000 3.510797 8.600000 1.800000 3.487364 8.600000 1.900000 3.483932 8.600000 2.000000 3.500500 8.600000 2.100000 3.537068 8.600000 2.200000 3.593635 8.600000 2.300000 3.670203 8.600000 2.400000 3.766771 8.600000 2.500000 3.883339 8.600000 2.600000 4.019906 8.600000 2.700000 4.176474 8.600000 2.800000 4.353042 8.600000 2.900000 4.549610 8.600000 3.000000 4.766177 8.600000 3.100000 5.002745 8.600000 3.200000 5.259313 8.600000 3.300000 5.535881 8.600000 3.400000 5.832448 8.600000 3.500000 6.149016 8.600000 3.600000 6.485584 8.600000 3.700000 6.842152 8.600000 3.800000 7.218720 8.600000 3.900000 7.615287 8.600000 4.000000 8.031855 8.600000 4.100000 8.468423 8.600000 4.200000 8.924991 8.600000 4.300000 9.401558 8.600000 4.400000 9.898126 8.600000 4.500000 10.414694 8.600000 4.600000 10.951262 8.600000 4.700000 11.507829 8.600000 4.800000 12.084397 8.600000 4.900000 12.680965 8.600000 5.000000 13.297533 8.600000 5.100000 13.934100 8.600000 5.200000 14.590668 8.600000 5.300000 15.267236 8.600000 5.400000 15.963804 8.600000 5.500000 16.680371 8.600000 5.600000 17.416939 8.600000 5.700000 18.173507 8.600000 5.800000 18.950075 8.600000 5.900000 19.746643 8.600000 6.000000 20.563210 8.600000 6.100000 21.399778 8.600000 6.200000 22.256346 8.600000 6.300000 23.132914 8.600000 6.400000 24.029481 8.600000 6.500000 24.946049 8.600000 6.600000 25.882617 8.600000 6.700000 26.839185 8.600000 6.800000 27.815752 8.600000 6.900000 28.812320 8.600000 7.000000 29.828888 8.600000 7.100000 30.865456 8.600000 7.200000 31.922023 8.600000 7.300000 32.998591 8.600000 7.400000 34.095159 8.600000 7.500000 35.211727 8.600000 7.600000 36.348294 8.600000 7.700000 37.504862 8.600000 7.800000 38.681430 8.600000 7.900000 39.877998 8.600000 8.000000 41.094566 8.600000 8.100000 42.331133 8.600000 8.200000 43.587701 8.600000 8.300000 44.864269 8.600000 8.400000 46.160837 8.600000 8.500000 47.477404 8.600000 8.600000 48.813972 8.600000 8.700000 50.170540 8.600000 8.800000 51.547108 8.600000 8.900000 52.943675 8.600000 9.000000 54.360243 8.600000 9.100000 55.796811 8.600000 9.200000 57.253379 8.600000 9.300000 58.729946 8.600000 9.400000 60.226514 8.600000 9.500000 61.743082 8.600000 9.600000 63.279650 8.600000 9.700000 64.836217 8.600000 9.800000 66.412785 8.600000 9.900000 68.009353 8.600000 10.000000 69.625921 8.600000 10.100000 71.262489 8.600000 10.200000 72.919056 8.600000 10.300000 74.595624 8.600000 10.400000 76.292192 8.600000 10.500000 78.008760 8.600000 10.600000 79.745327 8.600000 10.700000 81.501895 8.600000 10.800000 83.278463 8.600000 10.900000 85.075031 8.600000 11.000000 86.891598 8.600000 11.100000 88.728166 8.600000 11.200000 90.584734 8.600000 11.300000 92.461302 8.600000 11.400000 94.357869 8.600000 11.500000 96.274437 8.600000 11.600000 98.211005 8.600000 11.700000 100.167573 8.600000 11.800000 102.144140 8.600000 11.900000 104.140708 8.600000 12.000000 106.157276 8.600000 12.100000 108.193844 8.600000 12.200000 110.250412 8.600000 12.300000 112.326979 8.600000 12.400000 114.423547 8.600000 12.500000 116.540115 8.600000 12.600000 118.676683 8.600000 12.700000 120.833250 8.600000 12.800000 123.009818 8.600000 12.900000 125.206386 8.600000 13.000000 127.422954 8.600000 13.100000 129.659521 8.600000 13.200000 131.916089 8.600000 13.300000 134.192657 8.600000 13.400000 136.489225 8.600000 13.500000 138.805792 8.600000 13.600000 141.142360 8.600000 13.700000 143.498928 8.600000 13.800000 145.875496 8.600000 13.900000 148.272063 8.600000 14.000000 150.688631 8.600000 14.100000 153.125199 8.600000 14.200000 155.581767 8.600000 14.300000 158.058335 8.600000 14.400000 160.554902 8.600000 14.500000 163.071470 8.600000 14.600000 165.608038 8.600000 14.700000 168.164606 8.600000 14.800000 170.741173 8.600000 14.900000 173.337741 8.600000 15.000000 175.954309 8.700000 -5.000000 50.857040 8.700000 -4.900000 49.480741 8.700000 -4.800000 48.124442 8.700000 -4.700000 46.788142 8.700000 -4.600000 45.471843 8.700000 -4.500000 44.175544 8.700000 -4.400000 42.899245 8.700000 -4.300000 41.642946 8.700000 -4.200000 40.406647 8.700000 -4.100000 39.190348 8.700000 -4.000000 37.994049 8.700000 -3.900000 36.817750 8.700000 -3.800000 35.661451 8.700000 -3.700000 34.525152 8.700000 -3.600000 33.408852 8.700000 -3.500000 32.312553 8.700000 -3.400000 31.236254 8.700000 -3.300000 30.179955 8.700000 -3.200000 29.143656 8.700000 -3.100000 28.127357 8.700000 -3.000000 27.131058 8.700000 -2.900000 26.154759 8.700000 -2.800000 25.198460 8.700000 -2.700000 24.262161 8.700000 -2.600000 23.345862 8.700000 -2.500000 22.449562 8.700000 -2.400000 21.573263 8.700000 -2.300000 20.716964 8.700000 -2.200000 19.880665 8.700000 -2.100000 19.064366 8.700000 -2.000000 18.268067 8.700000 -1.900000 17.491768 8.700000 -1.800000 16.735469 8.700000 -1.700000 15.999170 8.700000 -1.600000 15.282871 8.700000 -1.500000 14.586572 8.700000 -1.400000 13.910273 8.700000 -1.300000 13.253973 8.700000 -1.200000 12.617674 8.700000 -1.100000 12.001375 8.700000 -1.000000 11.405076 8.700000 -0.900000 10.828777 8.700000 -0.800000 10.272478 8.700000 -0.700000 9.736179 8.700000 -0.600000 9.219880 8.700000 -0.500000 8.723581 8.700000 -0.400000 8.247282 8.700000 -0.300000 7.790983 8.700000 -0.200000 7.354683 8.700000 -0.100000 6.938384 8.700000 -0.000000 6.542085 8.700000 0.100000 6.165786 8.700000 0.200000 5.809487 8.700000 0.300000 5.473188 8.700000 0.400000 5.156889 8.700000 0.500000 4.860590 8.700000 0.600000 4.584291 8.700000 0.700000 4.327992 8.700000 0.800000 4.091693 8.700000 0.900000 3.875393 8.700000 1.000000 3.679094 8.700000 1.100000 3.502795 8.700000 1.200000 3.346496 8.700000 1.300000 3.210197 8.700000 1.400000 3.093898 8.700000 1.500000 2.997599 8.700000 1.600000 2.921300 8.700000 1.700000 2.865001 8.700000 1.800000 2.828702 8.700000 1.900000 2.812403 8.700000 2.000000 2.816103 8.700000 2.100000 2.839804 8.700000 2.200000 2.883505 8.700000 2.300000 2.947206 8.700000 2.400000 3.030907 8.700000 2.500000 3.134608 8.700000 2.600000 3.258309 8.700000 2.700000 3.402010 8.700000 2.800000 3.565711 8.700000 2.900000 3.749412 8.700000 3.000000 3.953113 8.700000 3.100000 4.176813 8.700000 3.200000 4.420514 8.700000 3.300000 4.684215 8.700000 3.400000 4.967916 8.700000 3.500000 5.271617 8.700000 3.600000 5.595318 8.700000 3.700000 5.939019 8.700000 3.800000 6.302720 8.700000 3.900000 6.686421 8.700000 4.000000 7.090122 8.700000 4.100000 7.513823 8.700000 4.200000 7.957523 8.700000 4.300000 8.421224 8.700000 4.400000 8.904925 8.700000 4.500000 9.408626 8.700000 4.600000 9.932327 8.700000 4.700000 10.476028 8.700000 4.800000 11.039729 8.700000 4.900000 11.623430 8.700000 5.000000 12.227131 8.700000 5.100000 12.850832 8.700000 5.200000 13.494533 8.700000 5.300000 14.158233 8.700000 5.400000 14.841934 8.700000 5.500000 15.545635 8.700000 5.600000 16.269336 8.700000 5.700000 17.013037 8.700000 5.800000 17.776738 8.700000 5.900000 18.560439 8.700000 6.000000 19.364140 8.700000 6.100000 20.187841 8.700000 6.200000 21.031542 8.700000 6.300000 21.895243 8.700000 6.400000 22.778944 8.700000 6.500000 23.682644 8.700000 6.600000 24.606345 8.700000 6.700000 25.550046 8.700000 6.800000 26.513747 8.700000 6.900000 27.497448 8.700000 7.000000 28.501149 8.700000 7.100000 29.524850 8.700000 7.200000 30.568551 8.700000 7.300000 31.632252 8.700000 7.400000 32.715953 8.700000 7.500000 33.819654 8.700000 7.600000 34.943354 8.700000 7.700000 36.087055 8.700000 7.800000 37.250756 8.700000 7.900000 38.434457 8.700000 8.000000 39.638158 8.700000 8.100000 40.861859 8.700000 8.200000 42.105560 8.700000 8.300000 43.369261 8.700000 8.400000 44.652962 8.700000 8.500000 45.956663 8.700000 8.600000 47.280364 8.700000 8.700000 48.624064 8.700000 8.800000 49.987765 8.700000 8.900000 51.371466 8.700000 9.000000 52.775167 8.700000 9.100000 54.198868 8.700000 9.200000 55.642569 8.700000 9.300000 57.106270 8.700000 9.400000 58.589971 8.700000 9.500000 60.093672 8.700000 9.600000 61.617373 8.700000 9.700000 63.161074 8.700000 9.800000 64.724774 8.700000 9.900000 66.308475 8.700000 10.000000 67.912176 8.700000 10.100000 69.535877 8.700000 10.200000 71.179578 8.700000 10.300000 72.843279 8.700000 10.400000 74.526980 8.700000 10.500000 76.230681 8.700000 10.600000 77.954382 8.700000 10.700000 79.698083 8.700000 10.800000 81.461784 8.700000 10.900000 83.245484 8.700000 11.000000 85.049185 8.700000 11.100000 86.872886 8.700000 11.200000 88.716587 8.700000 11.300000 90.580288 8.700000 11.400000 92.463989 8.700000 11.500000 94.367690 8.700000 11.600000 96.291391 8.700000 11.700000 98.235092 8.700000 11.800000 100.198793 8.700000 11.900000 102.182494 8.700000 12.000000 104.186194 8.700000 12.100000 106.209895 8.700000 12.200000 108.253596 8.700000 12.300000 110.317297 8.700000 12.400000 112.400998 8.700000 12.500000 114.504699 8.700000 12.600000 116.628400 8.700000 12.700000 118.772101 8.700000 12.800000 120.935802 8.700000 12.900000 123.119503 8.700000 13.000000 125.323204 8.700000 13.100000 127.546905 8.700000 13.200000 129.790605 8.700000 13.300000 132.054306 8.700000 13.400000 134.338007 8.700000 13.500000 136.641708 8.700000 13.600000 138.965409 8.700000 13.700000 141.309110 8.700000 13.800000 143.672811 8.700000 13.900000 146.056512 8.700000 14.000000 148.460213 8.700000 14.100000 150.883914 8.700000 14.200000 153.327615 8.700000 14.300000 155.791315 8.700000 14.400000 158.275016 8.700000 14.500000 160.778717 8.700000 14.600000 163.302418 8.700000 14.700000 165.846119 8.700000 14.800000 168.409820 8.700000 14.900000 170.993521 8.700000 15.000000 173.597222 8.800000 -5.000000 51.189584 8.800000 -4.900000 49.799901 8.800000 -4.800000 48.430218 8.800000 -4.700000 47.080536 8.800000 -4.600000 45.750853 8.800000 -4.500000 44.441170 8.800000 -4.400000 43.151488 8.800000 -4.300000 41.881805 8.800000 -4.200000 40.632122 8.800000 -4.100000 39.402439 8.800000 -4.000000 38.192757 8.800000 -3.900000 37.003074 8.800000 -3.800000 35.833391 8.800000 -3.700000 34.683709 8.800000 -3.600000 33.554026 8.800000 -3.500000 32.444343 8.800000 -3.400000 31.354661 8.800000 -3.300000 30.284978 8.800000 -3.200000 29.235295 8.800000 -3.100000 28.205613 8.800000 -3.000000 27.195930 8.800000 -2.900000 26.206247 8.800000 -2.800000 25.236565 8.800000 -2.700000 24.286882 8.800000 -2.600000 23.357199 8.800000 -2.500000 22.447517 8.800000 -2.400000 21.557834 8.800000 -2.300000 20.688151 8.800000 -2.200000 19.838469 8.800000 -2.100000 19.008786 8.800000 -2.000000 18.199103 8.800000 -1.900000 17.409421 8.800000 -1.800000 16.639738 8.800000 -1.700000 15.890055 8.800000 -1.600000 15.160372 8.800000 -1.500000 14.450690 8.800000 -1.400000 13.761007 8.800000 -1.300000 13.091324 8.800000 -1.200000 12.441642 8.800000 -1.100000 11.811959 8.800000 -1.000000 11.202276 8.800000 -0.900000 10.612594 8.800000 -0.800000 10.042911 8.800000 -0.700000 9.493228 8.800000 -0.600000 8.963546 8.800000 -0.500000 8.453863 8.800000 -0.400000 7.964180 8.800000 -0.300000 7.494498 8.800000 -0.200000 7.044815 8.800000 -0.100000 6.615132 8.800000 -0.000000 6.205450 8.800000 0.100000 5.815767 8.800000 0.200000 5.446084 8.800000 0.300000 5.096402 8.800000 0.400000 4.766719 8.800000 0.500000 4.457036 8.800000 0.600000 4.167354 8.800000 0.700000 3.897671 8.800000 0.800000 3.647988 8.800000 0.900000 3.418306 8.800000 1.000000 3.208623 8.800000 1.100000 3.018940 8.800000 1.200000 2.849257 8.800000 1.300000 2.699575 8.800000 1.400000 2.569892 8.800000 1.500000 2.460209 8.800000 1.600000 2.370527 8.800000 1.700000 2.300844 8.800000 1.800000 2.251161 8.800000 1.900000 2.221479 8.800000 2.000000 2.211796 8.800000 2.100000 2.222113 8.800000 2.200000 2.252431 8.800000 2.300000 2.302748 8.800000 2.400000 2.373065 8.800000 2.500000 2.463383 8.800000 2.600000 2.573700 8.800000 2.700000 2.704017 8.800000 2.800000 2.854335 8.800000 2.900000 3.024652 8.800000 3.000000 3.214969 8.800000 3.100000 3.425287 8.800000 3.200000 3.655604 8.800000 3.300000 3.905921 8.800000 3.400000 4.176239 8.800000 3.500000 4.466556 8.800000 3.600000 4.776873 8.800000 3.700000 5.107190 8.800000 3.800000 5.457508 8.800000 3.900000 5.827825 8.800000 4.000000 6.218142 8.800000 4.100000 6.628460 8.800000 4.200000 7.058777 8.800000 4.300000 7.509094 8.800000 4.400000 7.979412 8.800000 4.500000 8.469729 8.800000 4.600000 8.980046 8.800000 4.700000 9.510364 8.800000 4.800000 10.060681 8.800000 4.900000 10.630998 8.800000 5.000000 11.221316 8.800000 5.100000 11.831633 8.800000 5.200000 12.461950 8.800000 5.300000 13.112268 8.800000 5.400000 13.782585 8.800000 5.500000 14.472902 8.800000 5.600000 15.183220 8.800000 5.700000 15.913537 8.800000 5.800000 16.663854 8.800000 5.900000 17.434172 8.800000 6.000000 18.224489 8.800000 6.100000 19.034806 8.800000 6.200000 19.865124 8.800000 6.300000 20.715441 8.800000 6.400000 21.585758 8.800000 6.500000 22.476075 8.800000 6.600000 23.386393 8.800000 6.700000 24.316710 8.800000 6.800000 25.267027 8.800000 6.900000 26.237345 8.800000 7.000000 27.227662 8.800000 7.100000 28.237979 8.800000 7.200000 29.268297 8.800000 7.300000 30.318614 8.800000 7.400000 31.388931 8.800000 7.500000 32.479249 8.800000 7.600000 33.589566 8.800000 7.700000 34.719883 8.800000 7.800000 35.870201 8.800000 7.900000 37.040518 8.800000 8.000000 38.230835 8.800000 8.100000 39.441153 8.800000 8.200000 40.671470 8.800000 8.300000 41.921787 8.800000 8.400000 43.192105 8.800000 8.500000 44.482422 8.800000 8.600000 45.792739 8.800000 8.700000 47.123057 8.800000 8.800000 48.473374 8.800000 8.900000 49.843691 8.800000 9.000000 51.234008 8.800000 9.100000 52.644326 8.800000 9.200000 54.074643 8.800000 9.300000 55.524960 8.800000 9.400000 56.995278 8.800000 9.500000 58.485595 8.800000 9.600000 59.995912 8.800000 9.700000 61.526230 8.800000 9.800000 63.076547 8.800000 9.900000 64.646864 8.800000 10.000000 66.237182 8.800000 10.100000 67.847499 8.800000 10.200000 69.477816 8.800000 10.300000 71.128134 8.800000 10.400000 72.798451 8.800000 10.500000 74.488768 8.800000 10.600000 76.199086 8.800000 10.700000 77.929403 8.800000 10.800000 79.679720 8.800000 10.900000 81.450038 8.800000 11.000000 83.240355 8.800000 11.100000 85.050672 8.800000 11.200000 86.880990 8.800000 11.300000 88.731307 8.800000 11.400000 90.601624 8.800000 11.500000 92.491942 8.800000 11.600000 94.402259 8.800000 11.700000 96.332576 8.800000 11.800000 98.282893 8.800000 11.900000 100.253211 8.800000 12.000000 102.243528 8.800000 12.100000 104.253845 8.800000 12.200000 106.284163 8.800000 12.300000 108.334480 8.800000 12.400000 110.404797 8.800000 12.500000 112.495115 8.800000 12.600000 114.605432 8.800000 12.700000 116.735749 8.800000 12.800000 118.886067 8.800000 12.900000 121.056384 8.800000 13.000000 123.246701 8.800000 13.100000 125.457019 8.800000 13.200000 127.687336 8.800000 13.300000 129.937653 8.800000 13.400000 132.207971 8.800000 13.500000 134.498288 8.800000 13.600000 136.808605 8.800000 13.700000 139.138923 8.800000 13.800000 141.489240 8.800000 13.900000 143.859557 8.800000 14.000000 146.249875 8.800000 14.100000 148.660192 8.800000 14.200000 151.090509 8.800000 14.300000 153.540826 8.800000 14.400000 156.011144 8.800000 14.500000 158.501461 8.800000 14.600000 161.011778 8.800000 14.700000 163.542096 8.800000 14.800000 166.092413 8.800000 14.900000 168.662730 8.800000 15.000000 171.253048 8.900000 -5.000000 51.645417 8.900000 -4.900000 50.241834 8.900000 -4.800000 48.858251 8.900000 -4.700000 47.494668 8.900000 -4.600000 46.151085 8.900000 -4.500000 44.827502 8.900000 -4.400000 43.523919 8.900000 -4.300000 42.240336 8.900000 -4.200000 40.976753 8.900000 -4.100000 39.733170 8.900000 -4.000000 38.509586 8.900000 -3.900000 37.306003 8.900000 -3.800000 36.122420 8.900000 -3.700000 34.958837 8.900000 -3.600000 33.815254 8.900000 -3.500000 32.691671 8.900000 -3.400000 31.588088 8.900000 -3.300000 30.504505 8.900000 -3.200000 29.440922 8.900000 -3.100000 28.397339 8.900000 -3.000000 27.373756 8.900000 -2.900000 26.370173 8.900000 -2.800000 25.386590 8.900000 -2.700000 24.423007 8.900000 -2.600000 23.479424 8.900000 -2.500000 22.555841 8.900000 -2.400000 21.652258 8.900000 -2.300000 20.768675 8.900000 -2.200000 19.905092 8.900000 -2.100000 19.061509 8.900000 -2.000000 18.237926 8.900000 -1.900000 17.434343 8.900000 -1.800000 16.650760 8.900000 -1.700000 15.887177 8.900000 -1.600000 15.143594 8.900000 -1.500000 14.420011 8.900000 -1.400000 13.716428 8.900000 -1.300000 13.032845 8.900000 -1.200000 12.369262 8.900000 -1.100000 11.725679 8.900000 -1.000000 11.102096 8.900000 -0.900000 10.498513 8.900000 -0.800000 9.914930 8.900000 -0.700000 9.351347 8.900000 -0.600000 8.807764 8.900000 -0.500000 8.284181 8.900000 -0.400000 7.780598 8.900000 -0.300000 7.297015 8.900000 -0.200000 6.833432 8.900000 -0.100000 6.389849 8.900000 -0.000000 5.966266 8.900000 0.100000 5.562683 8.900000 0.200000 5.179100 8.900000 0.300000 4.815517 8.900000 0.400000 4.471934 8.900000 0.500000 4.148351 8.900000 0.600000 3.844768 8.900000 0.700000 3.561185 8.900000 0.800000 3.297602 8.900000 0.900000 3.054019 8.900000 1.000000 2.830436 8.900000 1.100000 2.626853 8.900000 1.200000 2.443270 8.900000 1.300000 2.279687 8.900000 1.400000 2.136104 8.900000 1.500000 2.012521 8.900000 1.600000 1.908938 8.900000 1.700000 1.825355 8.900000 1.800000 1.761772 8.900000 1.900000 1.718189 8.900000 2.000000 1.694606 8.900000 2.100000 1.691023 8.900000 2.200000 1.707440 8.900000 2.300000 1.743857 8.900000 2.400000 1.800274 8.900000 2.500000 1.876691 8.900000 2.600000 1.973108 8.900000 2.700000 2.089525 8.900000 2.800000 2.225942 8.900000 2.900000 2.382359 8.900000 3.000000 2.558776 8.900000 3.100000 2.755193 8.900000 3.200000 2.971610 8.900000 3.300000 3.208027 8.900000 3.400000 3.464444 8.900000 3.500000 3.740861 8.900000 3.600000 4.037278 8.900000 3.700000 4.353695 8.900000 3.800000 4.690112 8.900000 3.900000 5.046529 8.900000 4.000000 5.422946 8.900000 4.100000 5.819363 8.900000 4.200000 6.235780 8.900000 4.300000 6.672197 8.900000 4.400000 7.128614 8.900000 4.500000 7.605031 8.900000 4.600000 8.101448 8.900000 4.700000 8.617865 8.900000 4.800000 9.154282 8.900000 4.900000 9.710699 8.900000 5.000000 10.287116 8.900000 5.100000 10.883533 8.900000 5.200000 11.499950 8.900000 5.300000 12.136367 8.900000 5.400000 12.792784 8.900000 5.500000 13.469201 8.900000 5.600000 14.165618 8.900000 5.700000 14.882035 8.900000 5.800000 15.618452 8.900000 5.900000 16.374869 8.900000 6.000000 17.151286 8.900000 6.100000 17.947703 8.900000 6.200000 18.764120 8.900000 6.300000 19.600537 8.900000 6.400000 20.456954 8.900000 6.500000 21.333371 8.900000 6.600000 22.229788 8.900000 6.700000 23.146205 8.900000 6.800000 24.082622 8.900000 6.900000 25.039039 8.900000 7.000000 26.015456 8.900000 7.100000 27.011873 8.900000 7.200000 28.028290 8.900000 7.300000 29.064707 8.900000 7.400000 30.121124 8.900000 7.500000 31.197541 8.900000 7.600000 32.293958 8.900000 7.700000 33.410375 8.900000 7.800000 34.546792 8.900000 7.900000 35.703209 8.900000 8.000000 36.879626 8.900000 8.100000 38.076043 8.900000 8.200000 39.292460 8.900000 8.300000 40.528877 8.900000 8.400000 41.785294 8.900000 8.500000 43.061711 8.900000 8.600000 44.358128 8.900000 8.700000 45.674545 8.900000 8.800000 47.010962 8.900000 8.900000 48.367379 8.900000 9.000000 49.743796 8.900000 9.100000 51.140213 8.900000 9.200000 52.556630 8.900000 9.300000 53.993047 8.900000 9.400000 55.449464 8.900000 9.500000 56.925881 8.900000 9.600000 58.422298 8.900000 9.700000 59.938715 8.900000 9.800000 61.475132 8.900000 9.900000 63.031549 8.900000 10.000000 64.607966 8.900000 10.100000 66.204383 8.900000 10.200000 67.820800 8.900000 10.300000 69.457217 8.900000 10.400000 71.113634 8.900000 10.500000 72.790051 8.900000 10.600000 74.486468 8.900000 10.700000 76.202884 8.900000 10.800000 77.939301 8.900000 10.900000 79.695718 8.900000 11.000000 81.472135 8.900000 11.100000 83.268552 8.900000 11.200000 85.084969 8.900000 11.300000 86.921386 8.900000 11.400000 88.777803 8.900000 11.500000 90.654220 8.900000 11.600000 92.550637 8.900000 11.700000 94.467054 8.900000 11.800000 96.403471 8.900000 11.900000 98.359888 8.900000 12.000000 100.336305 8.900000 12.100000 102.332722 8.900000 12.200000 104.349139 8.900000 12.300000 106.385556 8.900000 12.400000 108.441973 8.900000 12.500000 110.518390 8.900000 12.600000 112.614807 8.900000 12.700000 114.731224 8.900000 12.800000 116.867641 8.900000 12.900000 119.024058 8.900000 13.000000 121.200475 8.900000 13.100000 123.396892 8.900000 13.200000 125.613309 8.900000 13.300000 127.849726 8.900000 13.400000 130.106143 8.900000 13.500000 132.382560 8.900000 13.600000 134.678977 8.900000 13.700000 136.995394 8.900000 13.800000 139.331811 8.900000 13.900000 141.688228 8.900000 14.000000 144.064645 8.900000 14.100000 146.461062 8.900000 14.200000 148.877479 8.900000 14.300000 151.313896 8.900000 14.400000 153.770313 8.900000 14.500000 156.246730 8.900000 14.600000 158.743147 8.900000 14.700000 161.259564 8.900000 14.800000 163.795981 8.900000 14.900000 166.352398 8.900000 15.000000 168.928815 9.000000 -5.000000 52.230830 9.000000 -4.900000 50.812830 9.000000 -4.800000 49.414830 9.000000 -4.700000 48.036830 9.000000 -4.600000 46.678829 9.000000 -4.500000 45.340829 9.000000 -4.400000 44.022829 9.000000 -4.300000 42.724829 9.000000 -4.200000 41.446829 9.000000 -4.100000 40.188829 9.000000 -4.000000 38.950829 9.000000 -3.900000 37.732829 9.000000 -3.800000 36.534829 9.000000 -3.700000 35.356829 9.000000 -3.600000 34.198829 9.000000 -3.500000 33.060829 9.000000 -3.400000 31.942829 9.000000 -3.300000 30.844829 9.000000 -3.200000 29.766828 9.000000 -3.100000 28.708828 9.000000 -3.000000 27.670828 9.000000 -2.900000 26.652828 9.000000 -2.800000 25.654828 9.000000 -2.700000 24.676828 9.000000 -2.600000 23.718828 9.000000 -2.500000 22.780828 9.000000 -2.400000 21.862828 9.000000 -2.300000 20.964828 9.000000 -2.200000 20.086828 9.000000 -2.100000 19.228828 9.000000 -2.000000 18.390828 9.000000 -1.900000 17.572828 9.000000 -1.800000 16.774827 9.000000 -1.700000 15.996827 9.000000 -1.600000 15.238827 9.000000 -1.500000 14.500827 9.000000 -1.400000 13.782827 9.000000 -1.300000 13.084827 9.000000 -1.200000 12.406827 9.000000 -1.100000 11.748827 9.000000 -1.000000 11.110827 9.000000 -0.900000 10.492827 9.000000 -0.800000 9.894827 9.000000 -0.700000 9.316827 9.000000 -0.600000 8.758827 9.000000 -0.500000 8.220827 9.000000 -0.400000 7.702826 9.000000 -0.300000 7.204826 9.000000 -0.200000 6.726826 9.000000 -0.100000 6.268826 9.000000 -0.000000 5.830826 9.000000 0.100000 5.412826 9.000000 0.200000 5.014826 9.000000 0.300000 4.636826 9.000000 0.400000 4.278826 9.000000 0.500000 3.940826 9.000000 0.600000 3.622826 9.000000 0.700000 3.324826 9.000000 0.800000 3.046826 9.000000 0.900000 2.788825 9.000000 1.000000 2.550825 9.000000 1.100000 2.332825 9.000000 1.200000 2.134825 9.000000 1.300000 1.956825 9.000000 1.400000 1.798825 9.000000 1.500000 1.660825 9.000000 1.600000 1.542825 9.000000 1.700000 1.444825 9.000000 1.800000 1.366825 9.000000 1.900000 1.308825 9.000000 2.000000 1.270825 9.000000 2.100000 1.252825 9.000000 2.200000 1.254825 9.000000 2.300000 1.276824 9.000000 2.400000 1.318824 9.000000 2.500000 1.380824 9.000000 2.600000 1.462824 9.000000 2.700000 1.564824 9.000000 2.800000 1.686824 9.000000 2.900000 1.828824 9.000000 3.000000 1.990824 9.000000 3.100000 2.172824 9.000000 3.200000 2.374824 9.000000 3.300000 2.596824 9.000000 3.400000 2.838824 9.000000 3.500000 3.100824 9.000000 3.600000 3.382824 9.000000 3.700000 3.684823 9.000000 3.800000 4.006823 9.000000 3.900000 4.348823 9.000000 4.000000 4.710823 9.000000 4.100000 5.092823 9.000000 4.200000 5.494823 9.000000 4.300000 5.916823 9.000000 4.400000 6.358823 9.000000 4.500000 6.820823 9.000000 4.600000 7.302823 9.000000 4.700000 7.804823 9.000000 4.800000 8.326823 9.000000 4.900000 8.868823 9.000000 5.000000 9.430823 9.000000 5.100000 10.012822 9.000000 5.200000 10.614822 9.000000 5.300000 11.236822 9.000000 5.400000 11.878822 9.000000 5.500000 12.540822 9.000000 5.600000 13.222822 9.000000 5.700000 13.924822 9.000000 5.800000 14.646822 9.000000 5.900000 15.388822 9.000000 6.000000 16.150822 9.000000 6.100000 16.932822 9.000000 6.200000 17.734822 9.000000 6.300000 18.556822 9.000000 6.400000 19.398822 9.000000 6.500000 20.260821 9.000000 6.600000 21.142821 9.000000 6.700000 22.044821 9.000000 6.800000 22.966821 9.000000 6.900000 23.908821 9.000000 7.000000 24.870821 9.000000 7.100000 25.852821 9.000000 7.200000 26.854821 9.000000 7.300000 27.876821 9.000000 7.400000 28.918821 9.000000 7.500000 29.980821 9.000000 7.600000 31.062821 9.000000 7.700000 32.164821 9.000000 7.800000 33.286820 9.000000 7.900000 34.428820 9.000000 8.000000 35.590820 9.000000 8.100000 36.772820 9.000000 8.200000 37.974820 9.000000 8.300000 39.196820 9.000000 8.400000 40.438820 9.000000 8.500000 41.700820 9.000000 8.600000 42.982820 9.000000 8.700000 44.284820 9.000000 8.800000 45.606820 9.000000 8.900000 46.948820 9.000000 9.000000 48.310820 9.000000 9.100000 49.692820 9.000000 9.200000 51.094819 9.000000 9.300000 52.516819 9.000000 9.400000 53.958819 9.000000 9.500000 55.420819 9.000000 9.600000 56.902819 9.000000 9.700000 58.404819 9.000000 9.800000 59.926819 9.000000 9.900000 61.468819 9.000000 10.000000 63.030819 9.000000 10.100000 64.612819 9.000000 10.200000 66.214819 9.000000 10.300000 67.836819 9.000000 10.400000 69.478819 9.000000 10.500000 71.140819 9.000000 10.600000 72.822818 9.000000 10.700000 74.524818 9.000000 10.800000 76.246818 9.000000 10.900000 77.988818 9.000000 11.000000 79.750818 9.000000 11.100000 81.532818 9.000000 11.200000 83.334818 9.000000 11.300000 85.156818 9.000000 11.400000 86.998818 9.000000 11.500000 88.860818 9.000000 11.600000 90.742818 9.000000 11.700000 92.644818 9.000000 11.800000 94.566818 9.000000 11.900000 96.508818 9.000000 12.000000 98.470817 9.000000 12.100000 100.452817 9.000000 12.200000 102.454817 9.000000 12.300000 104.476817 9.000000 12.400000 106.518817 9.000000 12.500000 108.580817 9.000000 12.600000 110.662817 9.000000 12.700000 112.764817 9.000000 12.800000 114.886817 9.000000 12.900000 117.028817 9.000000 13.000000 119.190817 9.000000 13.100000 121.372817 9.000000 13.200000 123.574817 9.000000 13.300000 125.796817 9.000000 13.400000 128.038816 9.000000 13.500000 130.300816 9.000000 13.600000 132.582816 9.000000 13.700000 134.884816 9.000000 13.800000 137.206816 9.000000 13.900000 139.548816 9.000000 14.000000 141.910816 9.000000 14.100000 144.292816 9.000000 14.200000 146.694816 9.000000 14.300000 149.116816 9.000000 14.400000 151.558816 9.000000 14.500000 154.020816 9.000000 14.600000 156.502816 9.000000 14.700000 159.004815 9.000000 14.800000 161.526815 9.000000 14.900000 164.068815 9.000000 15.000000 166.630815 9.100000 -5.000000 52.951325 9.100000 -4.900000 51.518391 9.100000 -4.800000 50.105457 9.100000 -4.700000 48.712523 9.100000 -4.600000 47.339589 9.100000 -4.500000 45.986655 9.100000 -4.400000 44.653721 9.100000 -4.300000 43.340788 9.100000 -4.200000 42.047854 9.100000 -4.100000 40.774920 9.100000 -4.000000 39.521986 9.100000 -3.900000 38.289052 9.100000 -3.800000 37.076118 9.100000 -3.700000 35.883184 9.100000 -3.600000 34.710250 9.100000 -3.500000 33.557317 9.100000 -3.400000 32.424383 9.100000 -3.300000 31.311449 9.100000 -3.200000 30.218515 9.100000 -3.100000 29.145581 9.100000 -3.000000 28.092647 9.100000 -2.900000 27.059713 9.100000 -2.800000 26.046779 9.100000 -2.700000 25.053846 9.100000 -2.600000 24.080912 9.100000 -2.500000 23.127978 9.100000 -2.400000 22.195044 9.100000 -2.300000 21.282110 9.100000 -2.200000 20.389176 9.100000 -2.100000 19.516242 9.100000 -2.000000 18.663308 9.100000 -1.900000 17.830375 9.100000 -1.800000 17.017441 9.100000 -1.700000 16.224507 9.100000 -1.600000 15.451573 9.100000 -1.500000 14.698639 9.100000 -1.400000 13.965705 9.100000 -1.300000 13.252771 9.100000 -1.200000 12.559837 9.100000 -1.100000 11.886904 9.100000 -1.000000 11.233970 9.100000 -0.900000 10.601036 9.100000 -0.800000 9.988102 9.100000 -0.700000 9.395168 9.100000 -0.600000 8.822234 9.100000 -0.500000 8.269300 9.100000 -0.400000 7.736366 9.100000 -0.300000 7.223433 9.100000 -0.200000 6.730499 9.100000 -0.100000 6.257565 9.100000 -0.000000 5.804631 9.100000 0.100000 5.371697 9.100000 0.200000 4.958763 9.100000 0.300000 4.565829 9.100000 0.400000 4.192895 9.100000 0.500000 3.839962 9.100000 0.600000 3.507028 9.100000 0.700000 3.194094 9.100000 0.800000 2.901160 9.100000 0.900000 2.628226 9.100000 1.000000 2.375292 9.100000 1.100000 2.142358 9.100000 1.200000 1.929424 9.100000 1.300000 1.736490 9.100000 1.400000 1.563557 9.100000 1.500000 1.410623 9.100000 1.600000 1.277689 9.100000 1.700000 1.164755 9.100000 1.800000 1.071821 9.100000 1.900000 0.998887 9.100000 2.000000 0.945953 9.100000 2.100000 0.913019 9.100000 2.200000 0.900086 9.100000 2.300000 0.907152 9.100000 2.400000 0.934218 9.100000 2.500000 0.981284 9.100000 2.600000 1.048350 9.100000 2.700000 1.135416 9.100000 2.800000 1.242482 9.100000 2.900000 1.369548 9.100000 3.000000 1.516615 9.100000 3.100000 1.683681 9.100000 3.200000 1.870747 9.100000 3.300000 2.077813 9.100000 3.400000 2.304879 9.100000 3.500000 2.551945 9.100000 3.600000 2.819011 9.100000 3.700000 3.106077 9.100000 3.800000 3.413144 9.100000 3.900000 3.740210 9.100000 4.000000 4.087276 9.100000 4.100000 4.454342 9.100000 4.200000 4.841408 9.100000 4.300000 5.248474 9.100000 4.400000 5.675540 9.100000 4.500000 6.122606 9.100000 4.600000 6.589673 9.100000 4.700000 7.076739 9.100000 4.800000 7.583805 9.100000 4.900000 8.110871 9.100000 5.000000 8.657937 9.100000 5.100000 9.225003 9.100000 5.200000 9.812069 9.100000 5.300000 10.419135 9.100000 5.400000 11.046202 9.100000 5.500000 11.693268 9.100000 5.600000 12.360334 9.100000 5.700000 13.047400 9.100000 5.800000 13.754466 9.100000 5.900000 14.481532 9.100000 6.000000 15.228598 9.100000 6.100000 15.995664 9.100000 6.200000 16.782731 9.100000 6.300000 17.589797 9.100000 6.400000 18.416863 9.100000 6.500000 19.263929 9.100000 6.600000 20.130995 9.100000 6.700000 21.018061 9.100000 6.800000 21.925127 9.100000 6.900000 22.852193 9.100000 7.000000 23.799260 9.100000 7.100000 24.766326 9.100000 7.200000 25.753392 9.100000 7.300000 26.760458 9.100000 7.400000 27.787524 9.100000 7.500000 28.834590 9.100000 7.600000 29.901656 9.100000 7.700000 30.988722 9.100000 7.800000 32.095789 9.100000 7.900000 33.222855 9.100000 8.000000 34.369921 9.100000 8.100000 35.536987 9.100000 8.200000 36.724053 9.100000 8.300000 37.931119 9.100000 8.400000 39.158185 9.100000 8.500000 40.405251 9.100000 8.600000 41.672318 9.100000 8.700000 42.959384 9.100000 8.800000 44.266450 9.100000 8.900000 45.593516 9.100000 9.000000 46.940582 9.100000 9.100000 48.307648 9.100000 9.200000 49.694714 9.100000 9.300000 51.101780 9.100000 9.400000 52.528847 9.100000 9.500000 53.975913 9.100000 9.600000 55.442979 9.100000 9.700000 56.930045 9.100000 9.800000 58.437111 9.100000 9.900000 59.964177 9.100000 10.000000 61.511243 9.100000 10.100000 63.078309 9.100000 10.200000 64.665376 9.100000 10.300000 66.272442 9.100000 10.400000 67.899508 9.100000 10.500000 69.546574 9.100000 10.600000 71.213640 9.100000 10.700000 72.900706 9.100000 10.800000 74.607772 9.100000 10.900000 76.334838 9.100000 11.000000 78.081905 9.100000 11.100000 79.848971 9.100000 11.200000 81.636037 9.100000 11.300000 83.443103 9.100000 11.400000 85.270169 9.100000 11.500000 87.117235 9.100000 11.600000 88.984301 9.100000 11.700000 90.871367 9.100000 11.800000 92.778434 9.100000 11.900000 94.705500 9.100000 12.000000 96.652566 9.100000 12.100000 98.619632 9.100000 12.200000 100.606698 9.100000 12.300000 102.613764 9.100000 12.400000 104.640830 9.100000 12.500000 106.687896 9.100000 12.600000 108.754962 9.100000 12.700000 110.842029 9.100000 12.800000 112.949095 9.100000 12.900000 115.076161 9.100000 13.000000 117.223227 9.100000 13.100000 119.390293 9.100000 13.200000 121.577359 9.100000 13.300000 123.784425 9.100000 13.400000 126.011491 9.100000 13.500000 128.258558 9.100000 13.600000 130.525624 9.100000 13.700000 132.812690 9.100000 13.800000 135.119756 9.100000 13.900000 137.446822 9.100000 14.000000 139.793888 9.100000 14.100000 142.160954 9.100000 14.200000 144.548020 9.100000 14.300000 146.955087 9.100000 14.400000 149.382153 9.100000 14.500000 151.829219 9.100000 14.600000 154.296285 9.100000 14.700000 156.783351 9.100000 14.800000 159.290417 9.100000 14.900000 161.817483 9.100000 15.000000 164.364549 9.200000 -5.000000 53.811569 9.200000 -4.900000 52.363185 9.200000 -4.800000 50.934801 9.200000 -4.700000 49.526416 9.200000 -4.600000 48.138032 9.200000 -4.500000 46.769647 9.200000 -4.400000 45.421263 9.200000 -4.300000 44.092879 9.200000 -4.200000 42.784494 9.200000 -4.100000 41.496110 9.200000 -4.000000 40.227725 9.200000 -3.900000 38.979341 9.200000 -3.800000 37.750956 9.200000 -3.700000 36.542572 9.200000 -3.600000 35.354188 9.200000 -3.500000 34.185803 9.200000 -3.400000 33.037419 9.200000 -3.300000 31.909034 9.200000 -3.200000 30.800650 9.200000 -3.100000 29.712266 9.200000 -3.000000 28.643881 9.200000 -2.900000 27.595497 9.200000 -2.800000 26.567112 9.200000 -2.700000 25.558728 9.200000 -2.600000 24.570343 9.200000 -2.500000 23.601959 9.200000 -2.400000 22.653575 9.200000 -2.300000 21.725190 9.200000 -2.200000 20.816806 9.200000 -2.100000 19.928421 9.200000 -2.000000 19.060037 9.200000 -1.900000 18.211653 9.200000 -1.800000 17.383268 9.200000 -1.700000 16.574884 9.200000 -1.600000 15.786499 9.200000 -1.500000 15.018115 9.200000 -1.400000 14.269730 9.200000 -1.300000 13.541346 9.200000 -1.200000 12.832962 9.200000 -1.100000 12.144577 9.200000 -1.000000 11.476193 9.200000 -0.900000 10.827808 9.200000 -0.800000 10.199424 9.200000 -0.700000 9.591040 9.200000 -0.600000 9.002655 9.200000 -0.500000 8.434271 9.200000 -0.400000 7.885886 9.200000 -0.300000 7.357502 9.200000 -0.200000 6.849117 9.200000 -0.100000 6.360733 9.200000 -0.000000 5.892349 9.200000 0.100000 5.443964 9.200000 0.200000 5.015580 9.200000 0.300000 4.607195 9.200000 0.400000 4.218811 9.200000 0.500000 3.850427 9.200000 0.600000 3.502042 9.200000 0.700000 3.173658 9.200000 0.800000 2.865273 9.200000 0.900000 2.576889 9.200000 1.000000 2.308504 9.200000 1.100000 2.060120 9.200000 1.200000 1.831736 9.200000 1.300000 1.623351 9.200000 1.400000 1.434967 9.200000 1.500000 1.266582 9.200000 1.600000 1.118198 9.200000 1.700000 0.989813 9.200000 1.800000 0.881429 9.200000 1.900000 0.793045 9.200000 2.000000 0.724660 9.200000 2.100000 0.676276 9.200000 2.200000 0.647891 9.200000 2.300000 0.639507 9.200000 2.400000 0.651123 9.200000 2.500000 0.682738 9.200000 2.600000 0.734354 9.200000 2.700000 0.805969 9.200000 2.800000 0.897585 9.200000 2.900000 1.009200 9.200000 3.000000 1.140816 9.200000 3.100000 1.292432 9.200000 3.200000 1.464047 9.200000 3.300000 1.655663 9.200000 3.400000 1.867278 9.200000 3.500000 2.098894 9.200000 3.600000 2.350510 9.200000 3.700000 2.622125 9.200000 3.800000 2.913741 9.200000 3.900000 3.225356 9.200000 4.000000 3.556972 9.200000 4.100000 3.908587 9.200000 4.200000 4.280203 9.200000 4.300000 4.671819 9.200000 4.400000 5.083434 9.200000 4.500000 5.515050 9.200000 4.600000 5.966665 9.200000 4.700000 6.438281 9.200000 4.800000 6.929897 9.200000 4.900000 7.441512 9.200000 5.000000 7.973128 9.200000 5.100000 8.524743 9.200000 5.200000 9.096359 9.200000 5.300000 9.687974 9.200000 5.400000 10.299590 9.200000 5.500000 10.931206 9.200000 5.600000 11.582821 9.200000 5.700000 12.254437 9.200000 5.800000 12.946052 9.200000 5.900000 13.657668 9.200000 6.000000 14.389284 9.200000 6.100000 15.140899 9.200000 6.200000 15.912515 9.200000 6.300000 16.704130 9.200000 6.400000 17.515746 9.200000 6.500000 18.347361 9.200000 6.600000 19.198977 9.200000 6.700000 20.070593 9.200000 6.800000 20.962208 9.200000 6.900000 21.873824 9.200000 7.000000 22.805439 9.200000 7.100000 23.757055 9.200000 7.200000 24.728671 9.200000 7.300000 25.720286 9.200000 7.400000 26.731902 9.200000 7.500000 27.763517 9.200000 7.600000 28.815133 9.200000 7.700000 29.886748 9.200000 7.800000 30.978364 9.200000 7.900000 32.089980 9.200000 8.000000 33.221595 9.200000 8.100000 34.373211 9.200000 8.200000 35.544826 9.200000 8.300000 36.736442 9.200000 8.400000 37.948057 9.200000 8.500000 39.179673 9.200000 8.600000 40.431289 9.200000 8.700000 41.702904 9.200000 8.800000 42.994520 9.200000 8.900000 44.306135 9.200000 9.000000 45.637751 9.200000 9.100000 46.989367 9.200000 9.200000 48.360982 9.200000 9.300000 49.752598 9.200000 9.400000 51.164213 9.200000 9.500000 52.595829 9.200000 9.600000 54.047444 9.200000 9.700000 55.519060 9.200000 9.800000 57.010676 9.200000 9.900000 58.522291 9.200000 10.000000 60.053907 9.200000 10.100000 61.605522 9.200000 10.200000 63.177138 9.200000 10.300000 64.768754 9.200000 10.400000 66.380369 9.200000 10.500000 68.011985 9.200000 10.600000 69.663600 9.200000 10.700000 71.335216 9.200000 10.800000 73.026831 9.200000 10.900000 74.738447 9.200000 11.000000 76.470063 9.200000 11.100000 78.221678 9.200000 11.200000 79.993294 9.200000 11.300000 81.784909 9.200000 11.400000 83.596525 9.200000 11.500000 85.428141 9.200000 11.600000 87.279756 9.200000 11.700000 89.151372 9.200000 11.800000 91.042987 9.200000 11.900000 92.954603 9.200000 12.000000 94.886218 9.200000 12.100000 96.837834 9.200000 12.200000 98.809450 9.200000 12.300000 100.801065 9.200000 12.400000 102.812681 9.200000 12.500000 104.844296 9.200000 12.600000 106.895912 9.200000 12.700000 108.967528 9.200000 12.800000 111.059143 9.200000 12.900000 113.170759 9.200000 13.000000 115.302374 9.200000 13.100000 117.453990 9.200000 13.200000 119.625605 9.200000 13.300000 121.817221 9.200000 13.400000 124.028837 9.200000 13.500000 126.260452 9.200000 13.600000 128.512068 9.200000 13.700000 130.783683 9.200000 13.800000 133.075299 9.200000 13.900000 135.386915 9.200000 14.000000 137.718530 9.200000 14.100000 140.070146 9.200000 14.200000 142.441761 9.200000 14.300000 144.833377 9.200000 14.400000 147.244992 9.200000 14.500000 149.676608 9.200000 14.600000 152.128224 9.200000 14.700000 154.599839 9.200000 14.800000 157.091455 9.200000 14.900000 159.603070 9.200000 15.000000 162.134686 9.300000 -5.000000 54.815364 9.300000 -4.900000 53.351012 9.300000 -4.800000 51.906660 9.300000 -4.700000 50.482309 9.300000 -4.600000 49.077957 9.300000 -4.500000 47.693605 9.300000 -4.400000 46.329254 9.300000 -4.300000 44.984902 9.300000 -4.200000 43.660550 9.300000 -4.100000 42.356199 9.300000 -4.000000 41.071847 9.300000 -3.900000 39.807495 9.300000 -3.800000 38.563143 9.300000 -3.700000 37.338792 9.300000 -3.600000 36.134440 9.300000 -3.500000 34.950088 9.300000 -3.400000 33.785737 9.300000 -3.300000 32.641385 9.300000 -3.200000 31.517033 9.300000 -3.100000 30.412682 9.300000 -3.000000 29.328330 9.300000 -2.900000 28.263978 9.300000 -2.800000 27.219627 9.300000 -2.700000 26.195275 9.300000 -2.600000 25.190923 9.300000 -2.500000 24.206571 9.300000 -2.400000 23.242220 9.300000 -2.300000 22.297868 9.300000 -2.200000 21.373516 9.300000 -2.100000 20.469165 9.300000 -2.000000 19.584813 9.300000 -1.900000 18.720461 9.300000 -1.800000 17.876110 9.300000 -1.700000 17.051758 9.300000 -1.600000 16.247406 9.300000 -1.500000 15.463054 9.300000 -1.400000 14.698703 9.300000 -1.300000 13.954351 9.300000 -1.200000 13.229999 9.300000 -1.100000 12.525648 9.300000 -1.000000 11.841296 9.300000 -0.900000 11.176944 9.300000 -0.800000 10.532593 9.300000 -0.700000 9.908241 9.300000 -0.600000 9.303889 9.300000 -0.500000 8.719537 9.300000 -0.400000 8.155186 9.300000 -0.300000 7.610834 9.300000 -0.200000 7.086482 9.300000 -0.100000 6.582131 9.300000 -0.000000 6.097779 9.300000 0.100000 5.633427 9.300000 0.200000 5.189076 9.300000 0.300000 4.764724 9.300000 0.400000 4.360372 9.300000 0.500000 3.976020 9.300000 0.600000 3.611669 9.300000 0.700000 3.267317 9.300000 0.800000 2.942965 9.300000 0.900000 2.638614 9.300000 1.000000 2.354262 9.300000 1.100000 2.089910 9.300000 1.200000 1.845559 9.300000 1.300000 1.621207 9.300000 1.400000 1.416855 9.300000 1.500000 1.232504 9.300000 1.600000 1.068152 9.300000 1.700000 0.923800 9.300000 1.800000 0.799448 9.300000 1.900000 0.695097 9.300000 2.000000 0.610745 9.300000 2.100000 0.546393 9.300000 2.200000 0.502042 9.300000 2.300000 0.477690 9.300000 2.400000 0.473338 9.300000 2.500000 0.488987 9.300000 2.600000 0.524635 9.300000 2.700000 0.580283 9.300000 2.800000 0.655931 9.300000 2.900000 0.751580 9.300000 3.000000 0.867228 9.300000 3.100000 1.002876 9.300000 3.200000 1.158525 9.300000 3.300000 1.334173 9.300000 3.400000 1.529821 9.300000 3.500000 1.745470 9.300000 3.600000 1.981118 9.300000 3.700000 2.236766 9.300000 3.800000 2.512414 9.300000 3.900000 2.808063 9.300000 4.000000 3.123711 9.300000 4.100000 3.459359 9.300000 4.200000 3.815008 9.300000 4.300000 4.190656 9.300000 4.400000 4.586304 9.300000 4.500000 5.001953 9.300000 4.600000 5.437601 9.300000 4.700000 5.893249 9.300000 4.800000 6.368897 9.300000 4.900000 6.864546 9.300000 5.000000 7.380194 9.300000 5.100000 7.915842 9.300000 5.200000 8.471491 9.300000 5.300000 9.047139 9.300000 5.400000 9.642787 9.300000 5.500000 10.258436 9.300000 5.600000 10.894084 9.300000 5.700000 11.549732 9.300000 5.800000 12.225381 9.300000 5.900000 12.921029 9.300000 6.000000 13.636677 9.300000 6.100000 14.372325 9.300000 6.200000 15.127974 9.300000 6.300000 15.903622 9.300000 6.400000 16.699270 9.300000 6.500000 17.514919 9.300000 6.600000 18.350567 9.300000 6.700000 19.206215 9.300000 6.800000 20.081864 9.300000 6.900000 20.977512 9.300000 7.000000 21.893160 9.300000 7.100000 22.828808 9.300000 7.200000 23.784457 9.300000 7.300000 24.760105 9.300000 7.400000 25.755753 9.300000 7.500000 26.771402 9.300000 7.600000 27.807050 9.300000 7.700000 28.862698 9.300000 7.800000 29.938347 9.300000 7.900000 31.033995 9.300000 8.000000 32.149643 9.300000 8.100000 33.285291 9.300000 8.200000 34.440940 9.300000 8.300000 35.616588 9.300000 8.400000 36.812236 9.300000 8.500000 38.027885 9.300000 8.600000 39.263533 9.300000 8.700000 40.519181 9.300000 8.800000 41.794830 9.300000 8.900000 43.090478 9.300000 9.000000 44.406126 9.300000 9.100000 45.741774 9.300000 9.200000 47.097423 9.300000 9.300000 48.473071 9.300000 9.400000 49.868719 9.300000 9.500000 51.284368 9.300000 9.600000 52.720016 9.300000 9.700000 54.175664 9.300000 9.800000 55.651313 9.300000 9.900000 57.146961 9.300000 10.000000 58.662609 9.300000 10.100000 60.198258 9.300000 10.200000 61.753906 9.300000 10.300000 63.329554 9.300000 10.400000 64.925202 9.300000 10.500000 66.540851 9.300000 10.600000 68.176499 9.300000 10.700000 69.832147 9.300000 10.800000 71.507796 9.300000 10.900000 73.203444 9.300000 11.000000 74.919092 9.300000 11.100000 76.654741 9.300000 11.200000 78.410389 9.300000 11.300000 80.186037 9.300000 11.400000 81.981685 9.300000 11.500000 83.797334 9.300000 11.600000 85.632982 9.300000 11.700000 87.488630 9.300000 11.800000 89.364279 9.300000 11.900000 91.259927 9.300000 12.000000 93.175575 9.300000 12.100000 95.111224 9.300000 12.200000 97.066872 9.300000 12.300000 99.042520 9.300000 12.400000 101.038168 9.300000 12.500000 103.053817 9.300000 12.600000 105.089465 9.300000 12.700000 107.145113 9.300000 12.800000 109.220762 9.300000 12.900000 111.316410 9.300000 13.000000 113.432058 9.300000 13.100000 115.567707 9.300000 13.200000 117.723355 9.300000 13.300000 119.899003 9.300000 13.400000 122.094651 9.300000 13.500000 124.310300 9.300000 13.600000 126.545948 9.300000 13.700000 128.801596 9.300000 13.800000 131.077245 9.300000 13.900000 133.372893 9.300000 14.000000 135.688541 9.300000 14.100000 138.024190 9.300000 14.200000 140.379838 9.300000 14.300000 142.755486 9.300000 14.400000 145.151135 9.300000 14.500000 147.566783 9.300000 14.600000 150.002431 9.300000 14.700000 152.458079 9.300000 14.800000 154.933728 9.300000 14.900000 157.429376 9.300000 15.000000 159.945024 9.400000 -5.000000 55.965613 9.400000 -4.900000 54.484777 9.400000 -4.800000 53.023942 9.400000 -4.700000 51.583106 9.400000 -4.600000 50.162270 9.400000 -4.500000 48.761434 9.400000 -4.400000 47.380599 9.400000 -4.300000 46.019763 9.400000 -4.200000 44.678927 9.400000 -4.100000 43.358092 9.400000 -4.000000 42.057256 9.400000 -3.900000 40.776420 9.400000 -3.800000 39.515584 9.400000 -3.700000 38.274749 9.400000 -3.600000 37.053913 9.400000 -3.500000 35.853077 9.400000 -3.400000 34.672242 9.400000 -3.300000 33.511406 9.400000 -3.200000 32.370570 9.400000 -3.100000 31.249734 9.400000 -3.000000 30.148899 9.400000 -2.900000 29.068063 9.400000 -2.800000 28.007227 9.400000 -2.700000 26.966392 9.400000 -2.600000 25.945556 9.400000 -2.500000 24.944720 9.400000 -2.400000 23.963884 9.400000 -2.300000 23.003049 9.400000 -2.200000 22.062213 9.400000 -2.100000 21.141377 9.400000 -2.000000 20.240542 9.400000 -1.900000 19.359706 9.400000 -1.800000 18.498870 9.400000 -1.700000 17.658034 9.400000 -1.600000 16.837199 9.400000 -1.500000 16.036363 9.400000 -1.400000 15.255527 9.400000 -1.300000 14.494692 9.400000 -1.200000 13.753856 9.400000 -1.100000 13.033020 9.400000 -1.000000 12.332184 9.400000 -0.900000 11.651349 9.400000 -0.800000 10.990513 9.400000 -0.700000 10.349677 9.400000 -0.600000 9.728842 9.400000 -0.500000 9.128006 9.400000 -0.400000 8.547170 9.400000 -0.300000 7.986334 9.400000 -0.200000 7.445499 9.400000 -0.100000 6.924663 9.400000 -0.000000 6.423827 9.400000 0.100000 5.942992 9.400000 0.200000 5.482156 9.400000 0.300000 5.041320 9.400000 0.400000 4.620484 9.400000 0.500000 4.219649 9.400000 0.600000 3.838813 9.400000 0.700000 3.477977 9.400000 0.800000 3.137142 9.400000 0.900000 2.816306 9.400000 1.000000 2.515470 9.400000 1.100000 2.234634 9.400000 1.200000 1.973799 9.400000 1.300000 1.732963 9.400000 1.400000 1.512127 9.400000 1.500000 1.311292 9.400000 1.600000 1.130456 9.400000 1.700000 0.969620 9.400000 1.800000 0.828784 9.400000 1.900000 0.707949 9.400000 2.000000 0.607113 9.400000 2.100000 0.526277 9.400000 2.200000 0.465442 9.400000 2.300000 0.424606 9.400000 2.400000 0.403770 9.400000 2.500000 0.402934 9.400000 2.600000 0.422099 9.400000 2.700000 0.461263 9.400000 2.800000 0.520427 9.400000 2.900000 0.599592 9.400000 3.000000 0.698756 9.400000 3.100000 0.817920 9.400000 3.200000 0.957084 9.400000 3.300000 1.116249 9.400000 3.400000 1.295413 9.400000 3.500000 1.494577 9.400000 3.600000 1.713742 9.400000 3.700000 1.952906 9.400000 3.800000 2.212070 9.400000 3.900000 2.491234 9.400000 4.000000 2.790399 9.400000 4.100000 3.109563 9.400000 4.200000 3.448727 9.400000 4.300000 3.807892 9.400000 4.400000 4.187056 9.400000 4.500000 4.586220 9.400000 4.600000 5.005384 9.400000 4.700000 5.444549 9.400000 4.800000 5.903713 9.400000 4.900000 6.382877 9.400000 5.000000 6.882042 9.400000 5.100000 7.401206 9.400000 5.200000 7.940370 9.400000 5.300000 8.499534 9.400000 5.400000 9.078699 9.400000 5.500000 9.677863 9.400000 5.600000 10.297027 9.400000 5.700000 10.936192 9.400000 5.800000 11.595356 9.400000 5.900000 12.274520 9.400000 6.000000 12.973684 9.400000 6.100000 13.692849 9.400000 6.200000 14.432013 9.400000 6.300000 15.191177 9.400000 6.400000 15.970342 9.400000 6.500000 16.769506 9.400000 6.600000 17.588670 9.400000 6.700000 18.427834 9.400000 6.800000 19.286999 9.400000 6.900000 20.166163 9.400000 7.000000 21.065327 9.400000 7.100000 21.984491 9.400000 7.200000 22.923656 9.400000 7.300000 23.882820 9.400000 7.400000 24.861984 9.400000 7.500000 25.861149 9.400000 7.600000 26.880313 9.400000 7.700000 27.919477 9.400000 7.800000 28.978641 9.400000 7.900000 30.057806 9.400000 8.000000 31.156970 9.400000 8.100000 32.276134 9.400000 8.200000 33.415299 9.400000 8.300000 34.574463 9.400000 8.400000 35.753627 9.400000 8.500000 36.952791 9.400000 8.600000 38.171956 9.400000 8.700000 39.411120 9.400000 8.800000 40.670284 9.400000 8.900000 41.949449 9.400000 9.000000 43.248613 9.400000 9.100000 44.567777 9.400000 9.200000 45.906941 9.400000 9.300000 47.266106 9.400000 9.400000 48.645270 9.400000 9.500000 50.044434 9.400000 9.600000 51.463599 9.400000 9.700000 52.902763 9.400000 9.800000 54.361927 9.400000 9.900000 55.841091 9.400000 10.000000 57.340256 9.400000 10.100000 58.859420 9.400000 10.200000 60.398584 9.400000 10.300000 61.957749 9.400000 10.400000 63.536913 9.400000 10.500000 65.136077 9.400000 10.600000 66.755241 9.400000 10.700000 68.394406 9.400000 10.800000 70.053570 9.400000 10.900000 71.732734 9.400000 11.000000 73.431899 9.400000 11.100000 75.151063 9.400000 11.200000 76.890227 9.400000 11.300000 78.649391 9.400000 11.400000 80.428556 9.400000 11.500000 82.227720 9.400000 11.600000 84.046884 9.400000 11.700000 85.886049 9.400000 11.800000 87.745213 9.400000 11.900000 89.624377 9.400000 12.000000 91.523541 9.400000 12.100000 93.442706 9.400000 12.200000 95.381870 9.400000 12.300000 97.341034 9.400000 12.400000 99.320199 9.400000 12.500000 101.319363 9.400000 12.600000 103.338527 9.400000 12.700000 105.377691 9.400000 12.800000 107.436856 9.400000 12.900000 109.516020 9.400000 13.000000 111.615184 9.400000 13.100000 113.734349 9.400000 13.200000 115.873513 9.400000 13.300000 118.032677 9.400000 13.400000 120.211841 9.400000 13.500000 122.411006 9.400000 13.600000 124.630170 9.400000 13.700000 126.869334 9.400000 13.800000 129.128499 9.400000 13.900000 131.407663 9.400000 14.000000 133.706827 9.400000 14.100000 136.025991 9.400000 14.200000 138.365156 9.400000 14.300000 140.724320 9.400000 14.400000 143.103484 9.400000 14.500000 145.502649 9.400000 14.600000 147.921813 9.400000 14.700000 150.360977 9.400000 14.800000 152.820141 9.400000 14.900000 155.299306 9.400000 15.000000 157.798470 9.500000 -5.000000 57.264311 9.500000 -4.900000 55.766475 9.500000 -4.800000 54.288638 9.500000 -4.700000 52.830802 9.500000 -4.600000 51.392965 9.500000 -4.500000 49.975129 9.500000 -4.400000 48.577292 9.500000 -4.300000 47.199456 9.500000 -4.200000 45.841619 9.500000 -4.100000 44.503783 9.500000 -4.000000 43.185947 9.500000 -3.900000 41.888110 9.500000 -3.800000 40.610274 9.500000 -3.700000 39.352437 9.500000 -3.600000 38.114601 9.500000 -3.500000 36.896764 9.500000 -3.400000 35.698928 9.500000 -3.300000 34.521091 9.500000 -3.200000 33.363255 9.500000 -3.100000 32.225418 9.500000 -3.000000 31.107582 9.500000 -2.900000 30.009745 9.500000 -2.800000 28.931909 9.500000 -2.700000 27.874072 9.500000 -2.600000 26.836236 9.500000 -2.500000 25.818399 9.500000 -2.400000 24.820563 9.500000 -2.300000 23.842727 9.500000 -2.200000 22.884890 9.500000 -2.100000 21.947054 9.500000 -2.000000 21.029217 9.500000 -1.900000 20.131381 9.500000 -1.800000 19.253544 9.500000 -1.700000 18.395708 9.500000 -1.600000 17.557871 9.500000 -1.500000 16.740035 9.500000 -1.400000 15.942198 9.500000 -1.300000 15.164362 9.500000 -1.200000 14.406525 9.500000 -1.100000 13.668689 9.500000 -1.000000 12.950852 9.500000 -0.900000 12.253016 9.500000 -0.800000 11.575179 9.500000 -0.700000 10.917343 9.500000 -0.600000 10.279506 9.500000 -0.500000 9.661670 9.500000 -0.400000 9.063834 9.500000 -0.300000 8.485997 9.500000 -0.200000 7.928161 9.500000 -0.100000 7.390324 9.500000 -0.000000 6.872488 9.500000 0.100000 6.374651 9.500000 0.200000 5.896815 9.500000 0.300000 5.438978 9.500000 0.400000 5.001142 9.500000 0.500000 4.583305 9.500000 0.600000 4.185469 9.500000 0.700000 3.807632 9.500000 0.800000 3.449796 9.500000 0.900000 3.111959 9.500000 1.000000 2.794123 9.500000 1.100000 2.496286 9.500000 1.200000 2.218450 9.500000 1.300000 1.960614 9.500000 1.400000 1.722777 9.500000 1.500000 1.504941 9.500000 1.600000 1.307104 9.500000 1.700000 1.129268 9.500000 1.800000 0.971431 9.500000 1.900000 0.833595 9.500000 2.000000 0.715758 9.500000 2.100000 0.617922 9.500000 2.200000 0.540085 9.500000 2.300000 0.482249 9.500000 2.400000 0.444412 9.500000 2.500000 0.426576 9.500000 2.600000 0.428739 9.500000 2.700000 0.450903 9.500000 2.800000 0.493066 9.500000 2.900000 0.555230 9.500000 3.000000 0.637394 9.500000 3.100000 0.739557 9.500000 3.200000 0.861721 9.500000 3.300000 1.003884 9.500000 3.400000 1.166048 9.500000 3.500000 1.348211 9.500000 3.600000 1.550375 9.500000 3.700000 1.772538 9.500000 3.800000 2.014702 9.500000 3.900000 2.276865 9.500000 4.000000 2.559029 9.500000 4.100000 2.861192 9.500000 4.200000 3.183356 9.500000 4.300000 3.525519 9.500000 4.400000 3.887683 9.500000 4.500000 4.269846 9.500000 4.600000 4.672010 9.500000 4.700000 5.094174 9.500000 4.800000 5.536337 9.500000 4.900000 5.998501 9.500000 5.000000 6.480664 9.500000 5.100000 6.982828 9.500000 5.200000 7.504991 9.500000 5.300000 8.047155 9.500000 5.400000 8.609318 9.500000 5.500000 9.191482 9.500000 5.600000 9.793645 9.500000 5.700000 10.415809 9.500000 5.800000 11.057972 9.500000 5.900000 11.720136 9.500000 6.000000 12.402299 9.500000 6.100000 13.104463 9.500000 6.200000 13.826626 9.500000 6.300000 14.568790 9.500000 6.400000 15.330954 9.500000 6.500000 16.113117 9.500000 6.600000 16.915281 9.500000 6.700000 17.737444 9.500000 6.800000 18.579608 9.500000 6.900000 19.441771 9.500000 7.000000 20.323935 9.500000 7.100000 21.226098 9.500000 7.200000 22.148262 9.500000 7.300000 23.090425 9.500000 7.400000 24.052589 9.500000 7.500000 25.034752 9.500000 7.600000 26.036916 9.500000 7.700000 27.059079 9.500000 7.800000 28.101243 9.500000 7.900000 29.163406 9.500000 8.000000 30.245570 9.500000 8.100000 31.347733 9.500000 8.200000 32.469897 9.500000 8.300000 33.612061 9.500000 8.400000 34.774224 9.500000 8.500000 35.956388 9.500000 8.600000 37.158551 9.500000 8.700000 38.380715 9.500000 8.800000 39.622878 9.500000 8.900000 40.885042 9.500000 9.000000 42.167205 9.500000 9.100000 43.469369 9.500000 9.200000 44.791532 9.500000 9.300000 46.133696 9.500000 9.400000 47.495859 9.500000 9.500000 48.878023 9.500000 9.600000 50.280186 9.500000 9.700000 51.702350 9.500000 9.800000 53.144513 9.500000 9.900000 54.606677 9.500000 10.000000 56.088841 9.500000 10.100000 57.591004 9.500000 10.200000 59.113168 9.500000 10.300000 60.655331 9.500000 10.400000 62.217495 9.500000 10.500000 63.799658 9.500000 10.600000 65.401822 9.500000 10.700000 67.023985 9.500000 10.800000 68.666149 9.500000 10.900000 70.328312 9.500000 11.000000 72.010476 9.500000 11.100000 73.712639 9.500000 11.200000 75.434803 9.500000 11.300000 77.176966 9.500000 11.400000 78.939130 9.500000 11.500000 80.721293 9.500000 11.600000 82.523457 9.500000 11.700000 84.345621 9.500000 11.800000 86.187784 9.500000 11.900000 88.049948 9.500000 12.000000 89.932111 9.500000 12.100000 91.834275 9.500000 12.200000 93.756438 9.500000 12.300000 95.698602 9.500000 12.400000 97.660765 9.500000 12.500000 99.642929 9.500000 12.600000 101.645092 9.500000 12.700000 103.667256 9.500000 12.800000 105.709419 9.500000 12.900000 107.771583 9.500000 13.000000 109.853746 9.500000 13.100000 111.955910 9.500000 13.200000 114.078073 9.500000 13.300000 116.220237 9.500000 13.400000 118.382401 9.500000 13.500000 120.564564 9.500000 13.600000 122.766728 9.500000 13.700000 124.988891 9.500000 13.800000 127.231055 9.500000 13.900000 129.493218 9.500000 14.000000 131.775382 9.500000 14.100000 134.077545 9.500000 14.200000 136.399709 9.500000 14.300000 138.741872 9.500000 14.400000 141.104036 9.500000 14.500000 143.486199 9.500000 14.600000 145.888363 9.500000 14.700000 148.310526 9.500000 14.800000 150.752690 9.500000 14.900000 153.214853 9.500000 15.000000 155.697017 9.600000 -5.000000 58.712534 9.600000 -4.900000 57.197180 9.600000 -4.800000 55.701826 9.600000 -4.700000 54.226472 9.600000 -4.600000 52.771118 9.600000 -4.500000 51.335764 9.600000 -4.400000 49.920410 9.600000 -4.300000 48.525057 9.600000 -4.200000 47.149703 9.600000 -4.100000 45.794349 9.600000 -4.000000 44.458995 9.600000 -3.900000 43.143641 9.600000 -3.800000 41.848287 9.600000 -3.700000 40.572933 9.600000 -3.600000 39.317579 9.600000 -3.500000 38.082225 9.600000 -3.400000 36.866871 9.600000 -3.300000 35.671517 9.600000 -3.200000 34.496163 9.600000 -3.100000 33.340809 9.600000 -3.000000 32.205455 9.600000 -2.900000 31.090101 9.600000 -2.800000 29.994747 9.600000 -2.700000 28.919393 9.600000 -2.600000 27.864039 9.600000 -2.500000 26.828685 9.600000 -2.400000 25.813331 9.600000 -2.300000 24.817977 9.600000 -2.200000 23.842623 9.600000 -2.100000 22.887269 9.600000 -2.000000 21.951915 9.600000 -1.900000 21.036561 9.600000 -1.800000 20.141207 9.600000 -1.700000 19.265853 9.600000 -1.600000 18.410499 9.600000 -1.500000 17.575145 9.600000 -1.400000 16.759792 9.600000 -1.300000 15.964438 9.600000 -1.200000 15.189084 9.600000 -1.100000 14.433730 9.600000 -1.000000 13.698376 9.600000 -0.900000 12.983022 9.600000 -0.800000 12.287668 9.600000 -0.700000 11.612314 9.600000 -0.600000 10.956960 9.600000 -0.500000 10.321606 9.600000 -0.400000 9.706252 9.600000 -0.300000 9.110898 9.600000 -0.200000 8.535544 9.600000 -0.100000 7.980190 9.600000 -0.000000 7.444836 9.600000 0.100000 6.929482 9.600000 0.200000 6.434128 9.600000 0.300000 5.958774 9.600000 0.400000 5.503420 9.600000 0.500000 5.068066 9.600000 0.600000 4.652712 9.600000 0.700000 4.257358 9.600000 0.800000 3.882004 9.600000 0.900000 3.526650 9.600000 1.000000 3.191296 9.600000 1.100000 2.875942 9.600000 1.200000 2.580588 9.600000 1.300000 2.305234 9.600000 1.400000 2.049880 9.600000 1.500000 1.814527 9.600000 1.600000 1.599173 9.600000 1.700000 1.403819 9.600000 1.800000 1.228465 9.600000 1.900000 1.073111 9.600000 2.000000 0.937757 9.600000 2.100000 0.822403 9.600000 2.200000 0.727049 9.600000 2.300000 0.651695 9.600000 2.400000 0.596341 9.600000 2.500000 0.560987 9.600000 2.600000 0.545633 9.600000 2.700000 0.550279 9.600000 2.800000 0.574925 9.600000 2.900000 0.619571 9.600000 3.000000 0.684217 9.600000 3.100000 0.768863 9.600000 3.200000 0.873509 9.600000 3.300000 0.998155 9.600000 3.400000 1.142801 9.600000 3.500000 1.307447 9.600000 3.600000 1.492093 9.600000 3.700000 1.696739 9.600000 3.800000 1.921385 9.600000 3.900000 2.166031 9.600000 4.000000 2.430677 9.600000 4.100000 2.715323 9.600000 4.200000 3.019969 9.600000 4.300000 3.344616 9.600000 4.400000 3.689262 9.600000 4.500000 4.053908 9.600000 4.600000 4.438554 9.600000 4.700000 4.843200 9.600000 4.800000 5.267846 9.600000 4.900000 5.712492 9.600000 5.000000 6.177138 9.600000 5.100000 6.661784 9.600000 5.200000 7.166430 9.600000 5.300000 7.691076 9.600000 5.400000 8.235722 9.600000 5.500000 8.800368 9.600000 5.600000 9.385014 9.600000 5.700000 9.989660 9.600000 5.800000 10.614306 9.600000 5.900000 11.258952 9.600000 6.000000 11.923598 9.600000 6.100000 12.608244 9.600000 6.200000 13.312890 9.600000 6.300000 14.037536 9.600000 6.400000 14.782182 9.600000 6.500000 15.546828 9.600000 6.600000 16.331474 9.600000 6.700000 17.136120 9.600000 6.800000 17.960766 9.600000 6.900000 18.805412 9.600000 7.000000 19.670058 9.600000 7.100000 20.554704 9.600000 7.200000 21.459351 9.600000 7.300000 22.383997 9.600000 7.400000 23.328643 9.600000 7.500000 24.293289 9.600000 7.600000 25.277935 9.600000 7.700000 26.282581 9.600000 7.800000 27.307227 9.600000 7.900000 28.351873 9.600000 8.000000 29.416519 9.600000 8.100000 30.501165 9.600000 8.200000 31.605811 9.600000 8.300000 32.730457 9.600000 8.400000 33.875103 9.600000 8.500000 35.039749 9.600000 8.600000 36.224395 9.600000 8.700000 37.429041 9.600000 8.800000 38.653687 9.600000 8.900000 39.898333 9.600000 9.000000 41.162979 9.600000 9.100000 42.447625 9.600000 9.200000 43.752271 9.600000 9.300000 45.076917 9.600000 9.400000 46.421563 9.600000 9.500000 47.786209 9.600000 9.600000 49.170855 9.600000 9.700000 50.575501 9.600000 9.800000 52.000147 9.600000 9.900000 53.444793 9.600000 10.000000 54.909439 9.600000 10.100000 56.394086 9.600000 10.200000 57.898732 9.600000 10.300000 59.423378 9.600000 10.400000 60.968024 9.600000 10.500000 62.532670 9.600000 10.600000 64.117316 9.600000 10.700000 65.721962 9.600000 10.800000 67.346608 9.600000 10.900000 68.991254 9.600000 11.000000 70.655900 9.600000 11.100000 72.340546 9.600000 11.200000 74.045192 9.600000 11.300000 75.769838 9.600000 11.400000 77.514484 9.600000 11.500000 79.279130 9.600000 11.600000 81.063776 9.600000 11.700000 82.868422 9.600000 11.800000 84.693068 9.600000 11.900000 86.537714 9.600000 12.000000 88.402360 9.600000 12.100000 90.287006 9.600000 12.200000 92.191652 9.600000 12.300000 94.116298 9.600000 12.400000 96.060944 9.600000 12.500000 98.025590 9.600000 12.600000 100.010236 9.600000 12.700000 102.014882 9.600000 12.800000 104.039528 9.600000 12.900000 106.084175 9.600000 13.000000 108.148821 9.600000 13.100000 110.233467 9.600000 13.200000 112.338113 9.600000 13.300000 114.462759 9.600000 13.400000 116.607405 9.600000 13.500000 118.772051 9.600000 13.600000 120.956697 9.600000 13.700000 123.161343 9.600000 13.800000 125.385989 9.600000 13.900000 127.630635 9.600000 14.000000 129.895281 9.600000 14.100000 132.179927 9.600000 14.200000 134.484573 9.600000 14.300000 136.809219 9.600000 14.400000 139.153865 9.600000 14.500000 141.518511 9.600000 14.600000 143.903157 9.600000 14.700000 146.307803 9.600000 14.800000 148.732449 9.600000 14.900000 151.177095 9.600000 15.000000 153.641741 9.700000 -5.000000 60.310442 9.700000 -4.900000 58.777054 9.700000 -4.800000 57.263666 9.700000 -4.700000 55.770278 9.700000 -4.600000 54.296889 9.700000 -4.500000 52.843501 9.700000 -4.400000 51.410113 9.700000 -4.300000 49.996725 9.700000 -4.200000 48.603337 9.700000 -4.100000 47.229948 9.700000 -4.000000 45.876560 9.700000 -3.900000 44.543172 9.700000 -3.800000 43.229784 9.700000 -3.700000 41.936396 9.700000 -3.600000 40.663007 9.700000 -3.500000 39.409619 9.700000 -3.400000 38.176231 9.700000 -3.300000 36.962843 9.700000 -3.200000 35.769455 9.700000 -3.100000 34.596066 9.700000 -3.000000 33.442678 9.700000 -2.900000 32.309290 9.700000 -2.800000 31.195902 9.700000 -2.700000 30.102514 9.700000 -2.600000 29.029125 9.700000 -2.500000 27.975737 9.700000 -2.400000 26.942349 9.700000 -2.300000 25.928961 9.700000 -2.200000 24.935573 9.700000 -2.100000 23.962184 9.700000 -2.000000 23.008796 9.700000 -1.900000 22.075408 9.700000 -1.800000 21.162020 9.700000 -1.700000 20.268632 9.700000 -1.600000 19.395243 9.700000 -1.500000 18.541855 9.700000 -1.400000 17.708467 9.700000 -1.300000 16.895079 9.700000 -1.200000 16.101691 9.700000 -1.100000 15.328303 9.700000 -1.000000 14.574914 9.700000 -0.900000 13.841526 9.700000 -0.800000 13.128138 9.700000 -0.700000 12.434750 9.700000 -0.600000 11.761362 9.700000 -0.500000 11.107973 9.700000 -0.400000 10.474585 9.700000 -0.300000 9.861197 9.700000 -0.200000 9.267809 9.700000 -0.100000 8.694421 9.700000 -0.000000 8.141032 9.700000 0.100000 7.607644 9.700000 0.200000 7.094256 9.700000 0.300000 6.600868 9.700000 0.400000 6.127480 9.700000 0.500000 5.674091 9.700000 0.600000 5.240703 9.700000 0.700000 4.827315 9.700000 0.800000 4.433927 9.700000 0.900000 4.060539 9.700000 1.000000 3.707150 9.700000 1.100000 3.373762 9.700000 1.200000 3.060374 9.700000 1.300000 2.766986 9.700000 1.400000 2.493598 9.700000 1.500000 2.240209 9.700000 1.600000 2.006821 9.700000 1.700000 1.793433 9.700000 1.800000 1.600045 9.700000 1.900000 1.426657 9.700000 2.000000 1.273268 9.700000 2.100000 1.139880 9.700000 2.200000 1.026492 9.700000 2.300000 0.933104 9.700000 2.400000 0.859716 9.700000 2.500000 0.806327 9.700000 2.600000 0.772939 9.700000 2.700000 0.759551 9.700000 2.800000 0.766163 9.700000 2.900000 0.792775 9.700000 3.000000 0.839386 9.700000 3.100000 0.905998 9.700000 3.200000 0.992610 9.700000 3.300000 1.099222 9.700000 3.400000 1.225834 9.700000 3.500000 1.372445 9.700000 3.600000 1.539057 9.700000 3.700000 1.725669 9.700000 3.800000 1.932281 9.700000 3.900000 2.158893 9.700000 4.000000 2.405504 9.700000 4.100000 2.672116 9.700000 4.200000 2.958728 9.700000 4.300000 3.265340 9.700000 4.400000 3.591952 9.700000 4.500000 3.938563 9.700000 4.600000 4.305175 9.700000 4.700000 4.691787 9.700000 4.800000 5.098399 9.700000 4.900000 5.525011 9.700000 5.000000 5.971622 9.700000 5.100000 6.438234 9.700000 5.200000 6.924846 9.700000 5.300000 7.431458 9.700000 5.400000 7.958070 9.700000 5.500000 8.504681 9.700000 5.600000 9.071293 9.700000 5.700000 9.657905 9.700000 5.800000 10.264517 9.700000 5.900000 10.891129 9.700000 6.000000 11.537741 9.700000 6.100000 12.204352 9.700000 6.200000 12.890964 9.700000 6.300000 13.597576 9.700000 6.400000 14.324188 9.700000 6.500000 15.070800 9.700000 6.600000 15.837411 9.700000 6.700000 16.624023 9.700000 6.800000 17.430635 9.700000 6.900000 18.257247 9.700000 7.000000 19.103859 9.700000 7.100000 19.970470 9.700000 7.200000 20.857082 9.700000 7.300000 21.763694 9.700000 7.400000 22.690306 9.700000 7.500000 23.636918 9.700000 7.600000 24.603529 9.700000 7.700000 25.590141 9.700000 7.800000 26.596753 9.700000 7.900000 27.623365 9.700000 8.000000 28.669977 9.700000 8.100000 29.736588 9.700000 8.200000 30.823200 9.700000 8.300000 31.929812 9.700000 8.400000 33.056424 9.700000 8.500000 34.203036 9.700000 8.600000 35.369647 9.700000 8.700000 36.556259 9.700000 8.800000 37.762871 9.700000 8.900000 38.989483 9.700000 9.000000 40.236095 9.700000 9.100000 41.502706 9.700000 9.200000 42.789318 9.700000 9.300000 44.095930 9.700000 9.400000 45.422542 9.700000 9.500000 46.769154 9.700000 9.600000 48.135765 9.700000 9.700000 49.522377 9.700000 9.800000 50.928989 9.700000 9.900000 52.355601 9.700000 10.000000 53.802213 9.700000 10.100000 55.268824 9.700000 10.200000 56.755436 9.700000 10.300000 58.262048 9.700000 10.400000 59.788660 9.700000 10.500000 61.335272 9.700000 10.600000 62.901883 9.700000 10.700000 64.488495 9.700000 10.800000 66.095107 9.700000 10.900000 67.721719 9.700000 11.000000 69.368331 9.700000 11.100000 71.034942 9.700000 11.200000 72.721554 9.700000 11.300000 74.428166 9.700000 11.400000 76.154778 9.700000 11.500000 77.901390 9.700000 11.600000 79.668001 9.700000 11.700000 81.454613 9.700000 11.800000 83.261225 9.700000 11.900000 85.087837 9.700000 12.000000 86.934449 9.700000 12.100000 88.801060 9.700000 12.200000 90.687672 9.700000 12.300000 92.594284 9.700000 12.400000 94.520896 9.700000 12.500000 96.467508 9.700000 12.600000 98.434120 9.700000 12.700000 100.420731 9.700000 12.800000 102.427343 9.700000 12.900000 104.453955 9.700000 13.000000 106.500567 9.700000 13.100000 108.567179 9.700000 13.200000 110.653790 9.700000 13.300000 112.760402 9.700000 13.400000 114.887014 9.700000 13.500000 117.033626 9.700000 13.600000 119.200238 9.700000 13.700000 121.386849 9.700000 13.800000 123.593461 9.700000 13.900000 125.820073 9.700000 14.000000 128.066685 9.700000 14.100000 130.333297 9.700000 14.200000 132.619908 9.700000 14.300000 134.926520 9.700000 14.400000 137.253132 9.700000 14.500000 139.599744 9.700000 14.600000 141.966356 9.700000 14.700000 144.352967 9.700000 14.800000 146.759579 9.700000 14.900000 149.186191 9.700000 15.000000 151.632803 9.800000 -5.000000 62.057291 9.800000 -4.900000 60.505352 9.800000 -4.800000 58.973413 9.800000 -4.700000 57.461474 9.800000 -4.600000 55.969534 9.800000 -4.500000 54.497595 9.800000 -4.400000 53.045656 9.800000 -4.300000 51.613717 9.800000 -4.200000 50.201778 9.800000 -4.100000 48.809839 9.800000 -4.000000 47.437899 9.800000 -3.900000 46.085960 9.800000 -3.800000 44.754021 9.800000 -3.700000 43.442082 9.800000 -3.600000 42.150143 9.800000 -3.500000 40.878204 9.800000 -3.400000 39.626264 9.800000 -3.300000 38.394325 9.800000 -3.200000 37.182386 9.800000 -3.100000 35.990447 9.800000 -3.000000 34.818508 9.800000 -2.900000 33.666569 9.800000 -2.800000 32.534629 9.800000 -2.700000 31.422690 9.800000 -2.600000 30.330751 9.800000 -2.500000 29.258812 9.800000 -2.400000 28.206873 9.800000 -2.300000 27.174934 9.800000 -2.200000 26.162994 9.800000 -2.100000 25.171055 9.800000 -2.000000 24.199116 9.800000 -1.900000 23.247177 9.800000 -1.800000 22.315238 9.800000 -1.700000 21.403299 9.800000 -1.600000 20.511359 9.800000 -1.500000 19.639420 9.800000 -1.400000 18.787481 9.800000 -1.300000 17.955542 9.800000 -1.200000 17.143603 9.800000 -1.100000 16.351664 9.800000 -1.000000 15.579724 9.800000 -0.900000 14.827785 9.800000 -0.800000 14.095846 9.800000 -0.700000 13.383907 9.800000 -0.600000 12.691968 9.800000 -0.500000 12.020029 9.800000 -0.400000 11.368089 9.800000 -0.300000 10.736150 9.800000 -0.200000 10.124211 9.800000 -0.100000 9.532272 9.800000 -0.000000 8.960333 9.800000 0.100000 8.408394 9.800000 0.200000 7.876454 9.800000 0.300000 7.364515 9.800000 0.400000 6.872576 9.800000 0.500000 6.400637 9.800000 0.600000 5.948698 9.800000 0.700000 5.516759 9.800000 0.800000 5.104819 9.800000 0.900000 4.712880 9.800000 1.000000 4.340941 9.800000 1.100000 3.989002 9.800000 1.200000 3.657063 9.800000 1.300000 3.345124 9.800000 1.400000 3.053184 9.800000 1.500000 2.781245 9.800000 1.600000 2.529306 9.800000 1.700000 2.297367 9.800000 1.800000 2.085428 9.800000 1.900000 1.893489 9.800000 2.000000 1.721549 9.800000 2.100000 1.569610 9.800000 2.200000 1.437671 9.800000 2.300000 1.325732 9.800000 2.400000 1.233793 9.800000 2.500000 1.161854 9.800000 2.600000 1.109914 9.800000 2.700000 1.077975 9.800000 2.800000 1.066036 9.800000 2.900000 1.074097 9.800000 3.000000 1.102158 9.800000 3.100000 1.150219 9.800000 3.200000 1.218279 9.800000 3.300000 1.306340 9.800000 3.400000 1.414401 9.800000 3.500000 1.542462 9.800000 3.600000 1.690523 9.800000 3.700000 1.858584 9.800000 3.800000 2.046644 9.800000 3.900000 2.254705 9.800000 4.000000 2.482766 9.800000 4.100000 2.730827 9.800000 4.200000 2.998888 9.800000 4.300000 3.286949 9.800000 4.400000 3.595009 9.800000 4.500000 3.923070 9.800000 4.600000 4.271131 9.800000 4.700000 4.639192 9.800000 4.800000 5.027253 9.800000 4.900000 5.435314 9.800000 5.000000 5.863374 9.800000 5.100000 6.311435 9.800000 5.200000 6.779496 9.800000 5.300000 7.267557 9.800000 5.400000 7.775618 9.800000 5.500000 8.303679 9.800000 5.600000 8.851739 9.800000 5.700000 9.419800 9.800000 5.800000 10.007861 9.800000 5.900000 10.615922 9.800000 6.000000 11.243983 9.800000 6.100000 11.892044 9.800000 6.200000 12.560104 9.800000 6.300000 13.248165 9.800000 6.400000 13.956226 9.800000 6.500000 14.684287 9.800000 6.600000 15.432348 9.800000 6.700000 16.200409 9.800000 6.800000 16.988469 9.800000 6.900000 17.796530 9.800000 7.000000 18.624591 9.800000 7.100000 19.472652 9.800000 7.200000 20.340713 9.800000 7.300000 21.228774 9.800000 7.400000 22.136834 9.800000 7.500000 23.064895 9.800000 7.600000 24.012956 9.800000 7.700000 24.981017 9.800000 7.800000 25.969078 9.800000 7.900000 26.977139 9.800000 8.000000 28.005199 9.800000 8.100000 29.053260 9.800000 8.200000 30.121321 9.800000 8.300000 31.209382 9.800000 8.400000 32.317443 9.800000 8.500000 33.445504 9.800000 8.600000 34.593564 9.800000 8.700000 35.761625 9.800000 8.800000 36.949686 9.800000 8.900000 38.157747 9.800000 9.000000 39.385808 9.800000 9.100000 40.633869 9.800000 9.200000 41.901929 9.800000 9.300000 43.189990 9.800000 9.400000 44.498051 9.800000 9.500000 45.826112 9.800000 9.600000 47.174173 9.800000 9.700000 48.542234 9.800000 9.800000 49.930294 9.800000 9.900000 51.338355 9.800000 10.000000 52.766416 9.800000 10.100000 54.214477 9.800000 10.200000 55.682538 9.800000 10.300000 57.170599 9.800000 10.400000 58.678659 9.800000 10.500000 60.206720 9.800000 10.600000 61.754781 9.800000 10.700000 63.322842 9.800000 10.800000 64.910903 9.800000 10.900000 66.518964 9.800000 11.000000 68.147024 9.800000 11.100000 69.795085 9.800000 11.200000 71.463146 9.800000 11.300000 73.151207 9.800000 11.400000 74.859268 9.800000 11.500000 76.587329 9.800000 11.600000 78.335389 9.800000 11.700000 80.103450 9.800000 11.800000 81.891511 9.800000 11.900000 83.699572 9.800000 12.000000 85.527633 9.800000 12.100000 87.375694 9.800000 12.200000 89.243754 9.800000 12.300000 91.131815 9.800000 12.400000 93.039876 9.800000 12.500000 94.967937 9.800000 12.600000 96.915998 9.800000 12.700000 98.884059 9.800000 12.800000 100.872119 9.800000 12.900000 102.880180 9.800000 13.000000 104.908241 9.800000 13.100000 106.956302 9.800000 13.200000 109.024363 9.800000 13.300000 111.112424 9.800000 13.400000 113.220484 9.800000 13.500000 115.348545 9.800000 13.600000 117.496606 9.800000 13.700000 119.664667 9.800000 13.800000 121.852728 9.800000 13.900000 124.060789 9.800000 14.000000 126.288849 9.800000 14.100000 128.536910 9.800000 14.200000 130.804971 9.800000 14.300000 133.093032 9.800000 14.400000 135.401093 9.800000 14.500000 137.729154 9.800000 14.600000 140.077214 9.800000 14.700000 142.445275 9.800000 14.800000 144.833336 9.800000 14.900000 147.241397 9.800000 15.000000 149.669458 9.900000 -5.000000 63.951455 9.900000 -4.900000 62.380448 9.900000 -4.800000 60.829441 9.900000 -4.700000 59.298434 9.900000 -4.600000 57.787427 9.900000 -4.500000 56.296420 9.900000 -4.400000 54.825414 9.900000 -4.300000 53.374407 9.900000 -4.200000 51.943400 9.900000 -4.100000 50.532393 9.900000 -4.000000 49.141386 9.900000 -3.900000 47.770379 9.900000 -3.800000 46.419372 9.900000 -3.700000 45.088365 9.900000 -3.600000 43.777359 9.900000 -3.500000 42.486352 9.900000 -3.400000 41.215345 9.900000 -3.300000 39.964338 9.900000 -3.200000 38.733331 9.900000 -3.100000 37.522324 9.900000 -3.000000 36.331317 9.900000 -2.900000 35.160310 9.900000 -2.800000 34.009304 9.900000 -2.700000 32.878297 9.900000 -2.600000 31.767290 9.900000 -2.500000 30.676283 9.900000 -2.400000 29.605276 9.900000 -2.300000 28.554269 9.900000 -2.200000 27.523262 9.900000 -2.100000 26.512255 9.900000 -2.000000 25.521249 9.900000 -1.900000 24.550242 9.900000 -1.800000 23.599235 9.900000 -1.700000 22.668228 9.900000 -1.600000 21.757221 9.900000 -1.500000 20.866214 9.900000 -1.400000 19.995207 9.900000 -1.300000 19.144200 9.900000 -1.200000 18.313194 9.900000 -1.100000 17.502187 9.900000 -1.000000 16.711180 9.900000 -0.900000 15.940173 9.900000 -0.800000 15.189166 9.900000 -0.700000 14.458159 9.900000 -0.600000 13.747152 9.900000 -0.500000 13.056145 9.900000 -0.400000 12.385139 9.900000 -0.300000 11.734132 9.900000 -0.200000 11.103125 9.900000 -0.100000 10.492118 9.900000 -0.000000 9.901111 9.900000 0.100000 9.330104 9.900000 0.200000 8.779097 9.900000 0.300000 8.248090 9.900000 0.400000 7.737084 9.900000 0.500000 7.246077 9.900000 0.600000 6.775070 9.900000 0.700000 6.324063 9.900000 0.800000 5.893056 9.900000 0.900000 5.482049 9.900000 1.000000 5.091042 9.900000 1.100000 4.720035 9.900000 1.200000 4.369029 9.900000 1.300000 4.038022 9.900000 1.400000 3.727015 9.900000 1.500000 3.436008 9.900000 1.600000 3.165001 9.900000 1.700000 2.913994 9.900000 1.800000 2.682987 9.900000 1.900000 2.471980 9.900000 2.000000 2.280974 9.900000 2.100000 2.109967 9.900000 2.200000 1.958960 9.900000 2.300000 1.827953 9.900000 2.400000 1.716946 9.900000 2.500000 1.625939 9.900000 2.600000 1.554932 9.900000 2.700000 1.503925 9.900000 2.800000 1.472919 9.900000 2.900000 1.461912 9.900000 3.000000 1.470905 9.900000 3.100000 1.499898 9.900000 3.200000 1.548891 9.900000 3.300000 1.617884 9.900000 3.400000 1.706877 9.900000 3.500000 1.815870 9.900000 3.600000 1.944864 9.900000 3.700000 2.093857 9.900000 3.800000 2.262850 9.900000 3.900000 2.451843 9.900000 4.000000 2.660836 9.900000 4.100000 2.889829 9.900000 4.200000 3.138822 9.900000 4.300000 3.407815 9.900000 4.400000 3.696809 9.900000 4.500000 4.005802 9.900000 4.600000 4.334795 9.900000 4.700000 4.683788 9.900000 4.800000 5.052781 9.900000 4.900000 5.441774 9.900000 5.000000 5.850767 9.900000 5.100000 6.279760 9.900000 5.200000 6.728754 9.900000 5.300000 7.197747 9.900000 5.400000 7.686740 9.900000 5.500000 8.195733 9.900000 5.600000 8.724726 9.900000 5.700000 9.273719 9.900000 5.800000 9.842712 9.900000 5.900000 10.431705 9.900000 6.000000 11.040699 9.900000 6.100000 11.669692 9.900000 6.200000 12.318685 9.900000 6.300000 12.987678 9.900000 6.400000 13.676671 9.900000 6.500000 14.385664 9.900000 6.600000 15.114657 9.900000 6.700000 15.863650 9.900000 6.800000 16.632644 9.900000 6.900000 17.421637 9.900000 7.000000 18.230630 9.900000 7.100000 19.059623 9.900000 7.200000 19.908616 9.900000 7.300000 20.777609 9.900000 7.400000 21.666602 9.900000 7.500000 22.575595 9.900000 7.600000 23.504589 9.900000 7.700000 24.453582 9.900000 7.800000 25.422575 9.900000 7.900000 26.411568 9.900000 8.000000 27.420561 9.900000 8.100000 28.449554 9.900000 8.200000 29.498547 9.900000 8.300000 30.567540 9.900000 8.400000 31.656534 9.900000 8.500000 32.765527 9.900000 8.600000 33.894520 9.900000 8.700000 35.043513 9.900000 8.800000 36.212506 9.900000 8.900000 37.401499 9.900000 9.000000 38.610492 9.900000 9.100000 39.839485 9.900000 9.200000 41.088479 9.900000 9.300000 42.357472 9.900000 9.400000 43.646465 9.900000 9.500000 44.955458 9.900000 9.600000 46.284451 9.900000 9.700000 47.633444 9.900000 9.800000 49.002437 9.900000 9.900000 50.391430 9.900000 10.000000 51.800424 9.900000 10.100000 53.229417 9.900000 10.200000 54.678410 9.900000 10.300000 56.147403 9.900000 10.400000 57.636396 9.900000 10.500000 59.145389 9.900000 10.600000 60.674382 9.900000 10.700000 62.223375 9.900000 10.800000 63.792369 9.900000 10.900000 65.381362 9.900000 11.000000 66.990355 9.900000 11.100000 68.619348 9.900000 11.200000 70.268341 9.900000 11.300000 71.937334 9.900000 11.400000 73.626327 9.900000 11.500000 75.335320 9.900000 11.600000 77.064314 9.900000 11.700000 78.813307 9.900000 11.800000 80.582300 9.900000 11.900000 82.371293 9.900000 12.000000 84.180286 9.900000 12.100000 86.009279 9.900000 12.200000 87.858272 9.900000 12.300000 89.727265 9.900000 12.400000 91.616259 9.900000 12.500000 93.525252 9.900000 12.600000 95.454245 9.900000 12.700000 97.403238 9.900000 12.800000 99.372231 9.900000 12.900000 101.361224 9.900000 13.000000 103.370217 9.900000 13.100000 105.399210 9.900000 13.200000 107.448204 9.900000 13.300000 109.517197 9.900000 13.400000 111.606190 9.900000 13.500000 113.715183 9.900000 13.600000 115.844176 9.900000 13.700000 117.993169 9.900000 13.800000 120.162162 9.900000 13.900000 122.351155 9.900000 14.000000 124.560149 9.900000 14.100000 126.789142 9.900000 14.200000 129.038135 9.900000 14.300000 131.307128 9.900000 14.400000 133.596121 9.900000 14.500000 135.905114 9.900000 14.600000 138.234107 9.900000 14.700000 140.583100 9.900000 14.800000 142.952094 9.900000 14.900000 145.341087 9.900000 15.000000 147.750080 10.000000 -5.000000 65.990455 10.000000 -4.900000 64.399864 10.000000 -4.800000 62.829272 10.000000 -4.700000 61.278681 10.000000 -4.600000 59.748090 10.000000 -4.500000 58.237498 10.000000 -4.400000 56.746907 10.000000 -4.300000 55.276316 10.000000 -4.200000 53.825725 10.000000 -4.100000 52.395133 10.000000 -4.000000 50.984542 10.000000 -3.900000 49.593951 10.000000 -3.800000 48.223359 10.000000 -3.700000 46.872768 10.000000 -3.600000 45.542177 10.000000 -3.500000 44.231585 10.000000 -3.400000 42.940994 10.000000 -3.300000 41.670403 10.000000 -3.200000 40.419811 10.000000 -3.100000 39.189220 10.000000 -3.000000 37.978629 10.000000 -2.900000 36.788037 10.000000 -2.800000 35.617446 10.000000 -2.700000 34.466855 10.000000 -2.600000 33.336263 10.000000 -2.500000 32.225672 10.000000 -2.400000 31.135081 10.000000 -2.300000 30.064489 10.000000 -2.200000 29.013898 10.000000 -2.100000 27.983307 10.000000 -2.000000 26.972715 10.000000 -1.900000 25.982124 10.000000 -1.800000 25.011533 10.000000 -1.700000 24.060941 10.000000 -1.600000 23.130350 10.000000 -1.500000 22.219759 10.000000 -1.400000 21.329168 10.000000 -1.300000 20.458576 10.000000 -1.200000 19.607985 10.000000 -1.100000 18.777394 10.000000 -1.000000 17.966802 10.000000 -0.900000 17.176211 10.000000 -0.800000 16.405620 10.000000 -0.700000 15.655028 10.000000 -0.600000 14.924437 10.000000 -0.500000 14.213846 10.000000 -0.400000 13.523254 10.000000 -0.300000 12.852663 10.000000 -0.200000 12.202072 10.000000 -0.100000 11.571480 10.000000 -0.000000 10.960889 10.000000 0.100000 10.370298 10.000000 0.200000 9.799706 10.000000 0.300000 9.249115 10.000000 0.400000 8.718524 10.000000 0.500000 8.207932 10.000000 0.600000 7.717341 10.000000 0.700000 7.246750 10.000000 0.800000 6.796158 10.000000 0.900000 6.365567 10.000000 1.000000 5.954976 10.000000 1.100000 5.564385 10.000000 1.200000 5.193793 10.000000 1.300000 4.843202 10.000000 1.400000 4.512611 10.000000 1.500000 4.202019 10.000000 1.600000 3.911428 10.000000 1.700000 3.640837 10.000000 1.800000 3.390245 10.000000 1.900000 3.159654 10.000000 2.000000 2.949063 10.000000 2.100000 2.758471 10.000000 2.200000 2.587880 10.000000 2.300000 2.437289 10.000000 2.400000 2.306697 10.000000 2.500000 2.196106 10.000000 2.600000 2.105515 10.000000 2.700000 2.034923 10.000000 2.800000 1.984332 10.000000 2.900000 1.953741 10.000000 3.000000 1.943149 10.000000 3.100000 1.952558 10.000000 3.200000 1.981967 10.000000 3.300000 2.031375 10.000000 3.400000 2.100784 10.000000 3.500000 2.190193 10.000000 3.600000 2.299601 10.000000 3.700000 2.429010 10.000000 3.800000 2.578419 10.000000 3.900000 2.747828 10.000000 4.000000 2.937236 10.000000 4.100000 3.146645 10.000000 4.200000 3.376054 10.000000 4.300000 3.625462 10.000000 4.400000 3.894871 10.000000 4.500000 4.184280 10.000000 4.600000 4.493688 10.000000 4.700000 4.823097 10.000000 4.800000 5.172506 10.000000 4.900000 5.541914 10.000000 5.000000 5.931323 10.000000 5.100000 6.340732 10.000000 5.200000 6.770140 10.000000 5.300000 7.219549 10.000000 5.400000 7.688958 10.000000 5.500000 8.178366 10.000000 5.600000 8.687775 10.000000 5.700000 9.217184 10.000000 5.800000 9.766592 10.000000 5.900000 10.336001 10.000000 6.000000 10.925410 10.000000 6.100000 11.534818 10.000000 6.200000 12.164227 10.000000 6.300000 12.813636 10.000000 6.400000 13.483044 10.000000 6.500000 14.172453 10.000000 6.600000 14.881862 10.000000 6.700000 15.611271 10.000000 6.800000 16.360679 10.000000 6.900000 17.130088 10.000000 7.000000 17.919497 10.000000 7.100000 18.728905 10.000000 7.200000 19.558314 10.000000 7.300000 20.407723 10.000000 7.400000 21.277131 10.000000 7.500000 22.166540 10.000000 7.600000 23.075949 10.000000 7.700000 24.005357 10.000000 7.800000 24.954766 10.000000 7.900000 25.924175 10.000000 8.000000 26.913583 10.000000 8.100000 27.922992 10.000000 8.200000 28.952401 10.000000 8.300000 30.001809 10.000000 8.400000 31.071218 10.000000 8.500000 32.160627 10.000000 8.600000 33.270035 10.000000 8.700000 34.399444 10.000000 8.800000 35.548853 10.000000 8.900000 36.718261 10.000000 9.000000 37.907670 10.000000 9.100000 39.117079 10.000000 9.200000 40.346487 10.000000 9.300000 41.595896 10.000000 9.400000 42.865305 10.000000 9.500000 44.154714 10.000000 9.600000 45.464122 10.000000 9.700000 46.793531 10.000000 9.800000 48.142940 10.000000 9.900000 49.512348 10.000000 10.000000 50.901757 10.000000 10.100000 52.311166 10.000000 10.200000 53.740574 10.000000 10.300000 55.189983 10.000000 10.400000 56.659392 10.000000 10.500000 58.148800 10.000000 10.600000 59.658209 10.000000 10.700000 61.187618 10.000000 10.800000 62.737026 10.000000 10.900000 64.306435 10.000000 11.000000 65.895844 10.000000 11.100000 67.505252 10.000000 11.200000 69.134661 10.000000 11.300000 70.784070 10.000000 11.400000 72.453478 10.000000 11.500000 74.142887 10.000000 11.600000 75.852296 10.000000 11.700000 77.581704 10.000000 11.800000 79.331113 10.000000 11.900000 81.100522 10.000000 12.000000 82.889931 10.000000 12.100000 84.699339 10.000000 12.200000 86.528748 10.000000 12.300000 88.378157 10.000000 12.400000 90.247565 10.000000 12.500000 92.136974 10.000000 12.600000 94.046383 10.000000 12.700000 95.975791 10.000000 12.800000 97.925200 10.000000 12.900000 99.894609 10.000000 13.000000 101.884017 10.000000 13.100000 103.893426 10.000000 13.200000 105.922835 10.000000 13.300000 107.972243 10.000000 13.400000 110.041652 10.000000 13.500000 112.131061 10.000000 13.600000 114.240469 10.000000 13.700000 116.369878 10.000000 13.800000 118.519287 10.000000 13.900000 120.688695 10.000000 14.000000 122.878104 10.000000 14.100000 125.087513 10.000000 14.200000 127.316921 10.000000 14.300000 129.566330 10.000000 14.400000 131.835739 10.000000 14.500000 134.125147 10.000000 14.600000 136.434556 10.000000 14.700000 138.763965 10.000000 14.800000 141.113374 10.000000 14.900000 143.482782 10.000000 15.000000 145.872191 10.100000 -5.000000 68.171001 10.100000 -4.900000 66.560309 10.100000 -4.800000 64.969616 10.100000 -4.700000 63.398924 10.100000 -4.600000 61.848231 10.100000 -4.500000 60.317539 10.100000 -4.400000 58.806846 10.100000 -4.300000 57.316154 10.100000 -4.200000 55.845461 10.100000 -4.100000 54.394769 10.100000 -4.000000 52.964076 10.100000 -3.900000 51.553384 10.100000 -3.800000 50.162691 10.100000 -3.700000 48.791999 10.100000 -3.600000 47.441306 10.100000 -3.500000 46.110614 10.100000 -3.400000 44.799921 10.100000 -3.300000 43.509229 10.100000 -3.200000 42.238536 10.100000 -3.100000 40.987844 10.100000 -3.000000 39.757151 10.100000 -2.900000 38.546459 10.100000 -2.800000 37.355766 10.100000 -2.700000 36.185074 10.100000 -2.600000 35.034381 10.100000 -2.500000 33.903689 10.100000 -2.400000 32.792996 10.100000 -2.300000 31.702304 10.100000 -2.200000 30.631611 10.100000 -2.100000 29.580919 10.100000 -2.000000 28.550226 10.100000 -1.900000 27.539534 10.100000 -1.800000 26.548841 10.100000 -1.700000 25.578149 10.100000 -1.600000 24.627456 10.100000 -1.500000 23.696764 10.100000 -1.400000 22.786071 10.100000 -1.300000 21.895379 10.100000 -1.200000 21.024686 10.100000 -1.100000 20.173994 10.100000 -1.000000 19.343301 10.100000 -0.900000 18.532609 10.100000 -0.800000 17.741916 10.100000 -0.700000 16.971224 10.100000 -0.600000 16.220531 10.100000 -0.500000 15.489839 10.100000 -0.400000 14.779146 10.100000 -0.300000 14.088454 10.100000 -0.200000 13.417761 10.100000 -0.100000 12.767069 10.100000 -0.000000 12.136376 10.100000 0.100000 11.525684 10.100000 0.200000 10.934991 10.100000 0.300000 10.364299 10.100000 0.400000 9.813606 10.100000 0.500000 9.282914 10.100000 0.600000 8.772221 10.100000 0.700000 8.281529 10.100000 0.800000 7.810836 10.100000 0.900000 7.360144 10.100000 1.000000 6.929451 10.100000 1.100000 6.518759 10.100000 1.200000 6.128066 10.100000 1.300000 5.757373 10.100000 1.400000 5.406681 10.100000 1.500000 5.075988 10.100000 1.600000 4.765296 10.100000 1.700000 4.474603 10.100000 1.800000 4.203911 10.100000 1.900000 3.953218 10.100000 2.000000 3.722526 10.100000 2.100000 3.511833 10.100000 2.200000 3.321141 10.100000 2.300000 3.150448 10.100000 2.400000 2.999756 10.100000 2.500000 2.869063 10.100000 2.600000 2.758371 10.100000 2.700000 2.667678 10.100000 2.800000 2.596986 10.100000 2.900000 2.546293 10.100000 3.000000 2.515601 10.100000 3.100000 2.504908 10.100000 3.200000 2.514216 10.100000 3.300000 2.543523 10.100000 3.400000 2.592831 10.100000 3.500000 2.662138 10.100000 3.600000 2.751446 10.100000 3.700000 2.860753 10.100000 3.800000 2.990061 10.100000 3.900000 3.139368 10.100000 4.000000 3.308676 10.100000 4.100000 3.497983 10.100000 4.200000 3.707291 10.100000 4.300000 3.936598 10.100000 4.400000 4.185906 10.100000 4.500000 4.455213 10.100000 4.600000 4.744521 10.100000 4.700000 5.053828 10.100000 4.800000 5.383136 10.100000 4.900000 5.732443 10.100000 5.000000 6.101751 10.100000 5.100000 6.491058 10.100000 5.200000 6.900366 10.100000 5.300000 7.329673 10.100000 5.400000 7.778981 10.100000 5.500000 8.248288 10.100000 5.600000 8.737596 10.100000 5.700000 9.246903 10.100000 5.800000 9.776211 10.100000 5.900000 10.325518 10.100000 6.000000 10.894826 10.100000 6.100000 11.484133 10.100000 6.200000 12.093441 10.100000 6.300000 12.722748 10.100000 6.400000 13.372056 10.100000 6.500000 14.041363 10.100000 6.600000 14.730671 10.100000 6.700000 15.439978 10.100000 6.800000 16.169286 10.100000 6.900000 16.918593 10.100000 7.000000 17.687901 10.100000 7.100000 18.477208 10.100000 7.200000 19.286516 10.100000 7.300000 20.115823 10.100000 7.400000 20.965131 10.100000 7.500000 21.834438 10.100000 7.600000 22.723746 10.100000 7.700000 23.633053 10.100000 7.800000 24.562361 10.100000 7.900000 25.511668 10.100000 8.000000 26.480976 10.100000 8.100000 27.470283 10.100000 8.200000 28.479591 10.100000 8.300000 29.508898 10.100000 8.400000 30.558206 10.100000 8.500000 31.627513 10.100000 8.600000 32.716821 10.100000 8.700000 33.826128 10.100000 8.800000 34.955436 10.100000 8.900000 36.104743 10.100000 9.000000 37.274051 10.100000 9.100000 38.463358 10.100000 9.200000 39.672666 10.100000 9.300000 40.901973 10.100000 9.400000 42.151281 10.100000 9.500000 43.420588 10.100000 9.600000 44.709896 10.100000 9.700000 46.019203 10.100000 9.800000 47.348511 10.100000 9.900000 48.697818 10.100000 10.000000 50.067126 10.100000 10.100000 51.456433 10.100000 10.200000 52.865741 10.100000 10.300000 54.295048 10.100000 10.400000 55.744356 10.100000 10.500000 57.213663 10.100000 10.600000 58.702971 10.100000 10.700000 60.212278 10.100000 10.800000 61.741586 10.100000 10.900000 63.290893 10.100000 11.000000 64.860200 10.100000 11.100000 66.449508 10.100000 11.200000 68.058815 10.100000 11.300000 69.688123 10.100000 11.400000 71.337430 10.100000 11.500000 73.006738 10.100000 11.600000 74.696045 10.100000 11.700000 76.405353 10.100000 11.800000 78.134660 10.100000 11.900000 79.883968 10.100000 12.000000 81.653275 10.100000 12.100000 83.442583 10.100000 12.200000 85.251890 10.100000 12.300000 87.081198 10.100000 12.400000 88.930505 10.100000 12.500000 90.799813 10.100000 12.600000 92.689120 10.100000 12.700000 94.598428 10.100000 12.800000 96.527735 10.100000 12.900000 98.477043 10.100000 13.000000 100.446350 10.100000 13.100000 102.435658 10.100000 13.200000 104.444965 10.100000 13.300000 106.474273 10.100000 13.400000 108.523580 10.100000 13.500000 110.592888 10.100000 13.600000 112.682195 10.100000 13.700000 114.791503 10.100000 13.800000 116.920810 10.100000 13.900000 119.070118 10.100000 14.000000 121.239425 10.100000 14.100000 123.428733 10.100000 14.200000 125.638040 10.100000 14.300000 127.867348 10.100000 14.400000 130.116655 10.100000 14.500000 132.385963 10.100000 14.600000 134.675270 10.100000 14.700000 136.984578 10.100000 14.800000 139.313885 10.100000 14.900000 141.663193 10.100000 15.000000 144.032500 10.200000 -5.000000 70.489039 10.200000 -4.900000 68.857728 10.200000 -4.800000 67.246418 10.200000 -4.700000 65.655107 10.200000 -4.600000 64.083797 10.200000 -4.500000 62.532487 10.200000 -4.400000 61.001176 10.200000 -4.300000 59.489866 10.200000 -4.200000 57.998555 10.200000 -4.100000 56.527245 10.200000 -4.000000 55.075934 10.200000 -3.900000 53.644624 10.200000 -3.800000 52.233314 10.200000 -3.700000 50.842003 10.200000 -3.600000 49.470693 10.200000 -3.500000 48.119382 10.200000 -3.400000 46.788072 10.200000 -3.300000 45.476761 10.200000 -3.200000 44.185451 10.200000 -3.100000 42.914141 10.200000 -3.000000 41.662830 10.200000 -2.900000 40.431520 10.200000 -2.800000 39.220209 10.200000 -2.700000 38.028899 10.200000 -2.600000 36.857588 10.200000 -2.500000 35.706278 10.200000 -2.400000 34.574968 10.200000 -2.300000 33.463657 10.200000 -2.200000 32.372347 10.200000 -2.100000 31.301036 10.200000 -2.000000 30.249726 10.200000 -1.900000 29.218415 10.200000 -1.800000 28.207105 10.200000 -1.700000 27.215795 10.200000 -1.600000 26.244484 10.200000 -1.500000 25.293174 10.200000 -1.400000 24.361863 10.200000 -1.300000 23.450553 10.200000 -1.200000 22.559242 10.200000 -1.100000 21.687932 10.200000 -1.000000 20.836622 10.200000 -0.900000 20.005311 10.200000 -0.800000 19.194001 10.200000 -0.700000 18.402690 10.200000 -0.600000 17.631380 10.200000 -0.500000 16.880069 10.200000 -0.400000 16.148759 10.200000 -0.300000 15.437449 10.200000 -0.200000 14.746138 10.200000 -0.100000 14.074828 10.200000 -0.000000 13.423517 10.200000 0.100000 12.792207 10.200000 0.200000 12.180896 10.200000 0.300000 11.589586 10.200000 0.400000 11.018276 10.200000 0.500000 10.466965 10.200000 0.600000 9.935655 10.200000 0.700000 9.424344 10.200000 0.800000 8.933034 10.200000 0.900000 8.461724 10.200000 1.000000 8.010413 10.200000 1.100000 7.579103 10.200000 1.200000 7.167792 10.200000 1.300000 6.776482 10.200000 1.400000 6.405171 10.200000 1.500000 6.053861 10.200000 1.600000 5.722551 10.200000 1.700000 5.411240 10.200000 1.800000 5.119930 10.200000 1.900000 4.848619 10.200000 2.000000 4.597309 10.200000 2.100000 4.365998 10.200000 2.200000 4.154688 10.200000 2.300000 3.963378 10.200000 2.400000 3.792067 10.200000 2.500000 3.640757 10.200000 2.600000 3.509446 10.200000 2.700000 3.398136 10.200000 2.800000 3.306825 10.200000 2.900000 3.235515 10.200000 3.000000 3.184205 10.200000 3.100000 3.152894 10.200000 3.200000 3.141584 10.200000 3.300000 3.150273 10.200000 3.400000 3.178963 10.200000 3.500000 3.227652 10.200000 3.600000 3.296342 10.200000 3.700000 3.385032 10.200000 3.800000 3.493721 10.200000 3.900000 3.622411 10.200000 4.000000 3.771100 10.200000 4.100000 3.939790 10.200000 4.200000 4.128479 10.200000 4.300000 4.337169 10.200000 4.400000 4.565859 10.200000 4.500000 4.814548 10.200000 4.600000 5.083238 10.200000 4.700000 5.371927 10.200000 4.800000 5.680617 10.200000 4.900000 6.009306 10.200000 5.000000 6.357996 10.200000 5.100000 6.726686 10.200000 5.200000 7.115375 10.200000 5.300000 7.524065 10.200000 5.400000 7.952754 10.200000 5.500000 8.401444 10.200000 5.600000 8.870133 10.200000 5.700000 9.358823 10.200000 5.800000 9.867513 10.200000 5.900000 10.396202 10.200000 6.000000 10.944892 10.200000 6.100000 11.513581 10.200000 6.200000 12.102271 10.200000 6.300000 12.710960 10.200000 6.400000 13.339650 10.200000 6.500000 13.988340 10.200000 6.600000 14.657029 10.200000 6.700000 15.345719 10.200000 6.800000 16.054408 10.200000 6.900000 16.783098 10.200000 7.000000 17.531787 10.200000 7.100000 18.300477 10.200000 7.200000 19.089167 10.200000 7.300000 19.897856 10.200000 7.400000 20.726546 10.200000 7.500000 21.575235 10.200000 7.600000 22.443925 10.200000 7.700000 23.332614 10.200000 7.800000 24.241304 10.200000 7.900000 25.169994 10.200000 8.000000 26.118683 10.200000 8.100000 27.087373 10.200000 8.200000 28.076062 10.200000 8.300000 29.084752 10.200000 8.400000 30.113441 10.200000 8.500000 31.162131 10.200000 8.600000 32.230821 10.200000 8.700000 33.319510 10.200000 8.800000 34.428200 10.200000 8.900000 35.556889 10.200000 9.000000 36.705579 10.200000 9.100000 37.874268 10.200000 9.200000 39.062958 10.200000 9.300000 40.271648 10.200000 9.400000 41.500337 10.200000 9.500000 42.749027 10.200000 9.600000 44.017716 10.200000 9.700000 45.306406 10.200000 9.800000 46.615095 10.200000 9.900000 47.943785 10.200000 10.000000 49.292475 10.200000 10.100000 50.661164 10.200000 10.200000 52.049854 10.200000 10.300000 53.458543 10.200000 10.400000 54.887233 10.200000 10.500000 56.335922 10.200000 10.600000 57.804612 10.200000 10.700000 59.293302 10.200000 10.800000 60.801991 10.200000 10.900000 62.330681 10.200000 11.000000 63.879370 10.200000 11.100000 65.448060 10.200000 11.200000 67.036750 10.200000 11.300000 68.645439 10.200000 11.400000 70.274129 10.200000 11.500000 71.922818 10.200000 11.600000 73.591508 10.200000 11.700000 75.280197 10.200000 11.800000 76.988887 10.200000 11.900000 78.717577 10.200000 12.000000 80.466266 10.200000 12.100000 82.234956 10.200000 12.200000 84.023645 10.200000 12.300000 85.832335 10.200000 12.400000 87.661024 10.200000 12.500000 89.509714 10.200000 12.600000 91.378404 10.200000 12.700000 93.267093 10.200000 12.800000 95.175783 10.200000 12.900000 97.104472 10.200000 13.000000 99.053162 10.200000 13.100000 101.021851 10.200000 13.200000 103.010541 10.200000 13.300000 105.019231 10.200000 13.400000 107.047920 10.200000 13.500000 109.096610 10.200000 13.600000 111.165299 10.200000 13.700000 113.253989 10.200000 13.800000 115.362678 10.200000 13.900000 117.491368 10.200000 14.000000 119.640058 10.200000 14.100000 121.808747 10.200000 14.200000 123.997437 10.200000 14.300000 126.206126 10.200000 14.400000 128.434816 10.200000 14.500000 130.683505 10.200000 14.600000 132.952195 10.200000 14.700000 135.240885 10.200000 14.800000 137.549574 10.200000 14.900000 139.878264 10.200000 15.000000 142.226953 10.300000 -5.000000 72.939804 10.300000 -4.900000 71.287359 10.300000 -4.800000 69.654914 10.300000 -4.700000 68.042469 10.300000 -4.600000 66.450024 10.300000 -4.500000 64.877579 10.300000 -4.400000 63.325134 10.300000 -4.300000 61.792689 10.300000 -4.200000 60.280244 10.300000 -4.100000 58.787798 10.300000 -4.000000 57.315353 10.300000 -3.900000 55.862908 10.300000 -3.800000 54.430463 10.300000 -3.700000 53.018018 10.300000 -3.600000 51.625573 10.300000 -3.500000 50.253128 10.300000 -3.400000 48.900683 10.300000 -3.300000 47.568238 10.300000 -3.200000 46.255793 10.300000 -3.100000 44.963348 10.300000 -3.000000 43.690903 10.300000 -2.900000 42.438457 10.300000 -2.800000 41.206012 10.300000 -2.700000 39.993567 10.300000 -2.600000 38.801122 10.300000 -2.500000 37.628677 10.300000 -2.400000 36.476232 10.300000 -2.300000 35.343787 10.300000 -2.200000 34.231342 10.300000 -2.100000 33.138897 10.300000 -2.000000 32.066452 10.300000 -1.900000 31.014007 10.300000 -1.800000 29.981561 10.300000 -1.700000 28.969116 10.300000 -1.600000 27.976671 10.300000 -1.500000 27.004226 10.300000 -1.400000 26.051781 10.300000 -1.300000 25.119336 10.300000 -1.200000 24.206891 10.300000 -1.100000 23.314446 10.300000 -1.000000 22.442001 10.300000 -0.900000 21.589556 10.300000 -0.800000 20.757111 10.300000 -0.700000 19.944666 10.300000 -0.600000 19.152220 10.300000 -0.500000 18.379775 10.300000 -0.400000 17.627330 10.300000 -0.300000 16.894885 10.300000 -0.200000 16.182440 10.300000 -0.100000 15.489995 10.300000 -0.000000 14.817550 10.300000 0.100000 14.165105 10.300000 0.200000 13.532660 10.300000 0.300000 12.920215 10.300000 0.400000 12.327770 10.300000 0.500000 11.755324 10.300000 0.600000 11.202879 10.300000 0.700000 10.670434 10.300000 0.800000 10.157989 10.300000 0.900000 9.665544 10.300000 1.000000 9.193099 10.300000 1.100000 8.740654 10.300000 1.200000 8.308209 10.300000 1.300000 7.895764 10.300000 1.400000 7.503319 10.300000 1.500000 7.130874 10.300000 1.600000 6.778428 10.300000 1.700000 6.445983 10.300000 1.800000 6.133538 10.300000 1.900000 5.841093 10.300000 2.000000 5.568648 10.300000 2.100000 5.316203 10.300000 2.200000 5.083758 10.300000 2.300000 4.871313 10.300000 2.400000 4.678868 10.300000 2.500000 4.506423 10.300000 2.600000 4.353978 10.300000 2.700000 4.221533 10.300000 2.800000 4.109087 10.300000 2.900000 4.016642 10.300000 3.000000 3.944197 10.300000 3.100000 3.891752 10.300000 3.200000 3.859307 10.300000 3.300000 3.846862 10.300000 3.400000 3.854417 10.300000 3.500000 3.881972 10.300000 3.600000 3.929527 10.300000 3.700000 3.997082 10.300000 3.800000 4.084637 10.300000 3.900000 4.192191 10.300000 4.000000 4.319746 10.300000 4.100000 4.467301 10.300000 4.200000 4.634856 10.300000 4.300000 4.822411 10.300000 4.400000 5.029966 10.300000 4.500000 5.257521 10.300000 4.600000 5.505076 10.300000 4.700000 5.772631 10.300000 4.800000 6.060186 10.300000 4.900000 6.367741 10.300000 5.000000 6.695296 10.300000 5.100000 7.042850 10.300000 5.200000 7.410405 10.300000 5.300000 7.797960 10.300000 5.400000 8.205515 10.300000 5.500000 8.633070 10.300000 5.600000 9.080625 10.300000 5.700000 9.548180 10.300000 5.800000 10.035735 10.300000 5.900000 10.543290 10.300000 6.000000 11.070845 10.300000 6.100000 11.618400 10.300000 6.200000 12.185954 10.300000 6.300000 12.773509 10.300000 6.400000 13.381064 10.300000 6.500000 14.008619 10.300000 6.600000 14.656174 10.300000 6.700000 15.323729 10.300000 6.800000 16.011284 10.300000 6.900000 16.718839 10.300000 7.000000 17.446394 10.300000 7.100000 18.193949 10.300000 7.200000 18.961504 10.300000 7.300000 19.749059 10.300000 7.400000 20.556613 10.300000 7.500000 21.384168 10.300000 7.600000 22.231723 10.300000 7.700000 23.099278 10.300000 7.800000 23.986833 10.300000 7.900000 24.894388 10.300000 8.000000 25.821943 10.300000 8.100000 26.769498 10.300000 8.200000 27.737053 10.300000 8.300000 28.724608 10.300000 8.400000 29.732163 10.300000 8.500000 30.759717 10.300000 8.600000 31.807272 10.300000 8.700000 32.874827 10.300000 8.800000 33.962382 10.300000 8.900000 35.069937 10.300000 9.000000 36.197492 10.300000 9.100000 37.345047 10.300000 9.200000 38.512602 10.300000 9.300000 39.700157 10.300000 9.400000 40.907712 10.300000 9.500000 42.135267 10.300000 9.600000 43.382822 10.300000 9.700000 44.650376 10.300000 9.800000 45.937931 10.300000 9.900000 47.245486 10.300000 10.000000 48.573041 10.300000 10.100000 49.920596 10.300000 10.200000 51.288151 10.300000 10.300000 52.675706 10.300000 10.400000 54.083261 10.300000 10.500000 55.510816 10.300000 10.600000 56.958371 10.300000 10.700000 58.425926 10.300000 10.800000 59.913480 10.300000 10.900000 61.421035 10.300000 11.000000 62.948590 10.300000 11.100000 64.496145 10.300000 11.200000 66.063700 10.300000 11.300000 67.651255 10.300000 11.400000 69.258810 10.300000 11.500000 70.886365 10.300000 11.600000 72.533920 10.300000 11.700000 74.201475 10.300000 11.800000 75.889030 10.300000 11.900000 77.596585 10.300000 12.000000 79.324139 10.300000 12.100000 81.071694 10.300000 12.200000 82.839249 10.300000 12.300000 84.626804 10.300000 12.400000 86.434359 10.300000 12.500000 88.261914 10.300000 12.600000 90.109469 10.300000 12.700000 91.977024 10.300000 12.800000 93.864579 10.300000 12.900000 95.772134 10.300000 13.000000 97.699689 10.300000 13.100000 99.647243 10.300000 13.200000 101.614798 10.300000 13.300000 103.602353 10.300000 13.400000 105.609908 10.300000 13.500000 107.637463 10.300000 13.600000 109.685018 10.300000 13.700000 111.752573 10.300000 13.800000 113.840128 10.300000 13.900000 115.947683 10.300000 14.000000 118.075238 10.300000 14.100000 120.222793 10.300000 14.200000 122.390347 10.300000 14.300000 124.577902 10.300000 14.400000 126.785457 10.300000 14.500000 129.013012 10.300000 14.600000 131.260567 10.300000 14.700000 133.528122 10.300000 14.800000 135.815677 10.300000 14.900000 138.123232 10.300000 15.000000 140.450787 10.400000 -5.000000 75.517890 10.400000 -4.900000 73.843794 10.400000 -4.800000 72.189697 10.400000 -4.700000 70.555601 10.400000 -4.600000 68.941504 10.400000 -4.500000 67.347408 10.400000 -4.400000 65.773311 10.400000 -4.300000 64.219215 10.400000 -4.200000 62.685118 10.400000 -4.100000 61.171022 10.400000 -4.000000 59.676925 10.400000 -3.900000 58.202829 10.400000 -3.800000 56.748732 10.400000 -3.700000 55.314636 10.400000 -3.600000 53.900539 10.400000 -3.500000 52.506443 10.400000 -3.400000 51.132347 10.400000 -3.300000 49.778250 10.400000 -3.200000 48.444154 10.400000 -3.100000 47.130057 10.400000 -3.000000 45.835961 10.400000 -2.900000 44.561864 10.400000 -2.800000 43.307768 10.400000 -2.700000 42.073671 10.400000 -2.600000 40.859575 10.400000 -2.500000 39.665478 10.400000 -2.400000 38.491382 10.400000 -2.300000 37.337285 10.400000 -2.200000 36.203189 10.400000 -2.100000 35.089092 10.400000 -2.000000 33.994996 10.400000 -1.900000 32.920899 10.400000 -1.800000 31.866803 10.400000 -1.700000 30.832706 10.400000 -1.600000 29.818610 10.400000 -1.500000 28.824513 10.400000 -1.400000 27.850417 10.400000 -1.300000 26.896320 10.400000 -1.200000 25.962224 10.400000 -1.100000 25.048127 10.400000 -1.000000 24.154031 10.400000 -0.900000 23.279934 10.400000 -0.800000 22.425838 10.400000 -0.700000 21.591741 10.400000 -0.600000 20.777645 10.400000 -0.500000 19.983548 10.400000 -0.400000 19.209452 10.400000 -0.300000 18.455355 10.400000 -0.200000 17.721259 10.400000 -0.100000 17.007162 10.400000 -0.000000 16.313066 10.400000 0.100000 15.638970 10.400000 0.200000 14.984873 10.400000 0.300000 14.350777 10.400000 0.400000 13.736680 10.400000 0.500000 13.142584 10.400000 0.600000 12.568487 10.400000 0.700000 12.014391 10.400000 0.800000 11.480294 10.400000 0.900000 10.966198 10.400000 1.000000 10.472101 10.400000 1.100000 9.998005 10.400000 1.200000 9.543908 10.400000 1.300000 9.109812 10.400000 1.400000 8.695715 10.400000 1.500000 8.301619 10.400000 1.600000 7.927522 10.400000 1.700000 7.573426 10.400000 1.800000 7.239329 10.400000 1.900000 6.925233 10.400000 2.000000 6.631136 10.400000 2.100000 6.357040 10.400000 2.200000 6.102943 10.400000 2.300000 5.868847 10.400000 2.400000 5.654750 10.400000 2.500000 5.460654 10.400000 2.600000 5.286557 10.400000 2.700000 5.132461 10.400000 2.800000 4.998364 10.400000 2.900000 4.884268 10.400000 3.000000 4.790171 10.400000 3.100000 4.716075 10.400000 3.200000 4.661978 10.400000 3.300000 4.627882 10.400000 3.400000 4.613785 10.400000 3.500000 4.619689 10.400000 3.600000 4.645593 10.400000 3.700000 4.691496 10.400000 3.800000 4.757400 10.400000 3.900000 4.843303 10.400000 4.000000 4.949207 10.400000 4.100000 5.075110 10.400000 4.200000 5.221014 10.400000 4.300000 5.386917 10.400000 4.400000 5.572821 10.400000 4.500000 5.778724 10.400000 4.600000 6.004628 10.400000 4.700000 6.250531 10.400000 4.800000 6.516435 10.400000 4.900000 6.802338 10.400000 5.000000 7.108242 10.400000 5.100000 7.434145 10.400000 5.200000 7.780049 10.400000 5.300000 8.145952 10.400000 5.400000 8.531856 10.400000 5.500000 8.937759 10.400000 5.600000 9.363663 10.400000 5.700000 9.809566 10.400000 5.800000 10.275470 10.400000 5.900000 10.761373 10.400000 6.000000 11.267277 10.400000 6.100000 11.793180 10.400000 6.200000 12.339084 10.400000 6.300000 12.904987 10.400000 6.400000 13.490891 10.400000 6.500000 14.096794 10.400000 6.600000 14.722698 10.400000 6.700000 15.368601 10.400000 6.800000 16.034505 10.400000 6.900000 16.720409 10.400000 7.000000 17.426312 10.400000 7.100000 18.152216 10.400000 7.200000 18.898119 10.400000 7.300000 19.664023 10.400000 7.400000 20.449926 10.400000 7.500000 21.255830 10.400000 7.600000 22.081733 10.400000 7.700000 22.927637 10.400000 7.800000 23.793540 10.400000 7.900000 24.679444 10.400000 8.000000 25.585347 10.400000 8.100000 26.511251 10.400000 8.200000 27.457154 10.400000 8.300000 28.423058 10.400000 8.400000 29.408961 10.400000 8.500000 30.414865 10.400000 8.600000 31.440768 10.400000 8.700000 32.486672 10.400000 8.800000 33.552575 10.400000 8.900000 34.638479 10.400000 9.000000 35.744382 10.400000 9.100000 36.870286 10.400000 9.200000 38.016189 10.400000 9.300000 39.182093 10.400000 9.400000 40.367996 10.400000 9.500000 41.573900 10.400000 9.600000 42.799803 10.400000 9.700000 44.045707 10.400000 9.800000 45.311610 10.400000 9.900000 46.597514 10.400000 10.000000 47.903417 10.400000 10.100000 49.229321 10.400000 10.200000 50.575224 10.400000 10.300000 51.941128 10.400000 10.400000 53.327032 10.400000 10.500000 54.732935 10.400000 10.600000 56.158839 10.400000 10.700000 57.604742 10.400000 10.800000 59.070646 10.400000 10.900000 60.556549 10.400000 11.000000 62.062453 10.400000 11.100000 63.588356 10.400000 11.200000 65.134260 10.400000 11.300000 66.700163 10.400000 11.400000 68.286067 10.400000 11.500000 69.891970 10.400000 11.600000 71.517874 10.400000 11.700000 73.163777 10.400000 11.800000 74.829681 10.400000 11.900000 76.515584 10.400000 12.000000 78.221488 10.400000 12.100000 79.947391 10.400000 12.200000 81.693295 10.400000 12.300000 83.459198 10.400000 12.400000 85.245102 10.400000 12.500000 87.051005 10.400000 12.600000 88.876909 10.400000 12.700000 90.722812 10.400000 12.800000 92.588716 10.400000 12.900000 94.474619 10.400000 13.000000 96.380523 10.400000 13.100000 98.306426 10.400000 13.200000 100.252330 10.400000 13.300000 102.218233 10.400000 13.400000 104.204137 10.400000 13.500000 106.210040 10.400000 13.600000 108.235944 10.400000 13.700000 110.281847 10.400000 13.800000 112.347751 10.400000 13.900000 114.433655 10.400000 14.000000 116.539558 10.400000 14.100000 118.665462 10.400000 14.200000 120.811365 10.400000 14.300000 122.977269 10.400000 14.400000 125.163172 10.400000 14.500000 127.369076 10.400000 14.600000 129.594979 10.400000 14.700000 131.840883 10.400000 14.800000 134.106786 10.400000 14.900000 136.392690 10.400000 15.000000 138.698593 10.500000 -5.000000 78.217315 10.500000 -4.900000 76.521050 10.500000 -4.800000 74.844786 10.500000 -4.700000 73.188521 10.500000 -4.600000 71.552256 10.500000 -4.500000 69.935992 10.500000 -4.400000 68.339727 10.500000 -4.300000 66.763462 10.500000 -4.200000 65.207198 10.500000 -4.100000 63.670933 10.500000 -4.000000 62.154669 10.500000 -3.900000 60.658404 10.500000 -3.800000 59.182139 10.500000 -3.700000 57.725875 10.500000 -3.600000 56.289610 10.500000 -3.500000 54.873346 10.500000 -3.400000 53.477081 10.500000 -3.300000 52.100816 10.500000 -3.200000 50.744552 10.500000 -3.100000 49.408287 10.500000 -3.000000 48.092022 10.500000 -2.900000 46.795758 10.500000 -2.800000 45.519493 10.500000 -2.700000 44.263229 10.500000 -2.600000 43.026964 10.500000 -2.500000 41.810699 10.500000 -2.400000 40.614435 10.500000 -2.300000 39.438170 10.500000 -2.200000 38.281905 10.500000 -2.100000 37.145641 10.500000 -2.000000 36.029376 10.500000 -1.900000 34.933112 10.500000 -1.800000 33.856847 10.500000 -1.700000 32.800582 10.500000 -1.600000 31.764318 10.500000 -1.500000 30.748053 10.500000 -1.400000 29.751788 10.500000 -1.300000 28.775524 10.500000 -1.200000 27.819259 10.500000 -1.100000 26.882995 10.500000 -1.000000 25.966730 10.500000 -0.900000 25.070465 10.500000 -0.800000 24.194201 10.500000 -0.700000 23.337936 10.500000 -0.600000 22.501671 10.500000 -0.500000 21.685407 10.500000 -0.400000 20.889142 10.500000 -0.300000 20.112878 10.500000 -0.200000 19.356613 10.500000 -0.100000 18.620348 10.500000 -0.000000 17.904084 10.500000 0.100000 17.207819 10.500000 0.200000 16.531555 10.500000 0.300000 15.875290 10.500000 0.400000 15.239025 10.500000 0.500000 14.622761 10.500000 0.600000 14.026496 10.500000 0.700000 13.450231 10.500000 0.800000 12.893967 10.500000 0.900000 12.357702 10.500000 1.000000 11.841438 10.500000 1.100000 11.345173 10.500000 1.200000 10.868908 10.500000 1.300000 10.412644 10.500000 1.400000 9.976379 10.500000 1.500000 9.560114 10.500000 1.600000 9.163850 10.500000 1.700000 8.787585 10.500000 1.800000 8.431321 10.500000 1.900000 8.095056 10.500000 2.000000 7.778791 10.500000 2.100000 7.482527 10.500000 2.200000 7.206262 10.500000 2.300000 6.949997 10.500000 2.400000 6.713733 10.500000 2.500000 6.497468 10.500000 2.600000 6.301204 10.500000 2.700000 6.124939 10.500000 2.800000 5.968674 10.500000 2.900000 5.832410 10.500000 3.000000 5.716145 10.500000 3.100000 5.619880 10.500000 3.200000 5.543616 10.500000 3.300000 5.487351 10.500000 3.400000 5.451087 10.500000 3.500000 5.434822 10.500000 3.600000 5.438557 10.500000 3.700000 5.462293 10.500000 3.800000 5.506028 10.500000 3.900000 5.569764 10.500000 4.000000 5.653499 10.500000 4.100000 5.757234 10.500000 4.200000 5.880970 10.500000 4.300000 6.024705 10.500000 4.400000 6.188440 10.500000 4.500000 6.372176 10.500000 4.600000 6.575911 10.500000 4.700000 6.799647 10.500000 4.800000 7.043382 10.500000 4.900000 7.307117 10.500000 5.000000 7.590853 10.500000 5.100000 7.894588 10.500000 5.200000 8.218323 10.500000 5.300000 8.562059 10.500000 5.400000 8.925794 10.500000 5.500000 9.309530 10.500000 5.600000 9.713265 10.500000 5.700000 10.137000 10.500000 5.800000 10.580736 10.500000 5.900000 11.044471 10.500000 6.000000 11.528206 10.500000 6.100000 12.031942 10.500000 6.200000 12.555677 10.500000 6.300000 13.099413 10.500000 6.400000 13.663148 10.500000 6.500000 14.246883 10.500000 6.600000 14.850619 10.500000 6.700000 15.474354 10.500000 6.800000 16.118089 10.500000 6.900000 16.781825 10.500000 7.000000 17.465560 10.500000 7.100000 18.169296 10.500000 7.200000 18.893031 10.500000 7.300000 19.636766 10.500000 7.400000 20.400502 10.500000 7.500000 21.184237 10.500000 7.600000 21.987972 10.500000 7.700000 22.811708 10.500000 7.800000 23.655443 10.500000 7.900000 24.519179 10.500000 8.000000 25.402914 10.500000 8.100000 26.306649 10.500000 8.200000 27.230385 10.500000 8.300000 28.174120 10.500000 8.400000 29.137856 10.500000 8.500000 30.121591 10.500000 8.600000 31.125326 10.500000 8.700000 32.149062 10.500000 8.800000 33.192797 10.500000 8.900000 34.256532 10.500000 9.000000 35.340268 10.500000 9.100000 36.444003 10.500000 9.200000 37.567739 10.500000 9.300000 38.711474 10.500000 9.400000 39.875209 10.500000 9.500000 41.058945 10.500000 9.600000 42.262680 10.500000 9.700000 43.486415 10.500000 9.800000 44.730151 10.500000 9.900000 45.993886 10.500000 10.000000 47.277622 10.500000 10.100000 48.581357 10.500000 10.200000 49.905092 10.500000 10.300000 51.248828 10.500000 10.400000 52.612563 10.500000 10.500000 53.996298 10.500000 10.600000 55.400034 10.500000 10.700000 56.823769 10.500000 10.800000 58.267505 10.500000 10.900000 59.731240 10.500000 11.000000 61.214975 10.500000 11.100000 62.718711 10.500000 11.200000 64.242446 10.500000 11.300000 65.786181 10.500000 11.400000 67.349917 10.500000 11.500000 68.933652 10.500000 11.600000 70.537388 10.500000 11.700000 72.161123 10.500000 11.800000 73.804858 10.500000 11.900000 75.468594 10.500000 12.000000 77.152329 10.500000 12.100000 78.856065 10.500000 12.200000 80.579800 10.500000 12.300000 82.323535 10.500000 12.400000 84.087271 10.500000 12.500000 85.871006 10.500000 12.600000 87.674741 10.500000 12.700000 89.498477 10.500000 12.800000 91.342212 10.500000 12.900000 93.205948 10.500000 13.000000 95.089683 10.500000 13.100000 96.993418 10.500000 13.200000 98.917154 10.500000 13.300000 100.860889 10.500000 13.400000 102.824624 10.500000 13.500000 104.808360 10.500000 13.600000 106.812095 10.500000 13.700000 108.835831 10.500000 13.800000 110.879566 10.500000 13.900000 112.943301 10.500000 14.000000 115.027037 10.500000 14.100000 117.130772 10.500000 14.200000 119.254507 10.500000 14.300000 121.398243 10.500000 14.400000 123.561978 10.500000 14.500000 125.745714 10.500000 14.600000 127.949449 10.500000 14.700000 130.173184 10.500000 14.800000 132.416920 10.500000 14.900000 134.680655 10.500000 15.000000 136.964390 10.600000 -5.000000 81.031598 10.600000 -4.900000 79.312649 10.600000 -4.800000 77.613699 10.600000 -4.700000 75.934750 10.600000 -4.600000 74.275800 10.600000 -4.500000 72.636851 10.600000 -4.400000 71.017901 10.600000 -4.300000 69.418952 10.600000 -4.200000 67.840002 10.600000 -4.100000 66.281053 10.600000 -4.000000 64.742103 10.600000 -3.900000 63.223154 10.600000 -3.800000 61.724204 10.600000 -3.700000 60.245255 10.600000 -3.600000 58.786305 10.600000 -3.500000 57.347356 10.600000 -3.400000 55.928406 10.600000 -3.300000 54.529457 10.600000 -3.200000 53.150507 10.600000 -3.100000 51.791558 10.600000 -3.000000 50.452608 10.600000 -2.900000 49.133659 10.600000 -2.800000 47.834709 10.600000 -2.700000 46.555760 10.600000 -2.600000 45.296810 10.600000 -2.500000 44.057861 10.600000 -2.400000 42.838911 10.600000 -2.300000 41.639962 10.600000 -2.200000 40.461012 10.600000 -2.100000 39.302063 10.600000 -2.000000 38.163113 10.600000 -1.900000 37.044164 10.600000 -1.800000 35.945214 10.600000 -1.700000 34.866265 10.600000 -1.600000 33.807315 10.600000 -1.500000 32.768366 10.600000 -1.400000 31.749416 10.600000 -1.300000 30.750467 10.600000 -1.200000 29.771517 10.600000 -1.100000 28.812568 10.600000 -1.000000 27.873618 10.600000 -0.900000 26.954669 10.600000 -0.800000 26.055719 10.600000 -0.700000 25.176770 10.600000 -0.600000 24.317820 10.600000 -0.500000 23.478871 10.600000 -0.400000 22.659921 10.600000 -0.300000 21.860972 10.600000 -0.200000 21.082022 10.600000 -0.100000 20.323073 10.600000 -0.000000 19.584123 10.600000 0.100000 18.865174 10.600000 0.200000 18.166224 10.600000 0.300000 17.487275 10.600000 0.400000 16.828325 10.600000 0.500000 16.189376 10.600000 0.600000 15.570427 10.600000 0.700000 14.971477 10.600000 0.800000 14.392528 10.600000 0.900000 13.833578 10.600000 1.000000 13.294629 10.600000 1.100000 12.775679 10.600000 1.200000 12.276730 10.600000 1.300000 11.797780 10.600000 1.400000 11.338831 10.600000 1.500000 10.899881 10.600000 1.600000 10.480932 10.600000 1.700000 10.081982 10.600000 1.800000 9.703033 10.600000 1.900000 9.344083 10.600000 2.000000 9.005134 10.600000 2.100000 8.686184 10.600000 2.200000 8.387235 10.600000 2.300000 8.108285 10.600000 2.400000 7.849336 10.600000 2.500000 7.610386 10.600000 2.600000 7.391437 10.600000 2.700000 7.192487 10.600000 2.800000 7.013538 10.600000 2.900000 6.854588 10.600000 3.000000 6.715639 10.600000 3.100000 6.596689 10.600000 3.200000 6.497740 10.600000 3.300000 6.418790 10.600000 3.400000 6.359841 10.600000 3.500000 6.320891 10.600000 3.600000 6.301942 10.600000 3.700000 6.302992 10.600000 3.800000 6.324043 10.600000 3.900000 6.365093 10.600000 4.000000 6.426144 10.600000 4.100000 6.507194 10.600000 4.200000 6.608245 10.600000 4.300000 6.729295 10.600000 4.400000 6.870346 10.600000 4.500000 7.031396 10.600000 4.600000 7.212447 10.600000 4.700000 7.413497 10.600000 4.800000 7.634548 10.600000 4.900000 7.875598 10.600000 5.000000 8.136649 10.600000 5.100000 8.417699 10.600000 5.200000 8.718750 10.600000 5.300000 9.039800 10.600000 5.400000 9.380851 10.600000 5.500000 9.741901 10.600000 5.600000 10.122952 10.600000 5.700000 10.524002 10.600000 5.800000 10.945053 10.600000 5.900000 11.386103 10.600000 6.000000 11.847154 10.600000 6.100000 12.328204 10.600000 6.200000 12.829255 10.600000 6.300000 13.350305 10.600000 6.400000 13.891356 10.600000 6.500000 14.452406 10.600000 6.600000 15.033457 10.600000 6.700000 15.634507 10.600000 6.800000 16.255558 10.600000 6.900000 16.896608 10.600000 7.000000 17.557659 10.600000 7.100000 18.238709 10.600000 7.200000 18.939760 10.600000 7.300000 19.660810 10.600000 7.400000 20.401861 10.600000 7.500000 21.162911 10.600000 7.600000 21.943962 10.600000 7.700000 22.745012 10.600000 7.800000 23.566063 10.600000 7.900000 24.407113 10.600000 8.000000 25.268164 10.600000 8.100000 26.149214 10.600000 8.200000 27.050265 10.600000 8.300000 27.971315 10.600000 8.400000 28.912366 10.600000 8.500000 29.873416 10.600000 8.600000 30.854467 10.600000 8.700000 31.855517 10.600000 8.800000 32.876568 10.600000 8.900000 33.917618 10.600000 9.000000 34.978669 10.600000 9.100000 36.059719 10.600000 9.200000 37.160770 10.600000 9.300000 38.281820 10.600000 9.400000 39.422871 10.600000 9.500000 40.583921 10.600000 9.600000 41.764972 10.600000 9.700000 42.966022 10.600000 9.800000 44.187073 10.600000 9.900000 45.428123 10.600000 10.000000 46.689174 10.600000 10.100000 47.970224 10.600000 10.200000 49.271275 10.600000 10.300000 50.592325 10.600000 10.400000 51.933376 10.600000 10.500000 53.294426 10.600000 10.600000 54.675477 10.600000 10.700000 56.076527 10.600000 10.800000 57.497578 10.600000 10.900000 58.938628 10.600000 11.000000 60.399679 10.600000 11.100000 61.880729 10.600000 11.200000 63.381780 10.600000 11.300000 64.902830 10.600000 11.400000 66.443881 10.600000 11.500000 68.004931 10.600000 11.600000 69.585982 10.600000 11.700000 71.187032 10.600000 11.800000 72.808083 10.600000 11.900000 74.449133 10.600000 12.000000 76.110184 10.600000 12.100000 77.791234 10.600000 12.200000 79.492285 10.600000 12.300000 81.213335 10.600000 12.400000 82.954386 10.600000 12.500000 84.715436 10.600000 12.600000 86.496487 10.600000 12.700000 88.297537 10.600000 12.800000 90.118588 10.600000 12.900000 91.959639 10.600000 13.000000 93.820689 10.600000 13.100000 95.701740 10.600000 13.200000 97.602790 10.600000 13.300000 99.523841 10.600000 13.400000 101.464891 10.600000 13.500000 103.425942 10.600000 13.600000 105.406992 10.600000 13.700000 107.408043 10.600000 13.800000 109.429093 10.600000 13.900000 111.470144 10.600000 14.000000 113.531194 10.600000 14.100000 115.612245 10.600000 14.200000 117.713295 10.600000 14.300000 119.834346 10.600000 14.400000 121.975396 10.600000 14.500000 124.136447 10.600000 14.600000 126.317497 10.600000 14.700000 128.518548 10.600000 14.800000 130.739598 10.600000 14.900000 132.980649 10.600000 15.000000 135.241699 10.700000 -5.000000 83.953845 10.700000 -4.900000 82.211694 10.700000 -4.800000 80.489543 10.700000 -4.700000 78.787392 10.700000 -4.600000 77.105241 10.700000 -4.500000 75.443090 10.700000 -4.400000 73.800939 10.700000 -4.300000 72.178787 10.700000 -4.200000 70.576636 10.700000 -4.100000 68.994485 10.700000 -4.000000 67.432334 10.700000 -3.900000 65.890183 10.700000 -3.800000 64.368032 10.700000 -3.700000 62.865881 10.700000 -3.600000 61.383730 10.700000 -3.500000 59.921579 10.700000 -3.400000 58.479427 10.700000 -3.300000 57.057276 10.700000 -3.200000 55.655125 10.700000 -3.100000 54.272974 10.700000 -3.000000 52.910823 10.700000 -2.900000 51.568672 10.700000 -2.800000 50.246521 10.700000 -2.700000 48.944370 10.700000 -2.600000 47.662219 10.700000 -2.500000 46.400067 10.700000 -2.400000 45.157916 10.700000 -2.300000 43.935765 10.700000 -2.200000 42.733614 10.700000 -2.100000 41.551463 10.700000 -2.000000 40.389312 10.700000 -1.900000 39.247161 10.700000 -1.800000 38.125010 10.700000 -1.700000 37.022859 10.700000 -1.600000 35.940707 10.700000 -1.500000 34.878556 10.700000 -1.400000 33.836405 10.700000 -1.300000 32.814254 10.700000 -1.200000 31.812103 10.700000 -1.100000 30.829952 10.700000 -1.000000 29.867801 10.700000 -0.900000 28.925650 10.700000 -0.800000 28.003499 10.700000 -0.700000 27.101348 10.700000 -0.600000 26.219196 10.700000 -0.500000 25.357045 10.700000 -0.400000 24.514894 10.700000 -0.300000 23.692743 10.700000 -0.200000 22.890592 10.700000 -0.100000 22.108441 10.700000 -0.000000 21.346290 10.700000 0.100000 20.604139 10.700000 0.200000 19.881988 10.700000 0.300000 19.179836 10.700000 0.400000 18.497685 10.700000 0.500000 17.835534 10.700000 0.600000 17.193383 10.700000 0.700000 16.571232 10.700000 0.800000 15.969081 10.700000 0.900000 15.386930 10.700000 1.000000 14.824779 10.700000 1.100000 14.282628 10.700000 1.200000 13.760476 10.700000 1.300000 13.258325 10.700000 1.400000 12.776174 10.700000 1.500000 12.314023 10.700000 1.600000 11.871872 10.700000 1.700000 11.449721 10.700000 1.800000 11.047570 10.700000 1.900000 10.665419 10.700000 2.000000 10.303268 10.700000 2.100000 9.961116 10.700000 2.200000 9.638965 10.700000 2.300000 9.336814 10.700000 2.400000 9.054663 10.700000 2.500000 8.792512 10.700000 2.600000 8.550361 10.700000 2.700000 8.328210 10.700000 2.800000 8.126059 10.700000 2.900000 7.943908 10.700000 3.000000 7.781756 10.700000 3.100000 7.639605 10.700000 3.200000 7.517454 10.700000 3.300000 7.415303 10.700000 3.400000 7.333152 10.700000 3.500000 7.271001 10.700000 3.600000 7.228850 10.700000 3.700000 7.206699 10.700000 3.800000 7.204548 10.700000 3.900000 7.222397 10.700000 4.000000 7.260245 10.700000 4.100000 7.318094 10.700000 4.200000 7.395943 10.700000 4.300000 7.493792 10.700000 4.400000 7.611641 10.700000 4.500000 7.749490 10.700000 4.600000 7.907339 10.700000 4.700000 8.085188 10.700000 4.800000 8.283037 10.700000 4.900000 8.500885 10.700000 5.000000 8.738734 10.700000 5.100000 8.996583 10.700000 5.200000 9.274432 10.700000 5.300000 9.572281 10.700000 5.400000 9.890130 10.700000 5.500000 10.227979 10.700000 5.600000 10.585828 10.700000 5.700000 10.963677 10.700000 5.800000 11.361525 10.700000 5.900000 11.779374 10.700000 6.000000 12.217223 10.700000 6.100000 12.675072 10.700000 6.200000 13.152921 10.700000 6.300000 13.650770 10.700000 6.400000 14.168619 10.700000 6.500000 14.706468 10.700000 6.600000 15.264317 10.700000 6.700000 15.842165 10.700000 6.800000 16.440014 10.700000 6.900000 17.057863 10.700000 7.000000 17.695712 10.700000 7.100000 18.353561 10.700000 7.200000 19.031410 10.700000 7.300000 19.729259 10.700000 7.400000 20.447108 10.700000 7.500000 21.184957 10.700000 7.600000 21.942806 10.700000 7.700000 22.720654 10.700000 7.800000 23.518503 10.700000 7.900000 24.336352 10.700000 8.000000 25.174201 10.700000 8.100000 26.032050 10.700000 8.200000 26.909899 10.700000 8.300000 27.807748 10.700000 8.400000 28.725597 10.700000 8.500000 29.663446 10.700000 8.600000 30.621294 10.700000 8.700000 31.599143 10.700000 8.800000 32.596992 10.700000 8.900000 33.614841 10.700000 9.000000 34.652690 10.700000 9.100000 35.710539 10.700000 9.200000 36.788388 10.700000 9.300000 37.886237 10.700000 9.400000 39.004086 10.700000 9.500000 40.141934 10.700000 9.600000 41.299783 10.700000 9.700000 42.477632 10.700000 9.800000 43.675481 10.700000 9.900000 44.893330 10.700000 10.000000 46.131179 10.700000 10.100000 47.389028 10.700000 10.200000 48.666877 10.700000 10.300000 49.964726 10.700000 10.400000 51.282574 10.700000 10.500000 52.620423 10.700000 10.600000 53.978272 10.700000 10.700000 55.356121 10.700000 10.800000 56.753970 10.700000 10.900000 58.171819 10.700000 11.000000 59.609668 10.700000 11.100000 61.067517 10.700000 11.200000 62.545366 10.700000 11.300000 64.043215 10.700000 11.400000 65.561063 10.700000 11.500000 67.098912 10.700000 11.600000 68.656761 10.700000 11.700000 70.234610 10.700000 11.800000 71.832459 10.700000 11.900000 73.450308 10.700000 12.000000 75.088157 10.700000 12.100000 76.746006 10.700000 12.200000 78.423855 10.700000 12.300000 80.121703 10.700000 12.400000 81.839552 10.700000 12.500000 83.577401 10.700000 12.600000 85.335250 10.700000 12.700000 87.113099 10.700000 12.800000 88.910948 10.700000 12.900000 90.728797 10.700000 13.000000 92.566646 10.700000 13.100000 94.424495 10.700000 13.200000 96.302343 10.700000 13.300000 98.200192 10.700000 13.400000 100.118041 10.700000 13.500000 102.055890 10.700000 13.600000 104.013739 10.700000 13.700000 105.991588 10.700000 13.800000 107.989437 10.700000 13.900000 110.007286 10.700000 14.000000 112.045135 10.700000 14.100000 114.102983 10.700000 14.200000 116.180832 10.700000 14.300000 118.278681 10.700000 14.400000 120.396530 10.700000 14.500000 122.534379 10.700000 14.600000 124.692228 10.700000 14.700000 126.870077 10.700000 14.800000 129.067926 10.700000 14.900000 131.285775 10.700000 15.000000 133.523624 10.800000 -5.000000 86.976831 10.800000 -4.900000 85.210961 10.800000 -4.800000 83.465092 10.800000 -4.700000 81.739222 10.800000 -4.600000 80.033353 10.800000 -4.500000 78.347483 10.800000 -4.400000 76.681614 10.800000 -4.300000 75.035744 10.800000 -4.200000 73.409875 10.800000 -4.100000 71.804006 10.800000 -4.000000 70.218136 10.800000 -3.900000 68.652267 10.800000 -3.800000 67.106397 10.800000 -3.700000 65.580528 10.800000 -3.600000 64.074658 10.800000 -3.500000 62.588789 10.800000 -3.400000 61.122919 10.800000 -3.300000 59.677050 10.800000 -3.200000 58.251180 10.800000 -3.100000 56.845311 10.800000 -3.000000 55.459442 10.800000 -2.900000 54.093572 10.800000 -2.800000 52.747703 10.800000 -2.700000 51.421833 10.800000 -2.600000 50.115964 10.800000 -2.500000 48.830094 10.800000 -2.400000 47.564225 10.800000 -2.300000 46.318355 10.800000 -2.200000 45.092486 10.800000 -2.100000 43.886616 10.800000 -2.000000 42.700747 10.800000 -1.900000 41.534877 10.800000 -1.800000 40.389008 10.800000 -1.700000 39.263139 10.800000 -1.600000 38.157269 10.800000 -1.500000 37.071400 10.800000 -1.400000 36.005530 10.800000 -1.300000 34.959661 10.800000 -1.200000 33.933791 10.800000 -1.100000 32.927922 10.800000 -1.000000 31.942052 10.800000 -0.900000 30.976183 10.800000 -0.800000 30.030313 10.800000 -0.700000 29.104444 10.800000 -0.600000 28.198575 10.800000 -0.500000 27.312705 10.800000 -0.400000 26.446836 10.800000 -0.300000 25.600966 10.800000 -0.200000 24.775097 10.800000 -0.100000 23.969227 10.800000 -0.000000 23.183358 10.800000 0.100000 22.417488 10.800000 0.200000 21.671619 10.800000 0.300000 20.945749 10.800000 0.400000 20.239880 10.800000 0.500000 19.554010 10.800000 0.600000 18.888141 10.800000 0.700000 18.242272 10.800000 0.800000 17.616402 10.800000 0.900000 17.010533 10.800000 1.000000 16.424663 10.800000 1.100000 15.858794 10.800000 1.200000 15.312924 10.800000 1.300000 14.787055 10.800000 1.400000 14.281185 10.800000 1.500000 13.795316 10.800000 1.600000 13.329446 10.800000 1.700000 12.883577 10.800000 1.800000 12.457708 10.800000 1.900000 12.051838 10.800000 2.000000 11.665969 10.800000 2.100000 11.300099 10.800000 2.200000 10.954230 10.800000 2.300000 10.628360 10.800000 2.400000 10.322491 10.800000 2.500000 10.036621 10.800000 2.600000 9.770752 10.800000 2.700000 9.524882 10.800000 2.800000 9.299013 10.800000 2.900000 9.093143 10.800000 3.000000 8.907274 10.800000 3.100000 8.741405 10.800000 3.200000 8.595535 10.800000 3.300000 8.469666 10.800000 3.400000 8.363796 10.800000 3.500000 8.277927 10.800000 3.600000 8.212057 10.800000 3.700000 8.166188 10.800000 3.800000 8.140318 10.800000 3.900000 8.134449 10.800000 4.000000 8.148579 10.800000 4.100000 8.182710 10.800000 4.200000 8.236841 10.800000 4.300000 8.310971 10.800000 4.400000 8.405102 10.800000 4.500000 8.519232 10.800000 4.600000 8.653363 10.800000 4.700000 8.807493 10.800000 4.800000 8.981624 10.800000 4.900000 9.175754 10.800000 5.000000 9.389885 10.800000 5.100000 9.624015 10.800000 5.200000 9.878146 10.800000 5.300000 10.152276 10.800000 5.400000 10.446407 10.800000 5.500000 10.760538 10.800000 5.600000 11.094668 10.800000 5.700000 11.448799 10.800000 5.800000 11.822929 10.800000 5.900000 12.217060 10.800000 6.000000 12.631190 10.800000 6.100000 13.065321 10.800000 6.200000 13.519451 10.800000 6.300000 13.993582 10.800000 6.400000 14.487712 10.800000 6.500000 15.001843 10.800000 6.600000 15.535974 10.800000 6.700000 16.090104 10.800000 6.800000 16.664235 10.800000 6.900000 17.258365 10.800000 7.000000 17.872496 10.800000 7.100000 18.506626 10.800000 7.200000 19.160757 10.800000 7.300000 19.834887 10.800000 7.400000 20.529018 10.800000 7.500000 21.243148 10.800000 7.600000 21.977279 10.800000 7.700000 22.731409 10.800000 7.800000 23.505540 10.800000 7.900000 24.299671 10.800000 8.000000 25.113801 10.800000 8.100000 25.947932 10.800000 8.200000 26.802062 10.800000 8.300000 27.676193 10.800000 8.400000 28.570323 10.800000 8.500000 29.484454 10.800000 8.600000 30.418584 10.800000 8.700000 31.372715 10.800000 8.800000 32.346845 10.800000 8.900000 33.340976 10.800000 9.000000 34.355106 10.800000 9.100000 35.389237 10.800000 9.200000 36.443368 10.800000 9.300000 37.517498 10.800000 9.400000 38.611629 10.800000 9.500000 39.725759 10.800000 9.600000 40.859890 10.800000 9.700000 42.014020 10.800000 9.800000 43.188151 10.800000 9.900000 44.382281 10.800000 10.000000 45.596412 10.800000 10.100000 46.830542 10.800000 10.200000 48.084673 10.800000 10.300000 49.358804 10.800000 10.400000 50.652934 10.800000 10.500000 51.967065 10.800000 10.600000 53.301195 10.800000 10.700000 54.655326 10.800000 10.800000 56.029456 10.800000 10.900000 57.423587 10.800000 11.000000 58.837717 10.800000 11.100000 60.271848 10.800000 11.200000 61.725978 10.800000 11.300000 63.200109 10.800000 11.400000 64.694239 10.800000 11.500000 66.208370 10.800000 11.600000 67.742501 10.800000 11.700000 69.296631 10.800000 11.800000 70.870762 10.800000 11.900000 72.464892 10.800000 12.000000 74.079023 10.800000 12.100000 75.713153 10.800000 12.200000 77.367284 10.800000 12.300000 79.041414 10.800000 12.400000 80.735545 10.800000 12.500000 82.449675 10.800000 12.600000 84.183806 10.800000 12.700000 85.937937 10.800000 12.800000 87.712067 10.800000 12.900000 89.506198 10.800000 13.000000 91.320328 10.800000 13.100000 93.154459 10.800000 13.200000 95.008589 10.800000 13.300000 96.882720 10.800000 13.400000 98.776850 10.800000 13.500000 100.690981 10.800000 13.600000 102.625111 10.800000 13.700000 104.579242 10.800000 13.800000 106.553372 10.800000 13.900000 108.547503 10.800000 14.000000 110.561634 10.800000 14.100000 112.595764 10.800000 14.200000 114.649895 10.800000 14.300000 116.724025 10.800000 14.400000 118.818156 10.800000 14.500000 120.932286 10.800000 14.600000 123.066417 10.800000 14.700000 125.220547 10.800000 14.800000 127.394678 10.800000 14.900000 129.588808 10.800000 15.000000 131.802939 10.900000 -5.000000 90.093091 10.900000 -4.900000 88.302986 10.900000 -4.800000 86.532882 10.900000 -4.700000 84.782777 10.900000 -4.600000 83.052673 10.900000 -4.500000 81.342568 10.900000 -4.400000 79.652464 10.900000 -4.300000 77.982359 10.900000 -4.200000 76.332255 10.900000 -4.100000 74.702150 10.900000 -4.000000 73.092045 10.900000 -3.900000 71.501941 10.900000 -3.800000 69.931836 10.900000 -3.700000 68.381732 10.900000 -3.600000 66.851627 10.900000 -3.500000 65.341523 10.900000 -3.400000 63.851418 10.900000 -3.300000 62.381314 10.900000 -3.200000 60.931209 10.900000 -3.100000 59.501105 10.900000 -3.000000 58.091000 10.900000 -2.900000 56.700895 10.900000 -2.800000 55.330791 10.900000 -2.700000 53.980686 10.900000 -2.600000 52.650582 10.900000 -2.500000 51.340477 10.900000 -2.400000 50.050373 10.900000 -2.300000 48.780268 10.900000 -2.200000 47.530164 10.900000 -2.100000 46.300059 10.900000 -2.000000 45.089955 10.900000 -1.900000 43.899850 10.900000 -1.800000 42.729745 10.900000 -1.700000 41.579641 10.900000 -1.600000 40.449536 10.900000 -1.500000 39.339432 10.900000 -1.400000 38.249327 10.900000 -1.300000 37.179223 10.900000 -1.200000 36.129118 10.900000 -1.100000 35.099014 10.900000 -1.000000 34.088909 10.900000 -0.900000 33.098804 10.900000 -0.800000 32.128700 10.900000 -0.700000 31.178595 10.900000 -0.600000 30.248491 10.900000 -0.500000 29.338386 10.900000 -0.400000 28.448282 10.900000 -0.300000 27.578177 10.900000 -0.200000 26.728073 10.900000 -0.100000 25.897968 10.900000 -0.000000 25.087864 10.900000 0.100000 24.297759 10.900000 0.200000 23.527654 10.900000 0.300000 22.777550 10.900000 0.400000 22.047445 10.900000 0.500000 21.337341 10.900000 0.600000 20.647236 10.900000 0.700000 19.977132 10.900000 0.800000 19.327027 10.900000 0.900000 18.696923 10.900000 1.000000 18.086818 10.900000 1.100000 17.496714 10.900000 1.200000 16.926609 10.900000 1.300000 16.376504 10.900000 1.400000 15.846400 10.900000 1.500000 15.336295 10.900000 1.600000 14.846191 10.900000 1.700000 14.376086 10.900000 1.800000 13.925982 10.900000 1.900000 13.495877 10.900000 2.000000 13.085773 10.900000 2.100000 12.695668 10.900000 2.200000 12.325564 10.900000 2.300000 11.975459 10.900000 2.400000 11.645354 10.900000 2.500000 11.335250 10.900000 2.600000 11.045145 10.900000 2.700000 10.775041 10.900000 2.800000 10.524936 10.900000 2.900000 10.294832 10.900000 3.000000 10.084727 10.900000 3.100000 9.894623 10.900000 3.200000 9.724518 10.900000 3.300000 9.574414 10.900000 3.400000 9.444309 10.900000 3.500000 9.334204 10.900000 3.600000 9.244100 10.900000 3.700000 9.173995 10.900000 3.800000 9.123891 10.900000 3.900000 9.093786 10.900000 4.000000 9.083682 10.900000 4.100000 9.093577 10.900000 4.200000 9.123473 10.900000 4.300000 9.173368 10.900000 4.400000 9.243264 10.900000 4.500000 9.333159 10.900000 4.600000 9.443054 10.900000 4.700000 9.572950 10.900000 4.800000 9.722845 10.900000 4.900000 9.892741 10.900000 5.000000 10.082636 10.900000 5.100000 10.292532 10.900000 5.200000 10.522427 10.900000 5.300000 10.772323 10.900000 5.400000 11.042218 10.900000 5.500000 11.332113 10.900000 5.600000 11.642009 10.900000 5.700000 11.971904 10.900000 5.800000 12.321800 10.900000 5.900000 12.691695 10.900000 6.000000 13.081591 10.900000 6.100000 13.491486 10.900000 6.200000 13.921382 10.900000 6.300000 14.371277 10.900000 6.400000 14.841173 10.900000 6.500000 15.331068 10.900000 6.600000 15.840963 10.900000 6.700000 16.370859 10.900000 6.800000 16.920754 10.900000 6.900000 17.490650 10.900000 7.000000 18.080545 10.900000 7.100000 18.690441 10.900000 7.200000 19.320336 10.900000 7.300000 19.970232 10.900000 7.400000 20.640127 10.900000 7.500000 21.330023 10.900000 7.600000 22.039918 10.900000 7.700000 22.769813 10.900000 7.800000 23.519709 10.900000 7.900000 24.289604 10.900000 8.000000 25.079500 10.900000 8.100000 25.889395 10.900000 8.200000 26.719291 10.900000 8.300000 27.569186 10.900000 8.400000 28.439082 10.900000 8.500000 29.328977 10.900000 8.600000 30.238873 10.900000 8.700000 31.168768 10.900000 8.800000 32.118663 10.900000 8.900000 33.088559 10.900000 9.000000 34.078454 10.900000 9.100000 35.088350 10.900000 9.200000 36.118245 10.900000 9.300000 37.168141 10.900000 9.400000 38.238036 10.900000 9.500000 39.327932 10.900000 9.600000 40.437827 10.900000 9.700000 41.567723 10.900000 9.800000 42.717618 10.900000 9.900000 43.887513 10.900000 10.000000 45.077409 10.900000 10.100000 46.287304 10.900000 10.200000 47.517200 10.900000 10.300000 48.767095 10.900000 10.400000 50.036991 10.900000 10.500000 51.326886 10.900000 10.600000 52.636782 10.900000 10.700000 53.966677 10.900000 10.800000 55.316573 10.900000 10.900000 56.686468 10.900000 11.000000 58.076363 10.900000 11.100000 59.486259 10.900000 11.200000 60.916154 10.900000 11.300000 62.366050 10.900000 11.400000 63.835945 10.900000 11.500000 65.325841 10.900000 11.600000 66.835736 10.900000 11.700000 68.365632 10.900000 11.800000 69.915527 10.900000 11.900000 71.485422 10.900000 12.000000 73.075318 10.900000 12.100000 74.685213 10.900000 12.200000 76.315109 10.900000 12.300000 77.965004 10.900000 12.400000 79.634900 10.900000 12.500000 81.324795 10.900000 12.600000 83.034691 10.900000 12.700000 84.764586 10.900000 12.800000 86.514482 10.900000 12.900000 88.284377 10.900000 13.000000 90.074272 10.900000 13.100000 91.884168 10.900000 13.200000 93.714063 10.900000 13.300000 95.563959 10.900000 13.400000 97.433854 10.900000 13.500000 99.323750 10.900000 13.600000 101.233645 10.900000 13.700000 103.163541 10.900000 13.800000 105.113436 10.900000 13.900000 107.083332 10.900000 14.000000 109.073227 10.900000 14.100000 111.083122 10.900000 14.200000 113.113018 10.900000 14.300000 115.162913 10.900000 14.400000 117.232809 10.900000 14.500000 119.322704 10.900000 14.600000 121.432600 10.900000 14.700000 123.562495 10.900000 14.800000 125.712391 10.900000 14.900000 127.882286 10.900000 15.000000 130.072182 11.000000 -5.000000 93.295016 11.000000 -4.900000 91.480159 11.000000 -4.800000 89.685303 11.000000 -4.700000 87.910447 11.000000 -4.600000 86.155590 11.000000 -4.500000 84.420734 11.000000 -4.400000 82.705877 11.000000 -4.300000 81.011021 11.000000 -4.200000 79.336165 11.000000 -4.100000 77.681308 11.000000 -4.000000 76.046452 11.000000 -3.900000 74.431596 11.000000 -3.800000 72.836739 11.000000 -3.700000 71.261883 11.000000 -3.600000 69.707026 11.000000 -3.500000 68.172170 11.000000 -3.400000 66.657314 11.000000 -3.300000 65.162457 11.000000 -3.200000 63.687601 11.000000 -3.100000 62.232745 11.000000 -3.000000 60.797888 11.000000 -2.900000 59.383032 11.000000 -2.800000 57.988175 11.000000 -2.700000 56.613319 11.000000 -2.600000 55.258463 11.000000 -2.500000 53.923606 11.000000 -2.400000 52.608750 11.000000 -2.300000 51.313894 11.000000 -2.200000 50.039037 11.000000 -2.100000 48.784181 11.000000 -2.000000 47.549324 11.000000 -1.900000 46.334468 11.000000 -1.800000 45.139612 11.000000 -1.700000 43.964755 11.000000 -1.600000 42.809899 11.000000 -1.500000 41.675043 11.000000 -1.400000 40.560186 11.000000 -1.300000 39.465330 11.000000 -1.200000 38.390473 11.000000 -1.100000 37.335617 11.000000 -1.000000 36.300761 11.000000 -0.900000 35.285904 11.000000 -0.800000 34.291048 11.000000 -0.700000 33.316192 11.000000 -0.600000 32.361335 11.000000 -0.500000 31.426479 11.000000 -0.400000 30.511622 11.000000 -0.300000 29.616766 11.000000 -0.200000 28.741910 11.000000 -0.100000 27.887053 11.000000 -0.000000 27.052197 11.000000 0.100000 26.237341 11.000000 0.200000 25.442484 11.000000 0.300000 24.667628 11.000000 0.400000 23.912771 11.000000 0.500000 23.177915 11.000000 0.600000 22.463059 11.000000 0.700000 21.768202 11.000000 0.800000 21.093346 11.000000 0.900000 20.438490 11.000000 1.000000 19.803633 11.000000 1.100000 19.188777 11.000000 1.200000 18.593920 11.000000 1.300000 18.019064 11.000000 1.400000 17.464208 11.000000 1.500000 16.929351 11.000000 1.600000 16.414495 11.000000 1.700000 15.919639 11.000000 1.800000 15.444782 11.000000 1.900000 14.989926 11.000000 2.000000 14.555069 11.000000 2.100000 14.140213 11.000000 2.200000 13.745357 11.000000 2.300000 13.370500 11.000000 2.400000 13.015644 11.000000 2.500000 12.680788 11.000000 2.600000 12.365931 11.000000 2.700000 12.071075 11.000000 2.800000 11.796219 11.000000 2.900000 11.541362 11.000000 3.000000 11.306506 11.000000 3.100000 11.091649 11.000000 3.200000 10.896793 11.000000 3.300000 10.721937 11.000000 3.400000 10.567080 11.000000 3.500000 10.432224 11.000000 3.600000 10.317368 11.000000 3.700000 10.222511 11.000000 3.800000 10.147655 11.000000 3.900000 10.092798 11.000000 4.000000 10.057942 11.000000 4.100000 10.043086 11.000000 4.200000 10.048229 11.000000 4.300000 10.073373 11.000000 4.400000 10.118517 11.000000 4.500000 10.183660 11.000000 4.600000 10.268804 11.000000 4.700000 10.373947 11.000000 4.800000 10.499091 11.000000 4.900000 10.644235 11.000000 5.000000 10.809378 11.000000 5.100000 10.994522 11.000000 5.200000 11.199666 11.000000 5.300000 11.424809 11.000000 5.400000 11.669953 11.000000 5.500000 11.935096 11.000000 5.600000 12.220240 11.000000 5.700000 12.525384 11.000000 5.800000 12.850527 11.000000 5.900000 13.195671 11.000000 6.000000 13.560815 11.000000 6.100000 13.945958 11.000000 6.200000 14.351102 11.000000 6.300000 14.776245 11.000000 6.400000 15.221389 11.000000 6.500000 15.686533 11.000000 6.600000 16.171676 11.000000 6.700000 16.676820 11.000000 6.800000 17.201964 11.000000 6.900000 17.747107 11.000000 7.000000 18.312251 11.000000 7.100000 18.897394 11.000000 7.200000 19.502538 11.000000 7.300000 20.127682 11.000000 7.400000 20.772825 11.000000 7.500000 21.437969 11.000000 7.600000 22.123113 11.000000 7.700000 22.828256 11.000000 7.800000 23.553400 11.000000 7.900000 24.298543 11.000000 8.000000 25.063687 11.000000 8.100000 25.848831 11.000000 8.200000 26.653974 11.000000 8.300000 27.479118 11.000000 8.400000 28.324262 11.000000 8.500000 29.189405 11.000000 8.600000 30.074549 11.000000 8.700000 30.979692 11.000000 8.800000 31.904836 11.000000 8.900000 32.849980 11.000000 9.000000 33.815123 11.000000 9.100000 34.800267 11.000000 9.200000 35.805411 11.000000 9.300000 36.830554 11.000000 9.400000 37.875698 11.000000 9.500000 38.940842 11.000000 9.600000 40.025985 11.000000 9.700000 41.131129 11.000000 9.800000 42.256272 11.000000 9.900000 43.401416 11.000000 10.000000 44.566560 11.000000 10.100000 45.751703 11.000000 10.200000 46.956847 11.000000 10.300000 48.181991 11.000000 10.400000 49.427134 11.000000 10.500000 50.692278 11.000000 10.600000 51.977421 11.000000 10.700000 53.282565 11.000000 10.800000 54.607709 11.000000 10.900000 55.952852 11.000000 11.000000 57.317996 11.000000 11.100000 58.703140 11.000000 11.200000 60.108283 11.000000 11.300000 61.533427 11.000000 11.400000 62.978570 11.000000 11.500000 64.443714 11.000000 11.600000 65.928858 11.000000 11.700000 67.434001 11.000000 11.800000 68.959145 11.000000 11.900000 70.504289 11.000000 12.000000 72.069432 11.000000 12.100000 73.654576 11.000000 12.200000 75.259719 11.000000 12.300000 76.884863 11.000000 12.400000 78.530007 11.000000 12.500000 80.195150 11.000000 12.600000 81.880294 11.000000 12.700000 83.585438 11.000000 12.800000 85.310581 11.000000 12.900000 87.055725 11.000000 13.000000 88.820868 11.000000 13.100000 90.606012 11.000000 13.200000 92.411156 11.000000 13.300000 94.236299 11.000000 13.400000 96.081443 11.000000 13.500000 97.946587 11.000000 13.600000 99.831730 11.000000 13.700000 101.736874 11.000000 13.800000 103.662017 11.000000 13.900000 105.607161 11.000000 14.000000 107.572305 11.000000 14.100000 109.557448 11.000000 14.200000 111.562592 11.000000 14.300000 113.587736 11.000000 14.400000 115.632879 11.000000 14.500000 117.698023 11.000000 14.600000 119.783166 11.000000 14.700000 121.888310 11.000000 14.800000 124.013454 11.000000 14.900000 126.158597 11.000000 15.000000 128.323741 11.100000 -5.000000 96.574943 11.100000 -4.900000 94.734818 11.100000 -4.800000 92.914693 11.100000 -4.700000 91.114568 11.100000 -4.600000 89.334443 11.100000 -4.500000 87.574319 11.100000 -4.400000 85.834194 11.100000 -4.300000 84.114069 11.100000 -4.200000 82.413944 11.100000 -4.100000 80.733819 11.100000 -4.000000 79.073694 11.100000 -3.900000 77.433569 11.100000 -3.800000 75.813444 11.100000 -3.700000 74.213319 11.100000 -3.600000 72.633194 11.100000 -3.500000 71.073069 11.100000 -3.400000 69.532944 11.100000 -3.300000 68.012819 11.100000 -3.200000 66.512694 11.100000 -3.100000 65.032569 11.100000 -3.000000 63.572444 11.100000 -2.900000 62.132320 11.100000 -2.800000 60.712195 11.100000 -2.700000 59.312070 11.100000 -2.600000 57.931945 11.100000 -2.500000 56.571820 11.100000 -2.400000 55.231695 11.100000 -2.300000 53.911570 11.100000 -2.200000 52.611445 11.100000 -2.100000 51.331320 11.100000 -2.000000 50.071195 11.100000 -1.900000 48.831070 11.100000 -1.800000 47.610945 11.100000 -1.700000 46.410820 11.100000 -1.600000 45.230695 11.100000 -1.500000 44.070570 11.100000 -1.400000 42.930445 11.100000 -1.300000 41.810321 11.100000 -1.200000 40.710196 11.100000 -1.100000 39.630071 11.100000 -1.000000 38.569946 11.100000 -0.900000 37.529821 11.100000 -0.800000 36.509696 11.100000 -0.700000 35.509571 11.100000 -0.600000 34.529446 11.100000 -0.500000 33.569321 11.100000 -0.400000 32.629196 11.100000 -0.300000 31.709071 11.100000 -0.200000 30.808946 11.100000 -0.100000 29.928821 11.100000 -0.000000 29.068696 11.100000 0.100000 28.228571 11.100000 0.200000 27.408446 11.100000 0.300000 26.608322 11.100000 0.400000 25.828197 11.100000 0.500000 25.068072 11.100000 0.600000 24.327947 11.100000 0.700000 23.607822 11.100000 0.800000 22.907697 11.100000 0.900000 22.227572 11.100000 1.000000 21.567447 11.100000 1.100000 20.927322 11.100000 1.200000 20.307197 11.100000 1.300000 19.707072 11.100000 1.400000 19.126947 11.100000 1.500000 18.566822 11.100000 1.600000 18.026697 11.100000 1.700000 17.506572 11.100000 1.800000 17.006447 11.100000 1.900000 16.526322 11.100000 2.000000 16.066198 11.100000 2.100000 15.626073 11.100000 2.200000 15.205948 11.100000 2.300000 14.805823 11.100000 2.400000 14.425698 11.100000 2.500000 14.065573 11.100000 2.600000 13.725448 11.100000 2.700000 13.405323 11.100000 2.800000 13.105198 11.100000 2.900000 12.825073 11.100000 3.000000 12.564948 11.100000 3.100000 12.324823 11.100000 3.200000 12.104698 11.100000 3.300000 11.904573 11.100000 3.400000 11.724448 11.100000 3.500000 11.564323 11.100000 3.600000 11.424199 11.100000 3.700000 11.304074 11.100000 3.800000 11.203949 11.100000 3.900000 11.123824 11.100000 4.000000 11.063699 11.100000 4.100000 11.023574 11.100000 4.200000 11.003449 11.100000 4.300000 11.003324 11.100000 4.400000 11.023199 11.100000 4.500000 11.063074 11.100000 4.600000 11.122949 11.100000 4.700000 11.202824 11.100000 4.800000 11.302699 11.100000 4.900000 11.422574 11.100000 5.000000 11.562449 11.100000 5.100000 11.722324 11.100000 5.200000 11.902200 11.100000 5.300000 12.102075 11.100000 5.400000 12.321950 11.100000 5.500000 12.561825 11.100000 5.600000 12.821700 11.100000 5.700000 13.101575 11.100000 5.800000 13.401450 11.100000 5.900000 13.721325 11.100000 6.000000 14.061200 11.100000 6.100000 14.421075 11.100000 6.200000 14.800950 11.100000 6.300000 15.200825 11.100000 6.400000 15.620700 11.100000 6.500000 16.060575 11.100000 6.600000 16.520450 11.100000 6.700000 17.000325 11.100000 6.800000 17.500201 11.100000 6.900000 18.020076 11.100000 7.000000 18.559951 11.100000 7.100000 19.119826 11.100000 7.200000 19.699701 11.100000 7.300000 20.299576 11.100000 7.400000 20.919451 11.100000 7.500000 21.559326 11.100000 7.600000 22.219201 11.100000 7.700000 22.899076 11.100000 7.800000 23.598951 11.100000 7.900000 24.318826 11.100000 8.000000 25.058701 11.100000 8.100000 25.818576 11.100000 8.200000 26.598451 11.100000 8.300000 27.398326 11.100000 8.400000 28.218202 11.100000 8.500000 29.058077 11.100000 8.600000 29.917952 11.100000 8.700000 30.797827 11.100000 8.800000 31.697702 11.100000 8.900000 32.617577 11.100000 9.000000 33.557452 11.100000 9.100000 34.517327 11.100000 9.200000 35.497202 11.100000 9.300000 36.497077 11.100000 9.400000 37.516952 11.100000 9.500000 38.556827 11.100000 9.600000 39.616702 11.100000 9.700000 40.696577 11.100000 9.800000 41.796452 11.100000 9.900000 42.916327 11.100000 10.000000 44.056203 11.100000 10.100000 45.216078 11.100000 10.200000 46.395953 11.100000 10.300000 47.595828 11.100000 10.400000 48.815703 11.100000 10.500000 50.055578 11.100000 10.600000 51.315453 11.100000 10.700000 52.595328 11.100000 10.800000 53.895203 11.100000 10.900000 55.215078 11.100000 11.000000 56.554953 11.100000 11.100000 57.914828 11.100000 11.200000 59.294703 11.100000 11.300000 60.694578 11.100000 11.400000 62.114453 11.100000 11.500000 63.554328 11.100000 11.600000 65.014204 11.100000 11.700000 66.494079 11.100000 11.800000 67.993954 11.100000 11.900000 69.513829 11.100000 12.000000 71.053704 11.100000 12.100000 72.613579 11.100000 12.200000 74.193454 11.100000 12.300000 75.793329 11.100000 12.400000 77.413204 11.100000 12.500000 79.053079 11.100000 12.600000 80.712954 11.100000 12.700000 82.392829 11.100000 12.800000 84.092704 11.100000 12.900000 85.812579 11.100000 13.000000 87.552454 11.100000 13.100000 89.312329 11.100000 13.200000 91.092205 11.100000 13.300000 92.892080 11.100000 13.400000 94.711955 11.100000 13.500000 96.551830 11.100000 13.600000 98.411705 11.100000 13.700000 100.291580 11.100000 13.800000 102.191455 11.100000 13.900000 104.111330 11.100000 14.000000 106.051205 11.100000 14.100000 108.011080 11.100000 14.200000 109.990955 11.100000 14.300000 111.990830 11.100000 14.400000 114.010705 11.100000 14.500000 116.050580 11.100000 14.600000 118.110455 11.100000 14.700000 120.190330 11.100000 14.800000 122.290206 11.100000 14.900000 124.410081 11.100000 15.000000 126.549956 11.200000 -5.000000 99.925256 11.200000 -4.900000 98.059346 11.200000 -4.800000 96.213436 11.200000 -4.700000 94.387526 11.200000 -4.600000 92.581615 11.200000 -4.500000 90.795705 11.200000 -4.400000 89.029795 11.200000 -4.300000 87.283885 11.200000 -4.200000 85.557974 11.200000 -4.100000 83.852064 11.200000 -4.000000 82.166154 11.200000 -3.900000 80.500244 11.200000 -3.800000 78.854333 11.200000 -3.700000 77.228423 11.200000 -3.600000 75.622513 11.200000 -3.500000 74.036603 11.200000 -3.400000 72.470692 11.200000 -3.300000 70.924782 11.200000 -3.200000 69.398872 11.200000 -3.100000 67.892962 11.200000 -3.000000 66.407051 11.200000 -2.900000 64.941141 11.200000 -2.800000 63.495231 11.200000 -2.700000 62.069321 11.200000 -2.600000 60.663411 11.200000 -2.500000 59.277500 11.200000 -2.400000 57.911590 11.200000 -2.300000 56.565680 11.200000 -2.200000 55.239770 11.200000 -2.100000 53.933859 11.200000 -2.000000 52.647949 11.200000 -1.900000 51.382039 11.200000 -1.800000 50.136129 11.200000 -1.700000 48.910218 11.200000 -1.600000 47.704308 11.200000 -1.500000 46.518398 11.200000 -1.400000 45.352488 11.200000 -1.300000 44.206577 11.200000 -1.200000 43.080667 11.200000 -1.100000 41.974757 11.200000 -1.000000 40.888847 11.200000 -0.900000 39.822936 11.200000 -0.800000 38.777026 11.200000 -0.700000 37.751116 11.200000 -0.600000 36.745206 11.200000 -0.500000 35.759295 11.200000 -0.400000 34.793385 11.200000 -0.300000 33.847475 11.200000 -0.200000 32.921565 11.200000 -0.100000 32.015655 11.200000 -0.000000 31.129744 11.200000 0.100000 30.263834 11.200000 0.200000 29.417924 11.200000 0.300000 28.592014 11.200000 0.400000 27.786103 11.200000 0.500000 27.000193 11.200000 0.600000 26.234283 11.200000 0.700000 25.488373 11.200000 0.800000 24.762462 11.200000 0.900000 24.056552 11.200000 1.000000 23.370642 11.200000 1.100000 22.704732 11.200000 1.200000 22.058821 11.200000 1.300000 21.432911 11.200000 1.400000 20.827001 11.200000 1.500000 20.241091 11.200000 1.600000 19.675180 11.200000 1.700000 19.129270 11.200000 1.800000 18.603360 11.200000 1.900000 18.097450 11.200000 2.000000 17.611539 11.200000 2.100000 17.145629 11.200000 2.200000 16.699719 11.200000 2.300000 16.273809 11.200000 2.400000 15.867899 11.200000 2.500000 15.481988 11.200000 2.600000 15.116078 11.200000 2.700000 14.770168 11.200000 2.800000 14.444258 11.200000 2.900000 14.138347 11.200000 3.000000 13.852437 11.200000 3.100000 13.586527 11.200000 3.200000 13.340617 11.200000 3.300000 13.114706 11.200000 3.400000 12.908796 11.200000 3.500000 12.722886 11.200000 3.600000 12.556976 11.200000 3.700000 12.411065 11.200000 3.800000 12.285155 11.200000 3.900000 12.179245 11.200000 4.000000 12.093335 11.200000 4.100000 12.027424 11.200000 4.200000 11.981514 11.200000 4.300000 11.955604 11.200000 4.400000 11.949694 11.200000 4.500000 11.963783 11.200000 4.600000 11.997873 11.200000 4.700000 12.051963 11.200000 4.800000 12.126053 11.200000 4.900000 12.220143 11.200000 5.000000 12.334232 11.200000 5.100000 12.468322 11.200000 5.200000 12.622412 11.200000 5.300000 12.796502 11.200000 5.400000 12.990591 11.200000 5.500000 13.204681 11.200000 5.600000 13.438771 11.200000 5.700000 13.692861 11.200000 5.800000 13.966950 11.200000 5.900000 14.261040 11.200000 6.000000 14.575130 11.200000 6.100000 14.909220 11.200000 6.200000 15.263309 11.200000 6.300000 15.637399 11.200000 6.400000 16.031489 11.200000 6.500000 16.445579 11.200000 6.600000 16.879668 11.200000 6.700000 17.333758 11.200000 6.800000 17.807848 11.200000 6.900000 18.301938 11.200000 7.000000 18.816027 11.200000 7.100000 19.350117 11.200000 7.200000 19.904207 11.200000 7.300000 20.478297 11.200000 7.400000 21.072387 11.200000 7.500000 21.686476 11.200000 7.600000 22.320566 11.200000 7.700000 22.974656 11.200000 7.800000 23.648746 11.200000 7.900000 24.342835 11.200000 8.000000 25.056925 11.200000 8.100000 25.791015 11.200000 8.200000 26.545105 11.200000 8.300000 27.319194 11.200000 8.400000 28.113284 11.200000 8.500000 28.927374 11.200000 8.600000 29.761464 11.200000 8.700000 30.615553 11.200000 8.800000 31.489643 11.200000 8.900000 32.383733 11.200000 9.000000 33.297823 11.200000 9.100000 34.231912 11.200000 9.200000 35.186002 11.200000 9.300000 36.160092 11.200000 9.400000 37.154182 11.200000 9.500000 38.168271 11.200000 9.600000 39.202361 11.200000 9.700000 40.256451 11.200000 9.800000 41.330541 11.200000 9.900000 42.424631 11.200000 10.000000 43.538720 11.200000 10.100000 44.672810 11.200000 10.200000 45.826900 11.200000 10.300000 47.000990 11.200000 10.400000 48.195079 11.200000 10.500000 49.409169 11.200000 10.600000 50.643259 11.200000 10.700000 51.897349 11.200000 10.800000 53.171438 11.200000 10.900000 54.465528 11.200000 11.000000 55.779618 11.200000 11.100000 57.113708 11.200000 11.200000 58.467797 11.200000 11.300000 59.841887 11.200000 11.400000 61.235977 11.200000 11.500000 62.650067 11.200000 11.600000 64.084156 11.200000 11.700000 65.538246 11.200000 11.800000 67.012336 11.200000 11.900000 68.506426 11.200000 12.000000 70.020515 11.200000 12.100000 71.554605 11.200000 12.200000 73.108695 11.200000 12.300000 74.682785 11.200000 12.400000 76.276875 11.200000 12.500000 77.890964 11.200000 12.600000 79.525054 11.200000 12.700000 81.179144 11.200000 12.800000 82.853234 11.200000 12.900000 84.547323 11.200000 13.000000 86.261413 11.200000 13.100000 87.995503 11.200000 13.200000 89.749593 11.200000 13.300000 91.523682 11.200000 13.400000 93.317772 11.200000 13.500000 95.131862 11.200000 13.600000 96.965952 11.200000 13.700000 98.820041 11.200000 13.800000 100.694131 11.200000 13.900000 102.588221 11.200000 14.000000 104.502311 11.200000 14.100000 106.436400 11.200000 14.200000 108.390490 11.200000 14.300000 110.364580 11.200000 14.400000 112.358670 11.200000 14.500000 114.372759 11.200000 14.600000 116.406849 11.200000 14.700000 118.460939 11.200000 14.800000 120.535029 11.200000 14.900000 122.629119 11.200000 15.000000 124.743208 11.300000 -5.000000 103.338478 11.300000 -4.900000 101.446265 11.300000 -4.800000 99.574053 11.300000 -4.700000 97.721841 11.300000 -4.600000 95.889628 11.300000 -4.500000 94.077416 11.300000 -4.400000 92.285204 11.300000 -4.300000 90.512992 11.300000 -4.200000 88.760779 11.300000 -4.100000 87.028567 11.300000 -4.000000 85.316355 11.300000 -3.900000 83.624142 11.300000 -3.800000 81.951930 11.300000 -3.700000 80.299718 11.300000 -3.600000 78.667506 11.300000 -3.500000 77.055293 11.300000 -3.400000 75.463081 11.300000 -3.300000 73.890869 11.300000 -3.200000 72.338657 11.300000 -3.100000 70.806444 11.300000 -3.000000 69.294232 11.300000 -2.900000 67.802020 11.300000 -2.800000 66.329807 11.300000 -2.700000 64.877595 11.300000 -2.600000 63.445383 11.300000 -2.500000 62.033171 11.300000 -2.400000 60.640958 11.300000 -2.300000 59.268746 11.300000 -2.200000 57.916534 11.300000 -2.100000 56.584321 11.300000 -2.000000 55.272109 11.300000 -1.900000 53.979897 11.300000 -1.800000 52.707685 11.300000 -1.700000 51.455472 11.300000 -1.600000 50.223260 11.300000 -1.500000 49.011048 11.300000 -1.400000 47.818835 11.300000 -1.300000 46.646623 11.300000 -1.200000 45.494411 11.300000 -1.100000 44.362199 11.300000 -1.000000 43.249986 11.300000 -0.900000 42.157774 11.300000 -0.800000 41.085562 11.300000 -0.700000 40.033349 11.300000 -0.600000 39.001137 11.300000 -0.500000 37.988925 11.300000 -0.400000 36.996713 11.300000 -0.300000 36.024500 11.300000 -0.200000 35.072288 11.300000 -0.100000 34.140076 11.300000 -0.000000 33.227864 11.300000 0.100000 32.335651 11.300000 0.200000 31.463439 11.300000 0.300000 30.611227 11.300000 0.400000 29.779014 11.300000 0.500000 28.966802 11.300000 0.600000 28.174590 11.300000 0.700000 27.402378 11.300000 0.800000 26.650165 11.300000 0.900000 25.917953 11.300000 1.000000 25.205741 11.300000 1.100000 24.513528 11.300000 1.200000 23.841316 11.300000 1.300000 23.189104 11.300000 1.400000 22.556892 11.300000 1.500000 21.944679 11.300000 1.600000 21.352467 11.300000 1.700000 20.780255 11.300000 1.800000 20.228042 11.300000 1.900000 19.695830 11.300000 2.000000 19.183618 11.300000 2.100000 18.691406 11.300000 2.200000 18.219193 11.300000 2.300000 17.766981 11.300000 2.400000 17.334769 11.300000 2.500000 16.922557 11.300000 2.600000 16.530344 11.300000 2.700000 16.158132 11.300000 2.800000 15.805920 11.300000 2.900000 15.473707 11.300000 3.000000 15.161495 11.300000 3.100000 14.869283 11.300000 3.200000 14.597071 11.300000 3.300000 14.344858 11.300000 3.400000 14.112646 11.300000 3.500000 13.900434 11.300000 3.600000 13.708221 11.300000 3.700000 13.536009 11.300000 3.800000 13.383797 11.300000 3.900000 13.251585 11.300000 4.000000 13.139372 11.300000 4.100000 13.047160 11.300000 4.200000 12.974948 11.300000 4.300000 12.922735 11.300000 4.400000 12.890523 11.300000 4.500000 12.878311 11.300000 4.600000 12.886099 11.300000 4.700000 12.913886 11.300000 4.800000 12.961674 11.300000 4.900000 13.029462 11.300000 5.000000 13.117250 11.300000 5.100000 13.225037 11.300000 5.200000 13.352825 11.300000 5.300000 13.500613 11.300000 5.400000 13.668400 11.300000 5.500000 13.856188 11.300000 5.600000 14.063976 11.300000 5.700000 14.291764 11.300000 5.800000 14.539551 11.300000 5.900000 14.807339 11.300000 6.000000 15.095127 11.300000 6.100000 15.402914 11.300000 6.200000 15.730702 11.300000 6.300000 16.078490 11.300000 6.400000 16.446278 11.300000 6.500000 16.834065 11.300000 6.600000 17.241853 11.300000 6.700000 17.669641 11.300000 6.800000 18.117428 11.300000 6.900000 18.585216 11.300000 7.000000 19.073004 11.300000 7.100000 19.580792 11.300000 7.200000 20.108579 11.300000 7.300000 20.656367 11.300000 7.400000 21.224155 11.300000 7.500000 21.811942 11.300000 7.600000 22.419730 11.300000 7.700000 23.047518 11.300000 7.800000 23.695306 11.300000 7.900000 24.363093 11.300000 8.000000 25.050881 11.300000 8.100000 25.758669 11.300000 8.200000 26.486457 11.300000 8.300000 27.234244 11.300000 8.400000 28.002032 11.300000 8.500000 28.789820 11.300000 8.600000 29.597607 11.300000 8.700000 30.425395 11.300000 8.800000 31.273183 11.300000 8.900000 32.140971 11.300000 9.000000 33.028758 11.300000 9.100000 33.936546 11.300000 9.200000 34.864334 11.300000 9.300000 35.812121 11.300000 9.400000 36.779909 11.300000 9.500000 37.767697 11.300000 9.600000 38.775485 11.300000 9.700000 39.803272 11.300000 9.800000 40.851060 11.300000 9.900000 41.918848 11.300000 10.000000 43.006635 11.300000 10.100000 44.114423 11.300000 10.200000 45.242211 11.300000 10.300000 46.389999 11.300000 10.400000 47.557786 11.300000 10.500000 48.745574 11.300000 10.600000 49.953362 11.300000 10.700000 51.181150 11.300000 10.800000 52.428937 11.300000 10.900000 53.696725 11.300000 11.000000 54.984513 11.300000 11.100000 56.292300 11.300000 11.200000 57.620088 11.300000 11.300000 58.967876 11.300000 11.400000 60.335664 11.300000 11.500000 61.723451 11.300000 11.600000 63.131239 11.300000 11.700000 64.559027 11.300000 11.800000 66.006814 11.300000 11.900000 67.474602 11.300000 12.000000 68.962390 11.300000 12.100000 70.470178 11.300000 12.200000 71.997965 11.300000 12.300000 73.545753 11.300000 12.400000 75.113541 11.300000 12.500000 76.701328 11.300000 12.600000 78.309116 11.300000 12.700000 79.936904 11.300000 12.800000 81.584692 11.300000 12.900000 83.252479 11.300000 13.000000 84.940267 11.300000 13.100000 86.648055 11.300000 13.200000 88.375842 11.300000 13.300000 90.123630 11.300000 13.400000 91.891418 11.300000 13.500000 93.679206 11.300000 13.600000 95.486993 11.300000 13.700000 97.314781 11.300000 13.800000 99.162569 11.300000 13.900000 101.030357 11.300000 14.000000 102.918144 11.300000 14.100000 104.825932 11.300000 14.200000 106.753720 11.300000 14.300000 108.701507 11.300000 14.400000 110.669295 11.300000 14.500000 112.657083 11.300000 14.600000 114.664871 11.300000 14.700000 116.692658 11.300000 14.800000 118.740446 11.300000 14.900000 120.808234 11.300000 15.000000 122.896021 11.400000 -5.000000 106.807364 11.400000 -4.900000 104.888333 11.400000 -4.800000 102.989302 11.400000 -4.700000 101.110271 11.400000 -4.600000 99.251240 11.400000 -4.500000 97.412209 11.400000 -4.400000 95.593178 11.400000 -4.300000 93.794147 11.400000 -4.200000 92.015116 11.400000 -4.100000 90.256085 11.400000 -4.000000 88.517054 11.400000 -3.900000 86.798023 11.400000 -3.800000 85.098992 11.400000 -3.700000 83.419961 11.400000 -3.600000 81.760929 11.400000 -3.500000 80.121898 11.400000 -3.400000 78.502867 11.400000 -3.300000 76.903836 11.400000 -3.200000 75.324805 11.400000 -3.100000 73.765774 11.400000 -3.000000 72.226743 11.400000 -2.900000 70.707712 11.400000 -2.800000 69.208681 11.400000 -2.700000 67.729650 11.400000 -2.600000 66.270619 11.400000 -2.500000 64.831588 11.400000 -2.400000 63.412557 11.400000 -2.300000 62.013526 11.400000 -2.200000 60.634495 11.400000 -2.100000 59.275464 11.400000 -2.000000 57.936433 11.400000 -1.900000 56.617401 11.400000 -1.800000 55.318370 11.400000 -1.700000 54.039339 11.400000 -1.600000 52.780308 11.400000 -1.500000 51.541277 11.400000 -1.400000 50.322246 11.400000 -1.300000 49.123215 11.400000 -1.200000 47.944184 11.400000 -1.100000 46.785153 11.400000 -1.000000 45.646122 11.400000 -0.900000 44.527091 11.400000 -0.800000 43.428060 11.400000 -0.700000 42.349029 11.400000 -0.600000 41.289998 11.400000 -0.500000 40.250967 11.400000 -0.400000 39.231936 11.400000 -0.300000 38.232905 11.400000 -0.200000 37.253873 11.400000 -0.100000 36.294842 11.400000 -0.000000 35.355811 11.400000 0.100000 34.436780 11.400000 0.200000 33.537749 11.400000 0.300000 32.658718 11.400000 0.400000 31.799687 11.400000 0.500000 30.960656 11.400000 0.600000 30.141625 11.400000 0.700000 29.342594 11.400000 0.800000 28.563563 11.400000 0.900000 27.804532 11.400000 1.000000 27.065501 11.400000 1.100000 26.346470 11.400000 1.200000 25.647439 11.400000 1.300000 24.968408 11.400000 1.400000 24.309377 11.400000 1.500000 23.670345 11.400000 1.600000 23.051314 11.400000 1.700000 22.452283 11.400000 1.800000 21.873252 11.400000 1.900000 21.314221 11.400000 2.000000 20.775190 11.400000 2.100000 20.256159 11.400000 2.200000 19.757128 11.400000 2.300000 19.278097 11.400000 2.400000 18.819066 11.400000 2.500000 18.380035 11.400000 2.600000 17.961004 11.400000 2.700000 17.561973 11.400000 2.800000 17.182942 11.400000 2.900000 16.823911 11.400000 3.000000 16.484880 11.400000 3.100000 16.165849 11.400000 3.200000 15.866817 11.400000 3.300000 15.587786 11.400000 3.400000 15.328755 11.400000 3.500000 15.089724 11.400000 3.600000 14.870693 11.400000 3.700000 14.671662 11.400000 3.800000 14.492631 11.400000 3.900000 14.333600 11.400000 4.000000 14.194569 11.400000 4.100000 14.075538 11.400000 4.200000 13.976507 11.400000 4.300000 13.897476 11.400000 4.400000 13.838445 11.400000 4.500000 13.799414 11.400000 4.600000 13.780383 11.400000 4.700000 13.781352 11.400000 4.800000 13.802321 11.400000 4.900000 13.843289 11.400000 5.000000 13.904258 11.400000 5.100000 13.985227 11.400000 5.200000 14.086196 11.400000 5.300000 14.207165 11.400000 5.400000 14.348134 11.400000 5.500000 14.509103 11.400000 5.600000 14.690072 11.400000 5.700000 14.891041 11.400000 5.800000 15.112010 11.400000 5.900000 15.352979 11.400000 6.000000 15.613948 11.400000 6.100000 15.894917 11.400000 6.200000 16.195886 11.400000 6.300000 16.516855 11.400000 6.400000 16.857824 11.400000 6.500000 17.218792 11.400000 6.600000 17.599761 11.400000 6.700000 18.000730 11.400000 6.800000 18.421699 11.400000 6.900000 18.862668 11.400000 7.000000 19.323637 11.400000 7.100000 19.804606 11.400000 7.200000 20.305575 11.400000 7.300000 20.826544 11.400000 7.400000 21.367513 11.400000 7.500000 21.928482 11.400000 7.600000 22.509451 11.400000 7.700000 23.110420 11.400000 7.800000 23.731389 11.400000 7.900000 24.372358 11.400000 8.000000 25.033327 11.400000 8.100000 25.714296 11.400000 8.200000 26.415264 11.400000 8.300000 27.136233 11.400000 8.400000 27.877202 11.400000 8.500000 28.638171 11.400000 8.600000 29.419140 11.400000 8.700000 30.220109 11.400000 8.800000 31.041078 11.400000 8.900000 31.882047 11.400000 9.000000 32.743016 11.400000 9.100000 33.623985 11.400000 9.200000 34.524954 11.400000 9.300000 35.445923 11.400000 9.400000 36.386892 11.400000 9.500000 37.347861 11.400000 9.600000 38.328830 11.400000 9.700000 39.329799 11.400000 9.800000 40.350768 11.400000 9.900000 41.391736 11.400000 10.000000 42.452705 11.400000 10.100000 43.533674 11.400000 10.200000 44.634643 11.400000 10.300000 45.755612 11.400000 10.400000 46.896581 11.400000 10.500000 48.057550 11.400000 10.600000 49.238519 11.400000 10.700000 50.439488 11.400000 10.800000 51.660457 11.400000 10.900000 52.901426 11.400000 11.000000 54.162395 11.400000 11.100000 55.443364 11.400000 11.200000 56.744333 11.400000 11.300000 58.065302 11.400000 11.400000 59.406271 11.400000 11.500000 60.767240 11.400000 11.600000 62.148208 11.400000 11.700000 63.549177 11.400000 11.800000 64.970146 11.400000 11.900000 66.411115 11.400000 12.000000 67.872084 11.400000 12.100000 69.353053 11.400000 12.200000 70.854022 11.400000 12.300000 72.374991 11.400000 12.400000 73.915960 11.400000 12.500000 75.476929 11.400000 12.600000 77.057898 11.400000 12.700000 78.658867 11.400000 12.800000 80.279836 11.400000 12.900000 81.920805 11.400000 13.000000 83.581774 11.400000 13.100000 85.262743 11.400000 13.200000 86.963712 11.400000 13.300000 88.684680 11.400000 13.400000 90.425649 11.400000 13.500000 92.186618 11.400000 13.600000 93.967587 11.400000 13.700000 95.768556 11.400000 13.800000 97.589525 11.400000 13.900000 99.430494 11.400000 14.000000 101.291463 11.400000 14.100000 103.172432 11.400000 14.200000 105.073401 11.400000 14.300000 106.994370 11.400000 14.400000 108.935339 11.400000 14.500000 110.896308 11.400000 14.600000 112.877277 11.400000 14.700000 114.878246 11.400000 14.800000 116.899215 11.400000 14.900000 118.940184 11.400000 15.000000 121.001152 11.500000 -5.000000 110.325001 11.500000 -4.900000 108.378635 11.500000 -4.800000 106.452268 11.500000 -4.700000 104.545901 11.500000 -4.600000 102.659535 11.500000 -4.500000 100.793168 11.500000 -4.400000 98.946802 11.500000 -4.300000 97.120435 11.500000 -4.200000 95.314069 11.500000 -4.100000 93.527702 11.500000 -4.000000 91.761335 11.500000 -3.900000 90.014969 11.500000 -3.800000 88.288602 11.500000 -3.700000 86.582236 11.500000 -3.600000 84.895869 11.500000 -3.500000 83.229503 11.500000 -3.400000 81.583136 11.500000 -3.300000 79.956769 11.500000 -3.200000 78.350403 11.500000 -3.100000 76.764036 11.500000 -3.000000 75.197670 11.500000 -2.900000 73.651303 11.500000 -2.800000 72.124937 11.500000 -2.700000 70.618570 11.500000 -2.600000 69.132203 11.500000 -2.500000 67.665837 11.500000 -2.400000 66.219470 11.500000 -2.300000 64.793104 11.500000 -2.200000 63.386737 11.500000 -2.100000 62.000371 11.500000 -2.000000 60.634004 11.500000 -1.900000 59.287637 11.500000 -1.800000 57.961271 11.500000 -1.700000 56.654904 11.500000 -1.600000 55.368538 11.500000 -1.500000 54.102171 11.500000 -1.400000 52.855804 11.500000 -1.300000 51.629438 11.500000 -1.200000 50.423071 11.500000 -1.100000 49.236705 11.500000 -1.000000 48.070338 11.500000 -0.900000 46.923972 11.500000 -0.800000 45.797605 11.500000 -0.700000 44.691238 11.500000 -0.600000 43.604872 11.500000 -0.500000 42.538505 11.500000 -0.400000 41.492139 11.500000 -0.300000 40.465772 11.500000 -0.200000 39.459406 11.500000 -0.100000 38.473039 11.500000 -0.000000 37.506672 11.500000 0.100000 36.560306 11.500000 0.200000 35.633939 11.500000 0.300000 34.727573 11.500000 0.400000 33.841206 11.500000 0.500000 32.974840 11.500000 0.600000 32.128473 11.500000 0.700000 31.302106 11.500000 0.800000 30.495740 11.500000 0.900000 29.709373 11.500000 1.000000 28.943007 11.500000 1.100000 28.196640 11.500000 1.200000 27.470274 11.500000 1.300000 26.763907 11.500000 1.400000 26.077540 11.500000 1.500000 25.411174 11.500000 1.600000 24.764807 11.500000 1.700000 24.138441 11.500000 1.800000 23.532074 11.500000 1.900000 22.945707 11.500000 2.000000 22.379341 11.500000 2.100000 21.832974 11.500000 2.200000 21.306608 11.500000 2.300000 20.800241 11.500000 2.400000 20.313875 11.500000 2.500000 19.847508 11.500000 2.600000 19.401141 11.500000 2.700000 18.974775 11.500000 2.800000 18.568408 11.500000 2.900000 18.182042 11.500000 3.000000 17.815675 11.500000 3.100000 17.469309 11.500000 3.200000 17.142942 11.500000 3.300000 16.836575 11.500000 3.400000 16.550209 11.500000 3.500000 16.283842 11.500000 3.600000 16.037476 11.500000 3.700000 15.811109 11.500000 3.800000 15.604743 11.500000 3.900000 15.418376 11.500000 4.000000 15.252009 11.500000 4.100000 15.105643 11.500000 4.200000 14.979276 11.500000 4.300000 14.872910 11.500000 4.400000 14.786543 11.500000 4.500000 14.720177 11.500000 4.600000 14.673810 11.500000 4.700000 14.647443 11.500000 4.800000 14.641077 11.500000 4.900000 14.654710 11.500000 5.000000 14.688344 11.500000 5.100000 14.741977 11.500000 5.200000 14.815610 11.500000 5.300000 14.909244 11.500000 5.400000 15.022877 11.500000 5.500000 15.156511 11.500000 5.600000 15.310144 11.500000 5.700000 15.483778 11.500000 5.800000 15.677411 11.500000 5.900000 15.891044 11.500000 6.000000 16.124678 11.500000 6.100000 16.378311 11.500000 6.200000 16.651945 11.500000 6.300000 16.945578 11.500000 6.400000 17.259212 11.500000 6.500000 17.592845 11.500000 6.600000 17.946478 11.500000 6.700000 18.320112 11.500000 6.800000 18.713745 11.500000 6.900000 19.127379 11.500000 7.000000 19.561012 11.500000 7.100000 20.014646 11.500000 7.200000 20.488279 11.500000 7.300000 20.981912 11.500000 7.400000 21.495546 11.500000 7.500000 22.029179 11.500000 7.600000 22.582813 11.500000 7.700000 23.156446 11.500000 7.800000 23.750080 11.500000 7.900000 24.363713 11.500000 8.000000 24.997346 11.500000 8.100000 25.650980 11.500000 8.200000 26.324613 11.500000 8.300000 27.018247 11.500000 8.400000 27.731880 11.500000 8.500000 28.465513 11.500000 8.600000 29.219147 11.500000 8.700000 29.992780 11.500000 8.800000 30.786414 11.500000 8.900000 31.600047 11.500000 9.000000 32.433681 11.500000 9.100000 33.287314 11.500000 9.200000 34.160947 11.500000 9.300000 35.054581 11.500000 9.400000 35.968214 11.500000 9.500000 36.901848 11.500000 9.600000 37.855481 11.500000 9.700000 38.829115 11.500000 9.800000 39.822748 11.500000 9.900000 40.836381 11.500000 10.000000 41.870015 11.500000 10.100000 42.923648 11.500000 10.200000 43.997282 11.500000 10.300000 45.090915 11.500000 10.400000 46.204549 11.500000 10.500000 47.338182 11.500000 10.600000 48.491815 11.500000 10.700000 49.665449 11.500000 10.800000 50.859082 11.500000 10.900000 52.072716 11.500000 11.000000 53.306349 11.500000 11.100000 54.559983 11.500000 11.200000 55.833616 11.500000 11.300000 57.127249 11.500000 11.400000 58.440883 11.500000 11.500000 59.774516 11.500000 11.600000 61.128150 11.500000 11.700000 62.501783 11.500000 11.800000 63.895416 11.500000 11.900000 65.309050 11.500000 12.000000 66.742683 11.500000 12.100000 68.196317 11.500000 12.200000 69.669950 11.500000 12.300000 71.163584 11.500000 12.400000 72.677217 11.500000 12.500000 74.210850 11.500000 12.600000 75.764484 11.500000 12.700000 77.338117 11.500000 12.800000 78.931751 11.500000 12.900000 80.545384 11.500000 13.000000 82.179018 11.500000 13.100000 83.832651 11.500000 13.200000 85.506284 11.500000 13.300000 87.199918 11.500000 13.400000 88.913551 11.500000 13.500000 90.647185 11.500000 13.600000 92.400818 11.500000 13.700000 94.174452 11.500000 13.800000 95.968085 11.500000 13.900000 97.781718 11.500000 14.000000 99.615352 11.500000 14.100000 101.468985 11.500000 14.200000 103.342619 11.500000 14.300000 105.236252 11.500000 14.400000 107.149886 11.500000 14.500000 109.083519 11.500000 14.600000 111.037152 11.500000 14.700000 113.010786 11.500000 14.800000 115.004419 11.500000 14.900000 117.018053 11.500000 15.000000 119.051686 11.600000 -5.000000 113.884890 11.600000 -4.900000 111.910671 11.600000 -4.800000 109.956453 11.600000 -4.700000 108.022234 11.600000 -4.600000 106.108015 11.600000 -4.500000 104.213796 11.600000 -4.400000 102.339577 11.600000 -4.300000 100.485358 11.600000 -4.200000 98.651140 11.600000 -4.100000 96.836921 11.600000 -4.000000 95.042702 11.600000 -3.900000 93.268483 11.600000 -3.800000 91.514264 11.600000 -3.700000 89.780045 11.600000 -3.600000 88.065827 11.600000 -3.500000 86.371608 11.600000 -3.400000 84.697389 11.600000 -3.300000 83.043170 11.600000 -3.200000 81.408951 11.600000 -3.100000 79.794732 11.600000 -3.000000 78.200514 11.600000 -2.900000 76.626295 11.600000 -2.800000 75.072076 11.600000 -2.700000 73.537857 11.600000 -2.600000 72.023638 11.600000 -2.500000 70.529419 11.600000 -2.400000 69.055201 11.600000 -2.300000 67.600982 11.600000 -2.200000 66.166763 11.600000 -2.100000 64.752544 11.600000 -2.000000 63.358325 11.600000 -1.900000 61.984106 11.600000 -1.800000 60.629888 11.600000 -1.700000 59.295669 11.600000 -1.600000 57.981450 11.600000 -1.500000 56.687231 11.600000 -1.400000 55.413012 11.600000 -1.300000 54.158793 11.600000 -1.200000 52.924575 11.600000 -1.100000 51.710356 11.600000 -1.000000 50.516137 11.600000 -0.900000 49.341918 11.600000 -0.800000 48.187699 11.600000 -0.700000 47.053481 11.600000 -0.600000 45.939262 11.600000 -0.500000 44.845043 11.600000 -0.400000 43.770824 11.600000 -0.300000 42.716605 11.600000 -0.200000 41.682386 11.600000 -0.100000 40.668168 11.600000 -0.000000 39.673949 11.600000 0.100000 38.699730 11.600000 0.200000 37.745511 11.600000 0.300000 36.811292 11.600000 0.400000 35.897073 11.600000 0.500000 35.002855 11.600000 0.600000 34.128636 11.600000 0.700000 33.274417 11.600000 0.800000 32.440198 11.600000 0.900000 31.625979 11.600000 1.000000 30.831760 11.600000 1.100000 30.057542 11.600000 1.200000 29.303323 11.600000 1.300000 28.569104 11.600000 1.400000 27.854885 11.600000 1.500000 27.160666 11.600000 1.600000 26.486447 11.600000 1.700000 25.832229 11.600000 1.800000 25.198010 11.600000 1.900000 24.583791 11.600000 2.000000 23.989572 11.600000 2.100000 23.415353 11.600000 2.200000 22.861134 11.600000 2.300000 22.326916 11.600000 2.400000 21.812697 11.600000 2.500000 21.318478 11.600000 2.600000 20.844259 11.600000 2.700000 20.390040 11.600000 2.800000 19.955821 11.600000 2.900000 19.541603 11.600000 3.000000 19.147384 11.600000 3.100000 18.773165 11.600000 3.200000 18.418946 11.600000 3.300000 18.084727 11.600000 3.400000 17.770508 11.600000 3.500000 17.476290 11.600000 3.600000 17.202071 11.600000 3.700000 16.947852 11.600000 3.800000 16.713633 11.600000 3.900000 16.499414 11.600000 4.000000 16.305195 11.600000 4.100000 16.130977 11.600000 4.200000 15.976758 11.600000 4.300000 15.842539 11.600000 4.400000 15.728320 11.600000 4.500000 15.634101 11.600000 4.600000 15.559882 11.600000 4.700000 15.505664 11.600000 4.800000 15.471445 11.600000 4.900000 15.457226 11.600000 5.000000 15.463007 11.600000 5.100000 15.488788 11.600000 5.200000 15.534570 11.600000 5.300000 15.600351 11.600000 5.400000 15.686132 11.600000 5.500000 15.791913 11.600000 5.600000 15.917694 11.600000 5.700000 16.063475 11.600000 5.800000 16.229257 11.600000 5.900000 16.415038 11.600000 6.000000 16.620819 11.600000 6.100000 16.846600 11.600000 6.200000 17.092381 11.600000 6.300000 17.358162 11.600000 6.400000 17.643944 11.600000 6.500000 17.949725 11.600000 6.600000 18.275506 11.600000 6.700000 18.621287 11.600000 6.800000 18.987068 11.600000 6.900000 19.372849 11.600000 7.000000 19.778631 11.600000 7.100000 20.204412 11.600000 7.200000 20.650193 11.600000 7.300000 21.115974 11.600000 7.400000 21.601755 11.600000 7.500000 22.107536 11.600000 7.600000 22.633318 11.600000 7.700000 23.179099 11.600000 7.800000 23.744880 11.600000 7.900000 24.330661 11.600000 8.000000 24.936442 11.600000 8.100000 25.562223 11.600000 8.200000 26.208005 11.600000 8.300000 26.873786 11.600000 8.400000 27.559567 11.600000 8.500000 28.265348 11.600000 8.600000 28.991129 11.600000 8.700000 29.736910 11.600000 8.800000 30.502692 11.600000 8.900000 31.288473 11.600000 9.000000 32.094254 11.600000 9.100000 32.920035 11.600000 9.200000 33.765816 11.600000 9.300000 34.631597 11.600000 9.400000 35.517379 11.600000 9.500000 36.423160 11.600000 9.600000 37.348941 11.600000 9.700000 38.294722 11.600000 9.800000 39.260503 11.600000 9.900000 40.246284 11.600000 10.000000 41.252066 11.600000 10.100000 42.277847 11.600000 10.200000 43.323628 11.600000 10.300000 44.389409 11.600000 10.400000 45.475190 11.600000 10.500000 46.580972 11.600000 10.600000 47.706753 11.600000 10.700000 48.852534 11.600000 10.800000 50.018315 11.600000 10.900000 51.204096 11.600000 11.000000 52.409877 11.600000 11.100000 53.635659 11.600000 11.200000 54.881440 11.600000 11.300000 56.147221 11.600000 11.400000 57.433002 11.600000 11.500000 58.738783 11.600000 11.600000 60.064564 11.600000 11.700000 61.410346 11.600000 11.800000 62.776127 11.600000 11.900000 64.161908 11.600000 12.000000 65.567689 11.600000 12.100000 66.993470 11.600000 12.200000 68.439251 11.600000 12.300000 69.905033 11.600000 12.400000 71.390814 11.600000 12.500000 72.896595 11.600000 12.600000 74.422376 11.600000 12.700000 75.968157 11.600000 12.800000 77.533938 11.600000 12.900000 79.119720 11.600000 13.000000 80.725501 11.600000 13.100000 82.351282 11.600000 13.200000 83.997063 11.600000 13.300000 85.662844 11.600000 13.400000 87.348625 11.600000 13.500000 89.054407 11.600000 13.600000 90.780188 11.600000 13.700000 92.525969 11.600000 13.800000 94.291750 11.600000 13.900000 96.077531 11.600000 14.000000 97.883312 11.600000 14.100000 99.709094 11.600000 14.200000 101.554875 11.600000 14.300000 103.420656 11.600000 14.400000 105.306437 11.600000 14.500000 107.212218 11.600000 14.600000 109.137999 11.600000 14.700000 111.083781 11.600000 14.800000 113.049562 11.600000 14.900000 115.035343 11.600000 15.000000 117.041124 11.700000 -5.000000 117.481037 11.700000 -4.900000 115.478449 11.700000 -4.800000 113.495861 11.700000 -4.700000 111.533273 11.700000 -4.600000 109.590685 11.700000 -4.500000 107.668098 11.700000 -4.400000 105.765510 11.700000 -4.300000 103.882922 11.700000 -4.200000 102.020334 11.700000 -4.100000 100.177746 11.700000 -4.000000 98.355158 11.700000 -3.900000 96.552571 11.700000 -3.800000 94.769983 11.700000 -3.700000 93.007395 11.700000 -3.600000 91.264807 11.700000 -3.500000 89.542219 11.700000 -3.400000 87.839631 11.700000 -3.300000 86.157044 11.700000 -3.200000 84.494456 11.700000 -3.100000 82.851868 11.700000 -3.000000 81.229280 11.700000 -2.900000 79.626692 11.700000 -2.800000 78.044105 11.700000 -2.700000 76.481517 11.700000 -2.600000 74.938929 11.700000 -2.500000 73.416341 11.700000 -2.400000 71.913753 11.700000 -2.300000 70.431165 11.700000 -2.200000 68.968578 11.700000 -2.100000 67.525990 11.700000 -2.000000 66.103402 11.700000 -1.900000 64.700814 11.700000 -1.800000 63.318226 11.700000 -1.700000 61.955638 11.700000 -1.600000 60.613051 11.700000 -1.500000 59.290463 11.700000 -1.400000 57.987875 11.700000 -1.300000 56.705287 11.700000 -1.200000 55.442699 11.700000 -1.100000 54.200112 11.700000 -1.000000 52.977524 11.700000 -0.900000 51.774936 11.700000 -0.800000 50.592348 11.700000 -0.700000 49.429760 11.700000 -0.600000 48.287172 11.700000 -0.500000 47.164585 11.700000 -0.400000 46.061997 11.700000 -0.300000 44.979409 11.700000 -0.200000 43.916821 11.700000 -0.100000 42.874233 11.700000 -0.000000 41.851645 11.700000 0.100000 40.849058 11.700000 0.200000 39.866470 11.700000 0.300000 38.903882 11.700000 0.400000 37.961294 11.700000 0.500000 37.038706 11.700000 0.600000 36.136119 11.700000 0.700000 35.253531 11.700000 0.800000 34.390943 11.700000 0.900000 33.548355 11.700000 1.000000 32.725767 11.700000 1.100000 31.923179 11.700000 1.200000 31.140592 11.700000 1.300000 30.378004 11.700000 1.400000 29.635416 11.700000 1.500000 28.912828 11.700000 1.600000 28.210240 11.700000 1.700000 27.527652 11.700000 1.800000 26.865065 11.700000 1.900000 26.222477 11.700000 2.000000 25.599889 11.700000 2.100000 24.997301 11.700000 2.200000 24.414713 11.700000 2.300000 23.852126 11.700000 2.400000 23.309538 11.700000 2.500000 22.786950 11.700000 2.600000 22.284362 11.700000 2.700000 21.801774 11.700000 2.800000 21.339186 11.700000 2.900000 20.896599 11.700000 3.000000 20.474011 11.700000 3.100000 20.071423 11.700000 3.200000 19.688835 11.700000 3.300000 19.326247 11.700000 3.400000 18.983659 11.700000 3.500000 18.661072 11.700000 3.600000 18.358484 11.700000 3.700000 18.075896 11.700000 3.800000 17.813308 11.700000 3.900000 17.570720 11.700000 4.000000 17.348133 11.700000 4.100000 17.145545 11.700000 4.200000 16.962957 11.700000 4.300000 16.800369 11.700000 4.400000 16.657781 11.700000 4.500000 16.535193 11.700000 4.600000 16.432606 11.700000 4.700000 16.350018 11.700000 4.800000 16.287430 11.700000 4.900000 16.244842 11.700000 5.000000 16.222254 11.700000 5.100000 16.219666 11.700000 5.200000 16.237079 11.700000 5.300000 16.274491 11.700000 5.400000 16.331903 11.700000 5.500000 16.409315 11.700000 5.600000 16.506727 11.700000 5.700000 16.624140 11.700000 5.800000 16.761552 11.700000 5.900000 16.918964 11.700000 6.000000 17.096376 11.700000 6.100000 17.293788 11.700000 6.200000 17.511200 11.700000 6.300000 17.748613 11.700000 6.400000 18.006025 11.700000 6.500000 18.283437 11.700000 6.600000 18.580849 11.700000 6.700000 18.898261 11.700000 6.800000 19.235674 11.700000 6.900000 19.593086 11.700000 7.000000 19.970498 11.700000 7.100000 20.367910 11.700000 7.200000 20.785322 11.700000 7.300000 21.222734 11.700000 7.400000 21.680147 11.700000 7.500000 22.157559 11.700000 7.600000 22.654971 11.700000 7.700000 23.172383 11.700000 7.800000 23.709795 11.700000 7.900000 24.267207 11.700000 8.000000 24.844620 11.700000 8.100000 25.442032 11.700000 8.200000 26.059444 11.700000 8.300000 26.696856 11.700000 8.400000 27.354268 11.700000 8.500000 28.031681 11.700000 8.600000 28.729093 11.700000 8.700000 29.446505 11.700000 8.800000 30.183917 11.700000 8.900000 30.941329 11.700000 9.000000 31.718741 11.700000 9.100000 32.516154 11.700000 9.200000 33.333566 11.700000 9.300000 34.170978 11.700000 9.400000 35.028390 11.700000 9.500000 35.905802 11.700000 9.600000 36.803214 11.700000 9.700000 37.720627 11.700000 9.800000 38.658039 11.700000 9.900000 39.615451 11.700000 10.000000 40.592863 11.700000 10.100000 41.590275 11.700000 10.200000 42.607688 11.700000 10.300000 43.645100 11.700000 10.400000 44.702512 11.700000 10.500000 45.779924 11.700000 10.600000 46.877336 11.700000 10.700000 47.994748 11.700000 10.800000 49.132161 11.700000 10.900000 50.289573 11.700000 11.000000 51.466985 11.700000 11.100000 52.664397 11.700000 11.200000 53.881809 11.700000 11.300000 55.119221 11.700000 11.400000 56.376634 11.700000 11.500000 57.654046 11.700000 11.600000 58.951458 11.700000 11.700000 60.268870 11.700000 11.800000 61.606282 11.700000 11.900000 62.963695 11.700000 12.000000 64.341107 11.700000 12.100000 65.738519 11.700000 12.200000 67.155931 11.700000 12.300000 68.593343 11.700000 12.400000 70.050755 11.700000 12.500000 71.528168 11.700000 12.600000 73.025580 11.700000 12.700000 74.542992 11.700000 12.800000 76.080404 11.700000 12.900000 77.637816 11.700000 13.000000 79.215228 11.700000 13.100000 80.812641 11.700000 13.200000 82.430053 11.700000 13.300000 84.067465 11.700000 13.400000 85.724877 11.700000 13.500000 87.402289 11.700000 13.600000 89.099702 11.700000 13.700000 90.817114 11.700000 13.800000 92.554526 11.700000 13.900000 94.311938 11.700000 14.000000 96.089350 11.700000 14.100000 97.886762 11.700000 14.200000 99.704175 11.700000 14.300000 101.541587 11.700000 14.400000 103.398999 11.700000 14.500000 105.276411 11.700000 14.600000 107.173823 11.700000 14.700000 109.091235 11.700000 14.800000 111.028648 11.700000 14.900000 112.986060 11.700000 15.000000 114.963472 11.800000 -5.000000 121.108031 11.800000 -4.900000 119.076557 11.800000 -4.800000 117.065083 11.800000 -4.700000 115.073610 11.800000 -4.600000 113.102136 11.800000 -4.500000 111.150663 11.800000 -4.400000 109.219189 11.800000 -4.300000 107.307716 11.800000 -4.200000 105.416242 11.800000 -4.100000 103.544769 11.800000 -4.000000 101.693295 11.800000 -3.900000 99.861821 11.800000 -3.800000 98.050348 11.800000 -3.700000 96.258874 11.800000 -3.600000 94.487401 11.800000 -3.500000 92.735927 11.800000 -3.400000 91.004454 11.800000 -3.300000 89.292980 11.800000 -3.200000 87.601507 11.800000 -3.100000 85.930033 11.800000 -3.000000 84.278559 11.800000 -2.900000 82.647086 11.800000 -2.800000 81.035612 11.800000 -2.700000 79.444139 11.800000 -2.600000 77.872665 11.800000 -2.500000 76.321192 11.800000 -2.400000 74.789718 11.800000 -2.300000 73.278245 11.800000 -2.200000 71.786771 11.800000 -2.100000 70.315298 11.800000 -2.000000 68.863824 11.800000 -1.900000 67.432350 11.800000 -1.800000 66.020877 11.800000 -1.700000 64.629403 11.800000 -1.600000 63.257930 11.800000 -1.500000 61.906456 11.800000 -1.400000 60.574983 11.800000 -1.300000 59.263509 11.800000 -1.200000 57.972036 11.800000 -1.100000 56.700562 11.800000 -1.000000 55.449088 11.800000 -0.900000 54.217615 11.800000 -0.800000 53.006141 11.800000 -0.700000 51.814668 11.800000 -0.600000 50.643194 11.800000 -0.500000 49.491721 11.800000 -0.400000 48.360247 11.800000 -0.300000 47.248774 11.800000 -0.200000 46.157300 11.800000 -0.100000 45.085826 11.800000 -0.000000 44.034353 11.800000 0.100000 43.002879 11.800000 0.200000 41.991406 11.800000 0.300000 40.999932 11.800000 0.400000 40.028459 11.800000 0.500000 39.076985 11.800000 0.600000 38.145512 11.800000 0.700000 37.234038 11.800000 0.800000 36.342564 11.800000 0.900000 35.471091 11.800000 1.000000 34.619617 11.800000 1.100000 33.788144 11.800000 1.200000 32.976670 11.800000 1.300000 32.185197 11.800000 1.400000 31.413723 11.800000 1.500000 30.662250 11.800000 1.600000 29.930776 11.800000 1.700000 29.219302 11.800000 1.800000 28.527829 11.800000 1.900000 27.856355 11.800000 2.000000 27.204882 11.800000 2.100000 26.573408 11.800000 2.200000 25.961935 11.800000 2.300000 25.370461 11.800000 2.400000 24.798988 11.800000 2.500000 24.247514 11.800000 2.600000 23.716040 11.800000 2.700000 23.204567 11.800000 2.800000 22.713093 11.800000 2.900000 22.241620 11.800000 3.000000 21.790146 11.800000 3.100000 21.358673 11.800000 3.200000 20.947199 11.800000 3.300000 20.555726 11.800000 3.400000 20.184252 11.800000 3.500000 19.832779 11.800000 3.600000 19.501305 11.800000 3.700000 19.189831 11.800000 3.800000 18.898358 11.800000 3.900000 18.626884 11.800000 4.000000 18.375411 11.800000 4.100000 18.143937 11.800000 4.200000 17.932464 11.800000 4.300000 17.740990 11.800000 4.400000 17.569517 11.800000 4.500000 17.418043 11.800000 4.600000 17.286569 11.800000 4.700000 17.175096 11.800000 4.800000 17.083622 11.800000 4.900000 17.012149 11.800000 5.000000 16.960675 11.800000 5.100000 16.929202 11.800000 5.200000 16.917728 11.800000 5.300000 16.926255 11.800000 5.400000 16.954781 11.800000 5.500000 17.003307 11.800000 5.600000 17.071834 11.800000 5.700000 17.160360 11.800000 5.800000 17.268887 11.800000 5.900000 17.397413 11.800000 6.000000 17.545940 11.800000 6.100000 17.714466 11.800000 6.200000 17.902993 11.800000 6.300000 18.111519 11.800000 6.400000 18.340045 11.800000 6.500000 18.588572 11.800000 6.600000 18.857098 11.800000 6.700000 19.145625 11.800000 6.800000 19.454151 11.800000 6.900000 19.782678 11.800000 7.000000 20.131204 11.800000 7.100000 20.499731 11.800000 7.200000 20.888257 11.800000 7.300000 21.296783 11.800000 7.400000 21.725310 11.800000 7.500000 22.173836 11.800000 7.600000 22.642363 11.800000 7.700000 23.130889 11.800000 7.800000 23.639416 11.800000 7.900000 24.167942 11.800000 8.000000 24.716469 11.800000 8.100000 25.284995 11.800000 8.200000 25.873521 11.800000 8.300000 26.482048 11.800000 8.400000 27.110574 11.800000 8.500000 27.759101 11.800000 8.600000 28.427627 11.800000 8.700000 29.116154 11.800000 8.800000 29.824680 11.800000 8.900000 30.553207 11.800000 9.000000 31.301733 11.800000 9.100000 32.070260 11.800000 9.200000 32.858786 11.800000 9.300000 33.667312 11.800000 9.400000 34.495839 11.800000 9.500000 35.344365 11.800000 9.600000 36.212892 11.800000 9.700000 37.101418 11.800000 9.800000 38.009945 11.800000 9.900000 38.938471 11.800000 10.000000 39.886998 11.800000 10.100000 40.855524 11.800000 10.200000 41.844050 11.800000 10.300000 42.852577 11.800000 10.400000 43.881103 11.800000 10.500000 44.929630 11.800000 10.600000 45.998156 11.800000 10.700000 47.086683 11.800000 10.800000 48.195209 11.800000 10.900000 49.323736 11.800000 11.000000 50.472262 11.800000 11.100000 51.640788 11.800000 11.200000 52.829315 11.800000 11.300000 54.037841 11.800000 11.400000 55.266368 11.800000 11.500000 56.514894 11.800000 11.600000 57.783421 11.800000 11.700000 59.071947 11.800000 11.800000 60.380474 11.800000 11.900000 61.709000 11.800000 12.000000 63.057526 11.800000 12.100000 64.426053 11.800000 12.200000 65.814579 11.800000 12.300000 67.223106 11.800000 12.400000 68.651632 11.800000 12.500000 70.100159 11.800000 12.600000 71.568685 11.800000 12.700000 73.057212 11.800000 12.800000 74.565738 11.800000 12.900000 76.094264 11.800000 13.000000 77.642791 11.800000 13.100000 79.211317 11.800000 13.200000 80.799844 11.800000 13.300000 82.408370 11.800000 13.400000 84.036897 11.800000 13.500000 85.685423 11.800000 13.600000 87.353950 11.800000 13.700000 89.042476 11.800000 13.800000 90.751002 11.800000 13.900000 92.479529 11.800000 14.000000 94.228055 11.800000 14.100000 95.996582 11.800000 14.200000 97.785108 11.800000 14.300000 99.593635 11.800000 14.400000 101.422161 11.800000 14.500000 103.270688 11.800000 14.600000 105.139214 11.800000 14.700000 107.027740 11.800000 14.800000 108.936267 11.800000 14.900000 110.864793 11.800000 15.000000 112.813320 11.900000 -5.000000 124.761123 11.900000 -4.900000 122.700247 11.900000 -4.800000 120.659371 11.900000 -4.700000 118.638495 11.900000 -4.600000 116.637619 11.900000 -4.500000 114.656743 11.900000 -4.400000 112.695867 11.900000 -4.300000 110.754991 11.900000 -4.200000 108.834115 11.900000 -4.100000 106.933239 11.900000 -4.000000 105.052363 11.900000 -3.900000 103.191487 11.900000 -3.800000 101.350611 11.900000 -3.700000 99.529735 11.900000 -3.600000 97.728859 11.900000 -3.500000 95.947983 11.900000 -3.400000 94.187107 11.900000 -3.300000 92.446231 11.900000 -3.200000 90.725355 11.900000 -3.100000 89.024479 11.900000 -3.000000 87.343603 11.900000 -2.900000 85.682727 11.900000 -2.800000 84.041851 11.900000 -2.700000 82.420975 11.900000 -2.600000 80.820098 11.900000 -2.500000 79.239222 11.900000 -2.400000 77.678346 11.900000 -2.300000 76.137470 11.900000 -2.200000 74.616594 11.900000 -2.100000 73.115718 11.900000 -2.000000 71.634842 11.900000 -1.900000 70.173966 11.900000 -1.800000 68.733090 11.900000 -1.700000 67.312214 11.900000 -1.600000 65.911338 11.900000 -1.500000 64.530462 11.900000 -1.400000 63.169586 11.900000 -1.300000 61.828710 11.900000 -1.200000 60.507834 11.900000 -1.100000 59.206958 11.900000 -1.000000 57.926082 11.900000 -0.900000 56.665206 11.900000 -0.800000 55.424330 11.900000 -0.700000 54.203454 11.900000 -0.600000 53.002578 11.900000 -0.500000 51.821702 11.900000 -0.400000 50.660826 11.900000 -0.300000 49.519950 11.900000 -0.200000 48.399074 11.900000 -0.100000 47.298198 11.900000 -0.000000 46.217322 11.900000 0.100000 45.156446 11.900000 0.200000 44.115570 11.900000 0.300000 43.094694 11.900000 0.400000 42.093818 11.900000 0.500000 41.112942 11.900000 0.600000 40.152066 11.900000 0.700000 39.211190 11.900000 0.800000 38.290314 11.900000 0.900000 37.389438 11.900000 1.000000 36.508562 11.900000 1.100000 35.647686 11.900000 1.200000 34.806810 11.900000 1.300000 33.985934 11.900000 1.400000 33.185058 11.900000 1.500000 32.404182 11.900000 1.600000 31.643306 11.900000 1.700000 30.902430 11.900000 1.800000 30.181554 11.900000 1.900000 29.480677 11.900000 2.000000 28.799801 11.900000 2.100000 28.138925 11.900000 2.200000 27.498049 11.900000 2.300000 26.877173 11.900000 2.400000 26.276297 11.900000 2.500000 25.695421 11.900000 2.600000 25.134545 11.900000 2.700000 24.593669 11.900000 2.800000 24.072793 11.900000 2.900000 23.571917 11.900000 3.000000 23.091041 11.900000 3.100000 22.630165 11.900000 3.200000 22.189289 11.900000 3.300000 21.768413 11.900000 3.400000 21.367537 11.900000 3.500000 20.986661 11.900000 3.600000 20.625785 11.900000 3.700000 20.284909 11.900000 3.800000 19.964033 11.900000 3.900000 19.663157 11.900000 4.000000 19.382281 11.900000 4.100000 19.121405 11.900000 4.200000 18.880529 11.900000 4.300000 18.659653 11.900000 4.400000 18.458777 11.900000 4.500000 18.277901 11.900000 4.600000 18.117025 11.900000 4.700000 17.976149 11.900000 4.800000 17.855273 11.900000 4.900000 17.754397 11.900000 5.000000 17.673521 11.900000 5.100000 17.612645 11.900000 5.200000 17.571769 11.900000 5.300000 17.550893 11.900000 5.400000 17.550017 11.900000 5.500000 17.569141 11.900000 5.600000 17.608265 11.900000 5.700000 17.667389 11.900000 5.800000 17.746513 11.900000 5.900000 17.845637 11.900000 6.000000 17.964761 11.900000 6.100000 18.103885 11.900000 6.200000 18.263009 11.900000 6.300000 18.442133 11.900000 6.400000 18.641256 11.900000 6.500000 18.860380 11.900000 6.600000 19.099504 11.900000 6.700000 19.358628 11.900000 6.800000 19.637752 11.900000 6.900000 19.936876 11.900000 7.000000 20.256000 11.900000 7.100000 20.595124 11.900000 7.200000 20.954248 11.900000 7.300000 21.333372 11.900000 7.400000 21.732496 11.900000 7.500000 22.151620 11.900000 7.600000 22.590744 11.900000 7.700000 23.049868 11.900000 7.800000 23.528992 11.900000 7.900000 24.028116 11.900000 8.000000 24.547240 11.900000 8.100000 25.086364 11.900000 8.200000 25.645488 11.900000 8.300000 26.224612 11.900000 8.400000 26.823736 11.900000 8.500000 27.442860 11.900000 8.600000 28.081984 11.900000 8.700000 28.741108 11.900000 8.800000 29.420232 11.900000 8.900000 30.119356 11.900000 9.000000 30.838480 11.900000 9.100000 31.577604 11.900000 9.200000 32.336728 11.900000 9.300000 33.115852 11.900000 9.400000 33.914976 11.900000 9.500000 34.734100 11.900000 9.600000 35.573224 11.900000 9.700000 36.432348 11.900000 9.800000 37.311472 11.900000 9.900000 38.210596 11.900000 10.000000 39.129720 11.900000 10.100000 40.068844 11.900000 10.200000 41.027968 11.900000 10.300000 42.007092 11.900000 10.400000 43.006216 11.900000 10.500000 44.025340 11.900000 10.600000 45.064464 11.900000 10.700000 46.123588 11.900000 10.800000 47.202711 11.900000 10.900000 48.301835 11.900000 11.000000 49.420959 11.900000 11.100000 50.560083 11.900000 11.200000 51.719207 11.900000 11.300000 52.898331 11.900000 11.400000 54.097455 11.900000 11.500000 55.316579 11.900000 11.600000 56.555703 11.900000 11.700000 57.814827 11.900000 11.800000 59.093951 11.900000 11.900000 60.393075 11.900000 12.000000 61.712199 11.900000 12.100000 63.051323 11.900000 12.200000 64.410447 11.900000 12.300000 65.789571 11.900000 12.400000 67.188695 11.900000 12.500000 68.607819 11.900000 12.600000 70.046943 11.900000 12.700000 71.506067 11.900000 12.800000 72.985191 11.900000 12.900000 74.484315 11.900000 13.000000 76.003439 11.900000 13.100000 77.542563 11.900000 13.200000 79.101687 11.900000 13.300000 80.680811 11.900000 13.400000 82.279935 11.900000 13.500000 83.899059 11.900000 13.600000 85.538183 11.900000 13.700000 87.197307 11.900000 13.800000 88.876431 11.900000 13.900000 90.575555 11.900000 14.000000 92.294679 11.900000 14.100000 94.033803 11.900000 14.200000 95.792927 11.900000 14.300000 97.572051 11.900000 14.400000 99.371175 11.900000 14.500000 101.190299 11.900000 14.600000 103.029423 11.900000 14.700000 104.888547 11.900000 14.800000 106.767671 11.900000 14.900000 108.666795 11.900000 15.000000 110.585919 12.000000 -5.000000 128.436296 12.000000 -4.900000 126.345500 12.000000 -4.800000 124.274705 12.000000 -4.700000 122.223910 12.000000 -4.600000 120.193115 12.000000 -4.500000 118.182319 12.000000 -4.400000 116.191524 12.000000 -4.300000 114.220729 12.000000 -4.200000 112.269934 12.000000 -4.100000 110.339139 12.000000 -4.000000 108.428343 12.000000 -3.900000 106.537548 12.000000 -3.800000 104.666753 12.000000 -3.700000 102.815958 12.000000 -3.600000 100.985162 12.000000 -3.500000 99.174367 12.000000 -3.400000 97.383572 12.000000 -3.300000 95.612777 12.000000 -3.200000 93.861982 12.000000 -3.100000 92.131186 12.000000 -3.000000 90.420391 12.000000 -2.900000 88.729596 12.000000 -2.800000 87.058801 12.000000 -2.700000 85.408005 12.000000 -2.600000 83.777210 12.000000 -2.500000 82.166415 12.000000 -2.400000 80.575620 12.000000 -2.300000 79.004824 12.000000 -2.200000 77.454029 12.000000 -2.100000 75.923234 12.000000 -2.000000 74.412439 12.000000 -1.900000 72.921644 12.000000 -1.800000 71.450848 12.000000 -1.700000 70.000053 12.000000 -1.600000 68.569258 12.000000 -1.500000 67.158463 12.000000 -1.400000 65.767667 12.000000 -1.300000 64.396872 12.000000 -1.200000 63.046077 12.000000 -1.100000 61.715282 12.000000 -1.000000 60.404486 12.000000 -0.900000 59.113691 12.000000 -0.800000 57.842896 12.000000 -0.700000 56.592101 12.000000 -0.600000 55.361306 12.000000 -0.500000 54.150510 12.000000 -0.400000 52.959715 12.000000 -0.300000 51.788920 12.000000 -0.200000 50.638125 12.000000 -0.100000 49.507329 12.000000 -0.000000 48.396534 12.000000 0.100000 47.305739 12.000000 0.200000 46.234944 12.000000 0.300000 45.184148 12.000000 0.400000 44.153353 12.000000 0.500000 43.142558 12.000000 0.600000 42.151763 12.000000 0.700000 41.180968 12.000000 0.800000 40.230172 12.000000 0.900000 39.299377 12.000000 1.000000 38.388582 12.000000 1.100000 37.497787 12.000000 1.200000 36.626991 12.000000 1.300000 35.776196 12.000000 1.400000 34.945401 12.000000 1.500000 34.134606 12.000000 1.600000 33.343811 12.000000 1.700000 32.573015 12.000000 1.800000 31.822220 12.000000 1.900000 31.091425 12.000000 2.000000 30.380630 12.000000 2.100000 29.689834 12.000000 2.200000 29.019039 12.000000 2.300000 28.368244 12.000000 2.400000 27.737449 12.000000 2.500000 27.126653 12.000000 2.600000 26.535858 12.000000 2.700000 25.965063 12.000000 2.800000 25.414268 12.000000 2.900000 24.883473 12.000000 3.000000 24.372677 12.000000 3.100000 23.881882 12.000000 3.200000 23.411087 12.000000 3.300000 22.960292 12.000000 3.400000 22.529496 12.000000 3.500000 22.118701 12.000000 3.600000 21.727906 12.000000 3.700000 21.357111 12.000000 3.800000 21.006315 12.000000 3.900000 20.675520 12.000000 4.000000 20.364725 12.000000 4.100000 20.073930 12.000000 4.200000 19.803135 12.000000 4.300000 19.552339 12.000000 4.400000 19.321544 12.000000 4.500000 19.110749 12.000000 4.600000 18.919954 12.000000 4.700000 18.749158 12.000000 4.800000 18.598363 12.000000 4.900000 18.467568 12.000000 5.000000 18.356773 12.000000 5.100000 18.265977 12.000000 5.200000 18.195182 12.000000 5.300000 18.144387 12.000000 5.400000 18.113592 12.000000 5.500000 18.102797 12.000000 5.600000 18.112001 12.000000 5.700000 18.141206 12.000000 5.800000 18.190411 12.000000 5.900000 18.259616 12.000000 6.000000 18.348820 12.000000 6.100000 18.458025 12.000000 6.200000 18.587230 12.000000 6.300000 18.736435 12.000000 6.400000 18.905640 12.000000 6.500000 19.094844 12.000000 6.600000 19.304049 12.000000 6.700000 19.533254 12.000000 6.800000 19.782459 12.000000 6.900000 20.051663 12.000000 7.000000 20.340868 12.000000 7.100000 20.650073 12.000000 7.200000 20.979278 12.000000 7.300000 21.328482 12.000000 7.400000 21.697687 12.000000 7.500000 22.086892 12.000000 7.600000 22.496097 12.000000 7.700000 22.925302 12.000000 7.800000 23.374506 12.000000 7.900000 23.843711 12.000000 8.000000 24.332916 12.000000 8.100000 24.842121 12.000000 8.200000 25.371325 12.000000 8.300000 25.920530 12.000000 8.400000 26.489735 12.000000 8.500000 27.078940 12.000000 8.600000 27.688144 12.000000 8.700000 28.317349 12.000000 8.800000 28.966554 12.000000 8.900000 29.635759 12.000000 9.000000 30.324964 12.000000 9.100000 31.034168 12.000000 9.200000 31.763373 12.000000 9.300000 32.512578 12.000000 9.400000 33.281783 12.000000 9.500000 34.070987 12.000000 9.600000 34.880192 12.000000 9.700000 35.709397 12.000000 9.800000 36.558602 12.000000 9.900000 37.427806 12.000000 10.000000 38.317011 12.000000 10.100000 39.226216 12.000000 10.200000 40.155421 12.000000 10.300000 41.104626 12.000000 10.400000 42.073830 12.000000 10.500000 43.063035 12.000000 10.600000 44.072240 12.000000 10.700000 45.101445 12.000000 10.800000 46.150649 12.000000 10.900000 47.219854 12.000000 11.000000 48.309059 12.000000 11.100000 49.418264 12.000000 11.200000 50.547469 12.000000 11.300000 51.696673 12.000000 11.400000 52.865878 12.000000 11.500000 54.055083 12.000000 11.600000 55.264288 12.000000 11.700000 56.493492 12.000000 11.800000 57.742697 12.000000 11.900000 59.011902 12.000000 12.000000 60.301107 12.000000 12.100000 61.610311 12.000000 12.200000 62.939516 12.000000 12.300000 64.288721 12.000000 12.400000 65.657926 12.000000 12.500000 67.047131 12.000000 12.600000 68.456335 12.000000 12.700000 69.885540 12.000000 12.800000 71.334745 12.000000 12.900000 72.803950 12.000000 13.000000 74.293154 12.000000 13.100000 75.802359 12.000000 13.200000 77.331564 12.000000 13.300000 78.880769 12.000000 13.400000 80.449973 12.000000 13.500000 82.039178 12.000000 13.600000 83.648383 12.000000 13.700000 85.277588 12.000000 13.800000 86.926793 12.000000 13.900000 88.595997 12.000000 14.000000 90.285202 12.000000 14.100000 91.994407 12.000000 14.200000 93.723612 12.000000 14.300000 95.472816 12.000000 14.400000 97.242021 12.000000 14.500000 99.031226 12.000000 14.600000 100.840431 12.000000 14.700000 102.669635 12.000000 14.800000 104.518840 12.000000 14.900000 106.388045 12.000000 15.000000 108.277250 12.100000 -5.000000 132.130324 12.100000 -4.900000 130.009092 12.100000 -4.800000 127.907861 12.100000 -4.700000 125.826630 12.100000 -4.600000 123.765399 12.100000 -4.500000 121.724168 12.100000 -4.400000 119.702937 12.100000 -4.300000 117.701705 12.100000 -4.200000 115.720474 12.100000 -4.100000 113.759243 12.100000 -4.000000 111.818012 12.100000 -3.900000 109.896781 12.100000 -3.800000 107.995550 12.100000 -3.700000 106.114318 12.100000 -3.600000 104.253087 12.100000 -3.500000 102.411856 12.100000 -3.400000 100.590625 12.100000 -3.300000 98.789394 12.100000 -3.200000 97.008162 12.100000 -3.100000 95.246931 12.100000 -3.000000 93.505700 12.100000 -2.900000 91.784469 12.100000 -2.800000 90.083238 12.100000 -2.700000 88.402007 12.100000 -2.600000 86.740775 12.100000 -2.500000 85.099544 12.100000 -2.400000 83.478313 12.100000 -2.300000 81.877082 12.100000 -2.200000 80.295851 12.100000 -2.100000 78.734620 12.100000 -2.000000 77.193388 12.100000 -1.900000 75.672157 12.100000 -1.800000 74.170926 12.100000 -1.700000 72.689695 12.100000 -1.600000 71.228464 12.100000 -1.500000 69.787233 12.100000 -1.400000 68.366001 12.100000 -1.300000 66.964770 12.100000 -1.200000 65.583539 12.100000 -1.100000 64.222308 12.100000 -1.000000 62.881077 12.100000 -0.900000 61.559845 12.100000 -0.800000 60.258614 12.100000 -0.700000 58.977383 12.100000 -0.600000 57.716152 12.100000 -0.500000 56.474921 12.100000 -0.400000 55.253690 12.100000 -0.300000 54.052458 12.100000 -0.200000 52.871227 12.100000 -0.100000 51.709996 12.100000 -0.000000 50.568765 12.100000 0.100000 49.447534 12.100000 0.200000 48.346303 12.100000 0.300000 47.265071 12.100000 0.400000 46.203840 12.100000 0.500000 45.162609 12.100000 0.600000 44.141378 12.100000 0.700000 43.140147 12.100000 0.800000 42.158916 12.100000 0.900000 41.197684 12.100000 1.000000 40.256453 12.100000 1.100000 39.335222 12.100000 1.200000 38.433991 12.100000 1.300000 37.552760 12.100000 1.400000 36.691528 12.100000 1.500000 35.850297 12.100000 1.600000 35.029066 12.100000 1.700000 34.227835 12.100000 1.800000 33.446604 12.100000 1.900000 32.685373 12.100000 2.000000 31.944141 12.100000 2.100000 31.222910 12.100000 2.200000 30.521679 12.100000 2.300000 29.840448 12.100000 2.400000 29.179217 12.100000 2.500000 28.537986 12.100000 2.600000 27.916754 12.100000 2.700000 27.315523 12.100000 2.800000 26.734292 12.100000 2.900000 26.173061 12.100000 3.000000 25.631830 12.100000 3.100000 25.110599 12.100000 3.200000 24.609367 12.100000 3.300000 24.128136 12.100000 3.400000 23.666905 12.100000 3.500000 23.225674 12.100000 3.600000 22.804443 12.100000 3.700000 22.403211 12.100000 3.800000 22.021980 12.100000 3.900000 21.660749 12.100000 4.000000 21.319518 12.100000 4.100000 20.998287 12.100000 4.200000 20.697056 12.100000 4.300000 20.415824 12.100000 4.400000 20.154593 12.100000 4.500000 19.913362 12.100000 4.600000 19.692131 12.100000 4.700000 19.490900 12.100000 4.800000 19.309669 12.100000 4.900000 19.148437 12.100000 5.000000 19.007206 12.100000 5.100000 18.885975 12.100000 5.200000 18.784744 12.100000 5.300000 18.703513 12.100000 5.400000 18.642282 12.100000 5.500000 18.601050 12.100000 5.600000 18.579819 12.100000 5.700000 18.578588 12.100000 5.800000 18.597357 12.100000 5.900000 18.636126 12.100000 6.000000 18.694894 12.100000 6.100000 18.773663 12.100000 6.200000 18.872432 12.100000 6.300000 18.991201 12.100000 6.400000 19.129970 12.100000 6.500000 19.288739 12.100000 6.600000 19.467507 12.100000 6.700000 19.666276 12.100000 6.800000 19.885045 12.100000 6.900000 20.123814 12.100000 7.000000 20.382583 12.100000 7.100000 20.661352 12.100000 7.200000 20.960120 12.100000 7.300000 21.278889 12.100000 7.400000 21.617658 12.100000 7.500000 21.976427 12.100000 7.600000 22.355196 12.100000 7.700000 22.753965 12.100000 7.800000 23.172733 12.100000 7.900000 23.611502 12.100000 8.000000 24.070271 12.100000 8.100000 24.549040 12.100000 8.200000 25.047809 12.100000 8.300000 25.566577 12.100000 8.400000 26.105346 12.100000 8.500000 26.664115 12.100000 8.600000 27.242884 12.100000 8.700000 27.841653 12.100000 8.800000 28.460422 12.100000 8.900000 29.099190 12.100000 9.000000 29.757959 12.100000 9.100000 30.436728 12.100000 9.200000 31.135497 12.100000 9.300000 31.854266 12.100000 9.400000 32.593035 12.100000 9.500000 33.351803 12.100000 9.600000 34.130572 12.100000 9.700000 34.929341 12.100000 9.800000 35.748110 12.100000 9.900000 36.586879 12.100000 10.000000 37.445648 12.100000 10.100000 38.324416 12.100000 10.200000 39.223185 12.100000 10.300000 40.141954 12.100000 10.400000 41.080723 12.100000 10.500000 42.039492 12.100000 10.600000 43.018260 12.100000 10.700000 44.017029 12.100000 10.800000 45.035798 12.100000 10.900000 46.074567 12.100000 11.000000 47.133336 12.100000 11.100000 48.212105 12.100000 11.200000 49.310873 12.100000 11.300000 50.429642 12.100000 11.400000 51.568411 12.100000 11.500000 52.727180 12.100000 11.600000 53.905949 12.100000 11.700000 55.104718 12.100000 11.800000 56.323486 12.100000 11.900000 57.562255 12.100000 12.000000 58.821024 12.100000 12.100000 60.099793 12.100000 12.200000 61.398562 12.100000 12.300000 62.717331 12.100000 12.400000 64.056099 12.100000 12.500000 65.414868 12.100000 12.600000 66.793637 12.100000 12.700000 68.192406 12.100000 12.800000 69.611175 12.100000 12.900000 71.049943 12.100000 13.000000 72.508712 12.100000 13.100000 73.987481 12.100000 13.200000 75.486250 12.100000 13.300000 77.005019 12.100000 13.400000 78.543788 12.100000 13.500000 80.102556 12.100000 13.600000 81.681325 12.100000 13.700000 83.280094 12.100000 13.800000 84.898863 12.100000 13.900000 86.537632 12.100000 14.000000 88.196401 12.100000 14.100000 89.875169 12.100000 14.200000 91.573938 12.100000 14.300000 93.292707 12.100000 14.400000 95.031476 12.100000 14.500000 96.790245 12.100000 14.600000 98.569014 12.100000 14.700000 100.367782 12.100000 14.800000 102.186551 12.100000 14.900000 104.025320 12.100000 15.000000 105.884089 12.200000 -5.000000 135.840831 12.200000 -4.900000 133.688647 12.200000 -4.800000 131.556463 12.200000 -4.700000 129.444280 12.200000 -4.600000 127.352096 12.200000 -4.500000 125.279912 12.200000 -4.400000 123.227728 12.200000 -4.300000 121.195544 12.200000 -4.200000 119.183360 12.200000 -4.100000 117.191176 12.200000 -4.000000 115.218993 12.200000 -3.900000 113.266809 12.200000 -3.800000 111.334625 12.200000 -3.700000 109.422441 12.200000 -3.600000 107.530257 12.200000 -3.500000 105.658073 12.200000 -3.400000 103.805889 12.200000 -3.300000 101.973706 12.200000 -3.200000 100.161522 12.200000 -3.100000 98.369338 12.200000 -3.000000 96.597154 12.200000 -2.900000 94.844970 12.200000 -2.800000 93.112786 12.200000 -2.700000 91.400602 12.200000 -2.600000 89.708419 12.200000 -2.500000 88.036235 12.200000 -2.400000 86.384051 12.200000 -2.300000 84.751867 12.200000 -2.200000 83.139683 12.200000 -2.100000 81.547499 12.200000 -2.000000 79.975315 12.200000 -1.900000 78.423132 12.200000 -1.800000 76.890948 12.200000 -1.700000 75.378764 12.200000 -1.600000 73.886580 12.200000 -1.500000 72.414396 12.200000 -1.400000 70.962212 12.200000 -1.300000 69.530028 12.200000 -1.200000 68.117845 12.200000 -1.100000 66.725661 12.200000 -1.000000 65.353477 12.200000 -0.900000 64.001293 12.200000 -0.800000 62.669109 12.200000 -0.700000 61.356925 12.200000 -0.600000 60.064741 12.200000 -0.500000 58.792558 12.200000 -0.400000 57.540374 12.200000 -0.300000 56.308190 12.200000 -0.200000 55.096006 12.200000 -0.100000 53.903822 12.200000 -0.000000 52.731638 12.200000 0.100000 51.579454 12.200000 0.200000 50.447271 12.200000 0.300000 49.335087 12.200000 0.400000 48.242903 12.200000 0.500000 47.170719 12.200000 0.600000 46.118535 12.200000 0.700000 45.086351 12.200000 0.800000 44.074167 12.200000 0.900000 43.081984 12.200000 1.000000 42.109800 12.200000 1.100000 41.157616 12.200000 1.200000 40.225432 12.200000 1.300000 39.313248 12.200000 1.400000 38.421064 12.200000 1.500000 37.548880 12.200000 1.600000 36.696697 12.200000 1.700000 35.864513 12.200000 1.800000 35.052329 12.200000 1.900000 34.260145 12.200000 2.000000 33.487961 12.200000 2.100000 32.735777 12.200000 2.200000 32.003593 12.200000 2.300000 31.291410 12.200000 2.400000 30.599226 12.200000 2.500000 29.927042 12.200000 2.600000 29.274858 12.200000 2.700000 28.642674 12.200000 2.800000 28.030490 12.200000 2.900000 27.438306 12.200000 3.000000 26.866123 12.200000 3.100000 26.313939 12.200000 3.200000 25.781755 12.200000 3.300000 25.269571 12.200000 3.400000 24.777387 12.200000 3.500000 24.305203 12.200000 3.600000 23.853019 12.200000 3.700000 23.420836 12.200000 3.800000 23.008652 12.200000 3.900000 22.616468 12.200000 4.000000 22.244284 12.200000 4.100000 21.892100 12.200000 4.200000 21.559916 12.200000 4.300000 21.247732 12.200000 4.400000 20.955549 12.200000 4.500000 20.683365 12.200000 4.600000 20.431181 12.200000 4.700000 20.198997 12.200000 4.800000 19.986813 12.200000 4.900000 19.794629 12.200000 5.000000 19.622446 12.200000 5.100000 19.470262 12.200000 5.200000 19.338078 12.200000 5.300000 19.225894 12.200000 5.400000 19.133710 12.200000 5.500000 19.061526 12.200000 5.600000 19.009342 12.200000 5.700000 18.977159 12.200000 5.800000 18.964975 12.200000 5.900000 18.972791 12.200000 6.000000 19.000607 12.200000 6.100000 19.048423 12.200000 6.200000 19.116239 12.200000 6.300000 19.204055 12.200000 6.400000 19.311872 12.200000 6.500000 19.439688 12.200000 6.600000 19.587504 12.200000 6.700000 19.755320 12.200000 6.800000 19.943136 12.200000 6.900000 20.150952 12.200000 7.000000 20.378768 12.200000 7.100000 20.626585 12.200000 7.200000 20.894401 12.200000 7.300000 21.182217 12.200000 7.400000 21.490033 12.200000 7.500000 21.817849 12.200000 7.600000 22.165665 12.200000 7.700000 22.533481 12.200000 7.800000 22.921298 12.200000 7.900000 23.329114 12.200000 8.000000 23.756930 12.200000 8.100000 24.204746 12.200000 8.200000 24.672562 12.200000 8.300000 25.160378 12.200000 8.400000 25.668194 12.200000 8.500000 26.196011 12.200000 8.600000 26.743827 12.200000 8.700000 27.311643 12.200000 8.800000 27.899459 12.200000 8.900000 28.507275 12.200000 9.000000 29.135091 12.200000 9.100000 29.782907 12.200000 9.200000 30.450724 12.200000 9.300000 31.138540 12.200000 9.400000 31.846356 12.200000 9.500000 32.574172 12.200000 9.600000 33.321988 12.200000 9.700000 34.089804 12.200000 9.800000 34.877620 12.200000 9.900000 35.685437 12.200000 10.000000 36.513253 12.200000 10.100000 37.361069 12.200000 10.200000 38.228885 12.200000 10.300000 39.116701 12.200000 10.400000 40.024517 12.200000 10.500000 40.952333 12.200000 10.600000 41.900150 12.200000 10.700000 42.867966 12.200000 10.800000 43.855782 12.200000 10.900000 44.863598 12.200000 11.000000 45.891414 12.200000 11.100000 46.939230 12.200000 11.200000 48.007046 12.200000 11.300000 49.094863 12.200000 11.400000 50.202679 12.200000 11.500000 51.330495 12.200000 11.600000 52.478311 12.200000 11.700000 53.646127 12.200000 11.800000 54.833943 12.200000 11.900000 56.041759 12.200000 12.000000 57.269576 12.200000 12.100000 58.517392 12.200000 12.200000 59.785208 12.200000 12.300000 61.073024 12.200000 12.400000 62.380840 12.200000 12.500000 63.708656 12.200000 12.600000 65.056472 12.200000 12.700000 66.424289 12.200000 12.800000 67.812105 12.200000 12.900000 69.219921 12.200000 13.000000 70.647737 12.200000 13.100000 72.095553 12.200000 13.200000 73.563369 12.200000 13.300000 75.051185 12.200000 13.400000 76.559002 12.200000 13.500000 78.086818 12.200000 13.600000 79.634634 12.200000 13.700000 81.202450 12.200000 13.800000 82.790266 12.200000 13.900000 84.398082 12.200000 14.000000 86.025898 12.200000 14.100000 87.673715 12.200000 14.200000 89.341531 12.200000 14.300000 91.029347 12.200000 14.400000 92.737163 12.200000 14.500000 94.464979 12.200000 14.600000 96.212795 12.200000 14.700000 97.980611 12.200000 14.800000 99.768428 12.200000 14.900000 101.576244 12.200000 15.000000 103.404060 12.300000 -5.000000 139.566339 12.300000 -4.900000 137.382686 12.300000 -4.800000 135.219032 12.300000 -4.700000 133.075379 12.300000 -4.600000 130.951726 12.300000 -4.500000 128.848072 12.300000 -4.400000 126.764419 12.300000 -4.300000 124.700766 12.300000 -4.200000 122.657113 12.300000 -4.100000 120.633459 12.300000 -4.000000 118.629806 12.300000 -3.900000 116.646153 12.300000 -3.800000 114.682499 12.300000 -3.700000 112.738846 12.300000 -3.600000 110.815193 12.300000 -3.500000 108.911540 12.300000 -3.400000 107.027886 12.300000 -3.300000 105.164233 12.300000 -3.200000 103.320580 12.300000 -3.100000 101.496927 12.300000 -3.000000 99.693273 12.300000 -2.900000 97.909620 12.300000 -2.800000 96.145967 12.300000 -2.700000 94.402313 12.300000 -2.600000 92.678660 12.300000 -2.500000 90.975007 12.300000 -2.400000 89.291354 12.300000 -2.300000 87.627700 12.300000 -2.200000 85.984047 12.300000 -2.100000 84.360394 12.300000 -2.000000 82.756740 12.300000 -1.900000 81.173087 12.300000 -1.800000 79.609434 12.300000 -1.700000 78.065781 12.300000 -1.600000 76.542127 12.300000 -1.500000 75.038474 12.300000 -1.400000 73.554821 12.300000 -1.300000 72.091168 12.300000 -1.200000 70.647514 12.300000 -1.100000 69.223861 12.300000 -1.000000 67.820208 12.300000 -0.900000 66.436554 12.300000 -0.800000 65.072901 12.300000 -0.700000 63.729248 12.300000 -0.600000 62.405595 12.300000 -0.500000 61.101941 12.300000 -0.400000 59.818288 12.300000 -0.300000 58.554635 12.300000 -0.200000 57.310982 12.300000 -0.100000 56.087328 12.300000 -0.000000 54.883675 12.300000 0.100000 53.700022 12.300000 0.200000 52.536368 12.300000 0.300000 51.392715 12.300000 0.400000 50.269062 12.300000 0.500000 49.165409 12.300000 0.600000 48.081755 12.300000 0.700000 47.018102 12.300000 0.800000 45.974449 12.300000 0.900000 44.950795 12.300000 1.000000 43.947142 12.300000 1.100000 42.963489 12.300000 1.200000 41.999836 12.300000 1.300000 41.056182 12.300000 1.400000 40.132529 12.300000 1.500000 39.228876 12.300000 1.600000 38.345223 12.300000 1.700000 37.481569 12.300000 1.800000 36.637916 12.300000 1.900000 35.814263 12.300000 2.000000 35.010609 12.300000 2.100000 34.226956 12.300000 2.200000 33.463303 12.300000 2.300000 32.719650 12.300000 2.400000 31.995996 12.300000 2.500000 31.292343 12.300000 2.600000 30.608690 12.300000 2.700000 29.945036 12.300000 2.800000 29.301383 12.300000 2.900000 28.677730 12.300000 3.000000 28.074077 12.300000 3.100000 27.490423 12.300000 3.200000 26.926770 12.300000 3.300000 26.383117 12.300000 3.400000 25.859464 12.300000 3.500000 25.355810 12.300000 3.600000 24.872157 12.300000 3.700000 24.408504 12.300000 3.800000 23.964850 12.300000 3.900000 23.541197 12.300000 4.000000 23.137544 12.300000 4.100000 22.753891 12.300000 4.200000 22.390237 12.300000 4.300000 22.046584 12.300000 4.400000 21.722931 12.300000 4.500000 21.419277 12.300000 4.600000 21.135624 12.300000 4.700000 20.871971 12.300000 4.800000 20.628318 12.300000 4.900000 20.404664 12.300000 5.000000 20.201011 12.300000 5.100000 20.017358 12.300000 5.200000 19.853705 12.300000 5.300000 19.710051 12.300000 5.400000 19.586398 12.300000 5.500000 19.482745 12.300000 5.600000 19.399091 12.300000 5.700000 19.335438 12.300000 5.800000 19.291785 12.300000 5.900000 19.268132 12.300000 6.000000 19.264478 12.300000 6.100000 19.280825 12.300000 6.200000 19.317172 12.300000 6.300000 19.373518 12.300000 6.400000 19.449865 12.300000 6.500000 19.546212 12.300000 6.600000 19.662559 12.300000 6.700000 19.798905 12.300000 6.800000 19.955252 12.300000 6.900000 20.131599 12.300000 7.000000 20.327946 12.300000 7.100000 20.544292 12.300000 7.200000 20.780639 12.300000 7.300000 21.036986 12.300000 7.400000 21.313332 12.300000 7.500000 21.609679 12.300000 7.600000 21.926026 12.300000 7.700000 22.262373 12.300000 7.800000 22.618719 12.300000 7.900000 22.995066 12.300000 8.000000 23.391413 12.300000 8.100000 23.807759 12.300000 8.200000 24.244106 12.300000 8.300000 24.700453 12.300000 8.400000 25.176800 12.300000 8.500000 25.673146 12.300000 8.600000 26.189493 12.300000 8.700000 26.725840 12.300000 8.800000 27.282187 12.300000 8.900000 27.858533 12.300000 9.000000 28.454880 12.300000 9.100000 29.071227 12.300000 9.200000 29.707573 12.300000 9.300000 30.363920 12.300000 9.400000 31.040267 12.300000 9.500000 31.736614 12.300000 9.600000 32.452960 12.300000 9.700000 33.189307 12.300000 9.800000 33.945654 12.300000 9.900000 34.722000 12.300000 10.000000 35.518347 12.300000 10.100000 36.334694 12.300000 10.200000 37.171041 12.300000 10.300000 38.027387 12.300000 10.400000 38.903734 12.300000 10.500000 39.800081 12.300000 10.600000 40.716428 12.300000 10.700000 41.652774 12.300000 10.800000 42.609121 12.300000 10.900000 43.585468 12.300000 11.000000 44.581814 12.300000 11.100000 45.598161 12.300000 11.200000 46.634508 12.300000 11.300000 47.690855 12.300000 11.400000 48.767201 12.300000 11.500000 49.863548 12.300000 11.600000 50.979895 12.300000 11.700000 52.116241 12.300000 11.800000 53.272588 12.300000 11.900000 54.448935 12.300000 12.000000 55.645282 12.300000 12.100000 56.861628 12.300000 12.200000 58.097975 12.300000 12.300000 59.354322 12.300000 12.400000 60.630669 12.300000 12.500000 61.927015 12.300000 12.600000 63.243362 12.300000 12.700000 64.579709 12.300000 12.800000 65.936055 12.300000 12.900000 67.312402 12.300000 13.000000 68.708749 12.300000 13.100000 70.125096 12.300000 13.200000 71.561442 12.300000 13.300000 73.017789 12.300000 13.400000 74.494136 12.300000 13.500000 75.990482 12.300000 13.600000 77.506829 12.300000 13.700000 79.043176 12.300000 13.800000 80.599523 12.300000 13.900000 82.175869 12.300000 14.000000 83.772216 12.300000 14.100000 85.388563 12.300000 14.200000 87.024910 12.300000 14.300000 88.681256 12.300000 14.400000 90.357603 12.300000 14.500000 92.053950 12.300000 14.600000 93.770296 12.300000 14.700000 95.506643 12.300000 14.800000 97.262990 12.300000 14.900000 99.039337 12.300000 15.000000 100.835683 12.400000 -5.000000 143.306302 12.400000 -4.900000 141.090663 12.400000 -4.800000 138.895023 12.400000 -4.700000 136.719384 12.400000 -4.600000 134.563744 12.400000 -4.500000 132.428105 12.400000 -4.400000 130.312465 12.400000 -4.300000 128.216826 12.400000 -4.200000 126.141187 12.400000 -4.100000 124.085547 12.400000 -4.000000 122.049908 12.400000 -3.900000 120.034268 12.400000 -3.800000 118.038629 12.400000 -3.700000 116.062989 12.400000 -3.600000 114.107350 12.400000 -3.500000 112.171711 12.400000 -3.400000 110.256071 12.400000 -3.300000 108.360432 12.400000 -3.200000 106.484792 12.400000 -3.100000 104.629153 12.400000 -3.000000 102.793513 12.400000 -2.900000 100.977874 12.400000 -2.800000 99.182235 12.400000 -2.700000 97.406595 12.400000 -2.600000 95.650956 12.400000 -2.500000 93.915316 12.400000 -2.400000 92.199677 12.400000 -2.300000 90.504037 12.400000 -2.200000 88.828398 12.400000 -2.100000 87.172758 12.400000 -2.000000 85.537119 12.400000 -1.900000 83.921480 12.400000 -1.800000 82.325840 12.400000 -1.700000 80.750201 12.400000 -1.600000 79.194561 12.400000 -1.500000 77.658922 12.400000 -1.400000 76.143282 12.400000 -1.300000 74.647643 12.400000 -1.200000 73.172004 12.400000 -1.100000 71.716364 12.400000 -1.000000 70.280725 12.400000 -0.900000 68.865085 12.400000 -0.800000 67.469446 12.400000 -0.700000 66.093806 12.400000 -0.600000 64.738167 12.400000 -0.500000 63.402527 12.400000 -0.400000 62.086888 12.400000 -0.300000 60.791249 12.400000 -0.200000 59.515609 12.400000 -0.100000 58.259970 12.400000 -0.000000 57.024330 12.400000 0.100000 55.808691 12.400000 0.200000 54.613051 12.400000 0.300000 53.437412 12.400000 0.400000 52.281773 12.400000 0.500000 51.146133 12.400000 0.600000 50.030494 12.400000 0.700000 48.934854 12.400000 0.800000 47.859215 12.400000 0.900000 46.803575 12.400000 1.000000 45.767936 12.400000 1.100000 44.752296 12.400000 1.200000 43.756657 12.400000 1.300000 42.781018 12.400000 1.400000 41.825378 12.400000 1.500000 40.889739 12.400000 1.600000 39.974099 12.400000 1.700000 39.078460 12.400000 1.800000 38.202820 12.400000 1.900000 37.347181 12.400000 2.000000 36.511542 12.400000 2.100000 35.695902 12.400000 2.200000 34.900263 12.400000 2.300000 34.124623 12.400000 2.400000 33.368984 12.400000 2.500000 32.633344 12.400000 2.600000 31.917705 12.400000 2.700000 31.222065 12.400000 2.800000 30.546426 12.400000 2.900000 29.890787 12.400000 3.000000 29.255147 12.400000 3.100000 28.639508 12.400000 3.200000 28.043868 12.400000 3.300000 27.468229 12.400000 3.400000 26.912589 12.400000 3.500000 26.376950 12.400000 3.600000 25.861311 12.400000 3.700000 25.365671 12.400000 3.800000 24.890032 12.400000 3.900000 24.434392 12.400000 4.000000 23.998753 12.400000 4.100000 23.583113 12.400000 4.200000 23.187474 12.400000 4.300000 22.811835 12.400000 4.400000 22.456195 12.400000 4.500000 22.120556 12.400000 4.600000 21.804916 12.400000 4.700000 21.509277 12.400000 4.800000 21.233637 12.400000 4.900000 20.977998 12.400000 5.000000 20.742358 12.400000 5.100000 20.526719 12.400000 5.200000 20.331080 12.400000 5.300000 20.155440 12.400000 5.400000 19.999801 12.400000 5.500000 19.864161 12.400000 5.600000 19.748522 12.400000 5.700000 19.652882 12.400000 5.800000 19.577243 12.400000 5.900000 19.521604 12.400000 6.000000 19.485964 12.400000 6.100000 19.470325 12.400000 6.200000 19.474685 12.400000 6.300000 19.499046 12.400000 6.400000 19.543406 12.400000 6.500000 19.607767 12.400000 6.600000 19.692127 12.400000 6.700000 19.796488 12.400000 6.800000 19.920849 12.400000 6.900000 20.065209 12.400000 7.000000 20.229570 12.400000 7.100000 20.413930 12.400000 7.200000 20.618291 12.400000 7.300000 20.842651 12.400000 7.400000 21.087012 12.400000 7.500000 21.351373 12.400000 7.600000 21.635733 12.400000 7.700000 21.940094 12.400000 7.800000 22.264454 12.400000 7.900000 22.608815 12.400000 8.000000 22.973175 12.400000 8.100000 23.357536 12.400000 8.200000 23.761896 12.400000 8.300000 24.186257 12.400000 8.400000 24.630618 12.400000 8.500000 25.094978 12.400000 8.600000 25.579339 12.400000 8.700000 26.083699 12.400000 8.800000 26.608060 12.400000 8.900000 27.152420 12.400000 9.000000 27.716781 12.400000 9.100000 28.301142 12.400000 9.200000 28.905502 12.400000 9.300000 29.529863 12.400000 9.400000 30.174223 12.400000 9.500000 30.838584 12.400000 9.600000 31.522944 12.400000 9.700000 32.227305 12.400000 9.800000 32.951666 12.400000 9.900000 33.696026 12.400000 10.000000 34.460387 12.400000 10.100000 35.244747 12.400000 10.200000 36.049108 12.400000 10.300000 36.873468 12.400000 10.400000 37.717829 12.400000 10.500000 38.582189 12.400000 10.600000 39.466550 12.400000 10.700000 40.370911 12.400000 10.800000 41.295271 12.400000 10.900000 42.239632 12.400000 11.000000 43.203992 12.400000 11.100000 44.188353 12.400000 11.200000 45.192713 12.400000 11.300000 46.217074 12.400000 11.400000 47.261435 12.400000 11.500000 48.325795 12.400000 11.600000 49.410156 12.400000 11.700000 50.514516 12.400000 11.800000 51.638877 12.400000 11.900000 52.783237 12.400000 12.000000 53.947598 12.400000 12.100000 55.131958 12.400000 12.200000 56.336319 12.400000 12.300000 57.560680 12.400000 12.400000 58.805040 12.400000 12.500000 60.069401 12.400000 12.600000 61.353761 12.400000 12.700000 62.658122 12.400000 12.800000 63.982482 12.400000 12.900000 65.326843 12.400000 13.000000 66.691204 12.400000 13.100000 68.075564 12.400000 13.200000 69.479925 12.400000 13.300000 70.904285 12.400000 13.400000 72.348646 12.400000 13.500000 73.813006 12.400000 13.600000 75.297367 12.400000 13.700000 76.801727 12.400000 13.800000 78.326088 12.400000 13.900000 79.870449 12.400000 14.000000 81.434809 12.400000 14.100000 83.019170 12.400000 14.200000 84.623530 12.400000 14.300000 86.247891 12.400000 14.400000 87.892251 12.400000 14.500000 89.556612 12.400000 14.600000 91.240973 12.400000 14.700000 92.945333 12.400000 14.800000 94.669694 12.400000 14.900000 96.414054 12.400000 15.000000 98.178415 12.500000 -5.000000 147.061141 12.500000 -4.900000 144.812999 12.500000 -4.800000 142.584857 12.500000 -4.700000 140.376714 12.500000 -4.600000 138.188572 12.500000 -4.500000 136.020430 12.500000 -4.400000 133.872287 12.500000 -4.300000 131.744145 12.500000 -4.200000 129.636003 12.500000 -4.100000 127.547860 12.500000 -4.000000 125.479718 12.500000 -3.900000 123.431576 12.500000 -3.800000 121.403433 12.500000 -3.700000 119.395291 12.500000 -3.600000 117.407149 12.500000 -3.500000 115.439006 12.500000 -3.400000 113.490864 12.500000 -3.300000 111.562722 12.500000 -3.200000 109.654579 12.500000 -3.100000 107.766437 12.500000 -3.000000 105.898295 12.500000 -2.900000 104.050152 12.500000 -2.800000 102.222010 12.500000 -2.700000 100.413868 12.500000 -2.600000 98.625725 12.500000 -2.500000 96.857583 12.500000 -2.400000 95.109441 12.500000 -2.300000 93.381298 12.500000 -2.200000 91.673156 12.500000 -2.100000 89.985014 12.500000 -2.000000 88.316871 12.500000 -1.900000 86.668729 12.500000 -1.800000 85.040587 12.500000 -1.700000 83.432444 12.500000 -1.600000 81.844302 12.500000 -1.500000 80.276160 12.500000 -1.400000 78.728017 12.500000 -1.300000 77.199875 12.500000 -1.200000 75.691733 12.500000 -1.100000 74.203590 12.500000 -1.000000 72.735448 12.500000 -0.900000 71.287306 12.500000 -0.800000 69.859163 12.500000 -0.700000 68.451021 12.500000 -0.600000 67.062879 12.500000 -0.500000 65.694736 12.500000 -0.400000 64.346594 12.500000 -0.300000 63.018452 12.500000 -0.200000 61.710309 12.500000 -0.100000 60.422167 12.500000 -0.000000 59.154025 12.500000 0.100000 57.905882 12.500000 0.200000 56.677740 12.500000 0.300000 55.469598 12.500000 0.400000 54.281455 12.500000 0.500000 53.113313 12.500000 0.600000 51.965171 12.500000 0.700000 50.837028 12.500000 0.800000 49.728886 12.500000 0.900000 48.640744 12.500000 1.000000 47.572601 12.500000 1.100000 46.524459 12.500000 1.200000 45.496317 12.500000 1.300000 44.488174 12.500000 1.400000 43.500032 12.500000 1.500000 42.531890 12.500000 1.600000 41.583747 12.500000 1.700000 40.655605 12.500000 1.800000 39.747463 12.500000 1.900000 38.859320 12.500000 2.000000 37.991178 12.500000 2.100000 37.143036 12.500000 2.200000 36.314893 12.500000 2.300000 35.506751 12.500000 2.400000 34.718609 12.500000 2.500000 33.950466 12.500000 2.600000 33.202324 12.500000 2.700000 32.474182 12.500000 2.800000 31.766039 12.500000 2.900000 31.077897 12.500000 3.000000 30.409755 12.500000 3.100000 29.761612 12.500000 3.200000 29.133470 12.500000 3.300000 28.525328 12.500000 3.400000 27.937185 12.500000 3.500000 27.369043 12.500000 3.600000 26.820901 12.500000 3.700000 26.292758 12.500000 3.800000 25.784616 12.500000 3.900000 25.296474 12.500000 4.000000 24.828331 12.500000 4.100000 24.380189 12.500000 4.200000 23.952047 12.500000 4.300000 23.543904 12.500000 4.400000 23.155762 12.500000 4.500000 22.787620 12.500000 4.600000 22.439477 12.500000 4.700000 22.111335 12.500000 4.800000 21.803193 12.500000 4.900000 21.515050 12.500000 5.000000 21.246908 12.500000 5.100000 20.998766 12.500000 5.200000 20.770623 12.500000 5.300000 20.562481 12.500000 5.400000 20.374339 12.500000 5.500000 20.206196 12.500000 5.600000 20.058054 12.500000 5.700000 19.929912 12.500000 5.800000 19.821769 12.500000 5.900000 19.733627 12.500000 6.000000 19.665485 12.500000 6.100000 19.617342 12.500000 6.200000 19.589200 12.500000 6.300000 19.581058 12.500000 6.400000 19.592915 12.500000 6.500000 19.624773 12.500000 6.600000 19.676631 12.500000 6.700000 19.748488 12.500000 6.800000 19.840346 12.500000 6.900000 19.952204 12.500000 7.000000 20.084061 12.500000 7.100000 20.235919 12.500000 7.200000 20.407777 12.500000 7.300000 20.599634 12.500000 7.400000 20.811492 12.500000 7.500000 21.043350 12.500000 7.600000 21.295207 12.500000 7.700000 21.567065 12.500000 7.800000 21.858923 12.500000 7.900000 22.170780 12.500000 8.000000 22.502638 12.500000 8.100000 22.854496 12.500000 8.200000 23.226353 12.500000 8.300000 23.618211 12.500000 8.400000 24.030069 12.500000 8.500000 24.461926 12.500000 8.600000 24.913784 12.500000 8.700000 25.385642 12.500000 8.800000 25.877499 12.500000 8.900000 26.389357 12.500000 9.000000 26.921215 12.500000 9.100000 27.473072 12.500000 9.200000 28.044930 12.500000 9.300000 28.636788 12.500000 9.400000 29.248645 12.500000 9.500000 29.880503 12.500000 9.600000 30.532361 12.500000 9.700000 31.204218 12.500000 9.800000 31.896076 12.500000 9.900000 32.607934 12.500000 10.000000 33.339791 12.500000 10.100000 34.091649 12.500000 10.200000 34.863507 12.500000 10.300000 35.655364 12.500000 10.400000 36.467222 12.500000 10.500000 37.299080 12.500000 10.600000 38.150937 12.500000 10.700000 39.022795 12.500000 10.800000 39.914653 12.500000 10.900000 40.826510 12.500000 11.000000 41.758368 12.500000 11.100000 42.710226 12.500000 11.200000 43.682083 12.500000 11.300000 44.673941 12.500000 11.400000 45.685799 12.500000 11.500000 46.717656 12.500000 11.600000 47.769514 12.500000 11.700000 48.841372 12.500000 11.800000 49.933229 12.500000 11.900000 51.045087 12.500000 12.000000 52.176945 12.500000 12.100000 53.328802 12.500000 12.200000 54.500660 12.500000 12.300000 55.692518 12.500000 12.400000 56.904375 12.500000 12.500000 58.136233 12.500000 12.600000 59.388091 12.500000 12.700000 60.659948 12.500000 12.800000 61.951806 12.500000 12.900000 63.263664 12.500000 13.000000 64.595521 12.500000 13.100000 65.947379 12.500000 13.200000 67.319237 12.500000 13.300000 68.711094 12.500000 13.400000 70.122952 12.500000 13.500000 71.554810 12.500000 13.600000 73.006667 12.500000 13.700000 74.478525 12.500000 13.800000 75.970383 12.500000 13.900000 77.482240 12.500000 14.000000 79.014098 12.500000 14.100000 80.565956 12.500000 14.200000 82.137813 12.500000 14.300000 83.729671 12.500000 14.400000 85.341529 12.500000 14.500000 86.973386 12.500000 14.600000 88.625244 12.500000 14.700000 90.297102 12.500000 14.800000 91.988959 12.500000 14.900000 93.700817 12.500000 15.000000 95.432675 12.600000 -5.000000 150.832263 12.600000 -4.900000 148.551101 12.600000 -4.800000 146.289939 12.600000 -4.700000 144.048777 12.600000 -4.600000 141.827615 12.600000 -4.500000 139.626453 12.600000 -4.400000 137.445291 12.600000 -4.300000 135.284129 12.600000 -4.200000 133.142967 12.600000 -4.100000 131.021805 12.600000 -4.000000 128.920643 12.600000 -3.900000 126.839481 12.600000 -3.800000 124.778319 12.600000 -3.700000 122.737157 12.600000 -3.600000 120.715995 12.600000 -3.500000 118.714833 12.600000 -3.400000 116.733671 12.600000 -3.300000 114.772509 12.600000 -3.200000 112.831347 12.600000 -3.100000 110.910185 12.600000 -3.000000 109.009023 12.600000 -2.900000 107.127861 12.600000 -2.800000 105.266699 12.600000 -2.700000 103.425537 12.600000 -2.600000 101.604375 12.600000 -2.500000 99.803213 12.600000 -2.400000 98.022051 12.600000 -2.300000 96.260889 12.600000 -2.200000 94.519727 12.600000 -2.100000 92.798566 12.600000 -2.000000 91.097404 12.600000 -1.900000 89.416242 12.600000 -1.800000 87.755080 12.600000 -1.700000 86.113918 12.600000 -1.600000 84.492756 12.600000 -1.500000 82.891594 12.600000 -1.400000 81.310432 12.600000 -1.300000 79.749270 12.600000 -1.200000 78.208108 12.600000 -1.100000 76.686946 12.600000 -1.000000 75.185784 12.600000 -0.900000 73.704622 12.600000 -0.800000 72.243460 12.600000 -0.700000 70.802298 12.600000 -0.600000 69.381136 12.600000 -0.500000 67.979974 12.600000 -0.400000 66.598812 12.600000 -0.300000 65.237650 12.600000 -0.200000 63.896488 12.600000 -0.100000 62.575326 12.600000 -0.000000 61.274164 12.600000 0.100000 59.993002 12.600000 0.200000 58.731840 12.600000 0.300000 57.490678 12.600000 0.400000 56.269516 12.600000 0.500000 55.068354 12.600000 0.600000 53.887192 12.600000 0.700000 52.726030 12.600000 0.800000 51.584868 12.600000 0.900000 50.463706 12.600000 1.000000 49.362545 12.600000 1.100000 48.281383 12.600000 1.200000 47.220221 12.600000 1.300000 46.179059 12.600000 1.400000 45.157897 12.600000 1.500000 44.156735 12.600000 1.600000 43.175573 12.600000 1.700000 42.214411 12.600000 1.800000 41.273249 12.600000 1.900000 40.352087 12.600000 2.000000 39.450925 12.600000 2.100000 38.569763 12.600000 2.200000 37.708601 12.600000 2.300000 36.867439 12.600000 2.400000 36.046277 12.600000 2.500000 35.245115 12.600000 2.600000 34.463953 12.600000 2.700000 33.702791 12.600000 2.800000 32.961629 12.600000 2.900000 32.240467 12.600000 3.000000 31.539305 12.600000 3.100000 30.858143 12.600000 3.200000 30.196981 12.600000 3.300000 29.555819 12.600000 3.400000 28.934657 12.600000 3.500000 28.333495 12.600000 3.600000 27.752333 12.600000 3.700000 27.191171 12.600000 3.800000 26.650009 12.600000 3.900000 26.128847 12.600000 4.000000 25.627685 12.600000 4.100000 25.146523 12.600000 4.200000 24.685362 12.600000 4.300000 24.244200 12.600000 4.400000 23.823038 12.600000 4.500000 23.421876 12.600000 4.600000 23.040714 12.600000 4.700000 22.679552 12.600000 4.800000 22.338390 12.600000 4.900000 22.017228 12.600000 5.000000 21.716066 12.600000 5.100000 21.434904 12.600000 5.200000 21.173742 12.600000 5.300000 20.932580 12.600000 5.400000 20.711418 12.600000 5.500000 20.510256 12.600000 5.600000 20.329094 12.600000 5.700000 20.167932 12.600000 5.800000 20.026770 12.600000 5.900000 19.905608 12.600000 6.000000 19.804446 12.600000 6.100000 19.723284 12.600000 6.200000 19.662122 12.600000 6.300000 19.620960 12.600000 6.400000 19.599798 12.600000 6.500000 19.598636 12.600000 6.600000 19.617474 12.600000 6.700000 19.656312 12.600000 6.800000 19.715150 12.600000 6.900000 19.793988 12.600000 7.000000 19.892826 12.600000 7.100000 20.011664 12.600000 7.200000 20.150502 12.600000 7.300000 20.309340 12.600000 7.400000 20.488179 12.600000 7.500000 20.687017 12.600000 7.600000 20.905855 12.600000 7.700000 21.144693 12.600000 7.800000 21.403531 12.600000 7.900000 21.682369 12.600000 8.000000 21.981207 12.600000 8.100000 22.300045 12.600000 8.200000 22.638883 12.600000 8.300000 22.997721 12.600000 8.400000 23.376559 12.600000 8.500000 23.775397 12.600000 8.600000 24.194235 12.600000 8.700000 24.633073 12.600000 8.800000 25.091911 12.600000 8.900000 25.570749 12.600000 9.000000 26.069587 12.600000 9.100000 26.588425 12.600000 9.200000 27.127263 12.600000 9.300000 27.686101 12.600000 9.400000 28.264939 12.600000 9.500000 28.863777 12.600000 9.600000 29.482615 12.600000 9.700000 30.121453 12.600000 9.800000 30.780291 12.600000 9.900000 31.459129 12.600000 10.000000 32.157967 12.600000 10.100000 32.876805 12.600000 10.200000 33.615643 12.600000 10.300000 34.374481 12.600000 10.400000 35.153319 12.600000 10.500000 35.952158 12.600000 10.600000 36.770996 12.600000 10.700000 37.609834 12.600000 10.800000 38.468672 12.600000 10.900000 39.347510 12.600000 11.000000 40.246348 12.600000 11.100000 41.165186 12.600000 11.200000 42.104024 12.600000 11.300000 43.062862 12.600000 11.400000 44.041700 12.600000 11.500000 45.040538 12.600000 11.600000 46.059376 12.600000 11.700000 47.098214 12.600000 11.800000 48.157052 12.600000 11.900000 49.235890 12.600000 12.000000 50.334728 12.600000 12.100000 51.453566 12.600000 12.200000 52.592404 12.600000 12.300000 53.751242 12.600000 12.400000 54.930080 12.600000 12.500000 56.128918 12.600000 12.600000 57.347756 12.600000 12.700000 58.586594 12.600000 12.800000 59.845432 12.600000 12.900000 61.124270 12.600000 13.000000 62.423108 12.600000 13.100000 63.741946 12.600000 13.200000 65.080784 12.600000 13.300000 66.439622 12.600000 13.400000 67.818460 12.600000 13.500000 69.217298 12.600000 13.600000 70.636136 12.600000 13.700000 72.074975 12.600000 13.800000 73.533813 12.600000 13.900000 75.012651 12.600000 14.000000 76.511489 12.600000 14.100000 78.030327 12.600000 14.200000 79.569165 12.600000 14.300000 81.128003 12.600000 14.400000 82.706841 12.600000 14.500000 84.305679 12.600000 14.600000 85.924517 12.600000 14.700000 87.563355 12.600000 14.800000 89.222193 12.600000 14.900000 90.901031 12.600000 15.000000 92.599869 12.700000 -5.000000 154.622068 12.700000 -4.900000 152.307370 12.700000 -4.800000 150.012671 12.700000 -4.700000 147.737973 12.700000 -4.600000 145.483275 12.700000 -4.500000 143.248576 12.700000 -4.400000 141.033878 12.700000 -4.300000 138.839180 12.700000 -4.200000 136.664481 12.700000 -4.100000 134.509783 12.700000 -4.000000 132.375085 12.700000 -3.900000 130.260386 12.700000 -3.800000 128.165688 12.700000 -3.700000 126.090990 12.700000 -3.600000 124.036291 12.700000 -3.500000 122.001593 12.700000 -3.400000 119.986895 12.700000 -3.300000 117.992196 12.700000 -3.200000 116.017498 12.700000 -3.100000 114.062800 12.700000 -3.000000 112.128101 12.700000 -2.900000 110.213403 12.700000 -2.800000 108.318705 12.700000 -2.700000 106.444006 12.700000 -2.600000 104.589308 12.700000 -2.500000 102.754610 12.700000 -2.400000 100.939911 12.700000 -2.300000 99.145213 12.700000 -2.200000 97.370514 12.700000 -2.100000 95.615816 12.700000 -2.000000 93.881118 12.700000 -1.900000 92.166419 12.700000 -1.800000 90.471721 12.700000 -1.700000 88.797023 12.700000 -1.600000 87.142324 12.700000 -1.500000 85.507626 12.700000 -1.400000 83.892928 12.700000 -1.300000 82.298229 12.700000 -1.200000 80.723531 12.700000 -1.100000 79.168833 12.700000 -1.000000 77.634134 12.700000 -0.900000 76.119436 12.700000 -0.800000 74.624738 12.700000 -0.700000 73.150039 12.700000 -0.600000 71.695341 12.700000 -0.500000 70.260643 12.700000 -0.400000 68.845944 12.700000 -0.300000 67.451246 12.700000 -0.200000 66.076548 12.700000 -0.100000 64.721849 12.700000 -0.000000 63.387151 12.700000 0.100000 62.072453 12.700000 0.200000 60.777754 12.700000 0.300000 59.503056 12.700000 0.400000 58.248358 12.700000 0.500000 57.013659 12.700000 0.600000 55.798961 12.700000 0.700000 54.604263 12.700000 0.800000 53.429564 12.700000 0.900000 52.274866 12.700000 1.000000 51.140168 12.700000 1.100000 50.025469 12.700000 1.200000 48.930771 12.700000 1.300000 47.856073 12.700000 1.400000 46.801374 12.700000 1.500000 45.766676 12.700000 1.600000 44.751978 12.700000 1.700000 43.757279 12.700000 1.800000 42.782581 12.700000 1.900000 41.827882 12.700000 2.000000 40.893184 12.700000 2.100000 39.978486 12.700000 2.200000 39.083787 12.700000 2.300000 38.209089 12.700000 2.400000 37.354391 12.700000 2.500000 36.519692 12.700000 2.600000 35.704994 12.700000 2.700000 34.910296 12.700000 2.800000 34.135597 12.700000 2.900000 33.380899 12.700000 3.000000 32.646201 12.700000 3.100000 31.931502 12.700000 3.200000 31.236804 12.700000 3.300000 30.562106 12.700000 3.400000 29.907407 12.700000 3.500000 29.272709 12.700000 3.600000 28.658011 12.700000 3.700000 28.063312 12.700000 3.800000 27.488614 12.700000 3.900000 26.933916 12.700000 4.000000 26.399217 12.700000 4.100000 25.884519 12.700000 4.200000 25.389821 12.700000 4.300000 24.915122 12.700000 4.400000 24.460424 12.700000 4.500000 24.025726 12.700000 4.600000 23.611027 12.700000 4.700000 23.216329 12.700000 4.800000 22.841631 12.700000 4.900000 22.486932 12.700000 5.000000 22.152234 12.700000 5.100000 21.837536 12.700000 5.200000 21.542837 12.700000 5.300000 21.268139 12.700000 5.400000 21.013441 12.700000 5.500000 20.778742 12.700000 5.600000 20.564044 12.700000 5.700000 20.369346 12.700000 5.800000 20.194647 12.700000 5.900000 20.039949 12.700000 6.000000 19.905250 12.700000 6.100000 19.790552 12.700000 6.200000 19.695854 12.700000 6.300000 19.621155 12.700000 6.400000 19.566457 12.700000 6.500000 19.531759 12.700000 6.600000 19.517060 12.700000 6.700000 19.522362 12.700000 6.800000 19.547664 12.700000 6.900000 19.592965 12.700000 7.000000 19.658267 12.700000 7.100000 19.743569 12.700000 7.200000 19.848870 12.700000 7.300000 19.974172 12.700000 7.400000 20.119474 12.700000 7.500000 20.284775 12.700000 7.600000 20.470077 12.700000 7.700000 20.675379 12.700000 7.800000 20.900680 12.700000 7.900000 21.145982 12.700000 8.000000 21.411284 12.700000 8.100000 21.696585 12.700000 8.200000 22.001887 12.700000 8.300000 22.327189 12.700000 8.400000 22.672490 12.700000 8.500000 23.037792 12.700000 8.600000 23.423094 12.700000 8.700000 23.828395 12.700000 8.800000 24.253697 12.700000 8.900000 24.698999 12.700000 9.000000 25.164300 12.700000 9.100000 25.649602 12.700000 9.200000 26.154904 12.700000 9.300000 26.680205 12.700000 9.400000 27.225507 12.700000 9.500000 27.790809 12.700000 9.600000 28.376110 12.700000 9.700000 28.981412 12.700000 9.800000 29.606714 12.700000 9.900000 30.252015 12.700000 10.000000 30.917317 12.700000 10.100000 31.602618 12.700000 10.200000 32.307920 12.700000 10.300000 33.033222 12.700000 10.400000 33.778523 12.700000 10.500000 34.543825 12.700000 10.600000 35.329127 12.700000 10.700000 36.134428 12.700000 10.800000 36.959730 12.700000 10.900000 37.805032 12.700000 11.000000 38.670333 12.700000 11.100000 39.555635 12.700000 11.200000 40.460937 12.700000 11.300000 41.386238 12.700000 11.400000 42.331540 12.700000 11.500000 43.296842 12.700000 11.600000 44.282143 12.700000 11.700000 45.287445 12.700000 11.800000 46.312747 12.700000 11.900000 47.358048 12.700000 12.000000 48.423350 12.700000 12.100000 49.508652 12.700000 12.200000 50.613953 12.700000 12.300000 51.739255 12.700000 12.400000 52.884557 12.700000 12.500000 54.049858 12.700000 12.600000 55.235160 12.700000 12.700000 56.440462 12.700000 12.800000 57.665763 12.700000 12.900000 58.911065 12.700000 13.000000 60.176367 12.700000 13.100000 61.461668 12.700000 13.200000 62.766970 12.700000 13.300000 64.092272 12.700000 13.400000 65.437573 12.700000 13.500000 66.802875 12.700000 13.600000 68.188177 12.700000 13.700000 69.593478 12.700000 13.800000 71.018780 12.700000 13.900000 72.464082 12.700000 14.000000 73.929383 12.700000 14.100000 75.414685 12.700000 14.200000 76.919986 12.700000 14.300000 78.445288 12.700000 14.400000 79.990590 12.700000 14.500000 81.555891 12.700000 14.600000 83.141193 12.700000 14.700000 84.746495 12.700000 14.800000 86.371796 12.700000 14.900000 88.017098 12.700000 15.000000 89.682400 12.800000 -5.000000 158.433958 12.800000 -4.900000 156.085207 12.800000 -4.800000 153.756455 12.800000 -4.700000 151.447704 12.800000 -4.600000 149.158952 12.800000 -4.500000 146.890201 12.800000 -4.400000 144.641450 12.800000 -4.300000 142.412698 12.800000 -4.200000 140.203947 12.800000 -4.100000 138.015195 12.800000 -4.000000 135.846444 12.800000 -3.900000 133.697692 12.800000 -3.800000 131.568941 12.800000 -3.700000 129.460189 12.800000 -3.600000 127.371438 12.800000 -3.500000 125.302686 12.800000 -3.400000 123.253935 12.800000 -3.300000 121.225184 12.800000 -3.200000 119.216432 12.800000 -3.100000 117.227681 12.800000 -3.000000 115.258929 12.800000 -2.900000 113.310178 12.800000 -2.800000 111.381426 12.800000 -2.700000 109.472675 12.800000 -2.600000 107.583923 12.800000 -2.500000 105.715172 12.800000 -2.400000 103.866420 12.800000 -2.300000 102.037669 12.800000 -2.200000 100.228918 12.800000 -2.100000 98.440166 12.800000 -2.000000 96.671415 12.800000 -1.900000 94.922663 12.800000 -1.800000 93.193912 12.800000 -1.700000 91.485160 12.800000 -1.600000 89.796409 12.800000 -1.500000 88.127657 12.800000 -1.400000 86.478906 12.800000 -1.300000 84.850155 12.800000 -1.200000 83.241403 12.800000 -1.100000 81.652652 12.800000 -1.000000 80.083900 12.800000 -0.900000 78.535149 12.800000 -0.800000 77.006397 12.800000 -0.700000 75.497646 12.800000 -0.600000 74.008894 12.800000 -0.500000 72.540143 12.800000 -0.400000 71.091391 12.800000 -0.300000 69.662640 12.800000 -0.200000 68.253889 12.800000 -0.100000 66.865137 12.800000 -0.000000 65.496386 12.800000 0.100000 64.147634 12.800000 0.200000 62.818883 12.800000 0.300000 61.510131 12.800000 0.400000 60.221380 12.800000 0.500000 58.952628 12.800000 0.600000 57.703877 12.800000 0.700000 56.475125 12.800000 0.800000 55.266374 12.800000 0.900000 54.077623 12.800000 1.000000 52.908871 12.800000 1.100000 51.760120 12.800000 1.200000 50.631368 12.800000 1.300000 49.522617 12.800000 1.400000 48.433865 12.800000 1.500000 47.365114 12.800000 1.600000 46.316362 12.800000 1.700000 45.287611 12.800000 1.800000 44.278859 12.800000 1.900000 43.290108 12.800000 2.000000 42.321357 12.800000 2.100000 41.372605 12.800000 2.200000 40.443854 12.800000 2.300000 39.535102 12.800000 2.400000 38.646351 12.800000 2.500000 37.777599 12.800000 2.600000 36.928848 12.800000 2.700000 36.100096 12.800000 2.800000 35.291345 12.800000 2.900000 34.502593 12.800000 3.000000 33.733842 12.800000 3.100000 32.985091 12.800000 3.200000 32.256339 12.800000 3.300000 31.547588 12.800000 3.400000 30.858836 12.800000 3.500000 30.190085 12.800000 3.600000 29.541333 12.800000 3.700000 28.912582 12.800000 3.800000 28.303830 12.800000 3.900000 27.715079 12.800000 4.000000 27.146328 12.800000 4.100000 26.597576 12.800000 4.200000 26.068825 12.800000 4.300000 25.560073 12.800000 4.400000 25.071322 12.800000 4.500000 24.602570 12.800000 4.600000 24.153819 12.800000 4.700000 23.725067 12.800000 4.800000 23.316316 12.800000 4.900000 22.927564 12.800000 5.000000 22.558813 12.800000 5.100000 22.210062 12.800000 5.200000 21.881310 12.800000 5.300000 21.572559 12.800000 5.400000 21.283807 12.800000 5.500000 21.015056 12.800000 5.600000 20.766304 12.800000 5.700000 20.537553 12.800000 5.800000 20.328801 12.800000 5.900000 20.140050 12.800000 6.000000 19.971298 12.800000 6.100000 19.822547 12.800000 6.200000 19.693796 12.800000 6.300000 19.585044 12.800000 6.400000 19.496293 12.800000 6.500000 19.427541 12.800000 6.600000 19.378790 12.800000 6.700000 19.350038 12.800000 6.800000 19.341287 12.800000 6.900000 19.352535 12.800000 7.000000 19.383784 12.800000 7.100000 19.435032 12.800000 7.200000 19.506281 12.800000 7.300000 19.597530 12.800000 7.400000 19.708778 12.800000 7.500000 19.840027 12.800000 7.600000 19.991275 12.800000 7.700000 20.162524 12.800000 7.800000 20.353772 12.800000 7.900000 20.565021 12.800000 8.000000 20.796269 12.800000 8.100000 21.047518 12.800000 8.200000 21.318767 12.800000 8.300000 21.610015 12.800000 8.400000 21.921264 12.800000 8.500000 22.252512 12.800000 8.600000 22.603761 12.800000 8.700000 22.975009 12.800000 8.800000 23.366258 12.800000 8.900000 23.777506 12.800000 9.000000 24.208755 12.800000 9.100000 24.660003 12.800000 9.200000 25.131252 12.800000 9.300000 25.622501 12.800000 9.400000 26.133749 12.800000 9.500000 26.664998 12.800000 9.600000 27.216246 12.800000 9.700000 27.787495 12.800000 9.800000 28.378743 12.800000 9.900000 28.989992 12.800000 10.000000 29.621240 12.800000 10.100000 30.272489 12.800000 10.200000 30.943737 12.800000 10.300000 31.634986 12.800000 10.400000 32.346235 12.800000 10.500000 33.077483 12.800000 10.600000 33.828732 12.800000 10.700000 34.599980 12.800000 10.800000 35.391229 12.800000 10.900000 36.202477 12.800000 11.000000 37.033726 12.800000 11.100000 37.884974 12.800000 11.200000 38.756223 12.800000 11.300000 39.647471 12.800000 11.400000 40.558720 12.800000 11.500000 41.489969 12.800000 11.600000 42.441217 12.800000 11.700000 43.412466 12.800000 11.800000 44.403714 12.800000 11.900000 45.414963 12.800000 12.000000 46.446211 12.800000 12.100000 47.497460 12.800000 12.200000 48.568708 12.800000 12.300000 49.659957 12.800000 12.400000 50.771206 12.800000 12.500000 51.902454 12.800000 12.600000 53.053703 12.800000 12.700000 54.224951 12.800000 12.800000 55.416200 12.800000 12.900000 56.627448 12.800000 13.000000 57.858697 12.800000 13.100000 59.109945 12.800000 13.200000 60.381194 12.800000 13.300000 61.672442 12.800000 13.400000 62.983691 12.800000 13.500000 64.314940 12.800000 13.600000 65.666188 12.800000 13.700000 67.037437 12.800000 13.800000 68.428685 12.800000 13.900000 69.839934 12.800000 14.000000 71.271182 12.800000 14.100000 72.722431 12.800000 14.200000 74.193679 12.800000 14.300000 75.684928 12.800000 14.400000 77.196176 12.800000 14.500000 78.727425 12.800000 14.600000 80.278674 12.800000 14.700000 81.849922 12.800000 14.800000 83.441171 12.800000 14.900000 85.052419 12.800000 15.000000 86.683668 12.900000 -5.000000 162.272324 12.900000 -4.900000 159.889003 12.900000 -4.800000 157.525681 12.900000 -4.700000 155.182360 12.900000 -4.600000 152.859039 12.900000 -4.500000 150.555717 12.900000 -4.400000 148.272396 12.900000 -4.300000 146.009075 12.900000 -4.200000 143.765753 12.900000 -4.100000 141.542432 12.900000 -4.000000 139.339111 12.900000 -3.900000 137.155790 12.900000 -3.800000 134.992468 12.900000 -3.700000 132.849147 12.900000 -3.600000 130.725826 12.900000 -3.500000 128.622504 12.900000 -3.400000 126.539183 12.900000 -3.300000 124.475862 12.900000 -3.200000 122.432540 12.900000 -3.100000 120.409219 12.900000 -3.000000 118.405898 12.900000 -2.900000 116.422576 12.900000 -2.800000 114.459255 12.900000 -2.700000 112.515934 12.900000 -2.600000 110.592613 12.900000 -2.500000 108.689291 12.900000 -2.400000 106.805970 12.900000 -2.300000 104.942649 12.900000 -2.200000 103.099327 12.900000 -2.100000 101.276006 12.900000 -2.000000 99.472685 12.900000 -1.900000 97.689363 12.900000 -1.800000 95.926042 12.900000 -1.700000 94.182721 12.900000 -1.600000 92.459400 12.900000 -1.500000 90.756078 12.900000 -1.400000 89.072757 12.900000 -1.300000 87.409436 12.900000 -1.200000 85.766114 12.900000 -1.100000 84.142793 12.900000 -1.000000 82.539472 12.900000 -0.900000 80.956150 12.900000 -0.800000 79.392829 12.900000 -0.700000 77.849508 12.900000 -0.600000 76.326187 12.900000 -0.500000 74.822865 12.900000 -0.400000 73.339544 12.900000 -0.300000 71.876223 12.900000 -0.200000 70.432901 12.900000 -0.100000 69.009580 12.900000 -0.000000 67.606259 12.900000 0.100000 66.222937 12.900000 0.200000 64.859616 12.900000 0.300000 63.516295 12.900000 0.400000 62.192974 12.900000 0.500000 60.889652 12.900000 0.600000 59.606331 12.900000 0.700000 58.343010 12.900000 0.800000 57.099688 12.900000 0.900000 55.876367 12.900000 1.000000 54.673046 12.900000 1.100000 53.489724 12.900000 1.200000 52.326403 12.900000 1.300000 51.183082 12.900000 1.400000 50.059761 12.900000 1.500000 48.956439 12.900000 1.600000 47.873118 12.900000 1.700000 46.809797 12.900000 1.800000 45.766475 12.900000 1.900000 44.743154 12.900000 2.000000 43.739833 12.900000 2.100000 42.756511 12.900000 2.200000 41.793190 12.900000 2.300000 40.849869 12.900000 2.400000 39.926548 12.900000 2.500000 39.023226 12.900000 2.600000 38.139905 12.900000 2.700000 37.276584 12.900000 2.800000 36.433262 12.900000 2.900000 35.609941 12.900000 3.000000 34.806620 12.900000 3.100000 34.023298 12.900000 3.200000 33.259977 12.900000 3.300000 32.516656 12.900000 3.400000 31.793334 12.900000 3.500000 31.090013 12.900000 3.600000 30.406692 12.900000 3.700000 29.743371 12.900000 3.800000 29.100049 12.900000 3.900000 28.476728 12.900000 4.000000 27.873407 12.900000 4.100000 27.290085 12.900000 4.200000 26.726764 12.900000 4.300000 26.183443 12.900000 4.400000 25.660121 12.900000 4.500000 25.156800 12.900000 4.600000 24.673479 12.900000 4.700000 24.210158 12.900000 4.800000 23.766836 12.900000 4.900000 23.343515 12.900000 5.000000 22.940194 12.900000 5.100000 22.556872 12.900000 5.200000 22.193551 12.900000 5.300000 21.850230 12.900000 5.400000 21.526908 12.900000 5.500000 21.223587 12.900000 5.600000 20.940266 12.900000 5.700000 20.676945 12.900000 5.800000 20.433623 12.900000 5.900000 20.210302 12.900000 6.000000 20.006981 12.900000 6.100000 19.823659 12.900000 6.200000 19.660338 12.900000 6.300000 19.517017 12.900000 6.400000 19.393695 12.900000 6.500000 19.290374 12.900000 6.600000 19.207053 12.900000 6.700000 19.143732 12.900000 6.800000 19.100410 12.900000 6.900000 19.077089 12.900000 7.000000 19.073768 12.900000 7.100000 19.090446 12.900000 7.200000 19.127125 12.900000 7.300000 19.183804 12.900000 7.400000 19.260482 12.900000 7.500000 19.357161 12.900000 7.600000 19.473840 12.900000 7.700000 19.610519 12.900000 7.800000 19.767197 12.900000 7.900000 19.943876 12.900000 8.000000 20.140555 12.900000 8.100000 20.357233 12.900000 8.200000 20.593912 12.900000 8.300000 20.850591 12.900000 8.400000 21.127269 12.900000 8.500000 21.423948 12.900000 8.600000 21.740627 12.900000 8.700000 22.077306 12.900000 8.800000 22.433984 12.900000 8.900000 22.810663 12.900000 9.000000 23.207342 12.900000 9.100000 23.624020 12.900000 9.200000 24.060699 12.900000 9.300000 24.517378 12.900000 9.400000 24.994056 12.900000 9.500000 25.490735 12.900000 9.600000 26.007414 12.900000 9.700000 26.544093 12.900000 9.800000 27.100771 12.900000 9.900000 27.677450 12.900000 10.000000 28.274129 12.900000 10.100000 28.890807 12.900000 10.200000 29.527486 12.900000 10.300000 30.184165 12.900000 10.400000 30.860843 12.900000 10.500000 31.557522 12.900000 10.600000 32.274201 12.900000 10.700000 33.010879 12.900000 10.800000 33.767558 12.900000 10.900000 34.544237 12.900000 11.000000 35.340916 12.900000 11.100000 36.157594 12.900000 11.200000 36.994273 12.900000 11.300000 37.850952 12.900000 11.400000 38.727630 12.900000 11.500000 39.624309 12.900000 11.600000 40.540988 12.900000 11.700000 41.477666 12.900000 11.800000 42.434345 12.900000 11.900000 43.411024 12.900000 12.000000 44.407703 12.900000 12.100000 45.424381 12.900000 12.200000 46.461060 12.900000 12.300000 47.517739 12.900000 12.400000 48.594417 12.900000 12.500000 49.691096 12.900000 12.600000 50.807775 12.900000 12.700000 51.944453 12.900000 12.800000 53.101132 12.900000 12.900000 54.277811 12.900000 13.000000 55.474490 12.900000 13.100000 56.691168 12.900000 13.200000 57.927847 12.900000 13.300000 59.184526 12.900000 13.400000 60.461204 12.900000 13.500000 61.757883 12.900000 13.600000 63.074562 12.900000 13.700000 64.411240 12.900000 13.800000 65.767919 12.900000 13.900000 67.144598 12.900000 14.000000 68.541277 12.900000 14.100000 69.957955 12.900000 14.200000 71.394634 12.900000 14.300000 72.851313 12.900000 14.400000 74.327991 12.900000 14.500000 75.824670 12.900000 14.600000 77.341349 12.900000 14.700000 78.878027 12.900000 14.800000 80.434706 12.900000 14.900000 82.011385 12.900000 15.000000 83.608064 13.000000 -5.000000 166.142528 13.000000 -4.900000 163.724120 13.000000 -4.800000 161.325712 13.000000 -4.700000 158.947304 13.000000 -4.600000 156.588897 13.000000 -4.500000 154.250489 13.000000 -4.400000 151.932081 13.000000 -4.300000 149.633673 13.000000 -4.200000 147.355265 13.000000 -4.100000 145.096857 13.000000 -4.000000 142.858449 13.000000 -3.900000 140.640041 13.000000 -3.800000 138.441633 13.000000 -3.700000 136.263226 13.000000 -3.600000 134.104818 13.000000 -3.500000 131.966410 13.000000 -3.400000 129.848002 13.000000 -3.300000 127.749594 13.000000 -3.200000 125.671186 13.000000 -3.100000 123.612778 13.000000 -3.000000 121.574370 13.000000 -2.900000 119.555962 13.000000 -2.800000 117.557555 13.000000 -2.700000 115.579147 13.000000 -2.600000 113.620739 13.000000 -2.500000 111.682331 13.000000 -2.400000 109.763923 13.000000 -2.300000 107.865515 13.000000 -2.200000 105.987107 13.000000 -2.100000 104.128699 13.000000 -2.000000 102.290291 13.000000 -1.900000 100.471884 13.000000 -1.800000 98.673476 13.000000 -1.700000 96.895068 13.000000 -1.600000 95.136660 13.000000 -1.500000 93.398252 13.000000 -1.400000 91.679844 13.000000 -1.300000 89.981436 13.000000 -1.200000 88.303028 13.000000 -1.100000 86.644620 13.000000 -1.000000 85.006213 13.000000 -0.900000 83.387805 13.000000 -0.800000 81.789397 13.000000 -0.700000 80.210989 13.000000 -0.600000 78.652581 13.000000 -0.500000 77.114173 13.000000 -0.400000 75.595765 13.000000 -0.300000 74.097357 13.000000 -0.200000 72.618949 13.000000 -0.100000 71.160542 13.000000 -0.000000 69.722134 13.000000 0.100000 68.303726 13.000000 0.200000 66.905318 13.000000 0.300000 65.526910 13.000000 0.400000 64.168502 13.000000 0.500000 62.830094 13.000000 0.600000 61.511686 13.000000 0.700000 60.213278 13.000000 0.800000 58.934871 13.000000 0.900000 57.676463 13.000000 1.000000 56.438055 13.000000 1.100000 55.219647 13.000000 1.200000 54.021239 13.000000 1.300000 52.842831 13.000000 1.400000 51.684423 13.000000 1.500000 50.546015 13.000000 1.600000 49.427607 13.000000 1.700000 48.329200 13.000000 1.800000 47.250792 13.000000 1.900000 46.192384 13.000000 2.000000 45.153976 13.000000 2.100000 44.135568 13.000000 2.200000 43.137160 13.000000 2.300000 42.158752 13.000000 2.400000 41.200344 13.000000 2.500000 40.261936 13.000000 2.600000 39.343529 13.000000 2.700000 38.445121 13.000000 2.800000 37.566713 13.000000 2.900000 36.708305 13.000000 3.000000 35.869897 13.000000 3.100000 35.051489 13.000000 3.200000 34.253081 13.000000 3.300000 33.474673 13.000000 3.400000 32.716265 13.000000 3.500000 31.977858 13.000000 3.600000 31.259450 13.000000 3.700000 30.561042 13.000000 3.800000 29.882634 13.000000 3.900000 29.224226 13.000000 4.000000 28.585818 13.000000 4.100000 27.967410 13.000000 4.200000 27.369002 13.000000 4.300000 26.790594 13.000000 4.400000 26.232187 13.000000 4.500000 25.693779 13.000000 4.600000 25.175371 13.000000 4.700000 24.676963 13.000000 4.800000 24.198555 13.000000 4.900000 23.740147 13.000000 5.000000 23.301739 13.000000 5.100000 22.883331 13.000000 5.200000 22.484923 13.000000 5.300000 22.106516 13.000000 5.400000 21.748108 13.000000 5.500000 21.409700 13.000000 5.600000 21.091292 13.000000 5.700000 20.792884 13.000000 5.800000 20.514476 13.000000 5.900000 20.256068 13.000000 6.000000 20.017660 13.000000 6.100000 19.799252 13.000000 6.200000 19.600845 13.000000 6.300000 19.422437 13.000000 6.400000 19.264029 13.000000 6.500000 19.125621 13.000000 6.600000 19.007213 13.000000 6.700000 18.908805 13.000000 6.800000 18.830397 13.000000 6.900000 18.771989 13.000000 7.000000 18.733581 13.000000 7.100000 18.715174 13.000000 7.200000 18.716766 13.000000 7.300000 18.738358 13.000000 7.400000 18.779950 13.000000 7.500000 18.841542 13.000000 7.600000 18.923134 13.000000 7.700000 19.024726 13.000000 7.800000 19.146318 13.000000 7.900000 19.287910 13.000000 8.000000 19.449503 13.000000 8.100000 19.631095 13.000000 8.200000 19.832687 13.000000 8.300000 20.054279 13.000000 8.400000 20.295871 13.000000 8.500000 20.557463 13.000000 8.600000 20.839055 13.000000 8.700000 21.140647 13.000000 8.800000 21.462239 13.000000 8.900000 21.803832 13.000000 9.000000 22.165424 13.000000 9.100000 22.547016 13.000000 9.200000 22.948608 13.000000 9.300000 23.370200 13.000000 9.400000 23.811792 13.000000 9.500000 24.273384 13.000000 9.600000 24.754976 13.000000 9.700000 25.256568 13.000000 9.800000 25.778161 13.000000 9.900000 26.319753 13.000000 10.000000 26.881345 13.000000 10.100000 27.462937 13.000000 10.200000 28.064529 13.000000 10.300000 28.686121 13.000000 10.400000 29.327713 13.000000 10.500000 29.989305 13.000000 10.600000 30.670897 13.000000 10.700000 31.372490 13.000000 10.800000 32.094082 13.000000 10.900000 32.835674 13.000000 11.000000 33.597266 13.000000 11.100000 34.378858 13.000000 11.200000 35.180450 13.000000 11.300000 36.002042 13.000000 11.400000 36.843634 13.000000 11.500000 37.705226 13.000000 11.600000 38.586819 13.000000 11.700000 39.488411 13.000000 11.800000 40.410003 13.000000 11.900000 41.351595 13.000000 12.000000 42.313187 13.000000 12.100000 43.294779 13.000000 12.200000 44.296371 13.000000 12.300000 45.317963 13.000000 12.400000 46.359555 13.000000 12.500000 47.421148 13.000000 12.600000 48.502740 13.000000 12.700000 49.604332 13.000000 12.800000 50.725924 13.000000 12.900000 51.867516 13.000000 13.000000 53.029108 13.000000 13.100000 54.210700 13.000000 13.200000 55.412292 13.000000 13.300000 56.633884 13.000000 13.400000 57.875477 13.000000 13.500000 59.137069 13.000000 13.600000 60.418661 13.000000 13.700000 61.720253 13.000000 13.800000 63.041845 13.000000 13.900000 64.383437 13.000000 14.000000 65.745029 13.000000 14.100000 67.126621 13.000000 14.200000 68.528213 13.000000 14.300000 69.949806 13.000000 14.400000 71.391398 13.000000 14.500000 72.852990 13.000000 14.600000 74.334582 13.000000 14.700000 75.836174 13.000000 14.800000 77.357766 13.000000 14.900000 78.899358 13.000000 15.000000 80.460950 13.100000 -5.000000 170.050880 13.100000 -4.900000 167.596869 13.100000 -4.800000 165.162858 13.100000 -4.700000 162.748846 13.100000 -4.600000 160.354835 13.100000 -4.500000 157.980824 13.100000 -4.400000 155.626813 13.100000 -4.300000 153.292801 13.100000 -4.200000 150.978790 13.100000 -4.100000 148.684779 13.100000 -4.000000 146.410768 13.100000 -3.900000 144.156757 13.100000 -3.800000 141.922745 13.100000 -3.700000 139.708734 13.100000 -3.600000 137.514723 13.100000 -3.500000 135.340712 13.100000 -3.400000 133.186701 13.100000 -3.300000 131.052689 13.100000 -3.200000 128.938678 13.100000 -3.100000 126.844667 13.100000 -3.000000 124.770656 13.100000 -2.900000 122.716644 13.100000 -2.800000 120.682633 13.100000 -2.700000 118.668622 13.100000 -2.600000 116.674611 13.100000 -2.500000 114.700600 13.100000 -2.400000 112.746588 13.100000 -2.300000 110.812577 13.100000 -2.200000 108.898566 13.100000 -2.100000 107.004555 13.100000 -2.000000 105.130544 13.100000 -1.900000 103.276532 13.100000 -1.800000 101.442521 13.100000 -1.700000 99.628510 13.100000 -1.600000 97.834499 13.100000 -1.500000 96.060487 13.100000 -1.400000 94.306476 13.100000 -1.300000 92.572465 13.100000 -1.200000 90.858454 13.100000 -1.100000 89.164443 13.100000 -1.000000 87.490431 13.100000 -0.900000 85.836420 13.100000 -0.800000 84.202409 13.100000 -0.700000 82.588398 13.100000 -0.600000 80.994387 13.100000 -0.500000 79.420375 13.100000 -0.400000 77.866364 13.100000 -0.300000 76.332353 13.100000 -0.200000 74.818342 13.100000 -0.100000 73.324331 13.100000 -0.000000 71.850319 13.100000 0.100000 70.396308 13.100000 0.200000 68.962297 13.100000 0.300000 67.548286 13.100000 0.400000 66.154274 13.100000 0.500000 64.780263 13.100000 0.600000 63.426252 13.100000 0.700000 62.092241 13.100000 0.800000 60.778230 13.100000 0.900000 59.484218 13.100000 1.000000 58.210207 13.100000 1.100000 56.956196 13.100000 1.200000 55.722185 13.100000 1.300000 54.508174 13.100000 1.400000 53.314162 13.100000 1.500000 52.140151 13.100000 1.600000 50.986140 13.100000 1.700000 49.852129 13.100000 1.800000 48.738117 13.100000 1.900000 47.644106 13.100000 2.000000 46.570095 13.100000 2.100000 45.516084 13.100000 2.200000 44.482073 13.100000 2.300000 43.468061 13.100000 2.400000 42.474050 13.100000 2.500000 41.500039 13.100000 2.600000 40.546028 13.100000 2.700000 39.612017 13.100000 2.800000 38.698005 13.100000 2.900000 37.803994 13.100000 3.000000 36.929983 13.100000 3.100000 36.075972 13.100000 3.200000 35.241960 13.100000 3.300000 34.427949 13.100000 3.400000 33.633938 13.100000 3.500000 32.859927 13.100000 3.600000 32.105916 13.100000 3.700000 31.371904 13.100000 3.800000 30.657893 13.100000 3.900000 29.963882 13.100000 4.000000 29.289871 13.100000 4.100000 28.635860 13.100000 4.200000 28.001848 13.100000 4.300000 27.387837 13.100000 4.400000 26.793826 13.100000 4.500000 26.219815 13.100000 4.600000 25.665803 13.100000 4.700000 25.131792 13.100000 4.800000 24.617781 13.100000 4.900000 24.123770 13.100000 5.000000 23.649759 13.100000 5.100000 23.195747 13.100000 5.200000 22.761736 13.100000 5.300000 22.347725 13.100000 5.400000 21.953714 13.100000 5.500000 21.579703 13.100000 5.600000 21.225691 13.100000 5.700000 20.891680 13.100000 5.800000 20.577669 13.100000 5.900000 20.283658 13.100000 6.000000 20.009646 13.100000 6.100000 19.755635 13.100000 6.200000 19.521624 13.100000 6.300000 19.307613 13.100000 6.400000 19.113602 13.100000 6.500000 18.939590 13.100000 6.600000 18.785579 13.100000 6.700000 18.651568 13.100000 6.800000 18.537557 13.100000 6.900000 18.443546 13.100000 7.000000 18.369534 13.100000 7.100000 18.315523 13.100000 7.200000 18.281512 13.100000 7.300000 18.267501 13.100000 7.400000 18.273489 13.100000 7.500000 18.299478 13.100000 7.600000 18.345467 13.100000 7.700000 18.411456 13.100000 7.800000 18.497445 13.100000 7.900000 18.603433 13.100000 8.000000 18.729422 13.100000 8.100000 18.875411 13.100000 8.200000 19.041400 13.100000 8.300000 19.227389 13.100000 8.400000 19.433377 13.100000 8.500000 19.659366 13.100000 8.600000 19.905355 13.100000 8.700000 20.171344 13.100000 8.800000 20.457332 13.100000 8.900000 20.763321 13.100000 9.000000 21.089310 13.100000 9.100000 21.435299 13.100000 9.200000 21.801288 13.100000 9.300000 22.187276 13.100000 9.400000 22.593265 13.100000 9.500000 23.019254 13.100000 9.600000 23.465243 13.100000 9.700000 23.931232 13.100000 9.800000 24.417220 13.100000 9.900000 24.923209 13.100000 10.000000 25.449198 13.100000 10.100000 25.995187 13.100000 10.200000 26.561175 13.100000 10.300000 27.147164 13.100000 10.400000 27.753153 13.100000 10.500000 28.379142 13.100000 10.600000 29.025131 13.100000 10.700000 29.691119 13.100000 10.800000 30.377108 13.100000 10.900000 31.083097 13.100000 11.000000 31.809086 13.100000 11.100000 32.555075 13.100000 11.200000 33.321063 13.100000 11.300000 34.107052 13.100000 11.400000 34.913041 13.100000 11.500000 35.739030 13.100000 11.600000 36.585018 13.100000 11.700000 37.451007 13.100000 11.800000 38.336996 13.100000 11.900000 39.242985 13.100000 12.000000 40.168974 13.100000 12.100000 41.114962 13.100000 12.200000 42.080951 13.100000 12.300000 43.066940 13.100000 12.400000 44.072929 13.100000 12.500000 45.098918 13.100000 12.600000 46.144906 13.100000 12.700000 47.210895 13.100000 12.800000 48.296884 13.100000 12.900000 49.402873 13.100000 13.000000 50.528861 13.100000 13.100000 51.674850 13.100000 13.200000 52.840839 13.100000 13.300000 54.026828 13.100000 13.400000 55.232817 13.100000 13.500000 56.458805 13.100000 13.600000 57.704794 13.100000 13.700000 58.970783 13.100000 13.800000 60.256772 13.100000 13.900000 61.562761 13.100000 14.000000 62.888749 13.100000 14.100000 64.234738 13.100000 14.200000 65.600727 13.100000 14.300000 66.986716 13.100000 14.400000 68.392704 13.100000 14.500000 69.818693 13.100000 14.600000 71.264682 13.100000 14.700000 72.730671 13.100000 14.800000 74.216660 13.100000 14.900000 75.722648 13.100000 15.000000 77.248637 13.200000 -5.000000 174.004599 13.200000 -4.900000 171.514467 13.200000 -4.800000 169.044336 13.200000 -4.700000 166.594205 13.200000 -4.600000 164.164073 13.200000 -4.500000 161.753942 13.200000 -4.400000 159.363811 13.200000 -4.300000 156.993680 13.200000 -4.200000 154.643548 13.200000 -4.100000 152.313417 13.200000 -4.000000 150.003286 13.200000 -3.900000 147.713155 13.200000 -3.800000 145.443023 13.200000 -3.700000 143.192892 13.200000 -3.600000 140.962761 13.200000 -3.500000 138.752629 13.200000 -3.400000 136.562498 13.200000 -3.300000 134.392367 13.200000 -3.200000 132.242236 13.200000 -3.100000 130.112104 13.200000 -3.000000 128.001973 13.200000 -2.900000 125.911842 13.200000 -2.800000 123.841711 13.200000 -2.700000 121.791579 13.200000 -2.600000 119.761448 13.200000 -2.500000 117.751317 13.200000 -2.400000 115.761185 13.200000 -2.300000 113.791054 13.200000 -2.200000 111.840923 13.200000 -2.100000 109.910792 13.200000 -2.000000 108.000660 13.200000 -1.900000 106.110529 13.200000 -1.800000 104.240398 13.200000 -1.700000 102.390266 13.200000 -1.600000 100.560135 13.200000 -1.500000 98.750004 13.200000 -1.400000 96.959873 13.200000 -1.300000 95.189741 13.200000 -1.200000 93.439610 13.200000 -1.100000 91.709479 13.200000 -1.000000 89.999348 13.200000 -0.900000 88.309216 13.200000 -0.800000 86.639085 13.200000 -0.700000 84.988954 13.200000 -0.600000 83.358822 13.200000 -0.500000 81.748691 13.200000 -0.400000 80.158560 13.200000 -0.300000 78.588429 13.200000 -0.200000 77.038297 13.200000 -0.100000 75.508166 13.200000 -0.000000 73.998035 13.200000 0.100000 72.507903 13.200000 0.200000 71.037772 13.200000 0.300000 69.587641 13.200000 0.400000 68.157510 13.200000 0.500000 66.747378 13.200000 0.600000 65.357247 13.200000 0.700000 63.987116 13.200000 0.800000 62.636985 13.200000 0.900000 61.306853 13.200000 1.000000 59.996722 13.200000 1.100000 58.706591 13.200000 1.200000 57.436459 13.200000 1.300000 56.186328 13.200000 1.400000 54.956197 13.200000 1.500000 53.746066 13.200000 1.600000 52.555934 13.200000 1.700000 51.385803 13.200000 1.800000 50.235672 13.200000 1.900000 49.105540 13.200000 2.000000 47.995409 13.200000 2.100000 46.905278 13.200000 2.200000 45.835147 13.200000 2.300000 44.785015 13.200000 2.400000 43.754884 13.200000 2.500000 42.744753 13.200000 2.600000 41.754622 13.200000 2.700000 40.784490 13.200000 2.800000 39.834359 13.200000 2.900000 38.904228 13.200000 3.000000 37.994096 13.200000 3.100000 37.103965 13.200000 3.200000 36.233834 13.200000 3.300000 35.383703 13.200000 3.400000 34.553571 13.200000 3.500000 33.743440 13.200000 3.600000 32.953309 13.200000 3.700000 32.183177 13.200000 3.800000 31.433046 13.200000 3.900000 30.702915 13.200000 4.000000 29.992784 13.200000 4.100000 29.302652 13.200000 4.200000 28.632521 13.200000 4.300000 27.982390 13.200000 4.400000 27.352259 13.200000 4.500000 26.742127 13.200000 4.600000 26.151996 13.200000 4.700000 25.581865 13.200000 4.800000 25.031733 13.200000 4.900000 24.501602 13.200000 5.000000 23.991471 13.200000 5.100000 23.501340 13.200000 5.200000 23.031208 13.200000 5.300000 22.581077 13.200000 5.400000 22.150946 13.200000 5.500000 21.740815 13.200000 5.600000 21.350683 13.200000 5.700000 20.980552 13.200000 5.800000 20.630421 13.200000 5.900000 20.300289 13.200000 6.000000 19.990158 13.200000 6.100000 19.700027 13.200000 6.200000 19.429896 13.200000 6.300000 19.179764 13.200000 6.400000 18.949633 13.200000 6.500000 18.739502 13.200000 6.600000 18.549370 13.200000 6.700000 18.379239 13.200000 6.800000 18.229108 13.200000 6.900000 18.098977 13.200000 7.000000 17.988845 13.200000 7.100000 17.898714 13.200000 7.200000 17.828583 13.200000 7.300000 17.778452 13.200000 7.400000 17.748320 13.200000 7.500000 17.738189 13.200000 7.600000 17.748058 13.200000 7.700000 17.777926 13.200000 7.800000 17.827795 13.200000 7.900000 17.897664 13.200000 8.000000 17.987533 13.200000 8.100000 18.097401 13.200000 8.200000 18.227270 13.200000 8.300000 18.377139 13.200000 8.400000 18.547007 13.200000 8.500000 18.736876 13.200000 8.600000 18.946745 13.200000 8.700000 19.176614 13.200000 8.800000 19.426482 13.200000 8.900000 19.696351 13.200000 9.000000 19.986220 13.200000 9.100000 20.296089 13.200000 9.200000 20.625957 13.200000 9.300000 20.975826 13.200000 9.400000 21.345695 13.200000 9.500000 21.735563 13.200000 9.600000 22.145432 13.200000 9.700000 22.575301 13.200000 9.800000 23.025170 13.200000 9.900000 23.495038 13.200000 10.000000 23.984907 13.200000 10.100000 24.494776 13.200000 10.200000 25.024644 13.200000 10.300000 25.574513 13.200000 10.400000 26.144382 13.200000 10.500000 26.734251 13.200000 10.600000 27.344119 13.200000 10.700000 27.973988 13.200000 10.800000 28.623857 13.200000 10.900000 29.293726 13.200000 11.000000 29.983594 13.200000 11.100000 30.693463 13.200000 11.200000 31.423332 13.200000 11.300000 32.173200 13.200000 11.400000 32.943069 13.200000 11.500000 33.732938 13.200000 11.600000 34.542807 13.200000 11.700000 35.372675 13.200000 11.800000 36.222544 13.200000 11.900000 37.092413 13.200000 12.000000 37.982282 13.200000 12.100000 38.892150 13.200000 12.200000 39.822019 13.200000 12.300000 40.771888 13.200000 12.400000 41.741756 13.200000 12.500000 42.731625 13.200000 12.600000 43.741494 13.200000 12.700000 44.771363 13.200000 12.800000 45.821231 13.200000 12.900000 46.891100 13.200000 13.000000 47.980969 13.200000 13.100000 49.090837 13.200000 13.200000 50.220706 13.200000 13.300000 51.370575 13.200000 13.400000 52.540444 13.200000 13.500000 53.730312 13.200000 13.600000 54.940181 13.200000 13.700000 56.170050 13.200000 13.800000 57.419919 13.200000 13.900000 58.689787 13.200000 14.000000 59.979656 13.200000 14.100000 61.289525 13.200000 14.200000 62.619393 13.200000 14.300000 63.969262 13.200000 14.400000 65.339131 13.200000 14.500000 66.729000 13.200000 14.600000 68.138868 13.200000 14.700000 69.568737 13.200000 14.800000 71.018606 13.200000 14.900000 72.488474 13.200000 15.000000 73.978343 13.300000 -5.000000 178.011768 13.300000 -4.900000 175.485000 13.300000 -4.800000 172.978232 13.300000 -4.700000 170.491464 13.300000 -4.600000 168.024696 13.300000 -4.500000 165.577928 13.300000 -4.400000 163.151160 13.300000 -4.300000 160.744392 13.300000 -4.200000 158.357624 13.300000 -4.100000 155.990856 13.300000 -4.000000 153.644088 13.300000 -3.900000 151.317319 13.300000 -3.800000 149.010551 13.300000 -3.700000 146.723783 13.300000 -3.600000 144.457015 13.300000 -3.500000 142.210247 13.300000 -3.400000 139.983479 13.300000 -3.300000 137.776711 13.300000 -3.200000 135.589943 13.300000 -3.100000 133.423175 13.300000 -3.000000 131.276407 13.300000 -2.900000 129.149639 13.300000 -2.800000 127.042871 13.300000 -2.700000 124.956102 13.300000 -2.600000 122.889334 13.300000 -2.500000 120.842566 13.300000 -2.400000 118.815798 13.300000 -2.300000 116.809030 13.300000 -2.200000 114.822262 13.300000 -2.100000 112.855494 13.300000 -2.000000 110.908726 13.300000 -1.900000 108.981958 13.300000 -1.800000 107.075190 13.300000 -1.700000 105.188422 13.300000 -1.600000 103.321654 13.300000 -1.500000 101.474886 13.300000 -1.400000 99.648117 13.300000 -1.300000 97.841349 13.300000 -1.200000 96.054581 13.300000 -1.100000 94.287813 13.300000 -1.000000 92.541045 13.300000 -0.900000 90.814277 13.300000 -0.800000 89.107509 13.300000 -0.700000 87.420741 13.300000 -0.600000 85.753973 13.300000 -0.500000 84.107205 13.300000 -0.400000 82.480437 13.300000 -0.300000 80.873669 13.300000 -0.200000 79.286901 13.300000 -0.100000 77.720132 13.300000 -0.000000 76.173364 13.300000 0.100000 74.646596 13.300000 0.200000 73.139828 13.300000 0.300000 71.653060 13.300000 0.400000 70.186292 13.300000 0.500000 68.739524 13.300000 0.600000 67.312756 13.300000 0.700000 65.905988 13.300000 0.800000 64.519220 13.300000 0.900000 63.152452 13.300000 1.000000 61.805684 13.300000 1.100000 60.478916 13.300000 1.200000 59.172147 13.300000 1.300000 57.885379 13.300000 1.400000 56.618611 13.300000 1.500000 55.371843 13.300000 1.600000 54.145075 13.300000 1.700000 52.938307 13.300000 1.800000 51.751539 13.300000 1.900000 50.584771 13.300000 2.000000 49.438003 13.300000 2.100000 48.311235 13.300000 2.200000 47.204467 13.300000 2.300000 46.117699 13.300000 2.400000 45.050931 13.300000 2.500000 44.004162 13.300000 2.600000 42.977394 13.300000 2.700000 41.970626 13.300000 2.800000 40.983858 13.300000 2.900000 40.017090 13.300000 3.000000 39.070322 13.300000 3.100000 38.143554 13.300000 3.200000 37.236786 13.300000 3.300000 36.350018 13.300000 3.400000 35.483250 13.300000 3.500000 34.636482 13.300000 3.600000 33.809714 13.300000 3.700000 33.002945 13.300000 3.800000 32.216177 13.300000 3.900000 31.449409 13.300000 4.000000 30.702641 13.300000 4.100000 29.975873 13.300000 4.200000 29.269105 13.300000 4.300000 28.582337 13.300000 4.400000 27.915569 13.300000 4.500000 27.268801 13.300000 4.600000 26.642033 13.300000 4.700000 26.035265 13.300000 4.800000 25.448497 13.300000 4.900000 24.881729 13.300000 5.000000 24.334960 13.300000 5.100000 23.808192 13.300000 5.200000 23.301424 13.300000 5.300000 22.814656 13.300000 5.400000 22.347888 13.300000 5.500000 21.901120 13.300000 5.600000 21.474352 13.300000 5.700000 21.067584 13.300000 5.800000 20.680816 13.300000 5.900000 20.314048 13.300000 6.000000 19.967280 13.300000 6.100000 19.640512 13.300000 6.200000 19.333744 13.300000 6.300000 19.046975 13.300000 6.400000 18.780207 13.300000 6.500000 18.533439 13.300000 6.600000 18.306671 13.300000 6.700000 18.099903 13.300000 6.800000 17.913135 13.300000 6.900000 17.746367 13.300000 7.000000 17.599599 13.300000 7.100000 17.472831 13.300000 7.200000 17.366063 13.300000 7.300000 17.279295 13.300000 7.400000 17.212527 13.300000 7.500000 17.165759 13.300000 7.600000 17.138990 13.300000 7.700000 17.132222 13.300000 7.800000 17.145454 13.300000 7.900000 17.178686 13.300000 8.000000 17.231918 13.300000 8.100000 17.305150 13.300000 8.200000 17.398382 13.300000 8.300000 17.511614 13.300000 8.400000 17.644846 13.300000 8.500000 17.798078 13.300000 8.600000 17.971310 13.300000 8.700000 18.164542 13.300000 8.800000 18.377773 13.300000 8.900000 18.611005 13.300000 9.000000 18.864237 13.300000 9.100000 19.137469 13.300000 9.200000 19.430701 13.300000 9.300000 19.743933 13.300000 9.400000 20.077165 13.300000 9.500000 20.430397 13.300000 9.600000 20.803629 13.300000 9.700000 21.196861 13.300000 9.800000 21.610093 13.300000 9.900000 22.043325 13.300000 10.000000 22.496557 13.300000 10.100000 22.969788 13.300000 10.200000 23.463020 13.300000 10.300000 23.976252 13.300000 10.400000 24.509484 13.300000 10.500000 25.062716 13.300000 10.600000 25.635948 13.300000 10.700000 26.229180 13.300000 10.800000 26.842412 13.300000 10.900000 27.475644 13.300000 11.000000 28.128876 13.300000 11.100000 28.802108 13.300000 11.200000 29.495340 13.300000 11.300000 30.208572 13.300000 11.400000 30.941803 13.300000 11.500000 31.695035 13.300000 11.600000 32.468267 13.300000 11.700000 33.261499 13.300000 11.800000 34.074731 13.300000 11.900000 34.907963 13.300000 12.000000 35.761195 13.300000 12.100000 36.634427 13.300000 12.200000 37.527659 13.300000 12.300000 38.440891 13.300000 12.400000 39.374123 13.300000 12.500000 40.327355 13.300000 12.600000 41.300587 13.300000 12.700000 42.293818 13.300000 12.800000 43.307050 13.300000 12.900000 44.340282 13.300000 13.000000 45.393514 13.300000 13.100000 46.466746 13.300000 13.200000 47.559978 13.300000 13.300000 48.673210 13.300000 13.400000 49.806442 13.300000 13.500000 50.959674 13.300000 13.600000 52.132906 13.300000 13.700000 53.326138 13.300000 13.800000 54.539370 13.300000 13.900000 55.772602 13.300000 14.000000 57.025833 13.300000 14.100000 58.299065 13.300000 14.200000 59.592297 13.300000 14.300000 60.905529 13.300000 14.400000 62.238761 13.300000 14.500000 63.591993 13.300000 14.600000 64.965225 13.300000 14.700000 66.358457 13.300000 14.800000 67.771689 13.300000 14.900000 69.204921 13.300000 15.000000 70.658153 13.400000 -5.000000 182.081286 13.400000 -4.900000 179.517364 13.400000 -4.800000 176.973443 13.400000 -4.700000 174.449521 13.400000 -4.600000 171.945600 13.400000 -4.500000 169.461678 13.400000 -4.400000 166.997756 13.400000 -4.300000 164.553835 13.400000 -4.200000 162.129913 13.400000 -4.100000 159.725991 13.400000 -4.000000 157.342070 13.400000 -3.900000 154.978148 13.400000 -3.800000 152.634227 13.400000 -3.700000 150.310305 13.400000 -3.600000 148.006383 13.400000 -3.500000 145.722462 13.400000 -3.400000 143.458540 13.400000 -3.300000 141.214619 13.400000 -3.200000 138.990697 13.400000 -3.100000 136.786775 13.400000 -3.000000 134.602854 13.400000 -2.900000 132.438932 13.400000 -2.800000 130.295010 13.400000 -2.700000 128.171089 13.400000 -2.600000 126.067167 13.400000 -2.500000 123.983246 13.400000 -2.400000 121.919324 13.400000 -2.300000 119.875402 13.400000 -2.200000 117.851481 13.400000 -2.100000 115.847559 13.400000 -2.000000 113.863638 13.400000 -1.900000 111.899716 13.400000 -1.800000 109.955794 13.400000 -1.700000 108.031873 13.400000 -1.600000 106.127951 13.400000 -1.500000 104.244029 13.400000 -1.400000 102.380108 13.400000 -1.300000 100.536186 13.400000 -1.200000 98.712265 13.400000 -1.100000 96.908343 13.400000 -1.000000 95.124421 13.400000 -0.900000 93.360500 13.400000 -0.800000 91.616578 13.400000 -0.700000 89.892656 13.400000 -0.600000 88.188735 13.400000 -0.500000 86.504813 13.400000 -0.400000 84.840892 13.400000 -0.300000 83.196970 13.400000 -0.200000 81.573048 13.400000 -0.100000 79.969127 13.400000 -0.000000 78.385205 13.400000 0.100000 76.821284 13.400000 0.200000 75.277362 13.400000 0.300000 73.753440 13.400000 0.400000 72.249519 13.400000 0.500000 70.765597 13.400000 0.600000 69.301675 13.400000 0.700000 67.857754 13.400000 0.800000 66.433832 13.400000 0.900000 65.029911 13.400000 1.000000 63.645989 13.400000 1.100000 62.282067 13.400000 1.200000 60.938146 13.400000 1.300000 59.614224 13.400000 1.400000 58.310303 13.400000 1.500000 57.026381 13.400000 1.600000 55.762459 13.400000 1.700000 54.518538 13.400000 1.800000 53.294616 13.400000 1.900000 52.090694 13.400000 2.000000 50.906773 13.400000 2.100000 49.742851 13.400000 2.200000 48.598930 13.400000 2.300000 47.475008 13.400000 2.400000 46.371086 13.400000 2.500000 45.287165 13.400000 2.600000 44.223243 13.400000 2.700000 43.179321 13.400000 2.800000 42.155400 13.400000 2.900000 41.151478 13.400000 3.000000 40.167557 13.400000 3.100000 39.203635 13.400000 3.200000 38.259713 13.400000 3.300000 37.335792 13.400000 3.400000 36.431870 13.400000 3.500000 35.547949 13.400000 3.600000 34.684027 13.400000 3.700000 33.840105 13.400000 3.800000 33.016184 13.400000 3.900000 32.212262 13.400000 4.000000 31.428340 13.400000 4.100000 30.664419 13.400000 4.200000 29.920497 13.400000 4.300000 29.196576 13.400000 4.400000 28.492654 13.400000 4.500000 27.808732 13.400000 4.600000 27.144811 13.400000 4.700000 26.500889 13.400000 4.800000 25.876968 13.400000 4.900000 25.273046 13.400000 5.000000 24.689124 13.400000 5.100000 24.125203 13.400000 5.200000 23.581281 13.400000 5.300000 23.057359 13.400000 5.400000 22.553438 13.400000 5.500000 22.069516 13.400000 5.600000 21.605595 13.400000 5.700000 21.161673 13.400000 5.800000 20.737751 13.400000 5.900000 20.333830 13.400000 6.000000 19.949908 13.400000 6.100000 19.585986 13.400000 6.200000 19.242065 13.400000 6.300000 18.918143 13.400000 6.400000 18.614222 13.400000 6.500000 18.330300 13.400000 6.600000 18.066378 13.400000 6.700000 17.822457 13.400000 6.800000 17.598535 13.400000 6.900000 17.394614 13.400000 7.000000 17.210692 13.400000 7.100000 17.046770 13.400000 7.200000 16.902849 13.400000 7.300000 16.778927 13.400000 7.400000 16.675005 13.400000 7.500000 16.591084 13.400000 7.600000 16.527162 13.400000 7.700000 16.483241 13.400000 7.800000 16.459319 13.400000 7.900000 16.455397 13.400000 8.000000 16.471476 13.400000 8.100000 16.507554 13.400000 8.200000 16.563633 13.400000 8.300000 16.639711 13.400000 8.400000 16.735789 13.400000 8.500000 16.851868 13.400000 8.600000 16.987946 13.400000 8.700000 17.144024 13.400000 8.800000 17.320103 13.400000 8.900000 17.516181 13.400000 9.000000 17.732260 13.400000 9.100000 17.968338 13.400000 9.200000 18.224416 13.400000 9.300000 18.500495 13.400000 9.400000 18.796573 13.400000 9.500000 19.112651 13.400000 9.600000 19.448730 13.400000 9.700000 19.804808 13.400000 9.800000 20.180887 13.400000 9.900000 20.576965 13.400000 10.000000 20.993043 13.400000 10.100000 21.429122 13.400000 10.200000 21.885200 13.400000 10.300000 22.361279 13.400000 10.400000 22.857357 13.400000 10.500000 23.373435 13.400000 10.600000 23.909514 13.400000 10.700000 24.465592 13.400000 10.800000 25.041670 13.400000 10.900000 25.637749 13.400000 11.000000 26.253827 13.400000 11.100000 26.889906 13.400000 11.200000 27.545984 13.400000 11.300000 28.222062 13.400000 11.400000 28.918141 13.400000 11.500000 29.634219 13.400000 11.600000 30.370298 13.400000 11.700000 31.126376 13.400000 11.800000 31.902454 13.400000 11.900000 32.698533 13.400000 12.000000 33.514611 13.400000 12.100000 34.350689 13.400000 12.200000 35.206768 13.400000 12.300000 36.082846 13.400000 12.400000 36.978925 13.400000 12.500000 37.895003 13.400000 12.600000 38.831081 13.400000 12.700000 39.787160 13.400000 12.800000 40.763238 13.400000 12.900000 41.759316 13.400000 13.000000 42.775395 13.400000 13.100000 43.811473 13.400000 13.200000 44.867552 13.400000 13.300000 45.943630 13.400000 13.400000 47.039708 13.400000 13.500000 48.155787 13.400000 13.600000 49.291865 13.400000 13.700000 50.447944 13.400000 13.800000 51.624022 13.400000 13.900000 52.820100 13.400000 14.000000 54.036179 13.400000 14.100000 55.272257 13.400000 14.200000 56.528335 13.400000 14.300000 57.804414 13.400000 14.400000 59.100492 13.400000 14.500000 60.416571 13.400000 14.600000 61.752649 13.400000 14.700000 63.108727 13.400000 14.800000 64.484806 13.400000 14.900000 65.880884 13.400000 15.000000 67.296963 13.500000 -5.000000 186.222801 13.500000 -4.900000 183.621209 13.500000 -4.800000 181.039617 13.500000 -4.700000 178.478025 13.500000 -4.600000 175.936433 13.500000 -4.500000 173.414841 13.500000 -4.400000 170.913249 13.500000 -4.300000 168.431658 13.500000 -4.200000 165.970066 13.500000 -4.100000 163.528474 13.500000 -4.000000 161.106882 13.500000 -3.900000 158.705290 13.500000 -3.800000 156.323698 13.500000 -3.700000 153.962106 13.500000 -3.600000 151.620514 13.500000 -3.500000 149.298922 13.500000 -3.400000 146.997331 13.500000 -3.300000 144.715739 13.500000 -3.200000 142.454147 13.500000 -3.100000 140.212555 13.500000 -3.000000 137.990963 13.500000 -2.900000 135.789371 13.500000 -2.800000 133.607779 13.500000 -2.700000 131.446187 13.500000 -2.600000 129.304595 13.500000 -2.500000 127.183003 13.500000 -2.400000 125.081412 13.500000 -2.300000 122.999820 13.500000 -2.200000 120.938228 13.500000 -2.100000 118.896636 13.500000 -2.000000 116.875044 13.500000 -1.900000 114.873452 13.500000 -1.800000 112.891860 13.500000 -1.700000 110.930268 13.500000 -1.600000 108.988676 13.500000 -1.500000 107.067085 13.500000 -1.400000 105.165493 13.500000 -1.300000 103.283901 13.500000 -1.200000 101.422309 13.500000 -1.100000 99.580717 13.500000 -1.000000 97.759125 13.500000 -0.900000 95.957533 13.500000 -0.800000 94.175941 13.500000 -0.700000 92.414349 13.500000 -0.600000 90.672757 13.500000 -0.500000 88.951166 13.500000 -0.400000 87.249574 13.500000 -0.300000 85.567982 13.500000 -0.200000 83.906390 13.500000 -0.100000 82.264798 13.500000 -0.000000 80.643206 13.500000 0.100000 79.041614 13.500000 0.200000 77.460022 13.500000 0.300000 75.898430 13.500000 0.400000 74.356839 13.500000 0.500000 72.835247 13.500000 0.600000 71.333655 13.500000 0.700000 69.852063 13.500000 0.800000 68.390471 13.500000 0.900000 66.948879 13.500000 1.000000 65.527287 13.500000 1.100000 64.125695 13.500000 1.200000 62.744103 13.500000 1.300000 61.382511 13.500000 1.400000 60.040920 13.500000 1.500000 58.719328 13.500000 1.600000 57.417736 13.500000 1.700000 56.136144 13.500000 1.800000 54.874552 13.500000 1.900000 53.632960 13.500000 2.000000 52.411368 13.500000 2.100000 51.209776 13.500000 2.200000 50.028184 13.500000 2.300000 48.866593 13.500000 2.400000 47.725001 13.500000 2.500000 46.603409 13.500000 2.600000 45.501817 13.500000 2.700000 44.420225 13.500000 2.800000 43.358633 13.500000 2.900000 42.317041 13.500000 3.000000 41.295449 13.500000 3.100000 40.293857 13.500000 3.200000 39.312265 13.500000 3.300000 38.350674 13.500000 3.400000 37.409082 13.500000 3.500000 36.487490 13.500000 3.600000 35.585898 13.500000 3.700000 34.704306 13.500000 3.800000 33.842714 13.500000 3.900000 33.001122 13.500000 4.000000 32.179530 13.500000 4.100000 31.377938 13.500000 4.200000 30.596347 13.500000 4.300000 29.834755 13.500000 4.400000 29.093163 13.500000 4.500000 28.371571 13.500000 4.600000 27.669979 13.500000 4.700000 26.988387 13.500000 4.800000 26.326795 13.500000 4.900000 25.685203 13.500000 5.000000 25.063611 13.500000 5.100000 24.462019 13.500000 5.200000 23.880428 13.500000 5.300000 23.318836 13.500000 5.400000 22.777244 13.500000 5.500000 22.255652 13.500000 5.600000 21.754060 13.500000 5.700000 21.272468 13.500000 5.800000 20.810876 13.500000 5.900000 20.369284 13.500000 6.000000 19.947692 13.500000 6.100000 19.546101 13.500000 6.200000 19.164509 13.500000 6.300000 18.802917 13.500000 6.400000 18.461325 13.500000 6.500000 18.139733 13.500000 6.600000 17.838141 13.500000 6.700000 17.556549 13.500000 6.800000 17.294957 13.500000 6.900000 17.053365 13.500000 7.000000 16.831773 13.500000 7.100000 16.630182 13.500000 7.200000 16.448590 13.500000 7.300000 16.286998 13.500000 7.400000 16.145406 13.500000 7.500000 16.023814 13.500000 7.600000 15.922222 13.500000 7.700000 15.840630 13.500000 7.800000 15.779038 13.500000 7.900000 15.737446 13.500000 8.000000 15.715855 13.500000 8.100000 15.714263 13.500000 8.200000 15.732671 13.500000 8.300000 15.771079 13.500000 8.400000 15.829487 13.500000 8.500000 15.907895 13.500000 8.600000 16.006303 13.500000 8.700000 16.124711 13.500000 8.800000 16.263119 13.500000 8.900000 16.421527 13.500000 9.000000 16.599936 13.500000 9.100000 16.798344 13.500000 9.200000 17.016752 13.500000 9.300000 17.255160 13.500000 9.400000 17.513568 13.500000 9.500000 17.791976 13.500000 9.600000 18.090384 13.500000 9.700000 18.408792 13.500000 9.800000 18.747200 13.500000 9.900000 19.105609 13.500000 10.000000 19.484017 13.500000 10.100000 19.882425 13.500000 10.200000 20.300833 13.500000 10.300000 20.739241 13.500000 10.400000 21.197649 13.500000 10.500000 21.676057 13.500000 10.600000 22.174465 13.500000 10.700000 22.692873 13.500000 10.800000 23.231281 13.500000 10.900000 23.789690 13.500000 11.000000 24.368098 13.500000 11.100000 24.966506 13.500000 11.200000 25.584914 13.500000 11.300000 26.223322 13.500000 11.400000 26.881730 13.500000 11.500000 27.560138 13.500000 11.600000 28.258546 13.500000 11.700000 28.976954 13.500000 11.800000 29.715363 13.500000 11.900000 30.473771 13.500000 12.000000 31.252179 13.500000 12.100000 32.050587 13.500000 12.200000 32.868995 13.500000 12.300000 33.707403 13.500000 12.400000 34.565811 13.500000 12.500000 35.444219 13.500000 12.600000 36.342627 13.500000 12.700000 37.261035 13.500000 12.800000 38.199444 13.500000 12.900000 39.157852 13.500000 13.000000 40.136260 13.500000 13.100000 41.134668 13.500000 13.200000 42.153076 13.500000 13.300000 43.191484 13.500000 13.400000 44.249892 13.500000 13.500000 45.328300 13.500000 13.600000 46.426708 13.500000 13.700000 47.545117 13.500000 13.800000 48.683525 13.500000 13.900000 49.841933 13.500000 14.000000 51.020341 13.500000 14.100000 52.218749 13.500000 14.200000 53.437157 13.500000 14.300000 54.675565 13.500000 14.400000 55.933973 13.500000 14.500000 57.212381 13.500000 14.600000 58.510789 13.500000 14.700000 59.829198 13.500000 14.800000 61.167606 13.500000 14.900000 62.526014 13.500000 15.000000 63.904422 13.600000 -5.000000 190.446646 13.600000 -4.900000 187.806867 13.600000 -4.800000 185.187088 13.600000 -4.700000 182.587309 13.600000 -4.600000 180.007531 13.600000 -4.500000 177.447752 13.600000 -4.400000 174.907973 13.600000 -4.300000 172.388194 13.600000 -4.200000 169.888415 13.600000 -4.100000 167.408636 13.600000 -4.000000 164.948857 13.600000 -3.900000 162.509078 13.600000 -3.800000 160.089299 13.600000 -3.700000 157.689520 13.600000 -3.600000 155.309741 13.600000 -3.500000 152.949963 13.600000 -3.400000 150.610184 13.600000 -3.300000 148.290405 13.600000 -3.200000 145.990626 13.600000 -3.100000 143.710847 13.600000 -3.000000 141.451068 13.600000 -2.900000 139.211289 13.600000 -2.800000 136.991510 13.600000 -2.700000 134.791731 13.600000 -2.600000 132.611952 13.600000 -2.500000 130.452173 13.600000 -2.400000 128.312395 13.600000 -2.300000 126.192616 13.600000 -2.200000 124.092837 13.600000 -2.100000 122.013058 13.600000 -2.000000 119.953279 13.600000 -1.900000 117.913500 13.600000 -1.800000 115.893721 13.600000 -1.700000 113.893942 13.600000 -1.600000 111.914163 13.600000 -1.500000 109.954384 13.600000 -1.400000 108.014605 13.600000 -1.300000 106.094827 13.600000 -1.200000 104.195048 13.600000 -1.100000 102.315269 13.600000 -1.000000 100.455490 13.600000 -0.900000 98.615711 13.600000 -0.800000 96.795932 13.600000 -0.700000 94.996153 13.600000 -0.600000 93.216374 13.600000 -0.500000 91.456595 13.600000 -0.400000 89.716816 13.600000 -0.300000 87.997037 13.600000 -0.200000 86.297259 13.600000 -0.100000 84.617480 13.600000 -0.000000 82.957701 13.600000 0.100000 81.317922 13.600000 0.200000 79.698143 13.600000 0.300000 78.098364 13.600000 0.400000 76.518585 13.600000 0.500000 74.958806 13.600000 0.600000 73.419027 13.600000 0.700000 71.899248 13.600000 0.800000 70.399469 13.600000 0.900000 68.919690 13.600000 1.000000 67.459912 13.600000 1.100000 66.020133 13.600000 1.200000 64.600354 13.600000 1.300000 63.200575 13.600000 1.400000 61.820796 13.600000 1.500000 60.461017 13.600000 1.600000 59.121238 13.600000 1.700000 57.801459 13.600000 1.800000 56.501680 13.600000 1.900000 55.221901 13.600000 2.000000 53.962122 13.600000 2.100000 52.722344 13.600000 2.200000 51.502565 13.600000 2.300000 50.302786 13.600000 2.400000 49.123007 13.600000 2.500000 47.963228 13.600000 2.600000 46.823449 13.600000 2.700000 45.703670 13.600000 2.800000 44.603891 13.600000 2.900000 43.524112 13.600000 3.000000 42.464333 13.600000 3.100000 41.424554 13.600000 3.200000 40.404776 13.600000 3.300000 39.404997 13.600000 3.400000 38.425218 13.600000 3.500000 37.465439 13.600000 3.600000 36.525660 13.600000 3.700000 35.605881 13.600000 3.800000 34.706102 13.600000 3.900000 33.826323 13.600000 4.000000 32.966544 13.600000 4.100000 32.126765 13.600000 4.200000 31.306986 13.600000 4.300000 30.507208 13.600000 4.400000 29.727429 13.600000 4.500000 28.967650 13.600000 4.600000 28.227871 13.600000 4.700000 27.508092 13.600000 4.800000 26.808313 13.600000 4.900000 26.128534 13.600000 5.000000 25.468755 13.600000 5.100000 24.828976 13.600000 5.200000 24.209197 13.600000 5.300000 23.609418 13.600000 5.400000 23.029640 13.600000 5.500000 22.469861 13.600000 5.600000 21.930082 13.600000 5.700000 21.410303 13.600000 5.800000 20.910524 13.600000 5.900000 20.430745 13.600000 6.000000 19.970966 13.600000 6.100000 19.531187 13.600000 6.200000 19.111408 13.600000 6.300000 18.711629 13.600000 6.400000 18.331850 13.600000 6.500000 17.972072 13.600000 6.600000 17.632293 13.600000 6.700000 17.312514 13.600000 6.800000 17.012735 13.600000 6.900000 16.732956 13.600000 7.000000 16.473177 13.600000 7.100000 16.233398 13.600000 7.200000 16.013619 13.600000 7.300000 15.813840 13.600000 7.400000 15.634061 13.600000 7.500000 15.474282 13.600000 7.600000 15.334504 13.600000 7.700000 15.214725 13.600000 7.800000 15.114946 13.600000 7.900000 15.035167 13.600000 8.000000 14.975388 13.600000 8.100000 14.935609 13.600000 8.200000 14.915830 13.600000 8.300000 14.916051 13.600000 8.400000 14.936272 13.600000 8.500000 14.976493 13.600000 8.600000 15.036714 13.600000 8.700000 15.116936 13.600000 8.800000 15.217157 13.600000 8.900000 15.337378 13.600000 9.000000 15.477599 13.600000 9.100000 15.637820 13.600000 9.200000 15.818041 13.600000 9.300000 16.018262 13.600000 9.400000 16.238483 13.600000 9.500000 16.478704 13.600000 9.600000 16.738925 13.600000 9.700000 17.019146 13.600000 9.800000 17.319367 13.600000 9.900000 17.639589 13.600000 10.000000 17.979810 13.600000 10.100000 18.340031 13.600000 10.200000 18.720252 13.600000 10.300000 19.120473 13.600000 10.400000 19.540694 13.600000 10.500000 19.980915 13.600000 10.600000 20.441136 13.600000 10.700000 20.921357 13.600000 10.800000 21.421578 13.600000 10.900000 21.941799 13.600000 11.000000 22.482021 13.600000 11.100000 23.042242 13.600000 11.200000 23.622463 13.600000 11.300000 24.222684 13.600000 11.400000 24.842905 13.600000 11.500000 25.483126 13.600000 11.600000 26.143347 13.600000 11.700000 26.823568 13.600000 11.800000 27.523789 13.600000 11.900000 28.244010 13.600000 12.000000 28.984231 13.600000 12.100000 29.744453 13.600000 12.200000 30.524674 13.600000 12.300000 31.324895 13.600000 12.400000 32.145116 13.600000 12.500000 32.985337 13.600000 12.600000 33.845558 13.600000 12.700000 34.725779 13.600000 12.800000 35.626000 13.600000 12.900000 36.546221 13.600000 13.000000 37.486442 13.600000 13.100000 38.446663 13.600000 13.200000 39.426885 13.600000 13.300000 40.427106 13.600000 13.400000 41.447327 13.600000 13.500000 42.487548 13.600000 13.600000 43.547769 13.600000 13.700000 44.627990 13.600000 13.800000 45.728211 13.600000 13.900000 46.848432 13.600000 14.000000 47.988653 13.600000 14.100000 49.148874 13.600000 14.200000 50.329095 13.600000 14.300000 51.529317 13.600000 14.400000 52.749538 13.600000 14.500000 53.989759 13.600000 14.600000 55.249980 13.600000 14.700000 56.530201 13.600000 14.800000 57.830422 13.600000 14.900000 59.150643 13.600000 15.000000 60.490864 13.700000 -5.000000 194.763766 13.700000 -4.900000 192.085283 13.700000 -4.800000 189.426801 13.700000 -4.700000 186.788318 13.700000 -4.600000 184.169835 13.700000 -4.500000 181.571353 13.700000 -4.400000 178.992870 13.700000 -4.300000 176.434387 13.700000 -4.200000 173.895905 13.700000 -4.100000 171.377422 13.700000 -4.000000 168.878939 13.700000 -3.900000 166.400457 13.700000 -3.800000 163.941974 13.700000 -3.700000 161.503491 13.700000 -3.600000 159.085009 13.700000 -3.500000 156.686526 13.700000 -3.400000 154.308043 13.700000 -3.300000 151.949561 13.700000 -3.200000 149.611078 13.700000 -3.100000 147.292595 13.700000 -3.000000 144.994113 13.700000 -2.900000 142.715630 13.700000 -2.800000 140.457147 13.700000 -2.700000 138.218665 13.700000 -2.600000 136.000182 13.700000 -2.500000 133.801699 13.700000 -2.400000 131.623217 13.700000 -2.300000 129.464734 13.700000 -2.200000 127.326251 13.700000 -2.100000 125.207769 13.700000 -2.000000 123.109286 13.700000 -1.900000 121.030803 13.700000 -1.800000 118.972321 13.700000 -1.700000 116.933838 13.700000 -1.600000 114.915355 13.700000 -1.500000 112.916873 13.700000 -1.400000 110.938390 13.700000 -1.300000 108.979907 13.700000 -1.200000 107.041425 13.700000 -1.100000 105.122942 13.700000 -1.000000 103.224459 13.700000 -0.900000 101.345977 13.700000 -0.800000 99.487494 13.700000 -0.700000 97.649011 13.700000 -0.600000 95.830529 13.700000 -0.500000 94.032046 13.700000 -0.400000 92.253563 13.700000 -0.300000 90.495081 13.700000 -0.200000 88.756598 13.700000 -0.100000 87.038115 13.700000 -0.000000 85.339633 13.700000 0.100000 83.661150 13.700000 0.200000 82.002667 13.700000 0.300000 80.364185 13.700000 0.400000 78.745702 13.700000 0.500000 77.147219 13.700000 0.600000 75.568737 13.700000 0.700000 74.010254 13.700000 0.800000 72.471771 13.700000 0.900000 70.953289 13.700000 1.000000 69.454806 13.700000 1.100000 67.976323 13.700000 1.200000 66.517841 13.700000 1.300000 65.079358 13.700000 1.400000 63.660875 13.700000 1.500000 62.262393 13.700000 1.600000 60.883910 13.700000 1.700000 59.525427 13.700000 1.800000 58.186945 13.700000 1.900000 56.868462 13.700000 2.000000 55.569979 13.700000 2.100000 54.291497 13.700000 2.200000 53.033014 13.700000 2.300000 51.794531 13.700000 2.400000 50.576049 13.700000 2.500000 49.377566 13.700000 2.600000 48.199083 13.700000 2.700000 47.040601 13.700000 2.800000 45.902118 13.700000 2.900000 44.783635 13.700000 3.000000 43.685153 13.700000 3.100000 42.606670 13.700000 3.200000 41.548187 13.700000 3.300000 40.509705 13.700000 3.400000 39.491222 13.700000 3.500000 38.492739 13.700000 3.600000 37.514257 13.700000 3.700000 36.555774 13.700000 3.800000 35.617291 13.700000 3.900000 34.698809 13.700000 4.000000 33.800326 13.700000 4.100000 32.921843 13.700000 4.200000 32.063361 13.700000 4.300000 31.224878 13.700000 4.400000 30.406395 13.700000 4.500000 29.607913 13.700000 4.600000 28.829430 13.700000 4.700000 28.070948 13.700000 4.800000 27.332465 13.700000 4.900000 26.613982 13.700000 5.000000 25.915500 13.700000 5.100000 25.237017 13.700000 5.200000 24.578534 13.700000 5.300000 23.940052 13.700000 5.400000 23.321569 13.700000 5.500000 22.723086 13.700000 5.600000 22.144604 13.700000 5.700000 21.586121 13.700000 5.800000 21.047638 13.700000 5.900000 20.529156 13.700000 6.000000 20.030673 13.700000 6.100000 19.552190 13.700000 6.200000 19.093708 13.700000 6.300000 18.655225 13.700000 6.400000 18.236742 13.700000 6.500000 17.838260 13.700000 6.600000 17.459777 13.700000 6.700000 17.101294 13.700000 6.800000 16.762812 13.700000 6.900000 16.444329 13.700000 7.000000 16.145846 13.700000 7.100000 15.867364 13.700000 7.200000 15.608881 13.700000 7.300000 15.370398 13.700000 7.400000 15.151916 13.700000 7.500000 14.953433 13.700000 7.600000 14.774950 13.700000 7.700000 14.616468 13.700000 7.800000 14.477985 13.700000 7.900000 14.359502 13.700000 8.000000 14.261020 13.700000 8.100000 14.182537 13.700000 8.200000 14.124054 13.700000 8.300000 14.085572 13.700000 8.400000 14.067089 13.700000 8.500000 14.068606 13.700000 8.600000 14.090124 13.700000 8.700000 14.131641 13.700000 8.800000 14.193158 13.700000 8.900000 14.274676 13.700000 9.000000 14.376193 13.700000 9.100000 14.497710 13.700000 9.200000 14.639228 13.700000 9.300000 14.800745 13.700000 9.400000 14.982262 13.700000 9.500000 15.183780 13.700000 9.600000 15.405297 13.700000 9.700000 15.646814 13.700000 9.800000 15.908332 13.700000 9.900000 16.189849 13.700000 10.000000 16.491366 13.700000 10.100000 16.812884 13.700000 10.200000 17.154401 13.700000 10.300000 17.515918 13.700000 10.400000 17.897436 13.700000 10.500000 18.298953 13.700000 10.600000 18.720470 13.700000 10.700000 19.161988 13.700000 10.800000 19.623505 13.700000 10.900000 20.105022 13.700000 11.000000 20.606540 13.700000 11.100000 21.128057 13.700000 11.200000 21.669574 13.700000 11.300000 22.231092 13.700000 11.400000 22.812609 13.700000 11.500000 23.414126 13.700000 11.600000 24.035644 13.700000 11.700000 24.677161 13.700000 11.800000 25.338678 13.700000 11.900000 26.020196 13.700000 12.000000 26.721713 13.700000 12.100000 27.443230 13.700000 12.200000 28.184748 13.700000 12.300000 28.946265 13.700000 12.400000 29.727782 13.700000 12.500000 30.529300 13.700000 12.600000 31.350817 13.700000 12.700000 32.192334 13.700000 12.800000 33.053852 13.700000 12.900000 33.935369 13.700000 13.000000 34.836886 13.700000 13.100000 35.758404 13.700000 13.200000 36.699921 13.700000 13.300000 37.661438 13.700000 13.400000 38.642956 13.700000 13.500000 39.644473 13.700000 13.600000 40.665990 13.700000 13.700000 41.707508 13.700000 13.800000 42.769025 13.700000 13.900000 43.850542 13.700000 14.000000 44.952060 13.700000 14.100000 46.073577 13.700000 14.200000 47.215094 13.700000 14.300000 48.376612 13.700000 14.400000 49.558129 13.700000 14.500000 50.759646 13.700000 14.600000 51.981164 13.700000 14.700000 53.222681 13.700000 14.800000 54.484198 13.700000 14.900000 55.765716 13.700000 15.000000 57.067233 13.800000 -5.000000 199.185634 13.800000 -4.900000 196.467931 13.800000 -4.800000 193.770228 13.800000 -4.700000 191.092525 13.800000 -4.600000 188.434822 13.800000 -4.500000 185.797118 13.800000 -4.400000 183.179415 13.800000 -4.300000 180.581712 13.800000 -4.200000 178.004009 13.800000 -4.100000 175.446306 13.800000 -4.000000 172.908603 13.800000 -3.900000 170.390900 13.800000 -3.800000 167.893196 13.800000 -3.700000 165.415493 13.800000 -3.600000 162.957790 13.800000 -3.500000 160.520087 13.800000 -3.400000 158.102384 13.800000 -3.300000 155.704681 13.800000 -3.200000 153.326977 13.800000 -3.100000 150.969274 13.800000 -3.000000 148.631571 13.800000 -2.900000 146.313868 13.800000 -2.800000 144.016165 13.800000 -2.700000 141.738462 13.800000 -2.600000 139.480759 13.800000 -2.500000 137.243055 13.800000 -2.400000 135.025352 13.800000 -2.300000 132.827649 13.800000 -2.200000 130.649946 13.800000 -2.100000 128.492243 13.800000 -2.000000 126.354540 13.800000 -1.900000 124.236836 13.800000 -1.800000 122.139133 13.800000 -1.700000 120.061430 13.800000 -1.600000 118.003727 13.800000 -1.500000 115.966024 13.800000 -1.400000 113.948321 13.800000 -1.300000 111.950618 13.800000 -1.200000 109.972914 13.800000 -1.100000 108.015211 13.800000 -1.000000 106.077508 13.800000 -0.900000 104.159805 13.800000 -0.800000 102.262102 13.800000 -0.700000 100.384399 13.800000 -0.600000 98.526695 13.800000 -0.500000 96.688992 13.800000 -0.400000 94.871289 13.800000 -0.300000 93.073586 13.800000 -0.200000 91.295883 13.800000 -0.100000 89.538180 13.800000 -0.000000 87.800477 13.800000 0.100000 86.082773 13.800000 0.200000 84.385070 13.800000 0.300000 82.707367 13.800000 0.400000 81.049664 13.800000 0.500000 79.411961 13.800000 0.600000 77.794258 13.800000 0.700000 76.196554 13.800000 0.800000 74.618851 13.800000 0.900000 73.061148 13.800000 1.000000 71.523445 13.800000 1.100000 70.005742 13.800000 1.200000 68.508039 13.800000 1.300000 67.030335 13.800000 1.400000 65.572632 13.800000 1.500000 64.134929 13.800000 1.600000 62.717226 13.800000 1.700000 61.319523 13.800000 1.800000 59.941820 13.800000 1.900000 58.584117 13.800000 2.000000 57.246413 13.800000 2.100000 55.928710 13.800000 2.200000 54.631007 13.800000 2.300000 53.353304 13.800000 2.400000 52.095601 13.800000 2.500000 50.857898 13.800000 2.600000 49.640194 13.800000 2.700000 48.442491 13.800000 2.800000 47.264788 13.800000 2.900000 46.107085 13.800000 3.000000 44.969382 13.800000 3.100000 43.851679 13.800000 3.200000 42.753976 13.800000 3.300000 41.676272 13.800000 3.400000 40.618569 13.800000 3.500000 39.580866 13.800000 3.600000 38.563163 13.800000 3.700000 37.565460 13.800000 3.800000 36.587757 13.800000 3.900000 35.630053 13.800000 4.000000 34.692350 13.800000 4.100000 33.774647 13.800000 4.200000 32.876944 13.800000 4.300000 31.999241 13.800000 4.400000 31.141538 13.800000 4.500000 30.303835 13.800000 4.600000 29.486131 13.800000 4.700000 28.688428 13.800000 4.800000 27.910725 13.800000 4.900000 27.153022 13.800000 5.000000 26.415319 13.800000 5.100000 25.697616 13.800000 5.200000 24.999912 13.800000 5.300000 24.322209 13.800000 5.400000 23.664506 13.800000 5.500000 23.026803 13.800000 5.600000 22.409100 13.800000 5.700000 21.811397 13.800000 5.800000 21.233694 13.800000 5.900000 20.675990 13.800000 6.000000 20.138287 13.800000 6.100000 19.620584 13.800000 6.200000 19.122881 13.800000 6.300000 18.645178 13.800000 6.400000 18.187475 13.800000 6.500000 17.749771 13.800000 6.600000 17.332068 13.800000 6.700000 16.934365 13.800000 6.800000 16.556662 13.800000 6.900000 16.198959 13.800000 7.000000 15.861256 13.800000 7.100000 15.543553 13.800000 7.200000 15.245849 13.800000 7.300000 14.968146 13.800000 7.400000 14.710443 13.800000 7.500000 14.472740 13.800000 7.600000 14.255037 13.800000 7.700000 14.057334 13.800000 7.800000 13.879630 13.800000 7.900000 13.721927 13.800000 8.000000 13.584224 13.800000 8.100000 13.466521 13.800000 8.200000 13.368818 13.800000 8.300000 13.291115 13.800000 8.400000 13.233411 13.800000 8.500000 13.195708 13.800000 8.600000 13.178005 13.800000 8.700000 13.180302 13.800000 8.800000 13.202599 13.800000 8.900000 13.244896 13.800000 9.000000 13.307193 13.800000 9.100000 13.389489 13.800000 9.200000 13.491786 13.800000 9.300000 13.614083 13.800000 9.400000 13.756380 13.800000 9.500000 13.918677 13.800000 9.600000 14.100974 13.800000 9.700000 14.303270 13.800000 9.800000 14.525567 13.800000 9.900000 14.767864 13.800000 10.000000 15.030161 13.800000 10.100000 15.312458 13.800000 10.200000 15.614755 13.800000 10.300000 15.937052 13.800000 10.400000 16.279348 13.800000 10.500000 16.641645 13.800000 10.600000 17.023942 13.800000 10.700000 17.426239 13.800000 10.800000 17.848536 13.800000 10.900000 18.290833 13.800000 11.000000 18.753129 13.800000 11.100000 19.235426 13.800000 11.200000 19.737723 13.800000 11.300000 20.260020 13.800000 11.400000 20.802317 13.800000 11.500000 21.364614 13.800000 11.600000 21.946911 13.800000 11.700000 22.549207 13.800000 11.800000 23.171504 13.800000 11.900000 23.813801 13.800000 12.000000 24.476098 13.800000 12.100000 25.158395 13.800000 12.200000 25.860692 13.800000 12.300000 26.582988 13.800000 12.400000 27.325285 13.800000 12.500000 28.087582 13.800000 12.600000 28.869879 13.800000 12.700000 29.672176 13.800000 12.800000 30.494473 13.800000 12.900000 31.336770 13.800000 13.000000 32.199066 13.800000 13.100000 33.081363 13.800000 13.200000 33.983660 13.800000 13.300000 34.905957 13.800000 13.400000 35.848254 13.800000 13.500000 36.810551 13.800000 13.600000 37.792847 13.800000 13.700000 38.795144 13.800000 13.800000 39.817441 13.800000 13.900000 40.859738 13.800000 14.000000 41.922035 13.800000 14.100000 43.004332 13.800000 14.200000 44.106629 13.800000 14.300000 45.228925 13.800000 14.400000 46.371222 13.800000 14.500000 47.533519 13.800000 14.600000 48.715816 13.800000 14.700000 49.918113 13.800000 14.800000 51.140410 13.800000 14.900000 52.382706 13.800000 15.000000 53.645003 13.900000 -5.000000 203.724172 13.900000 -4.900000 200.966731 13.900000 -4.800000 198.229291 13.900000 -4.700000 195.511850 13.900000 -4.600000 192.814410 13.900000 -4.500000 190.136970 13.900000 -4.400000 187.479529 13.900000 -4.300000 184.842089 13.900000 -4.200000 182.224649 13.900000 -4.100000 179.627208 13.900000 -4.000000 177.049768 13.900000 -3.900000 174.492327 13.900000 -3.800000 171.954887 13.900000 -3.700000 169.437447 13.900000 -3.600000 166.940006 13.900000 -3.500000 164.462566 13.900000 -3.400000 162.005126 13.900000 -3.300000 159.567685 13.900000 -3.200000 157.150245 13.900000 -3.100000 154.752804 13.900000 -3.000000 152.375364 13.900000 -2.900000 150.017924 13.900000 -2.800000 147.680483 13.900000 -2.700000 145.363043 13.900000 -2.600000 143.065602 13.900000 -2.500000 140.788162 13.900000 -2.400000 138.530722 13.900000 -2.300000 136.293281 13.900000 -2.200000 134.075841 13.900000 -2.100000 131.878401 13.900000 -2.000000 129.700960 13.900000 -1.900000 127.543520 13.900000 -1.800000 125.406079 13.900000 -1.700000 123.288639 13.900000 -1.600000 121.191199 13.900000 -1.500000 119.113758 13.900000 -1.400000 117.056318 13.900000 -1.300000 115.018877 13.900000 -1.200000 113.001437 13.900000 -1.100000 111.003997 13.900000 -1.000000 109.026556 13.900000 -0.900000 107.069116 13.900000 -0.800000 105.131676 13.900000 -0.700000 103.214235 13.900000 -0.600000 101.316795 13.900000 -0.500000 99.439354 13.900000 -0.400000 97.581914 13.900000 -0.300000 95.744474 13.900000 -0.200000 93.927033 13.900000 -0.100000 92.129593 13.900000 -0.000000 90.352152 13.900000 0.100000 88.594712 13.900000 0.200000 86.857272 13.900000 0.300000 85.139831 13.900000 0.400000 83.442391 13.900000 0.500000 81.764951 13.900000 0.600000 80.107510 13.900000 0.700000 78.470070 13.900000 0.800000 76.852629 13.900000 0.900000 75.255189 13.900000 1.000000 73.677749 13.900000 1.100000 72.120308 13.900000 1.200000 70.582868 13.900000 1.300000 69.065427 13.900000 1.400000 67.567987 13.900000 1.500000 66.090547 13.900000 1.600000 64.633106 13.900000 1.700000 63.195666 13.900000 1.800000 61.778226 13.900000 1.900000 60.380785 13.900000 2.000000 59.003345 13.900000 2.100000 57.645904 13.900000 2.200000 56.308464 13.900000 2.300000 54.991024 13.900000 2.400000 53.693583 13.900000 2.500000 52.416143 13.900000 2.600000 51.158702 13.900000 2.700000 49.921262 13.900000 2.800000 48.703822 13.900000 2.900000 47.506381 13.900000 3.000000 46.328941 13.900000 3.100000 45.171501 13.900000 3.200000 44.034060 13.900000 3.300000 42.916620 13.900000 3.400000 41.819179 13.900000 3.500000 40.741739 13.900000 3.600000 39.684299 13.900000 3.700000 38.646858 13.900000 3.800000 37.629418 13.900000 3.900000 36.631977 13.900000 4.000000 35.654537 13.900000 4.100000 34.697097 13.900000 4.200000 33.759656 13.900000 4.300000 32.842216 13.900000 4.400000 31.944776 13.900000 4.500000 31.067335 13.900000 4.600000 30.209895 13.900000 4.700000 29.372454 13.900000 4.800000 28.555014 13.900000 4.900000 27.757574 13.900000 5.000000 26.980133 13.900000 5.100000 26.222693 13.900000 5.200000 25.485252 13.900000 5.300000 24.767812 13.900000 5.400000 24.070372 13.900000 5.500000 23.392931 13.900000 5.600000 22.735491 13.900000 5.700000 22.098051 13.900000 5.800000 21.480610 13.900000 5.900000 20.883170 13.900000 6.000000 20.305729 13.900000 6.100000 19.748289 13.900000 6.200000 19.210849 13.900000 6.300000 18.693408 13.900000 6.400000 18.195968 13.900000 6.500000 17.718527 13.900000 6.600000 17.261087 13.900000 6.700000 16.823647 13.900000 6.800000 16.406206 13.900000 6.900000 16.008766 13.900000 7.000000 15.631326 13.900000 7.100000 15.273885 13.900000 7.200000 14.936445 13.900000 7.300000 14.619004 13.900000 7.400000 14.321564 13.900000 7.500000 14.044124 13.900000 7.600000 13.786683 13.900000 7.700000 13.549243 13.900000 7.800000 13.331802 13.900000 7.900000 13.134362 13.900000 8.000000 12.956922 13.900000 8.100000 12.799481 13.900000 8.200000 12.662041 13.900000 8.300000 12.544601 13.900000 8.400000 12.447160 13.900000 8.500000 12.369720 13.900000 8.600000 12.312279 13.900000 8.700000 12.274839 13.900000 8.800000 12.257399 13.900000 8.900000 12.259958 13.900000 9.000000 12.282518 13.900000 9.100000 12.325077 13.900000 9.200000 12.387637 13.900000 9.300000 12.470197 13.900000 9.400000 12.572756 13.900000 9.500000 12.695316 13.900000 9.600000 12.837876 13.900000 9.700000 13.000435 13.900000 9.800000 13.182995 13.900000 9.900000 13.385554 13.900000 10.000000 13.608114 13.900000 10.100000 13.850674 13.900000 10.200000 14.113233 13.900000 10.300000 14.395793 13.900000 10.400000 14.698352 13.900000 10.500000 15.020912 13.900000 10.600000 15.363472 13.900000 10.700000 15.726031 13.900000 10.800000 16.108591 13.900000 10.900000 16.511151 13.900000 11.000000 16.933710 13.900000 11.100000 17.376270 13.900000 11.200000 17.838829 13.900000 11.300000 18.321389 13.900000 11.400000 18.823949 13.900000 11.500000 19.346508 13.900000 11.600000 19.889068 13.900000 11.700000 20.451627 13.900000 11.800000 21.034187 13.900000 11.900000 21.636747 13.900000 12.000000 22.259306 13.900000 12.100000 22.901866 13.900000 12.200000 23.564426 13.900000 12.300000 24.246985 13.900000 12.400000 24.949545 13.900000 12.500000 25.672104 13.900000 12.600000 26.414664 13.900000 12.700000 27.177224 13.900000 12.800000 27.959783 13.900000 12.900000 28.762343 13.900000 13.000000 29.584902 13.900000 13.100000 30.427462 13.900000 13.200000 31.290022 13.900000 13.300000 32.172581 13.900000 13.400000 33.075141 13.900000 13.500000 33.997701 13.900000 13.600000 34.940260 13.900000 13.700000 35.902820 13.900000 13.800000 36.885379 13.900000 13.900000 37.887939 13.900000 14.000000 38.910499 13.900000 14.100000 39.953058 13.900000 14.200000 41.015618 13.900000 14.300000 42.098177 13.900000 14.400000 43.200737 13.900000 14.500000 44.323297 13.900000 14.600000 45.465856 13.900000 14.700000 46.628416 13.900000 14.800000 47.810976 13.900000 14.900000 49.013535 13.900000 15.000000 50.236095 14.000000 -5.000000 208.391656 14.000000 -4.900000 205.593961 14.000000 -4.800000 202.816267 14.000000 -4.700000 200.058572 14.000000 -4.600000 197.320878 14.000000 -4.500000 194.603184 14.000000 -4.400000 191.905489 14.000000 -4.300000 189.227795 14.000000 -4.200000 186.570101 14.000000 -4.100000 183.932406 14.000000 -4.000000 181.314712 14.000000 -3.900000 178.717018 14.000000 -3.800000 176.139323 14.000000 -3.700000 173.581629 14.000000 -3.600000 171.043935 14.000000 -3.500000 168.526240 14.000000 -3.400000 166.028546 14.000000 -3.300000 163.550852 14.000000 -3.200000 161.093157 14.000000 -3.100000 158.655463 14.000000 -3.000000 156.237768 14.000000 -2.900000 153.840074 14.000000 -2.800000 151.462380 14.000000 -2.700000 149.104685 14.000000 -2.600000 146.766991 14.000000 -2.500000 144.449297 14.000000 -2.400000 142.151602 14.000000 -2.300000 139.873908 14.000000 -2.200000 137.616214 14.000000 -2.100000 135.378519 14.000000 -2.000000 133.160825 14.000000 -1.900000 130.963131 14.000000 -1.800000 128.785436 14.000000 -1.700000 126.627742 14.000000 -1.600000 124.490048 14.000000 -1.500000 122.372353 14.000000 -1.400000 120.274659 14.000000 -1.300000 118.196964 14.000000 -1.200000 116.139270 14.000000 -1.100000 114.101576 14.000000 -1.000000 112.083881 14.000000 -0.900000 110.086187 14.000000 -0.800000 108.108493 14.000000 -0.700000 106.150798 14.000000 -0.600000 104.213104 14.000000 -0.500000 102.295410 14.000000 -0.400000 100.397715 14.000000 -0.300000 98.520021 14.000000 -0.200000 96.662327 14.000000 -0.100000 94.824632 14.000000 -0.000000 93.006938 14.000000 0.100000 91.209244 14.000000 0.200000 89.431549 14.000000 0.300000 87.673855 14.000000 0.400000 85.936161 14.000000 0.500000 84.218466 14.000000 0.600000 82.520772 14.000000 0.700000 80.843077 14.000000 0.800000 79.185383 14.000000 0.900000 77.547689 14.000000 1.000000 75.929994 14.000000 1.100000 74.332300 14.000000 1.200000 72.754606 14.000000 1.300000 71.196911 14.000000 1.400000 69.659217 14.000000 1.500000 68.141523 14.000000 1.600000 66.643828 14.000000 1.700000 65.166134 14.000000 1.800000 63.708440 14.000000 1.900000 62.270745 14.000000 2.000000 60.853051 14.000000 2.100000 59.455357 14.000000 2.200000 58.077662 14.000000 2.300000 56.719968 14.000000 2.400000 55.382273 14.000000 2.500000 54.064579 14.000000 2.600000 52.766885 14.000000 2.700000 51.489190 14.000000 2.800000 50.231496 14.000000 2.900000 48.993802 14.000000 3.000000 47.776107 14.000000 3.100000 46.578413 14.000000 3.200000 45.400719 14.000000 3.300000 44.243024 14.000000 3.400000 43.105330 14.000000 3.500000 41.987636 14.000000 3.600000 40.889941 14.000000 3.700000 39.812247 14.000000 3.800000 38.754553 14.000000 3.900000 37.716858 14.000000 4.000000 36.699164 14.000000 4.100000 35.701469 14.000000 4.200000 34.723775 14.000000 4.300000 33.766081 14.000000 4.400000 32.828386 14.000000 4.500000 31.910692 14.000000 4.600000 31.012998 14.000000 4.700000 30.135303 14.000000 4.800000 29.277609 14.000000 4.900000 28.439915 14.000000 5.000000 27.622220 14.000000 5.100000 26.824526 14.000000 5.200000 26.046832 14.000000 5.300000 25.289137 14.000000 5.400000 24.551443 14.000000 5.500000 23.833749 14.000000 5.600000 23.136054 14.000000 5.700000 22.458360 14.000000 5.800000 21.800666 14.000000 5.900000 21.162971 14.000000 6.000000 20.545277 14.000000 6.100000 19.947582 14.000000 6.200000 19.369888 14.000000 6.300000 18.812194 14.000000 6.400000 18.274499 14.000000 6.500000 17.756805 14.000000 6.600000 17.259111 14.000000 6.700000 16.781416 14.000000 6.800000 16.323722 14.000000 6.900000 15.886028 14.000000 7.000000 15.468333 14.000000 7.100000 15.070639 14.000000 7.200000 14.692945 14.000000 7.300000 14.335250 14.000000 7.400000 13.997556 14.000000 7.500000 13.679862 14.000000 7.600000 13.382167 14.000000 7.700000 13.104473 14.000000 7.800000 12.846778 14.000000 7.900000 12.609084 14.000000 8.000000 12.391390 14.000000 8.100000 12.193695 14.000000 8.200000 12.016001 14.000000 8.300000 11.858307 14.000000 8.400000 11.720612 14.000000 8.500000 11.602918 14.000000 8.600000 11.505224 14.000000 8.700000 11.427529 14.000000 8.800000 11.369835 14.000000 8.900000 11.332141 14.000000 9.000000 11.314446 14.000000 9.100000 11.316752 14.000000 9.200000 11.339058 14.000000 9.300000 11.381363 14.000000 9.400000 11.443669 14.000000 9.500000 11.525974 14.000000 9.600000 11.628280 14.000000 9.700000 11.750586 14.000000 9.800000 11.892891 14.000000 9.900000 12.055197 14.000000 10.000000 12.237503 14.000000 10.100000 12.439808 14.000000 10.200000 12.662114 14.000000 10.300000 12.904420 14.000000 10.400000 13.166725 14.000000 10.500000 13.449031 14.000000 10.600000 13.751337 14.000000 10.700000 14.073642 14.000000 10.800000 14.415948 14.000000 10.900000 14.778254 14.000000 11.000000 15.160559 14.000000 11.100000 15.562865 14.000000 11.200000 15.985171 14.000000 11.300000 16.427476 14.000000 11.400000 16.889782 14.000000 11.500000 17.372087 14.000000 11.600000 17.874393 14.000000 11.700000 18.396699 14.000000 11.800000 18.939004 14.000000 11.900000 19.501310 14.000000 12.000000 20.083616 14.000000 12.100000 20.685921 14.000000 12.200000 21.308227 14.000000 12.300000 21.950533 14.000000 12.400000 22.612838 14.000000 12.500000 23.295144 14.000000 12.600000 23.997450 14.000000 12.700000 24.719755 14.000000 12.800000 25.462061 14.000000 12.900000 26.224367 14.000000 13.000000 27.006672 14.000000 13.100000 27.808978 14.000000 13.200000 28.631283 14.000000 13.300000 29.473589 14.000000 13.400000 30.335895 14.000000 13.500000 31.218200 14.000000 13.600000 32.120506 14.000000 13.700000 33.042812 14.000000 13.800000 33.985117 14.000000 13.900000 34.947423 14.000000 14.000000 35.929729 14.000000 14.100000 36.932034 14.000000 14.200000 37.954340 14.000000 14.300000 38.996646 14.000000 14.400000 40.058951 14.000000 14.500000 41.141257 14.000000 14.600000 42.243563 14.000000 14.700000 43.365868 14.000000 14.800000 44.508174 14.000000 14.900000 45.670479 14.000000 15.000000 46.852785 14.100000 -5.000000 213.200629 14.100000 -4.900000 210.362164 14.100000 -4.800000 207.543698 14.100000 -4.700000 204.745233 14.100000 -4.600000 201.966768 14.100000 -4.500000 199.208303 14.100000 -4.400000 196.469838 14.100000 -4.300000 193.751373 14.100000 -4.200000 191.052908 14.100000 -4.100000 188.374443 14.100000 -4.000000 185.715978 14.100000 -3.900000 183.077513 14.100000 -3.800000 180.459048 14.100000 -3.700000 177.860583 14.100000 -3.600000 175.282118 14.100000 -3.500000 172.723653 14.100000 -3.400000 170.185188 14.100000 -3.300000 167.666723 14.100000 -3.200000 165.168258 14.100000 -3.100000 162.689792 14.100000 -3.000000 160.231327 14.100000 -2.900000 157.792862 14.100000 -2.800000 155.374397 14.100000 -2.700000 152.975932 14.100000 -2.600000 150.597467 14.100000 -2.500000 148.239002 14.100000 -2.400000 145.900537 14.100000 -2.300000 143.582072 14.100000 -2.200000 141.283607 14.100000 -2.100000 139.005142 14.100000 -2.000000 136.746677 14.100000 -1.900000 134.508212 14.100000 -1.800000 132.289747 14.100000 -1.700000 130.091282 14.100000 -1.600000 127.912817 14.100000 -1.500000 125.754352 14.100000 -1.400000 123.615887 14.100000 -1.300000 121.497421 14.100000 -1.200000 119.398956 14.100000 -1.100000 117.320491 14.100000 -1.000000 115.262026 14.100000 -0.900000 113.223561 14.100000 -0.800000 111.205096 14.100000 -0.700000 109.206631 14.100000 -0.600000 107.228166 14.100000 -0.500000 105.269701 14.100000 -0.400000 103.331236 14.100000 -0.300000 101.412771 14.100000 -0.200000 99.514306 14.100000 -0.100000 97.635841 14.100000 -0.000000 95.777376 14.100000 0.100000 93.938911 14.100000 0.200000 92.120446 14.100000 0.300000 90.321981 14.100000 0.400000 88.543515 14.100000 0.500000 86.785050 14.100000 0.600000 85.046585 14.100000 0.700000 83.328120 14.100000 0.800000 81.629655 14.100000 0.900000 79.951190 14.100000 1.000000 78.292725 14.100000 1.100000 76.654260 14.100000 1.200000 75.035795 14.100000 1.300000 73.437330 14.100000 1.400000 71.858865 14.100000 1.500000 70.300400 14.100000 1.600000 68.761935 14.100000 1.700000 67.243470 14.100000 1.800000 65.745005 14.100000 1.900000 64.266540 14.100000 2.000000 62.808075 14.100000 2.100000 61.369610 14.100000 2.200000 59.951144 14.100000 2.300000 58.552679 14.100000 2.400000 57.174214 14.100000 2.500000 55.815749 14.100000 2.600000 54.477284 14.100000 2.700000 53.158819 14.100000 2.800000 51.860354 14.100000 2.900000 50.581889 14.100000 3.000000 49.323424 14.100000 3.100000 48.084959 14.100000 3.200000 46.866494 14.100000 3.300000 45.668029 14.100000 3.400000 44.489564 14.100000 3.500000 43.331099 14.100000 3.600000 42.192634 14.100000 3.700000 41.074169 14.100000 3.800000 39.975704 14.100000 3.900000 38.897238 14.100000 4.000000 37.838773 14.100000 4.100000 36.800308 14.100000 4.200000 35.781843 14.100000 4.300000 34.783378 14.100000 4.400000 33.804913 14.100000 4.500000 32.846448 14.100000 4.600000 31.907983 14.100000 4.700000 30.989518 14.100000 4.800000 30.091053 14.100000 4.900000 29.212588 14.100000 5.000000 28.354123 14.100000 5.100000 27.515658 14.100000 5.200000 26.697193 14.100000 5.300000 25.898728 14.100000 5.400000 25.120263 14.100000 5.500000 24.361798 14.100000 5.600000 23.623332 14.100000 5.700000 22.904867 14.100000 5.800000 22.206402 14.100000 5.900000 21.527937 14.100000 6.000000 20.869472 14.100000 6.100000 20.231007 14.100000 6.200000 19.612542 14.100000 6.300000 19.014077 14.100000 6.400000 18.435612 14.100000 6.500000 17.877147 14.100000 6.600000 17.338682 14.100000 6.700000 16.820217 14.100000 6.800000 16.321752 14.100000 6.900000 15.843287 14.100000 7.000000 15.384822 14.100000 7.100000 14.946357 14.100000 7.200000 14.527892 14.100000 7.300000 14.129427 14.100000 7.400000 13.750961 14.100000 7.500000 13.392496 14.100000 7.600000 13.054031 14.100000 7.700000 12.735566 14.100000 7.800000 12.437101 14.100000 7.900000 12.158636 14.100000 8.000000 11.900171 14.100000 8.100000 11.661706 14.100000 8.200000 11.443241 14.100000 8.300000 11.244776 14.100000 8.400000 11.066311 14.100000 8.500000 10.907846 14.100000 8.600000 10.769381 14.100000 8.700000 10.650916 14.100000 8.800000 10.552451 14.100000 8.900000 10.473986 14.100000 9.000000 10.415521 14.100000 9.100000 10.377055 14.100000 9.200000 10.358590 14.100000 9.300000 10.360125 14.100000 9.400000 10.381660 14.100000 9.500000 10.423195 14.100000 9.600000 10.484730 14.100000 9.700000 10.566265 14.100000 9.800000 10.667800 14.100000 9.900000 10.789335 14.100000 10.000000 10.930870 14.100000 10.100000 11.092405 14.100000 10.200000 11.273940 14.100000 10.300000 11.475475 14.100000 10.400000 11.697010 14.100000 10.500000 11.938545 14.100000 10.600000 12.200080 14.100000 10.700000 12.481615 14.100000 10.800000 12.783150 14.100000 10.900000 13.104684 14.100000 11.000000 13.446219 14.100000 11.100000 13.807754 14.100000 11.200000 14.189289 14.100000 11.300000 14.590824 14.100000 11.400000 15.012359 14.100000 11.500000 15.453894 14.100000 11.600000 15.915429 14.100000 11.700000 16.396964 14.100000 11.800000 16.898499 14.100000 11.900000 17.420034 14.100000 12.000000 17.961569 14.100000 12.100000 18.523104 14.100000 12.200000 19.104639 14.100000 12.300000 19.706174 14.100000 12.400000 20.327709 14.100000 12.500000 20.969244 14.100000 12.600000 21.630778 14.100000 12.700000 22.312313 14.100000 12.800000 23.013848 14.100000 12.900000 23.735383 14.100000 13.000000 24.476918 14.100000 13.100000 25.238453 14.100000 13.200000 26.019988 14.100000 13.300000 26.821523 14.100000 13.400000 27.643058 14.100000 13.500000 28.484593 14.100000 13.600000 29.346128 14.100000 13.700000 30.227663 14.100000 13.800000 31.129198 14.100000 13.900000 32.050733 14.100000 14.000000 32.992268 14.100000 14.100000 33.953803 14.100000 14.200000 34.935338 14.100000 14.300000 35.936872 14.100000 14.400000 36.958407 14.100000 14.500000 37.999942 14.100000 14.600000 39.061477 14.100000 14.700000 40.143012 14.100000 14.800000 41.244547 14.100000 14.900000 42.366082 14.100000 15.000000 43.507617 14.200000 -5.000000 218.163805 14.200000 -4.900000 215.284052 14.200000 -4.800000 212.424300 14.200000 -4.700000 209.584547 14.200000 -4.600000 206.764795 14.200000 -4.500000 203.965042 14.200000 -4.400000 201.185290 14.200000 -4.300000 198.425537 14.200000 -4.200000 195.685785 14.200000 -4.100000 192.966032 14.200000 -4.000000 190.266280 14.200000 -3.900000 187.586527 14.200000 -3.800000 184.926775 14.200000 -3.700000 182.287022 14.200000 -3.600000 179.667270 14.200000 -3.500000 177.067517 14.200000 -3.400000 174.487765 14.200000 -3.300000 171.928012 14.200000 -3.200000 169.388260 14.200000 -3.100000 166.868507 14.200000 -3.000000 164.368755 14.200000 -2.900000 161.889002 14.200000 -2.800000 159.429250 14.200000 -2.700000 156.989497 14.200000 -2.600000 154.569745 14.200000 -2.500000 152.169992 14.200000 -2.400000 149.790240 14.200000 -2.300000 147.430487 14.200000 -2.200000 145.090735 14.200000 -2.100000 142.770982 14.200000 -2.000000 140.471230 14.200000 -1.900000 138.191477 14.200000 -1.800000 135.931725 14.200000 -1.700000 133.691972 14.200000 -1.600000 131.472220 14.200000 -1.500000 129.272467 14.200000 -1.400000 127.092715 14.200000 -1.300000 124.932962 14.200000 -1.200000 122.793210 14.200000 -1.100000 120.673457 14.200000 -1.000000 118.573705 14.200000 -0.900000 116.493952 14.200000 -0.800000 114.434200 14.200000 -0.700000 112.394447 14.200000 -0.600000 110.374695 14.200000 -0.500000 108.374942 14.200000 -0.400000 106.395190 14.200000 -0.300000 104.435437 14.200000 -0.200000 102.495685 14.200000 -0.100000 100.575932 14.200000 -0.000000 98.676180 14.200000 0.100000 96.796427 14.200000 0.200000 94.936675 14.200000 0.300000 93.096922 14.200000 0.400000 91.277170 14.200000 0.500000 89.477417 14.200000 0.600000 87.697665 14.200000 0.700000 85.937912 14.200000 0.800000 84.198160 14.200000 0.900000 82.478407 14.200000 1.000000 80.778655 14.200000 1.100000 79.098902 14.200000 1.200000 77.439150 14.200000 1.300000 75.799397 14.200000 1.400000 74.179645 14.200000 1.500000 72.579892 14.200000 1.600000 71.000140 14.200000 1.700000 69.440387 14.200000 1.800000 67.900635 14.200000 1.900000 66.380882 14.200000 2.000000 64.881130 14.200000 2.100000 63.401377 14.200000 2.200000 61.941625 14.200000 2.300000 60.501872 14.200000 2.400000 59.082120 14.200000 2.500000 57.682367 14.200000 2.600000 56.302615 14.200000 2.700000 54.942862 14.200000 2.800000 53.603110 14.200000 2.900000 52.283357 14.200000 3.000000 50.983605 14.200000 3.100000 49.703852 14.200000 3.200000 48.444100 14.200000 3.300000 47.204347 14.200000 3.400000 45.984595 14.200000 3.500000 44.784842 14.200000 3.600000 43.605090 14.200000 3.700000 42.445337 14.200000 3.800000 41.305585 14.200000 3.900000 40.185832 14.200000 4.000000 39.086080 14.200000 4.100000 38.006327 14.200000 4.200000 36.946575 14.200000 4.300000 35.906822 14.200000 4.400000 34.887070 14.200000 4.500000 33.887317 14.200000 4.600000 32.907565 14.200000 4.700000 31.947812 14.200000 4.800000 31.008060 14.200000 4.900000 30.088307 14.200000 5.000000 29.188555 14.200000 5.100000 28.308802 14.200000 5.200000 27.449050 14.200000 5.300000 26.609297 14.200000 5.400000 25.789545 14.200000 5.500000 24.989792 14.200000 5.600000 24.210040 14.200000 5.700000 23.450287 14.200000 5.800000 22.710535 14.200000 5.900000 21.990782 14.200000 6.000000 21.291030 14.200000 6.100000 20.611277 14.200000 6.200000 19.951525 14.200000 6.300000 19.311772 14.200000 6.400000 18.692020 14.200000 6.500000 18.092267 14.200000 6.600000 17.512515 14.200000 6.700000 16.952762 14.200000 6.800000 16.413010 14.200000 6.900000 15.893257 14.200000 7.000000 15.393505 14.200000 7.100000 14.913752 14.200000 7.200000 14.454000 14.200000 7.300000 14.014247 14.200000 7.400000 13.594495 14.200000 7.500000 13.194742 14.200000 7.600000 12.814990 14.200000 7.700000 12.455237 14.200000 7.800000 12.115485 14.200000 7.900000 11.795732 14.200000 8.000000 11.495980 14.200000 8.100000 11.216227 14.200000 8.200000 10.956475 14.200000 8.300000 10.716722 14.200000 8.400000 10.496970 14.200000 8.500000 10.297217 14.200000 8.600000 10.117465 14.200000 8.700000 9.957712 14.200000 8.800000 9.817960 14.200000 8.900000 9.698207 14.200000 9.000000 9.598455 14.200000 9.100000 9.518702 14.200000 9.200000 9.458950 14.200000 9.300000 9.419197 14.200000 9.400000 9.399445 14.200000 9.500000 9.399692 14.200000 9.600000 9.419940 14.200000 9.700000 9.460187 14.200000 9.800000 9.520435 14.200000 9.900000 9.600682 14.200000 10.000000 9.700930 14.200000 10.100000 9.821177 14.200000 10.200000 9.961425 14.200000 10.300000 10.121672 14.200000 10.400000 10.301920 14.200000 10.500000 10.502167 14.200000 10.600000 10.722415 14.200000 10.700000 10.962662 14.200000 10.800000 11.222910 14.200000 10.900000 11.503157 14.200000 11.000000 11.803405 14.200000 11.100000 12.123652 14.200000 11.200000 12.463900 14.200000 11.300000 12.824147 14.200000 11.400000 13.204395 14.200000 11.500000 13.604642 14.200000 11.600000 14.024890 14.200000 11.700000 14.465137 14.200000 11.800000 14.925385 14.200000 11.900000 15.405632 14.200000 12.000000 15.905880 14.200000 12.100000 16.426127 14.200000 12.200000 16.966375 14.200000 12.300000 17.526622 14.200000 12.400000 18.106870 14.200000 12.500000 18.707117 14.200000 12.600000 19.327365 14.200000 12.700000 19.967612 14.200000 12.800000 20.627860 14.200000 12.900000 21.308107 14.200000 13.000000 22.008355 14.200000 13.100000 22.728602 14.200000 13.200000 23.468850 14.200000 13.300000 24.229097 14.200000 13.400000 25.009345 14.200000 13.500000 25.809592 14.200000 13.600000 26.629840 14.200000 13.700000 27.470087 14.200000 13.800000 28.330335 14.200000 13.900000 29.210582 14.200000 14.000000 30.110830 14.200000 14.100000 31.031077 14.200000 14.200000 31.971325 14.200000 14.300000 32.931572 14.200000 14.400000 33.911820 14.200000 14.500000 34.912067 14.200000 14.600000 35.932315 14.200000 14.700000 36.972562 14.200000 14.800000 38.032810 14.200000 14.900000 39.113057 14.200000 15.000000 40.213305 14.300000 -5.000000 223.293973 14.300000 -4.900000 220.372417 14.300000 -4.800000 217.470860 14.300000 -4.700000 214.589303 14.300000 -4.600000 211.727747 14.300000 -4.500000 208.886190 14.300000 -4.400000 206.064633 14.300000 -4.300000 203.263077 14.300000 -4.200000 200.481520 14.300000 -4.100000 197.719963 14.300000 -4.000000 194.978407 14.300000 -3.900000 192.256850 14.300000 -3.800000 189.555293 14.300000 -3.700000 186.873737 14.300000 -3.600000 184.212180 14.300000 -3.500000 181.570623 14.300000 -3.400000 178.949067 14.300000 -3.300000 176.347510 14.300000 -3.200000 173.765953 14.300000 -3.100000 171.204397 14.300000 -3.000000 168.662840 14.300000 -2.900000 166.141283 14.300000 -2.800000 163.639726 14.300000 -2.700000 161.158170 14.300000 -2.600000 158.696613 14.300000 -2.500000 156.255056 14.300000 -2.400000 153.833500 14.300000 -2.300000 151.431943 14.300000 -2.200000 149.050386 14.300000 -2.100000 146.688830 14.300000 -2.000000 144.347273 14.300000 -1.900000 142.025716 14.300000 -1.800000 139.724160 14.300000 -1.700000 137.442603 14.300000 -1.600000 135.181046 14.300000 -1.500000 132.939490 14.300000 -1.400000 130.717933 14.300000 -1.300000 128.516376 14.300000 -1.200000 126.334820 14.300000 -1.100000 124.173263 14.300000 -1.000000 122.031706 14.300000 -0.900000 119.910150 14.300000 -0.800000 117.808593 14.300000 -0.700000 115.727036 14.300000 -0.600000 113.665479 14.300000 -0.500000 111.623923 14.300000 -0.400000 109.602366 14.300000 -0.300000 107.600809 14.300000 -0.200000 105.619253 14.300000 -0.100000 103.657696 14.300000 -0.000000 101.716139 14.300000 0.100000 99.794583 14.300000 0.200000 97.893026 14.300000 0.300000 96.011469 14.300000 0.400000 94.149913 14.300000 0.500000 92.308356 14.300000 0.600000 90.486799 14.300000 0.700000 88.685243 14.300000 0.800000 86.903686 14.300000 0.900000 85.142129 14.300000 1.000000 83.400573 14.300000 1.100000 81.679016 14.300000 1.200000 79.977459 14.300000 1.300000 78.295902 14.300000 1.400000 76.634346 14.300000 1.500000 74.992789 14.300000 1.600000 73.371232 14.300000 1.700000 71.769676 14.300000 1.800000 70.188119 14.300000 1.900000 68.626562 14.300000 2.000000 67.085006 14.300000 2.100000 65.563449 14.300000 2.200000 64.061892 14.300000 2.300000 62.580336 14.300000 2.400000 61.118779 14.300000 2.500000 59.677222 14.300000 2.600000 58.255666 14.300000 2.700000 56.854109 14.300000 2.800000 55.472552 14.300000 2.900000 54.110996 14.300000 3.000000 52.769439 14.300000 3.100000 51.447882 14.300000 3.200000 50.146326 14.300000 3.300000 48.864769 14.300000 3.400000 47.603212 14.300000 3.500000 46.361655 14.300000 3.600000 45.140099 14.300000 3.700000 43.938542 14.300000 3.800000 42.756985 14.300000 3.900000 41.595429 14.300000 4.000000 40.453872 14.300000 4.100000 39.332315 14.300000 4.200000 38.230759 14.300000 4.300000 37.149202 14.300000 4.400000 36.087645 14.300000 4.500000 35.046089 14.300000 4.600000 34.024532 14.300000 4.700000 33.022975 14.300000 4.800000 32.041419 14.300000 4.900000 31.079862 14.300000 5.000000 30.138305 14.300000 5.100000 29.216749 14.300000 5.200000 28.315192 14.300000 5.300000 27.433635 14.300000 5.400000 26.572079 14.300000 5.500000 25.730522 14.300000 5.600000 24.908965 14.300000 5.700000 24.107408 14.300000 5.800000 23.325852 14.300000 5.900000 22.564295 14.300000 6.000000 21.822738 14.300000 6.100000 21.101182 14.300000 6.200000 20.399625 14.300000 6.300000 19.718068 14.300000 6.400000 19.056512 14.300000 6.500000 18.414955 14.300000 6.600000 17.793398 14.300000 6.700000 17.191842 14.300000 6.800000 16.610285 14.300000 6.900000 16.048728 14.300000 7.000000 15.507172 14.300000 7.100000 14.985615 14.300000 7.200000 14.484058 14.300000 7.300000 14.002502 14.300000 7.400000 13.540945 14.300000 7.500000 13.099388 14.300000 7.600000 12.677831 14.300000 7.700000 12.276275 14.300000 7.800000 11.894718 14.300000 7.900000 11.533161 14.300000 8.000000 11.191605 14.300000 8.100000 10.870048 14.300000 8.200000 10.568491 14.300000 8.300000 10.286935 14.300000 8.400000 10.025378 14.300000 8.500000 9.783821 14.300000 8.600000 9.562265 14.300000 8.700000 9.360708 14.300000 8.800000 9.179151 14.300000 8.900000 9.017595 14.300000 9.000000 8.876038 14.300000 9.100000 8.754481 14.300000 9.200000 8.652925 14.300000 9.300000 8.571368 14.300000 9.400000 8.509811 14.300000 9.500000 8.468255 14.300000 9.600000 8.446698 14.300000 9.700000 8.445141 14.300000 9.800000 8.463584 14.300000 9.900000 8.502028 14.300000 10.000000 8.560471 14.300000 10.100000 8.638914 14.300000 10.200000 8.737358 14.300000 10.300000 8.855801 14.300000 10.400000 8.994244 14.300000 10.500000 9.152688 14.300000 10.600000 9.331131 14.300000 10.700000 9.529574 14.300000 10.800000 9.748018 14.300000 10.900000 9.986461 14.300000 11.000000 10.244904 14.300000 11.100000 10.523348 14.300000 11.200000 10.821791 14.300000 11.300000 11.140234 14.300000 11.400000 11.478678 14.300000 11.500000 11.837121 14.300000 11.600000 12.215564 14.300000 11.700000 12.614008 14.300000 11.800000 13.032451 14.300000 11.900000 13.470894 14.300000 12.000000 13.929337 14.300000 12.100000 14.407781 14.300000 12.200000 14.906224 14.300000 12.300000 15.424667 14.300000 12.400000 15.963111 14.300000 12.500000 16.521554 14.300000 12.600000 17.099997 14.300000 12.700000 17.698441 14.300000 12.800000 18.316884 14.300000 12.900000 18.955327 14.300000 13.000000 19.613771 14.300000 13.100000 20.292214 14.300000 13.200000 20.990657 14.300000 13.300000 21.709101 14.300000 13.400000 22.447544 14.300000 13.500000 23.205987 14.300000 13.600000 23.984431 14.300000 13.700000 24.782874 14.300000 13.800000 25.601317 14.300000 13.900000 26.439760 14.300000 14.000000 27.298204 14.300000 14.100000 28.176647 14.300000 14.200000 29.075090 14.300000 14.300000 29.993534 14.300000 14.400000 30.931977 14.300000 14.500000 31.890420 14.300000 14.600000 32.868864 14.300000 14.700000 33.867307 14.300000 14.800000 34.885750 14.300000 14.900000 35.924194 14.300000 15.000000 36.982637 14.400000 -5.000000 228.603904 14.400000 -4.900000 225.640027 14.400000 -4.800000 222.696149 14.400000 -4.700000 219.772271 14.400000 -4.600000 216.868394 14.400000 -4.500000 213.984516 14.400000 -4.400000 211.120639 14.400000 -4.300000 208.276761 14.400000 -4.200000 205.452883 14.400000 -4.100000 202.649006 14.400000 -4.000000 199.865128 14.400000 -3.900000 197.101251 14.400000 -3.800000 194.357373 14.400000 -3.700000 191.633495 14.400000 -3.600000 188.929618 14.400000 -3.500000 186.245740 14.400000 -3.400000 183.581863 14.400000 -3.300000 180.937985 14.400000 -3.200000 178.314107 14.400000 -3.100000 175.710230 14.400000 -3.000000 173.126352 14.400000 -2.900000 170.562475 14.400000 -2.800000 168.018597 14.400000 -2.700000 165.494719 14.400000 -2.600000 162.990842 14.400000 -2.500000 160.506964 14.400000 -2.400000 158.043087 14.400000 -2.300000 155.599209 14.400000 -2.200000 153.175331 14.400000 -2.100000 150.771454 14.400000 -2.000000 148.387576 14.400000 -1.900000 146.023699 14.400000 -1.800000 143.679821 14.400000 -1.700000 141.355943 14.400000 -1.600000 139.052066 14.400000 -1.500000 136.768188 14.400000 -1.400000 134.504311 14.400000 -1.300000 132.260433 14.400000 -1.200000 130.036555 14.400000 -1.100000 127.832678 14.400000 -1.000000 125.648800 14.400000 -0.900000 123.484923 14.400000 -0.800000 121.341045 14.400000 -0.700000 119.217167 14.400000 -0.600000 117.113290 14.400000 -0.500000 115.029412 14.400000 -0.400000 112.965535 14.400000 -0.300000 110.921657 14.400000 -0.200000 108.897779 14.400000 -0.100000 106.893902 14.400000 -0.000000 104.910024 14.400000 0.100000 102.946147 14.400000 0.200000 101.002269 14.400000 0.300000 99.078391 14.400000 0.400000 97.174514 14.400000 0.500000 95.290636 14.400000 0.600000 93.426759 14.400000 0.700000 91.582881 14.400000 0.800000 89.759003 14.400000 0.900000 87.955126 14.400000 1.000000 86.171248 14.400000 1.100000 84.407371 14.400000 1.200000 82.663493 14.400000 1.300000 80.939615 14.400000 1.400000 79.235738 14.400000 1.500000 77.551860 14.400000 1.600000 75.887983 14.400000 1.700000 74.244105 14.400000 1.800000 72.620227 14.400000 1.900000 71.016350 14.400000 2.000000 69.432472 14.400000 2.100000 67.868595 14.400000 2.200000 66.324717 14.400000 2.300000 64.800839 14.400000 2.400000 63.296962 14.400000 2.500000 61.813084 14.400000 2.600000 60.349207 14.400000 2.700000 58.905329 14.400000 2.800000 57.481451 14.400000 2.900000 56.077574 14.400000 3.000000 54.693696 14.400000 3.100000 53.329819 14.400000 3.200000 51.985941 14.400000 3.300000 50.662063 14.400000 3.400000 49.358186 14.400000 3.500000 48.074308 14.400000 3.600000 46.810431 14.400000 3.700000 45.566553 14.400000 3.800000 44.342675 14.400000 3.900000 43.138798 14.400000 4.000000 41.954920 14.400000 4.100000 40.791042 14.400000 4.200000 39.647165 14.400000 4.300000 38.523287 14.400000 4.400000 37.419410 14.400000 4.500000 36.335532 14.400000 4.600000 35.271654 14.400000 4.700000 34.227777 14.400000 4.800000 33.203899 14.400000 4.900000 32.200022 14.400000 5.000000 31.216144 14.400000 5.100000 30.252266 14.400000 5.200000 29.308389 14.400000 5.300000 28.384511 14.400000 5.400000 27.480634 14.400000 5.500000 26.596756 14.400000 5.600000 25.732878 14.400000 5.700000 24.889001 14.400000 5.800000 24.065123 14.400000 5.900000 23.261246 14.400000 6.000000 22.477368 14.400000 6.100000 21.713490 14.400000 6.200000 20.969613 14.400000 6.300000 20.245735 14.400000 6.400000 19.541858 14.400000 6.500000 18.857980 14.400000 6.600000 18.194102 14.400000 6.700000 17.550225 14.400000 6.800000 16.926347 14.400000 6.900000 16.322470 14.400000 7.000000 15.738592 14.400000 7.100000 15.174714 14.400000 7.200000 14.630837 14.400000 7.300000 14.106959 14.400000 7.400000 13.603082 14.400000 7.500000 13.119204 14.400000 7.600000 12.655326 14.400000 7.700000 12.211449 14.400000 7.800000 11.787571 14.400000 7.900000 11.383694 14.400000 8.000000 10.999816 14.400000 8.100000 10.635938 14.400000 8.200000 10.292061 14.400000 8.300000 9.968183 14.400000 8.400000 9.664306 14.400000 8.500000 9.380428 14.400000 8.600000 9.116550 14.400000 8.700000 8.872673 14.400000 8.800000 8.648795 14.400000 8.900000 8.444918 14.400000 9.000000 8.261040 14.400000 9.100000 8.097162 14.400000 9.200000 7.953285 14.400000 9.300000 7.829407 14.400000 9.400000 7.725530 14.400000 9.500000 7.641652 14.400000 9.600000 7.577774 14.400000 9.700000 7.533897 14.400000 9.800000 7.510019 14.400000 9.900000 7.506142 14.400000 10.000000 7.522264 14.400000 10.100000 7.558386 14.400000 10.200000 7.614509 14.400000 10.300000 7.690631 14.400000 10.400000 7.786754 14.400000 10.500000 7.902876 14.400000 10.600000 8.038998 14.400000 10.700000 8.195121 14.400000 10.800000 8.371243 14.400000 10.900000 8.567366 14.400000 11.000000 8.783488 14.400000 11.100000 9.019610 14.400000 11.200000 9.275733 14.400000 11.300000 9.551855 14.400000 11.400000 9.847978 14.400000 11.500000 10.164100 14.400000 11.600000 10.500222 14.400000 11.700000 10.856345 14.400000 11.800000 11.232467 14.400000 11.900000 11.628590 14.400000 12.000000 12.044712 14.400000 12.100000 12.480834 14.400000 12.200000 12.936957 14.400000 12.300000 13.413079 14.400000 12.400000 13.909202 14.400000 12.500000 14.425324 14.400000 12.600000 14.961446 14.400000 12.700000 15.517569 14.400000 12.800000 16.093691 14.400000 12.900000 16.689814 14.400000 13.000000 17.305936 14.400000 13.100000 17.942058 14.400000 13.200000 18.598181 14.400000 13.300000 19.274303 14.400000 13.400000 19.970425 14.400000 13.500000 20.686548 14.400000 13.600000 21.422670 14.400000 13.700000 22.178793 14.400000 13.800000 22.954915 14.400000 13.900000 23.751037 14.400000 14.000000 24.567160 14.400000 14.100000 25.403282 14.400000 14.200000 26.259405 14.400000 14.300000 27.135527 14.400000 14.400000 28.031649 14.400000 14.500000 28.947772 14.400000 14.600000 29.883894 14.400000 14.700000 30.840017 14.400000 14.800000 31.816139 14.400000 14.900000 32.812261 14.400000 15.000000 33.828384 14.500000 -5.000000 234.106251 14.500000 -4.900000 231.099536 14.500000 -4.800000 228.112821 14.500000 -4.700000 225.146105 14.500000 -4.600000 222.199390 14.500000 -4.500000 219.272675 14.500000 -4.400000 216.365960 14.500000 -4.300000 213.479244 14.500000 -4.200000 210.612529 14.500000 -4.100000 207.765814 14.500000 -4.000000 204.939099 14.500000 -3.900000 202.132383 14.500000 -3.800000 199.345668 14.500000 -3.700000 196.578953 14.500000 -3.600000 193.832238 14.500000 -3.500000 191.105522 14.500000 -3.400000 188.398807 14.500000 -3.300000 185.712092 14.500000 -3.200000 183.045377 14.500000 -3.100000 180.398661 14.500000 -3.000000 177.771946 14.500000 -2.900000 175.165231 14.500000 -2.800000 172.578515 14.500000 -2.700000 170.011800 14.500000 -2.600000 167.465085 14.500000 -2.500000 164.938370 14.500000 -2.400000 162.431654 14.500000 -2.300000 159.944939 14.500000 -2.200000 157.478224 14.500000 -2.100000 155.031509 14.500000 -2.000000 152.604793 14.500000 -1.900000 150.198078 14.500000 -1.800000 147.811363 14.500000 -1.700000 145.444648 14.500000 -1.600000 143.097932 14.500000 -1.500000 140.771217 14.500000 -1.400000 138.464502 14.500000 -1.300000 136.177787 14.500000 -1.200000 133.911071 14.500000 -1.100000 131.664356 14.500000 -1.000000 129.437641 14.500000 -0.900000 127.230926 14.500000 -0.800000 125.044210 14.500000 -0.700000 122.877495 14.500000 -0.600000 120.730780 14.500000 -0.500000 118.604064 14.500000 -0.400000 116.497349 14.500000 -0.300000 114.410634 14.500000 -0.200000 112.343919 14.500000 -0.100000 110.297203 14.500000 -0.000000 108.270488 14.500000 0.100000 106.263773 14.500000 0.200000 104.277058 14.500000 0.300000 102.310342 14.500000 0.400000 100.363627 14.500000 0.500000 98.436912 14.500000 0.600000 96.530197 14.500000 0.700000 94.643481 14.500000 0.800000 92.776766 14.500000 0.900000 90.930051 14.500000 1.000000 89.103336 14.500000 1.100000 87.296620 14.500000 1.200000 85.509905 14.500000 1.300000 83.743190 14.500000 1.400000 81.996475 14.500000 1.500000 80.269759 14.500000 1.600000 78.563044 14.500000 1.700000 76.876329 14.500000 1.800000 75.209614 14.500000 1.900000 73.562898 14.500000 2.000000 71.936183 14.500000 2.100000 70.329468 14.500000 2.200000 68.742752 14.500000 2.300000 67.176037 14.500000 2.400000 65.629322 14.500000 2.500000 64.102607 14.500000 2.600000 62.595891 14.500000 2.700000 61.109176 14.500000 2.800000 59.642461 14.500000 2.900000 58.195746 14.500000 3.000000 56.769030 14.500000 3.100000 55.362315 14.500000 3.200000 53.975600 14.500000 3.300000 52.608885 14.500000 3.400000 51.262169 14.500000 3.500000 49.935454 14.500000 3.600000 48.628739 14.500000 3.700000 47.342024 14.500000 3.800000 46.075308 14.500000 3.900000 44.828593 14.500000 4.000000 43.601878 14.500000 4.100000 42.395163 14.500000 4.200000 41.208447 14.500000 4.300000 40.041732 14.500000 4.400000 38.895017 14.500000 4.500000 37.768301 14.500000 4.600000 36.661586 14.500000 4.700000 35.574871 14.500000 4.800000 34.508156 14.500000 4.900000 33.461440 14.500000 5.000000 32.434725 14.500000 5.100000 31.428010 14.500000 5.200000 30.441295 14.500000 5.300000 29.474579 14.500000 5.400000 28.527864 14.500000 5.500000 27.601149 14.500000 5.600000 26.694434 14.500000 5.700000 25.807718 14.500000 5.800000 24.941003 14.500000 5.900000 24.094288 14.500000 6.000000 23.267573 14.500000 6.100000 22.460857 14.500000 6.200000 21.674142 14.500000 6.300000 20.907427 14.500000 6.400000 20.160712 14.500000 6.500000 19.433996 14.500000 6.600000 18.727281 14.500000 6.700000 18.040566 14.500000 6.800000 17.373851 14.500000 6.900000 16.727135 14.500000 7.000000 16.100420 14.500000 7.100000 15.493705 14.500000 7.200000 14.906989 14.500000 7.300000 14.340274 14.500000 7.400000 13.793559 14.500000 7.500000 13.266844 14.500000 7.600000 12.760128 14.500000 7.700000 12.273413 14.500000 7.800000 11.806698 14.500000 7.900000 11.359983 14.500000 8.000000 10.933267 14.500000 8.100000 10.526552 14.500000 8.200000 10.139837 14.500000 8.300000 9.773122 14.500000 8.400000 9.426406 14.500000 8.500000 9.099691 14.500000 8.600000 8.792976 14.500000 8.700000 8.506261 14.500000 8.800000 8.239545 14.500000 8.900000 7.992830 14.500000 9.000000 7.766115 14.500000 9.100000 7.559400 14.500000 9.200000 7.372684 14.500000 9.300000 7.205969 14.500000 9.400000 7.059254 14.500000 9.500000 6.932539 14.500000 9.600000 6.825823 14.500000 9.700000 6.739108 14.500000 9.800000 6.672393 14.500000 9.900000 6.625677 14.500000 10.000000 6.598962 14.500000 10.100000 6.592247 14.500000 10.200000 6.605532 14.500000 10.300000 6.638816 14.500000 10.400000 6.692101 14.500000 10.500000 6.765386 14.500000 10.600000 6.858671 14.500000 10.700000 6.971955 14.500000 10.800000 7.105240 14.500000 10.900000 7.258525 14.500000 11.000000 7.431810 14.500000 11.100000 7.625094 14.500000 11.200000 7.838379 14.500000 11.300000 8.071664 14.500000 11.400000 8.324949 14.500000 11.500000 8.598233 14.500000 11.600000 8.891518 14.500000 11.700000 9.204803 14.500000 11.800000 9.538088 14.500000 11.900000 9.891372 14.500000 12.000000 10.264657 14.500000 12.100000 10.657942 14.500000 12.200000 11.071226 14.500000 12.300000 11.504511 14.500000 12.400000 11.957796 14.500000 12.500000 12.431081 14.500000 12.600000 12.924365 14.500000 12.700000 13.437650 14.500000 12.800000 13.970935 14.500000 12.900000 14.524220 14.500000 13.000000 15.097504 14.500000 13.100000 15.690789 14.500000 13.200000 16.304074 14.500000 13.300000 16.937359 14.500000 13.400000 17.590643 14.500000 13.500000 18.263928 14.500000 13.600000 18.957213 14.500000 13.700000 19.670498 14.500000 13.800000 20.403782 14.500000 13.900000 21.157067 14.500000 14.000000 21.930352 14.500000 14.100000 22.723637 14.500000 14.200000 23.536921 14.500000 14.300000 24.370206 14.500000 14.400000 25.223491 14.500000 14.500000 26.096776 14.500000 14.600000 26.990060 14.500000 14.700000 27.903345 14.500000 14.800000 28.836630 14.500000 14.900000 29.789914 14.500000 15.000000 30.763199 14.600000 -5.000000 239.813459 14.600000 -4.900000 236.763390 14.600000 -4.800000 233.733320 14.600000 -4.700000 230.723250 14.600000 -4.600000 227.733181 14.600000 -4.500000 224.763111 14.600000 -4.400000 221.813041 14.600000 -4.300000 218.882972 14.600000 -4.200000 215.972902 14.600000 -4.100000 213.082832 14.600000 -4.000000 210.212763 14.600000 -3.900000 207.362693 14.600000 -3.800000 204.532623 14.600000 -3.700000 201.722554 14.600000 -3.600000 198.932484 14.600000 -3.500000 196.162414 14.600000 -3.400000 193.412345 14.600000 -3.300000 190.682275 14.600000 -3.200000 187.972205 14.600000 -3.100000 185.282136 14.600000 -3.000000 182.612066 14.600000 -2.900000 179.961996 14.600000 -2.800000 177.331927 14.600000 -2.700000 174.721857 14.600000 -2.600000 172.131787 14.600000 -2.500000 169.561718 14.600000 -2.400000 167.011648 14.600000 -2.300000 164.481578 14.600000 -2.200000 161.971509 14.600000 -2.100000 159.481439 14.600000 -2.000000 157.011370 14.600000 -1.900000 154.561300 14.600000 -1.800000 152.131230 14.600000 -1.700000 149.721161 14.600000 -1.600000 147.331091 14.600000 -1.500000 144.961021 14.600000 -1.400000 142.610952 14.600000 -1.300000 140.280882 14.600000 -1.200000 137.970812 14.600000 -1.100000 135.680743 14.600000 -1.000000 133.410673 14.600000 -0.900000 131.160603 14.600000 -0.800000 128.930534 14.600000 -0.700000 126.720464 14.600000 -0.600000 124.530394 14.600000 -0.500000 122.360325 14.600000 -0.400000 120.210255 14.600000 -0.300000 118.080185 14.600000 -0.200000 115.970116 14.600000 -0.100000 113.880046 14.600000 -0.000000 111.809976 14.600000 0.100000 109.759907 14.600000 0.200000 107.729837 14.600000 0.300000 105.719767 14.600000 0.400000 103.729698 14.600000 0.500000 101.759628 14.600000 0.600000 99.809558 14.600000 0.700000 97.879489 14.600000 0.800000 95.969419 14.600000 0.900000 94.079350 14.600000 1.000000 92.209280 14.600000 1.100000 90.359210 14.600000 1.200000 88.529141 14.600000 1.300000 86.719071 14.600000 1.400000 84.929001 14.600000 1.500000 83.158932 14.600000 1.600000 81.408862 14.600000 1.700000 79.678792 14.600000 1.800000 77.968723 14.600000 1.900000 76.278653 14.600000 2.000000 74.608583 14.600000 2.100000 72.958514 14.600000 2.200000 71.328444 14.600000 2.300000 69.718374 14.600000 2.400000 68.128305 14.600000 2.500000 66.558235 14.600000 2.600000 65.008165 14.600000 2.700000 63.478096 14.600000 2.800000 61.968026 14.600000 2.900000 60.477956 14.600000 3.000000 59.007887 14.600000 3.100000 57.557817 14.600000 3.200000 56.127747 14.600000 3.300000 54.717678 14.600000 3.400000 53.327608 14.600000 3.500000 51.957538 14.600000 3.600000 50.607469 14.600000 3.700000 49.277399 14.600000 3.800000 47.967330 14.600000 3.900000 46.677260 14.600000 4.000000 45.407190 14.600000 4.100000 44.157121 14.600000 4.200000 42.927051 14.600000 4.300000 41.716981 14.600000 4.400000 40.526912 14.600000 4.500000 39.356842 14.600000 4.600000 38.206772 14.600000 4.700000 37.076703 14.600000 4.800000 35.966633 14.600000 4.900000 34.876563 14.600000 5.000000 33.806494 14.600000 5.100000 32.756424 14.600000 5.200000 31.726354 14.600000 5.300000 30.716285 14.600000 5.400000 29.726215 14.600000 5.500000 28.756145 14.600000 5.600000 27.806076 14.600000 5.700000 26.876006 14.600000 5.800000 25.965936 14.600000 5.900000 25.075867 14.600000 6.000000 24.205797 14.600000 6.100000 23.355727 14.600000 6.200000 22.525658 14.600000 6.300000 21.715588 14.600000 6.400000 20.925518 14.600000 6.500000 20.155449 14.600000 6.600000 19.405379 14.600000 6.700000 18.675310 14.600000 6.800000 17.965240 14.600000 6.900000 17.275170 14.600000 7.000000 16.605101 14.600000 7.100000 15.955031 14.600000 7.200000 15.324961 14.600000 7.300000 14.714892 14.600000 7.400000 14.124822 14.600000 7.500000 13.554752 14.600000 7.600000 13.004683 14.600000 7.700000 12.474613 14.600000 7.800000 11.964543 14.600000 7.900000 11.474474 14.600000 8.000000 11.004404 14.600000 8.100000 10.554334 14.600000 8.200000 10.124265 14.600000 8.300000 9.714195 14.600000 8.400000 9.324125 14.600000 8.500000 8.954056 14.600000 8.600000 8.603986 14.600000 8.700000 8.273916 14.600000 8.800000 7.963847 14.600000 8.900000 7.673777 14.600000 9.000000 7.403707 14.600000 9.100000 7.153638 14.600000 9.200000 6.923568 14.600000 9.300000 6.713498 14.600000 9.400000 6.523429 14.600000 9.500000 6.353359 14.600000 9.600000 6.203289 14.600000 9.700000 6.073220 14.600000 9.800000 5.963150 14.600000 9.900000 5.873081 14.600000 10.000000 5.803011 14.600000 10.100000 5.752941 14.600000 10.200000 5.722872 14.600000 10.300000 5.712802 14.600000 10.400000 5.722732 14.600000 10.500000 5.752663 14.600000 10.600000 5.802593 14.600000 10.700000 5.872523 14.600000 10.800000 5.962454 14.600000 10.900000 6.072384 14.600000 11.000000 6.202314 14.600000 11.100000 6.352245 14.600000 11.200000 6.522175 14.600000 11.300000 6.712105 14.600000 11.400000 6.922036 14.600000 11.500000 7.151966 14.600000 11.600000 7.401896 14.600000 11.700000 7.671827 14.600000 11.800000 7.961757 14.600000 11.900000 8.271687 14.600000 12.000000 8.601618 14.600000 12.100000 8.951548 14.600000 12.200000 9.321478 14.600000 12.300000 9.711409 14.600000 12.400000 10.121339 14.600000 12.500000 10.551269 14.600000 12.600000 11.001200 14.600000 12.700000 11.471130 14.600000 12.800000 11.961061 14.600000 12.900000 12.470991 14.600000 13.000000 13.000921 14.600000 13.100000 13.550852 14.600000 13.200000 14.120782 14.600000 13.300000 14.710712 14.600000 13.400000 15.320643 14.600000 13.500000 15.950573 14.600000 13.600000 16.600503 14.600000 13.700000 17.270434 14.600000 13.800000 17.960364 14.600000 13.900000 18.670294 14.600000 14.000000 19.400225 14.600000 14.100000 20.150155 14.600000 14.200000 20.920085 14.600000 14.300000 21.710016 14.600000 14.400000 22.519946 14.600000 14.500000 23.349876 14.600000 14.600000 24.199807 14.600000 14.700000 25.069737 14.600000 14.800000 25.959667 14.600000 14.900000 26.869598 14.600000 15.000000 27.799528 14.700000 -5.000000 245.737673 14.700000 -4.900000 242.643732 14.700000 -4.800000 239.569792 14.700000 -4.700000 236.515851 14.700000 -4.600000 233.481910 14.700000 -4.500000 230.467969 14.700000 -4.400000 227.474028 14.700000 -4.300000 224.500088 14.700000 -4.200000 221.546147 14.700000 -4.100000 218.612206 14.700000 -4.000000 215.698265 14.700000 -3.900000 212.804325 14.700000 -3.800000 209.930384 14.700000 -3.700000 207.076443 14.700000 -3.600000 204.242502 14.700000 -3.500000 201.428561 14.700000 -3.400000 198.634621 14.700000 -3.300000 195.860680 14.700000 -3.200000 193.106739 14.700000 -3.100000 190.372798 14.700000 -3.000000 187.658857 14.700000 -2.900000 184.964917 14.700000 -2.800000 182.290976 14.700000 -2.700000 179.637035 14.700000 -2.600000 177.003094 14.700000 -2.500000 174.389153 14.700000 -2.400000 171.795213 14.700000 -2.300000 169.221272 14.700000 -2.200000 166.667331 14.700000 -2.100000 164.133390 14.700000 -2.000000 161.619450 14.700000 -1.900000 159.125509 14.700000 -1.800000 156.651568 14.700000 -1.700000 154.197627 14.700000 -1.600000 151.763686 14.700000 -1.500000 149.349746 14.700000 -1.400000 146.955805 14.700000 -1.300000 144.581864 14.700000 -1.200000 142.227923 14.700000 -1.100000 139.893982 14.700000 -1.000000 137.580042 14.700000 -0.900000 135.286101 14.700000 -0.800000 133.012160 14.700000 -0.700000 130.758219 14.700000 -0.600000 128.524278 14.700000 -0.500000 126.310338 14.700000 -0.400000 124.116397 14.700000 -0.300000 121.942456 14.700000 -0.200000 119.788515 14.700000 -0.100000 117.654575 14.700000 -0.000000 115.540634 14.700000 0.100000 113.446693 14.700000 0.200000 111.372752 14.700000 0.300000 109.318811 14.700000 0.400000 107.284871 14.700000 0.500000 105.270930 14.700000 0.600000 103.276989 14.700000 0.700000 101.303048 14.700000 0.800000 99.349107 14.700000 0.900000 97.415167 14.700000 1.000000 95.501226 14.700000 1.100000 93.607285 14.700000 1.200000 91.733344 14.700000 1.300000 89.879403 14.700000 1.400000 88.045463 14.700000 1.500000 86.231522 14.700000 1.600000 84.437581 14.700000 1.700000 82.663640 14.700000 1.800000 80.909700 14.700000 1.900000 79.175759 14.700000 2.000000 77.461818 14.700000 2.100000 75.767877 14.700000 2.200000 74.093936 14.700000 2.300000 72.439996 14.700000 2.400000 70.806055 14.700000 2.500000 69.192114 14.700000 2.600000 67.598173 14.700000 2.700000 66.024232 14.700000 2.800000 64.470292 14.700000 2.900000 62.936351 14.700000 3.000000 61.422410 14.700000 3.100000 59.928469 14.700000 3.200000 58.454528 14.700000 3.300000 57.000588 14.700000 3.400000 55.566647 14.700000 3.500000 54.152706 14.700000 3.600000 52.758765 14.700000 3.700000 51.384825 14.700000 3.800000 50.030884 14.700000 3.900000 48.696943 14.700000 4.000000 47.383002 14.700000 4.100000 46.089061 14.700000 4.200000 44.815121 14.700000 4.300000 43.561180 14.700000 4.400000 42.327239 14.700000 4.500000 41.113298 14.700000 4.600000 39.919357 14.700000 4.700000 38.745417 14.700000 4.800000 37.591476 14.700000 4.900000 36.457535 14.700000 5.000000 35.343594 14.700000 5.100000 34.249653 14.700000 5.200000 33.175713 14.700000 5.300000 32.121772 14.700000 5.400000 31.087831 14.700000 5.500000 30.073890 14.700000 5.600000 29.079950 14.700000 5.700000 28.106009 14.700000 5.800000 27.152068 14.700000 5.900000 26.218127 14.700000 6.000000 25.304186 14.700000 6.100000 24.410246 14.700000 6.200000 23.536305 14.700000 6.300000 22.682364 14.700000 6.400000 21.848423 14.700000 6.500000 21.034482 14.700000 6.600000 20.240542 14.700000 6.700000 19.466601 14.700000 6.800000 18.712660 14.700000 6.900000 17.978719 14.700000 7.000000 17.264778 14.700000 7.100000 16.570838 14.700000 7.200000 15.896897 14.700000 7.300000 15.242956 14.700000 7.400000 14.609015 14.700000 7.500000 13.995075 14.700000 7.600000 13.401134 14.700000 7.700000 12.827193 14.700000 7.800000 12.273252 14.700000 7.900000 11.739311 14.700000 8.000000 11.225371 14.700000 8.100000 10.731430 14.700000 8.200000 10.257489 14.700000 8.300000 9.803548 14.700000 8.400000 9.369607 14.700000 8.500000 8.955667 14.700000 8.600000 8.561726 14.700000 8.700000 8.187785 14.700000 8.800000 7.833844 14.700000 8.900000 7.499903 14.700000 9.000000 7.185963 14.700000 9.100000 6.892022 14.700000 9.200000 6.618081 14.700000 9.300000 6.364140 14.700000 9.400000 6.130200 14.700000 9.500000 5.916259 14.700000 9.600000 5.722318 14.700000 9.700000 5.548377 14.700000 9.800000 5.394436 14.700000 9.900000 5.260496 14.700000 10.000000 5.146555 14.700000 10.100000 5.052614 14.700000 10.200000 4.978673 14.700000 10.300000 4.924732 14.700000 10.400000 4.890792 14.700000 10.500000 4.876851 14.700000 10.600000 4.882910 14.700000 10.700000 4.908969 14.700000 10.800000 4.955028 14.700000 10.900000 5.021088 14.700000 11.000000 5.107147 14.700000 11.100000 5.213206 14.700000 11.200000 5.339265 14.700000 11.300000 5.485325 14.700000 11.400000 5.651384 14.700000 11.500000 5.837443 14.700000 11.600000 6.043502 14.700000 11.700000 6.269561 14.700000 11.800000 6.515621 14.700000 11.900000 6.781680 14.700000 12.000000 7.067739 14.700000 12.100000 7.373798 14.700000 12.200000 7.699857 14.700000 12.300000 8.045917 14.700000 12.400000 8.411976 14.700000 12.500000 8.798035 14.700000 12.600000 9.204094 14.700000 12.700000 9.630153 14.700000 12.800000 10.076213 14.700000 12.900000 10.542272 14.700000 13.000000 11.028331 14.700000 13.100000 11.534390 14.700000 13.200000 12.060450 14.700000 13.300000 12.606509 14.700000 13.400000 13.172568 14.700000 13.500000 13.758627 14.700000 13.600000 14.364686 14.700000 13.700000 14.990746 14.700000 13.800000 15.636805 14.700000 13.900000 16.302864 14.700000 14.000000 16.988923 14.700000 14.100000 17.694982 14.700000 14.200000 18.421042 14.700000 14.300000 19.167101 14.700000 14.400000 19.933160 14.700000 14.500000 20.719219 14.700000 14.600000 21.525279 14.700000 14.700000 22.351338 14.700000 14.800000 23.197397 14.700000 14.900000 24.063456 14.700000 15.000000 24.949515 14.800000 -5.000000 251.890650 14.800000 -4.900000 248.752321 14.800000 -4.800000 245.633993 14.800000 -4.700000 242.535664 14.800000 -4.600000 239.457335 14.800000 -4.500000 236.399007 14.800000 -4.400000 233.360678 14.800000 -4.300000 230.342349 14.800000 -4.200000 227.344021 14.800000 -4.100000 224.365692 14.800000 -4.000000 221.407363 14.800000 -3.900000 218.469035 14.800000 -3.800000 215.550706 14.800000 -3.700000 212.652378 14.800000 -3.600000 209.774049 14.800000 -3.500000 206.915720 14.800000 -3.400000 204.077392 14.800000 -3.300000 201.259063 14.800000 -3.200000 198.460734 14.800000 -3.100000 195.682406 14.800000 -3.000000 192.924077 14.800000 -2.900000 190.185748 14.800000 -2.800000 187.467420 14.800000 -2.700000 184.769091 14.800000 -2.600000 182.090762 14.800000 -2.500000 179.432434 14.800000 -2.400000 176.794105 14.800000 -2.300000 174.175776 14.800000 -2.200000 171.577448 14.800000 -2.100000 168.999119 14.800000 -2.000000 166.440790 14.800000 -1.900000 163.902462 14.800000 -1.800000 161.384133 14.800000 -1.700000 158.885804 14.800000 -1.600000 156.407476 14.800000 -1.500000 153.949147 14.800000 -1.400000 151.510818 14.800000 -1.300000 149.092490 14.800000 -1.200000 146.694161 14.800000 -1.100000 144.315832 14.800000 -1.000000 141.957504 14.800000 -0.900000 139.619175 14.800000 -0.800000 137.300846 14.800000 -0.700000 135.002518 14.800000 -0.600000 132.724189 14.800000 -0.500000 130.465860 14.800000 -0.400000 128.227532 14.800000 -0.300000 126.009203 14.800000 -0.200000 123.810874 14.800000 -0.100000 121.632546 14.800000 -0.000000 119.474217 14.800000 0.100000 117.335888 14.800000 0.200000 115.217560 14.800000 0.300000 113.119231 14.800000 0.400000 111.040902 14.800000 0.500000 108.982574 14.800000 0.600000 106.944245 14.800000 0.700000 104.925916 14.800000 0.800000 102.927588 14.800000 0.900000 100.949259 14.800000 1.000000 98.990930 14.800000 1.100000 97.052602 14.800000 1.200000 95.134273 14.800000 1.300000 93.235944 14.800000 1.400000 91.357616 14.800000 1.500000 89.499287 14.800000 1.600000 87.660958 14.800000 1.700000 85.842630 14.800000 1.800000 84.044301 14.800000 1.900000 82.265972 14.800000 2.000000 80.507644 14.800000 2.100000 78.769315 14.800000 2.200000 77.050986 14.800000 2.300000 75.352658 14.800000 2.400000 73.674329 14.800000 2.500000 72.016001 14.800000 2.600000 70.377672 14.800000 2.700000 68.759343 14.800000 2.800000 67.161015 14.800000 2.900000 65.582686 14.800000 3.000000 64.024357 14.800000 3.100000 62.486029 14.800000 3.200000 60.967700 14.800000 3.300000 59.469371 14.800000 3.400000 57.991043 14.800000 3.500000 56.532714 14.800000 3.600000 55.094385 14.800000 3.700000 53.676057 14.800000 3.800000 52.277728 14.800000 3.900000 50.899399 14.800000 4.000000 49.541071 14.800000 4.100000 48.202742 14.800000 4.200000 46.884413 14.800000 4.300000 45.586085 14.800000 4.400000 44.307756 14.800000 4.500000 43.049427 14.800000 4.600000 41.811099 14.800000 4.700000 40.592770 14.800000 4.800000 39.394441 14.800000 4.900000 38.216113 14.800000 5.000000 37.057784 14.800000 5.100000 35.919455 14.800000 5.200000 34.801127 14.800000 5.300000 33.702798 14.800000 5.400000 32.624469 14.800000 5.500000 31.566141 14.800000 5.600000 30.527812 14.800000 5.700000 29.509483 14.800000 5.800000 28.511155 14.800000 5.900000 27.532826 14.800000 6.000000 26.574497 14.800000 6.100000 25.636169 14.800000 6.200000 24.717840 14.800000 6.300000 23.819511 14.800000 6.400000 22.941183 14.800000 6.500000 22.082854 14.800000 6.600000 21.244525 14.800000 6.700000 20.426197 14.800000 6.800000 19.627868 14.800000 6.900000 18.849539 14.800000 7.000000 18.091211 14.800000 7.100000 17.352882 14.800000 7.200000 16.634553 14.800000 7.300000 15.936225 14.800000 7.400000 15.257896 14.800000 7.500000 14.599567 14.800000 7.600000 13.961239 14.800000 7.700000 13.342910 14.800000 7.800000 12.744581 14.800000 7.900000 12.166253 14.800000 8.000000 11.607924 14.800000 8.100000 11.069595 14.800000 8.200000 10.551267 14.800000 8.300000 10.052938 14.800000 8.400000 9.574610 14.800000 8.500000 9.116281 14.800000 8.600000 8.677952 14.800000 8.700000 8.259624 14.800000 8.800000 7.861295 14.800000 8.900000 7.482966 14.800000 9.000000 7.124638 14.800000 9.100000 6.786309 14.800000 9.200000 6.467980 14.800000 9.300000 6.169652 14.800000 9.400000 5.891323 14.800000 9.500000 5.632994 14.800000 9.600000 5.394666 14.800000 9.700000 5.176337 14.800000 9.800000 4.978008 14.800000 9.900000 4.799680 14.800000 10.000000 4.641351 14.800000 10.100000 4.503022 14.800000 10.200000 4.384694 14.800000 10.300000 4.286365 14.800000 10.400000 4.208036 14.800000 10.500000 4.149708 14.800000 10.600000 4.111379 14.800000 10.700000 4.093050 14.800000 10.800000 4.094722 14.800000 10.900000 4.116393 14.800000 11.000000 4.158064 14.800000 11.100000 4.219736 14.800000 11.200000 4.301407 14.800000 11.300000 4.403078 14.800000 11.400000 4.524750 14.800000 11.500000 4.666421 14.800000 11.600000 4.828092 14.800000 11.700000 5.009764 14.800000 11.800000 5.211435 14.800000 11.900000 5.433106 14.800000 12.000000 5.674778 14.800000 12.100000 5.936449 14.800000 12.200000 6.218120 14.800000 12.300000 6.519792 14.800000 12.400000 6.841463 14.800000 12.500000 7.183134 14.800000 12.600000 7.544806 14.800000 12.700000 7.926477 14.800000 12.800000 8.328148 14.800000 12.900000 8.749820 14.800000 13.000000 9.191491 14.800000 13.100000 9.653162 14.800000 13.200000 10.134834 14.800000 13.300000 10.636505 14.800000 13.400000 11.158176 14.800000 13.500000 11.699848 14.800000 13.600000 12.261519 14.800000 13.700000 12.843190 14.800000 13.800000 13.444862 14.800000 13.900000 14.066533 14.800000 14.000000 14.708204 14.800000 14.100000 15.369876 14.800000 14.200000 16.051547 14.800000 14.300000 16.753219 14.800000 14.400000 17.474890 14.800000 14.500000 18.216561 14.800000 14.600000 18.978233 14.800000 14.700000 19.759904 14.800000 14.800000 20.561575 14.800000 14.900000 21.383247 14.800000 15.000000 22.224918 14.900000 -5.000000 258.283675 14.900000 -4.900000 255.100442 14.900000 -4.800000 251.937209 14.900000 -4.700000 248.793976 14.900000 -4.600000 245.670742 14.900000 -4.500000 242.567509 14.900000 -4.400000 239.484276 14.900000 -4.300000 236.421042 14.900000 -4.200000 233.377809 14.900000 -4.100000 230.354576 14.900000 -4.000000 227.351343 14.900000 -3.900000 224.368109 14.900000 -3.800000 221.404876 14.900000 -3.700000 218.461643 14.900000 -3.600000 215.538410 14.900000 -3.500000 212.635176 14.900000 -3.400000 209.751943 14.900000 -3.300000 206.888710 14.900000 -3.200000 204.045476 14.900000 -3.100000 201.222243 14.900000 -3.000000 198.419010 14.900000 -2.900000 195.635777 14.900000 -2.800000 192.872543 14.900000 -2.700000 190.129310 14.900000 -2.600000 187.406077 14.900000 -2.500000 184.702844 14.900000 -2.400000 182.019610 14.900000 -2.300000 179.356377 14.900000 -2.200000 176.713144 14.900000 -2.100000 174.089910 14.900000 -2.000000 171.486677 14.900000 -1.900000 168.903444 14.900000 -1.800000 166.340211 14.900000 -1.700000 163.796977 14.900000 -1.600000 161.273744 14.900000 -1.500000 158.770511 14.900000 -1.400000 156.287278 14.900000 -1.300000 153.824044 14.900000 -1.200000 151.380811 14.900000 -1.100000 148.957578 14.900000 -1.000000 146.554345 14.900000 -0.900000 144.171111 14.900000 -0.800000 141.807878 14.900000 -0.700000 139.464645 14.900000 -0.600000 137.141411 14.900000 -0.500000 134.838178 14.900000 -0.400000 132.554945 14.900000 -0.300000 130.291712 14.900000 -0.200000 128.048478 14.900000 -0.100000 125.825245 14.900000 -0.000000 123.622012 14.900000 0.100000 121.438779 14.900000 0.200000 119.275545 14.900000 0.300000 117.132312 14.900000 0.400000 115.009079 14.900000 0.500000 112.905845 14.900000 0.600000 110.822612 14.900000 0.700000 108.759379 14.900000 0.800000 106.716146 14.900000 0.900000 104.692912 14.900000 1.000000 102.689679 14.900000 1.100000 100.706446 14.900000 1.200000 98.743213 14.900000 1.300000 96.799979 14.900000 1.400000 94.876746 14.900000 1.500000 92.973513 14.900000 1.600000 91.090279 14.900000 1.700000 89.227046 14.900000 1.800000 87.383813 14.900000 1.900000 85.560580 14.900000 2.000000 83.757346 14.900000 2.100000 81.974113 14.900000 2.200000 80.210880 14.900000 2.300000 78.467647 14.900000 2.400000 76.744413 14.900000 2.500000 75.041180 14.900000 2.600000 73.357947 14.900000 2.700000 71.694713 14.900000 2.800000 70.051480 14.900000 2.900000 68.428247 14.900000 3.000000 66.825014 14.900000 3.100000 65.241780 14.900000 3.200000 63.678547 14.900000 3.300000 62.135314 14.900000 3.400000 60.612081 14.900000 3.500000 59.108847 14.900000 3.600000 57.625614 14.900000 3.700000 56.162381 14.900000 3.800000 54.719148 14.900000 3.900000 53.295914 14.900000 4.000000 51.892681 14.900000 4.100000 50.509448 14.900000 4.200000 49.146214 14.900000 4.300000 47.802981 14.900000 4.400000 46.479748 14.900000 4.500000 45.176515 14.900000 4.600000 43.893281 14.900000 4.700000 42.630048 14.900000 4.800000 41.386815 14.900000 4.900000 40.163582 14.900000 5.000000 38.960348 14.900000 5.100000 37.777115 14.900000 5.200000 36.613882 14.900000 5.300000 35.470648 14.900000 5.400000 34.347415 14.900000 5.500000 33.244182 14.900000 5.600000 32.160949 14.900000 5.700000 31.097715 14.900000 5.800000 30.054482 14.900000 5.900000 29.031249 14.900000 6.000000 28.028016 14.900000 6.100000 27.044782 14.900000 6.200000 26.081549 14.900000 6.300000 25.138316 14.900000 6.400000 24.215082 14.900000 6.500000 23.311849 14.900000 6.600000 22.428616 14.900000 6.700000 21.565383 14.900000 6.800000 20.722149 14.900000 6.900000 19.898916 14.900000 7.000000 19.095683 14.900000 7.100000 18.312450 14.900000 7.200000 17.549216 14.900000 7.300000 16.805983 14.900000 7.400000 16.082750 14.900000 7.500000 15.379516 14.900000 7.600000 14.696283 14.900000 7.700000 14.033050 14.900000 7.800000 13.389817 14.900000 7.900000 12.766583 14.900000 8.000000 12.163350 14.900000 8.100000 11.580117 14.900000 8.200000 11.016884 14.900000 8.300000 10.473650 14.900000 8.400000 9.950417 14.900000 8.500000 9.447184 14.900000 8.600000 8.963951 14.900000 8.700000 8.500717 14.900000 8.800000 8.057484 14.900000 8.900000 7.634251 14.900000 9.000000 7.231017 14.900000 9.100000 6.847784 14.900000 9.200000 6.484551 14.900000 9.300000 6.141318 14.900000 9.400000 5.818084 14.900000 9.500000 5.514851 14.900000 9.600000 5.231618 14.900000 9.700000 4.968385 14.900000 9.800000 4.725151 14.900000 9.900000 4.501918 14.900000 10.000000 4.298685 14.900000 10.100000 4.115451 14.900000 10.200000 3.952218 14.900000 10.300000 3.808985 14.900000 10.400000 3.685752 14.900000 10.500000 3.582518 14.900000 10.600000 3.499285 14.900000 10.700000 3.436052 14.900000 10.800000 3.392819 14.900000 10.900000 3.369585 14.900000 11.000000 3.366352 14.900000 11.100000 3.383119 14.900000 11.200000 3.419885 14.900000 11.300000 3.476652 14.900000 11.400000 3.553419 14.900000 11.500000 3.650186 14.900000 11.600000 3.766952 14.900000 11.700000 3.903719 14.900000 11.800000 4.060486 14.900000 11.900000 4.237253 14.900000 12.000000 4.434019 14.900000 12.100000 4.650786 14.900000 12.200000 4.887553 14.900000 12.300000 5.144319 14.900000 12.400000 5.421086 14.900000 12.500000 5.717853 14.900000 12.600000 6.034620 14.900000 12.700000 6.371386 14.900000 12.800000 6.728153 14.900000 12.900000 7.104920 14.900000 13.000000 7.501687 14.900000 13.100000 7.918453 14.900000 13.200000 8.355220 14.900000 13.300000 8.811987 14.900000 13.400000 9.288754 14.900000 13.500000 9.785520 14.900000 13.600000 10.302287 14.900000 13.700000 10.839054 14.900000 13.800000 11.395820 14.900000 13.900000 11.972587 14.900000 14.000000 12.569354 14.900000 14.100000 13.186121 14.900000 14.200000 13.822887 14.900000 14.300000 14.479654 14.900000 14.400000 15.156421 14.900000 14.500000 15.853188 14.900000 14.600000 16.569954 14.900000 14.700000 17.306721 14.900000 14.800000 18.063488 14.900000 14.900000 18.840254 14.900000 15.000000 19.637021 15.000000 -5.000000 264.927485 15.000000 -4.900000 261.698830 15.000000 -4.800000 258.490175 15.000000 -4.700000 255.301521 15.000000 -4.600000 252.132866 15.000000 -4.500000 248.984211 15.000000 -4.400000 245.855557 15.000000 -4.300000 242.746902 15.000000 -4.200000 239.658248 15.000000 -4.100000 236.589593 15.000000 -4.000000 233.540938 15.000000 -3.900000 230.512284 15.000000 -3.800000 227.503629 15.000000 -3.700000 224.514975 15.000000 -3.600000 221.546320 15.000000 -3.500000 218.597665 15.000000 -3.400000 215.669011 15.000000 -3.300000 212.760356 15.000000 -3.200000 209.871701 15.000000 -3.100000 207.003047 15.000000 -3.000000 204.154392 15.000000 -2.900000 201.325738 15.000000 -2.800000 198.517083 15.000000 -2.700000 195.728428 15.000000 -2.600000 192.959774 15.000000 -2.500000 190.211119 15.000000 -2.400000 187.482464 15.000000 -2.300000 184.773810 15.000000 -2.200000 182.085155 15.000000 -2.100000 179.416501 15.000000 -2.000000 176.767846 15.000000 -1.900000 174.139191 15.000000 -1.800000 171.530537 15.000000 -1.700000 168.941882 15.000000 -1.600000 166.373228 15.000000 -1.500000 163.824573 15.000000 -1.400000 161.295918 15.000000 -1.300000 158.787264 15.000000 -1.200000 156.298609 15.000000 -1.100000 153.829954 15.000000 -1.000000 151.381300 15.000000 -0.900000 148.952645 15.000000 -0.800000 146.543991 15.000000 -0.700000 144.155336 15.000000 -0.600000 141.786681 15.000000 -0.500000 139.438027 15.000000 -0.400000 137.109372 15.000000 -0.300000 134.800717 15.000000 -0.200000 132.512063 15.000000 -0.100000 130.243408 15.000000 -0.000000 127.994754 15.000000 0.100000 125.766099 15.000000 0.200000 123.557444 15.000000 0.300000 121.368790 15.000000 0.400000 119.200135 15.000000 0.500000 117.051481 15.000000 0.600000 114.922826 15.000000 0.700000 112.814171 15.000000 0.800000 110.725517 15.000000 0.900000 108.656862 15.000000 1.000000 106.608207 15.000000 1.100000 104.579553 15.000000 1.200000 102.570898 15.000000 1.300000 100.582244 15.000000 1.400000 98.613589 15.000000 1.500000 96.664934 15.000000 1.600000 94.736280 15.000000 1.700000 92.827625 15.000000 1.800000 90.938970 15.000000 1.900000 89.070316 15.000000 2.000000 87.221661 15.000000 2.100000 85.393007 15.000000 2.200000 83.584352 15.000000 2.300000 81.795697 15.000000 2.400000 80.027043 15.000000 2.500000 78.278388 15.000000 2.600000 76.549734 15.000000 2.700000 74.841079 15.000000 2.800000 73.152424 15.000000 2.900000 71.483770 15.000000 3.000000 69.835115 15.000000 3.100000 68.206460 15.000000 3.200000 66.597806 15.000000 3.300000 65.009151 15.000000 3.400000 63.440497 15.000000 3.500000 61.891842 15.000000 3.600000 60.363187 15.000000 3.700000 58.854533 15.000000 3.800000 57.365878 15.000000 3.900000 55.897224 15.000000 4.000000 54.448569 15.000000 4.100000 53.019914 15.000000 4.200000 51.611260 15.000000 4.300000 50.222605 15.000000 4.400000 48.853950 15.000000 4.500000 47.505296 15.000000 4.600000 46.176641 15.000000 4.700000 44.867987 15.000000 4.800000 43.579332 15.000000 4.900000 42.310677 15.000000 5.000000 41.062023 15.000000 5.100000 39.833368 15.000000 5.200000 38.624713 15.000000 5.300000 37.436059 15.000000 5.400000 36.267404 15.000000 5.500000 35.118750 15.000000 5.600000 33.990095 15.000000 5.700000 32.881440 15.000000 5.800000 31.792786 15.000000 5.900000 30.724131 15.000000 6.000000 29.675477 15.000000 6.100000 28.646822 15.000000 6.200000 27.638167 15.000000 6.300000 26.649513 15.000000 6.400000 25.680858 15.000000 6.500000 24.732203 15.000000 6.600000 23.803549 15.000000 6.700000 22.894894 15.000000 6.800000 22.006240 15.000000 6.900000 21.137585 15.000000 7.000000 20.288930 15.000000 7.100000 19.460276 15.000000 7.200000 18.651621 15.000000 7.300000 17.862966 15.000000 7.400000 17.094312 15.000000 7.500000 16.345657 15.000000 7.600000 15.617003 15.000000 7.700000 14.908348 15.000000 7.800000 14.219693 15.000000 7.900000 13.551039 15.000000 8.000000 12.902384 15.000000 8.100000 12.273730 15.000000 8.200000 11.665075 15.000000 8.300000 11.076420 15.000000 8.400000 10.507766 15.000000 8.500000 9.959111 15.000000 8.600000 9.430456 15.000000 8.700000 8.921802 15.000000 8.800000 8.433147 15.000000 8.900000 7.964493 15.000000 9.000000 7.515838 15.000000 9.100000 7.087183 15.000000 9.200000 6.678529 15.000000 9.300000 6.289874 15.000000 9.400000 5.921219 15.000000 9.500000 5.572565 15.000000 9.600000 5.243910 15.000000 9.700000 4.935256 15.000000 9.800000 4.646601 15.000000 9.900000 4.377946 15.000000 10.000000 4.129292 15.000000 10.100000 3.900637 15.000000 10.200000 3.691983 15.000000 10.300000 3.503328 15.000000 10.400000 3.334673 15.000000 10.500000 3.186019 15.000000 10.600000 3.057364 15.000000 10.700000 2.948709 15.000000 10.800000 2.860055 15.000000 10.900000 2.791400 15.000000 11.000000 2.742746 15.000000 11.100000 2.714091 15.000000 11.200000 2.705436 15.000000 11.300000 2.716782 15.000000 11.400000 2.748127 15.000000 11.500000 2.799472 15.000000 11.600000 2.870818 15.000000 11.700000 2.962163 15.000000 11.800000 3.073509 15.000000 11.900000 3.204854 15.000000 12.000000 3.356199 15.000000 12.100000 3.527545 15.000000 12.200000 3.718890 15.000000 12.300000 3.930236 15.000000 12.400000 4.161581 15.000000 12.500000 4.412926 15.000000 12.600000 4.684272 15.000000 12.700000 4.975617 15.000000 12.800000 5.286962 15.000000 12.900000 5.618308 15.000000 13.000000 5.969653 15.000000 13.100000 6.340999 15.000000 13.200000 6.732344 15.000000 13.300000 7.143689 15.000000 13.400000 7.575035 15.000000 13.500000 8.026380 15.000000 13.600000 8.497725 15.000000 13.700000 8.989071 15.000000 13.800000 9.500416 15.000000 13.900000 10.031762 15.000000 14.000000 10.583107 15.000000 14.100000 11.154452 15.000000 14.200000 11.745798 15.000000 14.300000 12.357143 15.000000 14.400000 12.988489 15.000000 14.500000 13.639834 15.000000 14.600000 14.311179 15.000000 14.700000 15.002525 15.000000 14.800000 15.713870 15.000000 14.900000 16.445215 15.000000 15.000000 17.196561 # trust-region/levenberg-marquardt 6.000000 14.500000 -2.440721 8.052493 -2.649759 10.338367 -3.079780 11.922784 -3.207953 12.376764 -3.113030 12.240580 -3.156168 12.295063 -3.135422 12.267922 -3.144145 12.278083 -3.140628 12.273947 -3.141954 12.275411 -3.141465 12.274866 -3.141638 12.275049 -3.141577 12.274984 -3.141598 12.275006 -3.141591 12.274998 -3.141593 12.275001 -3.141592 12.275000 -3.141593 12.275000 -3.141593 12.275000 -3.141593 12.275000 # trust-region/levenberg-marquardt+accel 6.000000 14.500000 5.434266 14.105210 4.860709 13.032737 4.081924 10.582719 3.243692 6.790283 2.058201 4.197091 2.873516 2.930922 3.372929 2.246210 3.036675 2.318015 3.239950 2.237589 3.128135 2.263146 3.145861 2.267710 3.141215 2.271767 3.141969 2.273339 3.141552 2.274340 3.141685 2.274699 3.141514 2.274945 3.141678 2.274938 3.141578 2.274977 3.141598 2.274987 3.141593 2.274994 3.141593 2.274997 3.141592 2.275000 3.141593 2.275000 3.141592 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 # trust-region/dogleg 6.000000 14.500000 0.084715 10.513103 4.386135 -0.771406 2.863958 2.202150 3.445763 2.006013 2.862516 2.458756 3.367235 2.256024 3.115028 2.153453 3.159338 2.237666 3.131967 2.268437 3.146763 2.280079 3.139564 2.273509 3.143245 2.276490 3.141432 2.274895 3.141664 2.275075 3.141552 2.274970 3.141610 2.275017 3.141581 2.274991 3.141596 2.275003 3.141592 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 # trust-region/double-dogleg 6.000000 14.500000 0.084715 10.513103 4.525217 -0.637424 2.784094 2.178685 3.382281 2.048555 3.138220 2.084792 3.163691 2.189933 3.107123 2.326539 3.150882 2.300348 3.133654 2.271698 3.144331 2.279648 3.139620 2.273460 3.142196 2.275844 3.140984 2.274394 3.141615 2.275040 3.141578 2.274991 3.141599 2.275008 3.141589 2.274997 3.141594 2.275002 3.141592 2.274999 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 # trust-region/2D-subspace 6.000000 14.500000 0.443880 10.464140 4.859341 -0.766174 2.457734 2.123629 3.300727 2.062365 3.096528 2.222788 3.149836 2.246128 3.139418 2.264724 3.145814 2.269650 3.139332 2.274037 3.142734 2.274079 3.141074 2.274870 3.141924 2.274792 3.141505 2.274946 3.141610 2.274967 3.141586 2.274990 3.141599 2.274993 3.141593 2.274996 3.141592 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 3.141593 2.275000 gsl-doc-2.3/doc/examples/fitting.c0000664000175000017500000000216012616157443015165 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/multiset.txt0000664000175000017500000000137412620437730015765 0ustar eddeddAll multisets of {0,1,2,3} by size: { } { 0 } { 1 } { 2 } { 3 } { 0 0 } { 0 1 } { 0 2 } { 0 3 } { 1 1 } { 1 2 } { 1 3 } { 2 2 } { 2 3 } { 3 3 } { 0 0 0 } { 0 0 1 } { 0 0 2 } { 0 0 3 } { 0 1 1 } { 0 1 2 } { 0 1 3 } { 0 2 2 } { 0 2 3 } { 0 3 3 } { 1 1 1 } { 1 1 2 } { 1 1 3 } { 1 2 2 } { 1 2 3 } { 1 3 3 } { 2 2 2 } { 2 2 3 } { 2 3 3 } { 3 3 3 } { 0 0 0 0 } { 0 0 0 1 } { 0 0 0 2 } { 0 0 0 3 } { 0 0 1 1 } { 0 0 1 2 } { 0 0 1 3 } { 0 0 2 2 } { 0 0 2 3 } { 0 0 3 3 } { 0 1 1 1 } { 0 1 1 2 } { 0 1 1 3 } { 0 1 2 2 } { 0 1 2 3 } { 0 1 3 3 } { 0 2 2 2 } { 0 2 2 3 } { 0 2 3 3 } { 0 3 3 3 } { 1 1 1 1 } { 1 1 1 2 } { 1 1 1 3 } { 1 1 2 2 } { 1 1 2 3 } { 1 1 3 3 } { 1 2 2 2 } { 1 2 2 3 } { 1 2 3 3 } { 1 3 3 3 } { 2 2 2 2 } { 2 2 2 3 } { 2 2 3 3 } { 2 3 3 3 } { 3 3 3 3 } gsl-doc-2.3/doc/examples/fitreg.txt0000755000175000017500000002432113004361416015367 0ustar eddedd2.224664e+02 1.608585e+02 7.089304e-01 2.590135e-02 2.123781e+02 1.536944e+02 7.418066e-01 2.364670e-02 2.027474e+02 1.465757e+02 7.745418e-01 2.150793e-02 1.935533e+02 1.395346e+02 8.069972e-01 1.949208e-02 1.847762e+02 1.326021e+02 8.390388e-01 1.760414e-02 1.763970e+02 1.258080e+02 8.705396e-01 1.584709e-02 1.683979e+02 1.191799e+02 9.013813e-01 1.422193e-02 1.607615e+02 1.127436e+02 9.314562e-01 1.272784e-02 1.534714e+02 1.065220e+02 9.606681e-01 1.136232e-02 1.465119e+02 1.005353e+02 9.889334e-01 1.012146e-02 1.398679e+02 9.480095e+01 1.016182e+00 9.000116e-03 1.335253e+02 8.933330e+01 1.042357e+00 7.992184e-03 1.274703e+02 8.414375e+01 1.067414e+00 7.090842e-03 1.216898e+02 7.924077e+01 1.091323e+00 6.288777e-03 1.161715e+02 7.462999e+01 1.114065e+00 5.578398e-03 1.109034e+02 7.031430e+01 1.135633e+00 4.952031e-03 1.058743e+02 6.629405e+01 1.156030e+00 4.402076e-03 1.010731e+02 6.256714e+01 1.175267e+00 3.921145e-03 9.648973e+01 5.912926e+01 1.193366e+00 3.502162e-03 9.211417e+01 5.597400e+01 1.210352e+00 3.138444e-03 8.793704e+01 5.309306e+01 1.226260e+00 2.823755e-03 8.394932e+01 5.047643e+01 1.241126e+00 2.552337e-03 8.014244e+01 4.811257e+01 1.254992e+00 2.318922e-03 7.650819e+01 4.598859e+01 1.267902e+00 2.118738e-03 7.303874e+01 4.409052e+01 1.279901e+00 1.947488e-03 6.972663e+01 4.240351e+01 1.291035e+00 1.801336e-03 6.656471e+01 4.091211e+01 1.301353e+00 1.676878e-03 6.354617e+01 3.960054e+01 1.310901e+00 1.571107e-03 6.066452e+01 3.845296e+01 1.319726e+00 1.481387e-03 5.791354e+01 3.745374e+01 1.327872e+00 1.405414e-03 5.528732e+01 3.658771e+01 1.335385e+00 1.341185e-03 5.278018e+01 3.584034e+01 1.342306e+00 1.286966e-03 5.038674e+01 3.519797e+01 1.348676e+00 1.241257e-03 4.810183e+01 3.464788e+01 1.354534e+00 1.202773e-03 4.592054e+01 3.417841e+01 1.359918e+00 1.170408e-03 4.383816e+01 3.377896e+01 1.364862e+00 1.143218e-03 4.185022e+01 3.344003e+01 1.369399e+00 1.120399e-03 3.995242e+01 3.315315e+01 1.373561e+00 1.101264e-03 3.814068e+01 3.291086e+01 1.377375e+00 1.085232e-03 3.641110e+01 3.270663e+01 1.380870e+00 1.071811e-03 3.475995e+01 3.253478e+01 1.384071e+00 1.060581e-03 3.318368e+01 3.239039e+01 1.387001e+00 1.051193e-03 3.167889e+01 3.226924e+01 1.389682e+00 1.043348e-03 3.024233e+01 3.216770e+01 1.392134e+00 1.036796e-03 2.887092e+01 3.208269e+01 1.394377e+00 1.031327e-03 2.756170e+01 3.201158e+01 1.396427e+00 1.026763e-03 2.631185e+01 3.195215e+01 1.398300e+00 1.022957e-03 2.511868e+01 3.190252e+01 1.400012e+00 1.019783e-03 2.397961e+01 3.186109e+01 1.401576e+00 1.017139e-03 2.289220e+01 3.182652e+01 1.403005e+00 1.014935e-03 2.185410e+01 3.179770e+01 1.404309e+00 1.013100e-03 2.086307e+01 3.177368e+01 1.405500e+00 1.011571e-03 1.991699e+01 3.175367e+01 1.406587e+00 1.010299e-03 1.901380e+01 3.173700e+01 1.407579e+00 1.009240e-03 1.815158e+01 3.172311e+01 1.408484e+00 1.008358e-03 1.732845e+01 3.171156e+01 1.409310e+00 1.007625e-03 1.654265e+01 3.170194e+01 1.410064e+00 1.007015e-03 1.579248e+01 3.169394e+01 1.410752e+00 1.006508e-03 1.507634e+01 3.168728e+01 1.411379e+00 1.006086e-03 1.439266e+01 3.168175e+01 1.411951e+00 1.005735e-03 1.373999e+01 3.167714e+01 1.412473e+00 1.005444e-03 1.311692e+01 3.167331e+01 1.412949e+00 1.005201e-03 1.252210e+01 3.167013e+01 1.413383e+00 1.005000e-03 1.195426e+01 3.166748e+01 1.413779e+00 1.004832e-03 1.141216e+01 3.166528e+01 1.414139e+00 1.004693e-03 1.089465e+01 3.166345e+01 1.414468e+00 1.004577e-03 1.040061e+01 3.166193e+01 1.414769e+00 1.004481e-03 9.928969e+00 3.166067e+01 1.415042e+00 1.004402e-03 9.478716e+00 3.165962e+01 1.415291e+00 1.004335e-03 9.048881e+00 3.165874e+01 1.415519e+00 1.004280e-03 8.638538e+00 3.165802e+01 1.415726e+00 1.004235e-03 8.246803e+00 3.165741e+01 1.415915e+00 1.004197e-03 7.872832e+00 3.165691e+01 1.416087e+00 1.004165e-03 7.515820e+00 3.165650e+01 1.416244e+00 1.004139e-03 7.174997e+00 3.165615e+01 1.416388e+00 1.004117e-03 6.849630e+00 3.165587e+01 1.416518e+00 1.004099e-03 6.539017e+00 3.165563e+01 1.416637e+00 1.004084e-03 6.242490e+00 3.165543e+01 1.416745e+00 1.004072e-03 5.959409e+00 3.165526e+01 1.416844e+00 1.004061e-03 5.689166e+00 3.165513e+01 1.416934e+00 1.004053e-03 5.431177e+00 3.165501e+01 1.417017e+00 1.004046e-03 5.184887e+00 3.165492e+01 1.417091e+00 1.004040e-03 4.949766e+00 3.165484e+01 1.417160e+00 1.004035e-03 4.725307e+00 3.165477e+01 1.417222e+00 1.004031e-03 4.511027e+00 3.165472e+01 1.417279e+00 1.004028e-03 4.306464e+00 3.165467e+01 1.417331e+00 1.004025e-03 4.111177e+00 3.165464e+01 1.417378e+00 1.004022e-03 3.924746e+00 3.165461e+01 1.417421e+00 1.004021e-03 3.746769e+00 3.165458e+01 1.417460e+00 1.004019e-03 3.576863e+00 3.165456e+01 1.417496e+00 1.004018e-03 3.414661e+00 3.165454e+01 1.417529e+00 1.004017e-03 3.259815e+00 3.165453e+01 1.417559e+00 1.004016e-03 3.111991e+00 3.165451e+01 1.417587e+00 1.004015e-03 2.970871e+00 3.165450e+01 1.417612e+00 1.004014e-03 2.836149e+00 3.165449e+01 1.417635e+00 1.004014e-03 2.707537e+00 3.165449e+01 1.417657e+00 1.004013e-03 2.584758e+00 3.165448e+01 1.417676e+00 1.004013e-03 2.467546e+00 3.165448e+01 1.417695e+00 1.004013e-03 2.355649e+00 3.165447e+01 1.417712e+00 1.004012e-03 2.248826e+00 3.165447e+01 1.417728e+00 1.004012e-03 2.146848e+00 3.165446e+01 1.417743e+00 1.004012e-03 2.049494e+00 3.165446e+01 1.417758e+00 1.004012e-03 1.956555e+00 3.165446e+01 1.417772e+00 1.004012e-03 1.867830e+00 3.165446e+01 1.417786e+00 1.004012e-03 1.783129e+00 3.165445e+01 1.417801e+00 1.004012e-03 1.702269e+00 3.165445e+01 1.417815e+00 1.004012e-03 1.625075e+00 3.165445e+01 1.417830e+00 1.004011e-03 1.551383e+00 3.165445e+01 1.417846e+00 1.004011e-03 1.481031e+00 3.165445e+01 1.417863e+00 1.004011e-03 1.413870e+00 3.165444e+01 1.417882e+00 1.004011e-03 1.349755e+00 3.165444e+01 1.417903e+00 1.004011e-03 1.288547e+00 3.165444e+01 1.417926e+00 1.004011e-03 1.230115e+00 3.165444e+01 1.417954e+00 1.004011e-03 1.174333e+00 3.165444e+01 1.417985e+00 1.004011e-03 1.121080e+00 3.165443e+01 1.418022e+00 1.004011e-03 1.070242e+00 3.165443e+01 1.418066e+00 1.004011e-03 1.021709e+00 3.165443e+01 1.418117e+00 1.004011e-03 9.753771e-01 3.165443e+01 1.418178e+00 1.004011e-03 9.311463e-01 3.165442e+01 1.418250e+00 1.004011e-03 8.889213e-01 3.165442e+01 1.418337e+00 1.004011e-03 8.486110e-01 3.165442e+01 1.418441e+00 1.004010e-03 8.101288e-01 3.165441e+01 1.418565e+00 1.004010e-03 7.733915e-01 3.165441e+01 1.418714e+00 1.004010e-03 7.383203e-01 3.165440e+01 1.418893e+00 1.004010e-03 7.048394e-01 3.165440e+01 1.419108e+00 1.004010e-03 6.728768e-01 3.165439e+01 1.419366e+00 1.004010e-03 6.423636e-01 3.165439e+01 1.419676e+00 1.004010e-03 6.132340e-01 3.165438e+01 1.420049e+00 1.004009e-03 5.854255e-01 3.165437e+01 1.420498e+00 1.004009e-03 5.588780e-01 3.165437e+01 1.421037e+00 1.004009e-03 5.335343e-01 3.165436e+01 1.421685e+00 1.004009e-03 5.093399e-01 3.165435e+01 1.422465e+00 1.004008e-03 4.862427e-01 3.165434e+01 1.423403e+00 1.004008e-03 4.641929e-01 3.165433e+01 1.424530e+00 1.004008e-03 4.431429e-01 3.165431e+01 1.425885e+00 1.004007e-03 4.230476e-01 3.165430e+01 1.427514e+00 1.004007e-03 4.038635e-01 3.165429e+01 1.429470e+00 1.004007e-03 3.855493e-01 3.165427e+01 1.431820e+00 1.004006e-03 3.680657e-01 3.165425e+01 1.434642e+00 1.004006e-03 3.513749e-01 3.165423e+01 1.438028e+00 1.004005e-03 3.354409e-01 3.165421e+01 1.442091e+00 1.004004e-03 3.202296e-01 3.165419e+01 1.446961e+00 1.004004e-03 3.057080e-01 3.165416e+01 1.452795e+00 1.004003e-03 2.918449e-01 3.165413e+01 1.459779e+00 1.004002e-03 2.786105e-01 3.165410e+01 1.468130e+00 1.004001e-03 2.659763e-01 3.165406e+01 1.478105e+00 1.004000e-03 2.539149e-01 3.165403e+01 1.490005e+00 1.003999e-03 2.424006e-01 3.165399e+01 1.504178e+00 1.003998e-03 2.314083e-01 3.165394e+01 1.521030e+00 1.003996e-03 2.209146e-01 3.165389e+01 1.541026e+00 1.003995e-03 2.108967e-01 3.165384e+01 1.564700e+00 1.003993e-03 2.013331e-01 3.165378e+01 1.592654e+00 1.003992e-03 1.922031e-01 3.165371e+01 1.625568e+00 1.003990e-03 1.834872e-01 3.165364e+01 1.664198e+00 1.003988e-03 1.751666e-01 3.165357e+01 1.709378e+00 1.003985e-03 1.672232e-01 3.165348e+01 1.762018e+00 1.003983e-03 1.596401e-01 3.165339e+01 1.823102e+00 1.003980e-03 1.524008e-01 3.165329e+01 1.893683e+00 1.003977e-03 1.454898e-01 3.165318e+01 1.974875e+00 1.003974e-03 1.388923e-01 3.165306e+01 2.067851e+00 1.003971e-03 1.325939e-01 3.165293e+01 2.173834e+00 1.003967e-03 1.265811e-01 3.165279e+01 2.294096e+00 1.003963e-03 1.208410e-01 3.165263e+01 2.429951e+00 1.003959e-03 1.153611e-01 3.165246e+01 2.582761e+00 1.003954e-03 1.101298e-01 3.165228e+01 2.753932e+00 1.003949e-03 1.051357e-01 3.165208e+01 2.944919e+00 1.003943e-03 1.003681e-01 3.165186e+01 3.157231e+00 1.003937e-03 9.581665e-02 3.165163e+01 3.392436e+00 1.003930e-03 9.147162e-02 3.165138e+01 3.652162e+00 1.003923e-03 8.732362e-02 3.165110e+01 3.938104e+00 1.003916e-03 8.336372e-02 3.165081e+01 4.252021e+00 1.003908e-03 7.958340e-02 3.165049e+01 4.595739e+00 1.003899e-03 7.597450e-02 3.165015e+01 4.971143e+00 1.003890e-03 7.252925e-02 3.164978e+01 5.380172e+00 1.003880e-03 6.924024e-02 3.164938e+01 5.824807e+00 1.003870e-03 6.610038e-02 3.164896e+01 6.307055e+00 1.003859e-03 6.310290e-02 3.164851e+01 6.828932e+00 1.003847e-03 6.024135e-02 3.164803e+01 7.392437e+00 1.003835e-03 5.750956e-02 3.164752e+01 7.999525e+00 1.003822e-03 5.490165e-02 3.164698e+01 8.652072e+00 1.003809e-03 5.241201e-02 3.164640e+01 9.351841e+00 1.003795e-03 5.003526e-02 3.164580e+01 1.010044e+01 1.003781e-03 4.776629e-02 3.164517e+01 1.089926e+01 1.003766e-03 4.560022e-02 3.164451e+01 1.174946e+01 1.003752e-03 4.353237e-02 3.164382e+01 1.265188e+01 1.003737e-03 4.155829e-02 3.164310e+01 1.360703e+01 1.003722e-03 3.967373e-02 3.164236e+01 1.461497e+01 1.003707e-03 3.787463e-02 3.164160e+01 1.567535e+01 1.003693e-03 3.615711e-02 3.164082e+01 1.678729e+01 1.003679e-03 3.451748e-02 3.164002e+01 1.794939e+01 1.003665e-03 3.295221e-02 3.163921e+01 1.915966e+01 1.003653e-03 3.145791e-02 3.163840e+01 2.041553e+01 1.003641e-03 3.003138e-02 3.163758e+01 2.171386e+01 1.003631e-03 2.866953e-02 3.163677e+01 2.305089e+01 1.003622e-03 2.736944e-02 3.163596e+01 2.442232e+01 1.003614e-03 2.612831e-02 3.163517e+01 2.582333e+01 1.003608e-03 2.494346e-02 3.163439e+01 2.724862e+01 1.003604e-03 2.381234e-02 3.163363e+01 2.869253e+01 1.003602e-03 2.273251e-02 3.163290e+01 3.014906e+01 1.003602e-03 2.170165e-02 3.163219e+01 3.161203e+01 1.003604e-03 31.654720 1.417279 2.320286e-02 1.003602e-03 gsl-doc-2.3/doc/examples/interp.c0000664000175000017500000000140312616157443015021 0ustar eddedd#include #include #include #include #include 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; } gsl-doc-2.3/doc/examples/roots.txt0000664000175000017500000000070212620443066015256 0ustar eddeddusing 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 gsl-doc-2.3/doc/examples/bspline.c0000664000175000017500000000543412616157443015164 0ustar eddedd#include #include #include #include #include #include #include #include /* number of data points to fit */ #define N 200 /* number of fit coefficients */ #define NCOEFFS 12 /* 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, Rsq, dof, tss; 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 * yi; 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); dof = n - ncoeffs; tss = gsl_stats_wtss(w->data, 1, y->data, 1, y->size); Rsq = 1.0 - chisq / tss; fprintf(stderr, "chisq/dof = %e, Rsq = %f\n", chisq / dof, Rsq); /* 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() */ gsl-doc-2.3/doc/examples/linalglu.txt0000664000175000017500000000004712620436566015730 0ustar eddeddx = -4.05205 -12.6056 1.66091 8.69377 gsl-doc-2.3/doc/examples/histogram2d.c0000664000175000017500000000200412616157443015741 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/permseq.txt0000664000175000017500000000005212620440704015556 0ustar eddedd 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 gsl-doc-2.3/doc/examples/ieeeround.txt0000664000175000017500000000162212620435337016073 0ustar eddeddi= 1 sum=1.000000000000000000 error=-1.71828 i= 2 sum=2.000000000000000000 error=-0.718282 i= 3 sum=2.500000000000000000 error=-0.218282 i= 4 sum=2.666666666666666519 error=-0.0516152 i= 5 sum=2.708333333333333037 error=-0.0099485 i= 6 sum=2.716666666666666341 error=-0.00161516 i= 7 sum=2.718055555555555447 error=-0.000226273 i= 8 sum=2.718253968253968367 error=-2.78602e-05 i= 9 sum=2.718278769841270037 error=-3.05862e-06 i=10 sum=2.718281525573192248 error=-3.02886e-07 i=11 sum=2.718281801146384513 error=-2.73127e-08 i=12 sum=2.718281826198492901 error=-2.26055e-09 i=13 sum=2.718281828286168711 error=-1.72876e-10 i=14 sum=2.718281828446759363 error=-1.22857e-11 i=15 sum=2.718281828458230187 error=-8.14904e-13 i=16 sum=2.718281828458994909 error=-5.01821e-14 i=17 sum=2.718281828459042870 error=-2.22045e-15 i=18 sum=2.718281828459045535 error=4.44089e-16 i=19 sum=2.718281828459045535 error=4.44089e-16 gsl-doc-2.3/doc/examples/randwalk.c0000664000175000017500000000067312616157443015333 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/fitreg2.txt0000644000175000017500000002432513004361703015451 0ustar eddedd1.722777e+00 3.137496e+00 1.393571e-01 1.098466e-01 1.542511e+00 3.134851e+00 1.602537e-01 1.111355e-01 1.381107e+00 3.132105e+00 1.838003e-01 1.124535e-01 1.236592e+00 3.129220e+00 2.106938e-01 1.137782e-01 1.107199e+00 3.126141e+00 2.418828e-01 1.150910e-01 9.913452e-01 3.122801e+00 2.785467e-01 1.163793e-01 8.876139e-01 3.119134e+00 3.220259e-01 1.176379e-01 7.947367e-01 3.115081e+00 3.737063e-01 1.188693e-01 7.115778e-01 3.110606e+00 4.348745e-01 1.200830e-01 6.371205e-01 3.105701e+00 5.065595e-01 1.212938e-01 5.704542e-01 3.100403e+00 5.893764e-01 1.225198e-01 5.107636e-01 3.094792e+00 6.833863e-01 1.237793e-01 4.573188e-01 3.088992e+00 7.879919e-01 1.250887e-01 4.094664e-01 3.083163e+00 9.018923e-01 1.264594e-01 3.666211e-01 3.077483e+00 1.023126e+00 1.278954e-01 3.282590e-01 3.072126e+00 1.149218e+00 1.293921e-01 2.939109e-01 3.067236e+00 1.277432e+00 1.309363e-01 2.631570e-01 3.062913e+00 1.405101e+00 1.325071e-01 2.356210e-01 3.059197e+00 1.529994e+00 1.340794e-01 2.109664e-01 3.056073e+00 1.650666e+00 1.356271e-01 1.888915e-01 3.053481e+00 1.766774e+00 1.371273e-01 1.691265e-01 3.051330e+00 1.879334e+00 1.385633e-01 1.514296e-01 3.049515e+00 1.990948e+00 1.399270e-01 1.355845e-01 3.047928e+00 2.106019e+00 1.412191e-01 1.213973e-01 3.046466e+00 2.230932e+00 1.424491e-01 1.086947e-01 3.045040e+00 2.374177e+00 1.436337e-01 9.732119e-02 3.043574e+00 2.546260e+00 1.447959e-01 8.713780e-02 3.042004e+00 2.759286e+00 1.459626e-01 7.801997e-02 3.040285e+00 3.026090e+00 1.471633e-01 6.985619e-02 3.038387e+00 3.358992e+00 1.484283e-01 6.254665e-02 3.036296e+00 3.768366e+00 1.497867e-01 5.600196e-02 3.034020e+00 4.261340e+00 1.512642e-01 5.014209e-02 3.031585e+00 4.840819e+00 1.528812e-01 4.489537e-02 3.029040e+00 5.504952e+00 1.546495e-01 4.019766e-02 3.026446e+00 6.247119e+00 1.565704e-01 3.599150e-02 3.023875e+00 7.056539e+00 1.586327e-01 3.222546e-02 3.021398e+00 7.919639e+00 1.608119e-01 2.885348e-02 3.019073e+00 8.822262e+00 1.630712e-01 2.583434e-02 3.016940e+00 9.752649e+00 1.653647e-01 2.313112e-02 3.015010e+00 1.070504e+01 1.676419e-01 2.071075e-02 3.013269e+00 1.168365e+01 1.698529e-01 1.854364e-02 3.011679e+00 1.270683e+01 1.719539e-01 1.660329e-02 3.010183e+00 1.381130e+01 1.739109e-01 1.486597e-02 3.008713e+00 1.505601e+01 1.757021e-01 1.331044e-02 3.007191e+00 1.652543e+01 1.773182e-01 1.191768e-02 3.005538e+00 1.833101e+01 1.787612e-01 1.067065e-02 3.003668e+00 2.061036e+01 1.800425e-01 9.554103e-03 3.001496e+00 2.352383e+01 1.811809e-01 8.554391e-03 2.998932e+00 2.724970e+01 1.821998e-01 7.659285e-03 2.995886e+00 3.197972e+01 1.831262e-01 6.857841e-03 2.992265e+00 3.791607e+01 1.839890e-01 6.140258e-03 2.987980e+00 4.526885e+01 1.848187e-01 5.497760e-03 2.982950e+00 5.425209e+01 1.856470e-01 4.922491e-03 2.977113e+00 6.507580e+01 1.865067e-01 4.407416e-03 2.970435e+00 7.793223e+01 1.874314e-01 3.946238e-03 2.962928e+00 9.297574e+01 1.884557e-01 3.533316e-03 2.954661e+00 1.102970e+02 1.896138e-01 3.163600e-03 2.945771e+00 1.298942e+02 1.909381e-01 2.832571e-03 2.936465e+00 1.516468e+02 1.924564e-01 2.536179e-03 2.927011e+00 1.752965e+02 1.941885e-01 2.270801e-03 2.917712e+00 2.004452e+02 1.961420e-01 2.033191e-03 2.908878e+00 2.265717e+02 1.983087e-01 1.820444e-03 2.900780e+00 2.530716e+02 2.006625e-01 1.629959e-03 2.893622e+00 2.793116e+02 2.031597e-01 1.459405e-03 2.887516e+00 3.046926e+02 2.057427e-01 1.306697e-03 2.882479e+00 3.287068e+02 2.083462e-01 1.169968e-03 2.878452e+00 3.509813e+02 2.109050e-01 1.047546e-03 2.875317e+00 3.713028e+02 2.133613e-01 9.379343e-04 2.872926e+00 3.896242e+02 2.156706e-01 8.397917e-04 2.871127e+00 4.060614e+02 2.178043e-01 7.519185e-04 2.869774e+00 4.208862e+02 2.197508e-01 6.732400e-04 2.868742e+00 4.345280e+02 2.215136e-01 6.027942e-04 2.867925e+00 4.475887e+02 2.231087e-01 5.397197e-04 2.867240e+00 4.608802e+02 2.245616e-01 4.832451e-04 2.866619e+00 4.754845e+02 2.259049e-01 4.326798e-04 2.866007e+00 4.928343e+02 2.271761e-01 3.874055e-04 2.865362e+00 5.147993e+02 2.284162e-01 3.468686e-04 2.864647e+00 5.437503e+02 2.296689e-01 3.105733e-04 2.863829e+00 5.825596e+02 2.309801e-01 2.780758e-04 2.862880e+00 6.345001e+02 2.323980e-01 2.489788e-04 2.861776e+00 7.030369e+02 2.339728e-01 2.229264e-04 2.860499e+00 7.915470e+02 2.357562e-01 1.996001e-04 2.859036e+00 9.030327e+02 2.378005e-01 1.787146e-04 2.857384e+00 1.039868e+03 2.401564e-01 1.600144e-04 2.855552e+00 1.203580e+03 2.428702e-01 1.432710e-04 2.853565e+00 1.394632e+03 2.459795e-01 1.282795e-04 2.851464e+00 1.612233e+03 2.495081e-01 1.148568e-04 2.849301e+00 1.854184e+03 2.534599e-01 1.028385e-04 2.847142e+00 2.116859e+03 2.578138e-01 9.207780e-05 2.845053e+00 2.395388e+03 2.625202e-01 8.244306e-05 2.843097e+00 2.684085e+03 2.675006e-01 7.381647e-05 2.841321e+00 2.977118e+03 2.726516e-01 6.609254e-05 2.839753e+00 3.269361e+03 2.778528e-01 5.917682e-05 2.838397e+00 3.557342e+03 2.829790e-01 5.298473e-05 2.837240e+00 3.840201e+03 2.879116e-01 4.744057e-05 2.836251e+00 4.120650e+03 2.925500e-01 4.247654e-05 2.835386e+00 4.405963e+03 2.968191e-01 3.803192e-05 2.834600e+00 4.709062e+03 3.006723e-01 3.405238e-05 2.833841e+00 5.049753e+03 3.040905e-01 3.048924e-05 2.833062e+00 5.456018e+03 3.070781e-01 2.729894e-05 2.832211e+00 5.965090e+03 3.096580e-01 2.444246e-05 2.831239e+00 6.623983e+03 3.118655e-01 2.188488e-05 2.830091e+00 7.489257e+03 3.137428e-01 1.959491e-05 2.828710e+00 8.626347e+03 3.153358e-01 1.754456e-05 2.827031e+00 1.010924e+04 3.166905e-01 1.570875e-05 2.824979e+00 1.202123e+04 3.178516e-01 1.406503e-05 2.822470e+00 1.445704e+04 3.188617e-01 1.259331e-05 2.819406e+00 1.752562e+04 3.197610e-01 1.127559e-05 2.815678e+00 2.135312e+04 3.205881e-01 1.009574e-05 2.811161e+00 2.608500e+04 3.213810e-01 9.039355e-06 2.805726e+00 3.188670e+04 3.221777e-01 8.093504e-06 2.799237e+00 3.894202e+04 3.230184e-01 7.246625e-06 2.791566e+00 4.744843e+04 3.239468e-01 6.488360e-06 2.782605e+00 5.760813e+04 3.250117e-01 5.809438e-06 2.772286e+00 6.961416e+04 3.262684e-01 5.201556e-06 2.760602e+00 8.363085e+04 3.277796e-01 4.657281e-06 2.747633e+00 9.976912e+04 3.296152e-01 4.169957e-06 2.733562e+00 1.180587e+05 3.318499e-01 3.733626e-06 2.718689e+00 1.384212e+05 3.345583e-01 3.342950e-06 2.703419e+00 1.606491e+05 3.378069e-01 2.993154e-06 2.688234e+00 1.843986e+05 3.416434e-01 2.679960e-06 2.673643e+00 2.092005e+05 3.460840e-01 2.399537e-06 2.660116e+00 2.344916e+05 3.511029e-01 2.148457e-06 2.648030e+00 2.596630e+05 3.566257e-01 1.923649e-06 2.637620e+00 2.841185e+05 3.625315e-01 1.722364e-06 2.628969e+00 3.073291e+05 3.686627e-01 1.542141e-06 2.622018e+00 3.288765e+05 3.748433e-01 1.380776e-06 2.616606e+00 3.484761e+05 3.808989e-01 1.236296e-06 2.612510e+00 3.659817e+05 3.866765e-01 1.106934e-06 2.609484e+00 3.813726e+05 3.920571e-01 9.911075e-07 2.607295e+00 3.947318e+05 3.969632e-01 8.874010e-07 2.605735e+00 4.062212e+05 4.013572e-01 7.945461e-07 2.604636e+00 4.160595e+05 4.052372e-01 7.114072e-07 2.603862e+00 4.245066e+05 4.086289e-01 6.369677e-07 2.603312e+00 4.318573e+05 4.115774e-01 5.703174e-07 2.602910e+00 4.384463e+05 4.141403e-01 5.106411e-07 2.602602e+00 4.446656e+05 4.163818e-01 4.572092e-07 2.602348e+00 4.509978e+05 4.183691e-01 4.093682e-07 2.602117e+00 4.580674e+05 4.201702e-01 3.665332e-07 2.601887e+00 4.667134e+05 4.218530e-01 3.281802e-07 2.601639e+00 4.780848e+05 4.234853e-01 2.938405e-07 2.601359e+00 4.937527e+05 4.251364e-01 2.630939e-07 2.601029e+00 5.158218e+05 4.268778e-01 2.355646e-07 2.600636e+00 5.470072e+05 4.287857e-01 2.109158e-07 2.600165e+00 5.906325e+05 4.309424e-01 1.888462e-07 2.599598e+00 6.505218e+05 4.334390e-01 1.690859e-07 2.598921e+00 7.308011e+05 4.363771e-01 1.513933e-07 2.598116e+00 8.356695e+05 4.398698e-01 1.355519e-07 2.597169e+00 9.692012e+05 4.440427e-01 1.213682e-07 2.596067e+00 1.135182e+06 4.490330e-01 1.086686e-07 2.594806e+00 1.336932e+06 4.549863e-01 9.729786e-08 2.593385e+00 1.577052e+06 4.620509e-01 8.711690e-08 2.591819e+00 1.857073e+06 4.703688e-01 7.800126e-08 2.590132e+00 2.177024e+06 4.800613e-01 6.983944e-08 2.588362e+00 2.535010e+06 4.912121e-01 6.253166e-08 2.586559e+00 2.926897e+06 5.038476e-01 5.598853e-08 2.584781e+00 3.346241e+06 5.179163e-01 5.013007e-08 2.583085e+00 3.784553e+06 5.332744e-01 4.488461e-08 2.581523e+00 4.231936e+06 5.496803e-01 4.018802e-08 2.580133e+00 4.678037e+06 5.668022e-01 3.598287e-08 2.578938e+00 5.113157e+06 5.842421e-01 3.221773e-08 2.577940e+00 5.529355e+06 6.015712e-01 2.884656e-08 2.577129e+00 5.921393e+06 6.183721e-01 2.582815e-08 2.576482e+00 6.287444e+06 6.342778e-01 2.312557e-08 2.575968e+00 6.629644e+06 6.490016e-01 2.070578e-08 2.575557e+00 6.954609e+06 6.623514e-01 1.853919e-08 2.575218e+00 7.274153e+06 6.742307e-01 1.659931e-08 2.574923e+00 7.606397e+06 6.846274e-01 1.486241e-08 2.574646e+00 7.977424e+06 6.935959e-01 1.330725e-08 2.574366e+00 8.423477e+06 7.012373e-01 1.191482e-08 2.574061e+00 8.993390e+06 7.076806e-01 1.066809e-08 2.573713e+00 9.750697e+06 7.130674e-01 9.551812e-09 2.573299e+00 1.077472e+07 7.175402e-01 8.552340e-09 2.572797e+00 1.216047e+07 7.212348e-01 7.657449e-09 2.572182e+00 1.401811e+07 7.242757e-01 6.856197e-09 2.571422e+00 1.647375e+07 7.267742e-01 6.138785e-09 2.570481e+00 1.967292e+07 7.288276e-01 5.496441e-09 2.569314e+00 2.378700e+07 7.305201e-01 4.921311e-09 2.567867e+00 2.902207e+07 7.319240e-01 4.406360e-09 2.566074e+00 3.562921e+07 7.331015e-01 3.945292e-09 2.563853e+00 4.391592e+07 7.341066e-01 3.532468e-09 2.561108e+00 5.425840e+07 7.349869e-01 3.162842e-09 2.557722e+00 6.711471e+07 7.357857e-01 2.831891e-09 2.553557e+00 8.303847e+07 7.365440e-01 2.535571e-09 2.548448e+00 1.026925e+08 7.373029e-01 2.270257e-09 2.542210e+00 1.268609e+08 7.381063e-01 2.032704e-09 2.534630e+00 1.564577e+08 7.390036e-01 1.820008e-09 2.525476e+00 1.925281e+08 7.400539e-01 1.629568e-09 2.514504e+00 2.362389e+08 7.413306e-01 1.459055e-09 2.501475e+00 2.888508e+08 7.429267e-01 1.306384e-09 2.486172e+00 3.516668e+08 7.449623e-01 1.169688e-09 2.468436e+00 4.259500e+08 7.475918e-01 1.047295e-09 2.448205e+00 5.128065e+08 7.510116e-01 9.377094e-10 2.425553e+00 6.130339e+08 7.554664e-01 8.395904e-10 2.400735e+00 7.269474e+08 7.612503e-01 7.517382e-10 2.374214e+00 8.542031e+08 7.687001e-01 6.730786e-10 2.346657e+00 9.936560e+08 7.781758e-01 6.026497e-10 2.318902e+00 1.143292e+09 7.900244e-01 5.395903e-10 2.291876e+00 1.300270e+09 8.045283e-01 4.831292e-10 2.266486e+00 1.461099e+09 8.218422e-01 2.603862 424506.610976 1.722777e+00 1.098466e-01 gsl-doc-2.3/doc/examples/robfit.c0000664000175000017500000000536212620170242015000 0ustar eddedd#include #include #include int dofit(const gsl_multifit_robust_type *T, const gsl_matrix *X, const gsl_vector *y, gsl_vector *c, gsl_matrix *cov) { int s; gsl_multifit_robust_workspace * work = gsl_multifit_robust_alloc (T, X->size1, X->size2); s = gsl_multifit_robust (X, y, c, cov, work); gsl_multifit_robust_free (work); return s; } int main (int argc, char **argv) { size_t i; size_t n; const size_t p = 2; /* linear fit */ gsl_matrix *X, *cov; gsl_vector *x, *y, *c, *c_ols; const double a = 1.45; /* slope */ const double b = 3.88; /* intercept */ gsl_rng *r; if (argc != 2) { fprintf (stderr,"usage: robfit n\n"); exit (-1); } n = atoi (argv[1]); X = gsl_matrix_alloc (n, p); x = gsl_vector_alloc (n); y = gsl_vector_alloc (n); c = gsl_vector_alloc (p); c_ols = gsl_vector_alloc (p); cov = gsl_matrix_alloc (p, p); r = gsl_rng_alloc(gsl_rng_default); /* generate linear dataset */ for (i = 0; i < n - 3; i++) { double dx = 10.0 / (n - 1.0); double ei = gsl_rng_uniform(r); double xi = -5.0 + i * dx; double yi = a * xi + b; gsl_vector_set (x, i, xi); gsl_vector_set (y, i, yi + ei); } /* add a few outliers */ gsl_vector_set(x, n - 3, 4.7); gsl_vector_set(y, n - 3, -8.3); gsl_vector_set(x, n - 2, 3.5); gsl_vector_set(y, n - 2, -6.7); gsl_vector_set(x, n - 1, 4.1); gsl_vector_set(y, n - 1, -6.0); /* construct design matrix X for linear fit */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); gsl_matrix_set (X, i, 0, 1.0); gsl_matrix_set (X, i, 1, xi); } /* perform robust and OLS fit */ dofit(gsl_multifit_robust_ols, X, y, c_ols, cov); dofit(gsl_multifit_robust_bisquare, X, y, c, cov); /* output data and model */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(y, i); gsl_vector_view v = gsl_matrix_row(X, i); double y_ols, y_rob, y_err; gsl_multifit_robust_est(&v.vector, c, cov, &y_rob, &y_err); gsl_multifit_robust_est(&v.vector, c_ols, cov, &y_ols, &y_err); printf("%g %g %g %g\n", xi, yi, y_rob, y_ols); } #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\n", C(0), C(1)); printf ("# covariance matrix:\n"); printf ("# [ %+.5e, %+.5e\n", COV(0,0), COV(0,1)); printf ("# %+.5e, %+.5e\n", COV(1,0), COV(1,1)); } gsl_matrix_free (X); gsl_vector_free (x); gsl_vector_free (y); gsl_vector_free (c); gsl_vector_free (c_ols); gsl_matrix_free (cov); gsl_rng_free(r); return 0; } gsl-doc-2.3/doc/examples/fftreal.c0000664000175000017500000000210412616157443015142 0ustar eddedd#include #include #include #include #include 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; } gsl-doc-2.3/doc/examples/ode-initval.txt0000664000175000017500000000716712620440604016332 0ustar eddedd1.00000e+00 -1.45686e+00 -1.15474e+01 2.00000e+00 -1.95608e+00 6.90647e-02 3.00000e+00 -1.88481e+00 7.36425e-02 4.00000e+00 -1.80842e+00 7.93679e-02 5.00000e+00 -1.72550e+00 8.68268e-02 6.00000e+00 -1.63383e+00 9.71295e-02 7.00000e+00 -1.52952e+00 1.12715e-01 8.00000e+00 -1.40454e+00 1.40376e-01 9.00000e+00 -1.23605e+00 2.10149e-01 1.00000e+01 -8.53916e-01 9.01984e-01 1.10000e+01 1.99274e+00 -6.69455e-02 1.20000e+01 1.92381e+00 -7.10572e-02 1.30000e+01 1.85032e+00 -7.61105e-02 1.40000e+01 1.77113e+00 -8.25398e-02 1.50000e+01 1.68453e+00 -9.11205e-02 1.60000e+01 1.58767e+00 -1.03413e-01 1.70000e+01 1.47528e+00 -1.23181e-01 1.80000e+01 1.33506e+00 -1.62840e-01 1.90000e+01 1.12079e+00 -3.05570e-01 2.00000e+01 -1.59837e+00 -9.82301e+00 2.10000e+01 -1.96148e+00 6.87433e-02 2.20000e+01 -1.89057e+00 7.32476e-02 2.30000e+01 -1.81462e+00 7.88663e-02 2.40000e+01 -1.73228e+00 8.61590e-02 2.50000e+01 -1.64141e+00 9.61768e-02 2.60000e+01 -1.53829e+00 1.11197e-01 2.70000e+01 -1.41542e+00 1.37412e-01 2.80000e+01 -1.25215e+00 2.00819e-01 2.90000e+01 -9.15979e-01 6.98133e-01 3.00000e+01 1.99798e+00 -6.66422e-02 3.10000e+01 1.92936e+00 -7.07053e-02 3.20000e+01 1.85626e+00 -7.56719e-02 3.30000e+01 1.77758e+00 -8.19715e-02 3.40000e+01 1.69164e+00 -9.03420e-02 3.50000e+01 1.59573e+00 -1.02252e-01 3.60000e+01 1.48485e+00 -1.21185e-01 3.70000e+01 1.34764e+00 -1.58256e-01 3.80000e+01 1.14377e+00 -2.81644e-01 3.90000e+01 -5.76613e-01 -1.26648e+01 4.00000e+01 -1.96686e+00 6.84268e-02 4.10000e+01 -1.89629e+00 7.28598e-02 4.20000e+01 -1.82078e+00 7.83750e-02 4.30000e+01 -1.73901e+00 8.55074e-02 4.40000e+01 -1.64891e+00 9.52534e-02 4.50000e+01 -1.54695e+00 1.09742e-01 4.60000e+01 -1.42608e+00 1.34632e-01 4.70000e+01 -1.26756e+00 1.92566e-01 4.80000e+01 -9.65230e-01 5.67682e-01 4.90000e+01 2.00319e+00 -6.62229e-02 5.00000e+01 1.93489e+00 -7.03588e-02 5.10000e+01 1.86218e+00 -7.52414e-02 5.20000e+01 1.78398e+00 -8.14156e-02 5.30000e+01 1.69869e+00 -8.95845e-02 5.40000e+01 1.60370e+00 -1.01133e-01 5.50000e+01 1.49428e+00 -1.19287e-01 5.60000e+01 1.35987e+00 -1.54035e-01 5.70000e+01 1.16505e+00 -2.61951e-01 5.80000e+01 1.42891e-01 -6.13207e+00 5.90000e+01 -1.97221e+00 6.81150e-02 6.00000e+01 -1.90199e+00 7.24784e-02 6.10000e+01 -1.82690e+00 7.78933e-02 6.20000e+01 -1.74568e+00 8.48713e-02 6.30000e+01 -1.65634e+00 9.43576e-02 6.40000e+01 -1.55550e+00 1.08345e-01 6.50000e+01 -1.43653e+00 1.32018e-01 6.60000e+01 -1.28235e+00 1.85208e-01 6.70000e+01 -1.00603e+00 4.78809e-01 6.80000e+01 2.00833e+00 -6.45142e-02 6.90000e+01 1.94039e+00 -7.00179e-02 7.00000e+01 1.86806e+00 -7.48186e-02 7.10000e+01 1.79034e+00 -8.08716e-02 7.20000e+01 1.70568e+00 -8.88470e-02 7.30000e+01 1.61158e+00 -1.00051e-01 7.40000e+01 1.50355e+00 -1.17479e-01 7.50000e+01 1.37179e+00 -1.50135e-01 7.60000e+01 1.18491e+00 -2.45468e-01 7.70000e+01 4.84591e-01 -3.05853e+00 7.80000e+01 -1.97754e+00 6.78077e-02 7.90000e+01 -1.90765e+00 7.21034e-02 8.00000e+01 -1.83299e+00 7.74210e-02 8.10000e+01 -1.75231e+00 8.42502e-02 8.20000e+01 -1.66370e+00 9.34883e-02 8.30000e+01 -1.56393e+00 1.07003e-01 8.40000e+01 -1.44678e+00 1.29554e-01 8.50000e+01 -1.29661e+00 1.78603e-01 8.60000e+01 -1.04093e+00 4.15185e-01 8.70000e+01 2.01299e+00 -4.86619e-02 8.80000e+01 1.94586e+00 -6.96821e-02 8.90000e+01 1.87390e+00 -7.44034e-02 9.00000e+01 1.79665e+00 -8.03392e-02 9.10000e+01 1.71261e+00 -8.81285e-02 9.20000e+01 1.61938e+00 -9.90050e-02 9.30000e+01 1.51269e+00 -1.15754e-01 9.40000e+01 1.38341e+00 -1.46518e-01 9.50000e+01 1.20359e+00 -2.31470e-01 9.60000e+01 6.68012e-01 -1.79285e+00 9.70000e+01 -1.98284e+00 6.75047e-02 9.80000e+01 -1.91329e+00 7.17346e-02 9.90000e+01 -1.83904e+00 7.69577e-02 1.00000e+02 -1.75889e+00 8.36435e-02 gsl-doc-2.3/doc/examples/fitting3.c0000664000175000017500000000070212616157443015250 0ustar eddedd#include #include #include 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; } gsl-doc-2.3/doc/examples/cheb.c0000664000175000017500000000124212620167451014415 0ustar eddedd#include #include #include double f (double x, void *p) { (void)(p); /* avoid unused parameter warning */ 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; } gsl-doc-2.3/doc/examples/spmatrix.c0000644000175000017500000000332512736044021015360 0ustar eddedd#include #include #include int main() { gsl_spmatrix *A = gsl_spmatrix_alloc(5, 4); /* triplet format */ gsl_spmatrix *B, *C; size_t i, j; /* build the sparse matrix */ gsl_spmatrix_set(A, 0, 2, 3.1); gsl_spmatrix_set(A, 0, 3, 4.6); gsl_spmatrix_set(A, 1, 0, 1.0); gsl_spmatrix_set(A, 1, 2, 7.2); gsl_spmatrix_set(A, 3, 0, 2.1); gsl_spmatrix_set(A, 3, 1, 2.9); gsl_spmatrix_set(A, 3, 3, 8.5); gsl_spmatrix_set(A, 4, 0, 4.1); printf("printing all matrix elements:\n"); for (i = 0; i < 5; ++i) for (j = 0; j < 4; ++j) printf("A(%zu,%zu) = %g\n", i, j, gsl_spmatrix_get(A, i, j)); /* print out elements in triplet format */ printf("matrix in triplet format (i,j,Aij):\n"); gsl_spmatrix_fprintf(stdout, A, "%.1f"); /* convert to compressed column format */ B = gsl_spmatrix_ccs(A); printf("matrix in compressed column format:\n"); printf("i = [ "); for (i = 0; i < B->nz; ++i) printf("%zu, ", B->i[i]); printf("]\n"); printf("p = [ "); for (i = 0; i < B->size2 + 1; ++i) printf("%zu, ", B->p[i]); printf("]\n"); printf("d = [ "); for (i = 0; i < B->nz; ++i) printf("%g, ", B->data[i]); printf("]\n"); /* convert to compressed row format */ C = gsl_spmatrix_crs(A); printf("matrix in compressed row format:\n"); printf("i = [ "); for (i = 0; i < C->nz; ++i) printf("%zu, ", C->i[i]); printf("]\n"); printf("p = [ "); for (i = 0; i < C->size1 + 1; ++i) printf("%zu, ", C->p[i]); printf("]\n"); printf("d = [ "); for (i = 0; i < C->nz; ++i) printf("%g, ", C->data[i]); printf("]\n"); gsl_spmatrix_free(A); gsl_spmatrix_free(B); gsl_spmatrix_free(C); return 0; } gsl-doc-2.3/doc/examples/odefixed.c0000664000175000017500000000114512616157443015312 0ustar eddeddint main (void) { double mu = 10; gsl_odeiv2_system sys = { func, jac, 2, &mu }; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk4, 1e-3, 1e-8, 1e-8); double t = 0.0; double y[2] = { 1.0, 0.0 }; int i, s; for (i = 0; i < 100; i++) { s = gsl_odeiv2_driver_apply_fixed_step (d, &t, 1e-3, 1000, y); if (s != GSL_SUCCESS) { printf ("error: driver returned %d\n", s); break; } printf ("%.5e %.5e %.5e\n", t, y[0], y[1]); } gsl_odeiv2_driver_free (d); return s; } gsl-doc-2.3/doc/examples/dwt.txt0000664000175000017500000000523112616157443014716 0ustar eddedd0.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 gsl-doc-2.3/doc/examples/ieee.txt0000664000175000017500000000024312620435260015014 0ustar eddedd f= 1.01010101010101010101011*2^-2 fd= 1.0101010101010101010101100000000000000000000000000000*2^-2 d= 1.0101010101010101010101010101010101010101010101010101*2^-2 gsl-doc-2.3/doc/examples/matrixw.txt0000664000175000017500000000004112620437170015576 0ustar eddedddifferences = 0 (should be zero) gsl-doc-2.3/doc/examples/stat.txt0000664000175000017500000000023212620443211015051 0ustar eddeddThe dataset is 17.2, 18.1, 16.5, 18.3, 12.6 The sample mean is 16.54 The estimated variance is 5.373 The largest value is 18.3 The smallest value is 12.6 gsl-doc-2.3/doc/examples/rootnewt.txt0000664000175000017500000000034212620443014015762 0ustar eddeddusing 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 gsl-doc-2.3/doc/examples/nlfit2.txt0000644000175000017500000005144512737536472015333 0ustar eddedd-1.200000 -0.500000 37640.840000 -1.200000 -0.400000 33860.840000 -1.200000 -0.300000 30280.840000 -1.200000 -0.200000 26900.840000 -1.200000 -0.100000 23720.840000 -1.200000 -0.000000 20740.840000 -1.200000 0.100000 17960.840000 -1.200000 0.200000 15380.840000 -1.200000 0.300000 13000.840000 -1.200000 0.400000 10820.840000 -1.200000 0.500000 8840.840000 -1.200000 0.600000 7060.840000 -1.200000 0.700000 5480.840000 -1.200000 0.800000 4100.840000 -1.200000 0.900000 2920.840000 -1.200000 1.000000 1940.840000 -1.200000 1.100000 1160.840000 -1.200000 1.200000 580.840000 -1.200000 1.300000 200.840000 -1.200000 1.400000 20.840000 -1.200000 1.500000 40.840000 -1.200000 1.600000 260.840000 -1.200000 1.700000 680.840000 -1.200000 1.800000 1300.840000 -1.200000 1.900000 2120.840000 -1.200000 2.000000 3140.840000 -1.100000 -0.500000 29245.410000 -1.100000 -0.400000 25925.410000 -1.100000 -0.300000 22805.410000 -1.100000 -0.200000 19885.410000 -1.100000 -0.100000 17165.410000 -1.100000 -0.000000 14645.410000 -1.100000 0.100000 12325.410000 -1.100000 0.200000 10205.410000 -1.100000 0.300000 8285.410000 -1.100000 0.400000 6565.410000 -1.100000 0.500000 5045.410000 -1.100000 0.600000 3725.410000 -1.100000 0.700000 2605.410000 -1.100000 0.800000 1685.410000 -1.100000 0.900000 965.410000 -1.100000 1.000000 445.410000 -1.100000 1.100000 125.410000 -1.100000 1.200000 5.410000 -1.100000 1.300000 85.410000 -1.100000 1.400000 365.410000 -1.100000 1.500000 845.410000 -1.100000 1.600000 1525.410000 -1.100000 1.700000 2405.410000 -1.100000 1.800000 3485.410000 -1.100000 1.900000 4765.410000 -1.100000 2.000000 6245.410000 -1.000000 -0.500000 22504.000000 -1.000000 -0.400000 19604.000000 -1.000000 -0.300000 16904.000000 -1.000000 -0.200000 14404.000000 -1.000000 -0.100000 12104.000000 -1.000000 -0.000000 10004.000000 -1.000000 0.100000 8104.000000 -1.000000 0.200000 6404.000000 -1.000000 0.300000 4904.000000 -1.000000 0.400000 3604.000000 -1.000000 0.500000 2504.000000 -1.000000 0.600000 1604.000000 -1.000000 0.700000 904.000000 -1.000000 0.800000 404.000000 -1.000000 0.900000 104.000000 -1.000000 1.000000 4.000000 -1.000000 1.100000 104.000000 -1.000000 1.200000 404.000000 -1.000000 1.300000 904.000000 -1.000000 1.400000 1604.000000 -1.000000 1.500000 2504.000000 -1.000000 1.600000 3604.000000 -1.000000 1.700000 4904.000000 -1.000000 1.800000 6404.000000 -1.000000 1.900000 8104.000000 -1.000000 2.000000 10004.000000 -0.900000 -0.500000 17164.610000 -0.900000 -0.400000 14644.610000 -0.900000 -0.300000 12324.610000 -0.900000 -0.200000 10204.610000 -0.900000 -0.100000 8284.610000 -0.900000 -0.000000 6564.610000 -0.900000 0.100000 5044.610000 -0.900000 0.200000 3724.610000 -0.900000 0.300000 2604.610000 -0.900000 0.400000 1684.610000 -0.900000 0.500000 964.610000 -0.900000 0.600000 444.610000 -0.900000 0.700000 124.610000 -0.900000 0.800000 4.610000 -0.900000 0.900000 84.610000 -0.900000 1.000000 364.610000 -0.900000 1.100000 844.610000 -0.900000 1.200000 1524.610000 -0.900000 1.300000 2404.610000 -0.900000 1.400000 3484.610000 -0.900000 1.500000 4764.610000 -0.900000 1.600000 6244.610000 -0.900000 1.700000 7924.610000 -0.900000 1.800000 9804.610000 -0.900000 1.900000 11884.610000 -0.900000 2.000000 14164.610000 -0.800000 -0.500000 12999.240000 -0.800000 -0.400000 10819.240000 -0.800000 -0.300000 8839.240000 -0.800000 -0.200000 7059.240000 -0.800000 -0.100000 5479.240000 -0.800000 -0.000000 4099.240000 -0.800000 0.100000 2919.240000 -0.800000 0.200000 1939.240000 -0.800000 0.300000 1159.240000 -0.800000 0.400000 579.240000 -0.800000 0.500000 199.240000 -0.800000 0.600000 19.240000 -0.800000 0.700000 39.240000 -0.800000 0.800000 259.240000 -0.800000 0.900000 679.240000 -0.800000 1.000000 1299.240000 -0.800000 1.100000 2119.240000 -0.800000 1.200000 3139.240000 -0.800000 1.300000 4359.240000 -0.800000 1.400000 5779.240000 -0.800000 1.500000 7399.240000 -0.800000 1.600000 9219.240000 -0.800000 1.700000 11239.240000 -0.800000 1.800000 13459.240000 -0.800000 1.900000 15879.240000 -0.800000 2.000000 18499.240000 -0.700000 -0.500000 9803.890000 -0.700000 -0.400000 7923.890000 -0.700000 -0.300000 6243.890000 -0.700000 -0.200000 4763.890000 -0.700000 -0.100000 3483.890000 -0.700000 -0.000000 2403.890000 -0.700000 0.100000 1523.890000 -0.700000 0.200000 843.890000 -0.700000 0.300000 363.890000 -0.700000 0.400000 83.890000 -0.700000 0.500000 3.890000 -0.700000 0.600000 123.890000 -0.700000 0.700000 443.890000 -0.700000 0.800000 963.890000 -0.700000 0.900000 1683.890000 -0.700000 1.000000 2603.890000 -0.700000 1.100000 3723.890000 -0.700000 1.200000 5043.890000 -0.700000 1.300000 6563.890000 -0.700000 1.400000 8283.890000 -0.700000 1.500000 10203.890000 -0.700000 1.600000 12323.890000 -0.700000 1.700000 14643.890000 -0.700000 1.800000 17163.890000 -0.700000 1.900000 19883.890000 -0.700000 2.000000 22803.890000 -0.600000 -0.500000 7398.560000 -0.600000 -0.400000 5778.560000 -0.600000 -0.300000 4358.560000 -0.600000 -0.200000 3138.560000 -0.600000 -0.100000 2118.560000 -0.600000 -0.000000 1298.560000 -0.600000 0.100000 678.560000 -0.600000 0.200000 258.560000 -0.600000 0.300000 38.560000 -0.600000 0.400000 18.560000 -0.600000 0.500000 198.560000 -0.600000 0.600000 578.560000 -0.600000 0.700000 1158.560000 -0.600000 0.800000 1938.560000 -0.600000 0.900000 2918.560000 -0.600000 1.000000 4098.560000 -0.600000 1.100000 5478.560000 -0.600000 1.200000 7058.560000 -0.600000 1.300000 8838.560000 -0.600000 1.400000 10818.560000 -0.600000 1.500000 12998.560000 -0.600000 1.600000 15378.560000 -0.600000 1.700000 17958.560000 -0.600000 1.800000 20738.560000 -0.600000 1.900000 23718.560000 -0.600000 2.000000 26898.560000 -0.500000 -0.500000 5627.250000 -0.500000 -0.400000 4227.250000 -0.500000 -0.300000 3027.250000 -0.500000 -0.200000 2027.250000 -0.500000 -0.100000 1227.250000 -0.500000 -0.000000 627.250000 -0.500000 0.100000 227.250000 -0.500000 0.200000 27.250000 -0.500000 0.300000 27.250000 -0.500000 0.400000 227.250000 -0.500000 0.500000 627.250000 -0.500000 0.600000 1227.250000 -0.500000 0.700000 2027.250000 -0.500000 0.800000 3027.250000 -0.500000 0.900000 4227.250000 -0.500000 1.000000 5627.250000 -0.500000 1.100000 7227.250000 -0.500000 1.200000 9027.250000 -0.500000 1.300000 11027.250000 -0.500000 1.400000 13227.250000 -0.500000 1.500000 15627.250000 -0.500000 1.600000 18227.250000 -0.500000 1.700000 21027.250000 -0.500000 1.800000 24027.250000 -0.500000 1.900000 27227.250000 -0.500000 2.000000 30627.250000 -0.400000 -0.500000 4357.960000 -0.400000 -0.400000 3137.960000 -0.400000 -0.300000 2117.960000 -0.400000 -0.200000 1297.960000 -0.400000 -0.100000 677.960000 -0.400000 -0.000000 257.960000 -0.400000 0.100000 37.960000 -0.400000 0.200000 17.960000 -0.400000 0.300000 197.960000 -0.400000 0.400000 577.960000 -0.400000 0.500000 1157.960000 -0.400000 0.600000 1937.960000 -0.400000 0.700000 2917.960000 -0.400000 0.800000 4097.960000 -0.400000 0.900000 5477.960000 -0.400000 1.000000 7057.960000 -0.400000 1.100000 8837.960000 -0.400000 1.200000 10817.960000 -0.400000 1.300000 12997.960000 -0.400000 1.400000 15377.960000 -0.400000 1.500000 17957.960000 -0.400000 1.600000 20737.960000 -0.400000 1.700000 23717.960000 -0.400000 1.800000 26897.960000 -0.400000 1.900000 30277.960000 -0.400000 2.000000 33857.960000 -0.300000 -0.500000 3482.690000 -0.300000 -0.400000 2402.690000 -0.300000 -0.300000 1522.690000 -0.300000 -0.200000 842.690000 -0.300000 -0.100000 362.690000 -0.300000 -0.000000 82.690000 -0.300000 0.100000 2.690000 -0.300000 0.200000 122.690000 -0.300000 0.300000 442.690000 -0.300000 0.400000 962.690000 -0.300000 0.500000 1682.690000 -0.300000 0.600000 2602.690000 -0.300000 0.700000 3722.690000 -0.300000 0.800000 5042.690000 -0.300000 0.900000 6562.690000 -0.300000 1.000000 8282.690000 -0.300000 1.100000 10202.690000 -0.300000 1.200000 12322.690000 -0.300000 1.300000 14642.690000 -0.300000 1.400000 17162.690000 -0.300000 1.500000 19882.690000 -0.300000 1.600000 22802.690000 -0.300000 1.700000 25922.690000 -0.300000 1.800000 29242.690000 -0.300000 1.900000 32762.690000 -0.300000 2.000000 36482.690000 -0.200000 -0.500000 2917.440000 -0.200000 -0.400000 1937.440000 -0.200000 -0.300000 1157.440000 -0.200000 -0.200000 577.440000 -0.200000 -0.100000 197.440000 -0.200000 -0.000000 17.440000 -0.200000 0.100000 37.440000 -0.200000 0.200000 257.440000 -0.200000 0.300000 677.440000 -0.200000 0.400000 1297.440000 -0.200000 0.500000 2117.440000 -0.200000 0.600000 3137.440000 -0.200000 0.700000 4357.440000 -0.200000 0.800000 5777.440000 -0.200000 0.900000 7397.440000 -0.200000 1.000000 9217.440000 -0.200000 1.100000 11237.440000 -0.200000 1.200000 13457.440000 -0.200000 1.300000 15877.440000 -0.200000 1.400000 18497.440000 -0.200000 1.500000 21317.440000 -0.200000 1.600000 24337.440000 -0.200000 1.700000 27557.440000 -0.200000 1.800000 30977.440000 -0.200000 1.900000 34597.440000 -0.200000 2.000000 38417.440000 -0.100000 -0.500000 2602.210000 -0.100000 -0.400000 1682.210000 -0.100000 -0.300000 962.210000 -0.100000 -0.200000 442.210000 -0.100000 -0.100000 122.210000 -0.100000 -0.000000 2.210000 -0.100000 0.100000 82.210000 -0.100000 0.200000 362.210000 -0.100000 0.300000 842.210000 -0.100000 0.400000 1522.210000 -0.100000 0.500000 2402.210000 -0.100000 0.600000 3482.210000 -0.100000 0.700000 4762.210000 -0.100000 0.800000 6242.210000 -0.100000 0.900000 7922.210000 -0.100000 1.000000 9802.210000 -0.100000 1.100000 11882.210000 -0.100000 1.200000 14162.210000 -0.100000 1.300000 16642.210000 -0.100000 1.400000 19322.210000 -0.100000 1.500000 22202.210000 -0.100000 1.600000 25282.210000 -0.100000 1.700000 28562.210000 -0.100000 1.800000 32042.210000 -0.100000 1.900000 35722.210000 -0.100000 2.000000 39602.210000 -0.000000 -0.500000 2501.000000 -0.000000 -0.400000 1601.000000 -0.000000 -0.300000 901.000000 -0.000000 -0.200000 401.000000 -0.000000 -0.100000 101.000000 -0.000000 -0.000000 1.000000 -0.000000 0.100000 101.000000 -0.000000 0.200000 401.000000 -0.000000 0.300000 901.000000 -0.000000 0.400000 1601.000000 -0.000000 0.500000 2501.000000 -0.000000 0.600000 3601.000000 -0.000000 0.700000 4901.000000 -0.000000 0.800000 6401.000000 -0.000000 0.900000 8101.000000 -0.000000 1.000000 10001.000000 -0.000000 1.100000 12101.000000 -0.000000 1.200000 14401.000000 -0.000000 1.300000 16901.000000 -0.000000 1.400000 19601.000000 -0.000000 1.500000 22501.000000 -0.000000 1.600000 25601.000000 -0.000000 1.700000 28901.000000 -0.000000 1.800000 32401.000000 -0.000000 1.900000 36101.000000 -0.000000 2.000000 40001.000000 0.100000 -0.500000 2601.810000 0.100000 -0.400000 1681.810000 0.100000 -0.300000 961.810000 0.100000 -0.200000 441.810000 0.100000 -0.100000 121.810000 0.100000 -0.000000 1.810000 0.100000 0.100000 81.810000 0.100000 0.200000 361.810000 0.100000 0.300000 841.810000 0.100000 0.400000 1521.810000 0.100000 0.500000 2401.810000 0.100000 0.600000 3481.810000 0.100000 0.700000 4761.810000 0.100000 0.800000 6241.810000 0.100000 0.900000 7921.810000 0.100000 1.000000 9801.810000 0.100000 1.100000 11881.810000 0.100000 1.200000 14161.810000 0.100000 1.300000 16641.810000 0.100000 1.400000 19321.810000 0.100000 1.500000 22201.810000 0.100000 1.600000 25281.810000 0.100000 1.700000 28561.810000 0.100000 1.800000 32041.810000 0.100000 1.900000 35721.810000 0.100000 2.000000 39601.810000 0.200000 -0.500000 2916.640000 0.200000 -0.400000 1936.640000 0.200000 -0.300000 1156.640000 0.200000 -0.200000 576.640000 0.200000 -0.100000 196.640000 0.200000 -0.000000 16.640000 0.200000 0.100000 36.640000 0.200000 0.200000 256.640000 0.200000 0.300000 676.640000 0.200000 0.400000 1296.640000 0.200000 0.500000 2116.640000 0.200000 0.600000 3136.640000 0.200000 0.700000 4356.640000 0.200000 0.800000 5776.640000 0.200000 0.900000 7396.640000 0.200000 1.000000 9216.640000 0.200000 1.100000 11236.640000 0.200000 1.200000 13456.640000 0.200000 1.300000 15876.640000 0.200000 1.400000 18496.640000 0.200000 1.500000 21316.640000 0.200000 1.600000 24336.640000 0.200000 1.700000 27556.640000 0.200000 1.800000 30976.640000 0.200000 1.900000 34596.640000 0.200000 2.000000 38416.640000 0.300000 -0.500000 3481.490000 0.300000 -0.400000 2401.490000 0.300000 -0.300000 1521.490000 0.300000 -0.200000 841.490000 0.300000 -0.100000 361.490000 0.300000 -0.000000 81.490000 0.300000 0.100000 1.490000 0.300000 0.200000 121.490000 0.300000 0.300000 441.490000 0.300000 0.400000 961.490000 0.300000 0.500000 1681.490000 0.300000 0.600000 2601.490000 0.300000 0.700000 3721.490000 0.300000 0.800000 5041.490000 0.300000 0.900000 6561.490000 0.300000 1.000000 8281.490000 0.300000 1.100000 10201.490000 0.300000 1.200000 12321.490000 0.300000 1.300000 14641.490000 0.300000 1.400000 17161.490000 0.300000 1.500000 19881.490000 0.300000 1.600000 22801.490000 0.300000 1.700000 25921.490000 0.300000 1.800000 29241.490000 0.300000 1.900000 32761.490000 0.300000 2.000000 36481.490000 0.400000 -0.500000 4356.360000 0.400000 -0.400000 3136.360000 0.400000 -0.300000 2116.360000 0.400000 -0.200000 1296.360000 0.400000 -0.100000 676.360000 0.400000 -0.000000 256.360000 0.400000 0.100000 36.360000 0.400000 0.200000 16.360000 0.400000 0.300000 196.360000 0.400000 0.400000 576.360000 0.400000 0.500000 1156.360000 0.400000 0.600000 1936.360000 0.400000 0.700000 2916.360000 0.400000 0.800000 4096.360000 0.400000 0.900000 5476.360000 0.400000 1.000000 7056.360000 0.400000 1.100000 8836.360000 0.400000 1.200000 10816.360000 0.400000 1.300000 12996.360000 0.400000 1.400000 15376.360000 0.400000 1.500000 17956.360000 0.400000 1.600000 20736.360000 0.400000 1.700000 23716.360000 0.400000 1.800000 26896.360000 0.400000 1.900000 30276.360000 0.400000 2.000000 33856.360000 0.500000 -0.500000 5625.250000 0.500000 -0.400000 4225.250000 0.500000 -0.300000 3025.250000 0.500000 -0.200000 2025.250000 0.500000 -0.100000 1225.250000 0.500000 -0.000000 625.250000 0.500000 0.100000 225.250000 0.500000 0.200000 25.250000 0.500000 0.300000 25.250000 0.500000 0.400000 225.250000 0.500000 0.500000 625.250000 0.500000 0.600000 1225.250000 0.500000 0.700000 2025.250000 0.500000 0.800000 3025.250000 0.500000 0.900000 4225.250000 0.500000 1.000000 5625.250000 0.500000 1.100000 7225.250000 0.500000 1.200000 9025.250000 0.500000 1.300000 11025.250000 0.500000 1.400000 13225.250000 0.500000 1.500000 15625.250000 0.500000 1.600000 18225.250000 0.500000 1.700000 21025.250000 0.500000 1.800000 24025.250000 0.500000 1.900000 27225.250000 0.500000 2.000000 30625.250000 0.600000 -0.500000 7396.160000 0.600000 -0.400000 5776.160000 0.600000 -0.300000 4356.160000 0.600000 -0.200000 3136.160000 0.600000 -0.100000 2116.160000 0.600000 -0.000000 1296.160000 0.600000 0.100000 676.160000 0.600000 0.200000 256.160000 0.600000 0.300000 36.160000 0.600000 0.400000 16.160000 0.600000 0.500000 196.160000 0.600000 0.600000 576.160000 0.600000 0.700000 1156.160000 0.600000 0.800000 1936.160000 0.600000 0.900000 2916.160000 0.600000 1.000000 4096.160000 0.600000 1.100000 5476.160000 0.600000 1.200000 7056.160000 0.600000 1.300000 8836.160000 0.600000 1.400000 10816.160000 0.600000 1.500000 12996.160000 0.600000 1.600000 15376.160000 0.600000 1.700000 17956.160000 0.600000 1.800000 20736.160000 0.600000 1.900000 23716.160000 0.600000 2.000000 26896.160000 0.700000 -0.500000 9801.090000 0.700000 -0.400000 7921.090000 0.700000 -0.300000 6241.090000 0.700000 -0.200000 4761.090000 0.700000 -0.100000 3481.090000 0.700000 -0.000000 2401.090000 0.700000 0.100000 1521.090000 0.700000 0.200000 841.090000 0.700000 0.300000 361.090000 0.700000 0.400000 81.090000 0.700000 0.500000 1.090000 0.700000 0.600000 121.090000 0.700000 0.700000 441.090000 0.700000 0.800000 961.090000 0.700000 0.900000 1681.090000 0.700000 1.000000 2601.090000 0.700000 1.100000 3721.090000 0.700000 1.200000 5041.090000 0.700000 1.300000 6561.090000 0.700000 1.400000 8281.090000 0.700000 1.500000 10201.090000 0.700000 1.600000 12321.090000 0.700000 1.700000 14641.090000 0.700000 1.800000 17161.090000 0.700000 1.900000 19881.090000 0.700000 2.000000 22801.090000 0.800000 -0.500000 12996.040000 0.800000 -0.400000 10816.040000 0.800000 -0.300000 8836.040000 0.800000 -0.200000 7056.040000 0.800000 -0.100000 5476.040000 0.800000 -0.000000 4096.040000 0.800000 0.100000 2916.040000 0.800000 0.200000 1936.040000 0.800000 0.300000 1156.040000 0.800000 0.400000 576.040000 0.800000 0.500000 196.040000 0.800000 0.600000 16.040000 0.800000 0.700000 36.040000 0.800000 0.800000 256.040000 0.800000 0.900000 676.040000 0.800000 1.000000 1296.040000 0.800000 1.100000 2116.040000 0.800000 1.200000 3136.040000 0.800000 1.300000 4356.040000 0.800000 1.400000 5776.040000 0.800000 1.500000 7396.040000 0.800000 1.600000 9216.040000 0.800000 1.700000 11236.040000 0.800000 1.800000 13456.040000 0.800000 1.900000 15876.040000 0.800000 2.000000 18496.040000 0.900000 -0.500000 17161.010000 0.900000 -0.400000 14641.010000 0.900000 -0.300000 12321.010000 0.900000 -0.200000 10201.010000 0.900000 -0.100000 8281.010000 0.900000 -0.000000 6561.010000 0.900000 0.100000 5041.010000 0.900000 0.200000 3721.010000 0.900000 0.300000 2601.010000 0.900000 0.400000 1681.010000 0.900000 0.500000 961.010000 0.900000 0.600000 441.010000 0.900000 0.700000 121.010000 0.900000 0.800000 1.010000 0.900000 0.900000 81.010000 0.900000 1.000000 361.010000 0.900000 1.100000 841.010000 0.900000 1.200000 1521.010000 0.900000 1.300000 2401.010000 0.900000 1.400000 3481.010000 0.900000 1.500000 4761.010000 0.900000 1.600000 6241.010000 0.900000 1.700000 7921.010000 0.900000 1.800000 9801.010000 0.900000 1.900000 11881.010000 0.900000 2.000000 14161.010000 1.000000 -0.500000 22500.000000 1.000000 -0.400000 19600.000000 1.000000 -0.300000 16900.000000 1.000000 -0.200000 14400.000000 1.000000 -0.100000 12100.000000 1.000000 -0.000000 10000.000000 1.000000 0.100000 8100.000000 1.000000 0.200000 6400.000000 1.000000 0.300000 4900.000000 1.000000 0.400000 3600.000000 1.000000 0.500000 2500.000000 1.000000 0.600000 1600.000000 1.000000 0.700000 900.000000 1.000000 0.800000 400.000000 1.000000 0.900000 100.000000 1.000000 1.000000 0.000000 1.000000 1.100000 100.000000 1.000000 1.200000 400.000000 1.000000 1.300000 900.000000 1.000000 1.400000 1600.000000 1.000000 1.500000 2500.000000 1.000000 1.600000 3600.000000 1.000000 1.700000 4900.000000 1.000000 1.800000 6400.000000 1.000000 1.900000 8100.000000 1.000000 2.000000 10000.000000 1.100000 -0.500000 29241.010000 1.100000 -0.400000 25921.010000 1.100000 -0.300000 22801.010000 1.100000 -0.200000 19881.010000 1.100000 -0.100000 17161.010000 1.100000 -0.000000 14641.010000 1.100000 0.100000 12321.010000 1.100000 0.200000 10201.010000 1.100000 0.300000 8281.010000 1.100000 0.400000 6561.010000 1.100000 0.500000 5041.010000 1.100000 0.600000 3721.010000 1.100000 0.700000 2601.010000 1.100000 0.800000 1681.010000 1.100000 0.900000 961.010000 1.100000 1.000000 441.010000 1.100000 1.100000 121.010000 1.100000 1.200000 1.010000 1.100000 1.300000 81.010000 1.100000 1.400000 361.010000 1.100000 1.500000 841.010000 1.100000 1.600000 1521.010000 1.100000 1.700000 2401.010000 1.100000 1.800000 3481.010000 1.100000 1.900000 4761.010000 1.100000 2.000000 6241.010000 1.200000 -0.500000 37636.040000 1.200000 -0.400000 33856.040000 1.200000 -0.300000 30276.040000 1.200000 -0.200000 26896.040000 1.200000 -0.100000 23716.040000 1.200000 -0.000000 20736.040000 1.200000 0.100000 17956.040000 1.200000 0.200000 15376.040000 1.200000 0.300000 12996.040000 1.200000 0.400000 10816.040000 1.200000 0.500000 8836.040000 1.200000 0.600000 7056.040000 1.200000 0.700000 5476.040000 1.200000 0.800000 4096.040000 1.200000 0.900000 2916.040000 1.200000 1.000000 1936.040000 1.200000 1.100000 1156.040000 1.200000 1.200000 576.040000 1.200000 1.300000 196.040000 1.200000 1.400000 16.040000 1.200000 1.500000 36.040000 1.200000 1.600000 256.040000 1.200000 1.700000 676.040000 1.200000 1.800000 1296.040000 1.200000 1.900000 2116.040000 1.200000 2.000000 3136.040000 -0.500000 1.750000 -1.142419 0.893275 -1.002809 0.986100 -0.918244 0.836060 -0.843637 0.706196 -0.767030 0.582503 -0.689381 0.469250 -0.611125 0.367380 -0.532857 0.277838 -0.455124 0.201118 -0.378459 0.137373 -0.303367 0.086408 -0.230328 0.047728 -0.159798 0.020569 -0.092192 0.003934 -0.027873 -0.003358 0.032893 -0.002611 0.089988 0.004836 0.143479 0.017721 0.193621 0.034970 0.240795 0.055751 0.285430 0.079471 0.327928 0.105723 0.368632 0.134225 0.407805 0.164762 0.445640 0.197155 0.482269 0.231234 0.517778 0.266826 0.552221 0.303754 0.585627 0.341835 0.618008 0.380878 0.649364 0.420684 0.679689 0.461051 0.708966 0.501770 0.737174 0.542625 0.764288 0.583396 0.790274 0.623854 0.815097 0.663764 0.838715 0.702882 0.861079 0.740954 0.882134 0.777714 0.901817 0.812884 0.920054 0.846166 0.936762 0.877243 0.951840 0.905772 0.965169 0.931373 0.976604 0.953625 0.985967 0.972043 0.993042 0.986082 0.997603 0.995191 0.999638 0.999272 0.999980 0.999959 1.000000 0.999999 1.000000 1.000000 -0.500000 1.750000 -0.946006 1.109349 -0.921962 0.850093 -0.691178 0.472692 -0.415856 0.165195 -0.135440 0.012083 0.128552 0.014498 0.393660 0.156838 0.667141 0.449487 0.796457 0.635023 0.923422 0.853111 0.985892 0.972006 0.998922 0.997845 0.999970 0.999941 1.000000 0.999999 1.000000 1.000000 gsl-doc-2.3/doc/examples/permseq.c0000664000175000017500000000051612616157443015200 0ustar eddedd#include #include 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; } gsl-doc-2.3/doc/examples/randpoisson2.txt0000664000175000017500000000002512620441667016534 0ustar eddedd 4 5 6 3 3 1 4 2 5 5 gsl-doc-2.3/doc/examples/diff.c0000664000175000017500000000126312620167513014426 0ustar eddedd#include #include #include double f (double x, void * params) { (void)(params); /* avoid unused parameter warning */ 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; } gsl-doc-2.3/doc/examples/rootnewt.c0000664000175000017500000000227112616241135015375 0ustar eddedd#include #include #include #include #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 = ¶ms; 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; } gsl-doc-2.3/doc/examples/interp_compare.c0000664000175000017500000000303712616157443016534 0ustar eddedd#include #include #include #include #include int main(void) { size_t i; const size_t N = 9; /* this dataset is taken from * J. M. Hyman, Accurate Monotonicity preserving cubic interpolation, * SIAM J. Sci. Stat. Comput. 4, 4, 1983. */ const double x[] = { 7.99, 8.09, 8.19, 8.7, 9.2, 10.0, 12.0, 15.0, 20.0 }; const double y[] = { 0.0, 2.76429e-5, 4.37498e-2, 0.169183, 0.469428, 0.943740, 0.998636, 0.999919, 0.999994 }; gsl_interp_accel *acc = gsl_interp_accel_alloc(); gsl_spline *spline_cubic = gsl_spline_alloc(gsl_interp_cspline, N); gsl_spline *spline_akima = gsl_spline_alloc(gsl_interp_akima, N); gsl_spline *spline_steffen = gsl_spline_alloc(gsl_interp_steffen, N); gsl_spline_init(spline_cubic, x, y, N); gsl_spline_init(spline_akima, x, y, N); gsl_spline_init(spline_steffen, x, y, N); for (i = 0; i < N; ++i) printf("%g %g\n", x[i], y[i]); printf("\n\n"); for (i = 0; i <= 100; ++i) { double xi = (1 - i / 100.0) * x[0] + (i / 100.0) * x[N-1]; double yi_cubic = gsl_spline_eval(spline_cubic, xi, acc); double yi_akima = gsl_spline_eval(spline_akima, xi, acc); double yi_steffen = gsl_spline_eval(spline_steffen, xi, acc); printf("%g %g %g %g\n", xi, yi_cubic, yi_akima, yi_steffen); } gsl_spline_free(spline_cubic); gsl_spline_free(spline_akima); gsl_spline_free(spline_steffen); gsl_interp_accel_free(acc); return 0; } gsl-doc-2.3/doc/examples/integration.txt0000664000175000017500000000026412620435424016435 0ustar eddeddresult = -4.000000000000085265 exact result = -4.000000000000000000 estimated error = 0.000000000000135447 actual error = -0.000000000000085265 intervals = 8 gsl-doc-2.3/doc/examples/fftmr.txt0000664000175000017500000011523512620431767015243 0ustar eddedd0: 1.000000e+00 0.000000e+00 1: 1.000000e+00 0.000000e+00 2: 1.000000e+00 0.000000e+00 3: 1.000000e+00 0.000000e+00 4: 1.000000e+00 0.000000e+00 5: 1.000000e+00 0.000000e+00 6: 1.000000e+00 0.000000e+00 7: 1.000000e+00 0.000000e+00 8: 1.000000e+00 0.000000e+00 9: 1.000000e+00 0.000000e+00 10: 1.000000e+00 0.000000e+00 11: 0.000000e+00 0.000000e+00 12: 0.000000e+00 0.000000e+00 13: 0.000000e+00 0.000000e+00 14: 0.000000e+00 0.000000e+00 15: 0.000000e+00 0.000000e+00 16: 0.000000e+00 0.000000e+00 17: 0.000000e+00 0.000000e+00 18: 0.000000e+00 0.000000e+00 19: 0.000000e+00 0.000000e+00 20: 0.000000e+00 0.000000e+00 21: 0.000000e+00 0.000000e+00 22: 0.000000e+00 0.000000e+00 23: 0.000000e+00 0.000000e+00 24: 0.000000e+00 0.000000e+00 25: 0.000000e+00 0.000000e+00 26: 0.000000e+00 0.000000e+00 27: 0.000000e+00 0.000000e+00 28: 0.000000e+00 0.000000e+00 29: 0.000000e+00 0.000000e+00 30: 0.000000e+00 0.000000e+00 31: 0.000000e+00 0.000000e+00 32: 0.000000e+00 0.000000e+00 33: 0.000000e+00 0.000000e+00 34: 0.000000e+00 0.000000e+00 35: 0.000000e+00 0.000000e+00 36: 0.000000e+00 0.000000e+00 37: 0.000000e+00 0.000000e+00 38: 0.000000e+00 0.000000e+00 39: 0.000000e+00 0.000000e+00 40: 0.000000e+00 0.000000e+00 41: 0.000000e+00 0.000000e+00 42: 0.000000e+00 0.000000e+00 43: 0.000000e+00 0.000000e+00 44: 0.000000e+00 0.000000e+00 45: 0.000000e+00 0.000000e+00 46: 0.000000e+00 0.000000e+00 47: 0.000000e+00 0.000000e+00 48: 0.000000e+00 0.000000e+00 49: 0.000000e+00 0.000000e+00 50: 0.000000e+00 0.000000e+00 51: 0.000000e+00 0.000000e+00 52: 0.000000e+00 0.000000e+00 53: 0.000000e+00 0.000000e+00 54: 0.000000e+00 0.000000e+00 55: 0.000000e+00 0.000000e+00 56: 0.000000e+00 0.000000e+00 57: 0.000000e+00 0.000000e+00 58: 0.000000e+00 0.000000e+00 59: 0.000000e+00 0.000000e+00 60: 0.000000e+00 0.000000e+00 61: 0.000000e+00 0.000000e+00 62: 0.000000e+00 0.000000e+00 63: 0.000000e+00 0.000000e+00 64: 0.000000e+00 0.000000e+00 65: 0.000000e+00 0.000000e+00 66: 0.000000e+00 0.000000e+00 67: 0.000000e+00 0.000000e+00 68: 0.000000e+00 0.000000e+00 69: 0.000000e+00 0.000000e+00 70: 0.000000e+00 0.000000e+00 71: 0.000000e+00 0.000000e+00 72: 0.000000e+00 0.000000e+00 73: 0.000000e+00 0.000000e+00 74: 0.000000e+00 0.000000e+00 75: 0.000000e+00 0.000000e+00 76: 0.000000e+00 0.000000e+00 77: 0.000000e+00 0.000000e+00 78: 0.000000e+00 0.000000e+00 79: 0.000000e+00 0.000000e+00 80: 0.000000e+00 0.000000e+00 81: 0.000000e+00 0.000000e+00 82: 0.000000e+00 0.000000e+00 83: 0.000000e+00 0.000000e+00 84: 0.000000e+00 0.000000e+00 85: 0.000000e+00 0.000000e+00 86: 0.000000e+00 0.000000e+00 87: 0.000000e+00 0.000000e+00 88: 0.000000e+00 0.000000e+00 89: 0.000000e+00 0.000000e+00 90: 0.000000e+00 0.000000e+00 91: 0.000000e+00 0.000000e+00 92: 0.000000e+00 0.000000e+00 93: 0.000000e+00 0.000000e+00 94: 0.000000e+00 0.000000e+00 95: 0.000000e+00 0.000000e+00 96: 0.000000e+00 0.000000e+00 97: 0.000000e+00 0.000000e+00 98: 0.000000e+00 0.000000e+00 99: 0.000000e+00 0.000000e+00 100: 0.000000e+00 0.000000e+00 101: 0.000000e+00 0.000000e+00 102: 0.000000e+00 0.000000e+00 103: 0.000000e+00 0.000000e+00 104: 0.000000e+00 0.000000e+00 105: 0.000000e+00 0.000000e+00 106: 0.000000e+00 0.000000e+00 107: 0.000000e+00 0.000000e+00 108: 0.000000e+00 0.000000e+00 109: 0.000000e+00 0.000000e+00 110: 0.000000e+00 0.000000e+00 111: 0.000000e+00 0.000000e+00 112: 0.000000e+00 0.000000e+00 113: 0.000000e+00 0.000000e+00 114: 0.000000e+00 0.000000e+00 115: 0.000000e+00 0.000000e+00 116: 0.000000e+00 0.000000e+00 117: 0.000000e+00 0.000000e+00 118: 0.000000e+00 0.000000e+00 119: 0.000000e+00 0.000000e+00 120: 0.000000e+00 0.000000e+00 121: 0.000000e+00 0.000000e+00 122: 0.000000e+00 0.000000e+00 123: 0.000000e+00 0.000000e+00 124: 0.000000e+00 0.000000e+00 125: 0.000000e+00 0.000000e+00 126: 0.000000e+00 0.000000e+00 127: 0.000000e+00 0.000000e+00 128: 0.000000e+00 0.000000e+00 129: 0.000000e+00 0.000000e+00 130: 0.000000e+00 0.000000e+00 131: 0.000000e+00 0.000000e+00 132: 0.000000e+00 0.000000e+00 133: 0.000000e+00 0.000000e+00 134: 0.000000e+00 0.000000e+00 135: 0.000000e+00 0.000000e+00 136: 0.000000e+00 0.000000e+00 137: 0.000000e+00 0.000000e+00 138: 0.000000e+00 0.000000e+00 139: 0.000000e+00 0.000000e+00 140: 0.000000e+00 0.000000e+00 141: 0.000000e+00 0.000000e+00 142: 0.000000e+00 0.000000e+00 143: 0.000000e+00 0.000000e+00 144: 0.000000e+00 0.000000e+00 145: 0.000000e+00 0.000000e+00 146: 0.000000e+00 0.000000e+00 147: 0.000000e+00 0.000000e+00 148: 0.000000e+00 0.000000e+00 149: 0.000000e+00 0.000000e+00 150: 0.000000e+00 0.000000e+00 151: 0.000000e+00 0.000000e+00 152: 0.000000e+00 0.000000e+00 153: 0.000000e+00 0.000000e+00 154: 0.000000e+00 0.000000e+00 155: 0.000000e+00 0.000000e+00 156: 0.000000e+00 0.000000e+00 157: 0.000000e+00 0.000000e+00 158: 0.000000e+00 0.000000e+00 159: 0.000000e+00 0.000000e+00 160: 0.000000e+00 0.000000e+00 161: 0.000000e+00 0.000000e+00 162: 0.000000e+00 0.000000e+00 163: 0.000000e+00 0.000000e+00 164: 0.000000e+00 0.000000e+00 165: 0.000000e+00 0.000000e+00 166: 0.000000e+00 0.000000e+00 167: 0.000000e+00 0.000000e+00 168: 0.000000e+00 0.000000e+00 169: 0.000000e+00 0.000000e+00 170: 0.000000e+00 0.000000e+00 171: 0.000000e+00 0.000000e+00 172: 0.000000e+00 0.000000e+00 173: 0.000000e+00 0.000000e+00 174: 0.000000e+00 0.000000e+00 175: 0.000000e+00 0.000000e+00 176: 0.000000e+00 0.000000e+00 177: 0.000000e+00 0.000000e+00 178: 0.000000e+00 0.000000e+00 179: 0.000000e+00 0.000000e+00 180: 0.000000e+00 0.000000e+00 181: 0.000000e+00 0.000000e+00 182: 0.000000e+00 0.000000e+00 183: 0.000000e+00 0.000000e+00 184: 0.000000e+00 0.000000e+00 185: 0.000000e+00 0.000000e+00 186: 0.000000e+00 0.000000e+00 187: 0.000000e+00 0.000000e+00 188: 0.000000e+00 0.000000e+00 189: 0.000000e+00 0.000000e+00 190: 0.000000e+00 0.000000e+00 191: 0.000000e+00 0.000000e+00 192: 0.000000e+00 0.000000e+00 193: 0.000000e+00 0.000000e+00 194: 0.000000e+00 0.000000e+00 195: 0.000000e+00 0.000000e+00 196: 0.000000e+00 0.000000e+00 197: 0.000000e+00 0.000000e+00 198: 0.000000e+00 0.000000e+00 199: 0.000000e+00 0.000000e+00 200: 0.000000e+00 0.000000e+00 201: 0.000000e+00 0.000000e+00 202: 0.000000e+00 0.000000e+00 203: 0.000000e+00 0.000000e+00 204: 0.000000e+00 0.000000e+00 205: 0.000000e+00 0.000000e+00 206: 0.000000e+00 0.000000e+00 207: 0.000000e+00 0.000000e+00 208: 0.000000e+00 0.000000e+00 209: 0.000000e+00 0.000000e+00 210: 0.000000e+00 0.000000e+00 211: 0.000000e+00 0.000000e+00 212: 0.000000e+00 0.000000e+00 213: 0.000000e+00 0.000000e+00 214: 0.000000e+00 0.000000e+00 215: 0.000000e+00 0.000000e+00 216: 0.000000e+00 0.000000e+00 217: 0.000000e+00 0.000000e+00 218: 0.000000e+00 0.000000e+00 219: 0.000000e+00 0.000000e+00 220: 0.000000e+00 0.000000e+00 221: 0.000000e+00 0.000000e+00 222: 0.000000e+00 0.000000e+00 223: 0.000000e+00 0.000000e+00 224: 0.000000e+00 0.000000e+00 225: 0.000000e+00 0.000000e+00 226: 0.000000e+00 0.000000e+00 227: 0.000000e+00 0.000000e+00 228: 0.000000e+00 0.000000e+00 229: 0.000000e+00 0.000000e+00 230: 0.000000e+00 0.000000e+00 231: 0.000000e+00 0.000000e+00 232: 0.000000e+00 0.000000e+00 233: 0.000000e+00 0.000000e+00 234: 0.000000e+00 0.000000e+00 235: 0.000000e+00 0.000000e+00 236: 0.000000e+00 0.000000e+00 237: 0.000000e+00 0.000000e+00 238: 0.000000e+00 0.000000e+00 239: 0.000000e+00 0.000000e+00 240: 0.000000e+00 0.000000e+00 241: 0.000000e+00 0.000000e+00 242: 0.000000e+00 0.000000e+00 243: 0.000000e+00 0.000000e+00 244: 0.000000e+00 0.000000e+00 245: 0.000000e+00 0.000000e+00 246: 0.000000e+00 0.000000e+00 247: 0.000000e+00 0.000000e+00 248: 0.000000e+00 0.000000e+00 249: 0.000000e+00 0.000000e+00 250: 0.000000e+00 0.000000e+00 251: 0.000000e+00 0.000000e+00 252: 0.000000e+00 0.000000e+00 253: 0.000000e+00 0.000000e+00 254: 0.000000e+00 0.000000e+00 255: 0.000000e+00 0.000000e+00 256: 0.000000e+00 0.000000e+00 257: 0.000000e+00 0.000000e+00 258: 0.000000e+00 0.000000e+00 259: 0.000000e+00 0.000000e+00 260: 0.000000e+00 0.000000e+00 261: 0.000000e+00 0.000000e+00 262: 0.000000e+00 0.000000e+00 263: 0.000000e+00 0.000000e+00 264: 0.000000e+00 0.000000e+00 265: 0.000000e+00 0.000000e+00 266: 0.000000e+00 0.000000e+00 267: 0.000000e+00 0.000000e+00 268: 0.000000e+00 0.000000e+00 269: 0.000000e+00 0.000000e+00 270: 0.000000e+00 0.000000e+00 271: 0.000000e+00 0.000000e+00 272: 0.000000e+00 0.000000e+00 273: 0.000000e+00 0.000000e+00 274: 0.000000e+00 0.000000e+00 275: 0.000000e+00 0.000000e+00 276: 0.000000e+00 0.000000e+00 277: 0.000000e+00 0.000000e+00 278: 0.000000e+00 0.000000e+00 279: 0.000000e+00 0.000000e+00 280: 0.000000e+00 0.000000e+00 281: 0.000000e+00 0.000000e+00 282: 0.000000e+00 0.000000e+00 283: 0.000000e+00 0.000000e+00 284: 0.000000e+00 0.000000e+00 285: 0.000000e+00 0.000000e+00 286: 0.000000e+00 0.000000e+00 287: 0.000000e+00 0.000000e+00 288: 0.000000e+00 0.000000e+00 289: 0.000000e+00 0.000000e+00 290: 0.000000e+00 0.000000e+00 291: 0.000000e+00 0.000000e+00 292: 0.000000e+00 0.000000e+00 293: 0.000000e+00 0.000000e+00 294: 0.000000e+00 0.000000e+00 295: 0.000000e+00 0.000000e+00 296: 0.000000e+00 0.000000e+00 297: 0.000000e+00 0.000000e+00 298: 0.000000e+00 0.000000e+00 299: 0.000000e+00 0.000000e+00 300: 0.000000e+00 0.000000e+00 301: 0.000000e+00 0.000000e+00 302: 0.000000e+00 0.000000e+00 303: 0.000000e+00 0.000000e+00 304: 0.000000e+00 0.000000e+00 305: 0.000000e+00 0.000000e+00 306: 0.000000e+00 0.000000e+00 307: 0.000000e+00 0.000000e+00 308: 0.000000e+00 0.000000e+00 309: 0.000000e+00 0.000000e+00 310: 0.000000e+00 0.000000e+00 311: 0.000000e+00 0.000000e+00 312: 0.000000e+00 0.000000e+00 313: 0.000000e+00 0.000000e+00 314: 0.000000e+00 0.000000e+00 315: 0.000000e+00 0.000000e+00 316: 0.000000e+00 0.000000e+00 317: 0.000000e+00 0.000000e+00 318: 0.000000e+00 0.000000e+00 319: 0.000000e+00 0.000000e+00 320: 0.000000e+00 0.000000e+00 321: 0.000000e+00 0.000000e+00 322: 0.000000e+00 0.000000e+00 323: 0.000000e+00 0.000000e+00 324: 0.000000e+00 0.000000e+00 325: 0.000000e+00 0.000000e+00 326: 0.000000e+00 0.000000e+00 327: 0.000000e+00 0.000000e+00 328: 0.000000e+00 0.000000e+00 329: 0.000000e+00 0.000000e+00 330: 0.000000e+00 0.000000e+00 331: 0.000000e+00 0.000000e+00 332: 0.000000e+00 0.000000e+00 333: 0.000000e+00 0.000000e+00 334: 0.000000e+00 0.000000e+00 335: 0.000000e+00 0.000000e+00 336: 0.000000e+00 0.000000e+00 337: 0.000000e+00 0.000000e+00 338: 0.000000e+00 0.000000e+00 339: 0.000000e+00 0.000000e+00 340: 0.000000e+00 0.000000e+00 341: 0.000000e+00 0.000000e+00 342: 0.000000e+00 0.000000e+00 343: 0.000000e+00 0.000000e+00 344: 0.000000e+00 0.000000e+00 345: 0.000000e+00 0.000000e+00 346: 0.000000e+00 0.000000e+00 347: 0.000000e+00 0.000000e+00 348: 0.000000e+00 0.000000e+00 349: 0.000000e+00 0.000000e+00 350: 0.000000e+00 0.000000e+00 351: 0.000000e+00 0.000000e+00 352: 0.000000e+00 0.000000e+00 353: 0.000000e+00 0.000000e+00 354: 0.000000e+00 0.000000e+00 355: 0.000000e+00 0.000000e+00 356: 0.000000e+00 0.000000e+00 357: 0.000000e+00 0.000000e+00 358: 0.000000e+00 0.000000e+00 359: 0.000000e+00 0.000000e+00 360: 0.000000e+00 0.000000e+00 361: 0.000000e+00 0.000000e+00 362: 0.000000e+00 0.000000e+00 363: 0.000000e+00 0.000000e+00 364: 0.000000e+00 0.000000e+00 365: 0.000000e+00 0.000000e+00 366: 0.000000e+00 0.000000e+00 367: 0.000000e+00 0.000000e+00 368: 0.000000e+00 0.000000e+00 369: 0.000000e+00 0.000000e+00 370: 0.000000e+00 0.000000e+00 371: 0.000000e+00 0.000000e+00 372: 0.000000e+00 0.000000e+00 373: 0.000000e+00 0.000000e+00 374: 0.000000e+00 0.000000e+00 375: 0.000000e+00 0.000000e+00 376: 0.000000e+00 0.000000e+00 377: 0.000000e+00 0.000000e+00 378: 0.000000e+00 0.000000e+00 379: 0.000000e+00 0.000000e+00 380: 0.000000e+00 0.000000e+00 381: 0.000000e+00 0.000000e+00 382: 0.000000e+00 0.000000e+00 383: 0.000000e+00 0.000000e+00 384: 0.000000e+00 0.000000e+00 385: 0.000000e+00 0.000000e+00 386: 0.000000e+00 0.000000e+00 387: 0.000000e+00 0.000000e+00 388: 0.000000e+00 0.000000e+00 389: 0.000000e+00 0.000000e+00 390: 0.000000e+00 0.000000e+00 391: 0.000000e+00 0.000000e+00 392: 0.000000e+00 0.000000e+00 393: 0.000000e+00 0.000000e+00 394: 0.000000e+00 0.000000e+00 395: 0.000000e+00 0.000000e+00 396: 0.000000e+00 0.000000e+00 397: 0.000000e+00 0.000000e+00 398: 0.000000e+00 0.000000e+00 399: 0.000000e+00 0.000000e+00 400: 0.000000e+00 0.000000e+00 401: 0.000000e+00 0.000000e+00 402: 0.000000e+00 0.000000e+00 403: 0.000000e+00 0.000000e+00 404: 0.000000e+00 0.000000e+00 405: 0.000000e+00 0.000000e+00 406: 0.000000e+00 0.000000e+00 407: 0.000000e+00 0.000000e+00 408: 0.000000e+00 0.000000e+00 409: 0.000000e+00 0.000000e+00 410: 0.000000e+00 0.000000e+00 411: 0.000000e+00 0.000000e+00 412: 0.000000e+00 0.000000e+00 413: 0.000000e+00 0.000000e+00 414: 0.000000e+00 0.000000e+00 415: 0.000000e+00 0.000000e+00 416: 0.000000e+00 0.000000e+00 417: 0.000000e+00 0.000000e+00 418: 0.000000e+00 0.000000e+00 419: 0.000000e+00 0.000000e+00 420: 0.000000e+00 0.000000e+00 421: 0.000000e+00 0.000000e+00 422: 0.000000e+00 0.000000e+00 423: 0.000000e+00 0.000000e+00 424: 0.000000e+00 0.000000e+00 425: 0.000000e+00 0.000000e+00 426: 0.000000e+00 0.000000e+00 427: 0.000000e+00 0.000000e+00 428: 0.000000e+00 0.000000e+00 429: 0.000000e+00 0.000000e+00 430: 0.000000e+00 0.000000e+00 431: 0.000000e+00 0.000000e+00 432: 0.000000e+00 0.000000e+00 433: 0.000000e+00 0.000000e+00 434: 0.000000e+00 0.000000e+00 435: 0.000000e+00 0.000000e+00 436: 0.000000e+00 0.000000e+00 437: 0.000000e+00 0.000000e+00 438: 0.000000e+00 0.000000e+00 439: 0.000000e+00 0.000000e+00 440: 0.000000e+00 0.000000e+00 441: 0.000000e+00 0.000000e+00 442: 0.000000e+00 0.000000e+00 443: 0.000000e+00 0.000000e+00 444: 0.000000e+00 0.000000e+00 445: 0.000000e+00 0.000000e+00 446: 0.000000e+00 0.000000e+00 447: 0.000000e+00 0.000000e+00 448: 0.000000e+00 0.000000e+00 449: 0.000000e+00 0.000000e+00 450: 0.000000e+00 0.000000e+00 451: 0.000000e+00 0.000000e+00 452: 0.000000e+00 0.000000e+00 453: 0.000000e+00 0.000000e+00 454: 0.000000e+00 0.000000e+00 455: 0.000000e+00 0.000000e+00 456: 0.000000e+00 0.000000e+00 457: 0.000000e+00 0.000000e+00 458: 0.000000e+00 0.000000e+00 459: 0.000000e+00 0.000000e+00 460: 0.000000e+00 0.000000e+00 461: 0.000000e+00 0.000000e+00 462: 0.000000e+00 0.000000e+00 463: 0.000000e+00 0.000000e+00 464: 0.000000e+00 0.000000e+00 465: 0.000000e+00 0.000000e+00 466: 0.000000e+00 0.000000e+00 467: 0.000000e+00 0.000000e+00 468: 0.000000e+00 0.000000e+00 469: 0.000000e+00 0.000000e+00 470: 0.000000e+00 0.000000e+00 471: 0.000000e+00 0.000000e+00 472: 0.000000e+00 0.000000e+00 473: 0.000000e+00 0.000000e+00 474: 0.000000e+00 0.000000e+00 475: 0.000000e+00 0.000000e+00 476: 0.000000e+00 0.000000e+00 477: 0.000000e+00 0.000000e+00 478: 0.000000e+00 0.000000e+00 479: 0.000000e+00 0.000000e+00 480: 0.000000e+00 0.000000e+00 481: 0.000000e+00 0.000000e+00 482: 0.000000e+00 0.000000e+00 483: 0.000000e+00 0.000000e+00 484: 0.000000e+00 0.000000e+00 485: 0.000000e+00 0.000000e+00 486: 0.000000e+00 0.000000e+00 487: 0.000000e+00 0.000000e+00 488: 0.000000e+00 0.000000e+00 489: 0.000000e+00 0.000000e+00 490: 0.000000e+00 0.000000e+00 491: 0.000000e+00 0.000000e+00 492: 0.000000e+00 0.000000e+00 493: 0.000000e+00 0.000000e+00 494: 0.000000e+00 0.000000e+00 495: 0.000000e+00 0.000000e+00 496: 0.000000e+00 0.000000e+00 497: 0.000000e+00 0.000000e+00 498: 0.000000e+00 0.000000e+00 499: 0.000000e+00 0.000000e+00 500: 0.000000e+00 0.000000e+00 501: 0.000000e+00 0.000000e+00 502: 0.000000e+00 0.000000e+00 503: 0.000000e+00 0.000000e+00 504: 0.000000e+00 0.000000e+00 505: 0.000000e+00 0.000000e+00 506: 0.000000e+00 0.000000e+00 507: 0.000000e+00 0.000000e+00 508: 0.000000e+00 0.000000e+00 509: 0.000000e+00 0.000000e+00 510: 0.000000e+00 0.000000e+00 511: 0.000000e+00 0.000000e+00 512: 0.000000e+00 0.000000e+00 513: 0.000000e+00 0.000000e+00 514: 0.000000e+00 0.000000e+00 515: 0.000000e+00 0.000000e+00 516: 0.000000e+00 0.000000e+00 517: 0.000000e+00 0.000000e+00 518: 0.000000e+00 0.000000e+00 519: 0.000000e+00 0.000000e+00 520: 0.000000e+00 0.000000e+00 521: 0.000000e+00 0.000000e+00 522: 0.000000e+00 0.000000e+00 523: 0.000000e+00 0.000000e+00 524: 0.000000e+00 0.000000e+00 525: 0.000000e+00 0.000000e+00 526: 0.000000e+00 0.000000e+00 527: 0.000000e+00 0.000000e+00 528: 0.000000e+00 0.000000e+00 529: 0.000000e+00 0.000000e+00 530: 0.000000e+00 0.000000e+00 531: 0.000000e+00 0.000000e+00 532: 0.000000e+00 0.000000e+00 533: 0.000000e+00 0.000000e+00 534: 0.000000e+00 0.000000e+00 535: 0.000000e+00 0.000000e+00 536: 0.000000e+00 0.000000e+00 537: 0.000000e+00 0.000000e+00 538: 0.000000e+00 0.000000e+00 539: 0.000000e+00 0.000000e+00 540: 0.000000e+00 0.000000e+00 541: 0.000000e+00 0.000000e+00 542: 0.000000e+00 0.000000e+00 543: 0.000000e+00 0.000000e+00 544: 0.000000e+00 0.000000e+00 545: 0.000000e+00 0.000000e+00 546: 0.000000e+00 0.000000e+00 547: 0.000000e+00 0.000000e+00 548: 0.000000e+00 0.000000e+00 549: 0.000000e+00 0.000000e+00 550: 0.000000e+00 0.000000e+00 551: 0.000000e+00 0.000000e+00 552: 0.000000e+00 0.000000e+00 553: 0.000000e+00 0.000000e+00 554: 0.000000e+00 0.000000e+00 555: 0.000000e+00 0.000000e+00 556: 0.000000e+00 0.000000e+00 557: 0.000000e+00 0.000000e+00 558: 0.000000e+00 0.000000e+00 559: 0.000000e+00 0.000000e+00 560: 0.000000e+00 0.000000e+00 561: 0.000000e+00 0.000000e+00 562: 0.000000e+00 0.000000e+00 563: 0.000000e+00 0.000000e+00 564: 0.000000e+00 0.000000e+00 565: 0.000000e+00 0.000000e+00 566: 0.000000e+00 0.000000e+00 567: 0.000000e+00 0.000000e+00 568: 0.000000e+00 0.000000e+00 569: 0.000000e+00 0.000000e+00 570: 0.000000e+00 0.000000e+00 571: 0.000000e+00 0.000000e+00 572: 0.000000e+00 0.000000e+00 573: 0.000000e+00 0.000000e+00 574: 0.000000e+00 0.000000e+00 575: 0.000000e+00 0.000000e+00 576: 0.000000e+00 0.000000e+00 577: 0.000000e+00 0.000000e+00 578: 0.000000e+00 0.000000e+00 579: 0.000000e+00 0.000000e+00 580: 0.000000e+00 0.000000e+00 581: 0.000000e+00 0.000000e+00 582: 0.000000e+00 0.000000e+00 583: 0.000000e+00 0.000000e+00 584: 0.000000e+00 0.000000e+00 585: 0.000000e+00 0.000000e+00 586: 0.000000e+00 0.000000e+00 587: 0.000000e+00 0.000000e+00 588: 0.000000e+00 0.000000e+00 589: 0.000000e+00 0.000000e+00 590: 0.000000e+00 0.000000e+00 591: 0.000000e+00 0.000000e+00 592: 0.000000e+00 0.000000e+00 593: 0.000000e+00 0.000000e+00 594: 0.000000e+00 0.000000e+00 595: 0.000000e+00 0.000000e+00 596: 0.000000e+00 0.000000e+00 597: 0.000000e+00 0.000000e+00 598: 0.000000e+00 0.000000e+00 599: 0.000000e+00 0.000000e+00 600: 0.000000e+00 0.000000e+00 601: 0.000000e+00 0.000000e+00 602: 0.000000e+00 0.000000e+00 603: 0.000000e+00 0.000000e+00 604: 0.000000e+00 0.000000e+00 605: 0.000000e+00 0.000000e+00 606: 0.000000e+00 0.000000e+00 607: 0.000000e+00 0.000000e+00 608: 0.000000e+00 0.000000e+00 609: 0.000000e+00 0.000000e+00 610: 0.000000e+00 0.000000e+00 611: 0.000000e+00 0.000000e+00 612: 0.000000e+00 0.000000e+00 613: 0.000000e+00 0.000000e+00 614: 0.000000e+00 0.000000e+00 615: 0.000000e+00 0.000000e+00 616: 0.000000e+00 0.000000e+00 617: 0.000000e+00 0.000000e+00 618: 0.000000e+00 0.000000e+00 619: 0.000000e+00 0.000000e+00 620: 1.000000e+00 0.000000e+00 621: 1.000000e+00 0.000000e+00 622: 1.000000e+00 0.000000e+00 623: 1.000000e+00 0.000000e+00 624: 1.000000e+00 0.000000e+00 625: 1.000000e+00 0.000000e+00 626: 1.000000e+00 0.000000e+00 627: 1.000000e+00 0.000000e+00 628: 1.000000e+00 0.000000e+00 629: 1.000000e+00 0.000000e+00 # factor 0: 7 # factor 1: 6 # factor 2: 5 # factor 3: 3 0: 2.100000e+01 0.000000e+00 1: 2.096173e+01 -1.051242e-15 2: 2.084715e+01 1.373901e-15 3: 2.065704e+01 6.383782e-16 4: 2.039261e+01 6.397660e-15 5: 2.005560e+01 5.939693e-15 6: 1.964821e+01 7.355228e-15 7: 1.917307e+01 6.383782e-16 8: 1.863328e+01 -5.273559e-16 9: 1.803232e+01 1.887379e-15 10: 1.737406e+01 6.661338e-16 11: 1.666272e+01 4.884981e-15 12: 1.590285e+01 5.273559e-15 13: 1.509927e+01 5.939693e-15 14: 1.425706e+01 1.165734e-15 15: 1.338149e+01 8.326673e-16 16: 1.247803e+01 2.081668e-15 17: 1.155225e+01 7.494005e-16 18: 1.060982e+01 3.039236e-15 19: 9.656443e+00 4.177214e-15 20: 8.697842e+00 3.788636e-15 21: 7.739681e+00 1.110223e-15 22: 6.787549e+00 8.604228e-16 23: 5.846909e+00 1.748601e-15 24: 4.923063e+00 1.387779e-16 25: 4.021112e+00 7.216450e-16 26: 3.145923e+00 1.942890e-15 27: 2.302090e+00 1.276756e-15 28: 1.493907e+00 -1.665335e-16 29: 7.253407e-01 -5.551115e-16 30: -6.661338e-16 -2.220446e-16 31: -6.788825e-01 -1.221245e-15 32: -1.308472e+00 -2.498002e-15 33: -1.886344e+00 -1.110223e-15 34: -2.410503e+00 -2.220446e-15 35: -2.879385e+00 -1.276756e-15 36: -3.291865e+00 -1.332268e-15 37: -3.647260e+00 -1.165734e-15 38: -3.945325e+00 -3.108624e-15 39: -4.186247e+00 -4.662937e-15 40: -4.370640e+00 -3.774758e-15 41: -4.499527e+00 -3.552714e-15 42: -4.574329e+00 -2.220446e-16 43: -4.596844e+00 -6.277699e-17 44: -4.569225e+00 -3.979137e-16 45: -4.493959e+00 -6.125144e-16 46: -4.373836e+00 -2.588272e-15 47: -4.211924e+00 -1.708533e-15 48: -4.011536e+00 -1.610301e-15 49: -3.776200e+00 -6.521231e-16 50: -3.509623e+00 -9.518362e-16 51: -3.215658e+00 -8.615412e-16 52: -2.898269e+00 -8.023074e-16 53: -2.561495e+00 -1.295581e-15 54: -2.209413e+00 -1.882798e-15 55: -1.846105e+00 -1.309680e-15 56: -1.475622e+00 -8.731621e-17 57: -1.101950e+00 -6.064088e-16 58: -7.289764e-01 -5.283445e-16 59: -3.604599e-01 -3.700906e-16 60: -2.480852e-16 -3.217778e-16 61: 3.489905e-01 -3.427744e-16 62: 6.833118e-01 -5.628327e-17 63: 1.000000e+00 9.525275e-17 64: 1.296348e+00 -1.015236e-16 65: 1.569925e+00 1.617614e-16 66: 1.818588e+00 1.651517e-16 67: 2.040501e+00 8.832176e-16 68: 2.234139e+00 7.155281e-16 69: 2.398296e+00 8.060351e-16 70: 2.532089e+00 9.180115e-16 71: 2.634960e+00 2.633349e-16 72: 2.706672e+00 1.187041e-15 73: 2.747304e+00 3.755772e-16 74: 2.757241e+00 8.376828e-16 75: 2.737169e+00 2.203930e-15 76: 2.688054e+00 1.197283e-15 77: 2.611133e+00 -2.998065e-16 78: 2.507892e+00 -9.785191e-16 79: 2.380048e+00 -9.898606e-16 80: 2.229526e+00 -5.077927e-16 81: 2.058436e+00 -5.413850e-16 82: 1.869051e+00 6.993526e-16 83: 1.663775e+00 -4.736301e-16 84: 1.445125e+00 1.110223e-16 85: 1.215696e+00 -2.373302e-16 86: 9.781383e-01 2.565092e-16 87: 7.351295e-01 -2.522207e-16 88: 4.893460e-01 -1.473382e-16 89: 2.434373e-01 1.109184e-15 90: -1.989431e-15 -3.411591e-16 91: -2.384474e-01 -5.318012e-16 92: -4.694881e-01 2.328401e-16 93: -6.908292e-01 -8.646065e-17 94: -9.003229e-01 -7.857807e-16 95: -1.095985e+00 -1.799037e-15 96: -1.276012e+00 -2.161196e-16 97: -1.438796e+00 -9.983452e-16 98: -1.582939e+00 -6.065732e-16 99: -1.707260e+00 2.152265e-16 100: -1.810806e+00 -3.264639e-16 101: -1.892859e+00 -5.055122e-16 102: -1.952933e+00 -2.036075e-15 103: -1.990783e+00 -1.452785e-15 104: -2.006398e+00 -1.506787e-15 105: -2.000000e+00 -3.771208e-16 106: -1.972036e+00 3.323489e-16 107: -1.923170e+00 -7.476386e-16 108: -1.854275e+00 -9.508935e-17 109: -1.766419e+00 -1.940360e-15 110: -1.660850e+00 -1.760991e-15 111: -1.538980e+00 -6.147117e-16 112: -1.402374e+00 -8.585493e-16 113: -1.252721e+00 -3.300750e-16 114: -1.091826e+00 -1.311000e-15 115: -9.215804e-01 -4.440252e-16 116: -7.439464e-01 -2.073484e-15 117: -5.609343e-01 -2.601855e-15 118: -3.745807e-01 -8.979032e-16 119: -1.869274e-01 2.912711e-16 120: -1.715798e-15 5.664477e-16 121: 1.842128e-01 1.230585e-16 122: 3.637795e-01 1.061285e-15 123: 5.368447e-01 8.829804e-16 124: 7.016480e-01 -4.939307e-16 125: 8.565403e-01 1.392795e-15 126: 1.000000e+00 0.000000e+00 127: 1.130647e+00 -1.528557e-17 128: 1.247255e+00 -4.291169e-16 129: 1.348762e+00 3.223830e-16 130: 1.434281e+00 -6.912208e-16 131: 1.503106e+00 -1.380961e-15 132: 1.554714e+00 1.253781e-16 133: 1.588775e+00 -1.792421e-16 134: 1.605146e+00 -6.501297e-16 135: 1.603875e+00 2.105874e-16 136: 1.585197e+00 1.751581e-16 137: 1.549526e+00 1.205978e-16 138: 1.497454e+00 -1.026329e-15 139: 1.429739e+00 2.034781e-17 140: 1.347296e+00 -4.955509e-16 141: 1.251187e+00 -1.428373e-15 142: 1.142604e+00 -3.568238e-16 143: 1.022861e+00 -3.836222e-16 144: 8.933738e-01 -6.389491e-16 145: 7.556456e-01 -1.247492e-15 146: 6.112512e-01 -8.130105e-16 147: 4.618187e-01 8.646065e-17 148: 3.090116e-01 -6.532673e-16 149: 1.545116e-01 -1.839025e-16 150: -6.539201e-17 1.134394e-16 151: -1.528597e-01 -3.883800e-16 152: -3.024391e-01 -9.790769e-16 153: -4.471621e-01 -3.570986e-16 154: -5.855204e-01 -3.154104e-17 155: -7.160894e-01 -3.803775e-16 156: -8.375420e-01 -1.423005e-16 157: -9.486618e-01 9.467191e-16 158: -1.048355e+00 -1.075184e-15 159: -1.135660e+00 2.958649e-16 160: -1.209758e+00 -7.434995e-16 161: -1.269978e+00 -1.197924e-15 162: -1.315804e+00 -2.483837e-15 163: -1.346880e+00 -1.986506e-15 164: -1.363010e+00 -2.273250e-15 165: -1.364160e+00 -3.362421e-15 166: -1.350455e+00 -2.707155e-15 167: -1.322180e+00 -2.640979e-15 168: -1.279773e+00 2.220446e-16 169: -1.223817e+00 -5.068662e-16 170: -1.155037e+00 1.680655e-16 171: -1.074290e+00 7.088856e-16 172: -9.825500e-01 -1.675164e-16 173: -8.809036e-01 -2.262585e-16 174: -7.705329e-01 1.660555e-16 175: -6.527036e-01 4.472323e-16 176: -5.287511e-01 7.307475e-16 177: -4.000650e-01 -3.172974e-16 178: -2.680744e-01 4.137293e-16 179: -1.342324e-01 -6.064496e-16 180: 6.742551e-16 -1.470733e-16 181: 1.331690e-01 1.504979e-16 182: 2.638437e-01 -8.731621e-17 183: 3.906312e-01 3.207541e-16 184: 5.121908e-01 -7.590137e-16 185: 6.272483e-01 -1.424316e-16 186: 7.346089e-01 -7.936247e-16 187: 8.331694e-01 -8.288514e-16 188: 9.219291e-01 -6.631544e-16 189: 1.000000e+00 -7.482822e-16 190: 1.066615e+00 -2.159362e-16 191: 1.121136e+00 -3.681989e-16 192: 1.163060e+00 -9.267006e-16 193: 1.192020e+00 -6.361458e-16 194: 1.207795e+00 -1.250618e-15 195: 1.210304e+00 -2.498760e-15 196: 1.199610e+00 -1.082633e-15 197: 1.175919e+00 -1.051684e-15 198: 1.139572e+00 -2.953387e-15 199: 1.091048e+00 -1.988494e-15 200: 1.030951e+00 -2.573996e-15 201: 9.600058e-01 -2.506964e-15 202: 8.790504e-01 -2.525727e-15 203: 7.890244e-01 -1.430320e-15 204: 6.909592e-01 -7.940139e-16 205: 5.859667e-01 -1.448806e-15 206: 4.752260e-01 -3.331757e-15 207: 3.599714e-01 -2.696823e-15 208: 2.414782e-01 -1.273025e-15 209: 1.210491e-01 -3.884812e-15 210: 0.000000e+00 0.000000e+00 211: -1.203541e-01 9.367507e-17 212: -2.387131e-01 -8.326673e-17 213: -3.538059e-01 -1.671241e-15 214: -4.644036e-01 -1.032863e-15 215: -5.693324e-01 -5.551115e-17 216: -6.674861e-01 -2.656564e-15 217: -7.578373e-01 -1.046741e-15 218: -8.394483e-01 5.748960e-16 219: -9.114803e-01 -1.110223e-16 220: -9.732024e-01 -6.661338e-16 221: -1.023998e+00 -4.440892e-16 222: -1.063373e+00 -5.551115e-17 223: -1.090956e+00 -3.092682e-15 224: -1.106507e+00 -1.665335e-16 225: -1.109916e+00 -3.330669e-16 226: -1.101205e+00 -8.524518e-16 227: -1.080526e+00 -1.352052e-15 228: -1.048159e+00 -6.760261e-16 229: -1.004510e+00 -3.707147e-16 230: -9.501041e-01 -1.643486e-15 231: -8.855794e-01 -7.731706e-16 232: -8.116813e-01 -4.718448e-16 233: -7.292528e-01 -6.343927e-16 234: -6.392251e-01 -1.213274e-15 235: -5.426076e-01 -1.354045e-15 236: -4.404764e-01 2.775558e-17 237: -3.339626e-01 -1.586978e-15 238: -2.242400e-01 -3.845925e-16 239: -1.125123e-01 2.200518e-16 240: -2.369188e-16 -4.916293e-16 241: 1.120728e-01 -3.439556e-16 242: 2.224913e-01 -4.163336e-16 243: 3.300635e-01 3.885781e-16 244: 4.336325e-01 3.221783e-16 245: 5.320889e-01 -2.131487e-16 246: 6.243825e-01 5.134066e-16 247: 7.095336e-01 5.709105e-16 248: 7.866431e-01 7.096884e-16 249: 8.549018e-01 3.468732e-16 250: 9.135989e-01 1.042755e-15 251: 9.621294e-01 1.342088e-15 252: 1.000000e+00 3.033186e-16 253: 1.026834e+00 2.702899e-16 254: 1.042376e+00 6.785755e-16 255: 1.046493e+00 5.789826e-16 256: 1.039174e+00 1.089270e-15 257: 1.020536e+00 3.671570e-16 258: 9.908126e-01 4.396257e-16 259: 9.503608e-01 3.728405e-16 260: 8.996505e-01 3.804314e-16 261: 8.392616e-01 -2.887396e-17 262: 7.698769e-01 4.595749e-16 263: 6.922746e-01 9.020201e-16 264: 6.073198e-01 2.890403e-16 265: 5.159547e-01 -3.175108e-18 266: 4.191883e-01 3.195876e-16 267: 3.180856e-01 1.301103e-16 268: 2.137557e-01 5.687302e-16 269: 1.073401e-01 6.100192e-16 270: -2.894407e-16 5.826677e-16 271: -1.070960e-01 -2.616340e-16 272: -2.127847e-01 -1.107472e-15 273: -3.159206e-01 -3.949178e-16 274: -4.153883e-01 -4.401969e-17 275: -5.101143e-01 5.618340e-17 276: -5.990789e-01 -8.538336e-16 277: -6.813264e-01 5.927817e-18 278: -7.559760e-01 -1.212488e-15 279: -8.222306e-01 -1.417329e-15 280: -8.793852e-01 -6.323152e-16 281: -9.268349e-01 2.641613e-17 282: -9.640807e-01 -3.563825e-16 283: -9.907347e-01 -2.201713e-16 284: -1.006524e+00 -1.872807e-16 285: -1.011295e+00 -1.030591e-15 286: -1.005012e+00 -1.762599e-15 287: -9.877604e-01 -1.287051e-15 288: -9.597424e-01 8.416380e-17 289: -9.212779e-01 -5.229262e-16 290: -8.727990e-01 -6.623696e-16 291: -8.148456e-01 -5.929106e-16 292: -7.480596e-01 -1.254426e-15 293: -6.731776e-01 -1.896992e-15 294: -5.910229e-01 -1.516593e-16 295: -5.024970e-01 2.399589e-16 296: -4.085691e-01 -2.688540e-16 297: -3.102660e-01 -3.933898e-17 298: -2.086610e-01 -8.122086e-16 299: -1.048621e-01 -8.027307e-16 300: 7.718245e-16 -3.315040e-16 301: 1.047837e-01 3.818447e-17 302: 2.083493e-01 -1.594565e-16 303: 3.095711e-01 -1.937644e-16 304: 4.073493e-01 -2.527135e-16 305: 5.006223e-01 -1.132903e-15 306: 5.883777e-01 -1.074550e-15 307: 6.696634e-01 2.412259e-16 308: 7.435978e-01 4.441532e-16 309: 8.093792e-01 4.332855e-16 310: 8.662947e-01 1.765880e-16 311: 9.137272e-01 4.971401e-16 312: 9.511629e-01 -3.896002e-16 313: 9.781962e-01 2.715655e-17 314: 9.945343e-01 8.315841e-16 315: 1.000000e+00 3.405386e-16 316: 9.945343e-01 4.577114e-16 317: 9.781962e-01 2.807765e-16 318: 9.511629e-01 4.560366e-16 319: 9.137272e-01 -1.015889e-16 320: 8.662947e-01 2.889358e-16 321: 8.093792e-01 9.202069e-16 322: 7.435978e-01 -3.847117e-16 323: 6.696634e-01 -6.442822e-16 324: 5.883777e-01 9.510423e-17 325: 5.006223e-01 -5.178621e-16 326: 4.073493e-01 -2.175789e-16 327: 3.095711e-01 -2.918347e-16 328: 2.083493e-01 -1.411991e-16 329: 1.047837e-01 1.072074e-15 330: -9.220486e-16 4.483855e-17 331: -1.048621e-01 3.913489e-16 332: -2.086610e-01 3.703136e-16 333: -3.102660e-01 -5.325539e-16 334: -4.085691e-01 -5.660418e-16 335: -5.024970e-01 -9.996290e-16 336: -5.910229e-01 -7.211110e-17 337: -6.731776e-01 -4.239151e-16 338: -7.480596e-01 -9.777574e-17 339: -8.148456e-01 -6.837208e-16 340: -8.727990e-01 -2.689088e-16 341: -9.212779e-01 -8.882634e-16 342: -9.597424e-01 -1.457615e-15 343: -9.877604e-01 -4.711380e-16 344: -1.005012e+00 -4.166625e-16 345: -1.011295e+00 -1.465166e-16 346: -1.006524e+00 -6.866384e-17 347: -9.907347e-01 -7.860160e-17 348: -9.640807e-01 -3.190243e-16 349: -9.268349e-01 -1.562645e-15 350: -8.793852e-01 -6.689875e-16 351: -8.222306e-01 -4.120382e-16 352: -7.559760e-01 -6.006457e-16 353: -6.813264e-01 -1.082422e-15 354: -5.990789e-01 -3.007668e-16 355: -5.101143e-01 -1.113625e-15 356: -4.153883e-01 -1.059421e-15 357: -3.159206e-01 -2.723691e-16 358: -2.127847e-01 -8.842800e-17 359: -1.070960e-01 -8.046626e-17 360: -1.906317e-16 -4.332091e-16 361: 1.073401e-01 -2.998168e-17 362: 2.137557e-01 -9.919583e-16 363: 3.180856e-01 -5.691174e-16 364: 4.191883e-01 -2.426970e-16 365: 5.159547e-01 -3.323034e-16 366: 6.073198e-01 5.066994e-16 367: 6.922746e-01 6.240069e-16 368: 7.698769e-01 -3.540730e-16 369: 8.392616e-01 2.615971e-16 370: 8.996505e-01 2.214334e-16 371: 9.503608e-01 -1.437466e-16 372: 9.908126e-01 7.610382e-16 373: 1.020536e+00 6.918356e-16 374: 1.039174e+00 1.404292e-15 375: 1.046493e+00 6.516396e-16 376: 1.042376e+00 1.124964e-15 377: 1.026834e+00 1.764577e-15 378: 1.000000e+00 4.899035e-16 379: 9.621294e-01 1.117297e-15 380: 9.135989e-01 2.951538e-16 381: 8.549018e-01 4.273443e-16 382: 7.866431e-01 -2.086873e-16 383: 7.095336e-01 1.243452e-15 384: 6.243825e-01 5.610027e-16 385: 5.320889e-01 2.120393e-16 386: 4.336325e-01 4.199919e-16 387: 3.300635e-01 1.840288e-16 388: 2.224913e-01 -8.919745e-16 389: 1.120728e-01 -3.674045e-16 390: 3.723582e-16 1.676634e-16 391: -1.125123e-01 -7.950819e-16 392: -2.242400e-01 -3.173938e-16 393: -3.339626e-01 -1.822978e-16 394: -4.404764e-01 -7.659168e-16 395: -5.426076e-01 -1.206964e-15 396: -6.392251e-01 -1.343149e-15 397: -7.292528e-01 -1.765238e-16 398: -8.116813e-01 -2.792220e-15 399: -8.855794e-01 -1.338977e-15 400: -9.501041e-01 -9.920244e-16 401: -1.004510e+00 -2.009620e-15 402: -1.048159e+00 -2.005039e-15 403: -1.080526e+00 -2.305180e-15 404: -1.101205e+00 -1.099740e-15 405: -1.109916e+00 -3.130874e-15 406: -1.106507e+00 -1.687134e-15 407: -1.090956e+00 -1.656185e-15 408: -1.063373e+00 -1.085649e-15 409: -1.023998e+00 -2.991394e-15 410: -9.732024e-01 -1.503056e-15 411: -9.114803e-01 -1.614514e-15 412: -8.394483e-01 -4.325425e-15 413: -7.578373e-01 -1.100952e-15 414: -6.674861e-01 -1.412321e-15 415: -5.693324e-01 -1.504031e-15 416: -4.644036e-01 -1.876225e-15 417: -3.538059e-01 -1.268903e-15 418: -2.387131e-01 -1.355863e-15 419: -1.203541e-01 -3.610669e-15 420: 0.000000e+00 0.000000e+00 421: 1.210491e-01 9.367507e-17 422: 2.414782e-01 -8.326673e-17 423: 3.599714e-01 -1.328711e-16 424: 4.752260e-01 5.055071e-16 425: 5.859667e-01 -5.551115e-17 426: 6.909592e-01 -1.118194e-15 427: 7.890244e-01 4.916293e-16 428: 8.790504e-01 -9.634741e-16 429: 9.600058e-01 -1.110223e-16 430: 1.030951e+00 -6.661338e-16 431: 1.091048e+00 -4.440892e-16 432: 1.139572e+00 -5.551115e-17 433: 1.175919e+00 -1.594209e-17 434: 1.199610e+00 -1.665335e-16 435: 1.210304e+00 -3.330669e-16 436: 1.207795e+00 6.859183e-16 437: 1.192020e+00 1.863180e-16 438: 1.163060e+00 9.315899e-17 439: 1.121136e+00 3.984703e-16 440: 1.066615e+00 -1.051156e-16 441: 1.000000e+00 -3.985521e-18 442: 9.219291e-01 -4.718448e-16 443: 8.331694e-01 1.347924e-16 444: 7.346089e-01 3.250959e-16 445: 6.272483e-01 -2.002673e-16 446: 5.121908e-01 2.775558e-17 447: 3.906312e-01 1.436882e-16 448: 2.638437e-01 3.845925e-16 449: 1.331690e-01 -1.645407e-16 450: -4.292150e-16 1.046741e-15 451: -1.342324e-01 2.329333e-16 452: -2.680744e-01 -4.163336e-16 453: -4.000650e-01 3.885781e-16 454: -5.287511e-01 8.990671e-16 455: -6.527036e-01 -1.174630e-15 456: -7.705329e-01 -2.178741e-15 457: -8.809036e-01 -1.736645e-15 458: -9.825500e-01 -1.597867e-15 459: -1.074290e+00 -2.345275e-15 460: -1.155037e+00 -1.264800e-15 461: -1.223817e+00 -2.119244e-15 462: -1.279773e+00 -8.127397e-17 463: -1.322180e+00 2.702899e-16 464: -1.350455e+00 -4.752021e-16 465: -1.364160e+00 1.943900e-16 466: -1.363010e+00 -1.602877e-15 467: -1.346880e+00 -7.866206e-16 468: -1.315804e+00 -3.295594e-16 469: -1.269978e+00 -1.175205e-17 470: -1.209758e+00 3.804314e-16 471: -1.135660e+00 -2.887396e-17 472: -1.048355e+00 2.672787e-16 473: -9.486618e-01 -8.286463e-16 474: -8.375420e-01 -1.057034e-15 475: -7.160894e-01 3.814174e-16 476: -5.855204e-01 -1.611531e-16 477: -4.471621e-01 3.224066e-16 478: -3.024391e-01 3.991542e-17 479: -1.528597e-01 2.735007e-16 480: 1.536727e-15 -6.379847e-16 481: 1.545116e-01 -1.006782e-15 482: 3.090116e-01 9.116388e-16 483: 4.618187e-01 8.582290e-17 484: 6.112512e-01 3.405728e-16 485: 7.556456e-01 -2.322610e-16 486: 8.933738e-01 6.845365e-16 487: 1.022861e+00 -5.709610e-16 488: 1.142604e+00 -1.020192e-15 489: 1.251187e+00 6.979304e-16 490: 1.347296e+00 1.368698e-16 491: 1.429739e+00 -1.658801e-16 492: 1.497454e+00 -9.332713e-16 493: 1.549526e+00 -2.787505e-17 494: 1.585197e+00 1.973118e-16 495: 1.603875e+00 -1.222888e-15 496: 1.605146e+00 1.603633e-16 497: 1.588775e+00 1.020505e-15 498: 1.554714e+00 1.622534e-15 499: 1.503106e+00 1.207740e-15 500: 1.434281e+00 1.645186e-15 501: 1.348762e+00 1.762744e-16 502: 1.247255e+00 -6.775376e-16 503: 1.130647e+00 1.948933e-15 504: 1.000000e+00 4.063698e-17 505: 8.565403e-01 -4.848547e-17 506: 7.016480e-01 1.157385e-16 507: 5.368447e-01 2.010314e-16 508: 3.637795e-01 1.011987e-16 509: 1.842128e-01 -8.508047e-16 510: 2.184058e-16 3.826635e-16 511: -1.869274e-01 2.304807e-16 512: -3.745807e-01 -2.075306e-16 513: -5.609343e-01 -1.456903e-16 514: -7.439464e-01 1.799531e-16 515: -9.215804e-01 -1.132903e-15 516: -1.091826e+00 -6.899572e-16 517: -1.252721e+00 -2.395148e-16 518: -1.402374e+00 -3.250319e-16 519: -1.538980e+00 -3.358995e-16 520: -1.660850e+00 -4.964489e-16 521: -1.766419e+00 -1.758968e-16 522: -1.854275e+00 -1.351082e-15 523: -1.923170e+00 -9.343248e-16 524: -1.972036e+00 -5.144897e-16 525: -2.000000e+00 -4.286464e-16 526: -2.006398e+00 -7.922144e-16 527: -1.990783e+00 -7.768530e-16 528: -1.952933e+00 -3.131484e-16 529: -1.892859e+00 -1.447663e-15 530: -1.810806e+00 -4.802492e-16 531: -1.707260e+00 -1.483496e-15 532: -1.582939e+00 -1.191984e-19 533: -1.438796e+00 3.171992e-16 534: -1.276012e+00 -3.856364e-16 535: -1.095985e+00 -3.712144e-17 536: -9.003229e-01 -2.656530e-16 537: -6.908292e-01 -7.485384e-16 538: -4.694881e-01 -4.056065e-16 539: -2.384474e-01 -1.571999e-15 540: -6.928228e-16 -1.164851e-15 541: 2.434373e-01 -8.946324e-16 542: 4.893460e-01 -1.744945e-15 543: 7.351295e-01 -5.325539e-16 544: 9.781383e-01 -4.218196e-16 545: 1.215696e+00 -7.111846e-16 546: 1.445125e+00 7.211110e-17 547: 1.663775e+00 3.933440e-16 548: 1.869051e+00 2.387427e-16 549: 2.058436e+00 6.623531e-16 550: 2.229526e+00 8.848688e-16 551: 2.380048e+00 4.578105e-16 552: 2.507892e+00 1.042237e-15 553: 2.611133e+00 7.787877e-16 554: 2.688054e+00 4.486707e-16 555: 2.737169e+00 -9.844252e-17 556: 2.757241e+00 1.085114e-15 557: 2.747304e+00 1.652065e-15 558: 2.706672e+00 9.309014e-16 559: 2.634960e+00 9.372066e-16 560: 2.532089e+00 6.770864e-16 561: 2.398296e+00 8.859616e-16 562: 2.234139e+00 5.531319e-16 563: 2.040501e+00 6.482444e-16 564: 1.818588e+00 1.021270e-15 565: 1.569925e+00 6.170418e-16 566: 1.296348e+00 5.991342e-16 567: 1.000000e+00 1.122235e-16 568: 6.833118e-01 -5.237245e-17 569: 3.489905e-01 4.572817e-17 570: 1.255224e-15 -1.911841e-16 571: -3.604599e-01 -3.304446e-16 572: -7.289764e-01 -7.996621e-16 573: -1.101950e+00 -9.777470e-16 574: -1.475622e+00 -8.195858e-16 575: -1.846105e+00 -4.284516e-16 576: -2.209413e+00 -7.913004e-16 577: -2.561495e+00 -1.395104e-15 578: -2.898269e+00 -1.796295e-15 579: -3.215658e+00 -2.334403e-15 580: -3.509623e+00 -2.374566e-15 581: -3.776200e+00 -1.585969e-15 582: -4.011536e+00 -1.065776e-15 583: -4.211924e+00 -2.000312e-15 584: -4.373836e+00 -1.287856e-15 585: -4.493959e+00 -2.713545e-15 586: -4.569225e+00 -3.874739e-15 587: -4.596844e+00 -3.715867e-15 588: -4.574329e+00 -7.119481e-16 589: -4.499527e+00 -1.326284e-16 590: -4.370640e+00 -1.291290e-15 591: -4.186247e+00 -3.418408e-16 592: -3.945325e+00 -1.458613e-15 593: -3.647260e+00 -2.362103e-15 594: -3.291865e+00 -2.227293e-15 595: -2.879385e+00 -3.167754e-16 596: -2.410503e+00 7.084363e-16 597: -1.886344e+00 -1.524897e-16 598: -1.308472e+00 8.867659e-16 599: -6.788825e-01 5.700398e-16 600: 3.116723e-15 -1.372575e-16 601: 7.253407e-01 3.466772e-16 602: 1.493907e+00 4.758283e-16 603: 2.302090e+00 4.907391e-16 604: 3.145923e+00 5.801571e-16 605: 4.021112e+00 2.254369e-15 606: 4.923063e+00 3.752702e-15 607: 5.846909e+00 2.515624e-15 608: 6.787549e+00 4.130446e-15 609: 7.739681e+00 2.506948e-15 610: 8.697842e+00 1.892420e-15 611: 9.656443e+00 2.605490e-15 612: 1.060982e+01 4.148441e-15 613: 1.155225e+01 7.694226e-15 614: 1.247803e+01 6.592110e-15 615: 1.338149e+01 8.791495e-15 616: 1.425706e+01 4.850939e-15 617: 1.509927e+01 4.881888e-15 618: 1.590285e+01 5.837016e-15 619: 1.666272e+01 7.008012e-15 620: 1.737406e+01 1.234228e-14 621: 1.803232e+01 9.923262e-15 622: 1.863328e+01 1.259665e-14 623: 1.917307e+01 8.898454e-15 624: 1.964821e+01 7.817899e-15 625: 2.005560e+01 9.264560e-15 626: 2.039261e+01 1.119992e-14 627: 2.065704e+01 1.719154e-14 628: 2.084715e+01 1.479702e-14 629: 2.096173e+01 1.715733e-14 gsl-doc-2.3/doc/examples/demo_fn.c0000664000175000017500000000123612620170331015115 0ustar eddedddouble 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; 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; } gsl-doc-2.3/doc/ieee754.texi0000664000175000017500000003470512616157443013613 0ustar eddedd@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 () @vindex @env{GSL_IEEE_MODE} 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 @w{} @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. Note that on the x86 series of processors this function sets both the original x87 mode and the newer @sc{mxcsr} mode, which controls SSE floating-point operations. The SSE floating-point units do not have a precision-control bit, and always work in double-precision. The single-precision and extended-precision keywords have no effect in this case. @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 final result is higher than the correct value (when we add each term to the sum the final result is always rounded up, which increases the sum by at least one tick until the added term underflows to zero). 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 @w{} @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 @w{} @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 @w{} @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 @comment #include @comment #include @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 gsl-doc-2.3/doc/rand-laplace.tex0000664000175000017500000005441612616157443014617 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-laplace.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-laplace.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 784 R -31 0 V 31 784 R -31 0 V 31 785 R -31 0 V 31 784 R -31 0 V 31 784 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 657 M 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 2 V 20 1 V 19 1 V 20 1 V 19 1 V 20 2 V 19 1 V 19 2 V 20 1 V 19 2 V 20 1 V 19 2 V 20 2 V 19 1 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 19 3 V 20 2 V 19 3 V 20 2 V 19 3 V 20 2 V 19 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 4 V 20 3 V 19 4 V 19 3 V 20 4 V 19 4 V 20 4 V 19 4 V 20 5 V 19 4 V 19 5 V 20 4 V 19 5 V 20 6 V 19 5 V 20 5 V 19 6 V 19 6 V 20 6 V 19 6 V 20 7 V 19 6 V 20 7 V 19 7 V 19 8 V 20 7 V 19 8 V 20 8 V 19 9 V 20 9 V 19 9 V 19 9 V 20 10 V 19 10 V 20 10 V 19 11 V 20 11 V 19 11 V 19 12 V 20 12 V 19 13 V 20 13 V 19 13 V 20 14 V 19 15 V 19 14 V 20 16 V 19 16 V 20 16 V 19 17 V 20 18 V 19 18 V 19 19 V 20 20 V 19 20 V 20 21 V 19 21 V 20 22 V 19 23 V 19 24 V 20 25 V 19 25 V 20 27 V 3052 1459 L 20 28 V 19 29 V 19 30 V 20 31 V 19 33 V 20 33 V 19 34 V 20 36 V 19 37 V 19 38 V 20 39 V 19 41 V 20 42 V 19 43 V 20 45 V 19 47 V 19 48 V 20 50 V 19 51 V 20 53 V 19 55 V 20 57 V 19 59 V 19 60 V 20 63 V 19 65 V 20 67 V 19 70 V 20 72 V 19 74 V 19 77 V 20 79 V 19 82 V 20 85 V 19 88 V 20 91 V 19 94 V 19 97 V 20 100 V 19 104 V 20 107 V 19 111 V 20 115 V 19 118 V 19 123 V 20 127 V 19 0 V 20 -127 V 19 -123 V 19 -118 V 20 -115 V 19 -111 V 20 -107 V 19 -104 V 20 -100 V 19 -97 V 19 -94 V 20 -91 V 19 -88 V 20 -85 V 19 -82 V 20 -79 V 19 -77 V 19 -74 V 20 -72 V 19 -70 V 20 -67 V 19 -65 V 20 -63 V 19 -60 V 19 -59 V 20 -57 V 19 -55 V 20 -53 V 19 -51 V 20 -50 V 19 -48 V 19 -47 V 20 -45 V 19 -43 V 20 -42 V 19 -41 V 20 -39 V 19 -38 V 19 -37 V 20 -36 V 19 -34 V 20 -33 V 19 -33 V 20 -31 V 19 -30 V 19 -29 V 20 -28 V 19 -27 V 20 -27 V 19 -25 V 20 -25 V 19 -24 V 19 -23 V 20 -22 V 19 -21 V 20 -21 V 19 -20 V 20 -20 V 5092 1185 L 19 -18 V 20 -18 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -14 V 19 -15 V 20 -14 V 19 -13 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 792 M 19 3 V 20 2 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 4 V 20 3 V 19 3 V 19 4 V 20 3 V 19 4 V 20 3 V 19 4 V 20 4 V 19 4 V 19 3 V 20 4 V 19 4 V 20 4 V 19 5 V 20 4 V 19 4 V 19 4 V 20 5 V 19 4 V 20 5 V 19 4 V 20 5 V 19 5 V 19 5 V 20 5 V 19 5 V 20 5 V 19 5 V 20 5 V 19 6 V 19 5 V 20 6 V 19 6 V 20 5 V 19 6 V 20 6 V 19 6 V 19 6 V 20 7 V 19 6 V 20 6 V 19 7 V 20 7 V 19 7 V 19 6 V 20 7 V 19 8 V 20 7 V 19 7 V 20 8 V 19 7 V 19 8 V 20 8 V 19 8 V 20 8 V 19 9 V 20 8 V 19 9 V 19 9 V 20 8 V 19 9 V 20 10 V 19 9 V 20 10 V 19 9 V 19 10 V 20 10 V 19 10 V 20 11 V 19 10 V 20 11 V 19 11 V 19 11 V 20 11 V 19 11 V 20 12 V 19 12 V 20 12 V 19 12 V 19 12 V 20 13 V 19 13 V 20 13 V 19 13 V 20 14 V 19 14 V 19 14 V 20 14 V 19 14 V 20 15 V 3052 1532 L 20 15 V 19 15 V 19 16 V 20 16 V 19 16 V 20 17 V 19 17 V 20 17 V 19 17 V 19 18 V 20 18 V 19 18 V 20 19 V 19 18 V 20 20 V 19 19 V 19 20 V 20 20 V 19 21 V 20 21 V 19 21 V 20 21 V 19 22 V 19 23 V 20 22 V 19 23 V 20 24 V 19 24 V 20 24 V 19 25 V 19 25 V 20 25 V 19 26 V 20 27 V 19 26 V 20 28 V 19 27 V 19 29 V 20 28 V 19 30 V 20 29 V 19 30 V 20 31 V 19 31 V 19 32 V 20 32 V 19 0 V 20 -32 V 19 -32 V 19 -31 V 20 -31 V 19 -30 V 20 -29 V 19 -30 V 20 -28 V 19 -29 V 19 -27 V 20 -28 V 19 -26 V 20 -27 V 19 -26 V 20 -25 V 19 -25 V 19 -25 V 20 -24 V 19 -24 V 20 -24 V 19 -23 V 20 -22 V 19 -23 V 19 -22 V 20 -21 V 19 -21 V 20 -21 V 19 -21 V 20 -20 V 19 -20 V 19 -19 V 20 -20 V 19 -18 V 20 -19 V 19 -18 V 20 -18 V 19 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -16 V 20 -16 V 19 -16 V 19 -15 V 20 -15 V 19 -15 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 5092 1368 L 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -8 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -6 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=2$}}% \put(5957,4781){\rjust{\strut{}$a=1$}}% \put(3955,5244){\cjust{\strut{}Laplace Distribution (Two-sided Exponential)}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4552){\rjust{\strut{} 0.5}}% \put(900,3768){\rjust{\strut{} 0.4}}% \put(900,2984){\rjust{\strut{} 0.3}}% \put(900,2199){\rjust{\strut{} 0.2}}% \put(900,1415){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-gumbel2.tex0000664000175000017500000004732712616157443014556 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-gumbel2.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-gumbel2.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1051 631 M 0 -31 V 1452 31 R 0 -31 V 1453 31 R 0 -31 V 1452 31 R 0 -31 V 1452 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 1 V 19 3 V 20 4 V 19 8 V 19 13 V 20 18 V 19 25 V 20 33 V 19 41 V 20 49 V 19 58 V 19 65 V 20 73 V 19 80 V 20 86 V 19 91 V 20 96 V 19 99 V 19 102 V 20 103 V 19 105 V 20 105 V 19 105 V 20 104 V 19 103 V 19 100 V 20 99 V 19 96 V 20 94 V 19 91 V 20 87 V 19 84 V 19 81 V 20 77 V 19 74 V 20 70 V 19 67 V 20 64 V 19 60 V 19 56 V 20 53 V 19 50 V 20 47 V 19 44 V 20 40 V 19 38 V 19 35 V 20 32 V 19 30 V 20 27 V 19 25 V 20 22 V 19 21 V 19 18 V 20 16 V 19 14 V 20 12 V 19 11 V 20 9 V 19 7 V 19 5 V 20 5 V 19 3 V 20 1 V 19 0 V 20 0 V 19 -2 V 19 -4 V 20 -4 V 19 -5 V 20 -5 V 19 -7 V 20 -8 V 19 -8 V 19 -9 V 20 -10 V 19 -10 V 20 -11 V 19 -11 V 20 -12 V 19 -12 V 19 -13 V 20 -14 V 19 -13 V 20 -14 V 19 -15 V 20 -14 V 19 -15 V 19 -15 V 20 -16 V 19 -16 V 20 -16 V 3052 3671 L 20 -16 V 19 -16 V 19 -17 V 20 -17 V 19 -16 V 20 -17 V 19 -17 V 20 -17 V 19 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -18 V 20 -17 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -18 V 20 -17 V 19 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -17 V 19 -17 V 20 -16 V 19 -17 V 20 -16 V 19 -17 V 20 -16 V 19 -16 V 19 -16 V 20 -16 V 19 -16 V 20 -15 V 19 -16 V 20 -16 V 19 -15 V 19 -15 V 20 -16 V 19 -15 V 20 -15 V 19 -15 V 19 -15 V 20 -15 V 19 -14 V 20 -15 V 19 -14 V 20 -14 V 19 -15 V 19 -14 V 20 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 19 -14 V 20 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -13 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 20 -13 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -12 V 19 -12 V 20 -11 V 19 -12 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 5092 2182 L 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}Type 2, $a=1,b=1$}}% \put(3955,5244){\cjust{\strut{}Type 2 Gumbel Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}2}}% \put(5408,400){\cjust{\strut{}1.5}}% \put(3956,400){\cjust{\strut{}1}}% \put(2503,400){\cjust{\strut{}0.5}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.7}}% \put(900,4328){\rjust{\strut{} 0.6}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,3096){\rjust{\strut{} 0.4}}% \put(900,2479){\rjust{\strut{} 0.3}}% \put(900,1863){\rjust{\strut{} 0.2}}% \put(900,1247){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/qrng.texi0000664000175000017500000001361212616157443013405 0ustar eddedd@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 restoring 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}) @tindex gsl_qrng @tindex gsl_qrng_type 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}. @inlinefn{} @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 restoring quasi-random number generator state @section Saving and restoring 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 @deffn {Generator} gsl_qrng_halton @deffnx {Generator} gsl_qrng_reversehalton These generators use the Halton and reverse Halton sequences described in J.H. Halton, @cite{Numerische Mathematik} 2, 84-90 (1960) and B. Vandewoestyne and R. Cools @cite{Computational and Applied Mathematics} 189, 1&2, 341-361 (2006). They are valid up to 1229 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 @w{} @item 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 gsl-doc-2.3/doc/fft-complex-radix2.eps0000664000175000017500000002000112616157443015655 0ustar eddedd%!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 gsl-doc-2.3/doc/regularized2.eps0000644000175000017500000010434313004361416014640 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: regularized2.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Wed Oct 26 06:04:23 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 626 338 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 626 50 lineto 626 338 lineto 50 338 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (regularized2.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Oct 26 06:04:23 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 11520.00 5760.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 602 448 M 63 0 V 4842 0 R -63 0 V stroke 518 448 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 893 M 63 0 V 4842 0 R -63 0 V stroke 518 893 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 1337 M 63 0 V 4842 0 R -63 0 V stroke 518 1337 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 1782 M 63 0 V 4842 0 R -63 0 V stroke 518 1782 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2227 M 63 0 V 4842 0 R -63 0 V stroke 518 2227 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (3)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2671 M 63 0 V 4842 0 R -63 0 V stroke 518 2671 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (4)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 3116 M 63 0 V 4842 0 R -63 0 V stroke 518 3116 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (5)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 3560 M 63 0 V 4842 0 R -63 0 V stroke 518 3560 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (6)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 4005 M 63 0 V 4842 0 R -63 0 V stroke 518 4005 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (7)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 4450 M 63 0 V 4842 0 R -63 0 V stroke 518 4450 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (8)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 4894 M 63 0 V 4842 0 R -63 0 V stroke 518 4894 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (9)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 5339 M 63 0 V 4842 0 R -63 0 V stroke 518 5339 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (10)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 448 M 0 63 V 0 4828 R 0 -63 V stroke 602 308 M [ [(Helvetica) 140.0 0.0 true true 0 (2.3)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5507 448 M 0 63 V 0 4828 R 0 -63 V stroke 5507 308 M [ [(Helvetica) 140.0 0.0 true true 0 (3.2)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 602 5339 N 602 448 L 4905 0 V 0 4891 V -4905 0 V Z stroke LCb setrgbcolor 112 2893 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (solution norm ||c||)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3054 98 M [ [(Helvetica) 140.0 0.0 true true 0 (residual norm ||y - X c||)] ] -46.7 MCshow LTb 3054 5549 M [ [(Helvetica) 140.0 0.0 true true 0 (L-curve)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.300 UP 2.000 UL LTb LCb setrgbcolor /Helvetica findfont 140 scalefont setfont /vshift -46 def 5214 512 M -13 27 V -13 27 V -13 26 V -15 27 V -16 27 V -17 28 V -19 29 V -22 29 V -23 29 V -26 30 V -27 28 V -27 28 V -28 26 V -28 24 V -26 22 V -23 21 V -21 18 V -18 17 V -16 14 V -12 14 V -11 11 V -8 12 V -8 10 V -7 12 V -7 12 V -7 13 V -8 16 V -8 17 V -10 21 V -10 22 V -11 24 V -12 24 V -12 25 V -13 24 V -13 24 V -12 22 V -11 21 V -11 19 V -9 18 V -9 17 V -8 17 V -7 16 V -8 16 V -7 18 V -8 20 V -9 23 V -11 25 V -13 29 V -15 31 V -18 33 V -21 34 V -25 35 V -29 35 V -34 35 V -37 34 V -42 33 V -45 31 V -47 30 V -47 28 V -48 26 V -45 24 V -41 21 V -37 19 V -31 17 V -26 15 V -21 12 V -16 11 V -12 10 V -10 8 V -7 6 V -5 7 V -4 5 V -4 6 V -3 6 V -3 7 V -4 8 V -3 11 V -5 13 V -4 17 V -6 20 V -7 22 V -7 26 V -9 27 V -10 28 V -10 29 V -11 28 V -11 27 V -11 25 V -11 24 V -10 22 V -10 20 V -8 18 V -7 17 V -6 14 V -5 14 V -5 13 V -4 13 V -4 13 V -4 15 V -4 17 V -6 21 V -6 23 V -7 28 V -9 30 V stroke 3666 2673 M -10 34 V -14 35 V -16 38 V -19 38 V -24 38 V -29 39 V -34 39 V -41 38 V -48 37 V -55 37 V -63 35 V -70 34 V -76 33 V -81 31 V -84 28 V -83 27 V -81 24 V -76 22 V -67 20 V -59 17 V -48 16 V -40 13 V -30 11 V -24 9 V -17 8 V -12 7 V -9 5 V -7 5 V -4 4 V -3 3 V -2 3 V -2 3 V -2 3 V -1 3 V -1 3 V -2 5 V -1 6 V -2 9 V -2 11 V -3 15 V -3 18 V -4 23 V -5 26 V -5 28 V -7 31 V -7 32 V -8 31 V -9 32 V -9 31 V -11 29 V -10 28 V -10 26 V -10 23 V -9 22 V -8 19 V -7 18 V -6 15 V -4 13 V -4 11 V -3 11 V -2 9 V -2 9 V -2 8 V -2 9 V -1 11 V -2 13 V -2 15 V -2 19 V -3 24 V -4 27 V -4 31 V -6 35 V -6 36 V -9 39 V -10 39 V -13 41 V -16 41 V -20 41 V -24 41 V -29 41 V -37 41 V -44 40 V -54 40 V -65 40 V -77 39 V -91 38 V -106 37 V -123 35 V -138 35 V -152 33 V -165 31 V -174 29 V -176 27 V -122 18 V 5214 512 CircleF 5201 539 CircleF 5188 566 CircleF 5175 592 CircleF 5160 619 CircleF 5144 646 CircleF 5127 674 CircleF 5108 703 CircleF 5086 732 CircleF 5063 761 CircleF 5037 791 CircleF 5010 819 CircleF 4983 847 CircleF 4955 873 CircleF 4927 897 CircleF 4901 919 CircleF 4878 940 CircleF 4857 958 CircleF 4839 975 CircleF 4823 989 CircleF 4811 1003 CircleF 4800 1014 CircleF 4792 1026 CircleF 4784 1036 CircleF 4777 1048 CircleF 4770 1060 CircleF 4763 1073 CircleF 4755 1089 CircleF 4747 1106 CircleF 4737 1127 CircleF 4727 1149 CircleF 4716 1173 CircleF 4704 1197 CircleF 4692 1222 CircleF 4679 1246 CircleF 4666 1270 CircleF 4654 1292 CircleF 4643 1313 CircleF 4632 1332 CircleF 4623 1350 CircleF 4614 1367 CircleF 4606 1384 CircleF 4599 1400 CircleF 4591 1416 CircleF 4584 1434 CircleF 4576 1454 CircleF 4567 1477 CircleF 4556 1502 CircleF 4543 1531 CircleF 4528 1562 CircleF 4510 1595 CircleF 4489 1629 CircleF 4464 1664 CircleF 4435 1699 CircleF 4401 1734 CircleF 4364 1768 CircleF 4322 1801 CircleF 4277 1832 CircleF 4230 1862 CircleF 4183 1890 CircleF 4135 1916 CircleF 4090 1940 CircleF 4049 1961 CircleF 4012 1980 CircleF 3981 1997 CircleF 3955 2012 CircleF 3934 2024 CircleF 3918 2035 CircleF 3906 2045 CircleF 3896 2053 CircleF 3889 2059 CircleF 3884 2066 CircleF 3880 2071 CircleF 3876 2077 CircleF 3873 2083 CircleF 3870 2090 CircleF 3866 2098 CircleF 3863 2109 CircleF 3858 2122 CircleF 3854 2139 CircleF 3848 2159 CircleF 3841 2181 CircleF 3834 2207 CircleF 3825 2234 CircleF 3815 2262 CircleF 3805 2291 CircleF 3794 2319 CircleF 3783 2346 CircleF 3772 2371 CircleF 3761 2395 CircleF 3751 2417 CircleF 3741 2437 CircleF 3733 2455 CircleF 3726 2472 CircleF 3720 2486 CircleF 3715 2500 CircleF 3710 2513 CircleF 3706 2526 CircleF 3702 2539 CircleF 3698 2554 CircleF 3694 2571 CircleF 3688 2592 CircleF 3682 2615 CircleF 3675 2643 CircleF 3666 2673 CircleF 3656 2707 CircleF 3642 2742 CircleF 3626 2780 CircleF 3607 2818 CircleF 3583 2856 CircleF 3554 2895 CircleF 3520 2934 CircleF 3479 2972 CircleF 3431 3009 CircleF 3376 3046 CircleF 3313 3081 CircleF 3243 3115 CircleF 3167 3148 CircleF 3086 3179 CircleF 3002 3207 CircleF 2919 3234 CircleF 2838 3258 CircleF 2762 3280 CircleF 2695 3300 CircleF 2636 3317 CircleF 2588 3333 CircleF 2548 3346 CircleF 2518 3357 CircleF 2494 3366 CircleF 2477 3374 CircleF 2465 3381 CircleF 2456 3386 CircleF 2449 3391 CircleF 2445 3395 CircleF 2442 3398 CircleF 2440 3401 CircleF 2438 3404 CircleF 2436 3407 CircleF 2435 3410 CircleF 2434 3413 CircleF 2432 3418 CircleF 2431 3424 CircleF 2429 3433 CircleF 2427 3444 CircleF 2424 3459 CircleF 2421 3477 CircleF 2417 3500 CircleF 2412 3526 CircleF 2407 3554 CircleF 2400 3585 CircleF 2393 3617 CircleF 2385 3648 CircleF 2376 3680 CircleF 2367 3711 CircleF 2356 3740 CircleF 2346 3768 CircleF 2336 3794 CircleF 2326 3817 CircleF 2317 3839 CircleF 2309 3858 CircleF 2302 3876 CircleF 2296 3891 CircleF 2292 3904 CircleF 2288 3915 CircleF 2285 3926 CircleF 2283 3935 CircleF 2281 3944 CircleF 2279 3952 CircleF 2277 3961 CircleF 2276 3972 CircleF 2274 3985 CircleF 2272 4000 CircleF 2270 4019 CircleF 2267 4043 CircleF 2263 4070 CircleF 2259 4101 CircleF 2253 4136 CircleF 2247 4172 CircleF 2238 4211 CircleF 2228 4250 CircleF 2215 4291 CircleF 2199 4332 CircleF 2179 4373 CircleF 2155 4414 CircleF 2126 4455 CircleF 2089 4496 CircleF 2045 4536 CircleF 1991 4576 CircleF 1926 4616 CircleF 1849 4655 CircleF 1758 4693 CircleF 1652 4730 CircleF 1529 4765 CircleF 1391 4800 CircleF 1239 4833 CircleF 1074 4864 CircleF 900 4893 CircleF 724 4920 CircleF % End plot #1 % Begin plot #2 3.000 UP 2.000 UL LT6 0.90 0.17 0.09 C /Helvetica findfont 140 scalefont setfont 2445 3395 Circle % End plot #2 1.000 UL LTb LCb setrgbcolor 602 5339 N 602 448 L 4905 0 V 0 4891 V -4905 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6362 448 M 63 0 V 4842 0 R -63 0 V stroke 6278 448 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 1920 M 31 0 V 4874 0 R -31 0 V 6362 2782 M 31 0 V 4874 0 R -31 0 V 6362 3393 M 31 0 V 4874 0 R -31 0 V 6362 3867 M 31 0 V 4874 0 R -31 0 V 6362 4254 M 31 0 V 4874 0 R -31 0 V 6362 4581 M 31 0 V 4874 0 R -31 0 V 6362 4865 M 31 0 V 4874 0 R -31 0 V 6362 5115 M 31 0 V 4874 0 R -31 0 V 6362 5339 M 63 0 V 4842 0 R -63 0 V stroke 6278 5339 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 448 M 0 63 V 0 4828 R 0 -63 V stroke 6362 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-10)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 6808 448 M 0 63 V 0 4828 R 0 -63 V stroke 6808 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-9)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 7254 448 M 0 63 V 0 4828 R 0 -63 V stroke 7254 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-8)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 7700 448 M 0 63 V 0 4828 R 0 -63 V stroke 7700 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-7)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 8146 448 M 0 63 V 0 4828 R 0 -63 V stroke 8146 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-6)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 8592 448 M 0 63 V 0 4828 R 0 -63 V stroke 8592 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-5)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 9037 448 M 0 63 V 0 4828 R 0 -63 V stroke 9037 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-4)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 9483 448 M 0 63 V 0 4828 R 0 -63 V stroke 9483 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-3)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 9929 448 M 0 63 V 0 4828 R 0 -63 V stroke 9929 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 10375 448 M 0 63 V 0 4828 R 0 -63 V stroke 10375 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 10821 448 M 0 63 V 0 4828 R 0 -63 V stroke 10821 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 11267 448 M 0 63 V 0 4828 R 0 -63 V stroke 11267 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6362 5339 N 0 -4891 V 4905 0 V 0 4891 V -4905 0 V Z stroke LCb setrgbcolor 5872 2893 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (G\()] [(Symbol) 140.0 0.0 true true 0 (l)] [(Helvetica) 140.0 0.0 true true 0 (\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 8814 98 M [ [(Symbol) 140.0 0.0 true true 0 (l)] ] -46.7 MCshow LTb 8814 5549 M [ [(Helvetica) 140.0 0.0 true true 0 (GCV curve)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.300 UP 2.000 UL LTb LCb setrgbcolor /Helvetica findfont 140 scalefont setfont 10926 647 M -21 25 V -21 25 V -22 25 V -21 25 V -22 23 V -21 23 V -21 22 V -22 22 V -21 21 V -22 21 V -21 22 V -21 22 V -22 24 V -21 24 V -22 24 V -21 26 V -21 25 V -22 25 V -21 24 V -22 24 V -21 22 V -21 21 V -22 19 V -21 19 V -22 17 V -21 17 V -21 17 V -22 18 V -21 18 V -22 19 V -21 21 V -22 23 V -21 24 V -21 26 V -22 28 V -21 29 V -22 30 V -21 29 V -21 29 V -22 28 V -21 26 V -22 24 V -21 22 V -21 20 V -22 17 V -21 15 V -22 13 V -21 12 V -21 11 V -22 10 V -21 10 V -22 9 V -21 10 V -21 10 V -22 12 V -21 13 V -22 15 V -21 17 V -21 19 V -22 21 V -21 23 V -22 25 V -21 27 V -21 26 V -22 27 V -21 26 V -22 25 V -21 23 V -21 20 V -22 19 V -21 17 V -22 16 V -21 13 V -21 13 V -22 12 V -21 12 V -22 11 V -21 12 V -21 13 V -22 15 V -21 16 V -22 18 V -21 21 V -22 24 V -21 27 V -21 30 V -22 34 V -21 36 V -22 38 V -21 40 V -21 41 V -22 40 V -21 39 V -22 36 V -21 34 V -21 31 V -22 27 V -21 24 V -22 21 V -21 18 V -21 15 V -22 13 V -21 11 V -22 9 V stroke 8700 2897 M -21 7 V -21 7 V -22 6 V -21 6 V -22 5 V -21 5 V -21 6 V -22 6 V -21 7 V -22 8 V -21 10 V -21 12 V -22 14 V -21 17 V -22 21 V -21 24 V -21 27 V -22 31 V -21 33 V -22 35 V -21 35 V -21 36 V -22 34 V -21 32 V -22 29 V -21 26 V -21 24 V -22 20 V -21 18 V -22 15 V -21 13 V -22 12 V -21 10 V -21 9 V -22 9 V -21 8 V -22 8 V -21 9 V -21 9 V -22 11 V -21 12 V -22 15 V -21 16 V -21 21 V -22 23 V -21 28 V -22 33 V -21 38 V -21 43 V -22 49 V -21 54 V -22 58 V -21 63 V -21 64 V -22 65 V -21 64 V -22 62 V -21 59 V -21 54 V -22 49 V -21 43 V -22 38 V -21 32 V -21 28 V -22 23 V -21 20 V -22 16 V -21 13 V -21 11 V -22 9 V -21 7 V -22 6 V -21 5 V -21 4 V -22 4 V -21 2 V -22 3 V -21 2 V -22 2 V -21 3 V -21 2 V -22 3 V -21 3 V -22 3 V -21 5 V -21 6 V -22 7 V -21 10 V -22 12 V -21 17 V -21 20 V -22 26 V -21 32 V -22 39 V -21 45 V 10926 647 CircleF 10905 672 CircleF 10884 697 CircleF 10862 722 CircleF 10841 747 CircleF 10819 770 CircleF 10798 793 CircleF 10777 815 CircleF 10755 837 CircleF 10734 858 CircleF 10712 879 CircleF 10691 901 CircleF 10670 923 CircleF 10648 947 CircleF 10627 971 CircleF 10605 995 CircleF 10584 1021 CircleF 10563 1046 CircleF 10541 1071 CircleF 10520 1095 CircleF 10498 1119 CircleF 10477 1141 CircleF 10456 1162 CircleF 10434 1181 CircleF 10413 1200 CircleF 10391 1217 CircleF 10370 1234 CircleF 10349 1251 CircleF 10327 1269 CircleF 10306 1287 CircleF 10284 1306 CircleF 10263 1327 CircleF 10241 1350 CircleF 10220 1374 CircleF 10199 1400 CircleF 10177 1428 CircleF 10156 1457 CircleF 10134 1487 CircleF 10113 1516 CircleF 10092 1545 CircleF 10070 1573 CircleF 10049 1599 CircleF 10027 1623 CircleF 10006 1645 CircleF 9985 1665 CircleF 9963 1682 CircleF 9942 1697 CircleF 9920 1710 CircleF 9899 1722 CircleF 9878 1733 CircleF 9856 1743 CircleF 9835 1753 CircleF 9813 1762 CircleF 9792 1772 CircleF 9771 1782 CircleF 9749 1794 CircleF 9728 1807 CircleF 9706 1822 CircleF 9685 1839 CircleF 9664 1858 CircleF 9642 1879 CircleF 9621 1902 CircleF 9599 1927 CircleF 9578 1954 CircleF 9557 1980 CircleF 9535 2007 CircleF 9514 2033 CircleF 9492 2058 CircleF 9471 2081 CircleF 9450 2101 CircleF 9428 2120 CircleF 9407 2137 CircleF 9385 2153 CircleF 9364 2166 CircleF 9343 2179 CircleF 9321 2191 CircleF 9300 2203 CircleF 9278 2214 CircleF 9257 2226 CircleF 9236 2239 CircleF 9214 2254 CircleF 9193 2270 CircleF 9171 2288 CircleF 9150 2309 CircleF 9128 2333 CircleF 9107 2360 CircleF 9086 2390 CircleF 9064 2424 CircleF 9043 2460 CircleF 9021 2498 CircleF 9000 2538 CircleF 8979 2579 CircleF 8957 2619 CircleF 8936 2658 CircleF 8914 2694 CircleF 8893 2728 CircleF 8872 2759 CircleF 8850 2786 CircleF 8829 2810 CircleF 8807 2831 CircleF 8786 2849 CircleF 8765 2864 CircleF 8743 2877 CircleF 8722 2888 CircleF 8700 2897 CircleF 8679 2904 CircleF 8658 2911 CircleF 8636 2917 CircleF 8615 2923 CircleF 8593 2928 CircleF 8572 2933 CircleF 8551 2939 CircleF 8529 2945 CircleF 8508 2952 CircleF 8486 2960 CircleF 8465 2970 CircleF 8444 2982 CircleF 8422 2996 CircleF 8401 3013 CircleF 8379 3034 CircleF 8358 3058 CircleF 8337 3085 CircleF 8315 3116 CircleF 8294 3149 CircleF 8272 3184 CircleF 8251 3219 CircleF 8230 3255 CircleF 8208 3289 CircleF 8187 3321 CircleF 8165 3350 CircleF 8144 3376 CircleF 8123 3400 CircleF 8101 3420 CircleF 8080 3438 CircleF 8058 3453 CircleF 8037 3466 CircleF 8015 3478 CircleF 7994 3488 CircleF 7973 3497 CircleF 7951 3506 CircleF 7930 3514 CircleF 7908 3522 CircleF 7887 3531 CircleF 7866 3540 CircleF 7844 3551 CircleF 7823 3563 CircleF 7801 3578 CircleF 7780 3594 CircleF 7759 3615 CircleF 7737 3638 CircleF 7716 3666 CircleF 7694 3699 CircleF 7673 3737 CircleF 7652 3780 CircleF 7630 3829 CircleF 7609 3883 CircleF 7587 3941 CircleF 7566 4004 CircleF 7545 4068 CircleF 7523 4133 CircleF 7502 4197 CircleF 7480 4259 CircleF 7459 4318 CircleF 7438 4372 CircleF 7416 4421 CircleF 7395 4464 CircleF 7373 4502 CircleF 7352 4534 CircleF 7331 4562 CircleF 7309 4585 CircleF 7288 4605 CircleF 7266 4621 CircleF 7245 4634 CircleF 7224 4645 CircleF 7202 4654 CircleF 7181 4661 CircleF 7159 4667 CircleF 7138 4672 CircleF 7117 4676 CircleF 7095 4680 CircleF 7074 4682 CircleF 7052 4685 CircleF 7031 4687 CircleF 7009 4689 CircleF 6988 4692 CircleF 6967 4694 CircleF 6945 4697 CircleF 6924 4700 CircleF 6902 4703 CircleF 6881 4708 CircleF 6860 4714 CircleF 6838 4721 CircleF 6817 4731 CircleF 6795 4743 CircleF 6774 4760 CircleF 6753 4780 CircleF 6731 4806 CircleF 6710 4838 CircleF 6688 4877 CircleF 6667 4922 CircleF % End plot #1 % Begin plot #2 3.000 UP 2.000 UL LT6 0.90 0.17 0.09 C /Helvetica findfont 140 scalefont setfont 10926 647 Circle % End plot #2 1.000 UL LTb LCb setrgbcolor 6362 5339 N 0 -4891 V 4905 0 V 0 4891 V -4905 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Symbol Helvetica gsl-doc-2.3/doc/rand-rayleigh.tex0000664000175000017500000005430412616157443015016 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-rayleigh.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-rayleigh.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 103 V 20 103 V 19 103 V 20 102 V 19 102 V 20 102 V 19 101 V 19 101 V 20 100 V 19 99 V 20 98 V 19 98 V 20 96 V 19 95 V 19 95 V 20 93 V 19 91 V 20 90 V 19 89 V 20 88 V 19 85 V 19 84 V 20 83 V 19 80 V 20 79 V 19 77 V 20 75 V 19 73 V 19 72 V 20 69 V 19 66 V 20 65 V 19 63 V 20 60 V 19 59 V 19 55 V 20 54 V 19 51 V 20 50 V 19 46 V 20 45 V 19 42 V 19 39 V 20 37 V 19 35 V 20 33 V 19 30 V 20 28 V 19 25 V 19 23 V 20 21 V 19 18 V 20 16 V 19 14 V 20 11 V 19 10 V 19 7 V 20 5 V 19 2 V 20 1 V 19 -1 V 20 -4 V 19 -5 V 19 -8 V 20 -9 V 19 -12 V 20 -13 V 19 -15 V 20 -16 V 19 -19 V 19 -20 V 20 -21 V 19 -24 V 20 -24 V 19 -27 V 20 -27 V 19 -29 V 19 -30 V 20 -32 V 19 -32 V 20 -34 V 19 -35 V 20 -36 V 19 -37 V 19 -38 V 20 -39 V 19 -39 V 20 -40 V 19 -41 V 20 -42 V 19 -42 V 19 -43 V 20 -44 V 19 -43 V 20 -45 V 19 -44 V 20 -45 V 19 -46 V 19 -45 V 20 -46 V 19 -45 V 20 -46 V 3052 3039 L 20 -46 V 19 -46 V 19 -46 V 20 -46 V 19 -46 V 20 -45 V 19 -45 V 20 -46 V 19 -44 V 19 -45 V 20 -44 V 19 -44 V 20 -44 V 19 -43 V 20 -43 V 19 -42 V 19 -42 V 20 -41 V 19 -41 V 20 -41 V 19 -40 V 20 -39 V 19 -39 V 19 -38 V 20 -38 V 19 -37 V 20 -36 V 19 -36 V 20 -35 V 19 -35 V 19 -34 V 20 -33 V 19 -33 V 20 -32 V 19 -31 V 20 -31 V 19 -30 V 19 -29 V 20 -29 V 19 -29 V 20 -27 V 19 -27 V 20 -26 V 19 -26 V 19 -25 V 20 -24 V 19 -24 V 20 -23 V 19 -23 V 19 -22 V 20 -21 V 19 -21 V 20 -20 V 19 -20 V 20 -19 V 19 -18 V 19 -18 V 20 -18 V 19 -17 V 20 -16 V 19 -16 V 20 -15 V 19 -15 V 19 -15 V 20 -13 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -11 V 20 -11 V 19 -10 V 20 -11 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 5092 682 L 19 -3 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 0 V 20 -1 V 19 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 26 V 20 26 V 19 25 V 20 26 V 19 26 V 20 25 V 19 26 V 19 26 V 20 25 V 19 26 V 20 25 V 19 26 V 20 25 V 19 25 V 19 25 V 20 25 V 19 25 V 20 25 V 19 25 V 20 25 V 19 25 V 19 24 V 20 25 V 19 24 V 20 24 V 19 24 V 20 24 V 19 24 V 19 23 V 20 24 V 19 23 V 20 23 V 19 23 V 20 23 V 19 23 V 19 22 V 20 23 V 19 22 V 20 22 V 19 21 V 20 22 V 19 21 V 19 21 V 20 21 V 19 21 V 20 20 V 19 21 V 20 20 V 19 20 V 19 19 V 20 20 V 19 19 V 20 19 V 19 18 V 20 19 V 19 18 V 19 18 V 20 17 V 19 18 V 20 17 V 19 17 V 20 16 V 19 17 V 19 16 V 20 15 V 19 16 V 20 15 V 19 15 V 20 15 V 19 14 V 19 14 V 20 14 V 19 14 V 20 13 V 19 13 V 20 13 V 19 12 V 19 12 V 20 12 V 19 12 V 20 11 V 19 11 V 20 10 V 19 11 V 19 10 V 20 10 V 19 9 V 20 9 V 19 9 V 20 9 V 19 8 V 19 8 V 20 8 V 19 7 V 20 7 V 19 7 V 20 6 V 19 6 V 19 6 V 20 6 V 19 5 V 20 5 V 3052 2462 L 20 5 V 19 4 V 19 4 V 20 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 2 V 19 2 V 20 1 V 19 2 V 20 1 V 19 1 V 20 0 V 19 1 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -11 V 19 -10 V 19 -11 V 20 -10 V 19 -11 V 20 -11 V 19 -10 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 5092 1812 L 19 -12 V 20 -11 V 19 -12 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 19 -12 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 20 -12 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 19 -11 V 20 -11 V 19 -10 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 19 -8 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 20 -8 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\sigma=2$}}% \put(5957,4781){\rjust{\strut{}$\sigma=1$}}% \put(3955,5244){\cjust{\strut{}Rayleigh Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.7}}% \put(900,4328){\rjust{\strut{} 0.6}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,3096){\rjust{\strut{} 0.4}}% \put(900,2479){\rjust{\strut{} 0.3}}% \put(900,1863){\rjust{\strut{} 0.2}}% \put(900,1247){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/cblas.texi0000664000175000017500000011402212620026734013510 0ustar eddedd@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 @file{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&1032\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.txt @end example gsl-doc-2.3/doc/rand-poisson.tex0000664000175000017500000004727112616157443014711 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-poisson.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-poisson.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 1811 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 1770 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 738 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -615 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 2994 3704 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -1152 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -961 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -560 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -257 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 4956 774 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -98 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -33 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 -9 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -2 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$\mu=2.5$}}% \put(3955,5244){\cjust{\strut{}Poisson Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.3}}% \put(900,3506){\rjust{\strut{} 0.2}}% \put(900,2069){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/gsl-randist.10000664000175000017500000000236512616157443014057 0ustar eddedd.\" Man page contributed by Dirk Eddelbuettel .\" 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 , the Debian GNU/Linux maintainer for .BR GSL . gsl-doc-2.3/doc/fit-exp.eps0000664000175000017500000005654412616157443013643 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: plot.eps %%Creator: gnuplot 4.6 patchlevel 3 %%CreationDate: Sun Mar 2 12:14:56 2014 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color false def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (plot.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 3) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Sun Mar 2 12:14:56 2014) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if /Helvetica findfont 140 scalefont setfont /vshift -46 def /Helvetica findfont 140 scalefont setfont 1.000 UL LTb 518 448 M 63 0 V 6366 0 R -63 0 V stroke 434 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb 518 1080 M 63 0 V 6366 0 R -63 0 V stroke 434 1080 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb 518 1712 M 63 0 V 6366 0 R -63 0 V stroke 434 1712 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2)] ] -46.7 MRshow 1.000 UL LTb 518 2344 M 63 0 V 6366 0 R -63 0 V stroke 434 2344 M [ [(Helvetica) 140.0 0.0 true true 0 ( 3)] ] -46.7 MRshow 1.000 UL LTb 518 2975 M 63 0 V 6366 0 R -63 0 V stroke 434 2975 M [ [(Helvetica) 140.0 0.0 true true 0 ( 4)] ] -46.7 MRshow 1.000 UL LTb 518 3607 M 63 0 V 6366 0 R -63 0 V stroke 434 3607 M [ [(Helvetica) 140.0 0.0 true true 0 ( 5)] ] -46.7 MRshow 1.000 UL LTb 518 4239 M 63 0 V 6366 0 R -63 0 V stroke 434 4239 M [ [(Helvetica) 140.0 0.0 true true 0 ( 6)] ] -46.7 MRshow 1.000 UL LTb 518 4871 M 63 0 V 6366 0 R -63 0 V stroke 434 4871 M [ [(Helvetica) 140.0 0.0 true true 0 ( 7)] ] -46.7 MRshow 1.000 UL LTb 518 448 M 0 63 V 0 4360 R 0 -63 V stroke 518 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb 1322 448 M 0 63 V 0 4360 R 0 -63 V stroke 1322 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 5)] ] -46.7 MCshow 1.000 UL LTb 2125 448 M 0 63 V 0 4360 R 0 -63 V stroke 2125 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb 2929 448 M 0 63 V 0 4360 R 0 -63 V stroke 2929 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 15)] ] -46.7 MCshow 1.000 UL LTb 3733 448 M 0 63 V 0 4360 R 0 -63 V stroke 3733 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 20)] ] -46.7 MCshow 1.000 UL LTb 4536 448 M 0 63 V 0 4360 R 0 -63 V stroke 4536 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 25)] ] -46.7 MCshow 1.000 UL LTb 5340 448 M 0 63 V 0 4360 R 0 -63 V stroke 5340 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 30)] ] -46.7 MCshow 1.000 UL LTb 6143 448 M 0 63 V 0 4360 R 0 -63 V stroke 6143 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 35)] ] -46.7 MCshow 1.000 UL LTb 6947 448 M 0 63 V 0 4360 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 40)] ] -46.7 MCshow 1.000 UL LTb 1.000 UL LTb 518 4871 N 518 448 L 6429 0 V 0 4423 V -6429 0 V Z stroke LCb setrgbcolor 112 2659 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (y)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3732 98 M [ [(Helvetica) 140.0 0.0 true true 0 (t)] ] -46.7 MCshow LTb 1.000 UP 1.000 UL LTb % Begin plot #1 1.000 UP 1.000 UL LT0 /Helvetica findfont 140 scalefont setfont LCb setrgbcolor 6296 4738 M ('dat' us 2:3:4) Rshow LT0 6380 4738 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 518 3911 M 0 758 V 487 3911 M 62 0 V -62 758 R 62 0 V 679 3559 M 0 698 V 648 3559 M 62 0 V -62 698 R 62 0 V 839 3884 M 0 643 V 808 3884 M 62 0 V -62 643 R 62 0 V 1000 3341 M 0 595 V 969 3341 M 62 0 V -62 595 R 62 0 V 130 -739 R 0 550 V -31 -550 R 62 0 V -62 550 R 62 0 V 1322 2416 M 0 509 V -31 -509 R 62 0 V -62 509 R 62 0 V 129 -915 R 0 473 V -31 -473 R 62 0 V -62 473 R 62 0 V 130 -204 R 0 440 V -31 -440 R 62 0 V -62 440 R 62 0 V 130 -433 R 0 411 V -31 -411 R 62 0 V -62 411 R 62 0 V 130 -353 R 0 383 V -31 -383 R 62 0 V -62 383 R 62 0 V 129 -667 R 0 358 V -31 -358 R 62 0 V -62 358 R 62 0 V 130 -673 R 0 337 V -31 -337 R 62 0 V -62 337 R 62 0 V 130 -315 R 0 317 V -31 -317 R 62 0 V -62 317 R 62 0 V 129 -265 R 0 298 V -31 -298 R 62 0 V -62 298 R 62 0 V 130 -282 R 0 282 V -31 -282 R 62 0 V -62 282 R 62 0 V 130 -539 R 0 267 V -31 -267 R 62 0 V -62 267 R 62 0 V 130 -335 R 0 254 V -31 -254 R 62 0 V stroke 3121 1510 M -62 254 R 62 0 V 129 -227 R 0 242 V -31 -242 R 62 0 V -62 242 R 62 0 V 130 -370 R 0 231 V -31 -231 R 62 0 V -62 231 R 62 0 V 130 -289 R 0 220 V -31 -220 R 62 0 V -62 220 R 62 0 V 130 -105 R 0 212 V -31 -212 R 62 0 V -62 212 R 62 0 V 129 -351 R 0 204 V -31 -204 R 62 0 V -62 204 R 62 0 V 130 -228 R 0 197 V -31 -197 R 62 0 V -62 197 R 62 0 V 130 -285 R 0 189 V -31 -189 R 62 0 V -62 189 R 62 0 V 129 -183 R 0 184 V -31 -184 R 62 0 V -62 184 R 62 0 V 130 -149 R 0 178 V -31 -178 R 62 0 V -62 178 R 62 0 V 130 -202 R 0 173 V -31 -173 R 62 0 V -62 173 R 62 0 V 130 -261 R 0 169 V -31 -169 R 62 0 V -62 169 R 62 0 V 129 -135 R 0 164 V -31 -164 R 62 0 V -62 164 R 62 0 V 130 -50 R 0 161 V -31 -161 R 62 0 V -62 161 R 62 0 V 130 -311 R 0 158 V -31 -158 R 62 0 V -62 158 R 62 0 V 129 -175 R 0 154 V -31 -154 R 62 0 V -62 154 R 62 0 V 130 -157 R 0 152 V -31 -152 R 62 0 V -62 152 R 62 0 V 5822 931 M 0 150 V 5791 931 M 62 0 V -62 150 R 62 0 V stroke 5853 1081 M 130 73 R 0 148 V -31 -148 R 62 0 V -62 148 R 62 0 V 129 -202 R 0 145 V -31 -145 R 62 0 V -62 145 R 62 0 V 130 -167 R 0 144 V -31 -144 R 62 0 V -62 144 R 62 0 V 130 -84 R 0 142 V -31 -142 R 62 0 V -62 142 R 62 0 V 130 -89 R 0 141 V -31 -141 R 62 0 V -62 141 R 62 0 V 129 -285 R 0 139 V -31 -139 R 62 0 V -62 139 R 62 0 V 518 4290 Pls 679 3908 Pls 839 4205 Pls 1000 3638 Pls 1161 3472 Pls 1322 2671 Pls 1482 2247 Pls 1643 2499 Pls 1804 2491 Pls 1965 2536 Pls 2125 2239 Pls 2286 1913 Pls 2447 1926 Pls 2607 1968 Pls 2768 1976 Pls 2929 1711 Pls 3090 1637 Pls 3250 1658 Pls 3411 1525 Pls 3572 1461 Pls 3733 1572 Pls 3893 1429 Pls 4054 1401 Pls 4215 1310 Pls 4375 1313 Pls 4536 1345 Pls 4697 1319 Pls 4858 1229 Pls 5018 1260 Pls 5179 1373 Pls 5340 1221 Pls 5500 1202 Pls 5661 1198 Pls 5822 1006 Pls 5983 1228 Pls 6143 1173 Pls 6304 1150 Pls 6465 1209 Pls 6626 1261 Pls 6786 1117 Pls 6579 4738 Pls % End plot #1 % Begin plot #2 1.000 UL LT1 /Helvetica findfont 140 scalefont setfont LCb setrgbcolor 6296 4598 M (f\(x\)) Rshow LT1 6380 4598 M 399 0 V 518 4382 M 63 -140 V 64 -134 V 63 -128 V 63 -122 V 64 -118 V 63 -112 V 63 -108 V 64 -103 V 63 -99 V 63 -94 V 63 -90 V 64 -87 V 63 -83 V 63 -79 V 64 -76 V 63 -72 V 63 -70 V 64 -66 V 63 -64 V 63 -61 V 64 -58 V 63 -56 V 63 -53 V 64 -52 V 63 -49 V 63 -46 V 64 -45 V 63 -43 V 63 -41 V 63 -40 V 64 -37 V 63 -36 V 63 -35 V 64 -33 V 63 -32 V 63 -30 V 64 -29 V 63 -28 V 63 -26 V 64 -26 V 63 -24 V 63 -23 V 64 -22 V 63 -22 V 63 -20 V 64 -20 V 63 -18 V 63 -18 V 63 -17 V 64 -17 V 63 -16 V 63 -15 V 64 -14 V 63 -14 V 63 -13 V 64 -13 V 63 -12 V 63 -11 V 64 -11 V 63 -11 V 63 -10 V 64 -10 V 63 -9 V 63 -9 V 64 -8 V 63 -9 V 63 -7 V 63 -8 V 64 -7 V 63 -7 V 63 -6 V 64 -7 V 63 -6 V 63 -5 V 64 -6 V 63 -5 V 63 -5 V 64 -5 V 63 -5 V 63 -4 V 64 -4 V 63 -4 V 63 -4 V 64 -4 V 63 -3 V 63 -4 V 63 -3 V 64 -3 V 63 -3 V 63 -3 V 64 -3 V 63 -2 V 63 -3 V 64 -2 V 63 -3 V 63 -2 V 64 -2 V 63 -2 V 63 -2 V % End plot #2 stroke LTb 518 4871 N 518 448 L 6429 0 V 0 4423 V -6429 0 V Z stroke 1.000 UP 1.000 UL LTb stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica gsl-doc-2.3/doc/diff.texi0000664000175000017500000001067612620026734013346 0ustar eddedd@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.txt @end example @node Numerical Differentiation References @section References and Further Reading The algorithms used by these functions are described in the following sources: @itemize @w{} @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 gsl-doc-2.3/doc/rand-cauchy.tex0000664000175000017500000005425012616157443014466 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-cauchy.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-cauchy.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1078 R -31 0 V 31 1079 R -31 0 V 31 1078 R -31 0 V 31 1078 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 763 M 19 2 V 20 1 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 19 3 V 20 2 V 19 2 V 20 3 V 19 2 V 20 3 V 19 2 V 19 3 V 20 3 V 19 2 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 3 V 20 4 V 19 3 V 19 4 V 20 3 V 19 4 V 20 4 V 19 4 V 20 4 V 19 4 V 19 5 V 20 4 V 19 5 V 20 4 V 19 5 V 20 5 V 19 5 V 19 5 V 20 6 V 19 5 V 20 6 V 19 5 V 20 6 V 19 6 V 19 7 V 20 6 V 19 7 V 20 7 V 19 7 V 20 7 V 19 7 V 19 8 V 20 8 V 19 8 V 20 8 V 19 9 V 20 9 V 19 9 V 19 10 V 20 10 V 19 10 V 20 10 V 19 11 V 20 11 V 19 12 V 19 12 V 20 12 V 19 13 V 20 13 V 19 14 V 20 14 V 19 15 V 19 15 V 20 16 V 19 16 V 20 17 V 19 18 V 20 18 V 19 19 V 19 20 V 20 20 V 19 21 V 20 22 V 19 23 V 20 24 V 19 24 V 19 26 V 20 27 V 19 27 V 20 29 V 3052 1635 L 20 31 V 19 33 V 19 33 V 20 35 V 19 37 V 20 38 V 19 39 V 20 41 V 19 43 V 19 44 V 20 46 V 19 48 V 20 50 V 19 51 V 20 54 V 19 55 V 19 57 V 20 59 V 19 61 V 20 63 V 19 65 V 20 66 V 19 69 V 19 69 V 20 71 V 19 73 V 20 73 V 19 74 V 20 74 V 19 75 V 19 74 V 20 74 V 19 72 V 20 71 V 19 68 V 20 65 V 19 62 V 19 59 V 20 53 V 19 48 V 20 43 V 19 36 V 20 30 V 19 22 V 19 16 V 20 7 V 19 0 V 20 -7 V 19 -16 V 19 -22 V 20 -30 V 19 -36 V 20 -43 V 19 -48 V 20 -53 V 19 -59 V 19 -62 V 20 -65 V 19 -68 V 20 -71 V 19 -72 V 20 -74 V 19 -74 V 19 -75 V 20 -74 V 19 -74 V 20 -73 V 19 -73 V 20 -71 V 19 -69 V 19 -69 V 20 -66 V 19 -65 V 20 -63 V 19 -61 V 20 -59 V 19 -57 V 19 -55 V 20 -54 V 19 -51 V 20 -50 V 19 -48 V 20 -46 V 19 -44 V 19 -43 V 20 -41 V 19 -39 V 20 -38 V 19 -37 V 20 -35 V 19 -33 V 19 -33 V 20 -31 V 19 -30 V 20 -29 V 19 -27 V 20 -27 V 19 -26 V 19 -24 V 20 -24 V 19 -23 V 20 -22 V 19 -21 V 20 -20 V 5092 1342 L 19 -19 V 20 -18 V 19 -18 V 20 -17 V 19 -16 V 20 -16 V 19 -15 V 19 -15 V 20 -14 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -12 V 20 -11 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 868 M 19 2 V 20 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 3 V 20 3 V 19 4 V 19 3 V 20 4 V 19 3 V 20 4 V 19 4 V 20 4 V 19 3 V 19 4 V 20 4 V 19 5 V 20 4 V 19 4 V 20 4 V 19 5 V 19 4 V 20 5 V 19 4 V 20 5 V 19 5 V 20 5 V 19 5 V 19 5 V 20 5 V 19 5 V 20 6 V 19 5 V 20 6 V 19 6 V 19 5 V 20 6 V 19 6 V 20 6 V 19 7 V 20 6 V 19 7 V 19 6 V 20 7 V 19 7 V 20 7 V 19 7 V 20 8 V 19 7 V 19 8 V 20 8 V 19 8 V 20 8 V 19 8 V 20 8 V 19 9 V 19 9 V 20 9 V 19 9 V 20 9 V 19 10 V 20 9 V 19 10 V 19 10 V 20 10 V 19 11 V 20 11 V 19 10 V 20 12 V 19 11 V 19 11 V 20 12 V 19 12 V 20 12 V 19 13 V 20 12 V 19 13 V 19 13 V 20 14 V 19 13 V 20 14 V 19 14 V 20 14 V 19 15 V 19 15 V 20 15 V 19 15 V 20 15 V 19 16 V 20 16 V 19 16 V 19 17 V 20 16 V 19 17 V 20 17 V 3052 1700 L 20 18 V 19 17 V 19 18 V 20 18 V 19 18 V 20 18 V 19 19 V 20 18 V 19 19 V 19 18 V 20 19 V 19 19 V 20 18 V 19 19 V 20 18 V 19 19 V 19 18 V 20 18 V 19 19 V 20 17 V 19 18 V 20 17 V 19 18 V 19 16 V 20 17 V 19 16 V 20 15 V 19 15 V 20 15 V 19 14 V 19 13 V 20 13 V 19 12 V 20 11 V 19 11 V 20 10 V 19 9 V 19 8 V 20 8 V 19 6 V 20 6 V 19 4 V 20 4 V 19 3 V 19 2 V 20 1 V 19 0 V 20 -1 V 19 -2 V 19 -3 V 20 -4 V 19 -4 V 20 -6 V 19 -6 V 20 -8 V 19 -8 V 19 -9 V 20 -10 V 19 -11 V 20 -11 V 19 -12 V 20 -13 V 19 -13 V 19 -14 V 20 -15 V 19 -15 V 20 -15 V 19 -16 V 20 -17 V 19 -16 V 19 -18 V 20 -17 V 19 -18 V 20 -17 V 19 -19 V 20 -18 V 19 -18 V 19 -19 V 20 -18 V 19 -19 V 20 -18 V 19 -19 V 20 -19 V 19 -18 V 19 -19 V 20 -18 V 19 -19 V 20 -18 V 19 -18 V 20 -18 V 19 -18 V 19 -17 V 20 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -17 V 19 -16 V 20 -16 V 19 -16 V 20 -15 V 19 -15 V 20 -15 V 5092 1508 L 19 -15 V 20 -14 V 19 -14 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 20 -12 V 19 -11 V 19 -11 V 20 -12 V 19 -10 V 20 -11 V 19 -11 V 20 -10 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=2$}}% \put(5957,4781){\rjust{\strut{}$a=1$}}% \put(3955,5244){\cjust{\strut{}Cauchy Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4944){\rjust{\strut{} 0.4}}% \put(900,3866){\rjust{\strut{} 0.3}}% \put(900,2788){\rjust{\strut{} 0.2}}% \put(900,1709){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-hypergeometric.tex0000664000175000017500000004507112616157443016241 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-hypergeometric.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-hypergeometric.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 3685 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -509 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -2009 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -509 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 2994 658 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$n1=5, n2=20, t=3$}}% \put(3955,5244){\cjust{\strut{}Hypergeometric Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.7}}% \put(900,4328){\rjust{\strut{} 0.6}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,3096){\rjust{\strut{} 0.4}}% \put(900,2479){\rjust{\strut{} 0.3}}% \put(900,1863){\rjust{\strut{} 0.2}}% \put(900,1247){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-bivariate-gaussian.tex0000664000175000017500000005664412616157443017001 0ustar eddedd% 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.0500bp \GNUPLOTpicture(5760,5760) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-bivariate-gaussian.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 288 288 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-bivariate-gaussian.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 0.500 UL LTb 1521 1521 M 0 2718 V 2718 0 R -2718 0 V 0 -2718 R 0 -31 V 680 31 R 0 -31 V 679 31 R 0 -31 V 679 31 R 0 -31 V 680 31 R 0 -31 V 0 31 R 31 0 V -31 680 R 31 0 V -31 679 R 31 0 V -31 679 R 31 0 V -31 680 R 31 0 V 1521 1521 M -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 31 0 R -31 0 V 1.000 UP stroke 1.000 UL LT0 LTb 1.000 UL LT0 4794 4896 M 543 0 V 2893 2926 M 9 4 V 9 2 V 9 2 V 9 0 V 10 -1 V 9 -4 V 2 -3 V -2 -1 V -9 -4 V -10 -3 V -9 -3 V -9 -1 V -9 1 V -9 11 V -81 -95 R -2 3 V 2 1 V 9 4 V 10 3 V 9 3 V 9 1 V 9 -1 V 9 -11 V -9 -4 V -9 -2 V -9 -2 V -9 0 V -10 1 V -9 4 V 2312 2266 M -9 1 V -9 3 V 845 601 R -10 -10 V -9 -10 V -9 -11 V -5 -6 V -4 -4 V -9 -9 V -9 -10 V -9 -9 V -9 -9 V -9 -10 V -9 -9 V -9 -9 V -10 -10 V -9 -9 V -5 -6 V -4 -4 V -9 -9 V -9 -8 V -9 -9 V -9 -9 V -9 -8 V -9 -9 V -9 -9 V -9 -8 V -10 -9 V -9 -9 V -2 -3 V -7 -6 V -9 -8 V -9 -8 V -9 -8 V -8 -8 V -9 -8 V -9 -8 V -9 -8 V -9 -8 V -9 -8 V -10 -8 V -8 -8 V -1 0 V -9 -8 V -9 -7 V -9 -8 V -9 -7 V -9 -8 V -9 -7 V -9 -7 V -9 -7 V -9 -7 V -10 -8 V -9 -7 V -9 -7 V -6 -5 V -3 -3 V -9 -6 V -9 -7 V -9 -7 V -9 -6 V -9 -6 V -9 -7 V -9 -6 V -10 -6 V -9 -6 V -9 -7 V -9 -6 V -9 -6 V -9 -7 V -9 -6 V -3 -2 V 2558 2361 L -9 -6 V -9 -5 V -9 -5 V -10 -5 V -9 -5 V -9 -5 V -9 -5 V -9 -4 V -9 -5 V -9 -4 V -9 -5 V -9 -4 V -9 -4 V -9 -4 V -10 -5 V -9 -4 V -9 -3 V -9 -4 V -9 -4 V -9 -3 V -1 -1 V -8 -2 V -9 -1 V -9 -2 V -9 -1 V -9 0 V -10 0 V -9 1 V 727 1016 R 9 7 V 9 7 V 6 5 V 3 3 V 9 6 V 9 7 V 9 7 V 9 6 V 9 6 V 9 7 V 9 6 V 10 6 V 9 6 V 9 7 V 9 6 V 9 6 V 9 7 V 9 6 V 3 2 V 6 4 V 9 6 V 9 5 V 9 5 V 10 5 V 9 5 V 9 5 V 9 5 V 9 4 V 9 5 V 9 4 V 9 5 V 9 4 V 9 4 V 9 4 V 10 5 V 9 4 V 9 3 V 9 4 V 9 4 V 9 3 V 1 1 V 8 2 V 9 1 V 9 2 V 9 1 V 9 0 V 10 0 V 9 -1 V 9 -1 V 9 -3 V 5 -1 V 4 -7 V 9 -28 V 7 -59 V -7 -15 V -9 -20 V -9 -24 V -9 -30 V -2 -5 V -7 -12 V -9 -14 V -10 -15 V -9 -16 V -9 -18 V -8 -18 V -1 -1 V -9 -12 V -9 -13 V -9 -12 V -9 -14 V -9 -13 V -9 -15 V -9 -14 V 0 -1 V -10 -11 V 3320 3090 L -9 -11 V -9 -12 V -9 -12 V -9 -12 V -9 -13 V -7 -10 V -2 -2 V -9 -11 V -9 -11 V -9 -10 V -10 -11 V -9 -11 V -9 -11 V -9 -11 V -9 -12 V -3 -4 V -6 -6 V -9 -10 V -9 -10 V -9 -10 V -9 -10 V -9 -9 V 2294 2270 M -5 1 V -4 7 V -9 28 V -7 59 V 7 15 V 9 20 V 9 24 V 9 30 V 2 5 V 7 12 V 9 14 V 10 15 V 9 16 V 9 18 V 8 18 V 1 1 V 9 12 V 9 13 V 9 12 V 9 14 V 9 13 V 9 15 V 9 14 V 0 1 V 10 11 V 9 12 V 9 11 V 9 12 V 9 12 V 9 12 V 9 13 V 7 10 V 2 2 V 9 11 V 9 11 V 9 10 V 10 11 V 9 11 V 9 11 V 9 11 V 9 12 V 3 4 V 6 6 V 9 10 V 9 10 V 9 10 V 9 10 V 9 9 V 10 10 V 9 10 V 9 11 V 5 6 V 4 4 V 9 9 V 9 10 V 9 9 V 9 9 V 9 10 V 9 9 V 9 9 V 10 10 V 9 9 V 5 6 V 4 4 V 9 9 V 9 8 V 9 9 V 9 9 V 9 8 V 9 9 V 9 9 V 9 8 V 10 9 V 9 9 V 2 3 V 7 6 V 9 8 V 9 8 V 9 8 V 8 8 V 9 8 V 2902 3168 L 9 8 V 9 8 V 9 8 V 10 8 V 8 8 V 1 0 V 9 8 V 9 7 V 9 8 V 9 7 V 9 8 V 9 7 V 9 7 V 9 7 V 9 7 V 10 8 V 2731 2307 M -10 -7 V -9 -7 V -9 -7 V -9 -7 V -9 -7 V -1 -1 V -8 -7 V -9 -8 V -9 -8 V -9 -7 V -9 -8 V -9 -7 V -10 -7 V -9 -7 V -9 -7 V -9 -6 V -9 -7 V -9 -6 V -9 -7 V -3 -1 V -6 -6 V -9 -7 V -9 -8 V -9 -7 V -10 -7 V -9 -6 V -9 -7 V -9 -6 V -9 -7 V -9 -6 V -9 -6 V -9 -6 V -9 -6 V -9 -6 V -6 -3 V -3 -3 V -10 -7 V -9 -7 V -9 -6 V -9 -6 V -9 -6 V -9 -6 V -9 -6 V -9 -6 V -9 -5 V -9 -6 V -9 -5 V -10 -5 V -9 -6 V -9 -5 V -9 -5 V -7 -4 V -2 -1 V -9 -6 V -9 -5 V -9 -6 V -9 -5 V -9 -5 V -9 -5 V -10 -4 V -9 -5 V -9 -5 V -9 -4 V -9 -4 V -9 -5 V -9 -4 V -9 -4 V -9 -4 V -9 -4 V -9 -3 V -10 -4 V -9 -4 V -9 -3 V -8 -4 V -1 0 V -9 -3 V -9 -3 V -9 -3 V -9 -2 V -9 -3 V -9 -2 V -9 -2 V -10 -2 V -9 -1 V -9 -1 V -9 -1 V -9 -1 V 1976 1872 L -9 0 V -9 1 V -9 1 V -9 2 V -9 2 V -10 4 V -9 4 V -9 5 V 3539 3138 M -10 -11 V -9 -11 V -1 -2 V -8 -10 V -9 -12 V -9 -12 V -9 -11 V -9 -11 V -9 -10 V -9 -11 V -9 -11 V -6 -6 V -3 -5 V -10 -11 V -9 -11 V -9 -11 V -9 -11 V -9 -10 V -9 -10 V -9 -10 V -9 -10 V -4 -5 V -5 -6 V -9 -11 V -9 -11 V -10 -10 V -9 -9 V -9 -10 V -9 -10 V -9 -9 V -9 -10 V -7 -6 V -2 -3 V -9 -11 V -9 -11 V -9 -10 V -9 -10 V -10 -9 V -9 -9 V -9 -10 V -9 -8 V -9 -9 V -4 -4 V -5 -6 V -9 -10 V -9 -10 V -9 -10 V -9 -10 V -9 -9 V -10 -9 V -9 -8 V -9 -9 V -9 -8 V -5 -5 V -4 -4 V -9 -10 V -9 -10 V -9 -9 V -9 -9 V -9 -9 V -9 -9 V -10 -8 V -9 -8 V -9 -8 V -9 -8 V -1 -2 V -8 -8 V -9 -9 V -9 -10 V -9 -9 V -9 -8 V -9 -9 V -9 -8 V -10 -8 V -9 -7 V -9 -8 V -9 -8 V -2 -1 V -7 -8 V -9 -9 V -8 -9 V -9 -8 V -9 -8 V -9 -8 V -9 -8 V -9 -8 V -10 -7 V -9 -8 V -9 -7 V -8 -6 V -1 -1 V -9 -9 V -9 -9 V -9 -8 V -9 -8 V 2749 2322 L -9 -7 V -9 -8 V 708 1443 R 9 6 V 9 5 V 9 5 V 7 4 V 2 1 V 9 6 V 9 5 V 9 6 V 9 5 V 9 5 V 9 5 V 10 4 V 9 5 V 9 5 V 9 4 V 9 4 V 9 5 V 9 4 V 9 4 V 9 4 V 9 4 V 9 3 V 10 4 V 9 4 V 9 3 V 8 4 V 1 0 V 9 3 V 9 3 V 9 3 V 9 2 V 9 3 V 9 2 V 9 2 V 10 2 V 9 1 V 9 1 V 9 1 V 9 1 V 9 0 V 9 0 V 9 -1 V 9 -1 V 9 -2 V 9 -2 V 10 -4 V 9 -4 V 9 -5 V 8 -5 V 1 -2 V 9 -23 V 9 -37 V 5 -32 V -5 -18 V -9 -37 V -8 -39 V -1 -3 V -9 -20 V -9 -21 V -9 -22 V -10 -25 V 0 -3 V -9 -14 V -9 -17 V -9 -17 V -9 -17 V -9 -18 V -5 -10 V -4 -7 V -9 -15 V -9 -15 V -9 -14 V -9 -15 V -10 -16 V -7 -12 V -2 -3 V -9 -14 V -9 -13 V -9 -14 V -9 -13 V -9 -13 V -9 -14 V -7 -10 V -2 -4 V -9 -12 V -9 -13 V -10 -13 V -9 -12 V -9 -13 V -9 -12 V -9 -12 V -2 -2 V -7 -11 V -9 -12 V -9 -12 V -9 -12 V -9 -11 V -9 -12 V -927 -72 R 9 9 V 10 9 V 2640 3092 L 9 9 V 9 8 V 5 5 V 4 4 V 9 10 V 9 10 V 9 9 V 9 9 V 9 9 V 9 9 V 10 8 V 9 8 V 9 8 V 9 8 V 1 2 V 8 8 V 9 9 V 9 10 V 9 9 V 9 8 V 9 9 V 9 8 V 10 8 V 9 7 V 9 8 V 9 8 V 2 1 V 7 8 V 9 9 V 8 9 V 9 8 V 9 8 V 9 8 V 9 8 V 9 8 V 10 7 V 9 8 V 9 7 V 8 6 V 1 1 V 9 9 V 9 9 V 9 8 V 9 8 V 9 8 V 9 7 V 9 8 V 10 7 V 9 7 V 9 7 V 9 7 V 9 7 V 1 1 V 8 7 V 9 8 V 9 8 V 9 7 V 9 8 V 9 7 V 10 7 V 9 7 V 9 7 V 9 6 V 9 7 V 9 6 V 9 7 V 3 1 V 6 6 V 9 7 V 9 8 V 9 7 V 10 7 V 9 6 V 9 7 V 9 6 V 9 7 V 9 6 V 9 6 V 9 6 V 9 6 V 9 6 V 6 3 V 3 3 V 10 7 V 9 7 V 9 6 V 9 6 V 9 6 V 9 6 V 9 6 V 9 6 V 9 5 V 9 6 V 9 5 V 10 5 V 1903 1891 M -8 5 V -1 2 V -9 23 V -9 37 V -5 32 V 5 18 V 9 37 V 8 39 V 1894 2087 L 9 20 V 9 21 V 9 22 V 10 25 V 0 3 V 9 14 V 9 17 V 9 17 V 9 17 V 9 18 V 5 10 V 4 7 V 9 15 V 9 15 V 9 14 V 9 15 V 10 16 V 7 12 V 2 3 V 9 14 V 9 13 V 9 14 V 9 13 V 9 13 V 9 14 V 7 10 V 2 4 V 9 12 V 9 13 V 10 13 V 9 12 V 9 13 V 9 12 V 9 12 V 2 2 V 7 11 V 9 12 V 9 12 V 9 12 V 9 11 V 9 12 V 10 11 V 9 11 V 1 2 V 8 10 V 9 12 V 9 12 V 9 11 V 9 11 V 9 10 V 9 11 V 9 11 V 6 6 V 3 5 V 10 11 V 9 11 V 9 11 V 9 11 V 9 10 V 9 10 V 9 10 V 9 10 V 4 5 V 5 6 V 9 11 V 9 11 V 10 10 V 9 9 V 9 10 V 9 10 V 9 9 V 9 10 V 7 6 V 2 3 V 9 11 V 9 11 V 9 10 V 9 10 V 10 9 V 9 9 V 9 10 V 9 8 V 9 9 V 4 4 V 5 6 V 9 10 V 9 10 V 9 10 V 9 10 V stroke 0.500 UL LTb 4239 4239 M 0 -2718 V -2718 0 R 2718 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP stroke grestore end showpage }}% \put(4950,2880){\cjust{\strut{}$y$}}% \put(2880,810){\cjust{\strut{}$x$}}% \put(4674,4896){\rjust{\strut{}$\sigma_x=1, \sigma_y=1, \rho=0.9$}}% \put(2880,5379){\cjust{\strut{}Bivariate Gaussian Distribution}}% \put(1363,1521){\rjust{\strut{} 0.7}}% \put(1363,1521){\rjust{\strut{} 0.6}}% \put(1363,1521){\rjust{\strut{} 0.5}}% \put(1363,1521){\rjust{\strut{} 0.4}}% \put(1363,1521){\rjust{\strut{} 0.3}}% \put(1363,1521){\rjust{\strut{} 0.2}}% \put(1363,1521){\rjust{\strut{} 0.1}}% \put(1363,1521){\rjust{\strut{} 0}}% \put(4390,4239){\ljust{\strut{} 2}}% \put(4390,3559){\ljust{\strut{} 1}}% \put(4390,2880){\ljust{\strut{} 0}}% \put(4390,2201){\ljust{\strut{}-1}}% \put(4390,1521){\ljust{\strut{}-2}}% \put(4239,1290){\cjust{\strut{}2}}% \put(3559,1290){\cjust{\strut{}1}}% \put(2880,1290){\cjust{\strut{}0}}% \put(2201,1290){\cjust{\strut{}-1}}% \put(1521,1290){\cjust{\strut{}-2}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/roots.texi0000664000175000017500000007336212616157443013614 0ustar eddedd@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}) @tindex gsl_root_fsolver @tindex gsl_root_fsolver_type 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}) @tindex gsl_root_fdfsolver @tindex gsl_root_fdfsolver_type 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 as a function pointer: @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 = ¶ms; @end example @noindent The function @math{f(x)} can be evaluated using the macro @code{GSL_FN_EVAL(&F,x)} defined in @file{gsl_math.h}. @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{df}) 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 macro @code{GSL_FN_FDF_EVAL_F(&FDF,x)} and the derivative @math{f'(x)} can be evaluated using the macro @code{GSL_FN_FDF_EVAL_DF(&FDF,x)}. Both the function @math{y = f(x)} and its derivative @math{dy = f'(x)} can be evaluated at the same time using the macro @code{GSL_FN_FDF_EVAL_F_DF(&FDF,x,y,dy)}. 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 an 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}@footnote{J.F. Steffensen (1873--1961). The spelling used in the name of the function is slightly incorrect, but has been preserved to avoid incompatibility.} 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 @w{} @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 gsl-doc-2.3/doc/rand-logistic.tex0000664000175000017500000005427512616157443015036 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-logistic.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-logistic.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 727 M 19 3 V 20 3 V 19 4 V 20 3 V 19 4 V 20 3 V 19 4 V 19 4 V 20 5 V 19 4 V 20 4 V 19 5 V 20 5 V 19 4 V 19 5 V 20 6 V 19 5 V 20 6 V 19 5 V 20 6 V 19 6 V 19 7 V 20 6 V 19 7 V 20 7 V 19 7 V 20 7 V 19 8 V 19 8 V 20 8 V 19 8 V 20 9 V 19 9 V 20 9 V 19 9 V 19 10 V 20 10 V 19 10 V 20 11 V 19 11 V 20 11 V 19 12 V 19 12 V 20 12 V 19 13 V 20 13 V 19 14 V 20 14 V 19 14 V 19 15 V 20 15 V 19 15 V 20 17 V 19 16 V 20 17 V 19 18 V 19 17 V 20 19 V 19 19 V 20 19 V 19 20 V 20 21 V 19 21 V 19 22 V 20 22 V 19 23 V 20 23 V 19 24 V 20 25 V 19 25 V 19 26 V 20 27 V 19 27 V 20 28 V 19 28 V 20 29 V 19 30 V 19 30 V 20 31 V 19 32 V 20 32 V 19 34 V 20 33 V 19 35 V 19 35 V 20 36 V 19 36 V 20 37 V 19 38 V 20 38 V 19 39 V 19 40 V 20 40 V 19 40 V 20 42 V 19 42 V 20 42 V 19 43 V 19 43 V 20 44 V 19 44 V 20 45 V 3052 2700 L 20 46 V 19 45 V 19 46 V 20 46 V 19 46 V 20 46 V 19 46 V 20 47 V 19 46 V 19 46 V 20 46 V 19 46 V 20 45 V 19 45 V 20 45 V 19 44 V 19 44 V 20 43 V 19 43 V 20 41 V 19 41 V 20 40 V 19 40 V 19 38 V 20 37 V 19 36 V 20 35 V 19 33 V 20 32 V 19 31 V 19 29 V 20 28 V 19 26 V 20 25 V 19 22 V 20 22 V 19 19 V 19 18 V 20 15 V 19 14 V 20 12 V 19 10 V 20 8 V 19 6 V 19 4 V 20 2 V 19 0 V 20 -2 V 19 -4 V 19 -6 V 20 -8 V 19 -10 V 20 -12 V 19 -14 V 20 -15 V 19 -18 V 19 -19 V 20 -22 V 19 -22 V 20 -25 V 19 -26 V 20 -28 V 19 -29 V 19 -31 V 20 -32 V 19 -33 V 20 -35 V 19 -36 V 20 -37 V 19 -38 V 19 -40 V 20 -40 V 19 -41 V 20 -41 V 19 -43 V 20 -43 V 19 -44 V 19 -44 V 20 -45 V 19 -45 V 20 -45 V 19 -46 V 20 -46 V 19 -46 V 19 -46 V 20 -47 V 19 -46 V 20 -46 V 19 -46 V 20 -46 V 19 -46 V 19 -45 V 20 -46 V 19 -44 V 20 -45 V 19 -44 V 20 -44 V 19 -43 V 19 -43 V 20 -42 V 19 -42 V 20 -42 V 19 -40 V 20 -40 V 5092 2191 L 19 -39 V 20 -38 V 19 -38 V 20 -37 V 19 -36 V 20 -36 V 19 -35 V 19 -35 V 20 -33 V 19 -34 V 20 -32 V 19 -32 V 20 -31 V 19 -30 V 19 -30 V 20 -29 V 19 -28 V 20 -28 V 19 -27 V 20 -27 V 19 -26 V 19 -25 V 20 -25 V 19 -24 V 20 -23 V 19 -23 V 20 -22 V 19 -22 V 19 -21 V 20 -21 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -17 V 19 -18 V 20 -17 V 19 -16 V 20 -17 V 19 -15 V 20 -15 V 19 -15 V 19 -14 V 20 -14 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -4 V 20 -5 V 19 -5 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 1135 M 19 7 V 20 7 V 19 8 V 20 7 V 19 8 V 20 7 V 19 8 V 19 8 V 20 8 V 19 8 V 20 8 V 19 8 V 20 8 V 19 8 V 19 8 V 20 9 V 19 8 V 20 9 V 19 9 V 20 8 V 19 9 V 19 9 V 20 9 V 19 9 V 20 10 V 19 9 V 20 9 V 19 10 V 19 9 V 20 10 V 19 9 V 20 10 V 19 10 V 20 10 V 19 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 11 V 20 10 V 19 10 V 19 11 V 20 11 V 19 10 V 20 11 V 19 11 V 20 11 V 19 10 V 19 11 V 20 11 V 19 11 V 20 12 V 19 11 V 20 11 V 19 11 V 19 11 V 20 12 V 19 11 V 20 11 V 19 12 V 20 11 V 19 12 V 19 11 V 20 12 V 19 11 V 20 12 V 19 11 V 20 12 V 19 11 V 19 12 V 20 12 V 19 11 V 20 12 V 19 11 V 20 12 V 19 11 V 19 12 V 20 11 V 19 12 V 20 11 V 19 11 V 20 12 V 19 11 V 19 11 V 20 11 V 19 12 V 20 11 V 19 11 V 20 11 V 19 10 V 19 11 V 20 11 V 19 11 V 20 10 V 19 11 V 20 10 V 19 10 V 19 10 V 20 10 V 19 10 V 20 10 V 3052 2182 L 20 9 V 19 10 V 19 9 V 20 9 V 19 9 V 20 9 V 19 8 V 20 9 V 19 8 V 19 9 V 20 8 V 19 7 V 20 8 V 19 8 V 20 7 V 19 7 V 19 7 V 20 7 V 19 6 V 20 7 V 19 6 V 20 6 V 19 5 V 19 6 V 20 5 V 19 5 V 20 5 V 19 5 V 20 4 V 19 4 V 19 4 V 20 4 V 19 3 V 20 4 V 19 3 V 20 2 V 19 3 V 19 2 V 20 2 V 19 2 V 20 1 V 19 2 V 20 1 V 19 0 V 19 1 V 20 0 V 19 0 V 20 0 V 19 -1 V 19 0 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 19 -10 V 20 -9 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -11 V 20 -10 V 19 -11 V 20 -11 V 5092 2058 L 19 -10 V 20 -11 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -12 V 20 -11 V 19 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 19 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 19 -12 V 20 -11 V 19 -12 V 20 -11 V 19 -11 V 20 -12 V 19 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -10 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -11 V 19 -11 V 19 -10 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=2$}}% \put(5957,4781){\rjust{\strut{}$a=1$}}% \put(3955,5244){\cjust{\strut{}Logistic Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4944){\rjust{\strut{} 0.3}}% \put(900,3506){\rjust{\strut{} 0.2}}% \put(900,2069){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/fft-complex-radix2-f.eps0000664000175000017500000001101712616157443016107 0ustar eddedd%!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 gsl-doc-2.3/doc/specfunc-elljac.texi0000664000175000017500000000104212616157443015466 0ustar eddedd@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 gsl-doc-2.3/doc/randplots.gnp0000664000175000017500000002314112616157443014255 0ustar eddedd#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 map 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)= (xa) ? 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.35] set ytics 0.05 set output "rand-levyskew.tex" set title "Levy Skew Distribution" logp(x)= -1.34229+x*(-0.354314+x*(-0.322538+x*(0.205603+x*(-0.0518879+x*(0.00569502+x*-0.000224843))))) p1(x)=exp(logp(x)) 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 walks" set xzeroaxis set yzeroaxis set nokey set noxlabel set noylabel plot "rand-walk.dat" using 1:2 with linesp gsl-doc-2.3/doc/specfunc-mathieu.texi0000664000175000017500000002557012616157443015704 0ustar eddedd@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}) @tindex gsl_sf_mathieu_workspace 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}) @deftypefunx int gsl_sf_mathieu_a_e (int @var{n}, double @var{q}, gsl_sf_result * @var{result}) @deftypefunx int gsl_sf_mathieu_b (int @var{n}, double @var{q}) @deftypefunx int gsl_sf_mathieu_b_e (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}) @deftypefunx int gsl_sf_mathieu_ce_e (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}) @deftypefunx int gsl_sf_mathieu_se_e (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}) @deftypefunx int gsl_sf_mathieu_Mc_e (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}) @deftypefunx int gsl_sf_mathieu_Ms_e (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 gsl-doc-2.3/doc/bspline.texi0000664000175000017500000002614212620455303014063 0ustar eddedd@cindex basis splines, B-splines @cindex splines, basis This chapter describes functions for the computation of smoothing basis splines (B-splines). A smoothing spline differs from an interpolating spline in that the resulting curve is not required to pass through each datapoint. @xref{Interpolation}, for information about interpolating splines. The header file @file{gsl_bspline.h} contains the 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:: * Evaluation of B-spline basis function derivatives:: * Working with the Greville abscissae:: * Example programs for B-splines:: * B-Spline 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 @c{$t = \{t_0, t_1, \dots, t_{n+k-1}\}$} @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) = {(x - t_i) \over (t_{i+k-1} - t_i)} B_{i,k-1}(x) + {(t_{i+k} - x) \over (t_{i+k} - t_{i+1})} 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 @noindent 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 @noindent given enough @math{(x_j, f(x_j))} data pairs. The coefficients @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 The computation of B-spline functions requires a preallocated workspace of type @code{gsl_bspline_workspace}. @deftypefun {gsl_bspline_workspace *} gsl_bspline_alloc (const size_t @var{k}, const size_t @var{nbreak}) @tindex gsl_bspline_workspace 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(2k^2 + 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, basis splines @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 @var{a}, const double @var{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 the vector @var{B}, so that the @math{i}-th element is @math{B_i(x)}. The vector @var{B} must be of length @math{n = nbreak + k - 2}. This value may also be obtained by calling @code{gsl_bspline_ncoeffs}. Computing all the basis functions at once is more efficient than computing them individually, due to the nature of the defining recurrence relation. @end deftypefun @deftypefun int gsl_bspline_eval_nonzero (const double @var{x}, gsl_vector * @var{Bk}, size_t * @var{istart}, size_t * @var{iend}, gsl_bspline_workspace * @var{w}) This function evaluates all potentially nonzero B-spline basis functions at the position @var{x} and stores them in the vector @var{Bk}, so that the @math{i}-th element is @c{$B_{(istart+i)}(x)$} @math{B_(istart+i)(x)}. The last element of @var{Bk} is @c{$B_{iend}(x)$} @math{B_(iend)(x)}. The vector @var{Bk} must be of length @math{k}. By returning only the nonzero basis functions, this function allows quantities involving linear combinations of the @math{B_i(x)} to be computed without unnecessary terms (such linear combinations occur, for example, when evaluating an interpolated function). @end deftypefun @deftypefun size_t gsl_bspline_ncoeffs (gsl_bspline_workspace * @var{w}) This function returns the number of B-spline coefficients given by @math{n = nbreak + k - 2}. @end deftypefun @node Evaluation of B-spline basis function derivatives @section Evaluation of B-spline derivatives @cindex basis splines, derivatives @deftypefun int gsl_bspline_deriv_eval (const double @var{x}, const size_t @var{nderiv}, gsl_matrix * @var{dB}, gsl_bspline_workspace * @var{w}) This function evaluates all B-spline basis function derivatives of orders @math{0} through @math{nderiv} (inclusive) at the position @var{x} and stores them in the matrix @var{dB}. The @math{(i,j)}-th element of @var{dB} is @math{d^jB_i(x)/dx^j}. The matrix @var{dB} must be of size @math{n = nbreak + k - 2} by @math{nderiv + 1}. The value @math{n} may also be obtained by calling @code{gsl_bspline_ncoeffs}. Note that function evaluations are included as the zeroth order derivatives in @var{dB}. Computing all the basis function derivatives at once is more efficient than computing them individually, due to the nature of the defining recurrence relation. @end deftypefun @deftypefun int gsl_bspline_deriv_eval_nonzero (const double @var{x}, const size_t @var{nderiv}, gsl_matrix * @var{dB}, size_t * @var{istart}, size_t * @var{iend}, gsl_bspline_workspace * @var{w}) This function evaluates all potentially nonzero B-spline basis function derivatives of orders @math{0} through @math{nderiv} (inclusive) at the position @var{x} and stores them in the matrix @var{dB}. The @math{(i,j)}-th element of @var{dB} is @c{$d^jB_{(istart+i)}(x)/dx^j$} @math{d^j/dx^j B_(istart+i)(x)}. The last row of @var{dB} contains @c{$d^jB_{iend}(x)/dx^j$} @math{d^j/dx^j B_(iend)(x)}. The matrix @var{dB} must be of size @math{k} by at least @math{nderiv + 1}. Note that function evaluations are included as the zeroth order derivatives in @var{dB}. By returning only the nonzero basis functions, this function allows quantities involving linear combinations of the @math{B_i(x)} and their derivatives to be computed without unnecessary terms. @end deftypefun @node Working with the Greville abscissae @section Working with the Greville abscissae @cindex basis splines, Greville abscissae @cindex basis splines, Marsden-Schoenberg points The Greville abscissae are defined to be the mean location of @math{k-1} consecutive knots in the knot vector for each basis spline function of order @math{k}. With the first and last knots in the @code{gsl_bspline_workspace} knot vector excluded, there are @code{gsl_bspline_ncoeffs} Greville abscissae for any given B-spline basis. These values are often used in B-spline collocation applications and may also be called Marsden-Schoenberg points. @deftypefun double gsl_bspline_greville_abscissa (size_t @var{i}, gsl_bspline_workspace *@var{w}); Returns the location of the @math{i}-th Greville abscissa for the given B-spline basis. For the ill-defined case when @math{k=1}, the implementation chooses to return breakpoint interval midpoints. @end deftypefun @c See https://savannah.gnu.org/bugs/index.php?34361 @c @deftypefun int gsl_bspline_knots_greville (const gsl_vector * @var{abscissae}, gsl_bspline_workspace * @var{w}, double * @var{abserr}); @c Given target Greville abscissae values in @var{abscissae} and a workspace @c @var{w} where @code{abscissae->size == gsl_bspline_ncoeffs(w)}, this functions @c computes and stores the knots required for the workspace to best approximate @c the target abscissae. The approximation is optimal in that the first and last @c values in @var{abscissae} are preserved exactly while the 2-norm of the error @c in any other abscissae is minimized. If not-@code{NULL}, the sum of the @c absolute approximation errors over each abscissa is returned in @var{abserr}. @c @c The workspace order must satisfy @math{k > 1} and @var{abscissae} should be @c monotonically increasing. Beware that when @code{w->nbreak} is small relative @c to @code{w->k} the best approximation may still be of poor quality for @c non-uniformly spaced @var{abscissae}. This function has memory and runtime @c overhead that scales like a QR-based linear least squares solution on a @c @code{(abscissae->size - 2)} by @code{(w->nbreak - 2)} problem. @c @end deftypefun @node Example programs for B-splines @section Examples @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{(-x/10)}} on the interval @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.txt chisq/dof = 1.118217e+00, Rsq = 0.989771 $ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.txt > bspline.ps @end example @iftex @sp 1 @center @image{bspline,3.4in} @end iftex @node B-Spline References and Further Reading @section B-Spline References and Further Reading Further information on the algorithms described in this section can be found in the following book, @itemize @w{} @item C. de Boor, @cite{A Practical Guide to Splines} (1978), Springer-Verlag, ISBN 0-387-90356-9. @end itemize Further information of Greville abscissae and B-spline collocation can be found in the following paper, @itemize @w{} @item Richard W. Johnson, Higher order B-spline collocation at the Greville abscissae. @cite{Applied Numerical Mathematics}. vol.@: 52, 2005, 63--75. @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}, which is also part of @sc{slatec}. gsl-doc-2.3/doc/spblas.texi0000664000175000017500000000352712616157443013726 0ustar eddedd@cindex sparse BLAS @cindex BLAS, sparse The Sparse Basic Linear Algebra Subprograms (@sc{blas}) define a set of fundamental operations on vectors and sparse matrices which can be used to create optimized higher-level linear algebra functionality. GSL supports a limited number of BLAS operations for sparse matrices. @noindent The header file @file{gsl_spblas.h} contains the prototypes for the sparse BLAS functions and related declarations. @menu * Sparse BLAS operations:: * Sparse BLAS References and Further Reading:: @end menu @node Sparse BLAS operations @section Sparse BLAS operations @cindex sparse matrices, BLAS operations @deftypefun int gsl_spblas_dgemv (const CBLAS_TRANSPOSE_t TransA, const double @var{alpha}, const gsl_spmatrix * @var{A}, const gsl_vector * @var{x}, const double @var{beta}, gsl_vector * @var{y}) This function computes the matrix-vector product and sum @math{y \leftarrow \alpha op(A) x + \beta y}, where @math{op(A) = A}, @math{A^T} for @var{TransA} = @code{CblasNoTrans}, @code{CblasTrans}. In-place computations are not supported, so @var{x} and @var{y} must be distinct vectors. The matrix @var{A} may be in triplet or compressed format. @end deftypefun @deftypefun int gsl_spblas_dgemm (const double @var{alpha}, const gsl_spmatrix * @var{A}, const gsl_spmatrix * @var{B}, gsl_spmatrix * @var{C}) This function computes the sparse matrix-matrix product @math{C = \alpha A B}. The matrices must be in compressed format. @end deftypefun @node Sparse BLAS References and Further Reading @section References and Further Reading @cindex sparse matrices, references The algorithms used by these functions are described in the following sources: @itemize @w{} @item T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM, 2006. @item CSparse software library, @uref{https://www.cise.ufl.edu/research/sparse/CSparse} @end itemize gsl-doc-2.3/doc/gsl-histogram.10000664000175000017500000000270012616157443014401 0ustar eddedd.\" Man page contributed by Dirk Eddelbuettel .\" 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 , the Debian GNU/Linux maintainer for .BR GSL . gsl-doc-2.3/doc/regularized.eps0000644000175000017500000010407613004361416014561 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: regularized.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Wed Oct 26 06:06:41 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 626 338 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 626 50 lineto 626 338 lineto 50 338 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (regularized.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Oct 26 06:06:41 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 11520.00 5760.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 602 448 M 63 0 V 4842 0 R -63 0 V stroke 518 448 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 939 M 31 0 V 4874 0 R -31 0 V 602 1226 M 31 0 V 4874 0 R -31 0 V 602 1430 M 31 0 V 4874 0 R -31 0 V 602 1588 M 31 0 V 4874 0 R -31 0 V 602 1717 M 31 0 V 4874 0 R -31 0 V 602 1826 M 31 0 V 4874 0 R -31 0 V 602 1920 M 31 0 V 4874 0 R -31 0 V 602 2004 M 31 0 V 4874 0 R -31 0 V 602 2078 M 63 0 V 4842 0 R -63 0 V stroke 518 2078 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2569 M 31 0 V 4874 0 R -31 0 V 602 2856 M 31 0 V 4874 0 R -31 0 V 602 3060 M 31 0 V 4874 0 R -31 0 V 602 3218 M 31 0 V 4874 0 R -31 0 V 602 3347 M 31 0 V 4874 0 R -31 0 V 602 3456 M 31 0 V 4874 0 R -31 0 V 602 3551 M 31 0 V 4874 0 R -31 0 V 602 3634 M 31 0 V 4874 0 R -31 0 V 602 3709 M 63 0 V 4842 0 R -63 0 V stroke 518 3709 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 4199 M 31 0 V 4874 0 R -31 0 V 602 4487 M 31 0 V 4874 0 R -31 0 V 602 4690 M 31 0 V 4874 0 R -31 0 V 602 4848 M 31 0 V 4874 0 R -31 0 V 602 4977 M 31 0 V 4874 0 R -31 0 V 602 5086 M 31 0 V 4874 0 R -31 0 V 602 5181 M 31 0 V 4874 0 R -31 0 V 602 5264 M 31 0 V 4874 0 R -31 0 V 602 5339 M 63 0 V 4842 0 R -63 0 V stroke 518 5339 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 448 M 0 63 V 0 4828 R 0 -63 V stroke 602 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1340 448 M 0 31 V 0 4860 R 0 -31 V 1772 448 M 0 31 V 0 4860 R 0 -31 V 2079 448 M 0 31 V 0 4860 R 0 -31 V 2316 448 M 0 31 V 0 4860 R 0 -31 V 2510 448 M 0 31 V 0 4860 R 0 -31 V 2675 448 M 0 31 V 0 4860 R 0 -31 V 2817 448 M 0 31 V 0 4860 R 0 -31 V 2942 448 M 0 31 V 0 4860 R 0 -31 V 3055 448 M 0 63 V 0 4828 R 0 -63 V stroke 3055 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 3793 448 M 0 31 V 0 4860 R 0 -31 V 4225 448 M 0 31 V 0 4860 R 0 -31 V 4531 448 M 0 31 V 0 4860 R 0 -31 V 4769 448 M 0 31 V 0 4860 R 0 -31 V 4963 448 M 0 31 V 0 4860 R 0 -31 V 5127 448 M 0 31 V 0 4860 R 0 -31 V 5269 448 M 0 31 V 0 4860 R 0 -31 V 5395 448 M 0 31 V 0 4860 R 0 -31 V 5507 448 M 0 63 V 0 4828 R 0 -63 V stroke 5507 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (3)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 602 5339 N 602 448 L 4905 0 V 0 4891 V -4905 0 V Z stroke LCb setrgbcolor 112 2893 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (solution norm ||c||)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3054 98 M [ [(Helvetica) 140.0 0.0 true true 0 (residual norm ||y - X c||)] ] -46.7 MCshow LTb 3054 5549 M [ [(Helvetica) 140.0 0.0 true true 0 (L-curve)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.300 UP 2.000 UL LTb LCb setrgbcolor /Helvetica findfont 140 scalefont setfont /vshift -46 def 3561 1835 M -49 32 V -50 30 V -53 30 V -54 27 V -56 26 V -58 25 V -59 23 V -60 22 V -62 20 V -62 20 V -64 18 V -63 17 V -64 15 V -64 15 V -64 13 V -62 13 V -62 12 V -60 10 V -59 11 V -56 9 V -54 8 V -51 8 V -48 7 V -45 7 V -41 6 V -38 6 V -35 5 V -31 5 V -29 4 V -24 4 V -22 4 V -20 3 V -16 3 V -15 3 V -12 3 V -11 2 V -9 2 V -8 2 V -7 2 V -5 1 V -5 2 V -4 1 V -4 2 V -2 1 V -3 1 V -2 1 V -1 1 V -2 0 V -1 1 V -1 1 V -1 0 V 0 1 V -1 0 V 0 1 V -1 0 V 0 1 V -1 0 V 0 1 V 0 1 V -1 0 V 0 1 V 0 1 V 0 1 V 0 1 V 0 1 V 0 1 V 0 1 V 0 1 V 0 2 V 0 2 V 0 2 V 0 2 V 0 3 V 0 3 V 0 4 V 0 5 V 0 6 V 0 6 V 0 8 V 0 10 V 0 10 V 0 13 V 0 14 V 0 17 V 0 19 V 0 21 V 0 25 V 0 26 V 0 30 V 0 33 V 0 35 V 0 38 V 0 41 V 0 43 V 0 46 V 0 47 V 0 49 V 0 51 V 0 52 V 0 54 V 0 54 V 0 55 V 0 56 V 0 56 V stroke 1829 3270 M 0 56 V 0 56 V 0 57 V 0 56 V 0 56 V 0 55 V 0 55 V 0 55 V 0 54 V 0 53 V 0 52 V 0 52 V 0 50 V 0 50 V 0 48 V 0 48 V 0 46 V 0 45 V 0 44 V 0 42 V 0 41 V 0 39 V 0 38 V 0 37 V 0 35 V 0 34 V 3561 1835 CircleF 3512 1867 CircleF 3462 1897 CircleF 3409 1927 CircleF 3355 1954 CircleF 3299 1980 CircleF 3241 2005 CircleF 3182 2028 CircleF 3122 2050 CircleF 3060 2070 CircleF 2998 2090 CircleF 2934 2108 CircleF 2871 2125 CircleF 2807 2140 CircleF 2743 2155 CircleF 2679 2168 CircleF 2617 2181 CircleF 2555 2193 CircleF 2495 2203 CircleF 2436 2214 CircleF 2380 2223 CircleF 2326 2231 CircleF 2275 2239 CircleF 2227 2246 CircleF 2182 2253 CircleF 2141 2259 CircleF 2103 2265 CircleF 2068 2270 CircleF 2037 2275 CircleF 2008 2279 CircleF 1984 2283 CircleF 1962 2287 CircleF 1942 2290 CircleF 1926 2293 CircleF 1911 2296 CircleF 1899 2299 CircleF 1888 2301 CircleF 1879 2303 CircleF 1871 2305 CircleF 1864 2307 CircleF 1859 2308 CircleF 1854 2310 CircleF 1850 2311 CircleF 1846 2313 CircleF 1844 2314 CircleF 1841 2315 CircleF 1839 2316 CircleF 1838 2317 CircleF 1836 2317 CircleF 1835 2318 CircleF 1834 2319 CircleF 1833 2319 CircleF 1833 2320 CircleF 1832 2320 CircleF 1832 2321 CircleF 1831 2321 CircleF 1831 2322 CircleF 1831 2322 CircleF 1830 2322 CircleF 1830 2323 CircleF 1830 2323 CircleF 1830 2323 CircleF 1830 2323 CircleF 1830 2324 CircleF 1830 2324 CircleF 1830 2324 CircleF 1830 2324 CircleF 1830 2324 CircleF 1829 2324 CircleF 1829 2324 CircleF 1829 2324 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2325 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2326 CircleF 1829 2327 CircleF 1829 2327 CircleF 1829 2327 CircleF 1829 2327 CircleF 1829 2328 CircleF 1829 2328 CircleF 1829 2329 CircleF 1829 2330 CircleF 1829 2330 CircleF 1829 2331 CircleF 1829 2332 CircleF 1829 2334 CircleF 1829 2336 CircleF 1829 2338 CircleF 1829 2340 CircleF 1829 2343 CircleF 1829 2346 CircleF 1829 2350 CircleF 1829 2355 CircleF 1829 2361 CircleF 1829 2367 CircleF 1829 2375 CircleF 1829 2385 CircleF 1829 2395 CircleF 1829 2408 CircleF 1829 2422 CircleF 1829 2439 CircleF 1829 2458 CircleF 1829 2479 CircleF 1829 2504 CircleF 1829 2530 CircleF 1829 2560 CircleF 1829 2593 CircleF 1829 2628 CircleF 1829 2666 CircleF 1829 2707 CircleF 1829 2750 CircleF 1829 2796 CircleF 1829 2843 CircleF 1829 2892 CircleF 1829 2943 CircleF 1829 2995 CircleF 1829 3049 CircleF 1829 3103 CircleF 1829 3158 CircleF 1829 3214 CircleF 1829 3270 CircleF 1829 3326 CircleF 1829 3382 CircleF 1829 3439 CircleF 1829 3495 CircleF 1829 3551 CircleF 1829 3606 CircleF 1829 3661 CircleF 1829 3716 CircleF 1829 3770 CircleF 1829 3823 CircleF 1829 3875 CircleF 1829 3927 CircleF 1829 3977 CircleF 1829 4027 CircleF 1829 4075 CircleF 1829 4123 CircleF 1829 4169 CircleF 1829 4214 CircleF 1829 4258 CircleF 1829 4300 CircleF 1829 4341 CircleF 1829 4380 CircleF 1829 4418 CircleF 1829 4455 CircleF 1829 4490 CircleF 1829 4524 CircleF % End plot #1 % Begin plot #2 3.000 UP 2.000 UL LT6 0.90 0.17 0.09 C /Helvetica findfont 140 scalefont setfont 1829 2325 Circle % End plot #2 1.000 UL LTb LCb setrgbcolor 602 5339 N 602 448 L 4905 0 V 0 4891 V -4905 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6362 448 M 63 0 V 4842 0 R -63 0 V stroke 6278 448 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-4)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 939 M 31 0 V 4874 0 R -31 0 V 6362 1226 M 31 0 V 4874 0 R -31 0 V 6362 1430 M 31 0 V 4874 0 R -31 0 V 6362 1588 M 31 0 V 4874 0 R -31 0 V 6362 1717 M 31 0 V 4874 0 R -31 0 V 6362 1826 M 31 0 V 4874 0 R -31 0 V -4874 94 R 31 0 V 4874 0 R -31 0 V -4874 84 R 31 0 V 4874 0 R -31 0 V -4874 74 R 63 0 V 4842 0 R -63 0 V stroke 6278 2078 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-3)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 2569 M 31 0 V 4874 0 R -31 0 V 6362 2856 M 31 0 V 4874 0 R -31 0 V 6362 3060 M 31 0 V 4874 0 R -31 0 V 6362 3218 M 31 0 V 4874 0 R -31 0 V 6362 3347 M 31 0 V 4874 0 R -31 0 V 6362 3456 M 31 0 V 4874 0 R -31 0 V -4874 95 R 31 0 V 4874 0 R -31 0 V -4874 83 R 31 0 V 4874 0 R -31 0 V -4874 75 R 63 0 V 4842 0 R -63 0 V stroke 6278 3709 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-2)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 4199 M 31 0 V 4874 0 R -31 0 V 6362 4487 M 31 0 V 4874 0 R -31 0 V 6362 4690 M 31 0 V 4874 0 R -31 0 V 6362 4848 M 31 0 V 4874 0 R -31 0 V 6362 4977 M 31 0 V 4874 0 R -31 0 V 6362 5086 M 31 0 V 4874 0 R -31 0 V -4874 95 R 31 0 V 4874 0 R -31 0 V -4874 83 R 31 0 V 4874 0 R -31 0 V -4874 75 R 63 0 V 4842 0 R -63 0 V stroke 6278 5339 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MRshow 1.000 UL LTb LCb setrgbcolor 6362 448 M 0 63 V 0 4828 R 0 -63 V stroke 6362 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 6657 448 M 0 31 V 0 4860 R 0 -31 V 7048 448 M 0 31 V 0 4860 R 0 -31 V 7248 448 M 0 31 V 0 4860 R 0 -31 V 7343 448 M 0 63 V 0 4828 R 0 -63 V stroke 7343 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (-1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 7638 448 M 0 31 V 0 4860 R 0 -31 V 8029 448 M 0 31 V 0 4860 R 0 -31 V 8229 448 M 0 31 V 0 4860 R 0 -31 V 8324 448 M 0 63 V 0 4828 R 0 -63 V stroke 8324 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (0)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 8619 448 M 0 31 V 0 4860 R 0 -31 V 9010 448 M 0 31 V 0 4860 R 0 -31 V 9210 448 M 0 31 V 0 4860 R 0 -31 V 9305 448 M 0 63 V 0 4828 R 0 -63 V stroke 9305 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (1)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 9600 448 M 0 31 V 0 4860 R 0 -31 V 9991 448 M 0 31 V 0 4860 R 0 -31 V 10191 448 M 0 31 V 0 4860 R 0 -31 V 95 -4860 R 0 63 V 0 4828 R 0 -63 V stroke 10286 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (2)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 10581 448 M 0 31 V 0 4860 R 0 -31 V 10972 448 M 0 31 V 0 4860 R 0 -31 V 11172 448 M 0 31 V 0 4860 R 0 -31 V 95 -4860 R 0 63 V 0 4828 R 0 -63 V stroke 11267 308 M [ [(Helvetica) 140.0 0.0 true true 0 (10)] [(Helvetica) 112.0 70.0 true true 0 (3)] ] -60.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6362 5339 N 0 -4891 V 4905 0 V 0 4891 V -4905 0 V Z stroke LCb setrgbcolor 5872 2893 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (G\()] [(Symbol) 140.0 0.0 true true 0 (l)] [(Helvetica) 140.0 0.0 true true 0 (\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 8814 98 M [ [(Symbol) 140.0 0.0 true true 0 (l)] ] -46.7 MCshow LTb 8814 5549 M [ [(Helvetica) 140.0 0.0 true true 0 (GCV curve)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 0.300 UP 2.000 UL LTb LCb setrgbcolor /Helvetica findfont 140 scalefont setfont 10627 4383 M -20 -65 V -20 -67 V -20 -70 V -19 -72 V -20 -74 V -20 -77 V -20 -79 V -20 -80 V -19 -82 V -20 -83 V -20 -84 V -20 -85 V -19 -85 V -20 -85 V -20 -84 V -20 -83 V -19 -82 V -20 -80 V -20 -78 V -20 -75 V -20 -71 V -19 -68 V -20 -64 V -20 -60 V -20 -55 V -19 -51 V -20 -46 V -20 -41 V -20 -38 V -19 -33 V -20 -29 V -20 -26 V -20 -22 V -20 -19 V -19 -17 V -20 -14 V -20 -12 V -20 -11 V -19 -9 V -20 -7 V -20 -6 V -20 -6 V -20 -4 V -19 -4 V -20 -3 V -20 -3 V -20 -2 V -19 -2 V -20 -1 V -20 -1 V -20 -2 V -19 0 V -20 -1 V -20 -1 V -20 0 V -20 -1 V -19 0 V -20 0 V -20 -1 V -20 0 V -19 0 V -20 0 V -20 0 V -20 0 V -19 0 V -20 -1 V -20 0 V -20 0 V -20 0 V -19 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 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 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 stroke 8570 2081 M -19 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 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 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 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 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 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 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 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 10627 4383 CircleF 10607 4318 CircleF 10587 4251 CircleF 10567 4181 CircleF 10548 4109 CircleF 10528 4035 CircleF 10508 3958 CircleF 10488 3879 CircleF 10468 3799 CircleF 10449 3717 CircleF 10429 3634 CircleF 10409 3550 CircleF 10389 3465 CircleF 10370 3380 CircleF 10350 3295 CircleF 10330 3211 CircleF 10310 3128 CircleF 10291 3046 CircleF 10271 2966 CircleF 10251 2888 CircleF 10231 2813 CircleF 10211 2742 CircleF 10192 2674 CircleF 10172 2610 CircleF 10152 2550 CircleF 10132 2495 CircleF 10113 2444 CircleF 10093 2398 CircleF 10073 2357 CircleF 10053 2319 CircleF 10034 2286 CircleF 10014 2257 CircleF 9994 2231 CircleF 9974 2209 CircleF 9954 2190 CircleF 9935 2173 CircleF 9915 2159 CircleF 9895 2147 CircleF 9875 2136 CircleF 9856 2127 CircleF 9836 2120 CircleF 9816 2114 CircleF 9796 2108 CircleF 9776 2104 CircleF 9757 2100 CircleF 9737 2097 CircleF 9717 2094 CircleF 9697 2092 CircleF 9678 2090 CircleF 9658 2089 CircleF 9638 2088 CircleF 9618 2086 CircleF 9599 2086 CircleF 9579 2085 CircleF 9559 2084 CircleF 9539 2084 CircleF 9519 2083 CircleF 9500 2083 CircleF 9480 2083 CircleF 9460 2082 CircleF 9440 2082 CircleF 9421 2082 CircleF 9401 2082 CircleF 9381 2082 CircleF 9361 2082 CircleF 9342 2082 CircleF 9322 2081 CircleF 9302 2081 CircleF 9282 2081 CircleF 9262 2081 CircleF 9243 2081 CircleF 9223 2081 CircleF 9203 2081 CircleF 9183 2081 CircleF 9164 2081 CircleF 9144 2081 CircleF 9124 2081 CircleF 9104 2081 CircleF 9084 2081 CircleF 9065 2081 CircleF 9045 2081 CircleF 9025 2081 CircleF 9005 2081 CircleF 8986 2081 CircleF 8966 2081 CircleF 8946 2081 CircleF 8926 2081 CircleF 8907 2081 CircleF 8887 2081 CircleF 8867 2081 CircleF 8847 2081 CircleF 8827 2081 CircleF 8808 2081 CircleF 8788 2081 CircleF 8768 2081 CircleF 8748 2081 CircleF 8729 2081 CircleF 8709 2081 CircleF 8689 2081 CircleF 8669 2081 CircleF 8649 2081 CircleF 8630 2081 CircleF 8610 2081 CircleF 8590 2081 CircleF 8570 2081 CircleF 8551 2081 CircleF 8531 2081 CircleF 8511 2081 CircleF 8491 2081 CircleF 8472 2081 CircleF 8452 2081 CircleF 8432 2081 CircleF 8412 2081 CircleF 8392 2081 CircleF 8373 2081 CircleF 8353 2081 CircleF 8333 2081 CircleF 8313 2081 CircleF 8294 2081 CircleF 8274 2081 CircleF 8254 2081 CircleF 8234 2081 CircleF 8215 2081 CircleF 8195 2081 CircleF 8175 2081 CircleF 8155 2081 CircleF 8135 2081 CircleF 8116 2081 CircleF 8096 2081 CircleF 8076 2081 CircleF 8056 2081 CircleF 8037 2081 CircleF 8017 2081 CircleF 7997 2081 CircleF 7977 2081 CircleF 7957 2081 CircleF 7938 2081 CircleF 7918 2081 CircleF 7898 2081 CircleF 7878 2081 CircleF 7859 2081 CircleF 7839 2081 CircleF 7819 2081 CircleF 7799 2081 CircleF 7780 2081 CircleF 7760 2081 CircleF 7740 2081 CircleF 7720 2081 CircleF 7700 2081 CircleF 7681 2081 CircleF 7661 2081 CircleF 7641 2081 CircleF 7621 2081 CircleF 7602 2081 CircleF 7582 2081 CircleF 7562 2081 CircleF 7542 2081 CircleF 7523 2081 CircleF 7503 2081 CircleF 7483 2081 CircleF 7463 2081 CircleF 7443 2081 CircleF 7424 2081 CircleF 7404 2081 CircleF 7384 2081 CircleF 7364 2081 CircleF 7345 2081 CircleF 7325 2081 CircleF 7305 2081 CircleF 7285 2081 CircleF 7265 2081 CircleF 7246 2081 CircleF 7226 2081 CircleF 7206 2081 CircleF 7186 2081 CircleF 7167 2081 CircleF 7147 2081 CircleF 7127 2081 CircleF 7107 2081 CircleF 7088 2081 CircleF 7068 2081 CircleF 7048 2081 CircleF 7028 2081 CircleF 7008 2081 CircleF 6989 2081 CircleF 6969 2081 CircleF 6949 2081 CircleF 6929 2081 CircleF 6910 2081 CircleF 6890 2081 CircleF 6870 2081 CircleF 6850 2081 CircleF 6831 2081 CircleF 6811 2081 CircleF 6791 2081 CircleF 6771 2081 CircleF 6751 2081 CircleF 6732 2081 CircleF 6712 2081 CircleF 6692 2081 CircleF % End plot #1 % Begin plot #2 3.000 UP 2.000 UL LT6 0.90 0.17 0.09 C /Helvetica findfont 140 scalefont setfont 6721 2081 Circle % End plot #2 1.000 UL LTb LCb setrgbcolor 6362 5339 N 0 -4891 V 4905 0 V 0 4891 V -4905 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Symbol Helvetica gsl-doc-2.3/doc/specfunc-erf.texi0000664000175000017500000000640112616157443015014 0ustar eddedd@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 Mills' ratio, inverse The @dfn{hazard function} for the normal distribution, also known as the inverse Mills' 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 gsl-doc-2.3/doc/multiset.texi0000664000175000017500000001750412620026734014301 0ustar eddedd@cindex multisets This chapter describes functions for creating and manipulating multisets. A multiset @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} may occur more than once. The multiset @math{c} corresponds to indices of @math{k} elements chosen from an @math{n} element vector with replacement. In mathematical terms, @math{n} is the cardinality of the multiset while @math{k} is the maximum multiplicity of any value. Multisets are useful, for example, when iterating over the indices of a @math{k}-th order symmetric tensor in @math{n}-space. The functions described in this chapter are defined in the header file @file{gsl_multiset.h}. @menu * The Multiset struct:: * Multiset allocation:: * Accessing multiset elements:: * Multiset properties:: * Multiset functions:: * Reading and writing multisets:: * Multiset Examples:: @end menu @node The Multiset struct @section The Multiset struct @tindex gsl_multiset A multiset is defined by a structure containing three components, the values of @math{n} and @math{k}, and a pointer to the multiset array. The elements of the multiset array are all of type @code{size_t}, and are stored in increasing order. The @code{gsl_multiset} structure looks like this, @example typedef struct @{ size_t n; size_t k; size_t *data; @} gsl_multiset; @end example @comment @noindent @node Multiset allocation @section Multiset allocation @deftypefun {gsl_multiset *} gsl_multiset_alloc (size_t @var{n}, size_t @var{k}) This function allocates memory for a new multiset with parameters @var{n}, @var{k}. The multiset is not initialized and its elements are undefined. Use the function @code{gsl_multiset_calloc} if you want to create a multiset which is initialized to the lexicographically first multiset element. A null pointer is returned if insufficient memory is available to create the multiset. @end deftypefun @deftypefun {gsl_multiset *} gsl_multiset_calloc (size_t @var{n}, size_t @var{k}) This function allocates memory for a new multiset with parameters @var{n}, @var{k} and initializes it to the lexicographically first multiset element. A null pointer is returned if insufficient memory is available to create the multiset. @end deftypefun @deftypefun void gsl_multiset_init_first (gsl_multiset * @var{c}) This function initializes the multiset @var{c} to the lexicographically first multiset element, i.e. @math{0} repeated @math{k} times. @end deftypefun @deftypefun void gsl_multiset_init_last (gsl_multiset * @var{c}) This function initializes the multiset @var{c} to the lexicographically last multiset element, i.e. @math{n-1} repeated @math{k} times. @end deftypefun @deftypefun void gsl_multiset_free (gsl_multiset * @var{c}) This function frees all the memory used by the multiset @var{c}. @end deftypefun @deftypefun int gsl_multiset_memcpy (gsl_multiset * @var{dest}, const gsl_multiset * @var{src}) This function copies the elements of the multiset @var{src} into the multiset @var{dest}. The two multisets must have the same size. @end deftypefun @node Accessing multiset elements @section Accessing multiset elements The following function can be used to access the elements of a multiset. @deftypefun size_t gsl_multiset_get (const gsl_multiset * @var{c}, const size_t @var{i}) This function returns the value of the @var{i}-th element of the multiset @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. @inlinefn{} @end deftypefun @node Multiset properties @section Multiset properties @deftypefun size_t gsl_multiset_n (const gsl_multiset * @var{c}) This function returns the range (@math{n}) of the multiset @var{c}. @end deftypefun @deftypefun size_t gsl_multiset_k (const gsl_multiset * @var{c}) This function returns the number of elements (@math{k}) in the multiset @var{c}. @end deftypefun @deftypefun {size_t *} gsl_multiset_data (const gsl_multiset * @var{c}) This function returns a pointer to the array of elements in the multiset @var{c}. @end deftypefun @deftypefun int gsl_multiset_valid (gsl_multiset * @var{c}) @cindex checking multiset for validity @cindex testing multiset for validity This function checks that the multiset @var{c} is valid. The @var{k} elements should lie in the range 0 to @math{@var{n}-1}, with each value occurring in nondecreasing order. @end deftypefun @node Multiset functions @section Multiset functions @deftypefun int gsl_multiset_next (gsl_multiset * @var{c}) @cindex iterating through multisets This function advances the multiset @var{c} to the next multiset element in lexicographic order and returns @code{GSL_SUCCESS}. If no further multisets elements are available it returns @code{GSL_FAILURE} and leaves @var{c} unmodified. Starting with the first multiset and repeatedly applying this function will iterate through all possible multisets of a given order. @end deftypefun @deftypefun int gsl_multiset_prev (gsl_multiset * @var{c}) This function steps backwards from the multiset @var{c} to the previous multiset element in lexicographic order, returning @code{GSL_SUCCESS}. If no previous multiset is available it returns @code{GSL_FAILURE} and leaves @var{c} unmodified. @end deftypefun @node Reading and writing multisets @section Reading and writing multisets The library provides functions for reading and writing multisets to a file as binary data or formatted text. @deftypefun int gsl_multiset_fwrite (FILE * @var{stream}, const gsl_multiset * @var{c}) This function writes the elements of the multiset @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_multiset_fread (FILE * @var{stream}, gsl_multiset * @var{c}) This function reads elements from the open stream @var{stream} into the multiset @var{c} in binary format. The multiset @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_multiset_fprintf (FILE * @var{stream}, const gsl_multiset * @var{c}, const char * @var{format}) This function writes the elements of the multiset @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}. In ISO C99 the type modifier @code{z} represents @code{size_t}, so @code{"%zu\n"} is a suitable format.@footnote{In versions of the GNU C library prior to the ISO C99 standard, the type modifier @code{Z} was used instead.} The function returns @code{GSL_EFAILED} if there was a problem writing to the file. @end deftypefun @deftypefun int gsl_multiset_fscanf (FILE * @var{stream}, gsl_multiset * @var{c}) This function reads formatted data from the stream @var{stream} into the multiset @var{c}. The multiset @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 Multiset Examples @section Examples The example program below prints all multisets elements containing the values @math{@{0,1,2,3@}} ordered by size. Multiset elements of the same size are ordered lexicographically. @example @verbatiminclude examples/multiset.c @end example @noindent Here is the output from the program, @example $ ./a.out @verbatiminclude examples/multiset.txt @end example @noindent All 70 multisets are generated and sorted lexicographically. gsl-doc-2.3/doc/rand-exponential.tex0000664000175000017500000005357712616157443015553 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-exponential.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-exponential.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 1936 31 R 0 -31 V 1937 31 R 0 -31 V 1936 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 4944 M 19 -43 V 20 -43 V 19 -42 V 20 -42 V 19 -41 V 20 -41 V 19 -41 V 19 -40 V 20 -39 V 19 -40 V 20 -39 V 19 -38 V 20 -38 V 19 -38 V 19 -38 V 20 -37 V 19 -36 V 20 -37 V 19 -36 V 20 -35 V 19 -35 V 19 -35 V 20 -35 V 19 -34 V 20 -34 V 19 -33 V 20 -34 V 19 -32 V 19 -33 V 20 -32 V 19 -32 V 20 -31 V 19 -32 V 20 -31 V 19 -30 V 19 -31 V 20 -30 V 19 -29 V 20 -30 V 19 -29 V 20 -29 V 19 -28 V 19 -28 V 20 -28 V 19 -28 V 20 -27 V 19 -28 V 20 -26 V 19 -27 V 19 -26 V 20 -26 V 19 -26 V 20 -26 V 19 -25 V 20 -25 V 19 -25 V 19 -25 V 20 -24 V 19 -24 V 20 -24 V 19 -23 V 20 -24 V 19 -23 V 19 -23 V 20 -22 V 19 -23 V 20 -22 V 19 -22 V 20 -22 V 19 -21 V 19 -22 V 20 -21 V 19 -21 V 20 -20 V 19 -21 V 20 -20 V 19 -20 V 19 -20 V 20 -20 V 19 -19 V 20 -20 V 19 -19 V 20 -19 V 19 -18 V 19 -19 V 20 -18 V 19 -18 V 20 -18 V 19 -18 V 20 -18 V 19 -17 V 19 -17 V 20 -18 V 19 -17 V 20 -16 V 19 -17 V 20 -16 V 19 -17 V 19 -16 V 20 -16 V 19 -15 V 20 -16 V 3052 2165 L 20 -15 V 19 -15 V 19 -15 V 20 -15 V 19 -15 V 20 -14 V 19 -15 V 20 -14 V 19 -14 V 19 -14 V 20 -14 V 19 -14 V 20 -13 V 19 -14 V 20 -13 V 19 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -12 V 20 -12 V 19 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 5092 1166 L 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 2788 M 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -11 V 19 -10 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 3052 1917 L 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 5092 1391 L 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\mu=2$}}% \put(5957,4781){\rjust{\strut{}$\mu=1$}}% \put(3955,5244){\cjust{\strut{}Exponential Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}3}}% \put(4924,400){\cjust{\strut{}2}}% \put(2987,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-chisq.tex0000664000175000017500000006011112616157443014312 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-chisq.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-chisq.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 1936 31 R 0 -31 V 1937 31 R 0 -31 V 1936 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1319 4944 M 4 -33 V 19 -166 V 20 -151 V 19 -137 V 20 -127 V 19 -116 V 20 -109 V 19 -100 V 19 -94 V 20 -89 V 19 -82 V 20 -78 V 19 -74 V 20 -70 V 19 -66 V 19 -63 V 20 -60 V 19 -57 V 20 -55 V 19 -52 V 20 -50 V 19 -48 V 19 -46 V 20 -44 V 19 -43 V 20 -41 V 19 -40 V 20 -38 V 19 -37 V 19 -36 V 20 -34 V 19 -34 V 20 -32 V 19 -32 V 20 -30 V 19 -30 V 19 -29 V 20 -28 V 19 -27 V 20 -26 V 19 -26 V 20 -25 V 19 -25 V 19 -24 V 20 -23 V 19 -23 V 20 -22 V 19 -21 V 20 -22 V 19 -20 V 19 -20 V 20 -20 V 19 -20 V 20 -18 V 19 -19 V 20 -18 V 19 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -16 V 19 -15 V 20 -15 V 19 -14 V 20 -15 V 19 -14 V 20 -14 V 19 -13 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -10 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 19 -8 V 20 -9 V 19 -8 V 3305 1522 L 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 5345 1012 L 19 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 2788 M 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -11 V 20 -10 V 19 -11 V 19 -10 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 19 -9 V 20 -10 V 19 -9 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -9 V 19 -9 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 20 -9 V 19 -8 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 3052 1917 L 20 -6 V 19 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 19 -5 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 5092 1391 L 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 19 -3 V 20 -4 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V stroke LT2 LTb LT2 6077 4381 M 543 0 V 1051 631 M 19 171 V 20 70 V 19 53 V 20 44 V 19 38 V 20 34 V 19 30 V 19 28 V 20 26 V 19 24 V 20 23 V 19 21 V 20 20 V 19 19 V 19 18 V 20 17 V 19 17 V 20 15 V 19 15 V 20 14 V 19 14 V 19 13 V 20 12 V 19 13 V 20 11 V 19 11 V 20 11 V 19 10 V 19 10 V 20 10 V 19 9 V 20 9 V 19 9 V 20 8 V 19 8 V 19 8 V 20 8 V 19 7 V 20 7 V 19 7 V 20 6 V 19 7 V 19 6 V 20 6 V 19 6 V 20 5 V 19 5 V 20 6 V 19 5 V 19 4 V 20 5 V 19 4 V 20 5 V 19 4 V 20 4 V 19 4 V 19 4 V 20 3 V 19 4 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 2 V 19 2 V 20 3 V 19 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 1 V 19 2 V 19 1 V 20 2 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 0 V 20 1 V 19 1 V 19 0 V 20 0 V 19 1 V 20 0 V 19 0 V 20 0 V 19 1 V 19 0 V 20 0 V 19 0 V 20 -1 V 3052 1674 L 20 0 V 19 0 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 5092 1507 L 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 19 -2 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4381){\rjust{\strut{}$\nu=3$}}% \put(5957,4581){\rjust{\strut{}$\nu=2$}}% \put(5957,4781){\rjust{\strut{}$\nu=1$}}% \put(3955,5244){\cjust{\strut{}Chi-squared Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}3}}% \put(4924,400){\cjust{\strut{}2}}% \put(2987,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/roots-bisection.eps0000664000175000017500000006033312616157443015401 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-gumbel.tex0000664000175000017500000004034612616157443014466 0ustar eddedd% 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 gsl-doc-2.3/doc/specfunc-laguerre.texi0000664000175000017500000000354712616157443016056 0ustar eddedd@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 gsl-doc-2.3/doc/nlfit2.eps0000644000175000017500000023503012737536472013457 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: nlfit2.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Wed Jun 8 08:50:03 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (nlfit2.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Jun 8 08:50:03 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if gsave % colour palette begin /maxcolors 0 def /HSV2RGB { exch dup 0.0 eq {pop exch pop dup dup} % achromatic gray { /HSVs exch def /HSVv exch def 6.0 mul dup floor dup 3 1 roll sub /HSVf exch def /HSVi exch cvi def /HSVp HSVv 1.0 HSVs sub mul def /HSVq HSVv 1.0 HSVs HSVf mul sub mul def /HSVt HSVv 1.0 HSVs 1.0 HSVf sub mul sub mul def /HSVi HSVi 6 mod def 0 HSVi eq {HSVv HSVt HSVp} {1 HSVi eq {HSVq HSVv HSVp}{2 HSVi eq {HSVp HSVv HSVt} {3 HSVi eq {HSVp HSVq HSVv}{4 HSVi eq {HSVt HSVp HSVv} {HSVv HSVp HSVq} ifelse} ifelse} ifelse} ifelse} ifelse } ifelse} def /Constrain { dup 0 lt {0 exch pop}{dup 1 gt {1 exch pop} if} ifelse} def /YIQ2RGB { 3 copy -1.702 mul exch -1.105 mul add add Constrain 4 1 roll 3 copy -0.647 mul exch -0.272 mul add add Constrain 5 1 roll 0.621 mul exch -0.956 mul add add Constrain 3 1 roll } def /CMY2RGB { 1 exch sub exch 1 exch sub 3 2 roll 1 exch sub 3 1 roll exch } def /XYZ2RGB { 3 copy -0.9017 mul exch -0.1187 mul add exch 0.0585 mul exch add Constrain 4 1 roll 3 copy -0.0279 mul exch 1.999 mul add exch -0.9844 mul add Constrain 5 1 roll -0.2891 mul exch -0.5338 mul add exch 1.91 mul exch add Constrain 3 1 roll} def /SelectSpace {ColorSpace (HSV) eq {HSV2RGB}{ColorSpace (XYZ) eq { XYZ2RGB}{ColorSpace (CMY) eq {CMY2RGB}{ColorSpace (YIQ) eq {YIQ2RGB} if} ifelse} ifelse} ifelse} def /InterpolatedColor true def /grayindex {/gidx 0 def {GrayA gidx get grayv ge {exit} if /gidx gidx 1 add def} loop} def /dgdx {grayv GrayA gidx get sub GrayA gidx 1 sub get GrayA gidx get sub div} def /redvalue {RedA gidx get RedA gidx 1 sub get RedA gidx get sub dgdxval mul add} def /greenvalue {GreenA gidx get GreenA gidx 1 sub get GreenA gidx get sub dgdxval mul add} def /bluevalue {BlueA gidx get BlueA gidx 1 sub get BlueA gidx get sub dgdxval mul add} def /interpolate { grayindex grayv GrayA gidx get sub abs 1e-5 le {RedA gidx get GreenA gidx get BlueA gidx get} {/dgdxval dgdx def redvalue greenvalue bluevalue} ifelse} def /GrayA [0 .125 .25 .375 .5 .625 .75 .875 1 ] def /RedA [0 0 0 0 .5 1 1 1 .5 ] def /GreenA [0 0 .5 1 1 1 .5 0 0 ] def /BlueA [.5 1 1 1 .5 0 0 0 0 ] def /pm3dround {maxcolors 0 gt {dup 1 ge {pop 1} {maxcolors mul floor maxcolors 1 sub div} ifelse} if} def /pm3dGamma 1.0 1.5 Gamma mul div def /ColorSpace (RGB) def Color InterpolatedColor or { % COLOUR vs. GRAY map InterpolatedColor { %% Interpolation vs. RGB-Formula /g {stroke pm3dround /grayv exch def interpolate SelectSpace setrgbcolor} bind def }{ /g {stroke pm3dround dup cF7 Constrain exch dup cF5 Constrain exch cF15 Constrain SelectSpace setrgbcolor} bind def } ifelse }{ /g {stroke pm3dround pm3dGamma exp setgray} bind def } ifelse 1.000 UL LTb LCb setrgbcolor 686 588 M 63 0 V 5311 0 R -63 0 V stroke 602 588 M [ [(Helvetica) 140.0 0.0 true true 0 (-0.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 1445 M 63 0 V 5311 0 R -63 0 V stroke 602 1445 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 2301 M 63 0 V 5311 0 R -63 0 V stroke 602 2301 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 3158 M 63 0 V 5311 0 R -63 0 V stroke 602 3158 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 4014 M 63 0 V 5311 0 R -63 0 V stroke 602 4014 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 686 4871 M 63 0 V 5311 0 R -63 0 V stroke 602 4871 M [ [(Helvetica) 140.0 0.0 true true 0 ( 2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1134 588 M 0 63 V 0 4220 R 0 -63 V stroke 1134 448 M [ [(Helvetica) 140.0 0.0 true true 0 (-1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2253 588 M 0 63 V 0 4220 R 0 -63 V stroke 2253 448 M [ [(Helvetica) 140.0 0.0 true true 0 (-0.5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3373 588 M 0 63 V 0 4220 R 0 -63 V stroke 3373 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4493 588 M 0 63 V 0 4220 R 0 -63 V stroke 4493 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5612 588 M 0 63 V 0 4220 R 0 -63 V stroke 5612 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 686 4871 N 686 588 L 5374 0 V 0 4283 V -5374 0 V Z stroke LCb setrgbcolor 112 2729 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (x)] [(Helvetica) 112.0 -42.0 true true 0 (2)] ] -32.7 MCshow grestore LTb LCb setrgbcolor 3373 238 M [ [(Helvetica) 140.0 0.0 true true 0 (x)] [(Helvetica) 112.0 -42.0 true true 0 (1)] ] -32.7 MCshow LTb 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 2.000 UL LT0 0 g 1 g 3374 4871 M 1 g 3374 4871 M -1 0 V 1 g 3373 4871 M -1 0 V 0 g .975 g 3711 4871 M .975 g 3711 4871 M -114 -27 V .975 g 3597 4844 M -224 -17 V .975 g 3373 4827 M -224 17 V .975 g 3149 4844 M -114 27 V 0 g .95 g 3869 4871 M .95 g 3869 4871 M -48 -19 V .95 g 3821 4852 M -224 -52 V .95 g 3597 4800 M -224 -17 V .95 g 3373 4783 M -224 17 V .95 g 3149 4800 M -224 52 V .95 g 2925 4852 M -48 19 V 0 g .925 g 703 588 M .925 g 703 588 M -17 29 V 0 g .925 g 3985 4871 M .925 g 3985 4871 M -164 -64 V .925 g 3821 4807 M -224 -51 V .925 g 3597 4756 M -224 -17 V .925 g 3373 4739 M -224 17 V .925 g 3149 4756 M -224 51 V .925 g 2925 4807 M -164 64 V 0 g .925 g 6060 617 M .925 g 6060 617 M -17 -29 V 0 g .9 g 730 588 M .9 g 730 588 M -44 74 V 0 g .9 g 4086 4871 M .9 g 4086 4871 M -41 -22 V .9 g 4045 4849 M -224 -86 V .9 g 3821 4763 M -224 -51 V .9 g 3597 4712 M -164 -12 V .9 g 3433 4700 M -60 -5 V .9 g 3373 4695 M -60 5 V .9 g 3313 4700 M -164 12 V .9 g 3149 4712 M -224 51 V .9 g 2925 4763 M -224 86 V .9 g 2701 4849 M -41 22 V 0 g .9 g 6060 662 M .9 g 6060 662 M -44 -74 V 0 g .875 g 756 588 M .875 g 756 588 M 686 708 L 0 g .875 g 4171 4871 M .875 g 4171 4871 M -126 -68 V .875 g 4045 4803 M -224 -85 V .875 g 3821 4718 M -80 -18 V .875 g 3741 4700 M -144 -34 V .875 g 3597 4666 M -224 -17 V .875 g 3373 4649 M -224 17 V .875 g 3149 4666 M -144 34 V .875 g 3005 4700 M -80 18 V .875 g 2925 4718 M -224 85 V .875 g 2701 4803 M -126 68 V 0 g .875 g 6060 707 M .875 g 6060 707 M 5990 588 L 0 g .85 g 783 588 M .85 g 783 588 M 686 753 L 0 g .85 g 4256 4871 M .85 g 4256 4871 M 4045 4757 L .85 g 4045 4757 M -151 -57 V .85 g 3894 4700 M -73 -29 V .85 g 3821 4671 M -224 -51 V .85 g 3597 4620 M -224 -18 V .85 g 3373 4602 M -224 18 V .85 g 3149 4620 M -224 51 V .85 g 2925 4671 M -73 29 V .85 g 2852 4700 M -151 57 V .85 g 2701 4757 M -212 114 V 0 g .85 g 6060 753 M .85 g 6060 753 M 5963 588 L 0 g .825 g 810 588 M .825 g 810 588 M 710 759 L .825 g 710 759 M -24 42 V 0 g .825 g 4328 4871 M .825 g 4328 4871 M -59 -41 V .825 g 4269 4830 M 4045 4711 L .825 g 4045 4711 M -29 -11 V .825 g 4016 4700 M -195 -76 V .825 g 3821 4624 M -224 -51 V .825 g 3597 4573 M -224 -17 V .825 g 3373 4556 M -224 17 V .825 g 3149 4573 M -224 51 V .825 g 2925 4624 M -195 76 V .825 g 2730 4700 M -29 11 V .825 g 2701 4711 M -224 119 V .825 g 2477 4830 M -59 41 V 0 g .825 g 6060 800 M .825 g 6060 800 M -24 -41 V .825 g 6036 759 M 5936 588 L 0 g .8 g 836 588 M .8 g 836 588 M 739 759 L .8 g 739 759 M -53 89 V 0 g .8 g 4397 4871 M .8 g 4397 4871 M -128 -89 V .8 g 4269 4782 M -156 -82 V .8 g 4113 4700 M -68 -37 V .8 g 4045 4663 M -224 -86 V .8 g 3821 4577 M -215 -49 V .8 g 3606 4528 M -9 -2 V .8 g 3597 4526 M -224 -17 V .8 g 3373 4509 M -224 17 V .8 g 3149 4526 M -9 2 V .8 g 3140 4528 M -215 49 V .8 g 2925 4577 M -224 86 V .8 g 2701 4663 M -68 37 V .8 g 2633 4700 M -156 82 V .8 g 2477 4782 M -128 89 V 0 g .8 g 6060 848 M .8 g 6060 848 M -52 -89 V .8 g 6008 759 M 5910 588 L 0 g .775 g 863 588 M .775 g 863 588 M 767 759 L .775 g 767 759 M 686 896 L 0 g .775 g 4467 4871 M .775 g 4467 4871 M 4269 4734 L .775 g 4269 4734 M -66 -34 V .775 g 4203 4700 M -158 -86 V .775 g 4045 4614 M -224 -85 V .775 g 3821 4529 M -5 -1 V .775 g 3816 4528 M -219 -51 V .775 g 3597 4477 M -224 -17 V .775 g 3373 4460 M -224 17 V .775 g 3149 4477 M -219 51 V .775 g 2930 4528 M -5 1 V .775 g 2925 4529 M -224 85 V .775 g 2701 4614 M -159 86 V .775 g 2542 4700 M -65 34 V .775 g 2477 4734 M -198 137 V 0 g .775 g 6060 896 M .775 g 6060 896 M 5979 759 L .775 g 5979 759 M 5883 588 L 0 g .75 g 890 588 M .75 g 890 588 M 795 759 L .75 g 795 759 M 694 931 L .75 g 694 931 M -8 14 V 0 g .75 g 4530 4871 M .75 g 4530 4871 M -37 -32 V .75 g 4493 4839 M 4289 4700 L .75 g 4289 4700 M -20 -14 V .75 g 4269 4686 M 4045 4565 L .75 g 4045 4565 M -98 -37 V .75 g 3947 4528 M -126 -49 V .75 g 3821 4479 M -224 -51 V .75 g 3597 4428 M -224 -17 V .75 g 3373 4411 M -224 17 V .75 g 3149 4428 M -224 51 V .75 g 2925 4479 M -126 49 V .75 g 2799 4528 M -98 37 V .75 g 2701 4565 M -224 121 V .75 g 2477 4686 M -20 14 V .75 g 2457 4700 M -204 139 V .75 g 2253 4839 M -37 32 V 0 g .75 g 6060 945 M .75 g 6060 945 M -8 -14 V .75 g 6052 931 M 5951 759 L .75 g 5951 759 M 5856 588 L 0 g .725 g 918 588 M .725 g 918 588 M -8 13 V .725 g 910 601 M 823 759 L .725 g 823 759 M 724 931 L .725 g 724 931 M -38 65 V 0 g .725 g 4590 4871 M .725 g 4590 4871 M -97 -82 V .725 g 4493 4789 M -131 -89 V .725 g 4362 4700 M -93 -65 V .725 g 4269 4635 M 4068 4528 L .725 g 4068 4528 M -23 -12 V .725 g 4045 4516 M -224 -87 V .725 g 3821 4429 M -224 -50 V .725 g 3597 4379 M -224 -17 V .725 g 3373 4362 M -224 17 V .725 g 3149 4379 M -224 50 V .725 g 2925 4429 M -224 87 V .725 g 2701 4516 M -23 12 V .725 g 2678 4528 M -201 107 V .725 g 2477 4635 M -93 65 V .725 g 2384 4700 M -131 89 V .725 g 2253 4789 M -97 82 V 0 g .725 g 6060 995 M .725 g 6060 995 M -38 -64 V .725 g 6022 931 M 5923 759 L .725 g 5923 759 M 5836 600 L .725 g 5836 600 M -8 -12 V 0 g .7 g 951 588 M .7 g 951 588 M -41 64 V .7 g 910 652 M 851 759 L .7 g 851 759 M 754 931 L .7 g 754 931 M -68 115 V 0 g .7 g 4650 4871 M .7 g 4650 4871 M 4493 4739 L .7 g 4493 4739 M -57 -39 V .7 g 4436 4700 M 4269 4584 L .7 g 4269 4584 M -106 -56 V .7 g 4163 4528 M -118 -64 V .7 g 4045 4464 M -224 -85 V .7 g 3821 4379 M -99 -22 V .7 g 3722 4357 M -125 -29 V .7 g 3597 4328 M -224 -18 V .7 g 3373 4310 M -224 18 V .7 g 3149 4328 M -125 29 V .7 g 3024 4357 M -99 22 V .7 g 2925 4379 M -224 85 V .7 g 2701 4464 M -118 64 V .7 g 2583 4528 M -106 56 V .7 g 2477 4584 M -167 116 V .7 g 2310 4700 M -57 39 V .7 g 2253 4739 M -157 132 V 0 g .7 g 6060 1046 M .7 g 6060 1046 M 5992 931 L .7 g 5992 931 M 5895 759 L .7 g 5895 759 M 5836 652 L .7 g 5836 652 M -41 -64 V 0 g .675 g 985 588 M .675 g 985 588 M 910 704 L .675 g 910 704 M -30 55 V .675 g 880 759 M 784 931 L .675 g 784 931 M -98 166 V 0 g .675 g 4710 4871 M .675 g 4710 4871 M 4507 4700 L .675 g 4507 4700 M -14 -12 V .675 g 4493 4688 M 4269 4534 L .675 g 4269 4534 M -10 -6 V .675 g 4259 4528 M 4045 4413 L .675 g 4045 4413 M -148 -56 V .675 g 3897 4357 M -76 -30 V .675 g 3821 4327 M -224 -52 V .675 g 3597 4275 M -224 -17 V .675 g 3373 4258 M -224 17 V .675 g 3149 4275 M -224 52 V .675 g 2925 4327 M -76 30 V .675 g 2849 4357 M -148 56 V .675 g 2701 4413 M -214 115 V .675 g 2487 4528 M -10 6 V .675 g 2477 4534 M -224 154 V .675 g 2253 4688 M -14 12 V .675 g 2239 4700 M -203 171 V 0 g .675 g 6060 1097 M .675 g 6060 1097 M 5962 931 L .675 g 5962 931 M 5867 759 L .675 g 5867 759 M -31 -55 V .675 g 5836 704 M 5762 588 L 0 g .65 g 1018 588 M .65 g 1018 588 M 910 755 L .65 g 910 755 M -2 4 V .65 g 908 759 M 814 931 L .65 g 814 931 M -99 171 V .65 g 715 1102 M -29 48 V 0 g .65 g 4766 4871 M .65 g 4766 4871 M -49 -48 V .65 g 4717 4823 M 4571 4700 L .65 g 4571 4700 M -78 -66 V .65 g 4493 4634 M 4339 4528 L .65 g 4339 4528 M -70 -48 V .65 g 4269 4480 M 4045 4361 L .65 g 4045 4361 M -11 -4 V .65 g 4034 4357 M -213 -83 V .65 g 3821 4274 M -224 -51 V .65 g 3597 4223 M -224 -17 V .65 g 3373 4206 M -224 17 V .65 g 3149 4223 M -224 51 V .65 g 2925 4274 M -213 83 V .65 g 2712 4357 M -11 4 V .65 g 2701 4361 M -224 119 V .65 g 2477 4480 M -70 48 V .65 g 2407 4528 M -154 106 V .65 g 2253 4634 M -78 66 V .65 g 2175 4700 M -145 123 V .65 g 2030 4823 M -50 48 V 0 g .65 g 6060 1150 M .65 g 6060 1150 M -29 -48 V .65 g 6031 1102 M 5932 931 L .65 g 5932 931 M 5838 759 L .65 g 5838 759 M -2 -4 V .65 g 5836 755 M 5728 588 L 0 g .625 g 1051 588 M .625 g 1051 588 M 943 759 L .625 g 943 759 M -33 51 V .625 g 910 810 M 844 931 L .625 g 844 931 M -97 171 V .625 g 747 1102 M -61 102 V 0 g .625 g 4820 4871 M .625 g 4820 4871 M 4717 4769 L .625 g 4717 4769 M -82 -69 V .625 g 4635 4700 M 4493 4581 L .625 g 4493 4581 M -76 -53 V .625 g 4417 4528 M 4269 4426 L .625 g 4269 4426 M -131 -69 V .625 g 4138 4357 M -93 -51 V .625 g 4045 4306 M -224 -85 V .625 g 3821 4221 M -157 -35 V .625 g 3664 4186 M -67 -16 V .625 g 3597 4170 M -224 -17 V .625 g 3373 4153 M -224 17 V .625 g 3149 4170 M -67 16 V .625 g 3082 4186 M -157 35 V .625 g 2925 4221 M -224 85 V .625 g 2701 4306 M -93 51 V .625 g 2608 4357 M -131 69 V .625 g 2477 4426 M -148 102 V .625 g 2329 4528 M -76 52 V .625 g 2253 4580 M -142 120 V .625 g 2111 4700 M -81 69 V .625 g 2030 4769 M -104 102 V 0 g .625 g 6060 1204 M .625 g 6060 1204 M -61 -102 V .625 g 5999 1102 M 5902 931 L .625 g 5902 931 M 5836 810 L .625 g 5836 810 M -33 -51 V .625 g 5803 759 M 5695 588 L 0 g .6 g 1084 588 M .6 g 1084 588 M 978 759 L .6 g 978 759 M 910 865 L .6 g 910 865 M -36 66 V .6 g 874 931 M -95 171 V .6 g 779 1102 M -93 156 V 0 g .6 g 4875 4871 M .6 g 4875 4871 M 4717 4715 L .6 g 4717 4715 M -19 -15 V .6 g 4698 4700 M 4494 4528 L .6 g 4494 4528 M -1 -1 V .6 g 4493 4527 M 4269 4372 L .6 g 4269 4372 M -29 -15 V .6 g 4240 4357 M 4045 4252 L .6 g 4045 4252 M -175 -66 V .6 g 3870 4186 M -49 -19 V .6 g 3821 4167 M -224 -53 V .6 g 3597 4114 M -224 -17 V .6 g 3373 4097 M -224 17 V .6 g 3149 4114 M -224 53 V .6 g 2925 4167 M -49 19 V .6 g 2876 4186 M -175 65 V .6 g 2701 4251 M -195 106 V .6 g 2506 4357 M -29 15 V .6 g 2477 4372 M -224 155 V .6 g 2253 4527 M -1 1 V .6 g 2252 4528 M -205 172 V .6 g 2047 4700 M -17 15 V .6 g 2030 4715 M -159 156 V 0 g .6 g 6060 1258 M .6 g 6060 1258 M -92 -156 V .6 g 5968 1102 M 5872 931 L .6 g 5872 931 M -36 -66 V .6 g 5836 865 M 5768 759 L .6 g 5768 759 M 5662 588 L 0 g .575 g 1117 588 M .575 g 1117 588 M 1014 759 L .575 g 1014 759 M 910 920 L .575 g 910 920 M -6 11 V .575 g 904 931 M -94 171 V .575 g 810 1102 M -99 171 V .575 g 711 1273 M -25 42 V 0 g .575 g 4930 4871 M .575 g 4930 4871 M 4758 4700 L .575 g 4758 4700 M -41 -41 V .575 g 4717 4659 M 4562 4528 L .575 g 4562 4528 M -69 -58 V .575 g 4493 4470 M 4328 4357 L .575 g 4328 4357 M -59 -41 V .575 g 4269 4316 M 4045 4197 L .575 g 4045 4197 M -29 -11 V .575 g 4016 4186 M -195 -76 V .575 g 3821 4110 M -224 -51 V .575 g 3597 4059 M -224 -17 V .575 g 3373 4042 M -224 17 V .575 g 3149 4059 M -224 51 V .575 g 2925 4110 M -195 76 V .575 g 2730 4186 M -29 11 V .575 g 2701 4197 M -224 119 V .575 g 2477 4316 M -59 41 V .575 g 2418 4357 M -165 113 V .575 g 2253 4470 M -70 58 V .575 g 2183 4528 M -153 130 V .575 g 2030 4658 M -42 42 V .575 g 1988 4700 M -172 171 V 0 g .575 g 6060 1314 M .575 g 6060 1314 M -24 -41 V .575 g 6036 1273 M 5936 1102 L .575 g 5936 1102 M 5842 931 L .575 g 5842 931 M -6 -11 V .575 g 5836 920 M 5733 759 L .575 g 5733 759 M 5629 588 L 0 g .55 g 1155 588 M .55 g 1155 588 M -21 30 V .55 g 1134 618 M -85 141 V .55 g 1049 759 M 940 931 L .55 g 940 931 M -30 47 V .55 g 910 978 M -68 124 V .55 g 842 1102 M -97 171 V .55 g 745 1273 M -59 99 V 0 g .55 g 4982 4871 M .55 g 4982 4871 M -42 -47 V .55 g 4940 4824 M 4817 4700 L .55 g 4817 4700 M -100 -99 V .55 g 4717 4601 M -87 -73 V .55 g 4630 4528 M 4493 4413 L .55 g 4493 4413 M -82 -56 V .55 g 4411 4357 M -142 -99 V .55 g 4269 4258 M -137 -72 V .55 g 4132 4186 M -87 -47 V .55 g 4045 4139 M -224 -86 V .55 g 3821 4053 M -173 -39 V .55 g 3648 4014 M -51 -12 V .55 g 3597 4002 M -224 -17 V .55 g 3373 3985 M -224 17 V .55 g 3149 4002 M -51 12 V .55 g 3098 4014 M -173 39 V .55 g 2925 4053 M -224 86 V .55 g 2701 4139 M -87 47 V .55 g 2614 4186 M -137 72 V .55 g 2477 4258 M -143 99 V .55 g 2334 4357 M -81 56 V .55 g 2253 4413 M -138 115 V .55 g 2115 4528 M -85 73 V .55 g 2030 4601 M -101 99 V .55 g 1929 4700 M -123 124 V .55 g 1806 4824 M -42 47 V 0 g .55 g 6060 1372 M .55 g 6060 1372 M -59 -99 V .55 g 6001 1273 M -97 -171 V .55 g 5904 1102 M 5836 978 L .55 g 5836 978 M -30 -47 V .55 g 5806 931 M 5697 759 L .55 g 5697 759 M 5612 618 L .55 g 5612 618 M -21 -30 V 0 g .525 g 1197 588 M .525 g 1197 588 M -63 89 V .525 g 1134 677 M -50 82 V .525 g 1084 759 M 978 931 L .525 g 978 931 M -68 106 V .525 g 910 1037 M -36 65 V .525 g 874 1102 M -95 171 V .525 g 779 1273 M -93 157 V 0 g .525 g 5034 4871 M .525 g 5034 4871 M -94 -106 V .525 g 4940 4765 M -65 -65 V .525 g 4875 4700 M 4717 4544 L .525 g 4717 4544 M -18 -16 V .525 g 4699 4528 M 4494 4357 L .525 g 4494 4357 M -1 -2 V .525 g 4493 4355 M 4269 4201 L .525 g 4269 4201 M -29 -15 V .525 g 4240 4186 M 4045 4080 L .525 g 4045 4080 M -175 -66 V .525 g 3870 4014 M -49 -19 V .525 g 3821 3995 M -224 -52 V .525 g 3597 3943 M -224 -17 V .525 g 3373 3926 M -224 17 V .525 g 3149 3943 M -224 52 V .525 g 2925 3995 M -49 19 V .525 g 2876 4014 M -175 66 V .525 g 2701 4080 M -195 106 V .525 g 2506 4186 M -29 15 V .525 g 2477 4201 M -224 154 V .525 g 2253 4355 M -2 2 V .525 g 2251 4357 M -204 171 V .525 g 2047 4528 M -17 15 V .525 g 2030 4543 M -159 157 V .525 g 1871 4700 M -65 65 V .525 g 1806 4765 M -94 106 V 0 g .525 g 6060 1429 M .525 g 6060 1429 M -93 -156 V .525 g 5967 1273 M -95 -171 V .525 g 5872 1102 M -36 -66 V .525 g 5836 1036 M 5768 931 L .525 g 5768 931 M 5662 759 L .525 g 5662 759 M -50 -82 V .525 g 5612 677 M -63 -89 V 0 g .5 g 1239 588 M .5 g 1239 588 M 1134 736 L .5 g 1134 736 M -14 23 V .5 g 1120 759 M 1016 931 L .5 g 1016 931 M 910 1095 L .5 g 910 1095 M -4 7 V .5 g 906 1102 M -93 171 V .5 g 813 1273 M 713 1445 L .5 g 713 1445 M -27 45 V 0 g .5 g 5086 4871 M .5 g 5086 4871 M 4940 4707 L .5 g 4940 4707 M -7 -7 V .5 g 4933 4700 M 4763 4528 L .5 g 4763 4528 M -46 -45 V .5 g 4717 4483 M 4567 4357 L .5 g 4567 4357 M -74 -63 V .5 g 4493 4294 M 4334 4186 L .5 g 4334 4186 M -65 -46 V .5 g 4269 4140 M 4045 4021 L .5 g 4045 4021 M -19 -7 V .5 g 4026 4014 M -205 -80 V .5 g 3821 3934 M -224 -51 V .5 g 3597 3883 M -224 -16 V .5 g 3373 3867 M -224 16 V .5 g 3149 3883 M -224 51 V .5 g 2925 3934 M -205 80 V .5 g 2720 4014 M -19 7 V .5 g 2701 4021 M -224 119 V .5 g 2477 4140 M -65 46 V .5 g 2412 4186 M -159 108 V .5 g 2253 4294 M -75 63 V .5 g 2178 4357 M -148 126 V .5 g 2030 4483 M -47 45 V .5 g 1983 4528 M -171 172 V .5 g 1812 4700 M -6 6 V .5 g 1806 4706 M -146 165 V 0 g .5 g 6060 1490 M .5 g 6060 1490 M -27 -45 V .5 g 6033 1445 M 5933 1273 L .5 g 5933 1273 M -93 -171 V .5 g 5840 1102 M -4 -7 V .5 g 5836 1095 M 5730 931 L .5 g 5730 931 M 5626 759 L .5 g 5626 759 M -14 -23 V .5 g 5612 736 M 5507 588 L 0 g .475 g 1281 588 M .475 g 1281 588 M 1161 759 L .475 g 1161 759 M -27 39 V .475 g 1134 798 M -80 133 V .475 g 1054 931 M 946 1102 L .475 g 946 1102 M -36 56 V .475 g 910 1158 M -63 115 V .475 g 847 1273 M -97 172 V .475 g 750 1445 M -64 107 V 0 g .475 g 5138 4871 M .475 g 5138 4871 M 4990 4700 L .475 g 4990 4700 M -50 -56 V .475 g 4940 4644 M 4825 4528 L .475 g 4825 4528 M 4717 4421 L .475 g 4717 4421 M -77 -64 V .475 g 4640 4357 M 4493 4233 L .475 g 4493 4233 M -70 -47 V .475 g 4423 4186 M 4269 4079 L .475 g 4269 4079 M -122 -65 V .475 g 4147 4014 M -102 -55 V .475 g 4045 3959 M -224 -85 V .475 g 3821 3874 M -137 -31 V .475 g 3684 3843 M -87 -20 V .475 g 3597 3823 M -224 -18 V .475 g 3373 3805 M -224 17 V .475 g 3149 3822 M -87 21 V .475 g 3062 3843 M -137 31 V .475 g 2925 3874 M -224 85 V .475 g 2701 3959 M -102 55 V .475 g 2599 4014 M -122 65 V .475 g 2477 4079 M -155 107 V .475 g 2322 4186 M -69 47 V .475 g 2253 4233 M -148 124 V .475 g 2105 4357 M -75 64 V .475 g 2030 4421 M -109 107 V .475 g 1921 4528 M -115 116 V .475 g 1806 4644 M -50 56 V .475 g 1756 4700 M -148 171 V 0 g .475 g 6060 1552 M .475 g 6060 1552 M -64 -107 V .475 g 5996 1445 M -97 -172 V .475 g 5899 1273 M -63 -116 V .475 g 5836 1157 M -36 -55 V .475 g 5800 1102 M 5692 931 L .475 g 5692 931 M 5612 797 L .475 g 5612 797 M -27 -38 V .475 g 5585 759 M 5465 588 L 0 g .45 g 1323 588 M .45 g 1323 588 M 1206 759 L .45 g 1206 759 M -72 102 V .45 g 1134 861 M -42 70 V .45 g 1092 931 M 987 1102 L .45 g 987 1102 M -77 119 V .45 g 910 1221 M -29 52 V .45 g 881 1273 M -94 172 V .45 g 787 1445 M 686 1614 L 0 g .45 g 5190 4871 M .45 g 5190 4871 M -26 -32 V .45 g 5164 4839 M 5046 4700 L .45 g 5046 4700 M 4940 4581 L .45 g 4940 4581 M -52 -53 V .45 g 4888 4528 M 4717 4360 L .45 g 4717 4360 M -4 -3 V .45 g 4713 4357 M 4510 4186 L .45 g 4510 4186 M -17 -15 V .45 g 4493 4171 M 4269 4017 L .45 g 4269 4017 M -5 -3 V .45 g 4264 4014 M 4045 3896 L .45 g 4045 3896 M -141 -53 V .45 g 3904 3843 M -83 -32 V .45 g 3821 3811 M -224 -52 V .45 g 3597 3759 M -224 -18 V .45 g 3373 3741 M -224 18 V .45 g 3149 3759 M -224 52 V .45 g 2925 3811 M -83 32 V .45 g 2842 3843 M -141 53 V .45 g 2701 3896 M -219 118 V .45 g 2482 4014 M -5 3 V .45 g 2477 4017 M -224 154 V .45 g 2253 4171 M -17 15 V .45 g 2236 4186 M -203 171 V .45 g 2033 4357 M -3 3 V .45 g 2030 4360 M -172 168 V .45 g 1858 4528 M -52 53 V .45 g 1806 4581 M -106 119 V .45 g 1700 4700 M -118 138 V .45 g 1582 4838 M -26 33 V 0 g .45 g 6060 1613 M .45 g 6060 1613 M 5959 1445 L .45 g 5959 1445 M -94 -172 V .45 g 5865 1273 M -29 -53 V .45 g 5836 1220 M -77 -118 V .45 g 5759 1102 M 5654 931 L .45 g 5654 931 M -42 -70 V .45 g 5612 861 M 5540 759 L .45 g 5540 759 M 5423 588 L 0 g .425 g 1367 588 M .425 g 1367 588 M -9 11 V .425 g 1358 599 M 1251 759 L .425 g 1251 759 M 1134 925 L .425 g 1134 925 M -4 6 V .425 g 1130 931 M -102 171 V .425 g 1028 1102 M 917 1273 L .425 g 917 1273 M -7 12 V .425 g 910 1285 M -87 160 V .425 g 823 1445 M -99 171 V .425 g 724 1616 M -38 64 V 0 g .425 g 5242 4871 M .425 g 5242 4871 M -78 -98 V .425 g 5164 4773 M -63 -73 V .425 g 5101 4700 M 4950 4528 L .425 g 4950 4528 M -10 -11 V .425 g 4940 4517 M 4781 4357 L .425 g 4781 4357 M -64 -63 V .425 g 4717 4294 M 4589 4186 L .425 g 4589 4186 M -96 -81 V .425 g 4493 4105 M -132 -91 V .425 g 4361 4014 M -92 -63 V .425 g 4269 3951 M 4065 3843 L .425 g 4065 3843 M -20 -11 V .425 g 4045 3832 M -224 -87 V .425 g 3821 3745 M -224 -50 V .425 g 3597 3695 M -224 -17 V .425 g 3373 3678 M -224 17 V .425 g 3149 3695 M -224 50 V .425 g 2925 3745 M -224 87 V .425 g 2701 3832 M -20 11 V .425 g 2681 3843 M -204 108 V .425 g 2477 3951 M -92 63 V .425 g 2385 4014 M -132 91 V .425 g 2253 4105 M -96 81 V .425 g 2157 4186 M -127 107 V .425 g 2030 4293 M -65 64 V .425 g 1965 4357 M -159 160 V .425 g 1806 4517 M -10 11 V .425 g 1796 4528 M -152 172 V .425 g 1644 4700 M -62 73 V .425 g 1582 4773 M -78 98 V 0 g .425 g 6060 1679 M .425 g 6060 1679 M -38 -63 V .425 g 6022 1616 M -99 -171 V .425 g 5923 1445 M -87 -161 V .425 g 5836 1284 M -7 -11 V .425 g 5829 1273 M 5718 1102 L .425 g 5718 1102 M 5616 931 L .425 g 5616 931 M -4 -7 V .425 g 5612 924 M 5495 759 L .425 g 5495 759 M 5388 599 L .425 g 5388 599 M -8 -11 V 0 g .4 g 1420 588 M .4 g 1420 588 M -62 79 V .4 g 1358 667 M -61 92 V .4 g 1297 759 M 1178 931 L .4 g 1178 931 M -44 62 V .4 g 1134 993 M -65 109 V .4 g 1069 1102 M 961 1273 L .4 g 961 1273 M -51 80 V .4 g 910 1353 M -50 92 V .4 g 860 1445 M -96 171 V .4 g 764 1616 M -78 130 V 0 g .4 g 5293 4871 M .4 g 5293 4871 M 5164 4708 L .4 g 5164 4708 M -7 -8 V .4 g 5157 4700 M 5011 4528 L .4 g 5011 4528 M -71 -79 V .4 g 4940 4449 M -91 -92 V .4 g 4849 4357 M 4717 4227 L .4 g 4717 4227 M -50 -41 V .4 g 4667 4186 M 4493 4039 L .4 g 4493 4039 M -36 -25 V .4 g 4457 4014 M 4269 3884 L .4 g 4269 3884 M -79 -41 V .4 g 4190 3843 M -145 -79 V .4 g 4045 3764 M -224 -84 V .4 g 3821 3680 M -36 -8 V .4 g 3785 3672 M -188 -45 V .4 g 3597 3627 M -224 -17 V .4 g 3373 3610 M -224 17 V .4 g 3149 3627 M -188 45 V .4 g 2961 3672 M -36 8 V .4 g 2925 3680 M -224 84 V .4 g 2701 3764 M -146 79 V .4 g 2555 3843 M -78 41 V .4 g 2477 3884 M -188 130 V .4 g 2289 4014 M -36 25 V .4 g 2253 4039 M -175 147 V .4 g 2078 4186 M -48 41 V .4 g 2030 4227 M -133 130 V .4 g 1897 4357 M -91 92 V .4 g 1806 4449 M -71 79 V .4 g 1735 4528 M -147 172 V .4 g 1588 4700 M -6 8 V .4 g 1582 4708 M -129 163 V 0 g .4 g 6060 1746 M .4 g 6060 1746 M -78 -130 V .4 g 5982 1616 M -96 -171 V .4 g 5886 1445 M -50 -93 V .4 g 5836 1352 M -51 -79 V .4 g 5785 1273 M 5678 1102 L .4 g 5678 1102 M 5612 992 L .4 g 5612 992 M -44 -61 V .4 g 5568 931 M 5450 759 L .4 g 5450 759 M -62 -92 V .4 g 5388 667 M -62 -79 V 0 g .375 g 1474 588 M .375 g 1474 588 M 1358 735 L .375 g 1358 735 M -16 24 V .375 g 1342 759 M 1227 931 L .375 g 1227 931 M -93 130 V .375 g 1134 1061 M -25 41 V .375 g 1109 1102 M -103 171 V .375 g 1006 1273 M -96 147 V .375 g 910 1420 M -13 25 V .375 g 897 1445 M -93 171 V .375 g 804 1616 M 702 1787 L .375 g 702 1787 M -16 28 V 0 g .375 g 5345 4871 M .375 g 5345 4871 M 5213 4700 L .375 g 5213 4700 M -49 -62 V .375 g 5164 4638 M -93 -110 V .375 g 5071 4528 M 4940 4381 L .375 g 4940 4381 M -24 -24 V .375 g 4916 4357 M 4744 4186 L .375 g 4744 4186 M -27 -27 V .375 g 4717 4159 M 4546 4014 L .375 g 4546 4014 M -53 -44 V .375 g 4493 3970 M 4308 3843 L .375 g 4308 3843 M -39 -27 V .375 g 4269 3816 M 4045 3696 L .375 g 4045 3696 M -65 -24 V .375 g 3980 3672 M -159 -62 V .375 g 3821 3610 M -224 -52 V .375 g 3597 3558 M -224 -17 V .375 g 3373 3541 M -224 17 V .375 g 3149 3558 M -224 52 V .375 g 2925 3610 M -159 62 V .375 g 2766 3672 M -65 24 V .375 g 2701 3696 M -224 120 V .375 g 2477 3816 M -39 27 V .375 g 2438 3843 M -185 127 V .375 g 2253 3970 M -53 44 V .375 g 2200 4014 M -170 144 V .375 g 2030 4158 M -28 28 V .375 g 2002 4186 M -172 171 V .375 g 1830 4357 M -24 24 V .375 g 1806 4381 M -131 147 V .375 g 1675 4528 M -93 109 V .375 g 1582 4637 M -50 63 V .375 g 1532 4700 M -131 171 V 0 g .375 g 6060 1814 M .375 g 6060 1814 M -16 -27 V .375 g 6044 1787 M 5943 1616 L .375 g 5943 1616 M -94 -171 V .375 g 5849 1445 M -13 -25 V .375 g 5836 1420 M -96 -147 V .375 g 5740 1273 M 5637 1102 L .375 g 5637 1102 M -25 -41 V .375 g 5612 1061 M 5519 931 L .375 g 5519 931 M 5404 759 L .375 g 5404 759 M -16 -24 V .375 g 5388 735 M 5272 588 L 0 g .35 g 1528 588 M .35 g 1528 588 M 1395 759 L .35 g 1395 759 M -37 48 V .35 g 1358 807 M -82 124 V .35 g 1276 931 M -121 171 V .35 g 1155 1102 M -21 30 V .35 g 1134 1132 M -84 141 V .35 g 1050 1273 M 941 1445 L .35 g 941 1445 M -31 47 V .35 g 910 1492 M -67 124 V .35 g 843 1616 M -97 171 V .35 g 746 1787 M -60 100 V 0 g .35 g 5397 4871 M .35 g 5397 4871 M -9 -12 V .35 g 5388 4859 M 5269 4700 L .35 g 5269 4700 M 5164 4567 L .35 g 5164 4567 M -33 -39 V .35 g 5131 4528 M 4983 4357 L .35 g 4983 4357 M -43 -47 V .35 g 4940 4310 M 4817 4186 L .35 g 4817 4186 M -100 -99 V .35 g 4717 4087 M -86 -73 V .35 g 4631 4014 M 4493 3898 L .35 g 4493 3898 M -81 -55 V .35 g 4412 3843 M -143 -99 V .35 g 4269 3744 M -137 -72 V .35 g 4132 3672 M -87 -48 V .35 g 4045 3624 M -224 -85 V .35 g 3821 3539 M -173 -39 V .35 g 3648 3500 M -51 -12 V .35 g 3597 3488 M -224 -17 V .35 g 3373 3471 M -224 17 V .35 g 3149 3488 M -51 12 V .35 g 3098 3500 M -173 39 V .35 g 2925 3539 M -224 85 V .35 g 2701 3624 M -87 48 V .35 g 2614 3672 M -137 72 V .35 g 2477 3744 M -143 99 V .35 g 2334 3843 M -81 55 V .35 g 2253 3898 M -138 116 V .35 g 2115 4014 M -85 72 V .35 g 2030 4086 M -102 100 V .35 g 1928 4186 M -122 123 V .35 g 1806 4309 M -43 48 V .35 g 1763 4357 M -149 171 V .35 g 1614 4528 M -32 39 V .35 g 1582 4567 M -106 133 V .35 g 1476 4700 M -118 159 V .35 g 1358 4859 M -9 12 V 0 g .35 g 6060 1886 M .35 g 6060 1886 M -60 -99 V .35 g 6000 1787 M -97 -171 V .35 g 5903 1616 M -67 -124 V .35 g 5836 1492 M -31 -47 V .35 g 5805 1445 M 5696 1273 L .35 g 5696 1273 M -84 -141 V .35 g 5612 1132 M -21 -30 V .35 g 5591 1102 M 5470 931 L .35 g 5470 931 M 5388 807 L .35 g 5388 807 M -37 -48 V .35 g 5351 759 M 5218 588 L 0 g .325 g 1582 588 M .325 g 1582 588 M 1454 759 L .325 g 1454 759 M -96 122 V .325 g 1358 881 M -33 50 V .325 g 1325 931 M -116 171 V .325 g 1209 1102 M -75 105 V .325 g 1134 1207 M -40 66 V .325 g 1094 1273 M 989 1445 L .325 g 989 1445 M -79 121 V .325 g 910 1566 M -27 50 V .325 g 883 1616 M -94 171 V .325 g 789 1787 M 686 1959 L .325 g 0 g .325 g 5451 4871 M .325 g 5451 4871 M -63 -87 V .325 g 5388 4784 M -62 -84 V .325 g 5326 4700 M 5192 4528 L .325 g 5192 4528 M -28 -35 V .325 g 5164 4493 M 5048 4357 L .325 g 5048 4357 M 4940 4236 L .325 g 4940 4236 M -49 -50 V .325 g 4891 4186 M 4717 4015 L .325 g 4717 4015 M -1 -1 V .325 g 4716 4014 M 4514 3843 L .325 g 4514 3843 M -21 -17 V .325 g 4493 3826 M 4269 3672 L .325 g 4269 3672 M -1 0 V .325 g 4268 3672 M 4045 3551 L .325 g 4045 3551 M -134 -51 V .325 g 3911 3500 M -90 -35 V .325 g 3821 3465 M -224 -52 V .325 g 3597 3413 M -224 -17 V .325 g 3373 3396 M -224 17 V .325 g 3149 3413 M -224 52 V .325 g 2925 3465 M -90 35 V .325 g 2835 3500 M -134 50 V .325 g 2701 3550 M -223 122 V .325 g 2478 3672 M -1 0 V .325 g 2477 3672 M -224 153 V .325 g 2253 3825 M -21 18 V .325 g 2232 3843 M -202 171 V .325 g 2030 4014 M 0 1 V .325 g 2030 4015 M -175 171 V .325 g 1855 4186 M -49 50 V .325 g 1806 4236 M -109 121 V .325 g 1697 4357 M -115 136 V .325 g 1582 4493 M -28 35 V .325 g 1554 4528 M -134 172 V .325 g 1420 4700 M -62 83 V .325 g 1358 4783 M -63 88 V 0 g .325 g 6060 1958 M .325 g 6060 1958 M 5957 1787 L .325 g 5957 1787 M -94 -171 V .325 g 5863 1616 M -27 -50 V .325 g 5836 1566 M -79 -121 V .325 g 5757 1445 M 5652 1273 L .325 g 5652 1273 M -40 -67 V .325 g 5612 1206 M -74 -104 V .325 g 5538 1102 M 5421 931 L .325 g 5421 931 M -33 -51 V .325 g 5388 880 M 5292 759 L .325 g 5292 759 M 5165 588 L 0 g .3 g 1652 588 M .3 g 1652 588 M -70 79 V .3 g 1582 667 M -69 92 V .3 g 1513 759 M 1379 931 L .3 g 1379 931 M -21 26 V .3 g 1358 957 M -96 145 V .3 g 1262 1102 M -122 171 V .3 g 1140 1273 M -6 9 V .3 g 1134 1282 M -96 163 V .3 g 1038 1445 M 927 1616 L .3 g 927 1616 M -17 26 V .3 g 910 1642 M -78 145 V .3 g 832 1787 M -98 172 V .3 g 734 1959 M -48 78 V 0 g .3 g 5505 4871 M .3 g 5505 4871 M 5388 4709 L .3 g 5388 4709 M -6 -9 V .3 g 5382 4700 M 5254 4528 L .3 g 5254 4528 M -90 -112 V .3 g 5164 4416 M -50 -59 V .3 g 5114 4357 M 4964 4186 L .3 g 4964 4186 M -24 -26 V .3 g 4940 4160 M 4796 4014 L .3 g 4796 4014 M -79 -78 V .3 g 4717 3936 M -111 -93 V .3 g 4606 3843 M -113 -95 V .3 g 4493 3748 M -111 -76 V .3 g 4382 3672 M -113 -79 V .3 g 4269 3593 M -176 -93 V .3 g 4093 3500 M -48 -26 V .3 g 4045 3474 M -224 -86 V .3 g 3821 3388 M -224 -50 V .3 g 3597 3338 M -121 -9 V .3 g 3476 3329 M -103 -8 V .3 g 3373 3321 M -103 8 V .3 g 3270 3329 M -121 9 V .3 g 3149 3338 M -224 50 V .3 g 2925 3388 M -224 86 V .3 g 2701 3474 M -48 26 V .3 g 2653 3500 M -176 93 V .3 g 2477 3593 M -113 79 V .3 g 2364 3672 M -111 76 V .3 g 2253 3748 M -114 95 V .3 g 2139 3843 M -109 93 V .3 g 2030 3936 M -81 78 V .3 g 1949 4014 M -143 146 V .3 g 1806 4160 M -24 26 V .3 g 1782 4186 M -150 171 V .3 g 1632 4357 M -50 59 V .3 g 1582 4416 M -90 112 V .3 g 1492 4528 M -128 172 V .3 g 1364 4700 M -6 8 V .3 g 1358 4708 M -117 163 V 0 g .3 g 6060 2037 M .3 g 6060 2037 M -47 -78 V .3 g 6013 1959 M -99 -172 V .3 g 5914 1787 M -78 -145 V .3 g 5836 1642 M -17 -26 V .3 g 5819 1616 M 5709 1445 L .3 g 5709 1445 M -97 -164 V .3 g 5612 1281 M -6 -8 V .3 g 5606 1273 M 5484 1102 L .3 g 5484 1102 M 5388 957 L .3 g 5388 957 M -20 -26 V .3 g 5368 931 M 5234 759 L .3 g 5234 759 M -70 -93 V .3 g 5164 666 M -69 -78 V 0 g .275 g 1722 588 M .275 g 1722 588 M 1582 745 L .275 g 1582 745 M -11 14 V .275 g 1571 759 M 1443 931 L .275 g 1443 931 M -85 107 V .275 g 1358 1038 M -43 64 V .275 g 1315 1102 M -116 171 V .275 g 1199 1273 M -65 90 V .275 g 1134 1363 M -48 82 V .275 g 1086 1445 M 980 1616 L .275 g 980 1616 M -70 107 V .275 g 910 1723 M -34 64 V .275 g 876 1787 M -95 172 V .275 g 781 1959 M -95 157 V 0 g .275 g 5558 4871 M .275 g 5558 4871 M 5440 4700 L .275 g 5440 4700 M -52 -73 V .275 g 5388 4627 M -73 -99 V .275 g 5315 4528 M 5180 4357 L .275 g 5180 4357 M -16 -20 V .275 g 5164 4337 M 5036 4186 L .275 g 5036 4186 M -96 -107 V .275 g 4940 4079 M -64 -65 V .275 g 4876 4014 M 4717 3858 L .275 g 4717 3858 M -18 -15 V .275 g 4699 3843 M 4495 3672 L .275 g 4495 3672 M -2 -2 V .275 g 4493 3670 M 4269 3515 L .275 g 4269 3515 M -28 -15 V .275 g 4241 3500 M 4045 3394 L .275 g 4045 3394 M -173 -65 V .275 g 3872 3329 M -51 -20 V .275 g 3821 3309 M -224 -53 V .275 g 3597 3256 M -224 -17 V .275 g 3373 3239 M -224 17 V .275 g 3149 3256 M -224 53 V .275 g 2925 3309 M -51 20 V .275 g 2874 3329 M -173 65 V .275 g 2701 3394 M -197 106 V .275 g 2504 3500 M -27 15 V .275 g 2477 3515 M -224 154 V .275 g 2253 3669 M -2 3 V .275 g 2251 3672 M -205 171 V .275 g 2046 3843 M -16 14 V .275 g 2030 3857 M -161 157 V .275 g 1869 4014 M -63 65 V .275 g 1806 4079 M -96 107 V .275 g 1710 4186 M -128 151 V .275 g 1582 4337 M -16 20 V .275 g 1566 4357 M -135 171 V .275 g 1431 4528 M -73 99 V .275 g 1358 4627 M -53 73 V .275 g 1305 4700 M -118 171 V 0 g .275 g 6060 2115 M .275 g 6060 2115 M -95 -156 V .275 g 5965 1959 M -94 -172 V .275 g 5871 1787 M -35 -64 V .275 g 5836 1723 M -70 -107 V .275 g 5766 1616 M 5660 1445 L .275 g 5660 1445 M -48 -82 V .275 g 5612 1363 M -64 -90 V .275 g 5548 1273 M 5431 1102 L .275 g 5431 1102 M -43 -65 V .275 g 5388 1037 M 5303 931 L .275 g 5303 931 M 5175 759 L .275 g 5175 759 M -11 -14 V .275 g 5164 745 M 5024 588 L 0 g .25 g 1792 588 M .25 g 1792 588 M 1645 759 L .25 g 1645 759 M -63 71 V .25 g 1582 830 M -75 101 V .25 g 1507 931 M -135 171 V .25 g 1372 1102 M -14 18 V .25 g 1358 1120 M -101 153 V .25 g 1257 1273 M -123 172 V .25 g .25 g 1134 1445 M -101 171 V .25 g 1033 1616 M 922 1787 L .25 g 922 1787 M -12 19 V .25 g 910 1806 M -81 153 V .25 g 829 1959 M 729 2130 L .25 g 729 2130 M -43 71 V 0 g .25 g 5612 4871 M .25 g 5612 4871 M 5500 4700 L .25 g 5500 4700 M 5388 4545 L .25 g 5388 4545 M -12 -17 V .25 g 5376 4528 M 5248 4357 L .25 g 5248 4357 M -84 -105 V .25 g 5164 4252 M -56 -66 V .25 g 5108 4186 M 4956 4014 L .25 g 4956 4014 M -16 -18 V .25 g 4940 3996 M 4789 3843 L .25 g 4789 3843 M -72 -71 V .25 g 4717 3772 M 4597 3672 L .25 g 4597 3672 M -104 -88 V .25 g 4493 3584 M -122 -84 V .25 g 4371 3500 M -102 -70 V .25 g 4269 3430 M 4078 3329 L .25 g 4078 3329 M -33 -18 V .25 g 4045 3311 M -224 -87 V .25 g 3821 3224 M -224 -50 V .25 g 3597 3174 M -223 -16 V .25 g 3374 3158 M -1 0 V .25 g 3373 3158 M -1 0 V .25 g 3372 3158 M -223 16 V .25 g 3149 3174 M -224 50 V .25 g 2925 3224 M -224 87 V .25 g 2701 3311 M -33 18 V .25 g 2668 3329 M -191 101 V .25 g 2477 3430 M -102 70 V .25 g 2375 3500 M -122 84 V .25 g 2253 3584 M -105 88 V .25 g 2148 3672 M -118 100 V .25 g 2030 3772 M -73 71 V .25 g 1957 3843 M -151 153 V .25 g 1806 3996 M -17 18 V .25 g 1789 4014 M -151 172 V .25 g 1638 4186 M -56 66 V .25 g 1582 4252 M -84 105 V .25 g 1498 4357 M -128 171 V .25 g 1370 4528 M -12 16 V .25 g 1358 4544 M -112 156 V .25 g 1246 4700 M -112 171 V .25 g 0 g .25 g 6060 2200 M .25 g 6060 2200 M -43 -70 V .25 g 6017 2130 M -99 -171 V .25 g 5918 1959 M -82 -154 V .25 g 5836 1805 M -12 -18 V .25 g 5824 1787 M 5713 1616 L .25 g 5713 1616 M 5612 1445 L .25 g 5612 1445 M 5489 1273 L .25 g 5489 1273 M 5388 1120 L .25 g 5388 1120 M -14 -18 V .25 g 5374 1102 M 5239 931 L .25 g 5239 931 M 5164 830 L .25 g 5164 830 M -63 -71 V .25 g 5101 759 M 4954 588 L 0 g .225 g 1880 588 M .225 g 1880 588 M -74 73 V .225 g 1806 661 M -84 98 V .225 g 1722 759 M 1582 917 L .225 g 1582 917 M -11 14 V .225 g 1571 931 M -127 171 V .225 g 1444 1102 M -86 107 V .225 g 1358 1209 M -42 64 V .225 g 1316 1273 M -117 172 V .225 g 1199 1445 M -65 90 V .225 g 1134 1535 M -48 81 V .225 g 1086 1616 M 981 1787 L .225 g 981 1787 M -71 108 V .225 g 910 1895 M -34 64 V .225 g 876 1959 M -94 171 V .225 g 782 2130 M -96 157 V 0 g .225 g 5672 4871 M .225 g 5672 4871 M -60 -90 V .225 g 5612 4781 M -53 -81 V .225 g 5559 4700 M 5441 4528 L .225 g 5441 4528 M -53 -73 V .225 g 5388 4455 M -73 -98 V .225 g 5315 4357 M 5181 4186 L .225 g 5181 4186 M -17 -21 V .225 g 5164 4165 M 5036 4014 L .225 g 5036 4014 M -96 -107 V .225 g 4940 3907 M -63 -64 V .225 g 4877 3843 M 4717 3686 L .225 g 4717 3686 M -17 -14 V .225 g 4700 3672 M 4495 3500 L .225 g 4495 3500 M -2 -2 V .225 g 4493 3498 M 4269 3343 L .225 g 4269 3343 M -27 -14 V .225 g 4242 3329 M 4045 3222 L .225 g 4045 3222 M -172 -64 V .225 g 3873 3158 M -52 -21 V .225 g 3821 3137 M -224 -52 V .225 g 3597 3085 M -224 -17 V .225 g 3373 3068 M -224 17 V .225 g 3149 3085 M -224 52 V .225 g 2925 3137 M -52 21 V .225 g 2873 3158 M -172 64 V .225 g 2701 3222 M -197 107 V .225 g 2504 3329 M -27 14 V .225 g 2477 3343 M -224 155 V .225 g 2253 3498 M -3 2 V .225 g 2250 3500 M -204 172 V .225 g 2046 3672 M -16 14 V .225 g 2030 3686 M -161 157 V .225 g 1869 3843 M -63 64 V .225 g 1806 3907 M -97 107 V .225 g 1709 4014 M -127 151 V .225 g 1582 4165 M -17 21 V .225 g 1565 4186 M -135 171 V .225 g 1430 4357 M -72 98 V .225 g 1358 4455 M -53 73 V .225 g 1305 4528 M -118 172 V .225 g 1187 4700 M -53 80 V .225 g 1134 4780 M -60 91 V 0 g .225 g 6060 2287 M .225 g 6060 2287 M -96 -157 V .225 g 5964 2130 M -94 -171 V .225 g 5870 1959 M -34 -65 V .225 g 5836 1894 M -71 -107 V .225 g 5765 1787 M 5660 1616 L .225 g 5660 1616 M -48 -81 V .225 g 5612 1535 M -65 -90 V .225 g 5547 1445 M 5430 1273 L .225 g 5430 1273 M -42 -64 V .225 g 5388 1209 M -85 -107 V .225 g 5303 1102 M 5175 931 L .225 g 5175 931 M -11 -15 V .225 g 5164 916 M 5024 759 L .225 g 5024 759 M -84 -98 V .225 g 4940 661 M -74 -73 V 0 g .2 g 1974 588 M .2 g 1974 588 M 1806 752 L .2 g 1806 752 M -6 7 V .2 g 1800 759 M 1654 931 L .2 g 1654 931 M -72 80 V .2 g 1582 1011 M -67 91 V .2 g 1515 1102 M -135 171 V .2 g 1380 1273 M -22 29 V .2 g 1358 1302 M -94 143 V .2 g 1264 1445 M -123 171 V .2 g 1141 1616 M -7 10 V .2 g 1134 1626 M -94 161 V .2 g 1040 1787 M 929 1959 L .2 g 929 1959 M -19 28 V .2 g 910 1987 M -76 143 V .2 g 834 2130 M -98 171 V .2 g 736 2301 M -50 81 V 0 g .2 g 5731 4871 M .2 g 5731 4871 M 5619 4700 L .2 g 5619 4700 M -7 -10 V .2 g 5612 4690 M 5507 4528 L .2 g 5507 4528 M 5388 4364 L .2 g 5388 4364 M -5 -7 V .2 g 5383 4357 M 5256 4186 L .2 g 5256 4186 M -92 -115 V .2 g 5164 4071 M -48 -57 V .2 g 5116 4014 M 4966 3843 L .2 g 4966 3843 M -26 -28 V .2 g 4940 3815 M 4799 3672 L .2 g 4799 3672 M -82 -81 V .2 g 4717 3591 M -108 -91 V .2 g 4609 3500 M -116 -97 V .2 g 4493 3403 M -108 -74 V .2 g 4385 3329 M -116 -80 V .2 g 4269 3249 M -173 -91 V .2 g 4096 3158 M -51 -28 V .2 g 4045 3130 M -224 -87 V .2 g 3821 3043 M -224 -49 V .2 g 3597 2994 M -98 -8 V .2 g 3499 2986 M -126 -10 V .2 g 3373 2976 M -126 10 V .2 g 3247 2986 M -98 8 V .2 g 3149 2994 M -224 49 V .2 g 2925 3043 M -224 87 V .2 g 2701 3130 M -51 28 V .2 g 2650 3158 M -173 90 V .2 g 2477 3248 M -116 81 V .2 g 2361 3329 M -108 74 V .2 g 2253 3403 M -116 97 V .2 g 2137 3500 M -107 91 V .2 g 2030 3591 M -83 81 V .2 g 1947 3672 M -141 143 V .2 g 1806 3815 M -26 28 V .2 g 1780 3843 M -150 171 V .2 g 1630 4014 M -48 57 V .2 g 1582 4071 M -92 115 V .2 g 1490 4186 M -127 171 V .2 g 1363 4357 M -5 7 V .2 g 1358 4364 M -119 164 V .2 g 1239 4528 M -105 161 V .2 g 1134 4689 M -7 11 V .2 g 1127 4700 M -113 171 V 0 g .2 g 6060 2382 M .2 g 6060 2382 M -49 -81 V .2 g 6011 2301 M -99 -171 V .2 g 5912 2130 M -76 -143 V .2 g 5836 1987 M -19 -28 V .2 g 5817 1959 M 5706 1787 L .2 g 5706 1787 M -94 -161 V .2 g 5612 1626 M -7 -10 V .2 g 5605 1616 M 5482 1445 L .2 g 5482 1445 M -94 -144 V .2 g 5388 1301 M -22 -28 V .2 g 5366 1273 M 5232 1102 L .2 g 5232 1102 M -68 -91 V .2 g 5164 1011 M -72 -80 V .2 g 5092 931 M 4947 759 L .2 g 4947 759 M -7 -7 V .2 g 4940 752 M 4773 588 L 0 g .175 g 2080 588 M .175 g 2080 588 M -50 42 V .175 g 2030 630 M 1902 759 L .175 g 1902 759 M -96 95 V .175 g 1806 854 M -66 77 V .175 g 1740 931 M -153 171 V .175 g 1587 1102 M -5 6 V .175 g 1582 1108 M -122 165 V .175 g 1460 1273 M -102 128 V .175 g 1358 1401 M -29 44 V .175 g 1329 1445 M -114 171 V .175 g 1215 1616 M -81 111 V .175 g 1134 1727 M -35 60 V .175 g 1099 1787 M 995 1959 L .175 g 995 1959 M -85 128 V .175 g 910 2087 M -23 43 V .175 g 887 2130 M -92 171 V .175 g 795 2301 M 690 2473 L .175 g 690 2473 M -4 6 V 0 g .175 g 5791 4871 M .175 g 5791 4871 M 5686 4700 L .175 g 5686 4700 M -74 -111 V .175 g 5612 4589 M -39 -61 V .175 g 5573 4528 M 5457 4357 L .175 g 5457 4357 M -69 -94 V .175 g 5388 4263 M -57 -77 V .175 g 5331 4186 M 5198 4014 L .175 g 5198 4014 M -34 -41 V .175 g 5164 3973 M 5055 3843 L .175 g 5055 3843 M 4940 3715 L .175 g 4940 3715 M -43 -43 V .175 g 4897 3672 M 4723 3500 L .175 g 4723 3500 M -6 -6 V .175 g 4717 3494 M 4521 3329 L .175 g 4521 3329 M -28 -24 V .175 g 4493 3305 M 4277 3158 L .175 g 4277 3158 M -8 -6 V .175 g 4269 3152 M 4045 3030 L .175 g 4045 3030 M -118 -44 V .175 g 3927 2986 M -106 -41 V .175 g 3821 2945 M -224 -53 V .175 g 3597 2892 M -224 -16 V .175 g 3373 2876 M -224 16 V .175 g 3149 2892 M -224 52 V .175 g 2925 2944 M -106 42 V .175 g 2819 2986 M -118 44 V .175 g 2701 3030 M -224 122 V .175 g 2477 3152 M -9 6 V .175 g 2468 3158 M -215 147 V .175 g 2253 3305 M -29 24 V .175 g 2224 3329 M -194 165 V .175 g 2030 3494 M -7 6 V .175 g 2023 3500 M -174 172 V .175 g 1849 3672 M -43 43 V .175 g 1806 3715 M -115 128 V .175 g 1691 3843 M -109 129 V .175 g 1582 3972 M -34 42 V .175 g 1548 4014 M -133 172 V .175 g 1415 4186 M -57 77 V .175 g 1358 4263 M -69 94 V .175 g 1289 4357 M -116 171 V .175 g 1173 4528 M -39 60 V .175 g 1134 4588 M -74 112 V .175 g 1060 4700 M 955 4871 L 0 g .175 g 6060 2479 M .175 g 6060 2479 M -4 -6 V .175 g 6056 2473 M 5952 2301 L .175 g 5952 2301 M -93 -171 V .175 g 5859 2130 M -23 -44 V .175 g 5836 2086 M -85 -127 V .175 g 5751 1959 M 5648 1787 L .175 g 5648 1787 M -36 -60 V .175 g 5612 1727 M -80 -111 V .175 g 5532 1616 M 5417 1445 L .175 g 5417 1445 M -29 -44 V .175 g 5388 1401 M 5286 1273 L .175 g 5286 1273 M 5164 1108 L .175 g 5164 1108 M -5 -6 V .175 g 5159 1102 M 5006 931 L .175 g 5006 931 M -66 -78 V .175 g 4940 853 M -96 -94 V .175 g 4844 759 M 4717 630 L .175 g 4717 630 M -51 -42 V 0 g .15 g 2206 588 M .15 g 2206 588 M 2030 736 L .15 g 2030 736 M -24 23 V .15 g 2006 759 M 1835 931 L .15 g 1835 931 M -29 28 V .15 g 1806 959 M -121 143 V .15 g 1685 1102 M -103 115 V .15 g 1582 1217 M -42 56 V .15 g 1540 1273 M -131 172 V .15 g 1409 1445 M -51 63 V .15 g 1358 1508 M -70 108 V .15 g 1288 1616 M -120 171 V .15 g 1168 1787 M -34 46 V .15 g 1134 1833 M -73 126 V .15 g 1061 1959 M 953 2130 L .15 g 953 2130 M -43 64 V .15 g 910 2194 M -56 107 V .15 g 854 2301 M -97 172 V .15 g 757 2473 M -71 115 V 0 g .15 g 5853 4871 M .15 g 5853 4871 M -17 -28 V .15 g 5836 4843 M -83 -143 V .15 g 5753 4700 M 5643 4528 L .15 g 5643 4528 M -31 -45 V .15 g 5612 4483 M -81 -126 V .15 g 5531 4357 M 5409 4186 L .15 g 5409 4186 M -21 -28 V .15 g 5388 4158 M 5283 4014 L .15 g 5283 4014 M 5164 3867 L .15 g 5164 3867 M -20 -24 V .15 g 5144 3843 M 4997 3672 L .15 g 4997 3672 M -57 -63 V .15 g 4940 3609 M 4834 3500 L .15 g 4834 3500 M 4717 3386 L .15 g 4717 3386 M -68 -57 V .15 g 4649 3329 M 4493 3198 L .15 g 4493 3198 M -59 -40 V .15 g 4434 3158 M 4269 3043 L .15 g 4269 3043 M -108 -57 V .15 g 4161 2986 M -116 -63 V .15 g 4045 2923 M -224 -84 V .15 g 3821 2839 M -108 -24 V .15 g 3713 2815 M -116 -28 V .15 g 3597 2787 M -224 -18 V .15 g 3373 2769 M -224 18 V .15 g 3149 2787 M -117 28 V .15 g 3032 2815 M -107 24 V .15 g 2925 2839 M -224 84 V .15 g 2701 2923 M -116 63 V .15 g 2585 2986 M -108 57 V .15 g 2477 3043 M -165 115 V .15 g 2312 3158 M -59 40 V .15 g 2253 3198 M -157 131 V .15 g 2096 3329 M -66 57 V .15 g 2030 3386 M -118 114 V .15 g 1912 3500 M -106 108 V .15 g 1806 3608 M -58 64 V .15 g 1748 3672 M -147 171 V .15 g 1601 3843 M -19 23 V .15 g 1582 3866 M -119 148 V .15 g 1463 4014 M -105 143 V .15 g 1358 4157 M -21 29 V .15 g 1337 4186 M -122 171 V .15 g 1215 4357 M -81 125 V .15 g 1134 4482 M -31 46 V .15 g 1103 4528 M 993 4700 L .15 g 993 4700 M -83 143 V .15 g 910 4843 M -18 28 V 0 g .15 g 6060 2587 M .15 g 6060 2587 M -71 -114 V .15 g 5989 2473 M -96 -172 V .15 g 5893 2301 M -57 -108 V .15 g 5836 2193 M -42 -63 V .15 g 5794 2130 M 5685 1959 L .15 g 5685 1959 M -73 -126 V .15 g 5612 1833 M -33 -46 V .15 g 5579 1787 M 5458 1616 L .15 g 5458 1616 M -70 -108 V .15 g 5388 1508 M -51 -63 V .15 g 5337 1445 M 5206 1273 L .15 g 5206 1273 M -42 -57 V .15 g 5164 1216 M 5061 1102 L .15 g 5061 1102 M 4940 959 L .15 g 4940 959 M -28 -28 V .15 g 4912 931 M 4740 759 L .15 g 4740 759 M -23 -23 V .15 g 4717 736 M 4540 588 L 0 g .125 g 2364 588 M .125 g 2364 588 M -111 77 V .125 g 2253 665 M -111 94 V .125 g 2142 759 M -112 94 V .125 g 2030 853 M -77 78 V .125 g 1953 931 M -147 144 V .125 g 1806 1075 M -23 27 V .125 g 1783 1102 M -148 171 V .125 g 1635 1273 M -53 60 V .125 g 1582 1333 M -82 112 V .125 g 1500 1445 M -138 171 V .125 g 1362 1616 M -4 6 V .125 g 1358 1622 M -107 165 V .125 g 1251 1787 M -117 161 V .125 g 1134 1948 M -7 11 V .125 g 1127 1959 M -99 171 V .125 g 1028 2130 M 914 2301 L .125 g 914 2301 M -4 6 V .125 g 910 2307 M -86 166 V .125 g 824 2473 M 723 2644 L .125 g 723 2644 M -37 60 V 0 g .125 g 5926 4871 M .125 g 5926 4871 M -90 -144 V .125 g 5836 4727 M -16 -27 V .125 g 5820 4700 M 5720 4528 L .125 g 5720 4528 M 5612 4368 L .125 g 5612 4368 M -7 -11 V .125 g 5605 4357 M 5493 4186 L .125 g 5493 4186 M 5388 4042 L .125 g 5388 4042 M -20 -28 V .125 g 5368 4014 M 5240 3843 L .125 g 5240 3843 M -76 -94 V .125 g 5164 3749 M -65 -77 V .125 g 5099 3672 M 4945 3500 L .125 g 4945 3500 M -5 -5 V .125 g 4940 3495 M 4777 3329 L .125 g 4777 3329 M -60 -59 V .125 g 4717 3270 M 4584 3158 L .125 g 4584 3158 M -91 -77 V .125 g 4493 3081 M -139 -95 V .125 g 4354 2986 M -85 -59 V .125 g 4269 2927 M 4055 2815 L .125 g 4055 2815 M -10 -5 V .125 g 4045 2810 M -224 -89 V .125 g 3821 2721 M -224 -50 V .125 g 3597 2671 M -224 -16 V .125 g 3373 2655 M -224 16 V .125 g 3149 2671 M -224 50 V .125 g 2925 2721 M -224 89 V .125 g 2701 2810 M -10 5 V .125 g 2691 2815 M -214 112 V .125 g 2477 2927 M -85 59 V .125 g 2392 2986 M -139 95 V .125 g 2253 3081 M -91 77 V .125 g 2162 3158 M -132 112 V .125 g 2030 3270 M -62 59 V .125 g 1968 3329 M -162 166 V .125 g 1806 3495 M -6 5 V .125 g 1800 3500 M -153 172 V .125 g 1647 3672 M -65 77 V .125 g 1582 3749 M -76 94 V .125 g 1506 3843 M -128 171 V .125 g 1378 4014 M -20 28 V .125 g 1358 4042 M -106 144 V .125 g 1252 4186 M -111 171 V .125 g 1141 4357 M -7 11 V .125 g 1134 4368 M -108 160 V .125 g 1026 4528 M 926 4700 L .125 g 926 4700 M -16 27 V .125 g 910 4727 M -90 144 V 0 g .125 g 6060 2703 M .125 g 6060 2703 M -37 -59 V .125 g 6023 2644 M 5922 2473 L .125 g 5922 2473 M -86 -166 V .125 g 5836 2307 M -4 -6 V .125 g 5832 2301 M 5718 2130 L .125 g 5718 2130 M -99 -171 V .125 g 5619 1959 M -7 -12 V .125 g 5612 1947 M 5495 1787 L .125 g 5495 1787 M 5388 1621 L .125 g 5388 1621 M -4 -5 V .125 g 5384 1616 M 5246 1445 L .125 g 5246 1445 M -82 -113 V .125 g 5164 1332 M -53 -59 V .125 g 5111 1273 M 4964 1102 L .125 g 4964 1102 M -24 -28 V .125 g 4940 1074 M 4793 931 L .125 g 4793 931 M -76 -78 V .125 g 4717 853 M 4604 759 L .125 g 4604 759 M 4493 665 L .125 g 4493 665 M 4382 588 L 0 g .1 g 2569 588 M .1 g 2569 588 M -92 50 V .1 g 2477 638 M 2300 759 L .1 g 2300 759 M -47 33 V .1 g 2253 792 M 2090 931 L .1 g 2090 931 M -60 50 V .1 g 2030 981 M -119 121 V .1 g 1911 1102 M -105 102 V .1 g 1806 1204 M -58 69 V .1 g 1748 1273 M -153 172 V .1 g 1595 1445 M -13 14 V .1 g 1582 1459 M -114 157 V .1 g 1468 1616 M -110 135 V .1 g 1358 1751 M -23 36 V .1 g 1335 1787 M -113 172 V .1 g 1222 1959 M -88 119 V .1 g 1134 2078 M -30 52 V .1 g 1104 2130 M -102 171 V .1 g 1002 2301 M -92 136 V .1 g 910 2437 M -19 36 V .1 g 891 2473 M -90 171 V .1 g 801 2644 M 695 2815 L .1 g 695 2815 M -9 15 V 0 g .1 g 5998 4871 M .1 g 5998 4871 M -97 -171 V .1 g 5901 4700 M -65 -102 V .1 g 5836 4598 M -40 -70 V .1 g 5796 4528 M 5693 4357 L .1 g 5693 4357 M -81 -119 V .1 g 5612 4238 M -34 -52 V .1 g 5578 4186 M 5464 4014 L .1 g 5464 4014 M -76 -101 V .1 g 5388 3913 M -50 -70 V .1 g 5338 3843 M 5205 3672 L .1 g 5205 3672 M -41 -50 V .1 g 5164 3622 M 5063 3500 L .1 g 5063 3500 M 4940 3365 L .1 g 4940 3365 M -35 -36 V .1 g 4905 3329 M 4731 3158 L .1 g 4731 3158 M -14 -14 V .1 g 4717 3144 M 4531 2986 L .1 g 4531 2986 M -38 -32 V .1 g 4493 2954 M 4289 2815 L .1 g 4289 2815 M -20 -14 V .1 g 4269 2801 M 4045 2680 L .1 g 4045 2680 M -98 -36 V .1 g 3947 2644 M -126 -50 V .1 g 3821 2594 M -224 -52 V .1 g 3597 2542 M -224 -17 V .1 g 3373 2525 M -224 17 V .1 g 3149 2542 M -224 52 V .1 g 2925 2594 M -126 50 V .1 g 2799 2644 M -98 36 V .1 g 2701 2680 M -224 121 V .1 g 2477 2801 M -20 14 V .1 g 2457 2815 M -204 139 V .1 g 2253 2954 M -38 32 V .1 g 2215 2986 M -185 157 V .1 g 2030 3143 M -15 15 V .1 g 2015 3158 M -174 171 V .1 g 1841 3329 M -35 36 V .1 g 1806 3365 M -123 135 V .1 g 1683 3500 M -101 121 V .1 g 1582 3621 M -41 51 V .1 g 1541 3672 M -133 171 V .1 g 1408 3843 M -50 69 V .1 g 1358 3912 M -76 102 V .1 g 1282 4014 M -115 172 V .1 g 1167 4186 M -33 52 V .1 g 1134 4238 M -81 119 V .1 g 1053 4357 M 949 4528 L .1 g 949 4528 M -39 69 V .1 g 910 4597 M -65 103 V .1 g 845 4700 M -97 171 V 0 g .1 g 6060 2829 M .1 g 6060 2829 M -9 -14 V .1 g 6051 2815 M 5945 2644 L .1 g 5945 2644 M -90 -171 V .1 g 5855 2473 M -19 -37 V .1 g 5836 2436 M -92 -135 V .1 g 5744 2301 M 5642 2130 L .1 g 5642 2130 M -30 -53 V .1 g 5612 2077 M -87 -118 V .1 g 5525 1959 M 5412 1787 L .1 g 5412 1787 M -24 -36 V .1 g 5388 1751 M 5279 1616 L .1 g 5279 1616 M 5164 1459 L .1 g 5164 1459 M -12 -14 V .1 g 5152 1445 M 4999 1273 L .1 g 4999 1273 M -59 -69 V .1 g 4940 1204 M 4836 1102 L .1 g 4836 1102 M 4717 981 L .1 g 4717 981 M -60 -50 V .1 g 4657 931 M 4493 791 L .1 g 4493 791 M -47 -32 V .1 g 4446 759 M 4269 638 L .1 g 4269 638 M -92 -50 V 0 g .075 g 2892 588 M .075 g 2892 588 M -191 77 V .075 g 2701 665 M -182 94 V .075 g 2519 759 M -42 23 V .075 g 2477 782 M 2260 931 L .075 g 2260 931 M -7 4 V .075 g 2253 935 M -196 167 V .075 g 2057 1102 M -27 23 V .075 g 2030 1125 M -145 148 V .075 g 1885 1273 M -79 77 V .075 g 1806 1350 M -79 95 V .075 g 1727 1445 M -145 159 V .075 g 1582 1604 M -9 12 V .075 g 1573 1616 M -124 171 V .075 g 1449 1787 M -91 111 V .075 g 1358 1898 M -39 61 V .075 g 1319 1959 M -115 171 V .075 g 1204 2130 M -70 94 V .075 g 1134 2224 M -44 77 V .075 g 1090 2301 M 986 2473 L .075 g 986 2473 M -76 110 V .075 g 910 2583 M -31 61 V .075 g 879 2644 M -91 171 V .075 g 788 2815 M 686 2975 L 0 g .075 g 6060 4848 M .075 g 6060 4848 M -75 -148 V .075 g 5985 4700 M 5885 4528 L .075 g 5885 4528 M -49 -76 V .075 g 5836 4452 M -54 -95 V .075 g 5782 4357 M 5677 4186 L .075 g 5677 4186 M -65 -94 V .075 g 5612 4092 M -49 -78 V .075 g 5563 4014 M 5446 3843 L .075 g 5446 3843 M -58 -76 V .075 g 5388 3767 M -68 -95 V .075 g 5320 3672 M 5183 3500 L .075 g 5183 3500 M -19 -22 V .075 g 5164 3478 M 5041 3329 L .075 g 5041 3329 M 4940 3219 L .075 g 4940 3219 M -59 -61 V .075 g 4881 3158 M 4717 2999 L .075 g 4717 2999 M -15 -13 V .075 g 4702 2986 M 4498 2815 L .075 g 4498 2815 M -5 -4 V .075 g 4493 2811 M 4269 2656 L .075 g 4269 2656 M -24 -12 V .075 g 4245 2644 M 4045 2533 L .075 g 4045 2533 M -167 -60 V .075 g 3878 2473 M -57 -23 V .075 g 3821 2450 M -224 -54 V .075 g 3597 2396 M -224 -17 V .075 g 3373 2379 M -224 17 V .075 g 3149 2396 M -224 53 V .075 g 2925 2449 M -57 24 V .075 g 2868 2473 M -167 60 V .075 g 2701 2533 M -201 111 V .075 g 2500 2644 M -23 12 V .075 g 2477 2656 M -224 154 V .075 g 2253 2810 M -5 5 V .075 g 2248 2815 M -205 171 V .075 g 2043 2986 M -13 12 V .075 g 2030 2998 M -165 160 V .075 g 1865 3158 M -59 60 V .075 g 1806 3218 M -101 111 V .075 g 1705 3329 M -123 148 V .075 g 1582 3477 M -20 23 V .075 g 1562 3500 M -136 172 V .075 g 1426 3672 M -68 94 V .075 g 1358 3766 M -58 77 V .075 g 1300 3843 M -117 171 V .075 g 1183 4014 M -49 78 V .075 g 1134 4092 M -65 94 V .075 g 1069 4186 M 963 4357 L .075 g 963 4357 M -53 94 V .075 g 910 4451 M -50 77 V .075 g 860 4528 M 760 4700 L .075 g 760 4700 M -74 147 V 0 g .075 g 6060 2974 M .075 g 6060 2974 M 5958 2815 L .075 g 5958 2815 M -91 -171 V .075 g 5867 2644 M -31 -61 V .075 g 5836 2583 M -76 -110 V .075 g 5760 2473 M 5656 2301 L .075 g 5656 2301 M -44 -78 V .075 g 5612 2223 M -70 -93 V .075 g 5542 2130 M 5427 1959 L .075 g 5427 1959 M -39 -61 V .075 g 5388 1898 M -90 -111 V .075 g 5298 1787 M 5173 1616 L .075 g 5173 1616 M -9 -12 V .075 g 5164 1604 M 5020 1445 L .075 g 5020 1445 M -80 -95 V .075 g 4940 1350 M -79 -77 V .075 g 4861 1273 M 4717 1125 L .075 g 4717 1125 M -28 -23 V .075 g 4689 1102 M 4493 935 L .075 g 4493 935 M -7 -4 V .075 g 4486 931 M 4269 782 L .075 g 4269 782 M -42 -23 V .075 g 4227 759 M 4045 664 L .075 g 4045 664 M 3854 588 L 0 g .05 g 6060 4675 M .05 g 6060 4675 M -72 -147 V .05 g 5988 4528 M 5888 4357 L .05 g 5888 4357 M -52 -78 V .05 g 5836 4279 M -52 -93 V .05 g 5784 4186 M 5680 4014 L .05 g 5680 4014 M -68 -95 V .05 g 5612 3919 M -47 -76 V .05 g 5565 3843 M 5448 3672 L .05 g 5448 3672 M -60 -78 V .05 g 5388 3594 M -66 -94 V .05 g 5322 3500 M 5185 3329 L .05 g 5185 3329 M -21 -24 V .05 g 5164 3305 M 5044 3158 L .05 g 5044 3158 M 4940 3046 L .05 g 4940 3046 M -57 -60 V .05 g 4883 2986 M 4717 2826 L .05 g 4717 2826 M -14 -11 V .05 g 4703 2815 M 4499 2644 L .05 g 4499 2644 M -6 -6 V .05 g 4493 2638 M 4269 2484 L .05 g 4269 2484 M -22 -11 V .05 g 4247 2473 M 4045 2361 L .05 g 4045 2361 M -164 -60 V .05 g 3881 2301 M -60 -24 V .05 g 3821 2277 M -224 -54 V .05 g 3597 2223 M -224 -17 V .05 g 3373 2206 M -224 17 V .05 g 3149 2223 M -224 54 V .05 g 2925 2277 M -60 24 V .05 g 2865 2301 M -164 59 V .05 g 2701 2360 M -203 113 V .05 g 2498 2473 M -21 10 V .05 g 2477 2483 M -224 155 V .05 g 2253 2638 M -7 6 V .05 g 2246 2644 M -204 171 V .05 g 2042 2815 M -12 11 V .05 g 2030 2826 M -167 160 V .05 g 1863 2986 M -57 59 V .05 g 1806 3045 M -104 113 V .05 g 1702 3158 M -120 146 V .05 g 1582 3304 M -21 25 V .05 g 1561 3329 M -137 171 V .05 g 1424 3500 M -66 93 V .05 g 1358 3593 M -61 79 V .05 g 1297 3672 M -116 171 V .05 g 1181 3843 M -47 75 V .05 g 1134 3918 M -68 96 V .05 g 1066 4014 M 961 4186 L .05 g 961 4186 M -51 92 V .05 g 910 4278 M -53 79 V .05 g 857 4357 M -99 171 V .05 g 758 4528 M -72 146 V 0 g .05 g 6060 3147 M .05 g 6060 3147 M 5955 2986 L .05 g 5955 2986 M -89 -171 V .05 g 5866 2815 M -30 -59 V .05 g 5836 2756 M -79 -112 V .05 g 5757 2644 M 5654 2473 L .05 g 5654 2473 M -42 -77 V .05 g 5612 2396 M -73 -95 V .05 g 5539 2301 M 5425 2130 L .05 g 5425 2130 M -37 -60 V .05 g 5388 2070 M -93 -111 V .05 g 5295 1959 M 5172 1787 L .05 g 5172 1787 M -8 -11 V .05 g 5164 1776 M 5017 1616 L .05 g 5017 1616 M -77 -93 V .05 g 4940 1523 M -81 -78 V .05 g 4859 1445 M 4717 1298 L .05 g 4717 1298 M -30 -25 V .05 g 4687 1273 M 4493 1107 L .05 g 4493 1107 M -8 -5 V .05 g 4485 1102 M 4269 955 L .05 g 4269 955 M -44 -24 V .05 g 4225 931 M 4045 837 L .05 g 4045 837 M 3851 759 L .05 g 3851 759 M -30 -11 V .05 g 3821 748 M 3597 700 L .05 g 3597 700 M 3373 683 L .05 g 3373 683 M -224 17 V .05 g 3149 700 M -224 48 V .05 g 2925 748 M -30 11 V .05 g 2895 759 M -194 79 V .05 g 2701 838 M -179 93 V .05 g 2522 931 M -45 24 V .05 g 2477 955 M -215 147 V .05 g 2262 1102 M -9 6 V .05 g 2253 1108 M -194 165 V .05 g 2059 1273 M -29 25 V .05 g 2030 1298 M -143 147 V .05 g 1887 1445 M -81 78 V .05 g 1806 1523 M -77 93 V .05 g 1729 1616 M -147 161 V .05 g 1582 1777 M -8 10 V .05 g 1574 1787 M -123 172 V .05 g 1451 1959 M -93 112 V .05 g 1358 2071 M -37 59 V .05 g 1321 2130 M -114 171 V .05 g 1207 2301 M -73 96 V .05 g 1134 2397 M -42 76 V .05 g 1092 2473 M 990 2644 L .05 g 990 2644 M -80 113 V .05 g 910 2757 M -29 58 V .05 g 881 2815 M -90 171 V .05 g 791 2986 M 686 3147 L 0 g .025 g 6060 4447 M .025 g 6060 4447 M -42 -90 V .025 g 6018 4357 M -90 -171 V .025 g 5928 4186 M -92 -132 V .025 g 5836 4054 M -21 -40 V .025 g 5815 4014 M -94 -171 V .025 g 5721 3843 M 5612 3696 L .025 g 5612 3696 M -15 -24 V .025 g 5597 3672 M 5492 3500 L .025 g 5492 3500 M 5388 3369 L .025 g 5388 3369 M -28 -40 V .025 g 5360 3329 M 5235 3158 L .025 g 5235 3158 M -71 -82 V .025 g 5164 3076 M -72 -90 V .025 g 5092 2986 M 4940 2824 L .025 g 4940 2824 M -9 -9 V .025 g 4931 2815 M 4765 2644 L .025 g 4765 2644 M -48 -46 V .025 g 4717 2598 M 4570 2473 L .025 g 4570 2473 M -77 -65 V .025 g 4493 2408 M 4335 2301 L .025 g 4335 2301 M -66 -46 V .025 g 4269 2255 M 4045 2139 L .025 g 4045 2139 M -26 -9 V .025 g 4019 2130 M -198 -82 V .025 g 3821 2048 M -224 -50 V .025 g 3597 1998 M -224 -15 V .025 g 3373 1983 M -224 15 V .025 g 3149 1998 M -224 50 V .025 g 2925 2048 M -199 82 V .025 g 2726 2130 M -25 9 V .025 g 2701 2139 M -224 116 V .025 g 2477 2255 M -66 46 V .025 g 2411 2301 M -158 107 V .025 g 2253 2408 M -78 65 V .025 g 2175 2473 M -145 124 V .025 g 2030 2597 M -50 47 V .025 g 1980 2644 M -166 171 V .025 g 1814 2815 M -8 9 V .025 g 1806 2824 M -153 162 V .025 g 1653 2986 M -71 89 V .025 g 1582 3075 M -72 83 V .025 g 1510 3158 M -125 171 V .025 g 1385 3329 M -27 39 V .025 g 1358 3368 M -105 132 V .025 g 1253 3500 M -105 172 V .025 g 1148 3672 M -14 23 V .025 g 1134 3695 M -109 148 V .025 g 1025 3843 M -94 171 V .025 g 931 4014 M -21 39 V .025 g 910 4053 M -93 133 V .025 g 817 4186 M -90 171 V .025 g 727 4357 M -41 88 V 0 g .025 g 6060 3375 M .025 g 6060 3375 M -34 -46 V .025 g 6026 3329 M 5920 3158 L .025 g 5920 3158 M -79 -172 V .025 g 5841 2986 M -5 -9 V .025 g 5836 2977 M 5717 2815 L .025 g 5717 2815 M -92 -171 V .025 g 5625 2644 M -13 -25 V .025 g 5612 2619 M 5496 2473 L .025 g 5496 2473 M 5394 2301 L .025 g 5394 2301 M -6 -9 V .025 g 5388 2292 M 5250 2130 L .025 g 5250 2130 M -86 -125 V .025 g 5164 2005 M -44 -46 V .025 g 5120 1959 M 4973 1787 L .025 g 4973 1787 M -33 -40 V .025 g 4940 1747 M 4802 1616 L .025 g 4802 1616 M -85 -90 V .025 g 4717 1526 M -99 -81 V .025 g 4618 1445 M 4493 1338 L .025 g 4493 1338 M -92 -65 V .025 g 4401 1273 M -132 -89 V .025 g 4269 1184 M -146 -82 V .025 g 4123 1102 M -78 -40 V .025 g 4045 1062 M 3821 977 L .025 g 3821 977 M 3641 931 L .025 g 3641 931 M -44 -9 V .025 g 3597 922 M 3373 906 L .025 g 3373 906 M -224 16 V .025 g 3149 922 M -43 9 V .025 g 3106 931 M -181 46 V .025 g 2925 977 M -224 85 V .025 g 2701 1062 M -77 40 V .025 g 2624 1102 M -147 82 V .025 g 2477 1184 M -131 89 V .025 g 2346 1273 M -93 65 V .025 g 2253 1338 M -124 107 V .025 g 2129 1445 M -99 82 V .025 g 2030 1527 M -86 89 V .025 g 1944 1616 M -138 132 V .025 g 1806 1748 M -32 39 V .025 g 1774 1787 M -148 172 V .025 g 1626 1959 M -44 47 V .025 g 1582 2006 M -86 124 V .025 g 1496 2130 M -138 163 V .025 g 1358 2293 M -5 8 V .025 g 1353 2301 M -103 172 V .025 g 1250 2473 M -116 147 V .025 g 1134 2620 M -13 24 V .025 g 1121 2644 M -91 171 V .025 g 1030 2815 M 910 2978 L .025 g 910 2978 M -4 8 V .025 g 906 2986 M -79 172 V .025 g 827 3158 M 721 3329 L .025 g 721 3329 M -35 48 V % End plot #1 % Begin plot #2 1.500 UP stroke 4.000 UL LT0 0.55 0.10 0.05 C 2253 4443 M 815 2975 L 313 159 V 189 -257 V 167 -223 V 171 -211 V 174 -194 V 176 -175 V 175 -153 V 174 -132 V 172 -109 V 168 -87 V 163 -67 V 158 -46 V 152 -29 V 144 -12 V 136 1 V 127 13 V 120 22 V 113 30 V 105 35 V 100 41 V 95 45 V 91 49 V 88 52 V 85 55 V 82 59 V 79 61 V 78 63 V 74 65 V 73 67 V 70 68 V 68 69 V 65 70 V 64 70 V 60 70 V 59 69 V 55 69 V 53 67 V 50 65 V 47 63 V 44 60 V 41 57 V 38 53 V 33 49 V 30 44 V 26 38 V 21 32 V 16 24 V 10 16 V 4 7 V 1 1 V 2253 4443 CircleF 815 2975 CircleF 1128 3134 CircleF 1317 2877 CircleF 1484 2654 CircleF 1655 2443 CircleF 1829 2249 CircleF 2005 2074 CircleF 2180 1921 CircleF 2354 1789 CircleF 2526 1680 CircleF 2694 1593 CircleF 2857 1526 CircleF 3015 1480 CircleF 3167 1451 CircleF 3311 1439 CircleF 3447 1440 CircleF 3574 1453 CircleF 3694 1475 CircleF 3807 1505 CircleF 3912 1540 CircleF 4012 1581 CircleF 4107 1626 CircleF 4198 1675 CircleF 4286 1727 CircleF 4371 1782 CircleF 4453 1841 CircleF 4532 1902 CircleF 4610 1965 CircleF 4684 2030 CircleF 4757 2097 CircleF 4827 2165 CircleF 4895 2234 CircleF 4960 2304 CircleF 5024 2374 CircleF 5084 2444 CircleF 5143 2513 CircleF 5198 2582 CircleF 5251 2649 CircleF 5301 2714 CircleF 5348 2777 CircleF 5392 2837 CircleF 5433 2894 CircleF 5471 2947 CircleF 5504 2996 CircleF 5534 3040 CircleF 5560 3078 CircleF 5581 3110 CircleF 5597 3134 CircleF 5607 3150 CircleF 5611 3157 CircleF 5612 3158 CircleF 5612 3158 CircleF 5612 3158 CircleF % End plot #2 % Begin plot #3 1.500 UP 4.000 UL LT2 0.00 0.38 0.68 C 2253 4443 M 1255 3345 L 54 -444 V 516 -647 V 617 -526 V 628 -263 V 591 4 V 593 244 V 613 502 V 289 318 V 285 373 V 140 204 V 29 44 V 2 4 V 2253 4443 TriUF 1255 3345 TriUF 1309 2901 TriUF 1825 2254 TriUF 2442 1728 TriUF 3070 1465 TriUF 3661 1469 TriUF 4254 1713 TriUF 4867 2215 TriUF 5156 2533 TriUF 5441 2906 TriUF 5581 3110 TriUF 5610 3154 TriUF 5612 3158 TriUF 5612 3158 TriUF 5612 3158 TriUF % End plot #3 LCw setrgbcolor 1.000 3270 4528 2706 280 BoxColFill % Begin plot #4 2.000 UL LT0 0 g % End plot #4 % Begin plot #5 1.500 UP 4.000 UL LT0 0.55 0.10 0.05 C 5454 4738 M [ [(Arial-Bold) 140.0 0.0 true true 0 (LM)] ] -46.7 MRshow LT0 0.55 0.10 0.05 C 5538 4738 M 354 0 V 5715 4738 CircleF % End plot #5 % Begin plot #6 1.500 UP 4.000 UL LT2 0.00 0.38 0.68 C 5454 4598 M [ [(Arial-Bold) 140.0 0.0 true true 0 (LM + geodesic acceleration)] ] -46.7 MRshow LT2 0.00 0.38 0.68 C 5538 4598 M 354 0 V 5715 4598 TriUF % End plot #6 1.000 UL LTb LCb setrgbcolor 686 4871 N 686 588 L 5374 0 V 0 4283 V -5374 0 V Z stroke stroke gsave %% draw gray scale smooth box maxcolors 0 gt {/imax maxcolors def} {/imax 1024 def} ifelse 6194 588 translate 268 4283 scale 0 setlinewidth /ystep 1 imax div def /y0 0 def /ii 0 def { y0 g 0 y0 N 1 0 V 0 ystep V -1 0 f /y0 y0 ystep add def /ii ii 1 add def ii imax ge {exit} if } loop grestore 0 setgray 1.000 UL LTb LCb setrgbcolor 6194 588 N 268 0 V 0 4283 V -268 0 V 0 -4283 V Z stroke 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6462 588 M -63 0 V stroke 6546 588 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 588 M 63 0 V 205 535 R -63 0 V stroke 6546 1123 M [ [(Helvetica) 140.0 0.0 true true 0 ( 5000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 1123 M 63 0 V 205 535 R -63 0 V stroke 6546 1658 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 1658 M 63 0 V 205 536 R -63 0 V stroke 6546 2194 M [ [(Helvetica) 140.0 0.0 true true 0 ( 15000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 2194 M 63 0 V 205 535 R -63 0 V stroke 6546 2729 M [ [(Helvetica) 140.0 0.0 true true 0 ( 20000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 2729 M 63 0 V 205 535 R -63 0 V stroke 6546 3264 M [ [(Helvetica) 140.0 0.0 true true 0 ( 25000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 3264 M 63 0 V 205 536 R -63 0 V stroke 6546 3800 M [ [(Helvetica) 140.0 0.0 true true 0 ( 30000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 3800 M 63 0 V 205 535 R -63 0 V stroke 6546 4335 M [ [(Helvetica) 140.0 0.0 true true 0 ( 35000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 4335 M 63 0 V 205 536 R -63 0 V stroke 6546 4871 M [ [(Helvetica) 140.0 0.0 true true 0 ( 40000)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6194 4871 M 63 0 V 0.300 UP stroke LTb LCb setrgbcolor grestore % colour palette end stroke grestore end showpage %%Trailer %%DocumentFonts: Arial-Bold Helvetica gsl-doc-2.3/doc/nlfit3.eps0000644000175000017500000123673412737536472013475 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: nlfit3.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Sat Jul 2 12:39:50 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (nlfit3.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Sat Jul 2 12:39:50 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if gsave % colour palette begin /maxcolors 0 def /HSV2RGB { exch dup 0.0 eq {pop exch pop dup dup} % achromatic gray { /HSVs exch def /HSVv exch def 6.0 mul dup floor dup 3 1 roll sub /HSVf exch def /HSVi exch cvi def /HSVp HSVv 1.0 HSVs sub mul def /HSVq HSVv 1.0 HSVs HSVf mul sub mul def /HSVt HSVv 1.0 HSVs 1.0 HSVf sub mul sub mul def /HSVi HSVi 6 mod def 0 HSVi eq {HSVv HSVt HSVp} {1 HSVi eq {HSVq HSVv HSVp}{2 HSVi eq {HSVp HSVv HSVt} {3 HSVi eq {HSVp HSVq HSVv}{4 HSVi eq {HSVt HSVp HSVv} {HSVv HSVp HSVq} ifelse} ifelse} ifelse} ifelse} ifelse } ifelse} def /Constrain { dup 0 lt {0 exch pop}{dup 1 gt {1 exch pop} if} ifelse} def /YIQ2RGB { 3 copy -1.702 mul exch -1.105 mul add add Constrain 4 1 roll 3 copy -0.647 mul exch -0.272 mul add add Constrain 5 1 roll 0.621 mul exch -0.956 mul add add Constrain 3 1 roll } def /CMY2RGB { 1 exch sub exch 1 exch sub 3 2 roll 1 exch sub 3 1 roll exch } def /XYZ2RGB { 3 copy -0.9017 mul exch -0.1187 mul add exch 0.0585 mul exch add Constrain 4 1 roll 3 copy -0.0279 mul exch 1.999 mul add exch -0.9844 mul add Constrain 5 1 roll -0.2891 mul exch -0.5338 mul add exch 1.91 mul exch add Constrain 3 1 roll} def /SelectSpace {ColorSpace (HSV) eq {HSV2RGB}{ColorSpace (XYZ) eq { XYZ2RGB}{ColorSpace (CMY) eq {CMY2RGB}{ColorSpace (YIQ) eq {YIQ2RGB} if} ifelse} ifelse} ifelse} def /InterpolatedColor true def /grayindex {/gidx 0 def {GrayA gidx get grayv ge {exit} if /gidx gidx 1 add def} loop} def /dgdx {grayv GrayA gidx get sub GrayA gidx 1 sub get GrayA gidx get sub div} def /redvalue {RedA gidx get RedA gidx 1 sub get RedA gidx get sub dgdxval mul add} def /greenvalue {GreenA gidx get GreenA gidx 1 sub get GreenA gidx get sub dgdxval mul add} def /bluevalue {BlueA gidx get BlueA gidx 1 sub get BlueA gidx get sub dgdxval mul add} def /interpolate { grayindex grayv GrayA gidx get sub abs 1e-5 le {RedA gidx get GreenA gidx get BlueA gidx get} {/dgdxval dgdx def redvalue greenvalue bluevalue} ifelse} def /GrayA [0 .125 .25 .375 .5 .625 .75 .875 1 ] def /RedA [0 0 0 0 .5 1 1 1 .5 ] def /GreenA [0 0 .5 1 1 1 .5 0 0 ] def /BlueA [.5 1 1 1 .5 0 0 0 0 ] def /pm3dround {maxcolors 0 gt {dup 1 ge {pop 1} {maxcolors mul floor maxcolors 1 sub div} ifelse} if} def /pm3dGamma 1.0 1.5 Gamma mul div def /ColorSpace (RGB) def Color InterpolatedColor or { % COLOUR vs. GRAY map InterpolatedColor { %% Interpolation vs. RGB-Formula /g {stroke pm3dround /grayv exch def interpolate SelectSpace setrgbcolor} bind def }{ /g {stroke pm3dround dup cF7 Constrain exch dup cF5 Constrain exch cF15 Constrain SelectSpace setrgbcolor} bind def } ifelse }{ /g {stroke pm3dround pm3dGamma exp setgray} bind def } ifelse 1.000 UL LTb LCb setrgbcolor 602 588 M 63 0 V 5387 0 R -63 0 V stroke 518 588 M [ [(Helvetica) 140.0 0.0 true true 0 (-5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 1596 M 63 0 V 5387 0 R -63 0 V stroke 518 1596 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 2604 M 63 0 V 5387 0 R -63 0 V stroke 518 2604 M [ [(Helvetica) 140.0 0.0 true true 0 ( 5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 3611 M 63 0 V 5387 0 R -63 0 V stroke 518 3611 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 4619 M 63 0 V 5387 0 R -63 0 V stroke 518 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 15)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 602 588 M 0 63 V 0 3968 R 0 -63 V stroke 602 448 M [ [(Helvetica) 140.0 0.0 true true 0 (-5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1965 588 M 0 63 V 0 3968 R 0 -63 V stroke 1965 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3327 588 M 0 63 V 0 3968 R 0 -63 V stroke 3327 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4690 588 M 0 63 V 0 3968 R 0 -63 V stroke 4690 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6052 588 M 0 63 V 0 3968 R 0 -63 V stroke 6052 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 15)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 602 4619 N 602 588 L 5450 0 V 0 4031 V -5450 0 V Z stroke LCb setrgbcolor 112 2603 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (x)] [(Helvetica) 112.0 -42.0 true true 0 (2)] ] -32.7 MCshow grestore LTb LCb setrgbcolor 3327 238 M [ [(Helvetica) 140.0 0.0 true true 0 (x)] [(Helvetica) 112.0 -42.0 true true 0 (1)] ] -32.7 MCshow LTb 3327 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Minimizing the Branin function)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 2.000 UL LT0 0 g 1 g 612 588 M 1 g 612 588 M -9 20 V 1 g 603 608 M -1 3 V 0 g .98 g 632 588 M .98 g 632 588 M -3 7 V .98 g 629 595 M -6 13 V .98 g 623 608 M -9 20 V .98 g 614 628 M -8 20 V .98 g 606 648 M -4 9 V 0 g .96 g 653 588 M .96 g 653 588 M -9 20 V .96 g 644 608 M -9 20 V .96 g 635 628 M -6 13 V .96 g 629 641 M -3 7 V .96 g 626 648 M -9 21 V .96 g 617 669 M -9 20 V .96 g 608 689 M -6 14 V 0 g .94 g 673 588 M .94 g 673 588 M -9 20 V .94 g 664 608 M -7 18 V .94 g 657 626 M -2 2 V .94 g 655 628 M -8 20 V .94 g 647 648 M -9 21 V .94 g 638 669 M -9 19 V .94 g 629 688 M 0 1 V .94 g 629 689 M -9 20 V .94 g 620 709 M -9 20 V .94 g 611 729 M -9 20 V .94 g 602 749 M 0 1 V 0 g .92 g 694 588 M .92 g 694 588 M -9 20 V .92 g 685 608 M -1 4 V .92 g 684 612 M -8 16 V .92 g 676 628 M -9 20 V .92 g 667 648 M -8 21 V .92 g 659 669 M -2 4 V .92 g 657 673 M -7 16 V .92 g 650 689 M -9 20 V .92 g 641 709 M -9 20 V .92 g 632 729 M -3 6 V .92 g 629 735 M -6 14 V .92 g 623 749 M -9 20 V .92 g 614 769 M -9 21 V .92 g 605 790 M -3 7 V 0 g .9 g 716 588 M .9 g 716 588 M -5 11 V .9 g 711 599 M -4 9 V .9 g 707 608 M -9 20 V .9 g 698 628 M -9 20 V .9 g 689 648 M -5 12 V .9 g 684 660 M -4 9 V .9 g 680 669 M -9 20 V .9 g 671 689 M -9 20 V .9 g 662 709 M -5 12 V .9 g 657 721 M -4 8 V .9 g 653 729 M -9 20 V stroke 644 749 M .9 g 644 749 M -9 20 V .9 g 635 769 M -6 14 V .9 g 629 783 M -3 7 V .9 g 626 790 M -8 20 V .9 g 618 810 M -9 20 V .9 g 609 830 M -7 15 V 0 g .88 g 738 588 M .88 g 738 588 M -9 20 V .88 g 729 608 M -10 20 V .88 g 719 628 M -8 19 V .88 g 711 647 M -1 1 V .88 g 710 648 M -9 21 V .88 g 701 669 M -9 20 V .88 g 692 689 M -8 19 V .88 g 684 708 M -1 1 V .88 g 683 709 M -9 20 V .88 g 674 729 M -9 20 V .88 g 665 749 M -8 20 V .88 g 657 769 M -1 0 V .88 g 656 769 M -8 21 V .88 g 648 790 M -9 20 V .88 g 639 810 M -9 20 V .88 g 630 830 M -1 1 V .88 g 629 831 M -8 19 V .88 g 621 850 M -9 20 V .88 g 612 870 M -9 20 V .88 g 603 890 M -1 4 V 0 g .86 g 760 588 M .86 g 760 588 M -9 20 V .86 g 751 608 M -10 20 V .86 g 741 628 M -3 7 V .86 g 738 635 M -6 13 V .86 g 732 648 M -9 21 V .86 g 723 669 M -9 20 V .86 g 714 689 M -3 7 V .86 g 711 696 M -6 13 V .86 g 705 709 M -9 20 V .86 g 696 729 M -9 20 V .86 g 687 749 M -3 8 V .86 g 684 757 M -6 12 V .86 g 678 769 M -9 21 V .86 g 669 790 M -9 20 V .86 g 660 810 M -3 8 V .86 g 657 818 M -6 12 V .86 g 651 830 M -8 20 V .86 g 643 850 M -9 20 V .86 g 634 870 M -5 10 V .86 g 629 880 M -4 10 V .86 g 625 890 M -9 20 V .86 g 616 910 M -9 21 V .86 g 607 931 M -5 12 V 0 g .84 g 782 588 M .84 g 782 588 M -9 20 V .84 g 773 608 M -8 17 V stroke 765 625 M .84 g 765 625 M -1 3 V .84 g 764 628 M -9 20 V .84 g 755 648 M -9 21 V .84 g 746 669 M -8 16 V .84 g 738 685 M -2 4 V .84 g 736 689 M -9 20 V .84 g 727 709 M -9 20 V .84 g 718 729 M -7 16 V .84 g 711 745 M -2 4 V .84 g 709 749 M -9 20 V .84 g 700 769 M -9 21 V .84 g 691 790 M -7 16 V .84 g 684 806 M -2 4 V .84 g 682 810 M -9 20 V .84 g 673 830 M -9 20 V .84 g 664 850 M -7 18 V .84 g 657 868 M -2 2 V .84 g 655 870 M -8 20 V .84 g 647 890 M -9 20 V .84 g 638 910 M -9 20 V .84 g 629 930 M 0 1 V .84 g 629 931 M -9 20 V .84 g 620 951 M -9 20 V .84 g 611 971 M -8 20 V .84 g 603 991 M -1 1 V 0 g .82 g 806 588 M .82 g 806 588 M -10 20 V .82 g 796 608 M -3 7 V .82 g 793 615 M -6 13 V .82 g 787 628 M -9 20 V .82 g 778 648 M -10 21 V .82 g 768 669 M -3 6 V .82 g 765 675 M -6 14 V .82 g 759 689 M -9 20 V .82 g 750 709 M -9 20 V .82 g 741 729 M -3 6 V .82 g 738 735 M -6 14 V .82 g 732 749 M -9 20 V .82 g 723 769 M -9 21 V .82 g 714 790 M -3 5 V .82 g 711 795 M -6 15 V .82 g 705 810 M -9 20 V .82 g 696 830 M -9 20 V .82 g 687 850 M -3 6 V .82 g 684 856 M -6 14 V .82 g 678 870 M -9 20 V .82 g 669 890 M -9 20 V .82 g 660 910 M -3 8 V .82 g 657 918 M -6 13 V .82 g 651 931 M -9 20 V .82 g 642 951 M -9 20 V .82 g 633 971 M -4 9 V .82 g 629 980 M -5 11 V stroke 624 991 M .82 g 624 991 M -8 20 V .82 g 616 1011 M -9 20 V .82 g 607 1031 M -5 12 V 0 g .8 g 829 588 M .8 g 829 588 M -9 19 V .8 g 820 607 M 0 1 V .8 g 820 608 M -10 20 V .8 g 810 628 M -9 20 V .8 g 801 648 M -8 18 V .8 g 793 666 M -1 3 V .8 g 792 669 M -10 20 V .8 g 782 689 M -9 20 V .8 g 773 709 M -8 16 V .8 g 765 725 M -1 4 V .8 g 764 729 M -9 20 V .8 g 755 749 M -10 20 V .8 g 745 769 M -7 16 V .8 g 738 785 M -2 5 V .8 g 736 790 M -9 20 V .8 g 727 810 M -9 20 V .8 g 718 830 M -7 16 V .8 g 711 846 M -2 4 V .8 g 709 850 M -9 20 V .8 g 700 870 M -9 20 V .8 g 691 890 M -7 17 V .8 g 684 907 M -2 3 V .8 g 682 910 M -9 21 V .8 g 673 931 M -9 20 V .8 g 664 951 M -7 18 V .8 g 657 969 M -1 2 V .8 g 656 971 M -9 20 V .8 g 647 991 M -9 20 V .8 g 638 1011 M -9 20 V .8 g .8 g 629 1031 M -9 21 V .8 g 620 1052 M -8 20 V .8 g 612 1072 M -9 20 V .8 g 603 1092 M -1 1 V 0 g .78 g 853 588 M .78 g 853 588 M -6 13 V .78 g 847 601 M -3 7 V .78 g 844 608 M -10 20 V .78 g 834 628 M -9 20 V .78 g 825 648 M -5 10 V .78 g 820 658 M -5 11 V .78 g 815 669 M -9 20 V .78 g 806 689 M -9 20 V .78 g 797 709 M -4 8 V .78 g 793 717 M -6 12 V .78 g 787 729 M -9 20 V .78 g 778 749 M -9 20 V .78 g 769 769 M -4 7 V .78 g 765 776 M -5 14 V .78 g 760 790 M -10 20 V stroke 750 810 M .78 g 750 810 M -9 20 V .78 g 741 830 M -3 6 V .78 g 738 836 M -6 14 V .78 g 732 850 M -9 20 V .78 g 723 870 M -9 20 V .78 g 714 890 M -3 7 V .78 g 711 897 M -6 13 V .78 g 705 910 M -9 21 V .78 g 696 931 M -9 20 V .78 g 687 951 M -3 7 V .78 g 684 958 M -6 13 V .78 g 678 971 M -9 20 V .78 g 669 991 M -9 20 V .78 g 660 1011 M -3 9 V .78 g 657 1020 M -5 11 V .78 g 652 1031 M -9 21 V .78 g 643 1052 M -9 20 V .78 g 634 1072 M -5 10 V .78 g 629 1082 M -4 10 V .78 g 625 1092 M -9 20 V .78 g 616 1112 M -8 20 V .78 g 608 1132 M -6 13 V 0 g .76 g 878 588 M .76 g 878 588 M -3 7 V .76 g 875 595 M -7 13 V .76 g 868 608 M -9 20 V .76 g 859 628 M -10 20 V .76 g 849 648 M -2 4 V .76 g 847 652 M -7 17 V .76 g 840 669 M -10 20 V .76 g 830 689 M -9 20 V .76 g 821 709 M -1 1 V .76 g 820 710 M -9 19 V .76 g 811 729 M -9 20 V .76 g 802 749 M -9 20 V .76 g 793 769 M -1 0 V .76 g 792 769 M -9 21 V .76 g 783 790 M -9 20 V .76 g 774 810 M -9 18 V .76 g 765 828 M 0 2 V .76 g 765 830 M -9 20 V .76 g 756 850 M -9 20 V .76 g 747 870 M -9 18 V .76 g 738 888 M -1 2 V .76 g 737 890 M -9 20 V .76 g 728 910 M -9 21 V .76 g 719 931 M -8 18 V .76 g 711 949 M -1 2 V .76 g 710 951 M -9 20 V .76 g 701 971 M -9 20 V .76 g 692 991 M -8 19 V .76 g 684 1010 M -1 1 V .76 g 683 1011 M -8 20 V stroke 675 1031 M .76 g 675 1031 M -9 21 V .76 g 666 1052 M -9 20 V .76 g .76 g 657 1072 M -9 20 V .76 g 648 1092 M -9 20 V .76 g 639 1112 M -9 20 V .76 g 630 1132 M -1 3 V .76 g 629 1135 M -7 17 V .76 g 622 1152 M -9 20 V .76 g 613 1172 M -9 21 V .76 g 604 1193 M -2 4 V 0 g .74 g 903 588 M .74 g 903 588 M -1 3 V .74 g 902 591 M -8 17 V .74 g 894 608 M -10 20 V .74 g 884 628 M -9 19 V .74 g 875 647 M -1 1 V .74 g 874 648 M -10 21 V .74 g 864 669 M -9 20 V .74 g 855 689 M -8 16 V .74 g 847 705 M -2 4 V .74 g 845 709 M -9 20 V .74 g 836 729 M -10 20 V .74 g 826 749 M -6 14 V .74 g 820 763 M -3 6 V .74 g 817 769 M -9 21 V .74 g 808 790 M -10 20 V .74 g 798 810 M -5 11 V .74 g 793 821 M -4 9 V .74 g 789 830 M -9 20 V .74 g 780 850 M -10 20 V .74 g 770 870 M -5 11 V .74 g 765 881 M -4 9 V .74 g 761 890 M -9 20 V .74 g 752 910 M -9 21 V .74 g 743 931 M -5 10 V .74 g 738 941 M -4 10 V .74 g 734 951 M -9 20 V .74 g 725 971 M -9 20 V .74 g 716 991 M -5 11 V .74 g 711 1002 M -4 9 V .74 g 707 1011 M -9 20 V .74 g 698 1031 M -9 21 V .74 g 689 1052 M -5 11 V .74 g 684 1063 M -4 9 V .74 g 680 1072 M -9 20 V .74 g 671 1092 M -9 20 V .74 g 662 1112 M -5 13 V .74 g 657 1125 M -4 7 V .74 g 653 1132 M -8 20 V .74 g 645 1152 M -9 20 V .74 g 636 1172 M -7 15 V .74 g 629 1187 M -2 6 V .74 g 627 1193 M -9 20 V stroke 618 1213 M .74 g 618 1213 M -8 20 V .74 g 610 1233 M -8 17 V 0 g .72 g 929 588 M .72 g 929 588 M 0 1 V .72 g 929 589 M -10 19 V .72 g 919 608 M -9 20 V .72 g 910 628 M -8 16 V .72 g 902 644 M -2 4 V .72 g 900 648 M -10 21 V .72 g 890 669 M -10 20 V .72 g 880 689 M -5 11 V .72 g 875 700 M -5 9 V .72 g 870 709 M -9 20 V .72 g 861 729 M -10 20 V .72 g 851 749 M -4 9 V .72 g 847 758 M -5 11 V .72 g 842 769 M -10 21 V .72 g 832 790 M -9 20 V .72 g 823 810 M -3 6 V .72 g 820 816 M -7 14 V .72 g 813 830 M -9 20 V .72 g 804 850 M -9 20 V .72 g 795 870 M -2 4 V .72 g 793 874 M -7 16 V .72 g 786 890 M -10 20 V .72 g 776 910 M -9 21 V .72 g 767 931 M -2 3 V .72 g 765 934 M -7 17 V .72 g 758 951 M -9 20 V .72 g 749 971 M -9 20 V .72 g 740 991 M -2 3 V .72 g 738 994 M -7 17 V .72 g 731 1011 M -9 20 V .72 g 722 1031 M -9 21 V .72 g 713 1052 M -2 3 V .72 g 711 1055 M -7 17 V .72 g 704 1072 M -9 20 V .72 g 695 1092 M -9 20 V .72 g 686 1112 M -2 5 V .72 g 684 1117 M -7 15 V .72 g 677 1132 M -9 20 V .72 g 668 1152 M -9 20 V .72 g 659 1172 M -2 7 V .72 g 657 1179 M -7 14 V .72 g 650 1193 M -8 20 V .72 g 642 1213 M -9 20 V .72 g 633 1233 M -4 8 V .72 g 629 1241 M -5 12 V .72 g 624 1253 M -9 20 V .72 g 615 1273 M -8 20 V .72 g 607 1293 M -5 11 V 0 g .7 g 956 588 M .7 g 956 588 M -10 20 V stroke 946 608 M .7 g 946 608 M -10 20 V .7 g 936 628 M -7 14 V .7 g 929 642 M -3 6 V .7 g 926 648 M -10 21 V .7 g 916 669 M -10 20 V .7 g 906 689 M -4 9 V .7 g 902 698 M -6 11 V .7 g 896 709 M -9 20 V .7 g 887 729 M -10 20 V .7 g 877 749 M -2 5 V .7 g 875 754 M -8 15 V .7 g 867 769 M -9 21 V .7 g 858 790 M -10 20 V .7 g 848 810 M -1 1 V .7 g 847 811 M -8 19 V .7 g 839 830 M -10 20 V .7 g 829 850 M -9 20 V .7 g .7 g 820 870 M -10 20 V .7 g 810 890 M -9 20 V .7 g 801 910 M -8 18 V .7 g 793 928 M -1 3 V .7 g 792 931 M -9 20 V .7 g 783 951 M -10 20 V .7 g 773 971 M -8 17 V .7 g 765 988 M -1 3 V .7 g 764 991 M -9 20 V .7 g 755 1011 M -9 20 V .7 g 746 1031 M -8 17 V .7 g 738 1048 M -1 4 V .7 g 737 1052 M -9 20 V .7 g 728 1072 M -9 20 V .7 g 719 1092 M -8 17 V .7 g 711 1109 M -1 3 V .7 g 710 1112 M -9 20 V .7 g 701 1132 M -9 20 V .7 g 692 1152 M -8 19 V .7 g 684 1171 M -1 1 V .7 g 683 1172 M -9 21 V .7 g 674 1193 M -9 20 V .7 g 665 1213 M -8 20 V .7 g 657 1233 M -1 0 V .7 g 656 1233 M -8 20 V .7 g 648 1253 M -9 20 V .7 g 639 1273 M -9 20 V .7 g 630 1293 M -1 2 V .7 g 629 1295 M -8 19 V .7 g 621 1314 M -8 20 V .7 g 613 1334 M -9 20 V .7 g 604 1354 M -2 4 V 0 g .68 g 984 588 M .68 g .68 g 984 588 M -10 20 V .68 g 974 608 M -11 20 V .68 g 963 628 M -7 14 V stroke 956 642 M .68 g 956 642 M -3 6 V .68 g 953 648 M -10 21 V .68 g 943 669 M -10 20 V .68 g 933 689 M -4 8 V .68 g 929 697 M -6 12 V .68 g 923 709 M -10 20 V .68 g 913 729 M -10 20 V .68 g 903 749 M -1 3 V .68 g 902 752 M -8 17 V .68 g 894 769 M -10 21 V .68 g 884 790 M -9 19 V .68 g 875 809 M -1 1 V .68 g 874 810 M -9 20 V .68 g 865 830 M -10 20 V .68 g 855 850 M -8 16 V .68 g 847 866 M -2 4 V .68 g 845 870 M -9 20 V .68 g 836 890 M -10 20 V .68 g 826 910 M -6 14 V .68 g 820 924 M -3 7 V .68 g 817 931 M -9 20 V .68 g 808 951 M -10 20 V .68 g 798 971 M -5 12 V .68 g 793 983 M -4 8 V .68 g 789 991 M -9 20 V .68 g 780 1011 M -9 20 V .68 g 771 1031 M -6 12 V .68 g 765 1043 M -3 9 V .68 g 762 1052 M -9 20 V .68 g 753 1072 M -10 20 V .68 g 743 1092 M -5 11 V .68 g 738 1103 M -4 9 V .68 g 734 1112 M -9 20 V .68 g 725 1132 M -9 20 V .68 g 716 1152 M -5 12 V .68 g 711 1164 M -4 8 V .68 g 707 1172 M -9 21 V .68 g 698 1193 M -8 20 V .68 g 690 1213 M -6 13 V .68 g 684 1226 M -3 7 V .68 g 681 1233 M -9 20 V .68 g 672 1253 M -9 20 V .68 g 663 1273 M -6 15 V .68 g 657 1288 M -3 5 V .68 g 654 1293 M -9 21 V .68 g 645 1314 M -8 20 V .68 g 637 1334 M -8 17 V .68 g 629 1351 M -1 3 V .68 g 628 1354 M -9 20 V .68 g 619 1374 M -9 20 V .68 g 610 1394 M -8 20 V 0 g .66 g 1012 588 M .66 g 1012 588 M -1 3 V stroke 1011 591 M .66 g 1011 591 M -9 17 V .66 g 1002 608 M -11 20 V .66 g 991 628 M -7 16 V .66 g 984 644 M -3 4 V .66 g 981 648 M -10 21 V .66 g 971 669 M -10 20 V .66 g 961 689 M -5 8 V .66 g 956 697 M -5 12 V .66 g 951 709 M -11 20 V .66 g 940 729 M -10 20 V .66 g 930 749 M -1 3 V .66 g 929 752 M -8 17 V .66 g 921 769 M -10 21 V .66 g 911 790 M -9 18 V .66 g 902 808 M -1 2 V .66 g 901 810 M -10 20 V .66 g 891 830 M -10 20 V .66 g 881 850 M -6 14 V .66 g 875 864 M -3 6 V .66 g 872 870 M -10 20 V .66 g 862 890 M -9 20 V .66 g 853 910 M -6 12 V .66 g 847 922 M -4 9 V .66 g 843 931 M -9 20 V .66 g 834 951 M -10 20 V .66 g 824 971 M -4 9 V .66 g 820 980 M -5 11 V .66 g 815 991 M -10 20 V .66 g 805 1011 M -9 20 V .66 g 796 1031 M -3 8 V .66 g 793 1039 M -6 13 V .66 g 787 1052 M -9 20 V .66 g 778 1072 M -9 20 V .66 g 769 1092 M -4 7 V .66 g 765 1099 M -6 13 V .66 g 759 1112 M -9 20 V .66 g 750 1132 M -9 20 V .66 g 741 1152 M -3 7 V .66 g 738 1159 M -6 13 V .66 g 732 1172 M -9 21 V .66 g 723 1193 M -9 20 V .66 g 714 1213 M -3 7 V .66 g 711 1220 M -6 13 V .66 g 705 1233 M -9 20 V .66 g 696 1253 M -8 20 V .66 g 688 1273 M -4 9 V .66 g 684 1282 M -5 11 V .66 g 679 1293 M -9 21 V .66 g 670 1314 M -9 20 V .66 g 661 1334 M -4 10 V .66 g 657 1344 M -5 10 V .66 g 652 1354 M -9 20 V stroke 643 1374 M .66 g 643 1374 M -8 20 V .66 g 635 1394 M -6 13 V .66 g 629 1407 M -3 7 V .66 g 626 1414 M -9 21 V .66 g 617 1435 M -8 20 V .66 g 609 1455 M -7 15 V 0 g .64 g 1042 588 M .64 g 1042 588 M -4 7 V .64 g 1038 595 M -7 13 V .64 g 1031 608 M -10 20 V .64 g 1021 628 M -10 19 V .64 g 1011 647 M -1 1 V .64 g 1010 648 M -10 21 V .64 g 1000 669 M -11 20 V .64 g 989 689 M -5 11 V .64 g 984 700 M -5 9 V .64 g 979 709 M -10 20 V .64 g 969 729 M -11 20 V .64 g 958 749 M -2 4 V .64 g 956 753 M -8 16 V .64 g 948 769 M -10 21 V .64 g 938 790 M -9 18 V .64 g 929 808 M -1 2 V .64 g 928 810 M -10 20 V .64 g 918 830 M -9 20 V .64 g 909 850 M -7 14 V .64 g 902 864 M -3 6 V .64 g 899 870 M -10 20 V .64 g 889 890 M -10 20 V .64 g 879 910 M -4 10 V .64 g 875 920 M -5 11 V .64 g 870 931 M -10 20 V .64 g 860 951 M -9 20 V .64 g 851 971 M -4 7 V .64 g 847 978 M -6 13 V .64 g 841 991 M -9 20 V .64 g 832 1011 M -10 20 V .64 g 822 1031 M -2 5 V .64 g 820 1036 M -7 16 V .64 g 813 1052 M -9 20 V .64 g 804 1072 M -10 20 V .64 g 794 1092 M -1 3 V .64 g 793 1095 M -8 17 V .64 g 785 1112 M -9 20 V .64 g 776 1132 M -9 20 V .64 g 767 1152 M -2 3 V .64 g 765 1155 M -7 17 V .64 g 758 1172 M -9 21 V .64 g 749 1193 M -9 20 V .64 g 740 1213 M -2 3 V .64 g 738 1216 M -7 17 V .64 g 731 1233 M -9 20 V .64 g 722 1253 M -9 20 V stroke 713 1273 M .64 g 713 1273 M -2 4 V .64 g 711 1277 M -7 16 V .64 g 704 1293 M -9 21 V .64 g 695 1314 M -9 20 V .64 g 686 1334 M -2 5 V .64 g 684 1339 M -7 15 V .64 g 677 1354 M -9 20 V .64 g 668 1374 M -9 20 V .64 g 659 1394 M -2 7 V .64 g 657 1401 M -6 13 V .64 g 651 1414 M -9 21 V .64 g 642 1435 M -9 20 V .64 g 633 1455 M -4 9 V .64 g 629 1464 M -5 11 V .64 g 624 1475 M -8 20 V .64 g 616 1495 M -9 20 V .64 g 607 1515 M -5 12 V 0 g .62 g 1073 588 M .62 g 1073 588 M -8 13 V .62 g 1065 601 M -3 7 V .62 g 1062 608 M -11 20 V .62 g 1051 628 M -11 20 V .62 g 1040 648 M -2 4 V .62 g 1038 652 M -9 17 V .62 g 1029 669 M -10 20 V .62 g 1019 689 M -8 15 V .62 g 1011 704 M -3 5 V .62 g 1008 709 M -10 20 V .62 g 998 729 M -11 20 V .62 g 987 749 M -3 8 V .62 g 984 757 M -7 12 V .62 g 977 769 M -10 21 V .62 g 967 790 M -10 20 V .62 g 957 810 M -1 0 V .62 g 956 810 M -9 20 V .62 g 947 830 M -10 20 V .62 g 937 850 M -8 15 V .62 g 929 865 M -2 5 V .62 g 927 870 M -10 20 V .62 g 917 890 M -10 20 V .62 g 907 910 M -5 11 V .62 g 902 921 M -5 10 V .62 g 897 931 M -10 20 V .62 g 887 951 M -9 20 V .62 g 878 971 M -3 6 V .62 g 875 977 M -7 14 V .62 g 868 991 M -9 20 V .62 g 859 1011 M -10 20 V .62 g 849 1031 M -2 4 V .62 g 847 1035 M -7 17 V .62 g 840 1052 M -10 20 V .62 g 830 1072 M -9 20 V .62 g 821 1092 M -1 1 V stroke 820 1093 M .62 g 820 1093 M -9 19 V .62 g 811 1112 M -9 20 V .62 g 802 1132 M -9 20 V .62 g 793 1152 M 0 1 V .62 g 793 1153 M -9 19 V .62 g 784 1172 M -9 21 V .62 g 775 1193 M -10 19 V .62 g 765 1212 M 0 1 V .62 g 765 1213 M -9 20 V .62 g 756 1233 M -9 20 V .62 g 747 1253 M -9 20 V .62 g .62 g 738 1273 M -9 20 V .62 g 729 1293 M -9 21 V .62 g 720 1314 M -9 20 V .62 g .62 g 711 1334 M -9 20 V .62 g 702 1354 M -8 20 V .62 g 694 1374 M -9 20 V .62 g 685 1394 M -1 2 V .62 g 684 1396 M -8 18 V .62 g 676 1414 M -9 21 V .62 g 667 1435 M -9 20 V .62 g 658 1455 M -1 4 V .62 g 657 1459 M -7 16 V .62 g 650 1475 M -9 20 V .62 g 641 1495 M -9 20 V .62 g 632 1515 M -3 7 V .62 g 629 1522 M -6 13 V .62 g 623 1535 M -8 20 V .62 g 615 1555 M -9 21 V .62 g 606 1576 M -4 9 V 0 g .6 g 1105 588 M .6 g 1105 588 M -12 20 V .6 g 1093 608 M 0 2 V .6 g 1093 610 M -11 18 V .6 g 1082 628 M -11 20 V .6 g 1071 648 M -6 11 V .6 g 1065 659 M -5 10 V .6 g 1060 669 M -11 20 V .6 g 1049 689 M -10 20 V .6 g 1039 709 M -1 1 V .6 g 1038 710 M -10 19 V .6 g 1028 729 M -11 20 V .6 g 1017 749 M -6 13 V .6 g 1011 762 M -4 7 V .6 g 1007 769 M -11 21 V .6 g 996 790 M -10 20 V .6 g 986 810 M -2 4 V .6 g 984 814 M -8 16 V .6 g 976 830 M -10 20 V .6 g 966 850 M -10 18 V .6 g 956 868 M -1 2 V .6 g 955 870 M -10 20 V .6 g 945 890 M -10 20 V stroke 935 910 M .6 g 935 910 M -6 13 V .6 g 929 923 M -4 8 V .6 g 925 931 M -10 20 V .6 g 915 951 M -9 20 V .6 g 906 971 M -4 8 V .6 g 902 979 M -6 12 V .6 g 896 991 M -10 20 V .6 g 886 1011 M -10 20 V .6 g 876 1031 M -1 5 V .6 g 875 1036 M -8 16 V .6 g 867 1052 M -10 20 V .6 g 857 1072 M -9 20 V .6 g 848 1092 M -1 1 V .6 g 847 1093 M -9 19 V .6 g 838 1112 M -9 20 V .6 g 829 1132 M -9 20 V .6 g .6 g 820 1152 M -10 20 V .6 g 810 1172 M -9 21 V .6 g 801 1193 M -8 18 V .6 g 793 1211 M -1 2 V .6 g 792 1213 M -9 20 V .6 g 783 1233 M -9 20 V .6 g 774 1253 M -9 18 V .6 g 765 1271 M -1 2 V .6 g 764 1273 M -9 20 V .6 g 755 1293 M -9 21 V .6 g 746 1314 M -8 18 V .6 g 738 1332 M -1 2 V .6 g 737 1334 M -9 20 V .6 g 728 1354 M -9 20 V .6 g 719 1374 M -8 19 V .6 g 711 1393 M -1 1 V .6 g 710 1394 M -8 20 V .6 g 702 1414 M -9 21 V .6 g 693 1435 M -9 20 V .6 g .6 g 684 1455 M -9 20 V .6 g 675 1475 M -9 20 V .6 g 666 1495 M -9 20 V .6 g 657 1515 M 0 2 V .6 g 657 1517 M -8 18 V .6 g 649 1535 M -9 20 V .6 g 640 1555 M -9 21 V .6 g 631 1576 M -2 4 V .6 g 629 1580 M -6 16 V .6 g 623 1596 M -9 20 V .6 g 614 1616 M -9 20 V .6 g 605 1636 M -3 8 V 0 g .58 g 1138 588 M .58 g 1138 588 M -12 20 V .58 g 1126 608 M -6 12 V .58 g 1120 620 M -5 8 V .58 g 1115 628 M -11 20 V .58 g 1104 648 M -11 20 V stroke 1093 668 M .58 g 1093 668 M -1 1 V .58 g 1092 669 M -11 20 V .58 g 1081 689 M -11 20 V .58 g 1070 709 M -5 9 V .58 g 1065 718 M -6 11 V .58 g 1059 729 M -11 20 V .58 g 1048 749 M -10 20 V .58 g .58 g 1038 769 M -11 21 V .58 g 1027 790 M -11 20 V .58 g 1016 810 M -5 10 V .58 g 1011 820 M -5 10 V .58 g 1006 830 M -10 20 V .58 g 996 850 M -11 20 V .58 g 985 870 M -1 3 V .58 g 984 873 M -9 17 V .58 g 975 890 M -10 20 V .58 g 965 910 M -9 17 V .58 g 956 927 M -1 4 V .58 g 955 931 M -10 20 V .58 g 945 951 M -10 20 V .58 g 935 971 M -6 11 V .58 g 929 982 M -4 9 V .58 g 925 991 M -10 20 V .58 g 915 1011 M -10 20 V .58 g 905 1031 M -3 7 V .58 g 902 1038 M -7 14 V .58 g 895 1052 M -9 20 V .58 g 886 1072 M -10 20 V .58 g 876 1092 M -1 3 V .58 g 875 1095 M -9 17 V .58 g 866 1112 M -9 20 V .58 g 857 1132 M -10 20 V .58 g .58 g 847 1152 M -9 20 V .58 g 838 1172 M -10 21 V .58 g 828 1193 M -8 18 V .58 g 820 1211 M -1 2 V .58 g 819 1213 M -9 20 V .58 g 810 1233 M -9 20 V .58 g 801 1253 M -8 17 V .58 g 793 1270 M -2 3 V .58 g 791 1273 M -9 20 V .58 g 782 1293 M -9 21 V .58 g 773 1314 M -8 16 V .58 g 765 1330 M -1 4 V .58 g 764 1334 M -9 20 V .58 g 755 1354 M -9 20 V .58 g 746 1374 M -8 17 V .58 g 738 1391 M -1 3 V .58 g 737 1394 M -9 20 V .58 g 728 1414 M -9 21 V .58 g 719 1435 M -8 18 V .58 g 711 1453 M -1 2 V stroke 710 1455 M .58 g 710 1455 M -9 20 V .58 g 701 1475 M -9 20 V .58 g 692 1495 M -8 20 V .58 g .58 g 684 1515 M -9 20 V .58 g 675 1535 M -9 20 V .58 g 666 1555 M -9 21 V .58 g 657 1576 M 0 1 V .58 g 657 1577 M -8 19 V .58 g 649 1596 M -9 20 V .58 g 640 1616 M -9 20 V .58 g 631 1636 M -2 4 V .58 g 629 1640 M -7 16 V .58 g 622 1656 M -8 20 V .58 g 614 1676 M -9 21 V .58 g 605 1697 M -3 7 V 0 g .56 g 1173 588 M .56 g 1173 588 M -12 20 V .56 g 1161 608 M -12 20 V .56 g 1149 628 M -2 4 V .56 g 1147 632 M -9 16 V .56 g 1138 648 M -12 21 V .56 g 1126 669 M -6 11 V .56 g 1120 680 M -5 9 V .56 g 1115 689 M -12 20 V .56 g 1103 709 M -10 19 V .56 g 1093 728 M -1 1 V .56 g 1092 729 M -11 20 V .56 g 1081 749 M -11 20 V .56 g 1070 769 M -5 9 V .56 g 1065 778 M -6 12 V .56 g 1059 790 M -11 20 V .56 g 1048 810 M -10 18 V .56 g 1038 828 M -1 2 V .56 g 1037 830 M -10 20 V .56 g 1027 850 M -11 20 V .56 g 1016 870 M -5 10 V .56 g 1011 880 M -5 10 V .56 g 1006 890 M -11 20 V .56 g 995 910 M -10 21 V .56 g 985 931 M -1 2 V .56 g 984 933 M -9 18 V .56 g 975 951 M -11 20 V .56 g 964 971 M -8 16 V .56 g 956 987 M -2 4 V .56 g 954 991 M -10 20 V .56 g 944 1011 M -10 20 V .56 g 934 1031 M -5 11 V .56 g 929 1042 M -5 10 V .56 g 924 1052 M -9 20 V .56 g 915 1072 M -10 20 V .56 g 905 1092 M -3 6 V .56 g 902 1098 M -7 14 V .56 g 895 1112 M -10 20 V stroke 885 1132 M .56 g 885 1132 M -9 20 V .56 g 876 1152 M -1 3 V .56 g 875 1155 M -9 17 V .56 g 866 1172 M -9 21 V .56 g 857 1193 M -10 19 V .56 g 847 1212 M 0 1 V .56 g 847 1213 M -9 20 V .56 g 838 1233 M -10 20 V .56 g 828 1253 M -8 18 V .56 g 820 1271 M -1 2 V .56 g 819 1273 M -9 20 V .56 g 810 1293 M -9 21 V .56 g 801 1314 M -8 17 V .56 g 793 1331 M -2 3 V .56 g 791 1334 M -9 20 V .56 g 782 1354 M -9 20 V .56 g 773 1374 M -8 17 V .56 g 765 1391 M -1 3 V .56 g 764 1394 M -9 20 V .56 g 755 1414 M -9 21 V .56 g 746 1435 M -8 17 V .56 g 738 1452 M -1 3 V .56 g 737 1455 M -9 20 V .56 g 728 1475 M -9 20 V .56 g 719 1495 M -8 18 V .56 g 711 1513 M -1 2 V .56 g 710 1515 M -9 20 V .56 g 701 1535 M -8 20 V .56 g 693 1555 M -9 20 V .56 g 684 1575 M 0 1 V .56 g 684 1576 M -9 20 V .56 g 675 1596 M -9 20 V .56 g 666 1616 M -9 20 V .56 g 657 1636 M 0 2 V .56 g 657 1638 M -8 18 V .56 g 649 1656 M -9 20 V .56 g 640 1676 M -9 21 V .56 g 631 1697 M -2 4 V .56 g 629 1701 M -6 16 V .56 g 623 1717 M -9 20 V .56 g 614 1737 M -9 20 V .56 g 605 1757 M -3 8 V 0 g .54 g 1210 588 M .54 g 1210 588 M -8 13 V .54 g 1202 601 M -5 7 V .54 g 1197 608 M -12 20 V .54 g 1185 628 M -11 19 V .54 g 1174 647 M -1 1 V .54 g 1173 648 M -12 21 V .54 g 1161 669 M -12 20 V .54 g 1149 689 M -2 4 V .54 g 1147 693 M -9 16 V .54 g 1138 709 M -12 20 V stroke 1126 729 M .54 g 1126 729 M -6 11 V .54 g 1120 740 M -5 9 V .54 g 1115 749 M -12 20 V .54 g 1103 769 M -10 20 V .54 g 1093 789 M -1 1 V .54 g 1092 790 M -11 20 V .54 g 1081 810 M -11 20 V .54 g 1070 830 M -5 9 V .54 g 1065 839 M -6 11 V .54 g 1059 850 M -11 20 V .54 g 1048 870 M -10 19 V .54 g 1038 889 M -1 1 V .54 g 1037 890 M -10 20 V .54 g 1027 910 M -11 21 V .54 g 1016 931 M -5 10 V .54 g 1011 941 M -5 10 V .54 g 1006 951 M -11 20 V .54 g 995 971 M -10 20 V .54 g 985 991 M -1 3 V .54 g 984 994 M -9 17 V .54 g 975 1011 M -10 20 V .54 g 965 1031 M -9 17 V .54 g 956 1048 M -2 4 V .54 g 954 1052 M -9 20 V .54 g 945 1072 M -10 20 V .54 g 935 1092 M -6 11 V .54 g 929 1103 M -4 9 V .54 g 925 1112 M -10 20 V .54 g 915 1132 M -10 20 V .54 g 905 1152 M -3 7 V .54 g 902 1159 M -7 13 V .54 g 895 1172 M -9 21 V .54 g 886 1193 M -10 20 V .54 g 876 1213 M -1 3 V .54 g 875 1216 M -9 17 V .54 g 866 1233 M -9 20 V .54 g 857 1253 M -10 20 V .54 g 847 1273 M 0 1 V .54 g 847 1274 M -9 19 V .54 g 838 1293 M -9 21 V .54 g 829 1314 M -9 18 V .54 g 820 1332 M -1 2 V .54 g 819 1334 M -9 20 V .54 g 810 1354 M -9 20 V .54 g 801 1374 M -8 18 V .54 g 793 1392 M -1 2 V .54 g 792 1394 M -9 20 V .54 g 783 1414 M -9 21 V .54 g 774 1435 M -9 17 V .54 g 765 1452 M -1 3 V .54 g 764 1455 M -9 20 V .54 g 755 1475 M -9 20 V stroke 746 1495 M .54 g 746 1495 M -8 18 V .54 g 738 1513 M -1 2 V .54 g 737 1515 M -8 20 V .54 g 729 1535 M -9 20 V .54 g 720 1555 M -9 20 V .54 g 711 1575 M 0 1 V .54 g 711 1576 M -9 20 V .54 g 702 1596 M -9 20 V .54 g 693 1616 M -9 20 V .54 g 684 1636 M 0 1 V .54 g 684 1637 M -8 19 V .54 g 676 1656 M -9 20 V .54 g 667 1676 M -9 21 V .54 g 658 1697 M -1 3 V .54 g 657 1700 M -8 17 V .54 g 649 1717 M -8 20 V .54 g 641 1737 M -9 20 V .54 g 632 1757 M -3 6 V .54 g 629 1763 M -6 14 V .54 g 623 1777 M -8 20 V .54 g 615 1797 M -9 20 V .54 g 606 1817 M -4 10 V 0 g .52 g 1249 588 M .52 g 1249 588 M -13 20 V .52 g 1236 608 M -7 11 V .52 g 1229 619 M -6 9 V .52 g 1223 628 M -12 20 V .52 g 1211 648 M -9 15 V .52 g 1202 663 M -4 6 V .52 g 1198 669 M -12 20 V .52 g 1186 689 M -12 20 V .52 g .52 g 1174 709 M -12 20 V .52 g 1162 729 M -12 20 V .52 g 1150 749 M -3 6 V .52 g 1147 755 M -8 14 V .52 g 1139 769 M -12 21 V .52 g 1127 790 M -7 12 V .52 g 1120 802 M -4 8 V .52 g 1116 810 M -12 20 V .52 g 1104 830 M -11 20 V .52 g 1093 850 M 0 1 V .52 g 1093 851 M -11 19 V .52 g 1082 870 M -11 20 V .52 g 1071 890 M -6 11 V .52 g 1065 901 M -5 9 V .52 g 1060 910 M -11 21 V .52 g 1049 931 M -11 20 V .52 g .52 g 1038 951 M -10 20 V .52 g 1028 971 M -11 20 V .52 g 1017 991 M -6 12 V .52 g 1011 1003 M -4 8 V .52 g 1007 1011 M -11 20 V .52 g 996 1031 M -10 21 V stroke 986 1052 M .52 g 986 1052 M -2 4 V .52 g 984 1056 M -8 16 V .52 g 976 1072 M -11 20 V .52 g 965 1092 M -9 18 V .52 g 956 1110 M -1 2 V .52 g 955 1112 M -10 20 V .52 g 945 1132 M -10 20 V .52 g 935 1152 M -6 13 V .52 g 929 1165 M -4 7 V .52 g 925 1172 M -9 21 V .52 g 916 1193 M -10 20 V .52 g 906 1213 M -4 8 V .52 g 902 1221 M -6 12 V .52 g 896 1233 M -9 20 V .52 g 887 1253 M -10 20 V .52 g 877 1273 M -2 5 V .52 g 875 1278 M -8 15 V .52 g 867 1293 M -9 21 V .52 g 858 1314 M -10 20 V .52 g 848 1334 M -1 2 V .52 g 847 1336 M -8 18 V .52 g 839 1354 M -9 20 V .52 g 830 1374 M -10 20 V .52 g 820 1394 M 0 1 V .52 g 820 1395 M -9 19 V .52 g 811 1414 M -9 21 V .52 g 802 1435 M -9 20 V .52 g .52 g 793 1455 M -9 20 V .52 g 784 1475 M -9 20 V .52 g 775 1495 M -10 20 V .52 g .52 g 765 1515 M -8 20 V .52 g 757 1535 M -9 20 V .52 g 748 1555 M -10 21 V .52 g .52 g 738 1576 M -8 20 V .52 g 730 1596 M -9 20 V .52 g 721 1616 M -9 20 V .52 g 712 1636 M -1 2 V .52 g 711 1638 M -8 18 V .52 g 703 1656 M -9 20 V .52 g 694 1676 M -9 21 V .52 g 685 1697 M -1 3 V .52 g 684 1700 M -7 17 V .52 g 677 1717 M -9 20 V .52 g 668 1737 M -9 20 V .52 g 659 1757 M -2 6 V .52 g 657 1763 M -6 14 V .52 g 651 1777 M -9 20 V .52 g 642 1797 M -9 20 V .52 g 633 1817 M -4 10 V .52 g 629 1827 M -4 11 V .52 g 625 1838 M -9 20 V .52 g 616 1858 M -9 20 V stroke 607 1878 M .52 g 607 1878 M -5 12 V 0 g .52 g 6052 619 M .52 g 6052 619 M -7 -11 V .52 g 6045 608 M -13 -20 V 0 g .5 g 1290 588 M .5 g 1290 588 M -7 10 V .5 g 1283 598 M -7 10 V .5 g 1276 608 M -13 20 V .5 g 1263 628 M -7 12 V .5 g 1256 640 M -6 8 V .5 g 1250 648 M -12 21 V .5 g 1238 669 M -9 14 V .5 g 1229 683 M -4 6 V .5 g 1225 689 M -12 20 V .5 g 1213 709 M -11 18 V .5 g 1202 727 M -2 2 V .5 g 1200 729 M -12 20 V .5 g 1188 749 M -12 20 V .5 g 1176 769 M -2 3 V .5 g 1174 772 M -10 18 V .5 g 1164 790 M -12 20 V .5 g 1152 810 M -5 8 V .5 g 1147 818 M -7 12 V .5 g 1140 830 M -11 20 V .5 g 1129 850 M -9 15 V .5 g 1120 865 M -3 5 V .5 g 1117 870 M -11 20 V .5 g 1106 890 M -12 20 V .5 g 1094 910 M -1 4 V .5 g 1093 914 M -10 17 V .5 g 1083 931 M -11 20 V .5 g 1072 951 M -7 13 V .5 g 1065 964 M -4 7 V .5 g 1061 971 M -10 20 V .5 g 1051 991 M -11 20 V .5 g 1040 1011 M -2 3 V .5 g 1038 1014 M -9 17 V .5 g 1029 1031 M -10 21 V .5 g 1019 1052 M -8 14 V .5 g 1011 1066 M -3 6 V .5 g 1008 1072 M -10 20 V .5 g 998 1092 M -11 20 V .5 g 987 1112 M -3 7 V .5 g 984 1119 M -7 13 V .5 g 977 1132 M -10 20 V .5 g 967 1152 M -10 20 V .5 g 957 1172 M -1 1 V .5 g 956 1173 M -9 20 V .5 g 947 1193 M -10 20 V .5 g 937 1213 M -8 16 V .5 g 929 1229 M -2 4 V .5 g 927 1233 M -10 20 V .5 g 917 1253 M -10 20 V stroke 907 1273 M .5 g 907 1273 M -5 12 V .5 g 902 1285 M -4 8 V .5 g 898 1293 M -10 21 V .5 g 888 1314 M -10 20 V .5 g 878 1334 M -3 8 V .5 g 875 1342 M -6 12 V .5 g 869 1354 M -10 20 V .5 g 859 1374 M -9 20 V .5 g 850 1394 M -3 6 V .5 g 847 1400 M -6 14 V .5 g 841 1414 M -10 21 V .5 g 831 1435 M -9 20 V .5 g 822 1455 M -2 4 V .5 g 820 1459 M -7 16 V .5 g 813 1475 M -9 20 V .5 g 804 1495 M -10 20 V .5 g 794 1515 M -1 3 V .5 g 793 1518 M -8 17 V .5 g 785 1535 M -9 20 V .5 g 776 1555 M -9 21 V .5 g 767 1576 M -2 3 V .5 g 765 1579 M -7 17 V .5 g 758 1596 M -9 20 V .5 g 749 1616 M -9 20 V .5 g 740 1636 M -2 4 V .5 g 738 1640 M -7 16 V .5 g 731 1656 M -9 20 V .5 g 722 1676 M -8 21 V .5 g 714 1697 M -3 5 V .5 g 711 1702 M -6 15 V .5 g 705 1717 M -9 20 V .5 g 696 1737 M -9 20 V .5 g 687 1757 M -3 8 V .5 g 684 1765 M -6 12 V .5 g 678 1777 M -8 20 V .5 g 670 1797 M -9 20 V .5 g 661 1817 M -4 11 V .5 g 657 1828 M -5 10 V .5 g 652 1838 M -8 20 V .5 g 644 1858 M -9 20 V .5 g 635 1878 M -6 13 V .5 g 629 1891 M -3 7 V .5 g 626 1898 M -8 20 V .5 g 618 1918 M -9 20 V .5 g 609 1938 M -7 17 V 0 g .5 g 6052 682 M .5 g 6052 682 M -9 -13 V .5 g 6043 669 M -13 -21 V .5 g 6030 648 M -5 -7 V .5 g 6025 641 M -9 -13 V .5 g 6016 628 M -13 -20 V .5 g 6003 608 M -5 -8 V .5 g 5998 600 M -9 -12 V stroke 5989 588 M 0 g .48 g 1333 588 M .48 g 1333 588 M -13 20 V .48 g 1320 608 M -9 14 V .48 g 1311 622 M -5 6 V .48 g 1306 628 M -13 20 V .48 g 1293 648 M -10 14 V .48 g 1283 662 M -4 7 V .48 g 1279 669 M -13 20 V .48 g 1266 689 M -10 15 V .48 g 1256 704 M -3 5 V .48 g 1253 709 M -13 20 V .48 g 1240 729 M -11 18 V .48 g 1229 747 M -2 2 V .48 g 1227 749 M -12 20 V .48 g 1215 769 M -12 21 V .48 g 1203 790 M -1 1 V .48 g 1202 791 M -12 19 V .48 g 1190 810 M -12 20 V .48 g 1178 830 M -4 6 V .48 g 1174 836 M -8 14 V .48 g 1166 850 M -12 20 V .48 g 1154 870 M -7 13 V .48 g 1147 883 M -4 7 V .48 g 1143 890 M -12 20 V .48 g 1131 910 M -11 20 V .48 g 1120 930 M -1 1 V .48 g 1119 931 M -11 20 V .48 g 1108 951 M -11 20 V .48 g 1097 971 M -4 7 V .48 g 1093 978 M -7 13 V .48 g 1086 991 M -11 20 V .48 g 1075 1011 M -10 17 V .48 g 1065 1028 M -1 3 V .48 g 1064 1031 M -11 21 V .48 g 1053 1052 M -11 20 V .48 g 1042 1072 M -4 7 V .48 g 1038 1079 M -7 13 V .48 g 1031 1092 M -10 20 V .48 g 1021 1112 M -10 19 V .48 g 1011 1131 M -1 1 V .48 g 1010 1132 M -10 20 V .48 g 1000 1152 M -11 20 V .48 g 989 1172 M -5 12 V .48 g 984 1184 M -5 9 V .48 g 979 1193 M -10 20 V .48 g 969 1213 M -10 20 V .48 g 959 1233 M -3 5 V .48 g 956 1238 M -7 15 V .48 g 949 1253 M -10 20 V .48 g 939 1273 M -10 20 V .48 g .48 g 929 1293 M -10 21 V .48 g 919 1314 M -10 20 V .48 g 909 1334 M -7 15 V stroke 902 1349 M .48 g 902 1349 M -2 5 V .48 g 900 1354 M -10 20 V .48 g 890 1374 M -10 20 V .48 g 880 1394 M -5 13 V .48 g 875 1407 M -4 7 V .48 g 871 1414 M -9 21 V .48 g 862 1435 M -10 20 V .48 g 852 1455 M -5 10 V .48 g 847 1465 M -4 10 V .48 g 843 1475 M -10 20 V .48 g 833 1495 M -9 20 V .48 g 824 1515 M -4 9 V .48 g 820 1524 M -5 11 V .48 g 815 1535 M -9 20 V .48 g 806 1555 M -10 21 V .48 g 796 1576 M -3 8 V .48 g 793 1584 M -6 12 V .48 g 787 1596 M -9 20 V .48 g 778 1616 M -9 20 V .48 g 769 1636 M -4 8 V .48 g 765 1644 M -5 12 V .48 g 760 1656 M -9 20 V .48 g 751 1676 M -9 21 V .48 g 742 1697 M -4 9 V .48 g 738 1706 M -5 11 V .48 g 733 1717 M -8 20 V .48 g 725 1737 M -9 20 V .48 g 716 1757 M -5 11 V .48 g 711 1768 M -4 9 V .48 g 707 1777 M -9 20 V .48 g 698 1797 M -9 20 V .48 g 689 1817 M -5 13 V .48 g 684 1830 M -3 8 V .48 g 681 1838 M -9 20 V .48 g 672 1858 M -9 20 V .48 g 663 1878 M -6 16 V .48 g 657 1894 M -2 4 V .48 g 655 1898 M -9 20 V .48 g 646 1918 M -9 20 V .48 g 637 1938 M -8 19 V .48 g 629 1957 M 0 2 V .48 g 629 1959 M -9 20 V .48 g 620 1979 M -8 20 V .48 g 612 1999 M -9 20 V .48 g 603 2019 M -1 2 V 0 g .48 g 6052 747 M .48 g 6052 747 M -12 -18 V .48 g 6040 729 M -13 -20 V .48 g 6027 709 M -2 -3 V .48 g 6025 706 M -12 -17 V .48 g 6013 689 M -13 -20 V .48 g 6000 669 M -2 -4 V .48 g 5998 665 M -12 -17 V stroke 5986 648 M .48 g 5986 648 M -14 -20 V .48 g 5972 628 M -2 -3 V .48 g 5970 625 M -12 -17 V .48 g 5958 608 M -14 -20 V 0 g .46 g 632 2019 M .46 g 632 2019 M -3 6 V .46 g 629 2025 M -6 14 V .46 g 623 2039 M -8 20 V .46 g 615 2059 M -9 20 V .46 g 606 2079 M -4 10 V 0 g .46 g 1380 588 M .46 g 1380 588 M -14 20 V .46 g 1366 608 M -1 1 V .46 g 1365 609 M -13 19 V .46 g 1352 628 M -14 20 V .46 g 1338 648 M -1 0 V .46 g 1337 648 M -13 21 V .46 g 1324 669 M -13 19 V .46 g 1311 688 M -1 1 V .46 g 1310 689 M -14 20 V .46 g 1296 709 M -13 19 V .46 g 1283 728 M 0 1 V .46 g 1283 729 M -13 20 V .46 g 1270 749 M -13 20 V .46 g 1257 769 M -1 1 V .46 g 1256 770 M -12 20 V .46 g 1244 790 M -13 20 V .46 g 1231 810 M -2 3 V .46 g 1229 813 M -11 17 V .46 g 1218 830 M -12 20 V .46 g 1206 850 M -4 7 V .46 g 1202 857 M -8 13 V .46 g 1194 870 M -13 20 V .46 g 1181 890 M -7 12 V .46 g 1174 902 M -5 8 V .46 g 1169 910 M -12 21 V .46 g 1157 931 M -10 17 V .46 g 1147 948 M -1 3 V .46 g 1146 951 M -12 20 V .46 g 1134 971 M -12 20 V .46 g 1122 991 M -2 5 V .46 g 1120 996 M -9 15 V .46 g 1111 1011 M -11 20 V .46 g 1100 1031 M -7 13 V .46 g 1093 1044 M -4 8 V .46 g 1089 1052 M -12 20 V .46 g 1077 1072 M -11 20 V .46 g 1066 1092 M -1 2 V .46 g 1065 1094 M -9 18 V .46 g 1056 1112 M -11 20 V .46 g 1045 1132 M -7 13 V .46 g 1038 1145 M -4 7 V .46 g 1034 1152 M -10 20 V stroke 1024 1172 M .46 g 1024 1172 M -11 21 V .46 g 1013 1193 M -2 4 V .46 g 1011 1197 M -8 16 V .46 g 1003 1213 M -11 20 V .46 g 992 1233 M -8 17 V .46 g 984 1250 M -2 3 V .46 g 982 1253 M -10 20 V .46 g 972 1273 M -10 20 V .46 g 962 1293 M -6 11 V .46 g 956 1304 M -4 10 V .46 g 952 1314 M -10 20 V .46 g 942 1334 M -10 20 V .46 g 932 1354 M -3 5 V .46 g 929 1359 M -7 15 V .46 g 922 1374 M -10 20 V .46 g 912 1394 M -10 20 V .46 g 902 1414 M 0 2 V .46 g 902 1416 M -9 19 V .46 g 893 1435 M -10 20 V .46 g 883 1455 M -8 18 V .46 g 875 1473 M -1 2 V .46 g 874 1475 M -10 20 V .46 g 864 1495 M -9 20 V .46 g 855 1515 M -8 16 V .46 g 847 1531 M -2 4 V .46 g 845 1535 M -9 20 V .46 g 836 1555 M -9 21 V .46 g 827 1576 M -7 14 V .46 g 820 1590 M -2 6 V .46 g 818 1596 M -10 20 V .46 g 808 1616 M -9 20 V .46 g 799 1636 M -6 14 V .46 g 793 1650 M -3 6 V .46 g 790 1656 M -9 20 V .46 g 781 1676 M -9 21 V .46 g 772 1697 M -7 14 V .46 g 765 1711 M -2 6 V .46 g 763 1717 M -9 20 V .46 g 754 1737 M -9 20 V .46 g 745 1757 M -7 16 V .46 g 738 1773 M -2 4 V .46 g 736 1777 M -9 20 V .46 g 727 1797 M -8 20 V .46 g 719 1817 M -8 18 V .46 g 711 1835 M -1 3 V .46 g 710 1838 M -9 20 V .46 g 701 1858 M -9 20 V .46 g 692 1878 M -8 20 V .46 g .46 g 684 1898 M -9 20 V .46 g 675 1918 M -9 20 V .46 g 666 1938 M -8 21 V .46 g 658 1959 M -1 2 V stroke 657 1961 M .46 g 657 1961 M -8 18 V .46 g 649 1979 M -9 20 V .46 g 640 1999 M -8 20 V 0 g .46 g 6052 813 M .46 g 6052 813 M -2 -3 V .46 g 6050 810 M -14 -20 V .46 g 6036 790 M -11 -18 V .46 g 6025 772 M -2 -3 V .46 g 6023 769 M -14 -20 V .46 g 6009 749 M -11 -18 V .46 g 5998 731 M -2 -2 V .46 g 5996 729 M -14 -20 V .46 g 5982 709 M -12 -17 V .46 g 5970 692 M -2 -3 V .46 g 5968 689 M -14 -20 V .46 g 5954 669 M -11 -16 V .46 g 5943 653 M -4 -5 V .46 g 5939 648 M -14 -20 V .46 g 5925 628 M -9 -12 V .46 g 5916 616 M -6 -8 V .46 g 5910 608 M -15 -20 V 0 g .44 g 670 1999 M .44 g 670 1999 M -9 20 V .44 g 661 2019 M -4 11 V .44 g 657 2030 M -4 9 V .44 g 653 2039 M -9 20 V .44 g 644 2059 M -9 20 V .44 g 635 2079 M -6 15 V .44 g 629 2094 M -2 6 V .44 g 627 2100 M -9 20 V .44 g 618 2120 M -8 20 V .44 g 610 2140 M -8 18 V 0 g .44 g 1430 588 M .44 g 1430 588 M -10 14 V .44 g 1420 602 M -5 6 V .44 g 1415 608 M -15 20 V .44 g 1400 628 M -8 11 V .44 g 1392 639 M -6 9 V .44 g 1386 648 M -15 21 V .44 g 1371 669 M -6 8 V .44 g 1365 677 M -8 12 V .44 g 1357 689 M -14 20 V .44 g 1343 709 M -5 7 V .44 g 1338 716 M -9 13 V .44 g 1329 729 M -14 20 V .44 g 1315 749 M -4 6 V .44 g 1311 755 M -10 14 V .44 g 1301 769 M -13 21 V .44 g 1288 790 M -5 6 V .44 g 1283 796 M -9 14 V .44 g 1274 810 M -13 20 V .44 g 1261 830 M -5 8 V .44 g 1256 838 M -8 12 V .44 g 1248 850 M -13 20 V stroke 1235 870 M .44 g 1235 870 M -6 10 V .44 g 1229 880 M -6 10 V .44 g 1223 890 M -13 20 V .44 g 1210 910 M -8 14 V .44 g 1202 924 M -4 7 V .44 g 1198 931 M -12 20 V .44 g 1186 951 M -12 18 V .44 g 1174 969 M -1 2 V .44 g 1173 971 M -11 20 V .44 g 1162 991 M -12 20 V .44 g 1150 1011 M -3 5 V .44 g 1147 1016 M -9 15 V .44 g 1138 1031 M -12 21 V .44 g 1126 1052 M -6 11 V .44 g 1120 1063 M -5 9 V .44 g 1115 1072 M -11 20 V .44 g 1104 1092 M -11 20 V .44 g 1093 1112 M -1 0 V .44 g 1092 1112 M -11 20 V .44 g 1081 1132 M -11 20 V .44 g 1070 1152 M -5 9 V .44 g 1065 1161 M -6 11 V .44 g 1059 1172 M -11 21 V .44 g 1048 1193 M -10 19 V .44 g 1038 1212 M 0 1 V .44 g 1038 1213 M -11 20 V .44 g 1027 1233 M -10 20 V .44 g 1017 1253 M -6 11 V .44 g 1011 1264 M -5 9 V .44 g 1006 1273 M -10 20 V .44 g 996 1293 M -11 21 V .44 g 985 1314 M -1 3 V .44 g 984 1317 M -9 17 V .44 g 975 1334 M -10 20 V .44 g 965 1354 M -9 18 V .44 g 956 1372 M -1 2 V .44 g 955 1374 M -10 20 V .44 g 945 1394 M -10 20 V .44 g 935 1414 M -6 13 V .44 g 929 1427 M -4 8 V .44 g 925 1435 M -9 20 V .44 g 916 1455 M -10 20 V .44 g 906 1475 M -4 8 V .44 g 902 1483 M -6 12 V .44 g 896 1495 M -9 20 V .44 g 887 1515 M -10 20 V .44 g 877 1535 M -2 6 V .44 g 875 1541 M -7 14 V .44 g 868 1555 M -10 21 V .44 g 858 1576 M -9 20 V .44 g 849 1596 M -2 3 V .44 g 847 1599 M -7 17 V stroke 840 1616 M .44 g 840 1616 M -10 20 V .44 g 830 1636 M -9 20 V .44 g 821 1656 M -1 2 V .44 g 820 1658 M -8 18 V .44 g 812 1676 M -9 21 V .44 g 803 1697 M -9 20 V .44 g 794 1717 M -1 1 V .44 g 793 1718 M -8 19 V .44 g 785 1737 M -9 20 V .44 g 776 1757 M -10 20 V .44 g 766 1777 M -1 2 V .44 g 765 1779 M -7 18 V .44 g 758 1797 M -9 20 V .44 g 749 1817 M -9 21 V .44 g 740 1838 M -2 3 V .44 g 738 1841 M -7 17 V .44 g 731 1858 M -9 20 V .44 g 722 1878 M -9 20 V .44 g 713 1898 M -2 5 V .44 g 711 1903 M -6 15 V .44 g 705 1918 M -9 20 V .44 g 696 1938 M -9 21 V .44 g 687 1959 M -3 7 V .44 g 684 1966 M -6 13 V .44 g 678 1979 M -8 20 V 0 g .44 g 6052 881 M .44 g 6052 881 M -7 -11 V .44 g 6045 870 M -13 -20 V .44 g 6032 850 M -7 -11 V .44 g 6025 839 M -7 -9 V .44 g 6018 830 M -13 -20 V .44 g 6005 810 M -7 -11 V .44 g 5998 799 M -7 -9 V .44 g 5991 790 M -14 -21 V .44 g 5977 769 M -7 -9 V .44 g 5970 760 M -7 -11 V .44 g 5963 749 M -15 -20 V .44 g 5948 729 M -5 -8 V .44 g 5943 721 M -9 -12 V .44 g 5934 709 M -15 -20 V .44 g 5919 689 M -3 -5 V .44 g 5916 684 M -12 -15 V .44 g 5904 669 M -14 -21 V .44 g 5890 648 M -1 -1 V .44 g 5889 647 M -15 -19 V .44 g 5874 628 M -13 -17 V .44 g 5861 611 M -2 -3 V .44 g 5859 608 M -15 -20 V 0 g .42 g 709 1979 M .42 g 709 1979 M -9 20 V .42 g 700 1999 M -9 20 V .42 g 691 2019 M -7 18 V .42 g 684 2037 M -1 2 V stroke 683 2039 M .42 g 683 2039 M -9 20 V .42 g 674 2059 M -9 20 V .42 g 665 2079 M -8 21 V .42 g .42 g 657 2100 M -9 20 V .42 g 648 2120 M -8 20 V .42 g 640 2140 M -9 20 V .42 g 631 2160 M -2 4 V .42 g 629 2164 M -6 16 V .42 g 623 2180 M -9 20 V .42 g 614 2200 M -8 21 V .42 g 606 2221 M -4 8 V 0 g .42 g 1484 588 M .42 g 1484 588 M -10 13 V .42 g 1474 601 M -6 7 V .42 g 1468 608 M -15 20 V .42 g 1453 628 M -6 8 V .42 g 1447 636 M -10 12 V .42 g 1437 648 M -15 21 V .42 g 1422 669 M -2 3 V .42 g 1420 672 M -13 17 V .42 g 1407 689 M -15 20 V .42 g .42 g 1392 709 M -14 20 V .42 g 1378 729 M -13 17 V .42 g 1365 746 M -2 3 V .42 g 1363 749 M -14 20 V .42 g 1349 769 M -11 16 V .42 g 1338 785 M -3 5 V .42 g 1335 790 M -14 20 V .42 g 1321 810 M -10 15 V .42 g 1311 825 M -4 5 V .42 g 1307 830 M -14 20 V .42 g 1293 850 M -10 15 V .42 g 1283 865 M -3 5 V .42 g 1280 870 M -13 20 V .42 g 1267 890 M -11 17 V .42 g 1256 907 M -2 3 V .42 g 1254 910 M -13 21 V .42 g 1241 931 M -12 18 V .42 g 1229 949 M -1 2 V .42 g 1228 951 M -13 20 V .42 g 1215 971 M -12 20 V .42 g 1203 991 M -1 2 V .42 g 1202 993 M -11 18 V .42 g 1191 1011 M -13 20 V .42 g 1178 1031 M -4 7 V .42 g 1174 1038 M -8 14 V .42 g 1166 1052 M -11 20 V .42 g 1155 1072 M -8 12 V .42 g 1147 1084 M -4 8 V .42 g 1143 1092 M -12 20 V .42 g 1131 1112 M -11 20 V .42 g .42 g 1120 1132 M -12 20 V .42 g 1108 1152 M -11 20 V stroke 1097 1172 M .42 g 1097 1172 M -4 8 V .42 g 1093 1180 M -7 13 V .42 g 1086 1193 M -11 20 V .42 g 1075 1213 M -10 17 V .42 g 1065 1230 M -1 3 V .42 g 1064 1233 M -11 20 V .42 g 1053 1253 M -11 20 V .42 g 1042 1273 M -4 8 V .42 g 1038 1281 M -6 12 V .42 g 1032 1293 M -11 21 V .42 g 1021 1314 M -10 19 V .42 g 1011 1333 M -1 1 V .42 g 1010 1334 M -10 20 V .42 g 1000 1354 M -10 20 V .42 g 990 1374 M -6 12 V .42 g 984 1386 M -4 8 V .42 g 980 1394 M -11 20 V .42 g 969 1414 M -10 21 V .42 g 959 1435 M -3 6 V .42 g 956 1441 M -7 14 V .42 g 949 1455 M -10 20 V .42 g 939 1475 M -9 20 V .42 g 930 1495 M -1 1 V .42 g 929 1496 M -9 19 V .42 g 920 1515 M -10 20 V .42 g 910 1535 M -8 18 V .42 g 902 1553 M -2 2 V .42 g 900 1555 M -9 21 V .42 g 891 1576 M -10 20 V .42 g 881 1596 M -6 14 V .42 g 875 1610 M -3 6 V .42 g 872 1616 M -10 20 V .42 g 862 1636 M -9 20 V .42 g 853 1656 M -6 13 V .42 g 847 1669 M -3 7 V .42 g 844 1676 M -10 21 V .42 g 834 1697 M -9 20 V .42 g 825 1717 M -5 11 V .42 g 820 1728 M -4 9 V .42 g 816 1737 M -9 20 V .42 g 807 1757 M -9 20 V .42 g 798 1777 M -5 11 V .42 g 793 1788 M -4 9 V .42 g 789 1797 M -9 20 V .42 g 780 1817 M -9 21 V .42 g 771 1838 M -6 11 V .42 g 765 1849 M -3 9 V .42 g 762 1858 M -9 20 V .42 g 753 1878 M -9 20 V .42 g 744 1898 M -6 13 V .42 g 738 1911 M -3 7 V .42 g 735 1918 M -9 20 V stroke 726 1938 M .42 g 726 1938 M -8 21 V .42 g 718 1959 M -7 15 V .42 g 711 1974 M -2 5 V 0 g .42 g 3821 4619 M .42 g 3821 4619 M -3 -1 V .42 g 3818 4618 M -28 -6 V .42 g 3790 4612 M -27 -5 V .42 g 3763 4607 M -27 -4 V .42 g 3736 4603 M -27 -3 V .42 g 3709 4600 M -24 -1 V .42 g 3685 4599 M -4 0 V .42 g 3681 4599 M -27 -1 V .42 g 3654 4598 M -12 1 V .42 g 3642 4599 M -15 0 V .42 g 3627 4599 M -27 3 V .42 g 3600 4602 M -28 3 V .42 g 3572 4605 M -27 5 V .42 g 3545 4610 M -27 5 V .42 g 3518 4615 M -15 4 V 0 g .42 g 6052 950 M .42 g 6052 950 M -13 -19 V .42 g 6039 931 M -13 -21 V .42 g 6026 910 M -1 -1 V .42 g 6025 909 M -13 -19 V .42 g 6012 890 M -13 -20 V .42 g 5999 870 M -1 -1 V .42 g 5998 869 M -13 -19 V .42 g 5985 850 M -14 -20 V .42 g 5971 830 M -1 -1 V .42 g 5970 829 M -14 -19 V .42 g 5956 810 M -13 -19 V .42 g 5943 791 M -1 -1 V .42 g 5942 790 M -15 -21 V .42 g 5927 769 M -11 -15 V .42 g 5916 754 M -3 -5 V .42 g 5913 749 M -15 -20 V .42 g 5898 729 M -9 -12 V .42 g 5889 717 M -7 -8 V .42 g 5882 709 M -15 -20 V .42 g 5867 689 M -6 -8 V .42 g 5861 681 M -9 -12 V .42 g 5852 669 M -16 -21 V .42 g 5836 648 M -2 -2 V .42 g 5834 646 M -14 -18 V .42 g 5820 628 M -13 -17 V .42 g 5807 611 M -2 -3 V .42 g 5805 608 M -16 -20 V 0 g .4 g 740 1979 M .4 g 740 1979 M -2 4 V .4 g 738 1983 M -7 16 V .4 g 731 1999 M -8 20 V .4 g 723 2019 M -9 20 V .4 g 714 2039 M -3 7 V .4 g 711 2046 M -6 13 V stroke 705 2059 M .4 g 705 2059 M -9 20 V .4 g 696 2079 M -8 21 V .4 g 688 2100 M -4 9 V .4 g 684 2109 M -5 11 V .4 g 679 2120 M -8 20 V .4 g 671 2140 M -9 20 V .4 g 662 2160 M -5 13 V .4 g 657 2173 M -4 7 V .4 g 653 2180 M -8 20 V .4 g 645 2200 M -9 21 V .4 g 636 2221 M -7 16 V .4 g 629 2237 M -1 4 V .4 g 628 2241 M -9 20 V .4 g 619 2261 M -8 20 V .4 g 611 2281 M -9 20 V .4 g 602 2301 M 0 1 V 0 g .4 g 1542 588 M .4 g 1542 588 M -13 17 V .4 g 1529 605 M -3 3 V .4 g 1526 608 M -17 20 V .4 g 1509 628 M -8 10 V .4 g 1501 638 M -8 10 V .4 g 1493 648 M -16 21 V .4 g 1477 669 M -3 4 V .4 g 1474 673 M -12 16 V .4 g 1462 689 M -15 19 V .4 g 1447 708 M -1 1 V .4 g 1446 709 M -15 20 V .4 g 1431 729 M -11 15 V .4 g 1420 744 M -5 5 V .4 g 1415 749 M -15 20 V .4 g 1400 769 M -8 11 V .4 g 1392 780 M -7 10 V .4 g 1385 790 M -14 20 V .4 g 1371 810 M -6 8 V .4 g 1365 818 M -9 12 V .4 g 1356 830 M -14 20 V .4 g 1342 850 M -4 6 V .4 g 1338 856 M -10 14 V .4 g 1328 870 M -14 20 V .4 g 1314 890 M -3 5 V .4 g 1311 895 M -11 15 V .4 g 1300 910 M -13 21 V .4 g 1287 931 M -4 5 V .4 g 1283 936 M -9 15 V .4 g 1274 951 M -14 20 V .4 g 1260 971 M -4 6 V .4 g 1256 977 M -9 14 V .4 g 1247 991 M -13 20 V .4 g 1234 1011 M -5 9 V .4 g 1229 1020 M -7 11 V .4 g 1222 1031 M -13 21 V .4 g 1209 1052 M -7 12 V stroke 1202 1064 M .4 g 1202 1064 M -5 8 V .4 g 1197 1072 M -12 20 V .4 g 1185 1092 M -11 17 V .4 g 1174 1109 M -2 3 V .4 g 1172 1112 M -12 20 V .4 g 1160 1132 M -11 20 V .4 g 1149 1152 M -2 3 V .4 g 1147 1155 M -10 17 V .4 g 1137 1172 M -12 21 V .4 g 1125 1193 M -5 9 V .4 g 1120 1202 M -6 11 V .4 g 1114 1213 M -11 20 V .4 g 1103 1233 M -10 18 V .4 g 1093 1251 M -2 2 V .4 g 1091 1253 M -11 20 V .4 g 1080 1273 M -11 20 V .4 g 1069 1293 M -4 8 V .4 g 1065 1301 M -7 13 V .4 g 1058 1314 M -10 20 V .4 g 1048 1334 M -10 17 V .4 g 1038 1351 M -1 3 V .4 g 1037 1354 M -11 20 V .4 g 1026 1374 M -10 20 V .4 g 1016 1394 M -5 10 V .4 g 1011 1404 M -6 10 V .4 g 1005 1414 M -10 21 V .4 g 995 1435 M -10 20 V .4 g 985 1455 M -1 2 V .4 g 984 1457 M -9 18 V .4 g 975 1475 M -11 20 V .4 g 964 1495 M -8 16 V .4 g 956 1511 M -2 4 V .4 g 954 1515 M -9 20 V .4 g 945 1535 M -10 20 V .4 g 935 1555 M -6 12 V .4 g 929 1567 M -4 9 V .4 g 925 1576 M -10 20 V .4 g 915 1596 M -10 20 V .4 g 905 1616 M -3 7 V .4 g 902 1623 M -6 13 V .4 g 896 1636 M -10 20 V .4 g 886 1656 M -9 20 V .4 g 877 1676 M -2 5 V .4 g 875 1681 M -8 16 V .4 g 867 1697 M -9 20 V .4 g 858 1717 M -9 20 V .4 g 849 1737 M -2 3 V .4 g 847 1740 M -8 17 V .4 g 839 1757 M -9 20 V .4 g 830 1777 M -9 20 V .4 g 821 1797 M -1 2 V .4 g 820 1799 M -8 18 V stroke 812 1817 M .4 g 812 1817 M -9 21 V .4 g 803 1838 M -9 20 V .4 g 794 1858 M -1 2 V .4 g 793 1860 M -8 18 V .4 g 785 1878 M -9 20 V .4 g 776 1898 M -9 20 V .4 g 767 1918 M -2 3 V .4 g 765 1921 M -7 17 V .4 g 758 1938 M -9 21 V .4 g 749 1959 M -9 20 V 0 g .4 g 4011 4619 M .4 g 4011 4619 M -3 -1 V .4 g 4008 4618 M -27 -14 V .4 g 3981 4604 M -12 -5 V .4 g 3969 4599 M -15 -7 V .4 g 3954 4592 M -27 -12 V .4 g 3927 4580 M -5 -1 V .4 g 3922 4579 M -23 -9 V .4 g 3899 4570 M -27 -10 V .4 g 3872 4560 M -5 -1 V .4 g 3867 4559 M -22 -7 V .4 g 3845 4552 M -27 -8 V .4 g 3818 4544 M -26 -6 V .4 g 3792 4538 M -2 0 V .4 g 3790 4538 M -27 -5 V .4 g 3763 4533 M -27 -4 V .4 g 3736 4529 M -27 -3 V .4 g 3709 4526 M -28 -1 V .4 g 3681 4525 M -27 -1 V .4 g 3654 4524 M -27 1 V .4 g 3627 4525 M -27 3 V .4 g 3600 4528 M -28 3 V .4 g 3572 4531 M -27 5 V .4 g 3545 4536 M -12 2 V .4 g 3533 4538 M -15 4 V .4 g 3518 4542 M -27 6 V .4 g 3491 4548 M -28 8 V .4 g 3463 4556 M -6 3 V .4 g 3457 4559 M -21 6 V .4 g 3436 4565 M -27 10 V .4 g 3409 4575 M -9 4 V .4 g 3400 4579 M -18 7 V .4 g 3382 4586 M -28 12 V .4 g 3354 4598 M -2 1 V .4 g 3352 4599 M -25 11 V .4 g 3327 4610 M -18 9 V 0 g .4 g 6052 1021 M .4 g 6052 1021 M -6 -10 V .4 g 6046 1011 M -14 -20 V .4 g 6032 991 M -7 -11 V .4 g 6025 980 M -6 -9 V .4 g 6019 971 M -14 -20 V .4 g 6005 951 M -7 -11 V stroke 5998 940 M .4 g 5998 940 M -7 -9 V .4 g 5991 931 M -14 -21 V .4 g 5977 910 M -7 -9 V .4 g 5970 901 M -7 -11 V .4 g 5963 890 M -15 -20 V .4 g 5948 870 M -5 -8 V .4 g 5943 862 M -9 -12 V .4 g 5934 850 M -15 -20 V .4 g 5919 830 M -3 -5 V .4 g 5916 825 M -12 -15 V .4 g 5904 810 M -15 -20 V .4 g 5889 790 M 0 -1 V .4 g 5889 789 M -15 -20 V .4 g 5874 769 M -13 -16 V .4 g 5861 753 M -2 -4 V .4 g 5859 749 M -16 -20 V .4 g 5843 729 M -9 -11 V .4 g 5834 718 M -7 -9 V .4 g 5827 709 M -16 -20 V .4 g 5811 689 M -4 -6 V .4 g 5807 683 M -12 -14 V .4 g 5795 669 M -15 -20 V .4 g 5780 649 M -1 -1 V .4 g 5779 648 M -16 -20 V .4 g 5763 628 M -11 -13 V .4 g 5752 615 M -6 -7 V .4 g 5746 608 M -16 -20 V 0 g .38 g 781 1959 M .38 g 781 1959 M -8 20 V .38 g 773 1979 M -8 15 V .38 g 765 1994 M -1 5 V .38 g 764 1999 M -9 20 V .38 g 755 2019 M -9 20 V .38 g 746 2039 M -8 18 V .38 g 738 2057 M -1 2 V .38 g 737 2059 M -9 20 V .38 g 728 2079 M -8 21 V .38 g 720 2100 M -9 19 V .38 g 711 2119 M 0 1 V .38 g 711 2120 M -9 20 V .38 g 702 2140 M -8 20 V .38 g 694 2160 M -9 20 V .38 g 685 2180 M -1 3 V .38 g 684 2183 M -8 17 V .38 g 676 2200 M -8 21 V .38 g 668 2221 M -9 20 V .38 g 659 2241 M -2 6 V .38 g 657 2247 M -6 14 V .38 g 651 2261 M -9 20 V .38 g 642 2281 M -8 20 V .38 g 634 2301 M -5 10 V .38 g 629 2311 M -4 10 V .38 g 625 2321 M -8 20 V stroke 617 2341 M .38 g 617 2341 M -9 21 V .38 g 608 2362 M -6 14 V 0 g .38 g 1605 588 M .38 g 1605 588 M -18 20 V .38 g 1587 608 M -4 5 V .38 g 1583 613 M -12 15 V .38 g 1571 628 M -15 18 V .38 g 1556 646 M -2 2 V .38 g 1554 648 M -17 21 V .38 g 1537 669 M -8 10 V .38 g 1529 679 M -9 10 V .38 g 1520 689 M -16 20 V .38 g 1504 709 M -3 3 V .38 g 1501 712 M -13 17 V .38 g 1488 729 M -14 17 V .38 g 1474 746 M -2 3 V .38 g 1472 749 M -16 20 V .38 g 1456 769 M -9 12 V .38 g 1447 781 M -7 9 V .38 g 1440 790 M -15 20 V .38 g 1425 810 M -5 7 V .38 g 1420 817 M -10 13 V .38 g 1410 830 M -15 20 V .38 g 1395 850 M -3 3 V .38 g 1392 853 M -12 17 V .38 g 1380 870 M -15 20 V .38 g 1365 890 M 0 1 V .38 g 1365 891 M -14 19 V .38 g 1351 910 M -13 19 V .38 g 1338 929 M -1 2 V .38 g 1337 931 M -14 20 V .38 g 1323 951 M -12 17 V .38 g 1311 968 M -2 3 V .38 g 1309 971 M -14 20 V .38 g 1295 991 M -12 17 V .38 g 1283 1008 M -2 3 V .38 g 1281 1011 M -13 20 V .38 g 1268 1031 M -12 19 V .38 g 1256 1050 M -1 2 V .38 g 1255 1052 M -13 20 V .38 g 1242 1072 M -13 20 V .38 g .38 g 1229 1092 M -12 20 V .38 g 1217 1112 M -13 20 V .38 g 1204 1132 M -2 4 V .38 g 1202 1136 M -10 16 V .38 g 1192 1152 M -13 20 V .38 g 1179 1172 M -5 9 V .38 g 1174 1181 M -7 12 V .38 g 1167 1193 M -11 20 V .38 g 1156 1213 M -9 14 V .38 g 1147 1227 M -3 6 V .38 g 1144 1233 M -12 20 V .38 g 1132 1253 M -12 20 V stroke 1120 1273 M .38 g 1120 1273 M 0 1 V .38 g 1120 1274 M -11 19 V .38 g 1109 1293 M -11 21 V .38 g 1098 1314 M -5 9 V .38 g 1093 1323 M -6 11 V .38 g 1087 1334 M -11 20 V .38 g 1076 1354 M -11 19 V .38 g 1065 1373 M 0 1 V .38 g 1065 1374 M -11 20 V .38 g 1054 1394 M -11 20 V .38 g 1043 1414 M -5 10 V .38 g 1038 1424 M -6 11 V .38 g 1032 1435 M -10 20 V .38 g 1022 1455 M -11 20 V .38 g 1011 1475 M 0 1 V .38 g 1011 1476 M -10 19 V .38 g 1001 1495 M -10 20 V .38 g 991 1515 M -7 14 V .38 g 984 1529 M -3 6 V .38 g 981 1535 M -11 20 V .38 g 970 1555 M -10 21 V .38 g 960 1576 M -4 8 V .38 g 956 1584 M -6 12 V .38 g 950 1596 M -9 20 V .38 g 941 1616 M -10 20 V .38 g 931 1636 M -2 3 V .38 g 929 1639 M -8 17 V .38 g 921 1656 M -10 20 V .38 g 911 1676 M -9 20 V .38 g 902 1696 M 0 1 V .38 g 902 1697 M -10 20 V .38 g 892 1717 M -9 20 V .38 g 883 1737 M -8 17 V .38 g 875 1754 M -2 3 V .38 g 873 1757 M -9 20 V .38 g 864 1777 M -10 20 V .38 g 854 1797 M -7 16 V .38 g 847 1813 M -2 4 V .38 g 845 1817 M -9 21 V .38 g 836 1838 M -9 20 V .38 g 827 1858 M -7 14 V .38 g 820 1872 M -2 6 V .38 g 818 1878 M -9 20 V .38 g 809 1898 M -10 20 V .38 g 799 1918 M -6 15 V .38 g 793 1933 M -3 5 V .38 g 790 1938 M -9 21 V 0 g .38 g 4143 4619 M .38 g 4143 4619 M -26 -16 V .38 g 4117 4603 M -7 -4 V .38 g 4110 4599 M -20 -12 V .38 g 4090 4587 M -15 -8 V .38 g 4075 4579 M -12 -7 V stroke 4063 4572 M .38 g 4063 4572 M -25 -13 V .38 g 4038 4559 M -2 -2 V .38 g 4036 4557 M -28 -14 V .38 g 4008 4543 M -9 -5 V .38 g 3999 4538 M -18 -9 V .38 g 3981 4529 M -24 -11 V .38 g 3957 4518 M -3 -1 V .38 g 3954 4517 M -27 -12 V .38 g 3927 4505 M -18 -7 V .38 g 3909 4498 M -10 -4 V .38 g 3899 4494 M -27 -9 V .38 g 3872 4485 M -21 -7 V .38 g 3851 4478 M -6 -2 V .38 g 3845 4476 M -27 -8 V .38 g 3818 4468 M -28 -6 V .38 g 3790 4462 M -22 -4 V .38 g 3768 4458 M -5 -1 V .38 g 3763 4457 M -27 -4 V .38 g 3736 4453 M -27 -3 V .38 g 3709 4450 M -28 -1 V .38 g 3681 4449 M -27 -1 V .38 g 3654 4448 M -27 1 V .38 g 3627 4449 M -27 3 V .38 g 3600 4452 M -28 3 V .38 g 3572 4455 M -15 3 V .38 g 3557 4458 M -12 2 V .38 g 3545 4460 M -27 6 V .38 g 3518 4466 M -27 7 V .38 g 3491 4473 M -18 5 V .38 g 3473 4478 M -10 3 V .38 g 3463 4481 M -27 9 V .38 g 3436 4490 M -22 8 V .38 g 3414 4498 M -5 2 V .38 g 3409 4500 M -27 11 V .38 g 3382 4511 M -17 7 V .38 g 3365 4518 M -11 5 V .38 g 3354 4523 M -27 13 V .38 g 3327 4536 M -6 2 V .38 g 3321 4538 M -21 11 V .38 g 3300 4549 M -19 10 V .38 g 3281 4559 M -8 4 V .38 g 3273 4563 M -28 15 V .38 g 3245 4578 M -2 1 V .38 g 3243 4579 M -25 14 V .38 g 3218 4593 M -11 6 V .38 g 3207 4599 M -16 9 V .38 g 3191 4608 M -19 11 V 0 g .38 g 6052 1093 M .38 g 6052 1093 M -1 -1 V .38 g 6051 1092 M -14 -20 V .38 g 6037 1072 M -12 -19 V .38 g 6025 1053 M -1 -1 V .38 g 6024 1052 M -14 -21 V stroke 6010 1031 M .38 g 6010 1031 M -12 -18 V .38 g 5998 1013 M -1 -2 V .38 g 5997 1011 M -15 -20 V .38 g 5982 991 M -12 -17 V .38 g 5970 974 M -2 -3 V .38 g 5968 971 M -14 -20 V .38 g 5954 951 M -11 -15 V .38 g 5943 936 M -4 -5 V .38 g 5939 931 M -15 -21 V .38 g 5924 910 M -8 -11 V .38 g 5916 899 M -6 -9 V .38 g 5910 890 M -16 -20 V .38 g 5894 870 M -5 -8 V .38 g 5889 862 M -10 -12 V .38 g 5879 850 M -15 -20 V .38 g 5864 830 M -3 -3 V .38 g 5861 827 M -13 -17 V .38 g 5848 810 M -14 -18 V .38 g 5834 792 M -2 -2 V .38 g 5832 790 M -16 -21 V .38 g 5816 769 M -9 -12 V .38 g 5807 757 M -7 -8 V .38 g 5800 749 M -16 -20 V .38 g 5784 729 M -4 -6 V .38 g 5780 723 M -12 -14 V .38 g 5768 709 M -16 -19 V .38 g 5752 690 M -1 -1 V .38 g 5751 689 M -16 -20 V .38 g 5735 669 M -10 -12 V .38 g 5725 657 M -7 -9 V .38 g 5718 648 M -17 -20 V .38 g 5701 628 M -3 -4 V .38 g 5698 624 M -14 -16 V .38 g 5684 608 M -13 -17 V .38 g 5671 591 M -3 -3 V 0 g .36 g 824 1938 M .36 g 824 1938 M -4 10 V .36 g 820 1948 M -5 11 V .36 g 815 1959 M -9 20 V .36 g 806 1979 M -9 20 V .36 g 797 1999 M -4 9 V .36 g 793 2008 M -5 11 V .36 g 788 2019 M -9 20 V .36 g 779 2039 M -9 20 V .36 g 770 2059 M -5 11 V .36 g 765 2070 M -4 9 V .36 g 761 2079 M -8 21 V .36 g 753 2100 M -9 20 V .36 g 744 2120 M -6 12 V .36 g 738 2132 M -3 8 V .36 g 735 2140 M -9 20 V .36 g 726 2160 M -8 20 V .36 g 718 2180 M -7 15 V stroke 711 2195 M .36 g 711 2195 M -2 5 V .36 g 709 2200 M -9 21 V .36 g 700 2221 M -8 20 V .36 g 692 2241 M -8 18 V .36 g 684 2259 M -1 2 V .36 g 683 2261 M -9 20 V .36 g 674 2281 M -8 20 V .36 g 666 2301 M -9 20 V .36 g 657 2321 M 0 2 V .36 g 657 2323 M -8 18 V .36 g 649 2341 M -9 21 V .36 g 640 2362 M -8 20 V .36 g 632 2382 M -3 6 V .36 g 629 2388 M -6 14 V .36 g 623 2402 M -8 20 V .36 g 615 2422 M -8 20 V .36 g 607 2442 M -5 11 V 0 g .36 g 1671 588 M .36 g 1671 588 M -6 7 V .36 g 1665 595 M -11 13 V .36 g 1654 608 M -16 19 V .36 g 1638 627 M -2 1 V .36 g 1636 628 M -17 20 V .36 g 1619 648 M -9 10 V .36 g 1610 658 M -9 11 V .36 g 1601 669 M -17 20 V .36 g 1584 689 M -1 1 V .36 g 1583 690 M -16 19 V .36 g 1567 709 M -11 13 V .36 g 1556 722 M -6 7 V .36 g 1550 729 M -17 20 V .36 g 1533 749 M -4 6 V .36 g 1529 755 M -12 14 V .36 g 1517 769 M -16 19 V .36 g 1501 788 M -1 2 V .36 g 1500 790 M -16 20 V .36 g 1484 810 M -10 12 V .36 g 1474 822 M -6 8 V .36 g 1468 830 M -16 20 V .36 g 1452 850 M -5 7 V .36 g 1447 857 M -11 13 V .36 g 1436 870 M -15 20 V .36 g 1421 890 M -1 2 V .36 g 1420 892 M -14 18 V .36 g 1406 910 M -14 18 V .36 g 1392 928 M -1 3 V .36 g 1391 931 M -15 20 V .36 g 1376 951 M -11 15 V .36 g 1365 966 M -4 5 V .36 g 1361 971 M -14 20 V .36 g 1347 991 M -9 13 V .36 g 1338 1004 M -5 7 V .36 g 1333 1011 M -14 20 V stroke 1319 1031 M .36 g 1319 1031 M -8 12 V .36 g 1311 1043 M -6 9 V .36 g 1305 1052 M -14 20 V .36 g 1291 1072 M -8 11 V .36 g 1283 1083 M -6 9 V .36 g 1277 1092 M -13 20 V .36 g 1264 1112 M -8 12 V .36 g 1256 1124 M -5 8 V .36 g 1251 1132 M -13 20 V .36 g 1238 1152 M -9 15 V .36 g 1229 1167 M -4 5 V .36 g 1225 1172 M -12 21 V .36 g 1213 1193 M -11 17 V .36 g 1202 1210 M -2 3 V .36 g 1200 1213 M -12 20 V .36 g 1188 1233 M -12 20 V .36 g 1176 1253 M -2 2 V .36 g 1174 1255 M -10 18 V .36 g 1164 1273 M -12 20 V .36 g 1152 1293 M -5 8 V .36 g 1147 1301 M -7 13 V .36 g 1140 1314 M -12 20 V .36 g 1128 1334 M -8 15 V .36 g 1120 1349 M -3 5 V .36 g 1117 1354 M -11 20 V .36 g 1106 1374 M -12 20 V .36 g 1094 1394 M -1 3 V .36 g 1093 1397 M -10 17 V .36 g 1083 1414 M -11 21 V .36 g 1072 1435 M -7 12 V .36 g 1065 1447 M -4 8 V .36 g 1061 1455 M -11 20 V .36 g 1050 1475 M -10 20 V .36 g 1040 1495 M -2 3 V .36 g 1038 1498 M -9 17 V .36 g 1029 1515 M -10 20 V .36 g 1019 1535 M -8 15 V .36 g 1011 1550 M -3 5 V .36 g 1008 1555 M -10 21 V .36 g 998 1576 M -10 20 V .36 g 988 1596 M -4 8 V .36 g 984 1604 M -7 12 V .36 g 977 1616 M -10 20 V .36 g 967 1636 M -10 20 V .36 g 957 1656 M -1 2 V .36 g 956 1658 M -9 18 V .36 g 947 1676 M -9 21 V .36 g 938 1697 M -9 17 V .36 g 929 1714 M -1 3 V .36 g 928 1717 M -10 20 V .36 g 918 1737 M -10 20 V .36 g 908 1757 M -6 14 V stroke 902 1771 M .36 g 902 1771 M -3 6 V .36 g 899 1777 M -10 20 V .36 g 889 1797 M -9 20 V .36 g 880 1817 M -5 12 V .36 g 875 1829 M -5 9 V .36 g 870 1838 M -9 20 V .36 g 861 1858 M -9 20 V .36 g 852 1878 M -5 10 V .36 g 847 1888 M -4 10 V .36 g 843 1898 M -10 20 V .36 g 833 1918 M -9 20 V 0 g .36 g 4261 4619 M .36 g 4261 4619 M -7 -5 V .36 g 4254 4614 M -23 -15 V .36 g 4231 4599 M -5 -3 V .36 g 4226 4596 M -26 -17 V .36 g 4200 4579 M -1 -1 V .36 g 4199 4578 M -27 -17 V .36 g 4172 4561 M -4 -2 V .36 g 4168 4559 M -23 -15 V .36 g 4145 4544 M -9 -6 V .36 g 4136 4538 M -19 -11 V .36 g 4117 4527 M -15 -9 V .36 g 4102 4518 M -12 -7 V .36 g 4090 4511 M -22 -13 V .36 g 4068 4498 M -5 -3 V .36 g 4063 4495 M -27 -15 V .36 g 4036 4480 M -5 -2 V .36 g 4031 4478 M -23 -12 V .36 g 4008 4466 M -16 -8 V .36 g 3992 4458 M -11 -6 V .36 g 3981 4452 M -27 -13 V .36 g 3954 4439 M -4 -1 V .36 g 3950 4438 M -23 -10 V .36 g 3927 4428 M -26 -11 V .36 g 3901 4417 M -2 0 V .36 g 3899 4417 M -27 -10 V .36 g 3872 4407 M -27 -9 V .36 g 3845 4398 M -3 -1 V .36 g 3842 4397 M -24 -7 V .36 g 3818 4390 M -28 -6 V .36 g 3790 4384 M -27 -6 V .36 g 3763 4378 M -9 -1 V .36 g 3754 4377 M -18 -3 V .36 g 3736 4374 M -27 -2 V .36 g 3709 4372 M -28 -2 V .36 g 3681 4370 M -27 0 V .36 g 3654 4370 M -27 1 V .36 g 3627 4371 M -27 2 V .36 g 3600 4373 M -28 4 V .36 g 3572 4377 M -1 0 V .36 g 3571 4377 M -26 5 V .36 g 3545 4382 M -27 6 V stroke 3518 4388 M .36 g 3518 4388 M -27 7 V .36 g 3491 4395 M -8 2 V .36 g 3483 4397 M -20 6 V .36 g 3463 4403 M -27 9 V .36 g 3436 4412 M -13 5 V .36 g 3423 4417 M -14 6 V .36 g 3409 4423 M -27 11 V .36 g 3382 4434 M -9 4 V .36 g 3373 4438 M -19 8 V .36 g 3354 4446 M -25 12 V .36 g 3329 4458 M -2 1 V .36 g 3327 4459 M -27 13 V .36 g 3300 4472 M -11 6 V .36 g 3289 4478 M -16 9 V .36 g 3273 4487 M -22 11 V .36 g 3251 4498 M -6 3 V .36 g 3245 4501 M -27 16 V .36 g 3218 4517 M -3 1 V .36 g 3215 4518 M -24 14 V .36 g 3191 4532 M -11 6 V .36 g 3180 4538 M -16 10 V .36 g 3164 4548 M -18 11 V .36 g 3146 4559 M -10 6 V .36 g 3136 4565 M -23 14 V .36 g 3113 4579 M -4 2 V .36 g 3109 4581 M -27 17 V .36 g 3082 4598 M -2 1 V .36 g 3080 4599 M -25 15 V .36 g 3055 4614 M -8 5 V 0 g .36 g 6052 1168 M .36 g 6052 1168 M -11 -16 V .36 g 6041 1152 M -13 -20 V .36 g 6028 1132 M -3 -5 V .36 g 6025 1127 M -11 -15 V .36 g 6014 1112 M -14 -20 V .36 g 6000 1092 M -2 -4 V .36 g 5998 1088 M -12 -16 V .36 g 5986 1072 M -14 -20 V .36 g 5972 1052 M -2 -3 V .36 g 5970 1049 M -12 -18 V .36 g 5958 1031 M -15 -20 V .36 g .36 g 5943 1011 M -15 -20 V .36 g 5928 991 M -12 -17 V .36 g 5916 974 M -3 -3 V .36 g 5913 971 M -15 -20 V .36 g 5898 951 M -9 -13 V .36 g 5889 938 M -6 -7 V .36 g 5883 931 M -16 -21 V .36 g 5867 910 M -6 -8 V .36 g 5861 902 M -9 -12 V .36 g 5852 890 M -16 -20 V .36 g 5836 870 M -2 -2 V .36 g 5834 868 M -14 -18 V stroke 5820 850 M .36 g 5820 850 M -13 -17 V .36 g 5807 833 M -3 -3 V .36 g 5804 830 M -16 -20 V .36 g 5788 810 M -8 -10 V .36 g 5780 800 M -9 -10 V .36 g 5771 790 M -16 -21 V .36 g 5755 769 M -3 -2 V .36 g 5752 767 M -14 -18 V .36 g 5738 749 M -13 -15 V .36 g 5725 734 M -4 -5 V .36 g 5721 729 M -17 -20 V .36 g 5704 709 M -6 -8 V .36 g 5698 701 M -11 -12 V .36 g 5687 689 M -16 -20 V .36 g 5671 669 M -1 0 V .36 g 5670 669 M -17 -21 V .36 g 5653 648 M -10 -12 V .36 g 5643 636 M -7 -8 V .36 g 5636 628 M -17 -20 V .36 g 5619 608 M -3 -4 V .36 g 5616 604 M -14 -16 V 0 g .34 g 869 1918 M .34 g 869 1918 M -9 20 V .34 g 860 1938 M -10 21 V .34 g 850 1959 M -3 6 V .34 g 847 1965 M -6 14 V .34 g 841 1979 M -9 20 V .34 g 832 1999 M -9 20 V .34 g 823 2019 M -3 6 V .34 g 820 2025 M -6 14 V .34 g 814 2039 M -9 20 V .34 g 805 2059 M -9 20 V .34 g 796 2079 M -3 7 V .34 g 793 2086 M -6 14 V .34 g 787 2100 M -9 20 V .34 g 778 2120 M -9 20 V .34 g 769 2140 M -4 8 V .34 g 765 2148 M -5 12 V .34 g 760 2160 M -9 20 V .34 g 751 2180 M -8 20 V .34 g 743 2200 M -5 10 V .34 g 738 2210 M -4 11 V .34 g 734 2221 M -9 20 V .34 g 725 2241 M -8 20 V .34 g 717 2261 M -6 13 V .34 g 711 2274 M -3 7 V .34 g 708 2281 M -9 20 V .34 g 699 2301 M -8 20 V .34 g 691 2321 M -7 16 V .34 g 684 2337 M -2 4 V .34 g 682 2341 M -8 21 V .34 g 674 2362 M -9 20 V .34 g 665 2382 M -8 20 V stroke 657 2402 M .34 g 657 2402 M -9 20 V .34 g 648 2422 M -8 20 V .34 g 640 2442 M -9 20 V .34 g 631 2462 M -2 5 V .34 g 629 2467 M -6 16 V .34 g 623 2483 M -9 20 V .34 g 614 2503 M -8 20 V .34 g 606 2523 M -4 9 V 0 g .34 g 1742 588 M .34 g 1742 588 M -18 20 V .34 g 1724 608 M -5 5 V .34 g 1719 613 M -13 15 V .34 g 1706 628 M -14 16 V .34 g 1692 644 M -4 4 V .34 g 1688 648 M -18 21 V .34 g 1670 669 M -5 6 V .34 g 1665 675 M -12 14 V .34 g 1653 689 M -15 17 V .34 g 1638 706 M -3 3 V .34 g 1635 709 M -18 20 V .34 g 1617 729 M -7 8 V .34 g 1610 737 M -10 12 V .34 g 1600 749 M -17 20 V .34 g 1583 769 M -1 0 V .34 g 1582 769 M -17 21 V .34 g 1565 790 M -9 11 V .34 g 1556 801 M -8 9 V .34 g 1548 810 M -17 20 V .34 g 1531 830 M -2 3 V .34 g 1529 833 M -14 17 V .34 g 1515 850 M -14 16 V .34 g 1501 866 M -3 4 V .34 g 1498 870 M -16 20 V .34 g 1482 890 M -8 10 V .34 g 1474 900 M -8 10 V .34 g 1466 910 M -16 21 V .34 g 1450 931 M -3 3 V .34 g 1447 934 M -13 17 V .34 g 1434 951 M -14 19 V .34 g 1420 970 M -1 1 V .34 g 1419 971 M -16 20 V .34 g 1403 991 M -11 15 V .34 g 1392 1006 M -4 5 V .34 g 1388 1011 M -15 20 V .34 g 1373 1031 M -8 12 V .34 g 1365 1043 M -6 9 V .34 g 1359 1052 M -15 20 V .34 g 1344 1072 M -6 9 V .34 g 1338 1081 M -8 11 V .34 g 1330 1092 M -14 20 V .34 g 1316 1112 M -5 8 V .34 g 1311 1120 M -9 12 V .34 g 1302 1132 M -14 20 V stroke 1288 1152 M .34 g 1288 1152 M -5 8 V .34 g 1283 1160 M -8 12 V .34 g 1275 1172 M -13 21 V .34 g 1262 1193 M -6 8 V .34 g 1256 1201 M -8 12 V .34 g 1248 1213 M -13 20 V .34 g 1235 1233 M -6 10 V .34 g 1229 1243 M -6 10 V .34 g 1223 1253 M -13 20 V .34 g 1210 1273 M -8 14 V .34 g 1202 1287 M -4 6 V .34 g 1198 1293 M -13 21 V .34 g 1185 1314 M -11 18 V .34 g 1174 1332 M -1 2 V .34 g 1173 1334 M -12 20 V .34 g 1161 1354 M -12 20 V .34 g 1149 1374 M -2 4 V .34 g 1147 1378 M -9 16 V .34 g 1138 1394 M -12 20 V .34 g 1126 1414 M -6 11 V .34 g 1120 1425 M -6 10 V .34 g 1114 1435 M -11 20 V .34 g 1103 1455 M -10 18 V .34 g 1093 1473 M -1 2 V .34 g 1092 1475 M -11 20 V .34 g 1081 1495 M -11 20 V .34 g 1070 1515 M -5 8 V .34 g 1065 1523 M -6 12 V .34 g 1059 1535 M -11 20 V .34 g 1048 1555 M -10 19 V .34 g 1038 1574 M -1 2 V .34 g 1037 1576 M -10 20 V .34 g 1027 1596 M -11 20 V .34 g 1016 1616 M -5 11 V .34 g 1011 1627 M -5 9 V .34 g 1006 1636 M -10 20 V .34 g 996 1656 M -11 20 V .34 g 985 1676 M -1 4 V .34 g 984 1680 M -9 17 V .34 g 975 1697 M -10 20 V .34 g 965 1717 M -9 18 V .34 g 956 1735 M -1 2 V .34 g 955 1737 M -9 20 V .34 g 946 1757 M -10 20 V .34 g 936 1777 M -7 14 V .34 g 929 1791 M -3 6 V .34 g 926 1797 M -10 20 V .34 g 916 1817 M -9 21 V .34 g 907 1838 M -5 10 V .34 g 902 1848 M -5 10 V .34 g 897 1858 M -9 20 V .34 g 888 1878 M -10 20 V stroke 878 1898 M .34 g 878 1898 M -3 8 V .34 g 875 1906 M -6 12 V 0 g .34 g 4377 4619 M .34 g 4377 4619 M -14 -10 V .34 g 4363 4609 M -16 -10 V .34 g 4347 4599 M -12 -8 V .34 g 4335 4591 M -18 -12 V .34 g 4317 4579 M -9 -6 V .34 g 4308 4573 M -22 -14 V .34 g 4286 4559 M -5 -4 V .34 g 4281 4555 M -25 -17 V .34 g 4256 4538 M -2 -1 V .34 g 4254 4537 M -28 -18 V .34 g 4226 4519 M 0 -1 V .34 g 4226 4518 M -27 -17 V .34 g 4199 4501 M -4 -3 V .34 g 4195 4498 M -23 -15 V .34 g 4172 4483 M -8 -5 V .34 g 4164 4478 M -19 -12 V .34 g 4145 4466 M -13 -8 V .34 g 4132 4458 M -15 -9 V .34 g 4117 4449 M -18 -11 V .34 g 4099 4438 M -9 -6 V .34 g 4090 4432 M -26 -15 V .34 g 4064 4417 M -1 -1 V .34 g 4063 4416 M -27 -15 V .34 g 4036 4401 M -8 -4 V .34 g 4028 4397 M -20 -10 V .34 g 4008 4387 M -18 -10 V .34 g 3990 4377 M -9 -4 V .34 g 3981 4373 M -27 -13 V .34 g 3954 4360 M -7 -3 V .34 g 3947 4357 M -20 -9 V .34 g 3927 4348 M -27 -11 V .34 g 3900 4337 M -1 0 V .34 g 3899 4337 M -27 -11 V .34 g 3872 4326 M -27 -8 V .34 g 3845 4318 M -3 -1 V .34 g 3842 4317 M -24 -7 V .34 g 3818 4310 M -28 -7 V .34 g 3790 4303 M -27 -5 V .34 g 3763 4298 M -8 -1 V .34 g 3755 4297 M -19 -3 V .34 g 3736 4294 M -27 -3 V .34 g 3709 4291 M -28 -2 V .34 g 3681 4289 M -27 0 V .34 g 3654 4289 M -27 1 V .34 g 3627 4290 M -27 3 V .34 g 3600 4293 M -28 3 V .34 g 3572 4296 M -1 1 V .34 g 3571 4297 M -26 4 V .34 g 3545 4301 M -27 6 V .34 g 3518 4307 M -27 8 V stroke 3491 4315 M .34 g 3491 4315 M -7 2 V .34 g 3484 4317 M -21 6 V .34 g 3463 4323 M -27 9 V .34 g 3436 4332 M -11 5 V .34 g 3425 4337 M -16 6 V .34 g 3409 4343 M -27 11 V .34 g 3382 4354 M -6 3 V .34 g 3376 4357 M -22 10 V .34 g 3354 4367 M -22 10 V .34 g 3332 4377 M -5 3 V .34 g 3327 4380 M -27 14 V .34 g 3300 4394 M -7 3 V .34 g 3293 4397 M -20 11 V .34 g 3273 4408 M -18 9 V .34 g 3255 4417 M -10 6 V .34 g 3245 4423 M -26 15 V .34 g 3219 4438 M -1 0 V .34 g 3218 4438 M -27 16 V .34 g 3191 4454 M -6 4 V .34 g 3185 4458 M -21 13 V .34 g 3164 4471 M -13 7 V .34 g 3151 4478 M -15 9 V .34 g 3136 4487 M -18 11 V .34 g 3118 4498 M -9 6 V .34 g 3109 4504 M -23 14 V .34 g 3086 4518 M -4 3 V .34 g 3082 4521 M -27 16 V .34 g 3055 4537 M -2 1 V .34 g 3053 4538 M -26 16 V .34 g 3027 4554 M -6 5 V .34 g 3021 4559 M -21 12 V .34 g 3000 4571 M -12 8 V .34 g 2988 4579 M -15 9 V .34 g 2973 4588 M -18 11 V .34 g 2955 4599 M -9 6 V .34 g 2946 4605 M -24 14 V 0 g .34 g 6052 1245 M .34 g 6052 1245 M -8 -12 V .34 g 6044 1233 M -14 -20 V .34 g 6030 1213 M -5 -9 V .34 g 6025 1204 M -8 -11 V .34 g 6017 1193 M -14 -21 V .34 g 6003 1172 M -5 -7 V .34 g 5998 1165 M -9 -13 V .34 g 5989 1152 M -14 -20 V .34 g 5975 1132 M -5 -6 V .34 g 5970 1126 M -10 -14 V .34 g 5960 1112 M -15 -20 V .34 g 5945 1092 M -2 -4 V .34 g 5943 1088 M -12 -16 V .34 g 5931 1072 M -15 -20 V .34 g .34 g 5916 1052 M -16 -21 V .34 g 5900 1031 M -11 -15 V stroke 5889 1016 M .34 g 5889 1016 M -4 -5 V .34 g 5885 1011 M -16 -20 V .34 g 5869 991 M -8 -11 V .34 g 5861 980 M -7 -9 V .34 g 5854 971 M -16 -20 V .34 g 5838 951 M -4 -5 V .34 g 5834 946 M -12 -15 V .34 g 5822 931 M -15 -19 V .34 g 5807 912 M -1 -2 V .34 g 5806 910 M -17 -20 V .34 g 5789 890 M -9 -11 V .34 g 5780 879 M -7 -9 V .34 g 5773 870 M -17 -20 V .34 g 5756 850 M -4 -4 V .34 g 5752 846 M -13 -16 V .34 g 5739 830 M -14 -17 V .34 g 5725 813 M -3 -3 V .34 g 5722 810 M -17 -20 V .34 g 5705 790 M -7 -9 V .34 g 5698 781 M -10 -12 V .34 g 5688 769 M -17 -20 V .34 g 5671 749 M 0 -1 V .34 g 5671 748 M -17 -19 V .34 g 5654 729 M -11 -13 V .34 g 5643 716 M -6 -7 V .34 g 5637 709 M -17 -20 V .34 g 5620 689 M -4 -5 V .34 g 5616 684 M -14 -15 V .34 g 5602 669 M -13 -17 V .34 g 5589 652 M -4 -4 V .34 g 5585 648 M -17 -20 V .34 g 5568 628 M -6 -7 V .34 g 5562 621 M -11 -13 V .34 g 5551 608 M -17 -20 V .34 g 0 g .32 g 916 1898 M .32 g 916 1898 M -10 20 V .32 g 906 1918 M -4 9 V .32 g 902 1927 M -6 11 V .32 g 896 1938 M -9 21 V .32 g 887 1959 M -9 20 V .32 g 878 1979 M -3 6 V .32 g 875 1985 M -7 14 V .32 g 868 1999 M -9 20 V .32 g 859 2019 M -9 20 V .32 g 850 2039 M -3 5 V .32 g 847 2044 M -6 15 V .32 g 841 2059 M -10 20 V .32 g 831 2079 M -9 21 V .32 g 822 2100 M -2 5 V .32 g 820 2105 M -7 15 V .32 g 813 2120 M -9 20 V .32 g 804 2140 M -9 20 V .32 g 795 2160 M -2 6 V stroke 793 2166 M .32 g 793 2166 M -7 14 V .32 g 786 2180 M -8 20 V .32 g 778 2200 M -9 21 V .32 g 769 2221 M -4 7 V .32 g 765 2228 M -5 13 V .32 g 760 2241 M -9 20 V .32 g 751 2261 M -9 20 V .32 g 742 2281 M -4 10 V .32 g 738 2291 M -4 10 V .32 g 734 2301 M -9 20 V .32 g 725 2321 M -8 20 V .32 g 717 2341 M -6 13 V .32 g 711 2354 M -3 8 V .32 g 708 2362 M -9 20 V .32 g 699 2382 M -8 20 V .32 g 691 2402 M -7 16 V .32 g 684 2418 M -2 4 V .32 g 682 2422 M -8 20 V .32 g 674 2442 M -9 20 V .32 g 665 2462 M -8 21 V .32 g .32 g 657 2483 M -9 20 V .32 g 648 2503 M -8 20 V .32 g 640 2523 M -9 20 V .32 g 631 2543 M -2 5 V .32 g 629 2548 M -6 15 V .32 g 623 2563 M -8 20 V .32 g 615 2583 M -9 21 V .32 g 606 2604 M -4 10 V 0 g .32 g 1816 588 M .32 g 1816 588 M -15 17 V .32 g 1801 605 M -3 3 V .32 g 1798 608 M -18 20 V .32 g 1780 628 M -6 7 V .32 g 1774 635 M -12 13 V .32 g 1762 648 M -15 18 V .32 g 1747 666 M -3 3 V .32 g 1744 669 M -18 20 V .32 g 1726 689 M -7 7 V .32 g 1719 696 M -11 13 V .32 g 1708 709 M -16 17 V .32 g 1692 726 M -2 3 V .32 g 1690 729 M -18 20 V .32 g 1672 749 M -7 8 V .32 g 1665 757 M -11 12 V .32 g 1654 769 M -16 19 V .32 g 1638 788 M -2 2 V .32 g 1636 790 M -18 20 V .32 g 1618 810 M -8 9 V .32 g 1610 819 M -9 11 V .32 g 1601 830 M -18 20 V .32 g .32 g 1583 850 M -17 20 V .32 g 1566 870 M -10 12 V .32 g 1556 882 M -7 8 V stroke 1549 890 M .32 g 1549 890 M -17 20 V .32 g 1532 910 M -3 4 V .32 g 1529 914 M -14 17 V .32 g 1515 931 M -14 16 V .32 g 1501 947 M -3 4 V .32 g 1498 951 M -16 20 V .32 g 1482 971 M -8 9 V .32 g 1474 980 M -8 11 V .32 g 1466 991 M -17 20 V .32 g 1449 1011 M -2 4 V .32 g 1447 1015 M -13 16 V .32 g 1434 1031 M -14 19 V .32 g 1420 1050 M -2 2 V .32 g 1418 1052 M -15 20 V .32 g 1403 1072 M -11 13 V .32 g 1392 1085 M -4 7 V .32 g 1388 1092 M -15 20 V .32 g 1373 1112 M -8 10 V .32 g 1365 1122 M -7 10 V .32 g 1358 1132 M -15 20 V .32 g 1343 1152 M -5 8 V .32 g 1338 1160 M -9 12 V .32 g 1329 1172 M -14 21 V .32 g 1315 1193 M -4 6 V .32 g 1311 1199 M -10 14 V .32 g 1301 1213 M -14 20 V .32 g 1287 1233 M -4 6 V .32 g 1283 1239 M -9 14 V .32 g 1274 1253 M -14 20 V .32 g 1260 1273 M -4 7 V .32 g 1256 1280 M -9 13 V .32 g 1247 1293 M -13 21 V .32 g 1234 1314 M -5 8 V .32 g 1229 1322 M -8 12 V .32 g 1221 1334 M -12 20 V .32 g 1209 1354 M -7 12 V .32 g 1202 1366 M -6 8 V .32 g 1196 1374 M -12 20 V .32 g 1184 1394 M -10 16 V .32 g 1174 1410 M -2 4 V .32 g 1172 1414 M -12 21 V .32 g 1160 1435 M -12 20 V .32 g 1148 1455 M -1 1 V .32 g 1147 1456 M -11 19 V .32 g 1136 1475 M -11 20 V .32 g 1125 1495 M -5 9 V .32 g 1120 1504 M -7 11 V .32 g 1113 1515 M -11 20 V .32 g 1102 1535 M -9 17 V .32 g 1093 1552 M -2 3 V .32 g 1091 1555 M -11 21 V .32 g 1080 1576 M -11 20 V stroke 1069 1596 M .32 g 1069 1596 M -4 6 V .32 g 1065 1602 M -7 14 V .32 g 1058 1616 M -11 20 V .32 g 1047 1636 M -9 17 V .32 g 1038 1653 M -2 3 V .32 g 1036 1656 M -10 20 V .32 g 1026 1676 M -11 21 V .32 g 1015 1697 M -4 8 V .32 g 1011 1705 M -6 12 V .32 g 1005 1717 M -10 20 V .32 g 995 1737 M -10 20 V .32 g 985 1757 M -1 2 V .32 g 984 1759 M -9 18 V .32 g 975 1777 M -11 20 V .32 g 964 1797 M -8 17 V .32 g 956 1814 M -2 3 V .32 g 954 1817 M -9 21 V .32 g 945 1838 M -10 20 V .32 g 935 1858 M -6 12 V .32 g 929 1870 M -4 8 V .32 g 925 1878 M -9 20 V 0 g .32 g 2864 4575 M .32 g 2864 4575 M -6 4 V .32 g 2858 4579 M -21 12 V .32 g 2837 4591 M -14 8 V .32 g 2823 4599 M -14 8 V .32 g 2809 4607 M -21 12 V 0 g .32 g 4498 4619 M .32 g 4498 4619 M -26 -17 V .32 g 4472 4602 M -5 -3 V .32 g 4467 4599 M -23 -15 V .32 g 4444 4584 M -8 -5 V .32 g 4436 4579 M -19 -13 V .32 g 4417 4566 M -12 -7 V .32 g 4405 4559 M -15 -11 V .32 g 4390 4548 M -15 -10 V .32 g 4375 4538 M -12 -8 V .32 g 4363 4530 M -18 -12 V .32 g 4345 4518 M -10 -6 V .32 g 4335 4512 M -20 -14 V .32 g 4315 4498 M -7 -4 V .32 g 4308 4494 M -23 -16 V .32 g 4285 4478 M -4 -3 V .32 g 4281 4475 M -26 -17 V .32 g 4255 4458 M -1 -1 V .32 g 4254 4457 M -28 -18 V .32 g 4226 4439 M -1 -1 V .32 g 4225 4438 M -26 -17 V .32 g 4199 4421 M -5 -4 V .32 g 4194 4417 M -22 -14 V .32 g 4172 4403 M -9 -6 V .32 g 4163 4397 M -18 -12 V .32 g 4145 4385 M -13 -8 V stroke 4132 4377 M .32 g 4132 4377 M -15 -9 V .32 g 4117 4368 M -18 -11 V .32 g 4099 4357 M -9 -6 V .32 g 4090 4351 M -24 -14 V .32 g 4066 4337 M -3 -2 V .32 g 4063 4335 M -27 -15 V .32 g 4036 4320 M -6 -3 V .32 g 4030 4317 M -22 -12 V .32 g 4008 4305 M -16 -8 V .32 g 3992 4297 M -11 -6 V .32 g 3981 4291 M -27 -14 V .32 g 3954 4277 M -3 -1 V .32 g 3951 4276 M -24 -11 V .32 g 3927 4265 M -22 -9 V .32 g 3905 4256 M -6 -2 V .32 g 3899 4254 M -27 -10 V .32 g 3872 4244 M -23 -8 V .32 g 3849 4236 M -4 -2 V .32 g 3845 4234 M -27 -7 V .32 g 3818 4227 M -28 -7 V .32 g 3790 4220 M -19 -4 V .32 g 3771 4216 M -8 -2 V .32 g 3763 4214 M -27 -4 V .32 g 3736 4210 M -27 -3 V .32 g 3709 4207 M -28 -1 V .32 g 3681 4206 M -27 0 V .32 g 3654 4206 M -27 1 V .32 g 3627 4207 M -27 2 V .32 g 3600 4209 M -28 4 V .32 g 3572 4213 M -16 3 V .32 g 3556 4216 M -11 2 V .32 g 3545 4218 M -27 6 V .32 g 3518 4224 M -27 8 V .32 g 3491 4232 M -14 4 V .32 g 3477 4236 M -14 4 V .32 g 3463 4240 M -27 10 V .32 g 3436 4250 M -16 6 V .32 g 3420 4256 M -11 5 V .32 g 3409 4261 M -27 11 V .32 g 3382 4272 M -10 4 V .32 g 3372 4276 M -18 9 V .32 g 3354 4285 M -24 12 V .32 g 3330 4297 M -3 1 V .32 g 3327 4298 M -27 14 V .32 g 3300 4312 M -9 5 V .32 g 3291 4317 M -18 10 V .32 g 3273 4327 M -18 10 V .32 g 3255 4337 M -10 5 V .32 g 3245 4342 M -26 15 V .32 g 3219 4357 M -1 1 V .32 g 3218 4358 M -27 16 V .32 g 3191 4374 M -6 3 V stroke 3185 4377 M .32 g 3185 4377 M -21 13 V .32 g 3164 4390 M -12 7 V .32 g 3152 4397 M -16 10 V .32 g 3136 4407 M -16 10 V .32 g 3120 4417 M -11 7 V .32 g 3109 4424 M -22 14 V .32 g 3087 4438 M -5 3 V .32 g 3082 4441 M -27 17 V .32 g .32 g 3055 4458 M -28 17 V .32 g 3027 4475 M -4 3 V .32 g 3023 4478 M -23 14 V .32 g 3000 4492 M -9 6 V .32 g 2991 4498 M -18 11 V .32 g 2973 4509 M -15 9 V .32 g 2958 4518 M -12 8 V .32 g 2946 4526 M -21 12 V .32 g 2925 4538 M -7 5 V .32 g 2918 4543 M -26 16 V .32 g 2892 4559 M -1 0 V .32 g 2891 4559 M -27 16 V 0 g .32 g 6052 1324 M .32 g 6052 1324 M -7 -10 V .32 g 6045 1314 M -14 -21 V .32 g 6031 1293 M -6 -9 V .32 g 6025 1284 M -7 -11 V .32 g 6018 1273 M -14 -20 V .32 g 6004 1253 M -6 -9 V .32 g 5998 1244 M -8 -11 V .32 g 5990 1233 M -15 -20 V .32 g 5975 1213 M -5 -7 V .32 g 5970 1206 M -9 -13 V .32 g 5961 1193 M -15 -21 V .32 g 5946 1172 M -3 -4 V .32 g 5943 1168 M -12 -16 V .32 g 5931 1152 M -15 -20 V .32 g .32 g 5916 1132 M -15 -20 V .32 g 5901 1112 M -12 -16 V .32 g 5889 1096 M -4 -4 V .32 g 5885 1092 M -15 -20 V .32 g 5870 1072 M -9 -11 V .32 g 5861 1061 M -7 -9 V .32 g 5854 1052 M -16 -21 V .32 g 5838 1031 M -4 -4 V .32 g 5834 1027 M -13 -16 V .32 g 5821 1011 M -14 -18 V .32 g 5807 993 M -2 -2 V .32 g 5805 991 M -16 -20 V .32 g 5789 971 M -9 -11 V .32 g 5780 960 M -8 -9 V .32 g 5772 951 M -17 -20 V .32 g 5755 931 M -3 -4 V .32 g 5752 927 M -14 -17 V .32 g 5738 910 M -13 -15 V stroke 5725 895 M .32 g 5725 895 M -4 -5 V .32 g 5721 890 M -17 -20 V .32 g 5704 870 M -6 -7 V .32 g 5698 863 M -11 -13 V .32 g 5687 850 M -16 -19 V .32 g 5671 831 M -1 -1 V .32 g 5670 830 M -17 -20 V .32 g 5653 810 M -10 -11 V .32 g 5643 799 M -8 -9 V .32 g 5635 790 M -17 -21 V .32 g 5618 769 M -2 -2 V .32 g 5616 767 M -15 -18 V .32 g 5601 749 M -12 -14 V .32 g 5589 735 M -6 -6 V .32 g 5583 729 M -17 -20 V .32 g 5566 709 M -4 -5 V .32 g 5562 704 M -13 -15 V .32 g 5549 689 M -15 -17 V .32 g 5534 672 M -2 -3 V .32 g 5532 669 M -17 -21 V .32 g 5515 648 M -8 -8 V .32 g 5507 640 M -10 -12 V .32 g 5497 628 M -16 -20 V .32 g 5481 608 M -1 -1 V .32 g 5480 607 M -16 -19 V 0 g .3 g 956 1895 M .3 g 956 1895 M -1 3 V .3 g 955 1898 M -10 20 V .3 g 945 1918 M -10 20 V .3 g 935 1938 M -6 13 V .3 g 929 1951 M -3 8 V .3 g 926 1959 M -10 20 V .3 g 916 1979 M -10 20 V .3 g 906 1999 M -4 10 V .3 g 902 2009 M -5 10 V .3 g 897 2019 M -9 20 V .3 g 888 2039 M -10 20 V .3 g 878 2059 M -3 8 V .3 g 875 2067 M -6 12 V .3 g 869 2079 M -9 21 V .3 g 860 2100 M -10 20 V .3 g 850 2120 M -3 7 V .3 g 847 2127 M -6 13 V .3 g 841 2140 M -9 20 V .3 g 832 2160 M -9 20 V .3 g 823 2180 M -3 7 V .3 g 820 2187 M -6 13 V .3 g 814 2200 M -9 21 V .3 g 805 2221 M -9 20 V .3 g 796 2241 M -3 8 V .3 g 793 2249 M -6 12 V .3 g 787 2261 M -8 20 V .3 g 779 2281 M -9 20 V stroke 770 2301 M .3 g 770 2301 M -5 10 V .3 g 765 2311 M -4 10 V .3 g 761 2321 M -9 20 V .3 g 752 2341 M -8 21 V .3 g 744 2362 M -6 12 V .3 g 738 2374 M -3 8 V .3 g 735 2382 M -9 20 V .3 g 726 2402 M -8 20 V .3 g 718 2422 M -7 16 V .3 g 711 2438 M -2 4 V .3 g 709 2442 M -8 20 V .3 g 701 2462 M -9 21 V .3 g 692 2483 M -8 19 V .3 g 684 2502 M -1 1 V .3 g 683 2503 M -8 20 V .3 g 675 2523 M -8 20 V .3 g 667 2543 M -9 20 V .3 g 658 2563 M -1 4 V .3 g 657 2567 M -7 16 V .3 g 650 2583 M -9 21 V .3 g 641 2604 M -8 20 V .3 g 633 2624 M -4 9 V .3 g 629 2633 M -4 11 V .3 g 625 2644 M -9 20 V .3 g 616 2664 M -8 20 V .3 g 608 2684 M -6 14 V 0 g .3 g 1892 588 M .3 g 1892 588 M -9 10 V .3 g 1883 598 M -9 10 V .3 g 1874 608 M -18 20 V .3 g 1856 628 M 0 1 V .3 g 1856 629 M -17 19 V .3 g 1839 648 M -11 12 V .3 g 1828 660 M -7 9 V .3 g 1821 669 M -18 20 V .3 g 1803 689 M -2 2 V .3 g 1801 691 M -16 18 V .3 g 1785 709 M -11 12 V .3 g 1774 721 M -8 8 V .3 g 1766 729 M -18 20 V .3 g 1748 749 M -1 2 V .3 g 1747 751 M -17 18 V .3 g 1730 769 M -11 12 V .3 g 1719 781 M -7 9 V .3 g 1712 790 M -18 20 V .3 g 1694 810 M -2 2 V .3 g 1692 812 M -16 18 V .3 g 1676 830 M -11 12 V .3 g 1665 842 M -7 8 V .3 g 1658 850 M -18 20 V .3 g 1640 870 M -2 3 V .3 g 1638 873 M -16 17 V .3 g 1622 890 M -12 13 V stroke 1610 903 M .3 g 1610 903 M -6 7 V .3 g 1604 910 M -18 21 V .3 g 1586 931 M -3 3 V .3 g 1583 934 M -14 17 V .3 g 1569 951 M -13 15 V .3 g 1556 966 M -5 5 V .3 g 1551 971 M -17 20 V .3 g 1534 991 M -5 7 V .3 g 1529 998 M -12 13 V .3 g 1517 1011 M -16 19 V .3 g 1501 1030 M -1 1 V .3 g 1500 1031 M -16 21 V .3 g 1484 1052 M -10 12 V .3 g 1474 1064 M -7 8 V .3 g 1467 1072 M -16 20 V .3 g 1451 1092 M -4 5 V .3 g 1447 1097 M -12 15 V .3 g 1435 1112 M -15 20 V .3 g 1420 1132 M -16 20 V .3 g 1404 1152 M -12 16 V .3 g 1392 1168 M -3 4 V .3 g 1389 1172 M -15 21 V .3 g 1374 1193 M -9 11 V .3 g 1365 1204 M -6 9 V .3 g 1359 1213 M -15 20 V .3 g 1344 1233 M -6 9 V .3 g 1338 1242 M -8 11 V .3 g 1330 1253 M -14 20 V .3 g 1316 1273 M -5 8 V .3 g 1311 1281 M -9 12 V .3 g 1302 1293 M -14 21 V .3 g 1288 1314 M -5 6 V .3 g 1283 1320 M -9 14 V .3 g 1274 1334 M -13 20 V .3 g 1261 1354 M -5 7 V .3 g 1256 1361 M -8 13 V .3 g 1248 1374 M -13 20 V .3 g 1235 1394 M -6 9 V .3 g 1229 1403 M -7 11 V .3 g 1222 1414 M -13 21 V .3 g 1209 1435 M -7 12 V .3 g 1202 1447 M -5 8 V .3 g 1197 1455 M -13 20 V .3 g 1184 1475 M -10 16 V .3 g 1174 1491 M -2 4 V .3 g 1172 1495 M -12 20 V .3 g 1160 1515 M -12 20 V .3 g 1148 1535 M -1 2 V .3 g 1147 1537 M -10 18 V .3 g 1137 1555 M -12 21 V .3 g 1125 1576 M -5 9 V .3 g 1120 1585 M -6 11 V stroke 1114 1596 M .3 g 1114 1596 M -12 20 V .3 g 1102 1616 M -9 17 V .3 g 1093 1633 M -2 3 V .3 g 1091 1636 M -11 20 V .3 g 1080 1656 M -11 20 V .3 g 1069 1676 M -4 7 V .3 g 1065 1683 M -7 14 V .3 g 1058 1697 M -11 20 V .3 g 1047 1717 M -9 17 V .3 g 1038 1734 M -1 3 V .3 g 1037 1737 M -11 20 V .3 g 1026 1757 M -10 20 V .3 g 1016 1777 M -5 10 V .3 g 1011 1787 M -6 10 V .3 g 1005 1797 M -10 20 V .3 g 995 1817 M -10 21 V .3 g 985 1838 M -1 2 V .3 g 984 1840 M -9 18 V .3 g 975 1858 M -10 20 V .3 g 965 1878 M -9 17 V 0 g .3 g 2989 4417 M .3 g 2989 4417 M -16 11 V .3 g 2973 4428 M -16 10 V .3 g 2957 4438 M -11 7 V .3 g 2946 4445 M -22 13 V .3 g 2924 4458 M -6 3 V .3 g 2918 4461 M -27 17 V .3 g .3 g 2891 4478 M -27 16 V .3 g 2864 4494 M -7 4 V .3 g 2857 4498 M -20 12 V .3 g 2837 4510 M -14 8 V .3 g 2823 4518 M -14 8 V .3 g 2809 4526 M -22 12 V .3 g 2787 4538 M -5 3 V .3 g 2782 4541 M -27 16 V .3 g 2755 4557 M -4 2 V .3 g 2751 4559 M -23 13 V .3 g 2728 4572 M -14 7 V .3 g 2714 4579 M -14 7 V .3 g 2700 4586 M -23 13 V .3 g 2677 4599 M -4 2 V .3 g 2673 4601 M -27 14 V .3 g 2646 4615 M -7 4 V 0 g .3 g 4630 4619 M .3 g 4630 4619 M -22 -13 V .3 g 4608 4606 M -11 -7 V .3 g 4597 4599 M -16 -10 V .3 g 4581 4589 M -18 -10 V .3 g 4563 4579 M -10 -7 V .3 g 4553 4572 M -22 -13 V .3 g 4531 4559 M -5 -3 V .3 g 4526 4556 M -27 -18 V .3 g 4499 4538 M -27 -17 V stroke 4472 4521 M .3 g 4472 4521 M -5 -3 V .3 g 4467 4518 M -23 -15 V .3 g 4444 4503 M -7 -5 V .3 g 4437 4498 M -20 -13 V .3 g 4417 4485 M -11 -7 V .3 g 4406 4478 M -16 -11 V .3 g 4390 4467 M -14 -9 V .3 g 4376 4458 M -13 -9 V .3 g 4363 4449 M -17 -11 V .3 g 4346 4438 M -11 -8 V .3 g 4335 4430 M -19 -13 V .3 g 4316 4417 M -8 -5 V .3 g 4308 4412 M -21 -15 V .3 g 4287 4397 M -6 -4 V .3 g 4281 4393 M -24 -16 V .3 g 4257 4377 M -3 -2 V .3 g 4254 4375 M -26 -18 V .3 g 4228 4357 M -2 -1 V .3 g 4226 4356 M -27 -18 V .3 g 4199 4338 M -1 -1 V .3 g 4198 4337 M -26 -17 V .3 g 4172 4320 M -5 -3 V .3 g 4167 4317 M -22 -15 V .3 g 4145 4302 M -9 -5 V .3 g 4136 4297 M -19 -13 V .3 g 4117 4284 M -13 -8 V .3 g 4104 4276 M -14 -9 V .3 g 4090 4267 M -19 -11 V .3 g 4071 4256 M -8 -5 V .3 g 4063 4251 M -26 -15 V .3 g 4037 4236 M -1 -1 V .3 g 4036 4235 M -28 -15 V .3 g 4008 4220 M -8 -4 V .3 g 4000 4216 M -19 -10 V .3 g 3981 4206 M -20 -10 V .3 g 3961 4196 M -7 -4 V .3 g 3954 4192 M -27 -12 V .3 g 3927 4180 M -10 -4 V .3 g 3917 4176 M -18 -8 V .3 g 3899 4168 M -27 -10 V .3 g 3872 4158 M -7 -3 V .3 g 3865 4155 M -20 -7 V .3 g 3845 4148 M -27 -8 V .3 g 3818 4140 M -20 -5 V .3 g 3798 4135 M -8 -2 V .3 g 3790 4133 M -27 -5 V .3 g 3763 4128 M -27 -4 V .3 g 3736 4124 M -27 -3 V .3 g 3709 4121 M -28 -2 V .3 g 3681 4119 M -27 0 V .3 g 3654 4119 M -27 1 V .3 g 3627 4120 M -27 3 V stroke 3600 4123 M .3 g 3600 4123 M -28 3 V .3 g 3572 4126 M -27 6 V .3 g 3545 4132 M -15 3 V .3 g 3530 4135 M -12 3 V .3 g 3518 4138 M -27 8 V .3 g 3491 4146 M -28 8 V .3 g 3463 4154 M -2 1 V .3 g 3461 4155 M -25 9 V .3 g 3436 4164 M -27 11 V .3 g 3409 4175 M -1 1 V .3 g 3408 4176 M -26 11 V .3 g 3382 4187 M -19 9 V .3 g 3363 4196 M -9 4 V .3 g 3354 4200 M -27 14 V .3 g 3327 4214 M -4 2 V .3 g 3323 4216 M -23 12 V .3 g 3300 4228 M -15 8 V .3 g 3285 4236 M -12 7 V .3 g 3273 4243 M -24 13 V .3 g 3249 4256 M -4 2 V .3 g 3245 4258 M -27 16 V .3 g 3218 4274 M -3 2 V .3 g 3215 4276 M -24 15 V .3 g 3191 4291 M -10 6 V .3 g 3181 4297 M -17 10 V .3 g 3164 4307 M -15 10 V .3 g 3149 4317 M -13 7 V .3 g 3136 4324 M -19 13 V .3 g 3117 4337 M -8 5 V .3 g 3109 4342 M -24 15 V .3 g 3085 4357 M -3 2 V .3 g 3082 4359 M -27 17 V .3 g 3055 4376 M -2 1 V .3 g 3053 4377 M -26 16 V .3 g 3027 4393 M -6 4 V .3 g 3021 4397 M -21 14 V .3 g 3000 4411 M -11 6 V 0 g .3 g 6052 1406 M .3 g 6052 1406 M -8 -12 V .3 g 6044 1394 M -13 -20 V .3 g 6031 1374 M -6 -9 V .3 g 6025 1365 M -8 -11 V .3 g 6017 1354 M -14 -20 V .3 g 6003 1334 M -5 -8 V .3 g 5998 1326 M -10 -12 V .3 g 5988 1314 M -14 -21 V .3 g 5974 1293 M -4 -5 V .3 g 5970 1288 M -11 -15 V .3 g 5959 1273 M -14 -20 V .3 g 5945 1253 M -2 -2 V .3 g 5943 1251 M -13 -18 V .3 g 5930 1233 M -14 -19 V .3 g 5916 1214 M -2 -1 V stroke 5914 1213 M .3 g 5914 1213 M -15 -20 V .3 g 5899 1193 M -10 -14 V .3 g 5889 1179 M -6 -7 V .3 g 5883 1172 M -15 -20 V .3 g 5868 1152 M -7 -8 V .3 g 5861 1144 M -10 -12 V .3 g 5851 1132 M -16 -20 V .3 g 5835 1112 M -1 -2 V .3 g 5834 1110 M -15 -18 V .3 g 5819 1092 M -12 -15 V .3 g 5807 1077 M -5 -5 V .3 g 5802 1072 M -16 -20 V .3 g 5786 1052 M -6 -8 V .3 g 5780 1044 M -11 -13 V .3 g 5769 1031 M -17 -20 V .3 g .3 g 5752 1011 M -17 -20 V .3 g 5735 991 M -10 -12 V .3 g 5725 979 M -7 -8 V .3 g 5718 971 M -17 -20 V .3 g 5701 951 M -3 -4 V .3 g 5698 947 M -15 -16 V .3 g 5683 931 M -12 -15 V .3 g 5671 916 M -5 -6 V .3 g 5666 910 M -18 -20 V .3 g 5648 890 M -5 -6 V .3 g 5643 884 M -12 -14 V .3 g 5631 870 M -15 -17 V .3 g 5616 853 M -2 -3 V .3 g 5614 850 M -18 -20 V .3 g 5596 830 M -7 -9 V .3 g 5589 821 M -10 -11 V .3 g 5579 810 M -17 -20 V .3 g 5562 790 M -18 -21 V .3 g 5544 769 M -10 -11 V .3 g 5534 758 M -7 -9 V .3 g 5527 749 M -17 -20 V .3 g 5510 729 M -3 -3 V .3 g 5507 726 M -14 -17 V .3 g 5493 709 M -13 -15 V .3 g 5480 694 M -4 -5 V .3 g 5476 689 M -17 -20 V .3 g 5459 669 M -6 -8 V .3 g 5453 661 M -11 -13 V .3 g 5442 648 M -17 -20 V .3 g .3 g 5425 628 M -16 -20 V .3 g 5409 608 M -11 -13 V .3 g 5398 595 M -6 -7 V 0 g .28 g 1011 1871 M .28 g 1011 1871 M -4 7 V .28 g 1007 1878 M -10 20 V .28 g 997 1898 M -10 20 V .28 g 987 1918 M -3 6 V .28 g 984 1924 M -7 14 V stroke 977 1938 M .28 g 977 1938 M -10 21 V .28 g 967 1959 M -10 20 V .28 g 957 1979 M -1 0 V .28 g 956 1979 M -9 20 V .28 g 947 1999 M -10 20 V .28 g 937 2019 M -8 17 V .28 g 929 2036 M -2 3 V .28 g 927 2039 M -9 20 V .28 g 918 2059 M -10 20 V .28 g 908 2079 M -6 14 V .28 g 902 2093 M -3 7 V .28 g 899 2100 M -10 20 V .28 g 889 2120 M -9 20 V .28 g 880 2140 M -5 12 V .28 g 875 2152 M -4 8 V .28 g 871 2160 M -9 20 V .28 g 862 2180 M -10 20 V .28 g 852 2200 M -5 12 V .28 g 847 2212 M -4 9 V .28 g 843 2221 M -9 20 V .28 g 834 2241 M -9 20 V .28 g 825 2261 M -5 11 V .28 g 820 2272 M -4 9 V .28 g 816 2281 M -9 20 V .28 g 807 2301 M -9 20 V .28 g 798 2321 M -5 13 V .28 g 793 2334 M -3 7 V .28 g 790 2341 M -9 21 V .28 g 781 2362 M -9 20 V .28 g 772 2382 M -7 15 V .28 g 765 2397 M -2 5 V .28 g 763 2402 M -8 20 V .28 g 755 2422 M -9 20 V .28 g 746 2442 M -8 18 V .28 g 738 2460 M -1 2 V .28 g 737 2462 M -8 21 V .28 g 729 2483 M -9 20 V .28 g 720 2503 M -8 20 V .28 g 712 2523 M -1 1 V .28 g 711 2524 M -8 19 V .28 g 703 2543 M -8 20 V .28 g 695 2563 M -9 20 V .28 g 686 2583 M -2 6 V .28 g 684 2589 M -6 15 V .28 g 678 2604 M -9 20 V .28 g 669 2624 M -8 20 V .28 g 661 2644 M -4 10 V .28 g 657 2654 M -5 10 V .28 g 652 2664 M -8 20 V .28 g 644 2684 M -8 20 V .28 g 636 2704 M -7 16 V .28 g 629 2720 M -2 4 V stroke 627 2724 M .28 g 627 2724 M -8 21 V .28 g 619 2745 M -8 20 V .28 g 611 2765 M -9 20 V .28 g 602 2785 M 0 1 V 0 g .28 g 1969 588 M .28 g 1969 588 M -4 6 V .28 g 1965 594 M -13 14 V .28 g 1952 608 M -15 17 V .28 g 1937 625 M -2 3 V .28 g 1935 628 M -18 20 V .28 g 1917 648 M -7 9 V .28 g 1910 657 M -10 12 V .28 g 1900 669 M -17 19 V .28 g 1883 688 M -1 1 V .28 g 1882 689 M -18 20 V .28 g 1864 709 M -8 10 V .28 g 1856 719 M -9 10 V .28 g 1847 729 M -18 20 V .28 g 1829 749 M -1 1 V .28 g 1828 750 M -17 19 V .28 g 1811 769 M -10 11 V .28 g 1801 780 M -9 10 V .28 g 1792 790 M -18 20 V .28 g .28 g 1774 810 M -18 20 V .28 g 1756 830 M -9 10 V .28 g 1747 840 M -9 10 V .28 g 1738 850 M -19 20 V .28 g 1719 870 M -18 20 V .28 g 1701 890 M -9 10 V .28 g 1692 900 M -9 10 V .28 g 1683 910 M -18 20 V .28 g 1665 930 M -1 1 V .28 g 1664 931 M -18 20 V .28 g 1646 951 M -8 9 V .28 g 1638 960 M -10 11 V .28 g 1628 971 M -18 20 V .28 g .28 g 1610 991 M -18 20 V .28 g 1592 1011 M -9 11 V .28 g 1583 1022 M -8 9 V .28 g 1575 1031 M -18 21 V .28 g 1557 1052 M -1 1 V .28 g 1556 1053 M -16 19 V .28 g 1540 1072 M -11 12 V .28 g 1529 1084 M -7 8 V .28 g 1522 1092 M -17 20 V .28 g 1505 1112 M -4 5 V .28 g 1501 1117 M -13 15 V .28 g 1488 1132 M -14 18 V .28 g 1474 1150 M -2 2 V .28 g 1472 1152 M -16 20 V .28 g 1456 1172 M -9 11 V .28 g 1447 1183 M -8 10 V .28 g 1439 1193 M -16 20 V stroke 1423 1213 M .28 g 1423 1213 M -3 5 V .28 g 1420 1218 M -12 15 V .28 g 1408 1233 M -16 20 V .28 g .28 g 1392 1253 M -15 20 V .28 g 1377 1273 M -12 16 V .28 g 1365 1289 M -3 4 V .28 g 1362 1293 M -15 21 V .28 g 1347 1314 M -9 13 V .28 g 1338 1327 M -5 7 V .28 g 1333 1334 M -14 20 V .28 g 1319 1354 M -8 11 V .28 g 1311 1365 M -7 9 V .28 g 1304 1374 M -13 20 V .28 g 1291 1394 M -8 11 V .28 g 1283 1405 M -6 9 V .28 g 1277 1414 M -14 21 V .28 g 1263 1435 M -7 10 V .28 g 1256 1445 M -6 10 V .28 g 1250 1455 M -13 20 V .28 g 1237 1475 M -8 12 V .28 g 1229 1487 M -5 8 V .28 g 1224 1495 M -13 20 V .28 g 1211 1515 M -9 16 V .28 g 1202 1531 M -3 4 V .28 g 1199 1535 M -13 20 V .28 g 1186 1555 M -12 20 V .28 g 1174 1575 M 0 1 V .28 g 1174 1576 M -12 20 V .28 g 1162 1596 M -12 20 V .28 g 1150 1616 M -3 5 V .28 g 1147 1621 M -9 15 V .28 g 1138 1636 M -11 20 V .28 g 1127 1656 M -7 12 V .28 g 1120 1668 M -5 8 V .28 g 1115 1676 M -11 21 V .28 g 1104 1697 M -11 20 V .28 g .28 g 1093 1717 M -11 20 V .28 g 1082 1737 M -11 20 V .28 g 1071 1757 M -6 10 V .28 g 1065 1767 M -5 10 V .28 g 1060 1777 M -11 20 V .28 g 1049 1797 M -11 20 V .28 g 1038 1817 M 0 1 V .28 g 1038 1818 M -10 20 V .28 g 1028 1838 M -11 20 V .28 g 1017 1858 M -6 13 V 0 g .28 g 3173 4216 M .28 g 3173 4216 M -9 6 V .28 g 3164 4222 M -23 14 V .28 g 3141 4236 M -5 3 V .28 g 3136 4239 M -27 17 V .28 g .28 g 3109 4256 M -27 18 V .28 g 3082 4274 M -4 2 V stroke 3078 4276 M .28 g 3078 4276 M -23 15 V .28 g 3055 4291 M -9 6 V .28 g 3046 4297 M -19 12 V .28 g 3027 4309 M -12 8 V .28 g 3015 4317 M -15 9 V .28 g 3000 4326 M -17 11 V .28 g 2983 4337 M -10 7 V .28 g 2973 4344 M -22 13 V .28 g 2951 4357 M -5 4 V .28 g 2946 4361 M -27 16 V .28 g 2919 4377 M -1 0 V .28 g 2918 4377 M -27 17 V .28 g 2891 4394 M -5 3 V .28 g 2886 4397 M -22 13 V .28 g 2864 4410 M -12 7 V .28 g 2852 4417 M -15 9 V .28 g 2837 4426 M -20 12 V .28 g 2817 4438 M -8 4 V .28 g 2809 4442 M -27 16 V .28 g .28 g 2782 4458 M -27 15 V .28 g 2755 4473 M -10 5 V .28 g 2745 4478 M -17 10 V .28 g 2728 4488 M -20 10 V .28 g 2708 4498 M -8 4 V .28 g 2700 4502 M -27 15 V .28 g 2673 4517 M -3 1 V .28 g 2670 4518 M -24 13 V .28 g 2646 4531 M -15 7 V .28 g 2631 4538 M -12 7 V .28 g 2619 4545 M -27 14 V .28 g 2592 4559 M -1 0 V .28 g 2591 4559 M -27 14 V .28 g 2564 4573 M -12 6 V .28 g 2552 4579 M -15 8 V .28 g 2537 4587 M -24 12 V .28 g 2513 4599 M -3 2 V .28 g 2510 4601 M -28 14 V .28 g 2482 4615 M -8 4 V 0 g .28 g 4778 4619 M .28 g 4778 4619 M -7 -4 V .28 g 4771 4615 M -27 -15 V .28 g 4744 4600 M -2 -1 V .28 g 4742 4599 M -25 -14 V .28 g 4717 4585 M -11 -6 V .28 g 4706 4579 M -16 -10 V .28 g 4690 4569 M -19 -10 V .28 g 4671 4559 M -9 -5 V .28 g 4662 4554 M -26 -16 V .28 g 4636 4538 M -1 0 V .28 g 4635 4538 M -27 -16 V .28 g 4608 4522 M -6 -4 V .28 g 4602 4518 M -21 -13 V .28 g 4581 4505 M -12 -7 V stroke 4569 4498 M .28 g 4569 4498 M -16 -9 V .28 g 4553 4489 M -17 -11 V .28 g 4536 4478 M -10 -6 V .28 g 4526 4472 M -22 -14 V .28 g 4504 4458 M -5 -3 V .28 g 4499 4455 M -27 -17 V .28 g 4472 4438 M 0 -1 V .28 g 4472 4437 M -28 -18 V .28 g 4444 4419 M -2 -2 V .28 g 4442 4417 M -25 -16 V .28 g 4417 4401 M -6 -4 V .28 g 4411 4397 M -21 -14 V .28 g 4390 4383 M -9 -6 V .28 g 4381 4377 M -18 -13 V .28 g 4363 4364 M -11 -7 V .28 g 4352 4357 M -17 -11 V .28 g 4335 4346 M -13 -9 V .28 g 4322 4337 M -14 -10 V .28 g 4308 4327 M -15 -10 V .28 g 4293 4317 M -12 -9 V .28 g 4281 4308 M -17 -11 V .28 g 4264 4297 M -10 -8 V .28 g 4254 4289 M -19 -13 V .28 g 4235 4276 M -9 -5 V .28 g 4226 4271 M -21 -15 V .28 g 4205 4256 M -6 -4 V .28 g 4199 4252 M -24 -16 V .28 g 4175 4236 M -3 -2 V .28 g 4172 4234 M -27 -18 V .28 g .28 g 4145 4216 M -28 -18 V .28 g 4117 4198 M -3 -2 V .28 g 4114 4196 M -24 -15 V .28 g 4090 4181 M -8 -5 V .28 g 4082 4176 M -19 -12 V .28 g 4063 4164 M -14 -9 V .28 g 4049 4155 M -13 -7 V .28 g 4036 4148 M -22 -13 V .28 g 4014 4135 M -6 -3 V .28 g 4008 4132 M -27 -14 V .28 g 3981 4118 M -5 -3 V .28 g 3976 4115 M -22 -11 V .28 g 3954 4104 M -19 -9 V .28 g 3935 4095 M -8 -4 V .28 g 3927 4091 M -28 -12 V .28 g 3899 4079 M -11 -4 V .28 g 3888 4075 M -16 -6 V .28 g 3872 4069 M -27 -10 V .28 g 3845 4059 M -15 -4 V .28 g 3830 4055 M -12 -4 V .28 g 3818 4051 M -28 -7 V .28 g 3790 4044 M -27 -6 V .28 g 3763 4038 M -22 -3 V stroke 3741 4035 M .28 g 3741 4035 M -5 -1 V .28 g 3736 4034 M -27 -3 V .28 g 3709 4031 M -28 -2 V .28 g 3681 4029 M -27 0 V .28 g 3654 4029 M -27 1 V .28 g 3627 4030 M -27 3 V .28 g 3600 4033 M -12 2 V .28 g 3588 4035 M -16 2 V .28 g 3572 4037 M -27 5 V .28 g 3545 4042 M -27 7 V .28 g 3518 4049 M -21 6 V .28 g 3497 4055 M -6 1 V .28 g 3491 4056 M -28 9 V .28 g 3463 4065 M -25 10 V .28 g 3438 4075 M -2 1 V .28 g 3436 4076 M -27 11 V .28 g 3409 4087 M -19 8 V .28 g 3390 4095 M -8 4 V .28 g 3382 4099 M -28 13 V .28 g 3354 4112 M -6 3 V .28 g 3348 4115 M -21 11 V .28 g 3327 4126 M -17 9 V .28 g 3310 4135 M -10 6 V .28 g 3300 4141 M -27 14 V .28 g 3273 4155 M 0 1 V .28 g 3273 4156 M -28 16 V .28 g 3245 4172 M -6 4 V .28 g 3239 4176 M -21 12 V .28 g 3218 4188 M -13 8 V .28 g 3205 4196 M -14 9 V .28 g 3191 4205 M -18 11 V 0 g .28 g 6052 1490 M .28 g 6052 1490 M -10 -15 V .28 g 6042 1475 M -14 -20 V .28 g 6028 1455 M -3 -5 V .28 g 6025 1450 M -11 -15 V .28 g 6014 1435 M -14 -21 V .28 g 6000 1414 M -2 -3 V .28 g 5998 1411 M -13 -17 V .28 g 5985 1394 M -14 -20 V .28 g 5971 1374 M -1 -1 V .28 g 5970 1373 M -14 -19 V .28 g 5956 1354 M -13 -18 V .28 g 5943 1336 M -2 -2 V .28 g 5941 1334 M -15 -20 V .28 g 5926 1314 M -10 -14 V .28 g 5916 1300 M -6 -7 V .28 g 5910 1293 M -15 -20 V .28 g 5895 1273 M -6 -8 V .28 g 5889 1265 M -10 -12 V .28 g 5879 1253 M -16 -20 V .28 g 5863 1233 M -2 -2 V .28 g 5861 1231 M -14 -18 V stroke 5847 1213 M .28 g 5847 1213 M -13 -16 V .28 g 5834 1197 M -3 -4 V .28 g 5831 1193 M -17 -21 V .28 g 5814 1172 M -7 -8 V .28 g 5807 1164 M -10 -12 V .28 g 5797 1152 M -17 -20 V .28 g 5780 1132 M 0 -1 V .28 g 5780 1131 M -17 -19 V .28 g 5763 1112 M -11 -13 V .28 g 5752 1099 M -6 -7 V .28 g 5746 1092 M -17 -20 V .28 g 5729 1072 M -4 -5 V .28 g 5725 1067 M -13 -15 V .28 g 5712 1052 M -14 -16 V .28 g 5698 1036 M -4 -5 V .28 g 5694 1031 M -17 -20 V .28 g 5677 1011 M -6 -7 V .28 g 5671 1004 M -12 -13 V .28 g 5659 991 M -16 -18 V .28 g 5643 973 M -1 -2 V .28 g 5642 971 M -18 -20 V .28 g 5624 951 M -8 -9 V .28 g 5616 942 M -10 -11 V .28 g 5606 931 M -17 -21 V .28 g .28 g 5589 910 M -18 -20 V .28 g 5571 890 M -9 -11 V .28 g 5562 879 M -8 -9 V .28 g 5554 870 M -17 -20 V .28 g 5537 850 M -3 -3 V .28 g 5534 847 M -15 -17 V .28 g 5519 830 M -12 -14 V .28 g 5507 816 M -5 -6 V .28 g 5502 810 M -17 -20 V .28 g 5485 790 M -5 -6 V .28 g 5480 784 M -12 -15 V .28 g 5468 769 M -15 -18 V .28 g 5453 751 M -2 -2 V .28 g 5451 749 M -17 -20 V .28 g 5434 729 M -9 -11 V .28 g 5425 718 M -8 -9 V .28 g 5417 709 M -16 -20 V .28 g 5401 689 M -3 -4 V .28 g 5398 685 M -14 -16 V .28 g 5384 669 M -13 -17 V .28 g 5371 652 M -3 -4 V .28 g 5368 648 M -16 -20 V .28 g 5352 628 M -8 -10 V .28 g 5344 618 M -9 -10 V .28 g 5335 608 M -16 -20 V 0 g .26 g 1074 1838 M .26 g 1074 1838 M -9 16 V .26 g 1065 1854 M -2 4 V .26 g 1063 1858 M -11 20 V stroke 1052 1878 M .26 g 1052 1878 M -10 20 V .26 g 1042 1898 M -4 7 V .26 g 1038 1905 M -7 13 V .26 g 1031 1918 M -10 20 V .26 g 1021 1938 M -10 20 V .26 g 1011 1958 M -1 1 V .26 g 1010 1959 M -10 20 V .26 g 1000 1979 M -10 20 V .26 g 990 1999 M -6 13 V .26 g 984 2012 M -4 7 V .26 g 980 2019 M -10 20 V .26 g 970 2039 M -10 20 V .26 g 960 2059 M -4 8 V .26 g 956 2067 M -6 12 V .26 g 950 2079 M -10 21 V .26 g 940 2100 M -9 20 V .26 g 931 2120 M -2 3 V .26 g 929 2123 M -8 17 V .26 g 921 2140 M -9 20 V .26 g 912 2160 M -10 20 V .26 g 902 2180 M 0 1 V .26 g 902 2181 M -9 19 V .26 g 893 2200 M -9 21 V .26 g 884 2221 M -9 19 V .26 g 875 2240 M -1 1 V .26 g 874 2241 M -9 20 V .26 g 865 2261 M -9 20 V .26 g 856 2281 M -9 19 V .26 g 847 2300 M 0 1 V .26 g 847 2301 M -9 20 V .26 g 838 2321 M -9 20 V .26 g 829 2341 M -9 20 V .26 g 820 2361 M 0 1 V .26 g 820 2362 M -9 20 V .26 g 811 2382 M -9 20 V .26 g 802 2402 M -9 20 V .26 g 793 2422 M 0 1 V .26 g 793 2423 M -9 19 V .26 g 784 2442 M -8 20 V .26 g 776 2462 M -9 21 V .26 g 767 2483 M -2 3 V .26 g 765 2486 M -7 17 V .26 g 758 2503 M -8 20 V .26 g 750 2523 M -9 20 V .26 g 741 2543 M -3 6 V .26 g 738 2549 M -6 14 V .26 g 732 2563 M -8 20 V .26 g 724 2583 M -9 21 V .26 g 715 2604 M -4 10 V .26 g 711 2614 M -4 10 V .26 g 707 2624 M -8 20 V .26 g 699 2644 M -9 20 V stroke 690 2664 M .26 g 690 2664 M -6 15 V .26 g 684 2679 M -2 5 V .26 g 682 2684 M -9 20 V .26 g 673 2704 M -8 20 V .26 g 665 2724 M -8 21 V .26 g 657 2745 M -9 20 V .26 g 648 2765 M -8 20 V .26 g 640 2785 M -8 20 V .26 g 632 2805 M -3 6 V .26 g 629 2811 M -6 14 V .26 g 623 2825 M -8 20 V .26 g 615 2845 M -8 21 V .26 g 607 2866 M -5 11 V 0 g .26 g 2047 588 M .26 g 2047 588 M -1 1 V .26 g 2046 589 M -15 19 V .26 g 2031 608 M -12 14 V .26 g 2019 622 M -5 6 V .26 g 2014 628 M -17 20 V .26 g 1997 648 M -5 7 V .26 g 1992 655 M -12 14 V .26 g 1980 669 M -15 18 V .26 g 1965 687 M -2 2 V .26 g 1963 689 M -17 20 V .26 g 1946 709 M -9 10 V .26 g 1937 719 M -8 10 V .26 g 1929 729 M -18 20 V .26 g 1911 749 M -1 2 V .26 g 1910 751 M -16 18 V .26 g 1894 769 M -11 13 V .26 g 1883 782 M -7 8 V .26 g 1876 790 M -18 20 V .26 g 1858 810 M -2 3 V .26 g 1856 813 M -16 17 V .26 g 1840 830 M -12 13 V .26 g 1828 843 M -6 7 V .26 g 1822 850 M -18 20 V .26 g 1804 870 M -3 3 V .26 g 1801 873 M -16 17 V .26 g 1785 890 M -11 13 V .26 g 1774 903 M -7 7 V .26 g 1767 910 M -18 21 V .26 g 1749 931 M -2 2 V .26 g 1747 933 M -17 18 V .26 g 1730 951 M -11 12 V .26 g 1719 963 M -7 8 V .26 g 1712 971 M -19 20 V .26 g 1693 991 M -1 1 V .26 g 1692 992 M -17 19 V .26 g 1675 1011 M -10 11 V .26 g 1665 1022 M -9 9 V .26 g 1656 1031 M -18 21 V .26 g .26 g 1638 1052 M -18 20 V stroke 1620 1072 M .26 g 1620 1072 M -10 10 V .26 g 1610 1082 M -9 10 V .26 g 1601 1092 M -18 20 V .26 g .26 g 1583 1112 M -17 20 V .26 g 1566 1132 M -10 11 V .26 g 1556 1143 M -8 9 V .26 g 1548 1152 M -18 20 V .26 g 1530 1172 M -1 3 V .26 g 1529 1175 M -16 18 V .26 g 1513 1193 M -12 13 V .26 g 1501 1206 M -5 7 V .26 g 1496 1213 M -17 20 V .26 g 1479 1233 M -5 6 V .26 g 1474 1239 M -12 14 V .26 g 1462 1253 M -15 19 V .26 g 1447 1272 M -1 1 V .26 g 1446 1273 M -16 20 V .26 g 1430 1293 M -10 13 V .26 g 1420 1306 M -6 8 V .26 g 1414 1314 M -16 20 V .26 g 1398 1334 M -6 8 V .26 g 1392 1342 M -9 12 V .26 g 1383 1354 M -15 20 V .26 g 1368 1374 M -3 4 V .26 g 1365 1378 M -12 16 V .26 g 1353 1394 M -15 20 V .26 g 1338 1414 M 0 1 V .26 g 1338 1415 M -14 20 V .26 g 1324 1435 M -13 18 V .26 g 1311 1453 M -2 2 V .26 g 1309 1455 M -14 20 V .26 g 1295 1475 M -12 17 V .26 g 1283 1492 M -2 3 V .26 g 1281 1495 M -13 20 V .26 g 1268 1515 M -12 18 V .26 g 1256 1533 M -2 2 V .26 g 1254 1535 M -13 20 V .26 g 1241 1555 M -12 20 V .26 g 1229 1575 M -1 1 V .26 g 1228 1576 M -13 20 V .26 g 1215 1596 M -12 20 V .26 g 1203 1616 M -1 2 V .26 g 1202 1618 M -12 18 V .26 g 1190 1636 M -12 20 V .26 g 1178 1656 M -4 6 V .26 g 1174 1662 M -8 14 V .26 g 1166 1676 M -12 21 V .26 g 1154 1697 M -7 11 V .26 g 1147 1708 M -5 9 V .26 g 1142 1717 M -12 20 V .26 g 1130 1737 M -10 18 V .26 g 1120 1755 M -1 2 V stroke 1119 1757 M .26 g 1119 1757 M -11 20 V .26 g 1108 1777 M -12 20 V .26 g 1096 1797 M -3 7 V .26 g 1093 1804 M -8 13 V .26 g 1085 1817 M -11 21 V 0 g .26 g 3327 4035 M .26 g 3327 4035 M -27 15 V .26 g 3300 4050 M -9 5 V .26 g 3291 4055 M -18 10 V .26 g 3273 4065 M -16 10 V .26 g 3257 4075 M -12 7 V .26 g 3245 4082 M -22 13 V .26 g 3223 4095 M -5 3 V .26 g 3218 4098 M -27 17 V .26 g .26 g 3191 4115 M -27 18 V .26 g 3164 4133 M -5 2 V .26 g 3159 4135 M -23 15 V .26 g 3136 4150 M -8 5 V .26 g 3128 4155 M -19 13 V .26 g 3109 4168 M -12 8 V .26 g 3097 4176 M -15 10 V .26 g 3082 4186 M -16 10 V .26 g 3066 4196 M -11 7 V .26 g 3055 4203 M -20 13 V .26 g 3035 4216 M -8 5 V .26 g 3027 4221 M -23 15 V .26 g 3004 4236 M -4 3 V .26 g 3000 4239 M -27 17 V .26 g 2973 4256 M -27 17 V .26 g 2946 4273 M -5 3 V .26 g 2941 4276 M -23 14 V .26 g 2918 4290 M -10 7 V .26 g 2908 4297 M -17 10 V .26 g 2891 4307 M -16 10 V .26 g 2875 4317 M -11 6 V .26 g 2864 4323 M -23 14 V .26 g 2841 4337 M -4 3 V .26 g 2837 4340 M -28 15 V .26 g 2809 4355 M -3 2 V .26 g 2806 4357 M -24 14 V .26 g 2782 4371 M -12 6 V .26 g 2770 4377 M -15 9 V .26 g 2755 4386 M -21 11 V .26 g 2734 4397 M -6 4 V .26 g 2728 4401 M -28 14 V .26 g 2700 4415 M -4 2 V .26 g 2696 4417 M -23 12 V .26 g 2673 4429 M -16 9 V .26 g 2657 4438 M -11 5 V .26 g 2646 4443 M -27 14 V .26 g 2619 4457 M -2 1 V .26 g 2617 4458 M -26 13 V .26 g 2591 4471 M -14 7 V stroke 2577 4478 M .26 g 2577 4478 M -13 7 V .26 g 2564 4485 M -27 13 V .26 g .26 g 2537 4498 M -27 14 V .26 g 2510 4512 M -13 6 V .26 g 2497 4518 M -15 8 V .26 g 2482 4526 M -24 12 V .26 g 2458 4538 M -3 2 V .26 g 2455 4540 M -27 14 V .26 g 2428 4554 M -8 5 V .26 g 2420 4559 M -19 10 V .26 g 2401 4569 M -18 10 V .26 g 2383 4579 M -10 5 V .26 g 2373 4584 M -25 15 V .26 g 2348 4599 M -2 1 V .26 g 2346 4600 M -27 16 V .26 g 2319 4616 M -5 3 V 0 g .26 g 4936 4619 M .26 g 4936 4619 M -1 -1 V .26 g 4935 4618 M -27 -15 V .26 g 4908 4603 M -7 -4 V .26 g 4901 4599 M -21 -12 V .26 g 4880 4587 M -15 -8 V .26 g 4865 4579 M -12 -7 V .26 g 4853 4572 M -24 -13 V .26 g 4829 4559 M -3 -2 V .26 g 4826 4557 M -27 -15 V .26 g 4799 4542 M -7 -4 V .26 g 4792 4538 M -21 -11 V .26 g 4771 4527 M -16 -9 V .26 g 4755 4518 M -11 -6 V .26 g 4744 4512 M -25 -14 V .26 g 4719 4498 M -2 -1 V .26 g 4717 4497 M -27 -15 V .26 g 4690 4482 M -7 -4 V .26 g 4683 4478 M -21 -12 V .26 g 4662 4466 M -15 -8 V .26 g 4647 4458 M -12 -7 V .26 g 4635 4451 M -22 -13 V .26 g 4613 4438 M -5 -3 V .26 g 4608 4435 M -27 -17 V .26 g 4581 4418 M -2 -1 V .26 g 4579 4417 M -26 -15 V .26 g 4553 4402 M -7 -5 V .26 g 4546 4397 M -20 -12 V .26 g 4526 4385 M -12 -8 V .26 g 4514 4377 M -15 -9 V .26 g 4499 4368 M -17 -11 V .26 g 4482 4357 M -10 -7 V .26 g 4472 4350 M -21 -13 V .26 g 4451 4337 M -7 -5 V .26 g 4444 4332 M -23 -15 V .26 g 4421 4317 M -4 -3 V .26 g 4417 4314 M -26 -17 V stroke 4391 4297 M .26 g 4391 4297 M -1 -1 V .26 g 4390 4296 M -27 -19 V .26 g 4363 4277 M -1 -1 V .26 g 4362 4276 M -27 -18 V .26 g 4335 4258 M -2 -2 V .26 g 4333 4256 M -25 -17 V .26 g 4308 4239 M -4 -3 V .26 g 4304 4236 M -23 -16 V .26 g 4281 4220 M -6 -4 V .26 g 4275 4216 M -21 -15 V .26 g 4254 4201 M -8 -5 V .26 g 4246 4196 M -20 -14 V .26 g 4226 4182 M -9 -6 V .26 g 4217 4176 M -18 -13 V .26 g 4199 4163 M -11 -8 V .26 g 4188 4155 M -16 -11 V .26 g 4172 4144 M -14 -9 V .26 g 4158 4135 M -13 -9 V .26 g 4145 4126 M -17 -11 V .26 g 4128 4115 M -11 -7 V .26 g 4117 4108 M -20 -13 V .26 g 4097 4095 M -7 -5 V .26 g 4090 4090 M -25 -15 V .26 g 4065 4075 M -2 -2 V .26 g 4063 4073 M -27 -16 V .26 g 4036 4057 M -4 -2 V .26 g 4032 4055 M -24 -14 V .26 g 4008 4041 M -11 -6 V .26 g 3997 4035 M -16 -9 V .26 g 3981 4026 M -22 -12 V .26 g 3959 4014 M -5 -2 V .26 g 3954 4012 M -27 -13 V .26 g 3927 3999 M -11 -5 V .26 g 3916 3994 M -17 -7 V .26 g 3899 3987 M -27 -11 V .26 g 3872 3976 M -5 -2 V .26 g 3867 3974 M -22 -8 V .26 g 3845 3966 M -27 -9 V .26 g 3818 3957 M -14 -3 V .26 g 3804 3954 M -14 -4 V .26 g 3790 3950 M -27 -6 V .26 g 3763 3944 M -27 -4 V .26 g 3736 3940 M -27 -3 V .26 g 3709 3937 M -28 -2 V .26 g 3681 3935 M -27 0 V .26 g 3654 3935 M -27 1 V .26 g 3627 3936 M -27 3 V .26 g 3600 3939 M -28 4 V .26 g 3572 3943 M -27 6 V .26 g 3545 3949 M -21 5 V .26 g 3524 3954 M -6 1 V .26 g 3518 3955 M -27 8 V stroke 3491 3963 M .26 g 3491 3963 M -28 10 V .26 g 3463 3973 M -3 1 V .26 g 3460 3974 M -24 9 V .26 g 3436 3983 M -26 11 V .26 g 3410 3994 M -1 1 V .26 g 3409 3995 M -27 12 V .26 g 3382 4007 M -15 7 V .26 g 3367 4014 M -13 7 V .26 g 3354 4021 M -27 14 V .26 g 0 g .26 g 6052 1578 M .26 g 6052 1578 M -1 -2 V .26 g 6051 1576 M -14 -21 V .26 g 6037 1555 M -12 -17 V .26 g 6025 1538 M -2 -3 V .26 g 6023 1535 M -14 -20 V .26 g 6009 1515 M -11 -16 V .26 g 5998 1499 M -4 -4 V .26 g 5994 1495 M -14 -20 V .26 g 5980 1475 M -10 -13 V .26 g 5970 1462 M -5 -7 V .26 g 5965 1455 M -15 -20 V .26 g 5950 1435 M -7 -10 V .26 g 5943 1425 M -8 -11 V .26 g 5935 1414 M -15 -20 V .26 g 5920 1394 M -4 -5 V .26 g 5916 1389 M -12 -15 V .26 g 5904 1374 M -15 -20 V .26 g 5889 1354 M -1 0 V .26 g 5888 1354 M -16 -20 V .26 g 5872 1334 M -11 -14 V .26 g 5861 1320 M -5 -6 V .26 g 5856 1314 M -17 -21 V .26 g 5839 1293 M -5 -6 V .26 g 5834 1287 M -11 -14 V .26 g 5823 1273 M -16 -19 V .26 g 5807 1254 M -1 -1 V .26 g 5806 1253 M -17 -20 V .26 g 5789 1233 M -9 -11 V .26 g 5780 1222 M -8 -9 V .26 g 5772 1213 M -17 -20 V .26 g 5755 1193 M -3 -3 V .26 g 5752 1190 M -15 -18 V .26 g 5737 1172 M -12 -14 V .26 g 5725 1158 M -5 -6 V .26 g 5720 1152 M -18 -20 V .26 g 5702 1132 M -4 -5 V .26 g 5698 1127 M -14 -15 V .26 g 5684 1112 M -13 -16 V .26 g 5671 1096 M -4 -4 V .26 g 5667 1092 M -18 -20 V .26 g 5649 1072 M -6 -7 V .26 g 5643 1065 M -12 -13 V .26 g 5631 1052 M -15 -18 V stroke 5616 1034 M .26 g 5616 1034 M -2 -3 V .26 g 5614 1031 M -18 -20 V .26 g 5596 1011 M -7 -8 V .26 g 5589 1003 M -11 -12 V .26 g 5578 991 M -16 -19 V .26 g 5562 972 M -1 -1 V .26 g 5561 971 M -18 -20 V .26 g 5543 951 M -9 -10 V .26 g 5534 941 M -8 -10 V .26 g 5526 931 M -18 -21 V .26 g 5508 910 M -1 -1 V .26 g 5507 909 M -16 -19 V .26 g 5491 890 M -11 -13 V .26 g 5480 877 M -6 -7 V .26 g 5474 870 M -17 -20 V .26 g 5457 850 M -4 -5 V .26 g 5453 845 M -13 -15 V .26 g 5440 830 M -15 -18 V .26 g 5425 812 M -2 -2 V .26 g 5423 810 M -16 -20 V .26 g 5407 790 M -9 -11 V .26 g 5398 779 M -8 -10 V .26 g 5390 769 M -16 -20 V .26 g 5374 749 M -3 -3 V .26 g 5371 746 M -14 -17 V .26 g 5357 729 M -13 -17 V .26 g 5344 712 M -3 -3 V .26 g 5341 709 M -16 -20 V .26 g 5325 689 M -9 -11 V .26 g 5316 678 M -7 -9 V .26 g 5309 669 M -16 -21 V .26 g 5293 648 M -4 -5 V .26 g 5289 643 M -12 -15 V .26 g 5277 628 M -15 -20 V .26 g .26 g 5262 608 M -16 -20 V 0 g .24 g 1124 1838 M .24 g 1124 1838 M -4 8 V .24 g 1120 1846 M -7 12 V .24 g 1113 1858 M -11 20 V .24 g 1102 1878 M -9 16 V .24 g 1093 1894 M -3 4 V .24 g 1090 1898 M -11 20 V .24 g 1079 1918 M -11 20 V .24 g 1068 1938 M -3 6 V .24 g 1065 1944 M -7 15 V .24 g 1058 1959 M -11 20 V .24 g 1047 1979 M -9 16 V .24 g 1038 1995 M -2 4 V .24 g 1036 1999 M -10 20 V .24 g 1026 2019 M -11 20 V .24 g 1015 2039 M -4 9 V .24 g 1011 2048 M -6 11 V .24 g 1005 2059 M -10 20 V stroke 995 2079 M .24 g 995 2079 M -10 21 V .24 g 985 2100 M -1 2 V .24 g 984 2102 M -9 18 V .24 g 975 2120 M -10 20 V .24 g 965 2140 M -9 18 V .24 g 956 2158 M -1 2 V .24 g 955 2160 M -10 20 V .24 g 945 2180 M -9 20 V .24 g 936 2200 M -7 14 V .24 g 929 2214 M -3 7 V .24 g 926 2221 M -9 20 V .24 g 917 2241 M -10 20 V .24 g 907 2261 M -5 11 V .24 g 902 2272 M -4 9 V .24 g 898 2281 M -9 20 V .24 g 889 2301 M -10 20 V .24 g 879 2321 M -4 10 V .24 g 875 2331 M -5 10 V .24 g 870 2341 M -9 21 V .24 g 861 2362 M -9 20 V .24 g 852 2382 M -5 10 V .24 g 847 2392 M -4 10 V .24 g 843 2402 M -9 20 V .24 g 834 2422 M -9 20 V .24 g 825 2442 M -5 11 V .24 g 820 2453 M -4 9 V .24 g 816 2462 M -9 21 V .24 g 807 2483 M -9 20 V .24 g 798 2503 M -5 12 V .24 g 793 2515 M -3 8 V .24 g 790 2523 M -9 20 V .24 g 781 2543 M -9 20 V .24 g 772 2563 M -7 16 V .24 g 765 2579 M -2 4 V .24 g 763 2583 M -8 21 V .24 g 755 2604 M -9 20 V .24 g 746 2624 M -8 19 V .24 g 738 2643 M 0 1 V .24 g 738 2644 M -9 20 V .24 g 729 2664 M -8 20 V .24 g 721 2684 M -9 20 V .24 g 712 2704 M -1 3 V .24 g 711 2707 M -7 17 V .24 g 704 2724 M -8 21 V .24 g 696 2745 M -9 20 V .24 g 687 2765 M -3 8 V .24 g 684 2773 M -5 12 V .24 g 679 2785 M -8 20 V .24 g 671 2805 M -9 20 V .24 g 662 2825 M -5 14 V .24 g 657 2839 M -3 6 V .24 g 654 2845 M -8 21 V stroke 646 2866 M .24 g 646 2866 M -9 20 V .24 g 637 2886 M -8 19 V .24 g 629 2905 M 0 1 V .24 g 629 2906 M -8 20 V .24 g 621 2926 M -8 20 V .24 g 613 2946 M -9 20 V .24 g 604 2966 M -2 6 V 0 g .24 g 2126 588 M .24 g 2126 588 M -16 20 V .24 g 2110 608 M -9 12 V .24 g 2101 620 M -7 8 V .24 g 2094 628 M -16 20 V .24 g 2078 648 M -4 6 V .24 g 2074 654 M -12 15 V .24 g 2062 669 M -16 18 V .24 g 2046 687 M -1 2 V .24 g 2045 689 M -16 20 V .24 g 2029 709 M -10 12 V .24 g 2019 721 M -7 8 V .24 g 2012 729 M -17 20 V .24 g 1995 749 M -3 4 V .24 g 1992 753 M -14 16 V .24 g 1978 769 M -13 17 V .24 g 1965 786 M -4 4 V .24 g 1961 790 M -17 20 V .24 g 1944 810 M -7 7 V .24 g 1937 817 M -11 13 V .24 g 1926 830 M -16 19 V .24 g 1910 849 M -1 1 V .24 g 1909 850 M -18 20 V .24 g 1891 870 M -8 10 V .24 g 1883 880 M -10 10 V .24 g 1873 890 M -17 20 V .24 g 1856 910 M -1 0 V .24 g 1855 910 M -18 21 V .24 g 1837 931 M -9 10 V .24 g 1828 941 M -9 10 V .24 g 1819 951 M -18 20 V .24 g .24 g 1801 971 M -19 20 V .24 g 1782 991 M -8 9 V .24 g 1774 1000 M -10 11 V .24 g 1764 1011 M -17 19 V .24 g 1747 1030 M -2 1 V .24 g 1745 1031 M -19 21 V .24 g 1726 1052 M -7 7 V .24 g 1719 1059 M -11 13 V .24 g 1708 1072 M -16 16 V .24 g 1692 1088 M -3 4 V .24 g 1689 1092 M -19 20 V .24 g 1670 1112 M -5 6 V .24 g 1665 1118 M -13 14 V .24 g 1652 1132 M -14 15 V .24 g 1638 1147 M -5 5 V stroke 1633 1152 M .24 g 1633 1152 M -19 20 V .24 g 1614 1172 M -4 5 V .24 g 1610 1177 M -14 16 V .24 g 1596 1193 M -13 14 V .24 g 1583 1207 M -5 6 V .24 g 1578 1213 M -18 20 V .24 g 1560 1233 M -4 4 V .24 g 1556 1237 M -14 16 V .24 g 1542 1253 M -13 15 V .24 g 1529 1268 M -5 5 V .24 g 1524 1273 M -17 20 V .24 g 1507 1293 M -6 7 V .24 g 1501 1300 M -11 14 V .24 g 1490 1314 M -16 18 V .24 g 1474 1332 M -1 2 V .24 g 1473 1334 M -17 20 V .24 g 1456 1354 M -9 11 V .24 g 1447 1365 M -7 9 V .24 g 1440 1374 M -17 20 V .24 g 1423 1394 M -3 5 V .24 g 1420 1399 M -13 15 V .24 g 1407 1414 M -15 20 V .24 g 1392 1434 M 0 1 V .24 g 1392 1435 M -16 20 V .24 g 1376 1455 M -11 14 V .24 g 1365 1469 M -4 6 V .24 g 1361 1475 M -15 20 V .24 g 1346 1495 M -8 11 V .24 g 1338 1506 M -7 9 V .24 g 1331 1515 M -14 20 V .24 g 1317 1535 M -6 9 V .24 g 1311 1544 M -8 11 V .24 g 1303 1555 M -14 21 V .24 g 1289 1576 M -6 7 V .24 g 1283 1583 M -8 13 V .24 g 1275 1596 M -14 20 V .24 g 1261 1616 M -5 8 V .24 g 1256 1624 M -8 12 V .24 g 1248 1636 M -13 20 V .24 g 1235 1656 M -6 9 V .24 g 1229 1665 M -7 11 V .24 g 1222 1676 M -13 21 V .24 g 1209 1697 M -7 11 V .24 g 1202 1708 M -6 9 V .24 g 1196 1717 M -12 20 V .24 g 1184 1737 M -10 16 V .24 g 1174 1753 M -2 4 V .24 g 1172 1757 M -12 20 V .24 g 1160 1777 M -12 20 V .24 g 1148 1797 M -1 1 V .24 g 1147 1798 M -11 19 V .24 g 1136 1817 M -12 21 V stroke 1124 1838 M 0 g .24 g 3491 3866 M .24 g 3491 3866 M -20 7 V .24 g 3471 3873 M -8 3 V .24 g 3463 3876 M -27 11 V .24 g 3436 3887 M -16 6 V .24 g 3420 3893 M -11 5 V .24 g 3409 3898 M -27 13 V .24 g 3382 3911 M -5 3 V .24 g 3377 3914 M -23 11 V .24 g 3354 3925 M -16 9 V .24 g 3338 3934 M -11 6 V .24 g 3327 3940 M -25 14 V .24 g 3302 3954 M -2 1 V .24 g 3300 3955 M -27 16 V .24 g 3273 3971 M -5 3 V .24 g 3268 3974 M -23 14 V .24 g 3245 3988 M -10 6 V .24 g 3235 3994 M -17 11 V .24 g 3218 4005 M -15 9 V .24 g 3203 4014 M -12 8 V .24 g 3191 4022 M -19 13 V .24 g 3172 4035 M -8 5 V .24 g 3164 4040 M -23 15 V .24 g 3141 4055 M -5 3 V .24 g 3136 4058 M -26 17 V .24 g 3110 4075 M -1 1 V .24 g 3109 4076 M -27 18 V .24 g 3082 4094 M -2 1 V .24 g 3080 4095 M -25 17 V .24 g 3055 4112 M -5 3 V .24 g 3050 4115 M -23 15 V .24 g 3027 4130 M -8 5 V .24 g 3019 4135 M -19 13 V .24 g 3000 4148 M -12 7 V .24 g 2988 4155 M -15 10 V .24 g 2973 4165 M -16 11 V .24 g 2957 4176 M -11 7 V .24 g 2946 4183 M -21 13 V .24 g 2925 4196 M -7 4 V .24 g 2918 4200 M -26 16 V .24 g 2892 4216 M -1 1 V .24 g 2891 4217 M -27 16 V .24 g 2864 4233 M -5 3 V .24 g 2859 4236 M -22 13 V .24 g 2837 4249 M -13 7 V .24 g 2824 4256 M -15 9 V .24 g 2809 4265 M -20 11 V .24 g 2789 4276 M -7 4 V .24 g 2782 4280 M -27 15 V .24 g 2755 4295 M -2 2 V .24 g 2753 4297 M -25 13 V .24 g 2728 4310 M -13 7 V .24 g 2715 4317 M -15 7 V stroke 2700 4324 M .24 g 2700 4324 M -24 13 V .24 g 2676 4337 M -3 2 V .24 g 2673 4339 M -27 13 V .24 g 2646 4352 M -9 5 V .24 g 2637 4357 M -18 9 V .24 g 2619 4366 M -23 11 V .24 g 2596 4377 M -5 2 V .24 g 2591 4379 M -27 14 V .24 g 2564 4393 M -9 4 V .24 g 2555 4397 M -18 9 V .24 g 2537 4406 M -23 11 V .24 g 2514 4417 M -4 3 V .24 g 2510 4420 M -28 13 V .24 g 2482 4433 M -9 5 V .24 g 2473 4438 M -18 9 V .24 g 2455 4447 M -22 11 V .24 g 2433 4458 M -5 3 V .24 g 2428 4461 M -27 14 V .24 g 2401 4475 M -6 3 V .24 g 2395 4478 M -22 12 V .24 g 2373 4490 M -15 8 V .24 g 2358 4498 M -12 7 V .24 g 2346 4505 M -22 13 V .24 g 2324 4518 M -5 3 V .24 g 2319 4521 M -27 17 V .24 g 2292 4538 M -1 0 V .24 g 2291 4538 M -27 17 V .24 g 2264 4555 M -5 4 V .24 g 2259 4559 M -22 15 V .24 g 2237 4574 M -7 5 V .24 g 2230 4579 M -20 14 V .24 g 2210 4593 M -8 6 V .24 g 2202 4599 M -19 15 V .24 g 2183 4614 M -7 5 V 0 g .24 g 5085 4619 M .24 g 5085 4619 M -14 -10 V .24 g 5071 4609 M -15 -10 V .24 g 5056 4599 M -12 -8 V .24 g 5044 4591 M -19 -12 V .24 g 5025 4579 M -8 -6 V .24 g 5017 4573 M -25 -14 V .24 g 4992 4559 M -3 -2 V .24 g 4989 4557 M -27 -17 V .24 g 4962 4540 M -4 -2 V .24 g 4958 4538 M -23 -13 V .24 g 4935 4525 M -12 -7 V .24 g 4923 4518 M -15 -9 V .24 g 4908 4509 M -21 -11 V .24 g 4887 4498 M -7 -4 V .24 g 4880 4494 M -27 -15 V .24 g 4853 4479 M -3 -1 V .24 g 4850 4478 M -24 -13 V .24 g 4826 4465 M -13 -7 V stroke 4813 4458 M .24 g 4813 4458 M -14 -8 V .24 g 4799 4450 M -24 -12 V .24 g 4775 4438 M -4 -2 V .24 g 4771 4436 M -27 -15 V .24 g 4744 4421 M -6 -4 V .24 g 4738 4417 M -21 -11 V .24 g 4717 4406 M -16 -9 V .24 g 4701 4397 M -11 -6 V .24 g 4690 4391 M -25 -14 V .24 g 4665 4377 M -3 -1 V .24 g 4662 4376 M -27 -16 V .24 g 4635 4360 M -5 -3 V .24 g 4630 4357 M -22 -13 V .24 g 4608 4344 M -13 -7 V .24 g 4595 4337 M -14 -9 V .24 g 4581 4328 M -19 -11 V .24 g 4562 4317 M -9 -6 V .24 g 4553 4311 M -24 -14 V .24 g 4529 4297 M -3 -2 V .24 g 4526 4295 M -27 -18 V .24 g 4499 4277 M -2 -1 V .24 g 4497 4276 M -25 -16 V .24 g 4472 4260 M -6 -4 V .24 g 4466 4256 M -22 -14 V .24 g 4444 4242 M -8 -6 V .24 g 4436 4236 M -19 -13 V .24 g 4417 4223 M -11 -7 V .24 g 4406 4216 M -16 -11 V .24 g 4390 4205 M -13 -9 V .24 g 4377 4196 M -14 -10 V .24 g 4363 4186 M -15 -10 V .24 g 4348 4176 M -13 -9 V .24 g 4335 4167 M -16 -12 V .24 g 4319 4155 M -11 -7 V .24 g 4308 4148 M -17 -13 V .24 g 4291 4135 M -10 -7 V .24 g 4281 4128 M -19 -13 V .24 g 4262 4115 M -8 -6 V .24 g 4254 4109 M -20 -14 V .24 g 4234 4095 M -8 -5 V .24 g 4226 4090 M -21 -15 V .24 g 4205 4075 M -6 -5 V .24 g 4199 4070 M -22 -15 V .24 g 4177 4055 M -5 -4 V .24 g 4172 4051 M -25 -16 V .24 g 4147 4035 M -2 -3 V .24 g 4145 4032 M -27 -18 V .24 g 4118 4014 M -1 0 V .24 g 4117 4014 M -27 -18 V .24 g 4090 3996 M -3 -2 V .24 g 4087 3994 M -24 -16 V .24 g 4063 3978 M -7 -4 V stroke 4056 3974 M .24 g 4056 3974 M -20 -12 V .24 g 4036 3962 M -14 -8 V .24 g 4022 3954 M -14 -9 V .24 g 4008 3945 M -21 -11 V .24 g 3987 3934 M -6 -4 V .24 g 3981 3930 M -27 -14 V .24 g 3954 3916 M -4 -2 V .24 g 3950 3914 M -23 -12 V .24 g 3927 3902 M -20 -9 V .24 g 3907 3893 M -8 -3 V .24 g 3899 3890 M -27 -11 V .24 g 3872 3879 M -14 -6 V .24 g 3858 3873 M -13 -4 V .24 g 3845 3869 M -27 -9 V .24 g 3818 3860 M -25 -7 V .24 g 3793 3853 M -3 -1 V .24 g 3790 3852 M -27 -6 V .24 g 3763 3846 M -27 -4 V .24 g 3736 3842 M -27 -3 V .24 g 3709 3839 M -28 -2 V .24 g 3681 3837 M -27 0 V .24 g 3654 3837 M -27 1 V .24 g 3627 3838 M -27 3 V .24 g 3600 3841 M -28 4 V .24 g 3572 3845 M -27 6 V .24 g 3545 3851 M -8 2 V .24 g 3537 3853 M -19 5 V .24 g 3518 3858 M -27 8 V 0 g .24 g 6052 1669 M .24 g 6052 1669 M -9 -13 V .24 g 6043 1656 M -14 -20 V .24 g 6029 1636 M -4 -7 V .24 g 6025 1629 M -10 -13 V .24 g 6015 1616 M -14 -20 V .24 g 6001 1596 M -3 -5 V .24 g 5998 1591 M -12 -15 V .24 g 5986 1576 M -14 -21 V .24 g 5972 1555 M -2 -2 V .24 g 5970 1553 M -13 -18 V .24 g 5957 1535 M -14 -18 V .24 g 5943 1517 M -2 -2 V .24 g 5941 1515 M -15 -20 V .24 g 5926 1495 M -10 -13 V .24 g 5916 1482 M -6 -7 V .24 g 5910 1475 M -16 -20 V .24 g 5894 1455 M -5 -8 V .24 g 5889 1447 M -11 -12 V .24 g 5878 1435 M -16 -21 V .24 g 5862 1414 M -1 0 V .24 g 5861 1414 M -16 -20 V .24 g 5845 1394 M -11 -13 V .24 g 5834 1381 M -5 -7 V .24 g 5829 1374 M -17 -20 V stroke 5812 1354 M .24 g 5812 1354 M -5 -6 V .24 g 5807 1348 M -13 -14 V .24 g 5794 1334 M -14 -18 V .24 g 5780 1316 M -3 -2 V .24 g 5777 1314 M -17 -21 V .24 g 5760 1293 M -8 -8 V .24 g 5752 1285 M -10 -12 V .24 g 5742 1273 M -17 -19 V .24 g 5725 1254 M -1 -1 V .24 g 5724 1253 M -17 -20 V .24 g 5707 1233 M -9 -10 V .24 g 5698 1223 M -9 -10 V .24 g 5689 1213 M -18 -20 V .24 g 5671 1193 M 0 -1 V .24 g 5671 1192 M -18 -20 V .24 g 5653 1172 M -10 -10 V .24 g 5643 1162 M -8 -10 V .24 g 5635 1152 M -18 -20 V .24 g 5617 1132 M -1 -1 V .24 g 5616 1131 M -17 -19 V .24 g 5599 1112 M -10 -12 V .24 g 5589 1100 M -8 -8 V .24 g 5581 1092 M -17 -20 V .24 g 5564 1072 M -2 -3 V .24 g 5562 1069 M -16 -17 V .24 g 5546 1052 M -12 -14 V .24 g 5534 1038 M -6 -7 V .24 g 5528 1031 M -17 -20 V .24 g 5511 1011 M -4 -4 V .24 g 5507 1007 M -14 -16 V .24 g 5493 991 M -13 -16 V .24 g 5480 975 M -4 -4 V .24 g 5476 971 M -17 -20 V .24 g 5459 951 M -6 -8 V .24 g 5453 943 M -11 -12 V .24 g 5442 931 M -17 -21 V .24 g .24 g 5425 910 M -16 -20 V .24 g 5409 890 M -11 -13 V .24 g 5398 877 M -6 -7 V .24 g 5392 870 M -16 -20 V .24 g 5376 850 M -5 -6 V .24 g 5371 844 M -12 -14 V .24 g 5359 830 M -15 -20 V .24 g 5344 810 M -1 0 V .24 g 5343 810 M -16 -20 V .24 g 5327 790 M -11 -14 V .24 g 5316 776 M -5 -7 V .24 g 5311 769 M -16 -20 V .24 g 5295 749 M -6 -8 V .24 g 5289 741 M -9 -12 V .24 g 5280 729 M -16 -20 V .24 g 5264 709 M -2 -3 V stroke 5262 706 M .24 g 5262 706 M -14 -17 V .24 g 5248 689 M -13 -18 V .24 g 5235 671 M -2 -2 V .24 g 5233 669 M -15 -21 V .24 g 5218 648 M -11 -13 V .24 g 5207 635 M -5 -7 V .24 g 5202 628 M -15 -20 V .24 g 5187 608 M -7 -9 V .24 g 5180 599 M -8 -11 V 0 g .22 g 1192 1817 M .22 g 1192 1817 M -12 21 V .22 g 1180 1838 M -6 9 V .22 g 1174 1847 M -6 11 V .22 g 1168 1858 M -12 20 V .22 g 1156 1878 M -9 15 V .22 g 1147 1893 M -3 5 V .22 g 1144 1898 M -12 20 V .22 g 1132 1918 M -11 20 V .22 g 1121 1938 M -1 2 V .22 g 1120 1940 M -11 19 V .22 g 1109 1959 M -11 20 V .22 g 1098 1979 M -5 9 V .22 g 1093 1988 M -6 11 V .22 g 1087 1999 M -11 20 V .22 g 1076 2019 M -11 19 V .22 g 1065 2038 M 0 1 V .22 g 1065 2039 M -11 20 V .22 g 1054 2059 M -11 20 V .22 g 1043 2079 M -5 11 V .22 g 1038 2090 M -5 10 V .22 g 1033 2100 M -10 20 V .22 g 1023 2120 M -11 20 V .22 g 1012 2140 M -1 3 V .22 g 1011 2143 M -9 17 V .22 g 1002 2160 M -10 20 V .22 g 992 2180 M -8 17 V .22 g 984 2197 M -2 3 V .22 g 982 2200 M -10 21 V .22 g 972 2221 M -10 20 V .22 g 962 2241 M -6 11 V .22 g 956 2252 M -4 9 V .22 g 952 2261 M -9 20 V .22 g 943 2281 M -10 20 V .22 g 933 2301 M -4 8 V .22 g 929 2309 M -6 12 V .22 g 923 2321 M -9 20 V .22 g 914 2341 M -9 21 V .22 g 905 2362 M -3 6 V .22 g 902 2368 M -7 14 V .22 g 895 2382 M -9 20 V .22 g 886 2402 M -9 20 V .22 g 877 2422 M -2 5 V .22 g 875 2427 M -7 15 V stroke 868 2442 M .22 g 868 2442 M -9 20 V .22 g 859 2462 M -9 21 V .22 g 850 2483 M -3 5 V .22 g 847 2488 M -6 15 V .22 g 841 2503 M -9 20 V .22 g 832 2523 M -9 20 V .22 g 823 2543 M -3 6 V .22 g 820 2549 M -6 14 V .22 g 814 2563 M -9 20 V .22 g 805 2583 M -9 21 V .22 g 796 2604 M -3 8 V .22 g 793 2612 M -5 12 V .22 g 788 2624 M -9 20 V .22 g 779 2644 M -9 20 V .22 g 770 2664 M -5 12 V .22 g 765 2676 M -3 8 V .22 g 762 2684 M -9 20 V .22 g 753 2704 M -8 20 V .22 g 745 2724 M -7 16 V .22 g 738 2740 M -2 5 V .22 g 736 2745 M -8 20 V .22 g 728 2765 M -8 20 V .22 g 720 2785 M -9 20 V .22 g .22 g 711 2805 M -8 20 V .22 g 703 2825 M -9 20 V .22 g 694 2845 M -8 21 V .22 g 686 2866 M -2 5 V .22 g 684 2871 M -6 15 V .22 g 678 2886 M -8 20 V .22 g 670 2906 M -9 20 V .22 g 661 2926 M -4 12 V .22 g 657 2938 M -4 8 V .22 g 653 2946 M -8 20 V .22 g 645 2966 M -8 20 V .22 g 637 2986 M -8 19 V .22 g 629 3005 M -1 2 V .22 g 628 3007 M -8 20 V .22 g 620 3027 M -8 20 V .22 g 612 3047 M -8 20 V .22 g 604 3067 M -2 5 V 0 g .22 g 2206 588 M .22 g 2206 588 M -16 20 V .22 g 2190 608 M -7 10 V .22 g 2183 618 M -8 10 V .22 g 2175 628 M -16 20 V .22 g 2159 648 M -4 5 V .22 g 2155 653 M -12 16 V .22 g 2143 669 M -15 19 V .22 g 2128 688 M -1 1 V .22 g 2127 689 M -16 20 V .22 g 2111 709 M -10 13 V .22 g 2101 722 M -6 7 V .22 g 2095 729 M -16 20 V stroke 2079 749 M .22 g 2079 749 M -5 8 V .22 g 2074 757 M -11 12 V .22 g 2063 769 M -16 21 V .22 g 2047 790 M -1 0 V .22 g 2046 790 M -16 20 V .22 g 2030 810 M -11 14 V .22 g 2019 824 M -5 6 V .22 g 2014 830 M -17 20 V .22 g 1997 850 M -5 6 V .22 g 1992 856 M -12 14 V .22 g 1980 870 M -15 19 V .22 g 1965 889 M -2 1 V .22 g 1963 890 M -17 20 V .22 g 1946 910 M -9 11 V .22 g 1937 921 M -8 10 V .22 g 1929 931 M -18 20 V .22 g 1911 951 M -1 1 V .22 g 1910 952 M -17 19 V .22 g 1893 971 M -10 12 V .22 g 1883 983 M -8 8 V .22 g 1875 991 M -18 20 V .22 g 1857 1011 M -1 2 V .22 g 1856 1013 M -17 18 V .22 g 1839 1031 M -11 12 V .22 g 1828 1043 M -7 9 V .22 g 1821 1052 M -19 20 V .22 g 1802 1072 M -1 1 V .22 g 1801 1073 M -18 19 V .22 g 1783 1092 M -9 10 V .22 g 1774 1102 M -9 10 V .22 g 1765 1112 M -18 19 V .22 g 1747 1131 M -1 1 V .22 g 1746 1132 M -19 20 V .22 g 1727 1152 M -8 8 V .22 g 1719 1160 M -11 12 V .22 g 1708 1172 M -16 17 V .22 g 1692 1189 M -3 4 V .22 g 1689 1193 M -19 20 V .22 g 1670 1213 M -5 5 V .22 g 1665 1218 M -14 15 V .22 g 1651 1233 M -13 14 V .22 g 1638 1247 M -6 6 V .22 g 1632 1253 M -19 20 V .22 g 1613 1273 M -3 4 V .22 g 1610 1277 M -15 16 V .22 g 1595 1293 M -12 13 V .22 g 1583 1306 M -7 8 V .22 g 1576 1314 M -18 20 V .22 g 1558 1334 M -2 2 V .22 g 1556 1336 M -16 18 V .22 g 1540 1354 M -11 13 V .22 g 1529 1367 M -7 7 V stroke 1522 1374 M .22 g 1522 1374 M -18 20 V .22 g 1504 1394 M -3 4 V .22 g 1501 1398 M -14 16 V .22 g 1487 1414 M -13 15 V .22 g 1474 1429 M -4 6 V .22 g 1470 1435 M -17 20 V .22 g 1453 1455 M -6 7 V .22 g 1447 1462 M -11 13 V .22 g 1436 1475 M -16 20 V .22 g .22 g 1420 1495 M -16 20 V .22 g 1404 1515 M -12 15 V .22 g 1392 1530 M -4 5 V .22 g 1388 1535 M -15 20 V .22 g 1373 1555 M -8 10 V .22 g 1365 1565 M -8 11 V .22 g 1357 1576 M -15 20 V .22 g 1342 1596 M -4 6 V .22 g 1338 1602 M -11 14 V .22 g 1327 1616 M -14 20 V .22 g 1313 1636 M -2 3 V .22 g 1311 1639 M -12 17 V .22 g 1299 1656 M -14 20 V .22 g 1285 1676 M -2 2 V .22 g 1283 1678 M -12 19 V .22 g 1271 1697 M -14 20 V .22 g 1257 1717 M -1 1 V .22 g 1256 1718 M -12 19 V .22 g 1244 1737 M -13 20 V .22 g 1231 1757 M -2 3 V .22 g 1229 1760 M -11 17 V .22 g 1218 1777 M -13 20 V .22 g 1205 1797 M -3 6 V .22 g 1202 1803 M -10 14 V 0 g .22 g 2149 4538 M .22 g 2149 4538 M -21 18 V .22 g 2128 4556 M -3 3 V .22 g 2125 4559 M -23 20 V .22 g 2102 4579 M -1 1 V .22 g 2101 4580 M -21 19 V .22 g 2080 4599 M -6 6 V .22 g 2074 4605 M -15 14 V 0 g .22 g 3736 3739 M .22 g 3736 3739 M -27 -3 V .22 g 3709 3736 M -28 -2 V .22 g 3681 3734 M -27 0 V .22 g 3654 3734 M -27 1 V .22 g 3627 3735 M -27 3 V .22 g 3600 3738 M -28 4 V .22 g 3572 3742 M -27 6 V .22 g 3545 3748 M -15 4 V .22 g 3530 3752 M -12 4 V .22 g 3518 3756 M -27 8 V .22 g 3491 3764 M -23 8 V stroke 3468 3772 M .22 g 3468 3772 M -5 2 V .22 g 3463 3774 M -27 11 V .22 g 3436 3785 M -17 8 V .22 g 3419 3793 M -10 4 V .22 g 3409 3797 M -27 14 V .22 g 3382 3811 M -5 2 V .22 g 3377 3813 M -23 12 V .22 g 3354 3825 M -14 8 V .22 g 3340 3833 M -13 7 V .22 g 3327 3840 M -23 13 V .22 g 3304 3853 M -4 3 V .22 g 3300 3856 M -27 16 V .22 g 3273 3872 M -2 1 V .22 g 3271 3873 M -26 16 V .22 g 3245 3889 M -6 4 V .22 g 3239 3893 M -21 14 V .22 g 3218 3907 M -10 7 V .22 g 3208 3914 M -17 11 V .22 g 3191 3925 M -14 9 V .22 g 3177 3934 M -13 9 V .22 g 3164 3943 M -17 11 V .22 g 3147 3954 M -11 7 V .22 g 3136 3961 M -19 13 V .22 g 3117 3974 M -8 5 V .22 g 3109 3979 M -22 15 V .22 g 3087 3994 M -5 4 V .22 g 3082 3998 M -25 16 V .22 g 3057 4014 M -2 2 V .22 g 3055 4016 M -28 19 V .22 g .22 g 3027 4035 M -27 18 V .22 g 3000 4053 M -3 2 V .22 g 2997 4055 M -24 16 V .22 g 2973 4071 M -7 4 V .22 g 2966 4075 M -20 13 V .22 g 2946 4088 M -11 7 V .22 g 2935 4095 M -17 10 V .22 g 2918 4105 M -15 10 V .22 g 2903 4115 M -12 7 V .22 g 2891 4122 M -21 13 V .22 g 2870 4135 M -6 4 V .22 g 2864 4139 M -27 16 V .22 g 2837 4155 M -1 0 V .22 g 2836 4155 M -27 16 V .22 g 2809 4171 M -8 5 V .22 g 2801 4176 M -19 10 V .22 g 2782 4186 M -17 10 V .22 g 2765 4196 M -10 5 V .22 g 2755 4201 M -27 15 V .22 g 2728 4216 M -1 0 V .22 g 2727 4216 M -27 14 V .22 g 2700 4230 M -12 6 V .22 g 2688 4236 M -15 8 V stroke 2673 4244 M .22 g 2673 4244 M -25 12 V .22 g 2648 4256 M -2 1 V .22 g 2646 4257 M -27 14 V .22 g 2619 4271 M -12 5 V .22 g 2607 4276 M -16 8 V .22 g 2591 4284 M -26 13 V .22 g 2565 4297 M -1 0 V .22 g 2564 4297 M -27 13 V .22 g 2537 4310 M -14 7 V .22 g 2523 4317 M -13 6 V .22 g 2510 4323 M -28 13 V .22 g 2482 4336 M -1 1 V .22 g 2481 4337 M -26 12 V .22 g 2455 4349 M -15 8 V .22 g 2440 4357 M -12 6 V .22 g 2428 4363 M -27 14 V .22 g 2401 4377 M -1 0 V .22 g 2400 4377 M -27 14 V .22 g 2373 4391 M -11 6 V .22 g 2362 4397 M -16 9 V .22 g 2346 4406 M -20 11 V .22 g 2326 4417 M -7 4 V .22 g 2319 4421 M -27 17 V .22 g .22 g 2292 4438 M -28 17 V .22 g 2264 4455 M -4 3 V .22 g 2260 4458 M -23 15 V .22 g 2237 4473 M -7 5 V .22 g 2230 4478 M -20 14 V .22 g 2210 4492 M -9 6 V .22 g 2201 4498 M -18 14 V .22 g 2183 4512 M -8 6 V .22 g 2175 4518 M -20 15 V .22 g 2155 4533 M -6 5 V 0 g .22 g 5214 4619 M .22 g 5214 4619 M -7 -6 V .22 g 5207 4613 M -16 -14 V .22 g 5191 4599 M -11 -9 V .22 g 5180 4590 M -14 -11 V .22 g 5166 4579 M -13 -11 V .22 g 5153 4568 M -13 -9 V .22 g 5140 4559 M -14 -12 V .22 g 5126 4547 M -13 -9 V .22 g 5113 4538 M -15 -10 V .22 g 5098 4528 M -14 -10 V .22 g 5084 4518 M -13 -9 V .22 g 5071 4509 M -17 -11 V .22 g 5054 4498 M -10 -7 V .22 g 5044 4491 M -22 -13 V .22 g 5022 4478 M -5 -4 V .22 g 5017 4474 M -28 -16 V .22 g .22 g 4989 4458 M -27 -16 V .22 g 4962 4442 M -8 -4 V .22 g 4954 4438 M -19 -11 V stroke 4935 4427 M .22 g 4935 4427 M -17 -10 V .22 g 4918 4417 M -10 -5 V .22 g 4908 4412 M -28 -15 V .22 g .22 g 4880 4397 M -27 -14 V .22 g 4853 4383 M -11 -6 V .22 g 4842 4377 M -16 -9 V .22 g 4826 4368 M -22 -11 V .22 g 4804 4357 M -5 -3 V .22 g 4799 4354 M -28 -14 V .22 g 4771 4340 M -6 -3 V .22 g 4765 4337 M -21 -12 V .22 g 4744 4325 M -16 -8 V .22 g 4728 4317 M -11 -6 V .22 g 4717 4311 M -27 -14 V .22 g 4690 4297 M 0 -1 V .22 g 4690 4296 M -28 -15 V .22 g 4662 4281 M -8 -5 V .22 g 4654 4276 M -19 -10 V .22 g 4635 4266 M -16 -10 V .22 g 4619 4256 M -11 -6 V .22 g 4608 4250 M -24 -14 V .22 g 4584 4236 M -3 -2 V .22 g 4581 4234 M -28 -17 V .22 g 4553 4217 M -2 -1 V .22 g 4551 4216 M -25 -16 V .22 g 4526 4200 M -7 -4 V .22 g 4519 4196 M -20 -13 V .22 g 4499 4183 M -12 -7 V .22 g 4487 4176 M -15 -11 V .22 g 4472 4165 M -16 -10 V .22 g 4456 4155 M -12 -8 V .22 g 4444 4147 M -18 -12 V .22 g 4426 4135 M -9 -6 V .22 g 4417 4129 M -20 -14 V .22 g 4397 4115 M -7 -5 V .22 g 4390 4110 M -22 -15 V .22 g 4368 4095 M -5 -4 V .22 g 4363 4091 M -23 -16 V .22 g 4340 4075 M -5 -3 V .22 g 4335 4072 M -24 -17 V .22 g 4311 4055 M -3 -3 V .22 g 4308 4052 M -25 -17 V .22 g 4283 4035 M -2 -2 V .22 g 4281 4033 M -25 -19 V .22 g 4256 4014 M -2 -1 V .22 g 4254 4013 M -26 -19 V .22 g 4228 3994 M -2 -1 V .22 g 4226 3993 M -26 -19 V .22 g 4200 3974 M -1 -1 V .22 g 4199 3973 M -27 -19 V .22 g .22 g 4172 3954 M -27 -19 V .22 g 4145 3935 M -2 -1 V stroke 4143 3934 M .22 g 4143 3934 M -26 -18 V .22 g 4117 3916 M -3 -2 V .22 g 4114 3914 M -24 -17 V .22 g 4090 3897 M -6 -4 V .22 g 4084 3893 M -21 -14 V .22 g 4063 3879 M -10 -6 V .22 g 4053 3873 M -17 -11 V .22 g 4036 3862 M -15 -9 V .22 g 4021 3853 M -13 -8 V .22 g 4008 3845 M -21 -12 V .22 g 3987 3833 M -6 -3 V .22 g 3981 3830 M -27 -15 V .22 g 3954 3815 M -4 -2 V .22 g 3950 3813 M -23 -12 V .22 g 3927 3801 M -18 -8 V .22 g 3909 3793 M -10 -5 V .22 g 3899 3788 M -27 -11 V .22 g 3872 3777 M -11 -5 V .22 g 3861 3772 M -16 -6 V .22 g 3845 3766 M -27 -9 V .22 g 3818 3757 M -18 -5 V .22 g 3800 3752 M -10 -2 V .22 g 3790 3750 M -27 -7 V .22 g 3763 3743 M -27 -4 V 0 g .22 g 6052 1764 M .22 g 6052 1764 M -5 -7 V .22 g 6047 1757 M -14 -20 V .22 g 6033 1737 M -8 -12 V .22 g 6025 1725 M -6 -8 V .22 g 6019 1717 M -14 -20 V .22 g 6005 1697 M -7 -10 V .22 g 5998 1687 M -8 -11 V .22 g 5990 1676 M -15 -20 V .22 g 5975 1656 M -5 -6 V .22 g 5970 1650 M -10 -14 V .22 g 5960 1636 M -15 -20 V .22 g 5945 1616 M -2 -2 V .22 g 5943 1614 M -14 -18 V .22 g 5929 1596 M -13 -17 V .22 g 5916 1579 M -3 -3 V .22 g 5913 1576 M -16 -21 V .22 g 5897 1555 M -8 -11 V .22 g 5889 1544 M -8 -9 V .22 g 5881 1535 M -17 -20 V .22 g 5864 1515 M -3 -4 V .22 g 5861 1511 M -13 -16 V .22 g 5848 1495 M -14 -16 V .22 g 5834 1479 M -3 -4 V .22 g 5831 1475 M -17 -20 V .22 g 5814 1455 M -7 -8 V .22 g 5807 1447 M -11 -12 V .22 g 5796 1435 M -16 -20 V .22 g 5780 1415 M -1 -1 V stroke 5779 1414 M .22 g 5779 1414 M -18 -20 V .22 g 5761 1394 M -9 -10 V .22 g 5752 1384 M -9 -10 V .22 g 5743 1374 M -18 -20 V .22 g .22 g 5725 1354 M -18 -20 V .22 g 5707 1334 M -9 -11 V .22 g 5698 1323 M -9 -9 V .22 g 5689 1314 M -18 -21 V .22 g .22 g 5671 1293 M -18 -20 V .22 g 5653 1273 M -10 -10 V .22 g 5643 1263 M -8 -10 V .22 g 5635 1253 M -19 -20 V .22 g .22 g 5616 1233 M -18 -20 V .22 g 5598 1213 M -9 -11 V .22 g 5589 1202 M -9 -9 V .22 g 5580 1193 M -18 -21 V .22 g .22 g 5562 1172 M -18 -20 V .22 g 5544 1152 M -10 -11 V .22 g 5534 1141 M -7 -9 V .22 g 5527 1132 M -18 -20 V .22 g 5509 1112 M -2 -2 V .22 g 5507 1110 M -15 -18 V .22 g 5492 1092 M -12 -14 V .22 g 5480 1078 M -6 -6 V .22 g 5474 1072 M -17 -20 V .22 g 5457 1052 M -4 -6 V .22 g 5453 1046 M -13 -15 V .22 g 5440 1031 M -15 -17 V .22 g 5425 1014 M -2 -3 V .22 g 5423 1011 M -16 -20 V .22 g 5407 991 M -9 -10 V .22 g 5398 981 M -8 -10 V .22 g 5390 971 M -16 -20 V .22 g 5374 951 M -3 -4 V .22 g 5371 947 M -14 -16 V .22 g 5357 931 M -13 -18 V .22 g 5344 913 M -3 -3 V .22 g 5341 910 M -16 -20 V .22 g 5325 890 M -9 -11 V .22 g 5316 879 M -7 -9 V .22 g 5309 870 M -15 -20 V .22 g 5294 850 M -5 -6 V .22 g 5289 844 M -11 -14 V .22 g 5278 830 M -15 -20 V .22 g 5263 810 M -1 -1 V .22 g 5262 809 M -15 -19 V .22 g 5247 790 M -12 -17 V .22 g 5235 773 M -3 -4 V .22 g 5232 769 M -16 -20 V .22 g 5216 749 M -9 -12 V .22 g 5207 737 M -6 -8 V .22 g 5201 729 M -15 -20 V stroke 5186 709 M .22 g 5186 709 M -6 -8 V .22 g 5180 701 M -9 -12 V .22 g 5171 689 M -15 -20 V .22 g 5156 669 M -3 -5 V .22 g 5153 664 M -12 -16 V .22 g 5141 648 M -15 -20 V .22 g .22 g 5126 628 M -15 -20 V .22 g 5111 608 M -13 -17 V .22 g 5098 591 M -2 -3 V 0 g .2 g 1256 1817 M .2 g 1256 1817 M 0 1 V .2 g 1256 1818 M -13 20 V .2 g 1243 1838 M -14 20 V .2 g 1229 1858 M 0 1 V .2 g 1229 1859 M -12 19 V .2 g 1217 1878 M -13 20 V .2 g 1204 1898 M -2 3 V .2 g 1202 1901 M -11 17 V .2 g 1191 1918 M -12 20 V .2 g 1179 1938 M -5 8 V .2 g 1174 1946 M -7 13 V .2 g 1167 1959 M -12 20 V .2 g 1155 1979 M -8 12 V .2 g 1147 1991 M -4 8 V .2 g 1143 1999 M -12 20 V .2 g 1131 2019 M -11 19 V .2 g 1120 2038 M -1 1 V .2 g 1119 2039 M -11 20 V .2 g 1108 2059 M -11 20 V .2 g 1097 2079 M -4 8 V .2 g 1093 2087 M -7 13 V .2 g 1086 2100 M -11 20 V .2 g 1075 2120 M -10 17 V .2 g 1065 2137 M -1 3 V .2 g 1064 2140 M -11 20 V .2 g 1053 2160 M -11 20 V .2 g 1042 2180 M -4 8 V .2 g 1038 2188 M -6 12 V .2 g 1032 2200 M -10 21 V .2 g 1022 2221 M -11 20 V .2 g .2 g 1011 2241 M -10 20 V .2 g 1001 2261 M -10 20 V .2 g 991 2281 M -7 15 V .2 g 984 2296 M -3 5 V .2 g 981 2301 M -10 20 V .2 g 971 2321 M -10 20 V .2 g 961 2341 M -5 11 V .2 g 956 2352 M -4 10 V .2 g 952 2362 M -10 20 V .2 g 942 2382 M -10 20 V .2 g 932 2402 M -3 7 V .2 g 929 2409 M -6 13 V .2 g 923 2422 M -9 20 V stroke 914 2442 M .2 g 914 2442 M -10 20 V .2 g 904 2462 M -2 5 V .2 g 902 2467 M -7 16 V .2 g 895 2483 M -9 20 V .2 g 886 2503 M -10 20 V .2 g 876 2523 M -1 4 V .2 g 875 2527 M -8 16 V .2 g 867 2543 M -9 20 V .2 g 858 2563 M -9 20 V .2 g 849 2583 M -2 5 V .2 g 847 2588 M -6 16 V .2 g 841 2604 M -9 20 V .2 g 832 2624 M -9 20 V .2 g 823 2644 M -3 6 V .2 g 820 2650 M -6 14 V .2 g 814 2664 M -9 20 V .2 g 805 2684 M -8 20 V .2 g 797 2704 M -4 9 V .2 g 793 2713 M -5 11 V .2 g 788 2724 M -8 21 V .2 g 780 2745 M -9 20 V .2 g 771 2765 M -6 12 V .2 g 765 2777 M -3 8 V .2 g 762 2785 M -8 20 V .2 g 754 2805 M -8 20 V .2 g 746 2825 M -8 17 V .2 g 738 2842 M -1 3 V .2 g 737 2845 M -8 21 V .2 g 729 2866 M -9 20 V .2 g 720 2886 M -8 20 V .2 g 712 2906 M -1 2 V .2 g 711 2908 M -7 18 V .2 g 704 2926 M -9 20 V .2 g 695 2946 M -8 20 V .2 g 687 2966 M -3 9 V .2 g 684 2975 M -5 11 V .2 g 679 2986 M -8 21 V .2 g 671 3007 M -8 20 V .2 g 663 3027 M -6 15 V .2 g 657 3042 M -3 5 V .2 g 654 3047 M -8 20 V .2 g 646 3067 M -8 20 V .2 g 638 3087 M -8 20 V .2 g 630 3107 M -1 2 V .2 g 629 3109 M -7 19 V .2 g 622 3128 M -8 20 V .2 g 614 3148 M -8 20 V .2 g 606 3168 M -4 9 V 0 g .2 g 2288 588 M .2 g 2288 588 M -16 20 V .2 g 2272 608 M -8 10 V .2 g 2264 618 M -7 10 V .2 g 2257 628 M -16 20 V stroke 2241 648 M .2 g 2241 648 M -4 6 V .2 g 2237 654 M -11 15 V .2 g 2226 669 M -15 20 V .2 g 2211 689 M -1 1 V .2 g 2210 690 M -15 19 V .2 g 2195 709 M -12 16 V .2 g 2183 725 M -3 4 V .2 g 2180 729 M -16 20 V .2 g 2164 749 M -9 12 V .2 g 2155 761 M -6 8 V .2 g 2149 769 M -16 21 V .2 g 2133 790 M -5 6 V .2 g 2128 796 M -11 14 V .2 g 2117 810 M -15 20 V .2 g 2102 830 M -1 1 V .2 g 2101 831 M -15 19 V .2 g 2086 850 M -12 15 V .2 g 2074 865 M -4 5 V .2 g 2070 870 M -17 20 V .2 g 2053 890 M -7 9 V .2 g 2046 899 M -9 11 V .2 g 2037 910 M -16 21 V .2 g 2021 931 M -2 2 V .2 g 2019 933 M -15 18 V .2 g 2004 951 M -12 15 V .2 g 1992 966 M -5 5 V .2 g 1987 971 M -17 20 V .2 g 1970 991 M -5 7 V .2 g 1965 998 M -12 13 V .2 g 1953 1011 M -16 19 V .2 g 1937 1030 M -1 1 V .2 g 1936 1031 M -18 21 V .2 g 1918 1052 M -8 9 V .2 g 1910 1061 M -10 11 V .2 g 1900 1072 M -17 20 V .2 g .2 g 1883 1092 M -19 20 V .2 g 1864 1112 M -8 10 V .2 g 1856 1122 M -10 10 V .2 g 1846 1132 M -18 20 V .2 g .2 g 1828 1152 M -19 20 V .2 g 1809 1172 M -8 9 V .2 g 1801 1181 M -11 12 V .2 g 1790 1193 M -16 17 V .2 g 1774 1210 M -3 3 V .2 g 1771 1213 M -19 20 V .2 g 1752 1233 M -5 6 V .2 g 1747 1239 M -14 14 V .2 g 1733 1253 M -14 14 V .2 g 1719 1267 M -5 6 V .2 g 1714 1273 M -20 20 V .2 g 1694 1293 M -2 3 V .2 g 1692 1296 M -17 18 V stroke 1675 1314 M .2 g 1675 1314 M -10 10 V .2 g 1665 1324 M -9 10 V .2 g 1656 1334 M -18 19 V .2 g 1638 1353 M -2 1 V .2 g 1636 1354 M -19 20 V .2 g 1617 1374 M -7 7 V .2 g 1610 1381 M -12 13 V .2 g 1598 1394 M -15 17 V .2 g 1583 1411 M -4 3 V .2 g 1579 1414 M -18 21 V .2 g 1561 1435 M -5 5 V .2 g 1556 1440 M -14 15 V .2 g 1542 1455 M -13 15 V .2 g 1529 1470 M -5 5 V .2 g 1524 1475 M -18 20 V .2 g 1506 1495 M -5 5 V .2 g 1501 1500 M -12 15 V .2 g 1489 1515 M -15 17 V .2 g 1474 1532 M -3 3 V .2 g 1471 1535 M -17 20 V .2 g 1454 1555 M -7 9 V .2 g 1447 1564 M -10 12 V .2 g 1437 1576 M -17 20 V .2 g 1420 1596 M 0 1 V .2 g 1420 1597 M -16 19 V .2 g 1404 1616 M -12 15 V .2 g 1392 1631 M -4 5 V .2 g 1388 1636 M -16 20 V .2 g 1372 1656 M -7 10 V .2 g 1365 1666 M -8 10 V .2 g 1357 1676 M -15 21 V .2 g 1342 1697 M -4 5 V .2 g 1338 1702 M -11 15 V .2 g 1327 1717 M -15 20 V .2 g 1312 1737 M -1 2 V .2 g 1311 1739 M -13 18 V .2 g 1298 1757 M -14 20 V .2 g 1284 1777 M -1 1 V .2 g 1283 1778 M -13 19 V .2 g 1270 1797 M -14 20 V 0 g .2 g 2292 4332 M .2 g 2292 4332 M -8 5 V .2 g 2284 4337 M -20 12 V .2 g 2264 4349 M -12 8 V .2 g 2252 4357 M -15 9 V .2 g 2237 4366 M -16 11 V .2 g 2221 4377 M -11 8 V .2 g 2210 4385 M -17 12 V .2 g 2193 4397 M -10 8 V .2 g 2183 4405 M -17 12 V .2 g 2166 4417 M -11 9 V .2 g 2155 4426 M -14 12 V .2 g 2141 4438 M -13 10 V stroke 2128 4448 M .2 g 2128 4448 M -11 10 V .2 g 2117 4458 M -16 14 V .2 g 2101 4472 M -7 6 V .2 g 2094 4478 M -20 19 V .2 g 2074 4497 M -2 1 V .2 g 2072 4498 M -21 20 V .2 g 2051 4518 M -5 5 V .2 g 2046 4523 M -15 15 V .2 g 2031 4538 M -12 13 V .2 g 2019 4551 M -7 8 V .2 g 2012 4559 M -18 20 V .2 g 1994 4579 M -2 2 V .2 g 1992 4581 M -16 18 V .2 g 1976 4599 M -11 13 V .2 g 1965 4612 M -6 7 V 0 g .2 g 3922 3692 M .2 g 3922 3692 M -23 -11 V .2 g 3899 3681 M -21 -9 V .2 g 3878 3672 M -6 -3 V .2 g 3872 3669 M -27 -11 V .2 g 3845 3658 M -20 -6 V .2 g 3825 3652 M -7 -3 V .2 g 3818 3649 M -28 -8 V .2 g 3790 3641 M -27 -6 V .2 g 3763 3635 M -18 -4 V .2 g 3745 3631 M -9 -1 V .2 g 3736 3630 M -27 -4 V .2 g 3709 3626 M -28 -1 V .2 g 3681 3625 M -27 0 V .2 g 3654 3625 M -27 1 V .2 g 3627 3626 M -27 3 V .2 g 3600 3629 M -13 2 V .2 g 3587 3631 M -15 3 V .2 g 3572 3634 M -27 6 V .2 g 3545 3640 M -27 7 V .2 g 3518 3647 M -13 5 V .2 g 3505 3652 M -14 4 V .2 g 3491 3656 M -28 11 V .2 g 3463 3667 M -11 5 V .2 g 3452 3672 M -16 6 V .2 g 3436 3678 M -27 13 V .2 g 3409 3691 M -2 1 V .2 g 3407 3692 M -25 13 V .2 g 3382 3705 M -14 7 V .2 g 3368 3712 M -14 7 V .2 g 3354 3719 M -22 13 V .2 g 3332 3732 M -5 3 V .2 g 3327 3735 M -27 16 V .2 g 3300 3751 M -2 1 V .2 g 3298 3752 M -25 16 V .2 g 3273 3768 M -7 4 V .2 g 3266 3772 M -21 14 V .2 g 3245 3786 M -10 7 V stroke 3235 3793 M .2 g 3235 3793 M -17 11 V .2 g 3218 3804 M -13 9 V .2 g 3205 3813 M -14 9 V .2 g 3191 3822 M -16 11 V .2 g 3175 3833 M -11 8 V .2 g 3164 3841 M -18 12 V .2 g 3146 3853 M -10 7 V .2 g 3136 3860 M -19 13 V .2 g 3117 3873 M -8 6 V .2 g 3109 3879 M -22 14 V .2 g 3087 3893 M -5 4 V .2 g 3082 3897 M -24 17 V .2 g 3058 3914 M -3 2 V .2 g 3055 3916 M -26 18 V .2 g 3029 3934 M -2 1 V .2 g 3027 3935 M -27 18 V .2 g 3000 3953 M -1 1 V .2 g 2999 3954 M -26 17 V .2 g 2973 3971 M -4 3 V .2 g 2969 3974 M -23 15 V .2 g 2946 3989 M -8 5 V .2 g 2938 3994 M -20 13 V .2 g 2918 4007 M -12 7 V .2 g 2906 4014 M -15 10 V .2 g 2891 4024 M -18 11 V .2 g 2873 4035 M -9 5 V .2 g 2864 4040 M -24 15 V .2 g 2840 4055 M -3 1 V .2 g 2837 4056 M -28 16 V .2 g 2809 4072 M -4 3 V .2 g 2805 4075 M -23 13 V .2 g 2782 4088 M -14 7 V .2 g 2768 4095 M -13 7 V .2 g 2755 4102 M -24 13 V .2 g 2731 4115 M -3 2 V .2 g 2728 4117 M -28 14 V .2 g 2700 4131 M -8 4 V .2 g 2692 4135 M -19 10 V .2 g 2673 4145 M -22 10 V .2 g 2651 4155 M -5 3 V .2 g 2646 4158 M -27 13 V .2 g 2619 4171 M -10 5 V .2 g 2609 4176 M -18 8 V .2 g 2591 4184 M -25 12 V .2 g 2566 4196 M -2 1 V .2 g 2564 4197 M -27 12 V .2 g 2537 4209 M -15 7 V .2 g 2522 4216 M -12 6 V .2 g 2510 4222 M -28 12 V .2 g 2482 4234 M -3 2 V .2 g 2479 4236 M -24 11 V .2 g 2455 4247 M -19 9 V stroke 2436 4256 M .2 g 2436 4256 M -8 4 V .2 g 2428 4260 M -27 14 V .2 g 2401 4274 M -6 2 V .2 g 2395 4276 M -22 11 V .2 g 2373 4287 M -17 10 V .2 g 2356 4297 M -10 5 V .2 g 2346 4302 M -27 15 V .2 g .2 g 2319 4317 M -27 15 V 0 g .2 g 5325 4619 M .2 g 5325 4619 M -9 -9 V .2 g 5316 4610 M -10 -11 V .2 g 5306 4599 M -17 -18 V .2 g 5289 4581 M -3 -2 V .2 g 5286 4579 M -20 -20 V .2 g 5266 4559 M -4 -5 V .2 g 5262 4554 M -17 -16 V .2 g 5245 4538 M -10 -9 V .2 g 5235 4529 M -13 -11 V .2 g 5222 4518 M -15 -13 V .2 g 5207 4505 M -8 -7 V .2 g 5199 4498 M -19 -16 V .2 g 5180 4482 M -6 -4 V .2 g 5174 4478 M -21 -17 V .2 g 5153 4461 M -5 -3 V .2 g 5148 4458 M -22 -17 V .2 g 5126 4441 M -5 -3 V .2 g 5121 4438 M -23 -16 V .2 g 5098 4422 M -6 -5 V .2 g 5092 4417 M -21 -14 V .2 g 5071 4403 M -10 -6 V .2 g 5061 4397 M -17 -11 V .2 g 5044 4386 M -15 -9 V .2 g 5029 4377 M -12 -7 V .2 g 5017 4370 M -22 -13 V .2 g 4995 4357 M -6 -3 V .2 g 4989 4354 M -27 -15 V .2 g 4962 4339 M -3 -2 V .2 g 4959 4337 M -24 -13 V .2 g 4935 4324 M -14 -7 V .2 g 4921 4317 M -13 -8 V .2 g 4908 4309 M -25 -12 V .2 g 4883 4297 M -3 -2 V .2 g 4880 4295 M -27 -14 V .2 g 4853 4281 M -10 -5 V .2 g 4843 4276 M -17 -9 V .2 g 4826 4267 M -22 -11 V .2 g 4804 4256 M -5 -2 V .2 g 4799 4254 M -28 -14 V .2 g 4771 4240 M -7 -4 V .2 g 4764 4236 M -20 -10 V .2 g 4744 4226 M -19 -10 V .2 g 4725 4216 M -8 -5 V .2 g 4717 4211 M -27 -14 V stroke 4690 4197 M .2 g 4690 4197 M -2 -1 V .2 g 4688 4196 M -26 -14 V .2 g 4662 4182 M -11 -6 V .2 g 4651 4176 M -16 -9 V .2 g 4635 4167 M -20 -12 V .2 g 4615 4155 M -7 -4 V .2 g 4608 4151 M -27 -16 V .2 g .2 g 4581 4135 M -28 -16 V .2 g 4553 4119 M -6 -4 V .2 g 4547 4115 M -21 -13 V .2 g 4526 4102 M -11 -7 V .2 g 4515 4095 M -16 -11 V .2 g 4499 4084 M -15 -9 V .2 g 4484 4075 M -12 -8 V .2 g 4472 4067 M -19 -12 V .2 g 4453 4055 M -9 -6 V .2 g 4444 4049 M -20 -14 V .2 g 4424 4035 M -7 -5 V .2 g 4417 4030 M -22 -16 V .2 g 4395 4014 M -5 -3 V .2 g 4390 4011 M -24 -17 V .2 g 4366 3994 M -3 -2 V .2 g 4363 3992 M -25 -18 V .2 g 4338 3974 M -3 -2 V .2 g 4335 3972 M -25 -18 V .2 g 4310 3954 M -2 -2 V .2 g 4308 3952 M -25 -18 V .2 g 4283 3934 M -2 -2 V .2 g 4281 3932 M -25 -18 V .2 g 4256 3914 M -2 -2 V .2 g 4254 3912 M -26 -19 V .2 g 4228 3893 M -2 -1 V .2 g 4226 3892 M -25 -19 V .2 g 4201 3873 M -2 -1 V .2 g 4199 3872 M -25 -19 V .2 g 4174 3853 M -2 -1 V .2 g 4172 3852 M -26 -19 V .2 g 4146 3833 M -1 -1 V .2 g 4145 3832 M -28 -19 V .2 g .2 g 4117 3813 M -27 -19 V .2 g 4090 3794 M -1 -1 V .2 g 4089 3793 M -26 -18 V .2 g 4063 3775 M -4 -3 V .2 g 4059 3772 M -23 -15 V .2 g 4036 3757 M -8 -5 V .2 g 4028 3752 M -20 -12 V .2 g 4008 3740 M -13 -8 V .2 g 3995 3732 M -14 -8 V .2 g 3981 3724 M -21 -12 V .2 g 3960 3712 M -6 -3 V .2 g 3954 3709 M -27 -15 V .2 g 3927 3694 M -5 -2 V stroke 3922 3692 M 0 g .2 g 5047 628 M .2 g 5047 628 M -3 -4 V .2 g 5044 624 M -12 -16 V .2 g 5032 608 M -15 -20 V 0 g .2 g 6052 1864 M .2 g 6052 1864 M -4 -6 V .2 g 6048 1858 M -14 -20 V .2 g 6034 1838 M -9 -13 V .2 g 6025 1825 M -6 -8 V .2 g 6019 1817 M -14 -20 V .2 g 6005 1797 M -7 -10 V .2 g 5998 1787 M -8 -10 V .2 g 5990 1777 M -15 -20 V .2 g 5975 1757 M -5 -7 V .2 g 5970 1750 M -10 -13 V .2 g 5960 1737 M -16 -20 V .2 g 5944 1717 M -1 -2 V .2 g 5943 1715 M -14 -18 V .2 g 5929 1697 M -13 -17 V .2 g 5916 1680 M -3 -4 V .2 g 5913 1676 M -17 -20 V .2 g 5896 1656 M -7 -9 V .2 g 5889 1647 M -9 -11 V .2 g 5880 1636 M -17 -20 V .2 g 5863 1616 M -2 -2 V .2 g 5861 1614 M -15 -18 V .2 g 5846 1596 M -12 -14 V .2 g 5834 1582 M -5 -6 V .2 g 5829 1576 M -18 -21 V .2 g 5811 1555 M -4 -5 V .2 g 5807 1550 M -14 -15 V .2 g 5793 1535 M -13 -16 V .2 g 5780 1519 M -4 -4 V .2 g 5776 1515 M -18 -20 V .2 g 5758 1495 M -6 -6 V .2 g 5752 1489 M -13 -14 V .2 g 5739 1475 M -14 -16 V .2 g 5725 1459 M -4 -4 V .2 g 5721 1455 M -18 -20 V .2 g 5703 1435 M -5 -6 V .2 g 5698 1429 M -14 -15 V .2 g 5684 1414 M -13 -15 V .2 g 5671 1399 M -5 -5 V .2 g 5666 1394 M -19 -20 V .2 g 5647 1374 M -4 -5 V .2 g 5643 1369 M -14 -15 V .2 g 5629 1354 M -13 -14 V .2 g 5616 1340 M -5 -6 V .2 g 5611 1334 M -19 -20 V .2 g 5592 1314 M -3 -4 V .2 g 5589 1310 M -15 -17 V .2 g 5574 1293 M -12 -13 V .2 g 5562 1280 M -6 -7 V stroke 5556 1273 M .2 g 5556 1273 M -18 -20 V .2 g 5538 1253 M -4 -4 V .2 g 5534 1249 M -14 -16 V .2 g 5520 1233 M -13 -15 V .2 g 5507 1218 M -5 -5 V .2 g 5502 1213 M -17 -20 V .2 g 5485 1193 M -5 -6 V .2 g 5480 1187 M -13 -15 V .2 g 5467 1172 M -14 -17 V .2 g 5453 1155 M -3 -3 V .2 g 5450 1152 M -17 -20 V .2 g 5433 1132 M -8 -9 V .2 g 5425 1123 M -9 -11 V .2 g 5416 1112 M -16 -20 V .2 g 5400 1092 M -2 -2 V .2 g 5398 1090 M -15 -18 V .2 g 5383 1072 M -12 -16 V .2 g 5371 1056 M -4 -4 V .2 g 5367 1052 M -16 -21 V .2 g 5351 1031 M -7 -9 V .2 g 5344 1022 M -9 -11 V .2 g 5335 1011 M -16 -20 V .2 g 5319 991 M -3 -3 V .2 g 5316 988 M -13 -17 V .2 g 5303 971 M -14 -18 V .2 g 5289 953 M -1 -2 V .2 g 5288 951 M -16 -20 V .2 g 5272 931 M -10 -14 V .2 g 5262 917 M -5 -7 V .2 g 5257 910 M -16 -20 V .2 g 5241 890 M -6 -9 V .2 g 5235 881 M -9 -11 V .2 g 5226 870 M -15 -20 V .2 g 5211 850 M -4 -5 V .2 g 5207 845 M -11 -15 V .2 g 5196 830 M -15 -20 V .2 g 5181 810 M -1 -2 V .2 g 5180 808 M -14 -18 V .2 g 5166 790 M -13 -19 V .2 g 5153 771 M -2 -2 V .2 g 5151 769 M -15 -20 V .2 g 5136 749 M -10 -15 V .2 g 5126 734 M -4 -5 V .2 g 5122 729 M -15 -20 V .2 g 5107 709 M -9 -12 V .2 g 5098 697 M -6 -8 V .2 g 5092 689 M -15 -20 V .2 g 5077 669 M -6 -8 V .2 g 5071 661 M -9 -13 V .2 g 5062 648 M -15 -20 V 0 g .18 g 618 3248 M .18 g 618 3248 M -8 21 V .18 g 610 3269 M -8 19 V stroke 602 3288 M 0 g .18 g 1338 1807 M .18 g 1338 1807 M -8 10 V .18 g 1330 1817 M -15 21 V .18 g 1315 1838 M -4 6 V .18 g 1311 1844 M -10 14 V .18 g 1301 1858 M -15 20 V .18 g 1286 1878 M -3 4 V .18 g 1283 1882 M -11 16 V .18 g 1272 1898 M -13 20 V .18 g 1259 1918 M -3 4 V .18 g 1256 1922 M -11 16 V .18 g 1245 1938 M -13 21 V .18 g 1232 1959 M -3 4 V .18 g 1229 1963 M -10 16 V .18 g 1219 1979 M -13 20 V .18 g 1206 1999 M -4 6 V .18 g 1202 2005 M -9 14 V .18 g 1193 2019 M -12 20 V .18 g 1181 2039 M -7 10 V .18 g 1174 2049 M -6 10 V .18 g 1168 2059 M -12 20 V .18 g 1156 2079 M -9 16 V .18 g 1147 2095 M -3 5 V .18 g 1144 2100 M -11 20 V .18 g 1133 2120 M -12 20 V .18 g 1121 2140 M -1 2 V .18 g 1120 2142 M -10 18 V .18 g 1110 2160 M -12 20 V .18 g 1098 2180 M -5 11 V .18 g 1093 2191 M -6 9 V .18 g 1087 2200 M -11 21 V .18 g 1076 2221 M -11 20 V .18 g .18 g 1065 2241 M -10 20 V .18 g 1055 2261 M -11 20 V .18 g 1044 2281 M -6 11 V .18 g 1038 2292 M -5 9 V .18 g 1033 2301 M -10 20 V .18 g 1023 2321 M -10 20 V .18 g 1013 2341 M -2 4 V .18 g 1011 2345 M -8 17 V .18 g 1003 2362 M -10 20 V .18 g 993 2382 M -9 18 V .18 g 984 2400 M -1 2 V .18 g 983 2402 M -10 20 V .18 g 973 2422 M -10 20 V .18 g 963 2442 M -7 14 V .18 g 956 2456 M -3 6 V .18 g 953 2462 M -9 21 V .18 g 944 2483 M -10 20 V .18 g 934 2503 M -5 11 V .18 g 929 2514 M -4 9 V .18 g 925 2523 M -10 20 V .18 g 915 2543 M -9 20 V stroke 906 2563 M .18 g 906 2563 M -4 10 V .18 g 902 2573 M -5 10 V .18 g 897 2583 M -9 21 V .18 g 888 2604 M -9 20 V .18 g 879 2624 M -4 9 V .18 g 875 2633 M -5 11 V .18 g 870 2644 M -9 20 V .18 g 861 2664 M -9 20 V .18 g 852 2684 M -5 10 V .18 g 847 2694 M -4 10 V .18 g 843 2704 M -9 20 V .18 g 834 2724 M -9 21 V .18 g 825 2745 M -5 12 V .18 g 820 2757 M -3 8 V .18 g 817 2765 M -9 20 V .18 g 808 2785 M -9 20 V .18 g 799 2805 M -6 15 V .18 g 793 2820 M -2 5 V .18 g 791 2825 M -9 20 V .18 g 782 2845 M -8 21 V .18 g 774 2866 M -9 19 V .18 g 765 2885 M 0 1 V .18 g 765 2886 M -8 20 V .18 g 757 2906 M -9 20 V .18 g 748 2926 M -8 20 V .18 g 740 2946 M -2 4 V .18 g 738 2950 M -6 16 V .18 g 732 2966 M -8 20 V .18 g 724 2986 M -9 21 V .18 g 715 3007 M -4 10 V .18 g 711 3017 M -4 10 V .18 g 707 3027 M -8 20 V .18 g 699 3047 M -8 20 V .18 g 691 3067 M -7 17 V .18 g 684 3084 M -2 3 V .18 g 682 3087 M -8 20 V .18 g 674 3107 M -8 21 V .18 g 666 3128 M -8 20 V .18 g 658 3148 M -1 3 V .18 g 657 3151 M -7 17 V .18 g 650 3168 M -8 20 V .18 g 642 3188 M -8 20 V .18 g 634 3208 M -5 12 V .18 g 629 3220 M -3 8 V .18 g 626 3228 M -8 20 V 0 g .18 g 2373 588 M .18 g 2373 588 M -16 20 V .18 g 2357 608 M -11 15 V .18 g 2346 623 M -4 5 V .18 g 2342 628 M -16 20 V .18 g 2326 648 M -7 11 V .18 g 2319 659 M -8 10 V .18 g 2311 669 M -15 20 V stroke 2296 689 M .18 g 2296 689 M -4 6 V .18 g 2292 695 M -11 14 V .18 g 2281 709 M -15 20 V .18 g 2266 729 M -2 2 V .18 g 2264 731 M -14 18 V .18 g 2250 749 M -13 18 V .18 g 2237 767 M -2 2 V .18 g 2235 769 M -15 21 V .18 g 2220 790 M -10 13 V .18 g 2210 803 M -5 7 V .18 g 2205 810 M -15 20 V .18 g 2190 830 M -7 9 V .18 g 2183 839 M -9 11 V .18 g 2174 850 M -15 20 V .18 g 2159 870 M -4 5 V .18 g 2155 875 M -11 15 V .18 g 2144 890 M -16 20 V .18 g 2128 910 M 0 1 V .18 g 2128 911 M -15 20 V .18 g 2113 931 M -12 15 V .18 g 2101 946 M -4 5 V .18 g 2097 951 M -16 20 V .18 g 2081 971 M -7 10 V .18 g 2074 981 M -9 10 V .18 g 2065 991 M -16 20 V .18 g 2049 1011 M -3 4 V .18 g 2046 1015 M -13 16 V .18 g 2033 1031 M -14 18 V .18 g 2019 1049 M -2 3 V .18 g 2017 1052 M -17 20 V .18 g 2000 1072 M -8 10 V .18 g 1992 1082 M -9 10 V .18 g 1983 1092 M -17 20 V .18 g 1966 1112 M -1 2 V .18 g 1965 1114 M -16 18 V .18 g 1949 1132 M -12 14 V .18 g 1937 1146 M -5 6 V .18 g 1932 1152 M -18 20 V .18 g 1914 1172 M -4 5 V .18 g 1910 1177 M -14 16 V .18 g 1896 1193 M -13 14 V .18 g 1883 1207 M -5 6 V .18 g 1878 1213 M -18 20 V .18 g 1860 1233 M -4 4 V .18 g 1856 1237 M -15 16 V .18 g 1841 1253 M -13 14 V .18 g 1828 1267 M -6 6 V .18 g 1822 1273 M -19 20 V .18 g 1803 1293 M -2 3 V .18 g 1801 1296 M -17 18 V .18 g 1784 1314 M -10 10 V .18 g 1774 1324 M -9 10 V stroke 1765 1334 M .18 g 1765 1334 M -18 19 V .18 g 1747 1353 M -2 1 V .18 g 1745 1354 M -19 20 V .18 g 1726 1374 M -7 7 V .18 g 1719 1381 M -13 13 V .18 g 1706 1394 M -14 15 V .18 g 1692 1409 M -6 5 V .18 g 1686 1414 M -19 21 V .18 g 1667 1435 M -2 1 V .18 g 1665 1436 M -18 19 V .18 g 1647 1455 M -9 9 V .18 g 1638 1464 M -11 11 V .18 g 1627 1475 M -17 18 V .18 g 1610 1493 M -2 2 V .18 g 1608 1495 M -19 20 V .18 g 1589 1515 M -6 6 V .18 g 1583 1521 M -13 14 V .18 g 1570 1535 M -14 15 V .18 g 1556 1550 M -5 5 V .18 g 1551 1555 M -19 21 V .18 g 1532 1576 M -3 3 V .18 g 1529 1579 M -16 17 V .18 g 1513 1596 M -12 13 V .18 g 1501 1609 M -6 7 V .18 g 1495 1616 M -18 20 V .18 g 1477 1636 M -3 4 V .18 g 1474 1640 M -14 16 V .18 g 1460 1656 M -13 15 V .18 g 1447 1671 M -5 5 V .18 g 1442 1676 M -17 21 V .18 g 1425 1697 M -5 7 V .18 g 1420 1704 M -11 13 V .18 g 1409 1717 M -17 20 V .18 g .18 g 1392 1737 M -15 20 V .18 g 1377 1757 M -12 15 V .18 g 1365 1772 M -4 5 V .18 g 1361 1777 M -16 20 V .18 g 1345 1797 M -7 10 V 0 g .18 g 2455 4139 M .18 g 2455 4139 M -27 13 V .18 g 2428 4152 M -9 3 V .18 g 2419 4155 M -18 9 V .18 g 2401 4164 M -24 12 V .18 g 2377 4176 M -4 2 V .18 g 2373 4178 M -27 13 V .18 g 2346 4191 M -9 5 V .18 g 2337 4196 M -18 10 V .18 g 2319 4206 M -19 10 V .18 g 2300 4216 M -8 5 V .18 g 2292 4221 M -27 15 V .18 g 2265 4236 M -1 1 V .18 g 2264 4237 M -27 17 V .18 g 2237 4254 M -4 2 V stroke 2233 4256 M .18 g 2233 4256 M -23 16 V .18 g 2210 4272 M -7 4 V .18 g 2203 4276 M -20 15 V .18 g 2183 4291 M -8 6 V .18 g 2175 4297 M -20 14 V .18 g 2155 4311 M -7 6 V .18 g 2148 4317 M -20 16 V .18 g 2128 4333 M -4 4 V .18 g 2124 4337 M -23 19 V .18 g 2101 4356 M -1 1 V .18 g 2100 4357 M -22 20 V .18 g 2078 4377 M -4 4 V .18 g 2074 4381 M -17 16 V .18 g 2057 4397 M -11 10 V .18 g 2046 4407 M -10 10 V .18 g 2036 4417 M -17 18 V .18 g 2019 4435 M -2 3 V .18 g 2017 4438 M -19 20 V .18 g 1998 4458 M -6 7 V .18 g 1992 4465 M -12 13 V .18 g 1980 4478 M -15 18 V .18 g 1965 4496 M -2 2 V .18 g 1963 4498 M -17 20 V .18 g 1946 4518 M -9 11 V .18 g 1937 4529 M -7 9 V .18 g 1930 4538 M -16 21 V .18 g 1914 4559 M -4 5 V .18 g 1910 4564 M -11 15 V .18 g 1899 4579 M -16 20 V .18 g 1883 4599 M 0 1 V .18 g 1883 4600 M -14 19 V 0 g .18 g 4043 3652 M .18 g 4043 3652 M -7 -6 V .18 g 4036 3646 M -23 -15 V .18 g 4013 3631 M -5 -2 V .18 g 4008 3629 M -27 -17 V .18 g 3981 3612 M -1 -1 V .18 g 3980 3611 M -26 -15 V .18 g 3954 3596 M -9 -5 V .18 g 3945 3591 M -18 -10 V .18 g 3927 3581 M -20 -10 V .18 g 3907 3571 M -8 -4 V .18 g 3899 3567 M -27 -12 V .18 g 3872 3555 M -9 -4 V .18 g 3863 3551 M -18 -8 V .18 g 3845 3543 M -27 -9 V .18 g 3818 3534 M -11 -3 V .18 g 3807 3531 M -17 -5 V .18 g 3790 3526 M -27 -7 V .18 g 3763 3519 M -27 -5 V .18 g 3736 3514 M -27 -4 V .18 g .18 g 3709 3510 M -28 -1 V .18 g 3681 3509 M -27 0 V stroke 3654 3509 M .18 g 3654 3509 M -27 1 V .18 g 3627 3510 M -3 0 V .18 g 3624 3510 M -24 3 V .18 g 3600 3513 M -28 5 V .18 g 3572 3518 M -27 7 V .18 g 3545 3525 M -20 6 V .18 g 3525 3531 M -7 2 V .18 g 3518 3533 M -27 9 V .18 g 3491 3542 M -23 9 V .18 g 3468 3551 M -5 2 V .18 g 3463 3553 M -27 12 V .18 g 3436 3565 M -13 6 V .18 g 3423 3571 M -14 7 V .18 g 3409 3578 M -25 13 V .18 g 3384 3591 M -2 1 V .18 g 3382 3592 M -28 16 V .18 g 3354 3608 M -6 3 V .18 g 3348 3611 M -21 13 V .18 g 3327 3624 M -12 7 V .18 g 3315 3631 M -15 10 V .18 g 3300 3641 M -17 11 V .18 g 3283 3652 M -10 6 V .18 g 3273 3658 M -20 14 V .18 g 3253 3672 M -8 5 V .18 g 3245 3677 M -22 15 V .18 g 3223 3692 M -5 3 V .18 g 3218 3695 M -24 17 V .18 g 3194 3712 M -3 2 V .18 g 3191 3714 M -26 18 V .18 g 3165 3732 M -1 1 V .18 g 3164 3733 M -27 19 V .18 g 3137 3752 M -1 1 V .18 g 3136 3753 M -27 19 V .18 g 3109 3772 M -1 0 V .18 g 3108 3772 M -26 19 V .18 g 3082 3791 M -2 2 V .18 g 3080 3793 M -25 18 V .18 g 3055 3811 M -4 2 V .18 g 3051 3813 M -24 17 V .18 g 3027 3830 M -5 3 V .18 g 3022 3833 M -22 15 V .18 g 3000 3848 M -7 5 V .18 g 2993 3853 M -20 14 V .18 g 2973 3867 M -10 6 V .18 g 2963 3873 M -17 12 V .18 g 2946 3885 M -14 8 V .18 g 2932 3893 M -14 10 V .18 g 2918 3903 M -17 11 V .18 g 2901 3914 M -10 6 V .18 g 2891 3920 M -23 14 V .18 g 2868 3934 M -4 3 V .18 g 2864 3937 M -27 16 V stroke 2837 3953 M .18 g 2837 3953 M -2 1 V .18 g 2835 3954 M -26 15 V .18 g 2809 3969 M -9 5 V .18 g 2800 3974 M -18 10 V .18 g 2782 3984 M -19 10 V .18 g 2763 3994 M -8 5 V .18 g 2755 3999 M -27 14 V .18 g 2728 4013 M -3 1 V .18 g 2725 4014 M -25 13 V .18 g 2700 4027 M -15 8 V .18 g 2685 4035 M -12 5 V .18 g 2673 4040 M -27 13 V .18 g 2646 4053 M -3 2 V .18 g 2643 4055 M -24 11 V .18 g 2619 4066 M -20 9 V .18 g 2599 4075 M -8 3 V .18 g 2591 4078 M -27 13 V .18 g 2564 4091 M -10 4 V .18 g 2554 4095 M -17 8 V .18 g 2537 4103 M -27 12 V .18 g 2510 4115 M -1 0 V .18 g 2509 4115 M -27 12 V .18 g 2482 4127 M -18 8 V .18 g 2464 4135 M -9 4 V 0 g .18 g 5422 4619 M .18 g 5422 4619 M -15 -20 V .18 g 5407 4599 M -9 -11 V .18 g 5398 4588 M -8 -9 V .18 g 5390 4579 M -16 -20 V .18 g 5374 4559 M -3 -4 V .18 g 5371 4555 M -15 -17 V .18 g 5356 4538 M -12 -14 V .18 g 5344 4524 M -5 -6 V .18 g 5339 4518 M -19 -20 V .18 g 5320 4498 M -4 -4 V .18 g 5316 4494 M -15 -16 V .18 g 5301 4478 M -12 -12 V .18 g 5289 4466 M -8 -8 V .18 g 5281 4458 M -19 -19 V .18 g 5262 4439 M -2 -1 V .18 g 5260 4438 M -22 -21 V .18 g 5238 4417 M -3 -3 V .18 g 5235 4414 M -20 -17 V .18 g 5215 4397 M -8 -7 V .18 g 5207 4390 M -16 -13 V .18 g 5191 4377 M -11 -9 V .18 g 5180 4368 M -15 -11 V .18 g 5165 4357 M -12 -10 V .18 g 5153 4347 M -15 -10 V .18 g 5138 4337 M -12 -9 V .18 g 5126 4328 M -17 -11 V .18 g 5109 4317 M -11 -8 V .18 g 5098 4309 M -19 -12 V stroke 5079 4297 M .18 g 5079 4297 M -8 -5 V .18 g 5071 4292 M -25 -16 V .18 g 5046 4276 M -2 -1 V .18 g 5044 4275 M -27 -16 V .18 g 5017 4259 M -6 -3 V .18 g 5011 4256 M -22 -12 V .18 g 4989 4244 M -14 -8 V .18 g 4975 4236 M -13 -7 V .18 g 4962 4229 M -26 -13 V .18 g 4936 4216 M -1 -1 V .18 g 4935 4215 M -27 -14 V .18 g 4908 4201 M -12 -5 V .18 g 4896 4196 M -16 -8 V .18 g 4880 4188 M -24 -12 V .18 g 4856 4176 M -3 -2 V .18 g 4853 4174 M -27 -13 V .18 g 4826 4161 M -11 -6 V .18 g 4815 4155 M -16 -7 V .18 g 4799 4148 M -25 -13 V .18 g 4774 4135 M -3 -1 V .18 g 4771 4134 M -27 -14 V .18 g 4744 4120 M -10 -5 V .18 g 4734 4115 M -17 -9 V .18 g 4717 4106 M -22 -11 V .18 g 4695 4095 M -5 -3 V .18 g 4690 4092 M -28 -14 V .18 g 4662 4078 M -5 -3 V .18 g 4657 4075 M -22 -12 V .18 g 4635 4063 M -14 -8 V .18 g 4621 4055 M -13 -8 V .18 g 4608 4047 M -22 -12 V .18 g 4586 4035 M -5 -4 V .18 g 4581 4031 M -28 -16 V .18 g 4553 4015 M -1 -1 V .18 g 4552 4014 M -26 -16 V .18 g 4526 3998 M -6 -4 V .18 g 4520 3994 M -21 -13 V .18 g 4499 3981 M -11 -7 V .18 g 4488 3974 M -16 -11 V .18 g 4472 3963 M -14 -9 V .18 g 4458 3954 M -14 -9 V .18 g 4444 3945 M -15 -11 V .18 g 4429 3934 M -12 -8 V .18 g 4417 3926 M -17 -12 V .18 g 4400 3914 M -10 -7 V .18 g 4390 3907 M -19 -14 V .18 g 4371 3893 M -8 -6 V .18 g 4363 3887 M -19 -14 V .18 g 4344 3873 M -9 -6 V .18 g 4335 3867 M -18 -14 V .18 g 4317 3853 M -9 -6 V .18 g 4308 3847 M -18 -14 V stroke 4290 3833 M .18 g 4290 3833 M -9 -7 V .18 g 4281 3826 M -18 -13 V .18 g 4263 3813 M -9 -7 V .18 g 4254 3806 M -18 -13 V .18 g 4236 3793 M -10 -8 V .18 g 4226 3785 M -16 -13 V .18 g 4210 3772 M -11 -8 V .18 g 4199 3764 M -16 -12 V .18 g 4183 3752 M -11 -8 V .18 g 4172 3744 M -16 -12 V .18 g 4156 3732 M -11 -8 V .18 g 4145 3724 M -16 -12 V .18 g 4129 3712 M -12 -8 V .18 g 4117 3704 M -16 -12 V .18 g 4101 3692 M -11 -8 V .18 g 4090 3684 M -17 -12 V .18 g 4073 3672 M -10 -7 V .18 g 4063 3665 M -20 -13 V 0 g .18 g 5039 729 M .18 g 5039 729 M -14 -20 V .18 g 5025 709 M -8 -11 V .18 g 5017 698 M -7 -9 V .18 g 5010 689 M -15 -20 V .18 g 4995 669 M -6 -8 V .18 g 4989 661 M -9 -13 V .18 g 4980 648 M -15 -20 V .18 g 4965 628 M -3 -3 V .18 g 4962 625 M -13 -17 V .18 g 4949 608 M -14 -19 V .18 g 4935 589 M -1 -1 V 0 g .18 g 6052 1969 M .18 g 6052 1969 M -7 -10 V .18 g 6045 1959 M -14 -21 V .18 g 6031 1938 M -6 -8 V .18 g 6025 1930 M -9 -12 V .18 g 6016 1918 M -15 -20 V .18 g 6001 1898 M -3 -5 V .18 g 5998 1893 M -12 -15 V .18 g 5986 1878 M -15 -20 V .18 g 5971 1858 M -1 -2 V .18 g 5970 1856 M -14 -18 V .18 g 5956 1838 M -13 -17 V .18 g 5943 1821 M -3 -4 V .18 g 5940 1817 M -16 -20 V .18 g 5924 1797 M -8 -10 V .18 g 5916 1787 M -9 -10 V .18 g 5907 1777 M -16 -20 V .18 g 5891 1757 M -2 -3 V .18 g 5889 1754 M -15 -17 V .18 g 5874 1737 M -13 -15 V .18 g 5861 1722 M -5 -5 V .18 g 5856 1717 M -17 -20 V .18 g 5839 1697 M -5 -6 V stroke 5834 1691 M .18 g 5834 1691 M -13 -15 V .18 g 5821 1676 M -14 -16 V .18 g 5807 1660 M -4 -4 V .18 g 5803 1656 M -18 -20 V .18 g 5785 1636 M -5 -6 V .18 g 5780 1630 M -13 -14 V .18 g 5767 1616 M -15 -16 V .18 g 5752 1600 M -4 -4 V .18 g 5748 1596 M -18 -20 V .18 g 5730 1576 M -5 -6 V .18 g 5725 1570 M -14 -15 V .18 g 5711 1555 M -13 -14 V .18 g 5698 1541 M -6 -6 V .18 g 5692 1535 M -18 -20 V .18 g 5674 1515 M -3 -3 V .18 g 5671 1512 M -16 -17 V .18 g 5655 1495 M -12 -12 V .18 g 5643 1483 M -7 -8 V .18 g 5636 1475 M -19 -20 V .18 g 5617 1455 M -1 -2 V .18 g 5616 1453 M -18 -18 V .18 g 5598 1435 M -9 -11 V .18 g 5589 1424 M -9 -10 V .18 g 5580 1414 M -18 -20 V .18 g 5562 1394 M -19 -20 V .18 g 5543 1374 M -9 -10 V .18 g 5534 1364 M -9 -10 V .18 g 5525 1354 M -18 -20 V .18 g .18 g 5507 1334 M -18 -20 V .18 g 5489 1314 M -9 -12 V .18 g 5480 1302 M -8 -9 V .18 g 5472 1293 M -17 -20 V .18 g 5455 1273 M -2 -2 V .18 g 5453 1271 M -16 -18 V .18 g 5437 1253 M -12 -14 V .18 g 5425 1239 M -4 -6 V .18 g 5421 1233 M -17 -20 V .18 g 5404 1213 M -6 -7 V .18 g 5398 1206 M -11 -13 V .18 g 5387 1193 M -16 -21 V .18 g .18 g 5371 1172 M -16 -20 V .18 g 5355 1152 M -11 -14 V .18 g 5344 1138 M -5 -6 V .18 g 5339 1132 M -16 -20 V .18 g 5323 1112 M -7 -8 V .18 g 5316 1104 M -9 -12 V .18 g 5307 1092 M -15 -20 V .18 g 5292 1072 M -3 -4 V .18 g 5289 1068 M -13 -16 V .18 g 5276 1052 M -14 -20 V .18 g 5262 1032 M -1 -1 V .18 g 5261 1031 M -15 -20 V stroke 5246 1011 M .18 g 5246 1011 M -11 -15 V .18 g 5235 996 M -4 -5 V .18 g 5231 991 M -15 -20 V .18 g 5216 971 M -9 -12 V .18 g 5207 959 M -6 -8 V .18 g 5201 951 M -15 -20 V .18 g 5186 931 M -6 -9 V .18 g 5180 922 M -9 -12 V .18 g 5171 910 M -14 -20 V .18 g 5157 890 M -4 -5 V .18 g 5153 885 M -11 -15 V .18 g 5142 870 M -15 -20 V .18 g 5127 850 M -1 -3 V .18 g 5126 847 M -13 -17 V .18 g 5113 830 M -15 -20 V .18 g .18 g 5098 810 M -15 -20 V .18 g 5083 790 M -12 -18 V .18 g 5071 772 M -2 -3 V .18 g 5069 769 M -15 -20 V .18 g 5054 749 M -10 -14 V .18 g 5044 735 M -5 -6 V 0 g .16 g 681 3208 M .16 g 681 3208 M -8 20 V .16 g 673 3228 M -8 20 V .16 g 665 3248 M -8 21 V .16 g 657 3269 M -1 0 V .16 g 656 3269 M -7 20 V .16 g 649 3289 M -8 20 V .16 g 641 3309 M -8 20 V .16 g 633 3329 M -4 8 V .16 g 629 3337 M -4 12 V .16 g 625 3349 M -8 20 V .16 g 617 3369 M -8 21 V .16 g 609 3390 M -7 17 V 0 g .16 g 1437 1797 M .16 g 1437 1797 M -17 20 V .16 g 1420 1817 M -1 0 V .16 g 1419 1817 M -17 21 V .16 g 1402 1838 M -10 12 V .16 g 1392 1850 M -6 8 V .16 g 1386 1858 M -16 20 V .16 g 1370 1878 M -5 6 V .16 g 1365 1884 M -11 14 V .16 g 1354 1898 M -16 20 V .16 g 1338 1918 M 0 1 V .16 g 1338 1919 M -15 19 V .16 g 1323 1938 M -12 17 V .16 g 1311 1955 M -3 4 V .16 g 1308 1959 M -14 20 V .16 g 1294 1979 M -11 14 V .16 g 1283 1993 M -4 6 V .16 g 1279 1999 M -14 20 V .16 g 1265 2019 M -9 13 V stroke 1256 2032 M .16 g 1256 2032 M -4 7 V .16 g 1252 2039 M -14 20 V .16 g 1238 2059 M -9 14 V .16 g 1229 2073 M -4 6 V .16 g 1225 2079 M -13 21 V .16 g 1212 2100 M -10 15 V .16 g 1202 2115 M -3 5 V .16 g 1199 2120 M -13 20 V .16 g 1186 2140 M -12 19 V .16 g 1174 2159 M 0 1 V .16 g 1174 2160 M -12 20 V .16 g 1162 2180 M -12 20 V .16 g 1150 2200 M -3 5 V .16 g 1147 2205 M -9 16 V .16 g 1138 2221 M -12 20 V .16 g 1126 2241 M -6 11 V .16 g 1120 2252 M -5 9 V .16 g 1115 2261 M -12 20 V .16 g 1103 2281 M -10 19 V .16 g 1093 2300 M -1 1 V .16 g 1092 2301 M -11 20 V .16 g 1081 2321 M -11 20 V .16 g 1070 2341 M -5 9 V .16 g 1065 2350 M -6 12 V .16 g 1059 2362 M -10 20 V .16 g 1049 2382 M -11 20 V .16 g .16 g 1038 2402 M -10 20 V .16 g 1028 2422 M -10 20 V .16 g 1018 2442 M -7 13 V .16 g 1011 2455 M -4 7 V .16 g 1007 2462 M -10 21 V .16 g 997 2483 M -10 20 V .16 g 987 2503 M -3 7 V .16 g 984 2510 M -7 13 V .16 g 977 2523 M -9 20 V .16 g 968 2543 M -10 20 V .16 g 958 2563 M -2 4 V .16 g 956 2567 M -8 16 V .16 g 948 2583 M -9 21 V .16 g 939 2604 M -10 20 V .16 g 929 2624 M 0 1 V .16 g 929 2625 M -9 19 V .16 g 920 2644 M -9 20 V .16 g 911 2664 M -9 20 V .16 g .16 g 902 2684 M -9 20 V .16 g 893 2704 M -9 20 V .16 g 884 2724 M -9 20 V .16 g 875 2744 M -1 1 V .16 g 874 2745 M -8 20 V .16 g 866 2765 M -9 20 V .16 g 857 2785 M -9 20 V .16 g 848 2805 M -1 1 V stroke 847 2806 M .16 g 847 2806 M -8 19 V .16 g 839 2825 M -8 20 V .16 g 831 2845 M -9 21 V .16 g 822 2866 M -2 4 V .16 g 820 2870 M -7 16 V .16 g 813 2886 M -8 20 V .16 g 805 2906 M -9 20 V .16 g 796 2926 M -3 8 V .16 g 793 2934 M -5 12 V .16 g 788 2946 M -9 20 V .16 g 779 2966 M -8 20 V .16 g 771 2986 M -6 13 V .16 g 765 2999 M -3 8 V .16 g 762 3007 M -8 20 V .16 g 754 3027 M -8 20 V .16 g 746 3047 M -8 18 V .16 g 738 3065 M 0 2 V .16 g 738 3067 M -9 20 V .16 g 729 3087 M -8 20 V .16 g 721 3107 M -8 21 V .16 g 713 3128 M -2 4 V .16 g 711 3132 M -6 16 V .16 g 705 3148 M -8 20 V .16 g 697 3168 M -8 20 V .16 g 689 3188 M -5 12 V .16 g 684 3200 M -3 8 V 0 g .16 g 2465 588 M .16 g 2465 588 M -10 12 V .16 g 2455 600 M -7 8 V .16 g 2448 608 M -16 20 V .16 g 2432 628 M -4 6 V .16 g 2428 634 M -12 14 V .16 g 2416 648 M -15 21 V .16 g .16 g 2401 669 M -16 20 V .16 g 2385 689 M -12 15 V .16 g 2373 704 M -3 5 V .16 g 2370 709 M -15 20 V .16 g 2355 729 M -9 12 V .16 g 2346 741 M -7 8 V .16 g 2339 749 M -15 20 V .16 g 2324 769 M -5 8 V .16 g 2319 777 M -10 13 V .16 g 2309 790 M -14 20 V .16 g 2295 810 M -3 4 V .16 g 2292 814 M -12 16 V .16 g 2280 830 M -15 20 V .16 g 2265 850 M -1 1 V .16 g 2264 851 M -14 19 V .16 g 2250 870 M -13 18 V .16 g 2237 888 M -2 2 V .16 g 2235 890 M -15 20 V .16 g 2220 910 M -10 15 V .16 g 2210 925 M -5 6 V stroke 2205 931 M .16 g 2205 931 M -15 20 V .16 g 2190 951 M -7 10 V .16 g 2183 961 M -8 10 V .16 g 2175 971 M -15 20 V .16 g 2160 991 M -5 7 V .16 g 2155 998 M -10 13 V .16 g 2145 1011 M -15 20 V .16 g 2130 1031 M -2 3 V .16 g 2128 1034 M -13 18 V .16 g 2115 1052 M -14 18 V .16 g 2101 1070 M -2 2 V .16 g 2099 1072 M -15 20 V .16 g 2084 1092 M -10 13 V .16 g 2074 1105 M -6 7 V .16 g 2068 1112 M -16 20 V .16 g 2052 1132 M -6 7 V .16 g 2046 1139 M -10 13 V .16 g 2036 1152 M -17 20 V .16 g 2019 1172 M 0 1 V .16 g 2019 1173 M -16 20 V .16 g 2003 1193 M -11 13 V .16 g 1992 1206 M -6 7 V .16 g 1986 1213 M -17 20 V .16 g 1969 1233 M -4 6 V .16 g 1965 1239 M -13 14 V .16 g 1952 1253 M -15 17 V .16 g 1937 1270 M -2 3 V .16 g 1935 1273 M -18 20 V .16 g 1917 1293 M -7 8 V .16 g 1910 1301 M -11 13 V .16 g 1899 1314 M -16 18 V .16 g 1883 1332 M -2 2 V .16 g 1881 1334 M -19 20 V .16 g 1862 1354 M -6 7 V .16 g 1856 1361 M -12 13 V .16 g 1844 1374 M -16 16 V .16 g 1828 1390 M -3 4 V .16 g 1825 1394 M -20 20 V .16 g 1805 1414 M -4 5 V .16 g 1801 1419 M -15 16 V .16 g 1786 1435 M -12 12 V .16 g 1774 1447 M -8 8 V .16 g 1766 1455 M -19 20 V .16 g 1747 1475 M -1 0 V .16 g 1746 1475 M -20 20 V .16 g 1726 1495 M -7 7 V .16 g 1719 1502 M -13 13 V .16 g 1706 1515 M -14 14 V .16 g 1692 1529 M -6 6 V .16 g 1686 1535 M -20 20 V .16 g 1666 1555 M -1 1 V .16 g 1665 1556 M -19 20 V stroke 1646 1576 M .16 g 1646 1576 M -8 8 V .16 g 1638 1584 M -12 12 V .16 g 1626 1596 M -16 15 V .16 g 1610 1611 M -5 5 V .16 g 1605 1616 M -19 20 V .16 g 1586 1636 M -3 3 V .16 g 1583 1639 M -17 17 V .16 g 1566 1656 M -10 11 V .16 g 1556 1667 M -9 9 V .16 g 1547 1676 M -18 19 V .16 g 1529 1695 M -2 2 V .16 g 1527 1697 M -18 20 V .16 g 1509 1717 M -8 8 V .16 g 1501 1725 M -11 12 V .16 g 1490 1737 M -16 17 V .16 g 1474 1754 M -2 3 V .16 g 1472 1757 M -18 20 V .16 g 1454 1777 M -7 8 V .16 g 1447 1785 M -10 12 V 0 g .16 g 2619 3955 M .16 g 2619 3955 M -28 12 V .16 g 2591 3967 M -17 7 V .16 g 2574 3974 M -10 4 V .16 g 2564 3978 M -27 12 V .16 g 2537 3990 M -10 4 V .16 g 2527 3994 M -17 7 V .16 g 2510 4001 M -28 12 V .16 g 2482 4013 M -3 1 V .16 g 2479 4014 M -24 10 V .16 g 2455 4024 M -24 11 V .16 g 2431 4035 M -3 1 V .16 g 2428 4036 M -27 12 V .16 g 2401 4048 M -15 7 V .16 g 2386 4055 M -13 6 V .16 g 2373 4061 M -27 13 V .16 g 2346 4074 M -3 1 V .16 g 2343 4075 M -24 12 V .16 g 2319 4087 M -15 8 V .16 g 2304 4095 M -12 6 V .16 g 2292 4101 M -25 14 V .16 g 2267 4115 M -3 2 V .16 g 2264 4117 M -27 16 V .16 g 2237 4133 M -4 2 V .16 g 2233 4135 M -23 15 V .16 g 2210 4150 M -8 5 V .16 g 2202 4155 M -19 14 V .16 g 2183 4169 M -10 7 V .16 g 2173 4176 M -18 13 V .16 g 2155 4189 M -9 7 V .16 g 2146 4196 M -18 14 V .16 g 2128 4210 M -7 6 V .16 g 2121 4216 M -20 17 V .16 g 2101 4233 M -4 3 V stroke 2097 4236 M .16 g 2097 4236 M -23 20 V .16 g 2074 4256 M 0 1 V .16 g 2074 4257 M -21 19 V .16 g 2053 4276 M -7 7 V .16 g 2046 4283 M -13 14 V .16 g 2033 4297 M -14 14 V .16 g 2019 4311 M -5 6 V .16 g 2014 4317 M -19 20 V .16 g 1995 4337 M -3 3 V .16 g 1992 4340 M -15 17 V .16 g 1977 4357 M -12 14 V .16 g 1965 4371 M -5 6 V .16 g 1960 4377 M -17 20 V .16 g 1943 4397 M -6 7 V .16 g 1937 4404 M -10 13 V .16 g 1927 4417 M -16 21 V .16 g 1911 4438 M -1 1 V .16 g 1910 4439 M -14 19 V .16 g 1896 4458 M -13 18 V .16 g 1883 4476 M -2 2 V .16 g 1881 4478 M -14 20 V .16 g 1867 4498 M -11 16 V .16 g 1856 4514 M -4 4 V .16 g 1852 4518 M -13 20 V .16 g 1839 4538 M -11 15 V .16 g 1828 4553 M -3 6 V .16 g 1825 4559 M -13 20 V .16 g 1812 4579 M -11 16 V .16 g 1801 4595 M -3 4 V .16 g 1798 4599 M -12 20 V 0 g .16 g 4174 3631 M .16 g 4174 3631 M -2 -2 V .16 g 4172 3629 M -24 -18 V .16 g 4148 3611 M -3 -3 V .16 g 4145 3608 M -23 -17 V .16 g 4122 3591 M -5 -4 V .16 g 4117 3587 M -22 -16 V .16 g 4095 3571 M -5 -4 V .16 g 4090 3567 M -22 -16 V .16 g 4068 3551 M -5 -4 V .16 g 4063 3547 M -24 -16 V .16 g 4039 3531 M -3 -3 V .16 g 4036 3528 M -26 -18 V .16 g 4010 3510 M -2 0 V .16 g 4008 3510 M -27 -18 V .16 g 3981 3492 M -3 -2 V .16 g 3978 3490 M -24 -15 V .16 g 3954 3475 M -9 -5 V .16 g 3945 3470 M -18 -10 V .16 g 3927 3460 M -19 -10 V .16 g 3908 3450 M -9 -5 V .16 g 3899 3445 M -27 -13 V .16 g 3872 3432 M -5 -2 V stroke 3867 3430 M .16 g 3867 3430 M -22 -10 V .16 g 3845 3420 M -27 -10 V .16 g 3818 3410 M -2 0 V .16 g 3816 3410 M -26 -8 V .16 g 3790 3402 M -27 -7 V .16 g 3763 3395 M -26 -5 V .16 g 3737 3390 M -1 -1 V .16 g 3736 3389 M -27 -3 V .16 g 3709 3386 M -28 -2 V .16 g 3681 3384 M -27 0 V .16 g 3654 3384 M -27 2 V .16 g 3627 3386 M -27 3 V .16 g 3600 3389 M -3 1 V .16 g 3597 3390 M -25 4 V .16 g 3572 3394 M -27 7 V .16 g 3545 3401 M -27 8 V .16 g 3518 3409 M -1 1 V .16 g 3517 3410 M -26 9 V .16 g 3491 3419 M -26 11 V .16 g 3465 3430 M -2 1 V .16 g 3463 3431 M -27 12 V .16 g 3436 3443 M -13 7 V .16 g 3423 3450 M -14 7 V .16 g 3409 3457 M -24 13 V .16 g 3385 3470 M -3 2 V .16 g 3382 3472 M -28 16 V .16 g 3354 3488 M -3 2 V .16 g 3351 3490 M -24 15 V .16 g 3327 3505 M -8 5 V .16 g 3319 3510 M -19 13 V .16 g 3300 3523 M -12 8 V .16 g 3288 3531 M -15 10 V .16 g 3273 3541 M -14 10 V .16 g 3259 3551 M -14 9 V .16 g 3245 3560 M -15 11 V .16 g 3230 3571 M -12 9 V .16 g 3218 3580 M -16 11 V .16 g 3202 3591 M -11 8 V .16 g 3191 3599 M -17 12 V .16 g 3174 3611 M -10 8 V .16 g 3164 3619 M -17 12 V .16 g 3147 3631 M -11 8 V .16 g 3136 3639 M -17 13 V .16 g 3119 3652 M -10 7 V .16 g 3109 3659 M -17 13 V .16 g 3092 3672 M -10 7 V .16 g 3082 3679 M -18 13 V .16 g 3064 3692 M -9 7 V .16 g 3055 3699 M -19 13 V .16 g 3036 3712 M -9 6 V .16 g 3027 3718 M -19 14 V .16 g 3008 3732 M -8 5 V stroke 3000 3737 M .16 g 3000 3737 M -22 15 V .16 g 2978 3752 M -5 4 V .16 g 2973 3756 M -24 16 V .16 g 2949 3772 M -3 3 V .16 g 2946 3775 M -28 18 V .16 g 2918 3793 M -27 17 V .16 g 2891 3810 M -4 3 V .16 g 2887 3813 M -23 14 V .16 g 2864 3827 M -10 6 V .16 g 2854 3833 M -17 10 V .16 g 2837 3843 M -18 10 V .16 g 2819 3853 M -10 6 V .16 g 2809 3859 M -25 14 V .16 g 2784 3873 M -2 1 V .16 g 2782 3874 M -27 15 V .16 g 2755 3889 M -9 4 V .16 g 2746 3893 M -18 10 V .16 g 2728 3903 M -22 11 V .16 g 2706 3914 M -6 3 V .16 g 2700 3917 M -27 13 V .16 g 2673 3930 M -9 4 V .16 g 2664 3934 M -18 8 V .16 g 2646 3942 M -26 12 V .16 g 2620 3954 M -1 1 V 0 g .16 g 5511 4619 M .16 g 5511 4619 M -4 -6 V .16 g 5507 4613 M -10 -14 V .16 g 5497 4599 M -13 -20 V .16 g 5484 4579 M -4 -6 V .16 g 5480 4573 M -11 -14 V .16 g 5469 4559 M -14 -21 V .16 g 5455 4538 M -2 -3 V .16 g 5453 4535 M -13 -17 V .16 g 5440 4518 M -15 -20 V .16 g .16 g 5425 4498 M -16 -20 V .16 g 5409 4478 M -11 -15 V .16 g 5398 4463 M -5 -5 V .16 g 5393 4458 M -16 -20 V .16 g 5377 4438 M -6 -8 V .16 g 5371 4430 M -11 -13 V .16 g 5360 4417 M -16 -18 V .16 g 5344 4399 M -2 -2 V .16 g 5342 4397 M -19 -20 V .16 g 5323 4377 M -7 -8 V .16 g 5316 4369 M -12 -12 V .16 g 5304 4357 M -15 -15 V .16 g 5289 4342 M -5 -5 V .16 g 5284 4337 M -21 -20 V .16 g 5263 4317 M -1 -2 V .16 g 5262 4315 M -21 -18 V .16 g 5241 4297 M -6 -6 V .16 g 5235 4291 M -17 -15 V .16 g 5218 4276 M -11 -8 V stroke 5207 4268 M .16 g 5207 4268 M -14 -12 V .16 g 5193 4256 M -13 -10 V .16 g 5180 4246 M -13 -10 V .16 g 5167 4236 M -14 -10 V .16 g 5153 4226 M -14 -10 V .16 g 5139 4216 M -13 -9 V .16 g 5126 4207 M -17 -11 V .16 g 5109 4196 M -11 -7 V .16 g 5098 4189 M -21 -13 V .16 g 5077 4176 M -6 -4 V .16 g 5071 4172 M -27 -16 V .16 g 5044 4156 M -2 -1 V .16 g 5042 4155 M -25 -14 V .16 g 5017 4141 M -11 -6 V .16 g 5006 4135 M -17 -8 V .16 g 4989 4127 M -22 -12 V .16 g 4967 4115 M -5 -2 V .16 g 4962 4113 M -27 -14 V .16 g 4935 4099 M -9 -4 V .16 g 4926 4095 M -18 -9 V .16 g 4908 4086 M -25 -11 V .16 g 4883 4075 M -3 -2 V .16 g 4880 4073 M -27 -12 V .16 g 4853 4061 M -13 -6 V .16 g 4840 4055 M -14 -7 V .16 g 4826 4048 M -27 -13 V .16 g 4799 4035 M -2 0 V .16 g 4797 4035 M -26 -13 V .16 g 4771 4022 M -16 -8 V .16 g 4755 4014 M -11 -5 V .16 g 4744 4009 M -27 -13 V .16 g 4717 3996 M -3 -2 V .16 g 4714 3994 M -24 -12 V .16 g 4690 3982 M -15 -8 V .16 g 4675 3974 M -13 -7 V .16 g 4662 3967 M -25 -13 V .16 g 4637 3954 M -2 -1 V .16 g 4635 3953 M -27 -16 V .16 g 4608 3937 M -7 -3 V .16 g 4601 3934 M -20 -12 V .16 g 4581 3922 M -14 -8 V .16 g 4567 3914 M -14 -9 V .16 g 4553 3905 M -19 -12 V .16 g 4534 3893 M -8 -4 V .16 g 4526 3889 M -24 -16 V .16 g 4502 3873 M -3 -2 V .16 g 4499 3871 M -27 -18 V .16 g 4472 3853 M -1 0 V .16 g 4471 3853 M -27 -18 V .16 g 4444 3835 M -2 -2 V .16 g 4442 3833 M -25 -17 V .16 g 4417 3816 M -4 -3 V stroke 4413 3813 M .16 g 4413 3813 M -23 -17 V .16 g 4390 3796 M -5 -3 V .16 g 4385 3793 M -22 -17 V .16 g 4363 3776 M -5 -4 V .16 g 4358 3772 M -23 -16 V .16 g 4335 3756 M -4 -4 V .16 g 4331 3752 M -23 -17 V .16 g 4308 3735 M -4 -3 V .16 g 4304 3732 M -23 -18 V .16 g 4281 3714 M -3 -2 V .16 g 4278 3712 M -24 -19 V .16 g 4254 3693 M -2 -1 V .16 g 4252 3692 M -26 -20 V .16 g .16 g 4226 3672 M -26 -20 V .16 g 4200 3652 M -1 -2 V .16 g 4199 3650 M -25 -19 V 0 g .16 g 5044 854 M .16 g 5044 854 M -3 -4 V .16 g 5041 850 M -14 -20 V .16 g 5027 830 M -10 -14 V .16 g 5017 816 M -5 -6 V .16 g 5012 810 M -15 -20 V .16 g 4997 790 M -8 -12 V .16 g 4989 778 M -6 -9 V .16 g 4983 769 M -15 -20 V .16 g 4968 749 M -6 -8 V .16 g 4962 741 M -9 -12 V .16 g 4953 729 M -15 -20 V .16 g 4938 709 M -3 -4 V .16 g 4935 705 M -12 -16 V .16 g 4923 689 M -15 -20 V .16 g 4908 669 M -1 0 V .16 g 4907 669 M -16 -21 V .16 g 4891 648 M -11 -14 V .16 g 4880 634 M -4 -6 V .16 g 4876 628 M -17 -20 V .16 g 4859 608 M -6 -8 V .16 g 4853 600 M -10 -12 V 0 g .16 g 6052 2080 M .16 g 6052 2080 M 0 -1 V .16 g 6052 2079 M -15 -20 V .16 g 6037 2059 M -12 -17 V .16 g 6025 2042 M -2 -3 V .16 g 6023 2039 M -15 -20 V .16 g 6008 2019 M -10 -14 V .16 g 5998 2005 M -5 -6 V .16 g 5993 1999 M -15 -20 V .16 g 5978 1979 M -8 -10 V .16 g 5970 1969 M -8 -10 V .16 g 5962 1959 M -16 -21 V .16 g 5946 1938 M -3 -3 V .16 g 5943 1935 M -13 -17 V .16 g 5930 1918 M -14 -17 V stroke 5916 1901 M .16 g 5916 1901 M -3 -3 V .16 g 5913 1898 M -17 -20 V .16 g 5896 1878 M -7 -9 V .16 g 5889 1869 M -10 -11 V .16 g 5879 1858 M -18 -20 V .16 g 5861 1838 M 0 -1 V .16 g 5861 1837 M -17 -20 V .16 g 5844 1817 M -10 -10 V .16 g 5834 1807 M -9 -10 V .16 g 5825 1797 M -18 -20 V .16 g .16 g 5807 1777 M -18 -20 V .16 g 5789 1757 M -9 -10 V .16 g 5780 1747 M -10 -10 V .16 g 5770 1737 M -18 -19 V .16 g 5752 1718 M -1 -1 V .16 g 5751 1717 M -19 -20 V .16 g 5732 1697 M -7 -8 V .16 g 5725 1689 M -12 -13 V .16 g 5713 1676 M -15 -15 V .16 g 5698 1661 M -5 -5 V .16 g 5693 1656 M -19 -20 V .16 g 5674 1636 M -3 -4 V .16 g 5671 1632 M -16 -16 V .16 g 5655 1616 M -12 -12 V .16 g 5643 1604 M -8 -8 V .16 g 5635 1596 M -19 -20 V .16 g 5616 1576 M 0 -1 V .16 g 5616 1575 M -19 -20 V .16 g 5597 1555 M -8 -9 V .16 g 5589 1546 M -11 -11 V .16 g 5578 1535 M -16 -18 V .16 g 5562 1517 M -2 -2 V .16 g 5560 1515 M -19 -20 V .16 g 5541 1495 M -7 -7 V .16 g 5534 1488 M -11 -13 V .16 g 5523 1475 M -16 -18 V .16 g 5507 1457 M -2 -2 V .16 g 5505 1455 M -18 -20 V .16 g 5487 1435 M -7 -8 V .16 g 5480 1427 M -11 -13 V .16 g 5469 1414 M -16 -19 V .16 g 5453 1395 M -1 -1 V .16 g 5452 1394 M -18 -20 V .16 g 5434 1374 M -9 -11 V .16 g 5425 1363 M -8 -9 V .16 g 5417 1354 M -16 -20 V .16 g 5401 1334 M -3 -4 V .16 g 5398 1330 M -14 -16 V .16 g 5384 1314 M -13 -17 V .16 g 5371 1297 M -3 -4 V .16 g 5368 1293 M -16 -20 V .16 g 5352 1273 M -8 -10 V stroke 5344 1263 M .16 g 5344 1263 M -8 -10 V .16 g 5336 1253 M -16 -20 V .16 g 5320 1233 M -4 -5 V .16 g 5316 1228 M -11 -15 V .16 g 5305 1213 M -16 -20 V .16 g 5289 1193 M 0 -1 V .16 g 5289 1192 M -15 -20 V .16 g 5274 1172 M -12 -16 V .16 g 5262 1156 M -3 -4 V .16 g 5259 1152 M -15 -20 V .16 g 5244 1132 M -9 -13 V .16 g 5235 1119 M -6 -7 V .16 g 5229 1112 M -15 -20 V .16 g 5214 1092 M -7 -10 V .16 g 5207 1082 M -7 -10 V .16 g 5200 1072 M -15 -20 V .16 g 5185 1052 M -5 -7 V .16 g 5180 1045 M -9 -14 V .16 g 5171 1031 M -15 -20 V .16 g 5156 1011 M -3 -4 V .16 g 5153 1007 M -11 -16 V .16 g 5142 991 M -15 -20 V .16 g 5127 971 M -1 -3 V .16 g 5126 968 M -13 -17 V .16 g 5113 951 M -14 -20 V .16 g 5099 931 M -1 -1 V .16 g 5098 930 M -14 -20 V .16 g 5084 910 M -13 -18 V .16 g 5071 892 M -1 -2 V .16 g 5070 890 M -15 -20 V .16 g 5055 870 M -11 -16 V 0 g .14 g 738 3188 M .14 g 738 3188 M -8 20 V .14 g 730 3208 M -8 20 V .14 g 722 3228 M -8 20 V .14 g 714 3248 M -3 8 V .14 g 711 3256 M -5 13 V .14 g 706 3269 M -8 20 V .14 g 698 3289 M -8 20 V .14 g 690 3309 M -6 16 V .14 g 684 3325 M -2 4 V .14 g 682 3329 M -8 20 V .14 g 674 3349 M -8 20 V .14 g 666 3369 M -8 21 V .14 g 658 3390 M -1 4 V .14 g 657 3394 M -6 16 V .14 g 651 3410 M -8 20 V .14 g 643 3430 M -8 20 V .14 g 635 3450 M -6 14 V .14 g 629 3464 M -2 6 V .14 g 627 3470 M -8 20 V .14 g 619 3490 M -8 20 V .14 g 611 3510 M -7 21 V stroke 604 3531 M .14 g 604 3531 M -2 4 V 0 g .14 g 1551 1797 M .14 g 1551 1797 M -20 20 V .14 g 1531 1817 M -2 3 V .14 g 1529 1820 M -17 18 V .14 g 1512 1838 M -11 10 V .14 g 1501 1848 M -8 10 V .14 g 1493 1858 M -19 19 V .14 g 1474 1877 M 0 1 V .14 g 1474 1878 M -19 20 V .14 g 1455 1898 M -8 9 V .14 g 1447 1907 M -10 11 V .14 g 1437 1918 M -17 20 V .14 g 1420 1938 M -18 21 V .14 g 1402 1959 M -10 11 V .14 g 1392 1970 M -6 9 V .14 g 1386 1979 M -17 20 V .14 g 1369 1999 M -4 5 V .14 g 1365 2004 M -12 15 V .14 g 1353 2019 M -15 19 V .14 g 1338 2038 M -1 1 V .14 g 1337 2039 M -15 20 V .14 g 1322 2059 M -11 15 V .14 g 1311 2074 M -4 5 V .14 g 1307 2079 M -15 21 V .14 g 1292 2100 M -9 11 V .14 g 1283 2111 M -6 9 V .14 g 1277 2120 M -14 20 V .14 g 1263 2140 M -7 10 V .14 g 1256 2150 M -7 10 V .14 g 1249 2160 M -13 20 V .14 g 1236 2180 M -7 11 V .14 g 1229 2191 M -7 9 V .14 g 1222 2200 M -13 21 V .14 g 1209 2221 M -7 12 V .14 g 1202 2233 M -6 8 V .14 g 1196 2241 M -12 20 V .14 g 1184 2261 M -10 15 V .14 g 1174 2276 M -3 5 V .14 g 1171 2281 M -12 20 V .14 g 1159 2301 M -12 20 V .14 g .14 g 1147 2321 M -12 20 V .14 g 1135 2341 M -11 21 V .14 g 1124 2362 M -4 6 V .14 g 1120 2368 M -8 14 V .14 g 1112 2382 M -11 20 V .14 g 1101 2402 M -8 15 V .14 g 1093 2417 M -3 5 V .14 g 1090 2422 M -11 20 V .14 g 1079 2442 M -11 20 V .14 g 1068 2462 M -3 5 V .14 g 1065 2467 M -8 16 V .14 g 1057 2483 M -10 20 V stroke 1047 2503 M .14 g 1047 2503 M -9 16 V .14 g 1038 2519 M -2 4 V .14 g 1036 2523 M -10 20 V .14 g 1026 2543 M -10 20 V .14 g 1016 2563 M -5 10 V .14 g 1011 2573 M -5 10 V .14 g 1006 2583 M -10 21 V .14 g 996 2604 M -10 20 V .14 g 986 2624 M -2 4 V .14 g 984 2628 M -8 16 V .14 g 976 2644 M -10 20 V .14 g 966 2664 M -10 20 V .14 g 956 2684 M 0 1 V .14 g 956 2685 M -9 19 V .14 g 947 2704 M -9 20 V .14 g 938 2724 M -9 19 V .14 g 929 2743 M -1 2 V .14 g 928 2745 M -9 20 V .14 g 919 2765 M -9 20 V .14 g 910 2785 M -8 18 V .14 g 902 2803 M -1 2 V .14 g 901 2805 M -9 20 V .14 g 892 2825 M -9 20 V .14 g 883 2845 M -8 19 V .14 g 875 2864 M -1 2 V .14 g 874 2866 M -9 20 V .14 g 865 2886 M -9 20 V .14 g 856 2906 M -9 20 V .14 g .14 g 847 2926 M -8 20 V .14 g 839 2946 M -9 20 V .14 g 830 2966 M -8 20 V .14 g 822 2986 M -2 4 V .14 g 820 2990 M -7 17 V .14 g 813 3007 M -8 20 V .14 g 805 3027 M -9 20 V .14 g 796 3047 M -3 8 V .14 g 793 3055 M -5 12 V .14 g 788 3067 M -8 20 V .14 g 780 3087 M -9 20 V .14 g 771 3107 M -6 14 V .14 g 765 3121 M -2 7 V .14 g 763 3128 M -8 20 V .14 g 755 3148 M -8 20 V .14 g 747 3168 M -9 20 V .14 g 0 g .14 g 2568 588 M .14 g 2568 588 M -4 4 V .14 g 2564 592 M -14 16 V .14 g 2550 608 M -13 15 V .14 g 2537 623 M -5 5 V .14 g 2532 628 M -17 20 V .14 g 2515 648 M -5 7 V .14 g 2510 655 M -11 14 V .14 g 2499 669 M -17 19 V stroke 2482 688 M .14 g 2482 688 M 0 1 V .14 g 2482 689 M -16 20 V .14 g 2466 709 M -11 14 V .14 g 2455 723 M -5 6 V .14 g 2450 729 M -16 20 V .14 g 2434 749 M -6 9 V .14 g 2428 758 M -9 11 V .14 g 2419 769 M -15 21 V .14 g 2404 790 M -3 4 V .14 g 2401 794 M -12 16 V .14 g 2389 810 M -16 20 V .14 g .14 g 2373 830 M -14 20 V .14 g 2359 850 M -13 17 V .14 g 2346 867 M -2 3 V .14 g 2344 870 M -15 20 V .14 g 2329 890 M -10 15 V .14 g 2319 905 M -4 5 V .14 g 2315 910 M -15 21 V .14 g 2300 931 M -8 11 V .14 g 2292 942 M -7 9 V .14 g 2285 951 M -14 20 V .14 g 2271 971 M -7 9 V .14 g 2264 980 M -8 11 V .14 g 2256 991 M -14 20 V .14 g 2242 1011 M -5 7 V .14 g 2237 1018 M -10 13 V .14 g 2227 1031 M -14 21 V .14 g 2213 1052 M -3 4 V .14 g 2210 1056 M -12 16 V .14 g 2198 1072 M -14 20 V .14 g 2184 1092 M -1 2 V .14 g 2183 1094 M -14 18 V .14 g 2169 1112 M -14 19 V .14 g 2155 1131 M -1 1 V .14 g 2154 1132 M -15 20 V .14 g 2139 1152 M -11 16 V .14 g 2128 1168 M -4 4 V .14 g 2124 1172 M -15 21 V .14 g 2109 1193 M -8 11 V .14 g 2101 1204 M -7 9 V .14 g 2094 1213 M -16 20 V .14 g 2078 1233 M -4 6 V .14 g 2074 1239 M -11 14 V .14 g 2063 1253 M -16 20 V .14 g 2047 1273 M -1 1 V .14 g 2046 1274 M -15 19 V .14 g 2031 1293 M -12 15 V .14 g 2019 1308 M -4 6 V .14 g 2015 1314 M -17 20 V .14 g 1998 1334 M -6 8 V .14 g 1992 1342 M -10 12 V .14 g 1982 1354 M -17 20 V stroke 1965 1374 M .14 g .14 g 1965 1374 M -18 20 V .14 g 1947 1394 M -10 12 V .14 g 1937 1406 M -7 8 V .14 g 1930 1414 M -18 21 V .14 g 1912 1435 M -2 2 V .14 g 1910 1437 M -16 18 V .14 g 1894 1455 M -11 12 V .14 g 1883 1467 M -8 8 V .14 g 1875 1475 M -19 20 V .14 g 1856 1495 M 0 1 V .14 g 1856 1496 M -19 19 V .14 g 1837 1515 M -9 10 V .14 g 1828 1525 M -10 10 V .14 g 1818 1535 M -17 17 V .14 g 1801 1552 M -3 3 V .14 g 1798 1555 M -20 21 V .14 g 1778 1576 M -4 4 V .14 g 1774 1580 M -16 16 V .14 g 1758 1596 M -11 11 V .14 g 1747 1607 M -10 9 V .14 g 1737 1616 M -18 17 V .14 g 1719 1633 M -3 3 V .14 g 1716 1636 M -20 20 V .14 g 1696 1656 M -4 4 V .14 g 1692 1660 M -17 16 V .14 g 1675 1676 M -10 10 V .14 g 1665 1686 M -11 11 V .14 g 1654 1697 M -16 15 V .14 g 1638 1712 M -5 5 V .14 g 1633 1717 M -21 20 V .14 g 1612 1737 M -2 2 V .14 g 1610 1739 M -18 18 V .14 g 1592 1757 M -9 8 V .14 g 1583 1765 M -12 12 V .14 g 1571 1777 M -15 15 V .14 g 1556 1792 M -5 5 V .0005 g .14 g 2809 3742 M .14 g 2809 3742 M -18 10 V .14 g 2791 3752 M -9 5 V .14 g 2782 3757 M -27 15 V .14 g 2755 3772 M -1 0 V .14 g 2754 3772 M -26 14 V .14 g 2728 3786 M -15 7 V .14 g 2713 3793 M -13 6 V .14 g 2700 3799 M -27 13 V .14 g 2673 3812 M -2 1 V .14 g 2671 3813 M -25 11 V .14 g 2646 3824 M -21 9 V .14 g 2625 3833 M -6 3 V .14 g 2619 3836 M -28 11 V .14 g 2591 3847 M -14 6 V .14 g 2577 3853 M -13 5 V .14 g 2564 3858 M -27 11 V stroke 2537 3869 M .14 g 2537 3869 M -10 4 V .14 g 2527 3873 M -17 7 V .14 g 2510 3880 M -28 11 V .14 g 2482 3891 M -7 2 V .14 g 2475 3893 M -20 8 V .14 g 2455 3901 M -27 11 V .14 g 2428 3912 M -4 2 V .14 g 2424 3914 M -23 9 V .14 g 2401 3923 M -25 11 V .14 g 2376 3934 M -3 1 V .14 g 2373 3935 M -27 12 V .14 g 2346 3947 M -15 7 V .14 g 2331 3954 M -12 5 V .14 g 2319 3959 M -27 14 V .14 g 2292 3973 M -3 1 V .14 g 2289 3974 M -25 13 V .14 g 2264 3987 M -12 7 V .14 g 2252 3994 M -15 8 V .14 g 2237 4002 M -20 12 V .14 g 2217 4014 M -7 5 V .14 g 2210 4019 M -24 16 V .14 g 2186 4035 M -3 2 V .14 g 2183 4037 M -26 18 V .14 g 2157 4055 M -2 1 V .14 g 2155 4056 M -25 19 V .14 g 2130 4075 M -2 1 V .14 g 2128 4076 M -23 19 V .14 g 2105 4095 M -4 4 V .14 g 2101 4099 M -19 16 V .14 g 2082 4115 M -8 7 V .14 g 2074 4122 M -14 13 V .14 g 2060 4135 M -14 13 V .14 g 2046 4148 M -7 7 V .14 g 2039 4155 M -20 20 V .14 g 2019 4175 M 0 1 V .14 g 2019 4176 M -19 20 V .14 g 2000 4196 M -8 9 V .14 g 1992 4205 M -10 11 V .14 g 1982 4216 M -17 20 V .14 g 1965 4236 M -1 0 V .14 g 1964 4236 M -16 20 V .14 g 1948 4256 M -11 13 V .14 g 1937 4269 M -6 7 V .14 g 1931 4276 M -15 21 V .14 g 1916 4297 M -6 7 V .14 g 1910 4304 M -10 13 V .14 g 1900 4317 M -15 20 V .14 g 1885 4337 M -2 4 V .14 g 1883 4341 M -12 16 V .14 g 1871 4357 M -14 20 V .14 g 1857 4377 M -1 2 V .14 g 1856 4379 M -13 18 V stroke 1843 4397 M .14 g 1843 4397 M -13 20 V .14 g 1830 4417 M -2 2 V .14 g 1828 4419 M -12 19 V .14 g 1816 4438 M -13 20 V .14 g 1803 4458 M -2 3 V .14 g 1801 4461 M -10 17 V .14 g 1791 4478 M -13 20 V .14 g 1778 4498 M -4 7 V .14 g 1774 4505 M -8 13 V .14 g 1766 4518 M -13 20 V .14 g 1753 4538 M -6 12 V .14 g 1747 4550 M -6 9 V .14 g 1741 4559 M -11 20 V .14 g 1730 4579 M -11 17 V .14 g 1719 4596 M -1 3 V .14 g 1718 4599 M -12 20 V 0 g .14 g 4302 3611 M .14 g 4302 3611 M -21 -17 V .14 g 4281 3594 M -4 -3 V .14 g 4277 3591 M -23 -19 V .14 g 4254 3572 M -2 -1 V .14 g 4252 3571 M -25 -20 V .14 g 4227 3551 M -1 -1 V .14 g 4226 3550 M -24 -19 V .14 g 4202 3531 M -3 -3 V .14 g 4199 3528 M -22 -18 V .14 g 4177 3510 M -5 -4 V .14 g 4172 3506 M -20 -16 V .14 g 4152 3490 M -7 -6 V .14 g 4145 3484 M -19 -14 V .14 g 4126 3470 M -9 -7 V .14 g 4117 3463 M -16 -13 V .14 g 4101 3450 M -11 -8 V .14 g 4090 3442 M -15 -12 V .14 g 4075 3430 M -12 -9 V .14 g 4063 3421 M -15 -11 V .14 g 4048 3410 M -12 -9 V .14 g 4036 3401 M -16 -11 V .14 g 4020 3390 M -12 -9 V .14 g 4008 3381 M -17 -12 V .14 g 3991 3369 M -10 -7 V .14 g 3981 3362 M -21 -13 V .14 g 3960 3349 M -6 -4 V .14 g 3954 3345 M -27 -16 V .14 g 3927 3329 M 0 -1 V .14 g 3927 3328 M -28 -15 V .14 g 3899 3313 M -8 -4 V .14 g 3891 3309 M -19 -10 V .14 g 3872 3299 M -23 -10 V .14 g 3849 3289 M -4 -2 V .14 g 3845 3287 M -27 -11 V .14 g 3818 3276 M -23 -7 V .14 g 3795 3269 M -5 -2 V stroke 3790 3267 M .14 g 3790 3267 M -27 -7 V .14 g 3763 3260 M -27 -6 V .14 g 3736 3254 M -27 -4 V .14 g 3709 3250 M -27 -2 V .14 g 3682 3248 M -1 0 V .14 g 3681 3248 M -27 0 V .14 g 3654 3248 M -1 0 V .14 g 3653 3248 M -26 2 V .14 g 3627 3250 M -27 4 V .14 g 3600 3254 M -28 5 V .14 g 3572 3259 M -27 8 V .14 g 3545 3267 M -6 2 V .14 g 3539 3269 M -21 7 V .14 g 3518 3276 M -27 10 V .14 g 3491 3286 M -6 3 V .14 g 3485 3289 M -22 9 V .14 g 3463 3298 M -21 11 V .14 g 3442 3309 M -6 3 V .14 g 3436 3312 M -27 15 V .14 g 3409 3327 M -4 2 V .14 g 3405 3329 M -23 14 V .14 g 3382 3343 M -11 6 V .14 g 3371 3349 M -17 11 V .14 g 3354 3360 M -15 9 V .14 g 3339 3369 M -12 8 V .14 g 3327 3377 M -18 13 V .14 g 3309 3390 M -9 6 V .14 g 3300 3396 M -19 14 V .14 g 3281 3410 M -8 5 V .14 g 3273 3415 M -20 15 V .14 g 3253 3430 M -8 5 V .14 g 3245 3435 M -20 15 V .14 g 3225 3450 M -7 6 V .14 g 3218 3456 M -19 14 V .14 g 3199 3470 M -8 6 V .14 g 3191 3476 M -19 14 V .14 g 3172 3490 M -8 7 V .14 g 3164 3497 M -18 13 V .14 g 3146 3510 M -10 8 V .14 g 3136 3518 M -17 13 V .14 g 3119 3531 M -10 7 V .14 g 3109 3538 M -16 13 V .14 g 3093 3551 M -11 8 V .14 g 3082 3559 M -16 12 V .14 g 3066 3571 M -11 8 V .14 g 3055 3579 M -16 12 V .14 g 3039 3591 M -12 8 V .14 g 3027 3599 M -16 12 V .14 g 3011 3611 M -11 8 V .14 g 3000 3619 M -17 12 V .14 g 2983 3631 M -10 7 V .14 g 2973 3638 M -19 14 V stroke 2954 3652 M .14 g 2954 3652 M -8 5 V .14 g 2946 3657 M -22 15 V .14 g 2924 3672 M -6 3 V .14 g 2918 3675 M -25 17 V .14 g 2893 3692 M -2 1 V .14 g 2891 3693 M -27 17 V .14 g 2864 3710 M -4 2 V .14 g 2860 3712 M -23 14 V .14 g 2837 3726 M -10 6 V .14 g 2827 3732 M -18 10 V 0 g .14 g 5594 4619 M .14 g 5594 4619 M -5 -9 V .14 g 5589 4610 M -7 -11 V .14 g 5582 4599 M -12 -20 V .14 g 5570 4579 M -8 -14 V .14 g 5562 4565 M -4 -6 V .14 g 5558 4559 M -13 -21 V .14 g 5545 4538 M -11 -17 V .14 g 5534 4521 M -1 -3 V .14 g 5533 4518 M -13 -20 V .14 g 5520 4498 M -13 -19 V .14 g 5507 4479 M 0 -1 V .14 g 5507 4478 M -14 -20 V .14 g 5493 4458 M -13 -20 V .14 g 5480 4438 M -1 0 V .14 g 5479 4438 M -14 -21 V .14 g 5465 4417 M -12 -17 V .14 g 5453 4400 M -2 -3 V .14 g 5451 4397 M -15 -20 V .14 g 5436 4377 M -11 -14 V .14 g 5425 4363 M -4 -6 V .14 g 5421 4357 M -16 -20 V .14 g 5405 4337 M -7 -9 V .14 g 5398 4328 M -9 -11 V .14 g 5389 4317 M -17 -20 V .14 g 5372 4297 M -1 -2 V .14 g 5371 4295 M -16 -19 V .14 g 5355 4276 M -11 -12 V .14 g 5344 4264 M -7 -8 V .14 g 5337 4256 M -19 -20 V .14 g 5318 4236 M -2 -2 V .14 g 5316 4234 M -18 -18 V .14 g 5298 4216 M -9 -9 V .14 g 5289 4207 M -12 -11 V .14 g 5277 4196 M -15 -15 V .14 g 5262 4181 M -6 -5 V .14 g 5256 4176 M -21 -19 V .14 g 5235 4157 M -2 -2 V .14 g 5233 4155 M -25 -20 V .14 g 5208 4135 M -1 0 V .14 g 5207 4135 M -25 -20 V .14 g 5182 4115 M -2 -1 V .14 g 5180 4114 M -26 -19 V stroke 5154 4095 M .14 g 5154 4095 M -1 -1 V .14 g 5153 4094 M -27 -18 V .14 g 5126 4076 M -3 -1 V .14 g 5123 4075 M -25 -16 V .14 g 5098 4059 M -7 -4 V .14 g 5091 4055 M -20 -12 V .14 g 5071 4043 M -16 -8 V .14 g 5055 4035 M -11 -7 V .14 g 5044 4028 M -27 -14 V .14 g .14 g 5017 4014 M -28 -13 V .14 g 4989 4001 M -13 -7 V .14 g 4976 3994 M -14 -6 V .14 g 4962 3988 M -27 -13 V .14 g 4935 3975 M -3 -1 V .14 g 4932 3974 M -24 -11 V .14 g 4908 3963 M -21 -9 V .14 g 4887 3954 M -7 -3 V .14 g 4880 3951 M -27 -12 V .14 g 4853 3939 M -12 -5 V .14 g 4841 3934 M -15 -7 V .14 g 4826 3927 M -27 -12 V .14 g 4799 3915 M -3 -1 V .14 g 4796 3914 M -25 -11 V .14 g 4771 3903 M -20 -10 V .14 g 4751 3893 M -7 -3 V .14 g 4744 3890 M -27 -13 V .14 g 4717 3877 M -8 -4 V .14 g 4709 3873 M -19 -9 V .14 g 4690 3864 M -21 -11 V .14 g 4669 3853 M -7 -3 V .14 g 4662 3850 M -27 -15 V .14 g 4635 3835 M -5 -2 V .14 g 4630 3833 M -22 -13 V .14 g 4608 3820 M -14 -7 V .14 g 4594 3813 M -13 -8 V .14 g 4581 3805 M -21 -12 V .14 g 4560 3793 M -7 -4 V .14 g 4553 3789 M -26 -17 V .14 g 4527 3772 M -1 0 V .14 g 4526 3772 M -27 -18 V .14 g 4499 3754 M -3 -2 V .14 g 4496 3752 M -24 -16 V .14 g 4472 3736 M -6 -4 V .14 g 4466 3732 M -22 -14 V .14 g 4444 3718 M -7 -6 V .14 g 4437 3712 M -20 -14 V .14 g 4417 3698 M -9 -6 V .14 g 4408 3692 M -18 -14 V .14 g 4390 3678 M -9 -6 V .14 g 4381 3672 M -18 -14 V .14 g 4363 3658 M -9 -6 V .14 g 4354 3652 M -19 -15 V stroke 4335 3637 M .14 g 4335 3637 M -7 -6 V .14 g 4328 3631 M -20 -15 V .14 g 4308 3616 M -6 -5 V 0 g .14 g 5022 951 M .14 g 5022 951 M -5 -8 V .14 g 5017 943 M -9 -12 V .14 g 5008 931 M -14 -21 V .14 g 4994 910 M -5 -6 V .14 g 4989 904 M -10 -14 V .14 g 4979 890 M -14 -20 V .14 g 4965 870 M -3 -4 V .14 g 4962 866 M -12 -16 V .14 g 4950 850 M -15 -20 V .14 g 4935 830 M 0 -1 V .14 g 4935 829 M -15 -19 V .14 g 4920 810 M -12 -18 V .14 g 4908 792 M -3 -2 V .14 g 4905 790 M -15 -21 V .14 g 4890 769 M -10 -12 V .14 g 4880 757 M -5 -8 V .14 g 4875 749 M -16 -20 V .14 g 4859 729 M -6 -7 V .14 g 4853 722 M -10 -13 V .14 g 4843 709 M -17 -20 V .14 g 4826 689 M 0 -1 V .14 g 4826 688 M -16 -19 V .14 g 4810 669 M -11 -14 V .14 g 4799 655 M -7 -7 V .14 g 4792 648 M -17 -20 V .14 g 4775 628 M -4 -4 V .14 g 4771 624 M -14 -16 V .14 g 4757 608 M -13 -14 V .14 g 4744 594 M -6 -6 V 0 g .14 g 6052 2198 M .14 g 6052 2198 M -13 -18 V .14 g 6039 2180 M -14 -19 V .14 g 6025 2161 M -1 -1 V .14 g 6024 2160 M -15 -20 V .14 g 6009 2140 M -11 -16 V .14 g 5998 2124 M -4 -4 V .14 g 5994 2120 M -16 -20 V .14 g 5978 2100 M -8 -10 V .14 g 5970 2090 M -8 -11 V .14 g 5962 2079 M -16 -20 V .14 g 5946 2059 M -3 -3 V .14 g 5943 2056 M -14 -17 V .14 g 5929 2039 M -13 -16 V .14 g 5916 2023 M -4 -4 V .14 g 5912 2019 M -17 -20 V .14 g 5895 1999 M -6 -7 V .14 g 5889 1992 M -12 -13 V .14 g 5877 1979 M -16 -18 V .14 g 5861 1961 M -2 -2 V stroke 5859 1959 M .14 g 5859 1959 M -18 -21 V .14 g 5841 1938 M -7 -7 V .14 g 5834 1931 M -12 -13 V .14 g 5822 1918 M -15 -16 V .14 g 5807 1902 M -4 -4 V .14 g 5803 1898 M -19 -20 V .14 g 5784 1878 M -4 -5 V .14 g 5780 1873 M -16 -15 V .14 g 5764 1858 M -12 -13 V .14 g 5752 1845 M -7 -7 V .14 g 5745 1838 M -20 -20 V .14 g 5725 1818 M 0 -1 V .14 g 5725 1817 M -20 -20 V .14 g 5705 1797 M -7 -7 V .14 g 5698 1790 M -13 -13 V .14 g 5685 1777 M -14 -15 V .14 g 5671 1762 M -6 -5 V .14 g 5665 1757 M -20 -20 V .14 g 5645 1737 M -2 -2 V .14 g 5643 1735 M -18 -18 V .14 g 5625 1717 M -9 -10 V .14 g 5616 1707 M -10 -10 V .14 g 5606 1697 M -17 -18 V .14 g 5589 1679 M -3 -3 V .14 g 5586 1676 M -19 -20 V .14 g 5567 1656 M -5 -6 V .14 g 5562 1650 M -14 -14 V .14 g 5548 1636 M -14 -15 V .14 g 5534 1621 M -5 -5 V .14 g 5529 1616 M -18 -20 V .14 g 5511 1596 M -4 -4 V .14 g 5507 1592 M -15 -16 V .14 g 5492 1576 M -12 -14 V .14 g 5480 1562 M -6 -7 V .14 g 5474 1555 M -17 -20 V .14 g 5457 1535 M -4 -4 V .14 g 5453 1531 M -14 -16 V .14 g 5439 1515 M -14 -16 V .14 g 5425 1499 M -3 -4 V .14 g 5422 1495 M -17 -20 V .14 g 5405 1475 M -7 -9 V .14 g 5398 1466 M -9 -11 V .14 g 5389 1455 M -17 -20 V .14 g 5372 1435 M -1 -2 V .14 g 5371 1433 M -15 -19 V .14 g 5356 1414 M -12 -16 V .14 g 5344 1398 M -4 -4 V .14 g 5340 1394 M -15 -20 V .14 g 5325 1374 M -9 -11 V .14 g 5316 1363 M -7 -9 V .14 g 5309 1354 M -15 -20 V .14 g 5294 1334 M -5 -7 V stroke 5289 1327 M .14 g 5289 1327 M -10 -13 V .14 g 5279 1314 M -15 -21 V .14 g 5264 1293 M -2 -3 V .14 g 5262 1290 M -13 -17 V .14 g 5249 1273 M -14 -20 V .14 g 5235 1253 M -15 -20 V .14 g 5220 1233 M -13 -18 V .14 g 5207 1215 M -1 -2 V .14 g 5206 1213 M -15 -20 V .14 g 5191 1193 M -11 -16 V .14 g 5180 1177 M -3 -5 V .14 g 5177 1172 M -14 -20 V .14 g 5163 1152 M -10 -14 V .14 g 5153 1138 M -4 -6 V .14 g 5149 1132 M -14 -20 V .14 g 5135 1112 M -9 -13 V .14 g 5126 1099 M -6 -7 V .14 g 5120 1092 M -14 -20 V .14 g 5106 1072 M -8 -12 V .14 g 5098 1060 M -6 -8 V .14 g 5092 1052 M -14 -21 V .14 g 5078 1031 M -7 -10 V .14 g 5071 1021 M -7 -10 V .14 g 5064 1011 M -14 -20 V .14 g 5050 991 M -6 -9 V .14 g 5044 982 M -8 -11 V .14 g 5036 971 M -14 -20 V 0 g .12 g 809 3148 M .12 g 809 3148 M -8 20 V .12 g 801 3168 M -8 19 V .12 g 793 3187 M -1 1 V .12 g 792 3188 M -8 20 V .12 g 784 3208 M -8 20 V .12 g 776 3228 M -8 20 V .12 g 768 3248 M -3 6 V .12 g 765 3254 M -5 15 V .12 g 760 3269 M -8 20 V .12 g 752 3289 M -8 20 V .12 g 744 3309 M -6 13 V .12 g 738 3322 M -2 7 V .12 g 736 3329 M -8 20 V .12 g 728 3349 M -8 20 V .12 g 720 3369 M -8 21 V .12 g 712 3390 M -1 1 V .12 g 711 3391 M -7 19 V .12 g 704 3410 M -8 20 V .12 g 696 3430 M -8 20 V .12 g 688 3450 M -4 11 V .12 g 684 3461 M -4 9 V .12 g 680 3470 M -7 20 V .12 g 673 3490 M -8 20 V .12 g 665 3510 M -8 21 V .12 g 657 3531 M 0 1 V stroke 657 3532 M .12 g 657 3532 M -8 19 V .12 g 649 3551 M -8 20 V .12 g 641 3571 M -7 20 V .12 g 634 3591 M -5 12 V .12 g 629 3603 M -3 8 V .12 g 626 3611 M -8 20 V .12 g 618 3631 M -7 21 V .12 g 611 3652 M -8 20 V .12 g 603 3672 M -1 2 V 0 g .12 g 1676 1817 M .12 g 1676 1817 M -11 11 V .12 g 1665 1828 M -11 10 V .12 g 1654 1838 M -16 15 V .12 g 1638 1853 M -6 5 V .12 g 1632 1858 M -22 20 V .12 g .12 g 1610 1878 M -21 20 V .12 g 1589 1898 M -6 5 V .12 g 1583 1903 M -15 15 V .12 g 1568 1918 M -12 11 V .12 g 1556 1929 M -9 9 V .12 g 1547 1938 M -18 18 V .12 g 1529 1956 M -3 3 V .12 g 1526 1959 M -20 20 V .12 g 1506 1979 M -5 4 V .12 g 1501 1983 M -15 16 V .12 g 1486 1999 M -12 12 V .12 g 1474 2011 M -8 8 V .12 g 1466 2019 M -19 20 V .12 g 1447 2039 M 0 1 V .12 g 1447 2040 M -18 19 V .12 g 1429 2059 M -9 11 V .12 g 1420 2070 M -9 9 V .12 g 1411 2079 M -18 21 V .12 g 1393 2100 M -1 1 V .12 g 1392 2101 M -16 19 V .12 g 1376 2120 M -11 13 V .12 g 1365 2133 M -5 7 V .12 g 1360 2140 M -17 20 V .12 g 1343 2160 M -5 7 V .12 g 1338 2167 M -10 13 V .12 g 1328 2180 M -16 20 V .12 g 1312 2200 M -1 2 V .12 g 1311 2202 M -14 19 V .12 g 1297 2221 M -14 18 V .12 g 1283 2239 M -1 2 V .12 g 1282 2241 M -14 20 V .12 g 1268 2261 M -12 16 V .12 g 1256 2277 M -3 4 V .12 g 1253 2281 M -13 20 V .12 g 1240 2301 M -11 16 V .12 g 1229 2317 M -3 4 V .12 g 1226 2321 M -13 20 V .12 g 1213 2341 M -11 18 V stroke 1202 2359 M .12 g 1202 2359 M -2 3 V .12 g 1200 2362 M -13 20 V .12 g 1187 2382 M -13 20 V .12 g .12 g 1174 2402 M -12 20 V .12 g 1162 2422 M -12 20 V .12 g 1150 2442 M -3 5 V .12 g 1147 2447 M -9 15 V .12 g 1138 2462 M -12 21 V .12 g 1126 2483 M -6 11 V .12 g 1120 2494 M -5 9 V .12 g 1115 2503 M -11 20 V .12 g 1104 2523 M -11 19 V .12 g 1093 2542 M -1 1 V .12 g 1092 2543 M -11 20 V .12 g 1081 2563 M -11 20 V .12 g 1070 2583 M -5 10 V .12 g 1065 2593 M -5 11 V .12 g 1060 2604 M -11 20 V .12 g 1049 2624 M -10 20 V .12 g 1039 2644 M -1 1 V .12 g 1038 2645 M -10 19 V .12 g 1028 2664 M -10 20 V .12 g 1018 2684 M -7 15 V .12 g 1011 2699 M -3 5 V .12 g 1008 2704 M -10 20 V .12 g 998 2724 M -10 21 V .12 g 988 2745 M -4 9 V .12 g 984 2754 M -5 11 V .12 g 979 2765 M -10 20 V .12 g 969 2785 M -10 20 V .12 g 959 2805 M -3 7 V .12 g 956 2812 M -6 13 V .12 g 950 2825 M -9 20 V .12 g 941 2845 M -10 21 V .12 g 931 2866 M -2 4 V .12 g 929 2870 M -7 16 V .12 g 922 2886 M -9 20 V .12 g 913 2906 M -9 20 V .12 g 904 2926 M -2 5 V .12 g 902 2931 M -7 15 V .12 g 895 2946 M -9 20 V .12 g 886 2966 M -9 20 V .12 g 877 2986 M -2 7 V .12 g 875 2993 M -6 14 V .12 g 869 3007 M -9 20 V .12 g 860 3027 M -9 20 V .12 g 851 3047 M -4 9 V .12 g 847 3056 M -4 11 V .12 g 843 3067 M -9 20 V .12 g 834 3087 M -8 20 V .12 g 826 3107 M -6 14 V .12 g 820 3121 M -3 7 V stroke 817 3128 M .12 g 817 3128 M -8 20 V 0 g .12 g 2697 588 M .12 g 2697 588 M -23 20 V .12 g 2674 608 M -1 1 V .12 g 2673 609 M -20 19 V .12 g 2653 628 M -7 7 V .12 g 2646 635 M -14 13 V .12 g 2632 648 M -13 14 V .12 g 2619 662 M -6 7 V .12 g 2613 669 M -19 20 V .12 g 2594 689 M -3 2 V .12 g 2591 691 M -15 18 V .12 g 2576 709 M -12 13 V .12 g 2564 722 M -6 7 V .12 g 2558 729 M -18 20 V .12 g 2540 749 M -3 5 V .12 g 2537 754 M -13 15 V .12 g 2524 769 M -14 18 V .12 g 2510 787 M -3 3 V .12 g 2507 790 M -16 20 V .12 g 2491 810 M -9 11 V .12 g 2482 821 M -7 9 V .12 g 2475 830 M -15 20 V .12 g 2460 850 M -5 6 V .12 g 2455 856 M -11 14 V .12 g 2444 870 M -15 20 V .12 g 2429 890 M -1 2 V .12 g 2428 892 M -14 18 V .12 g 2414 910 M -13 19 V .12 g 2401 929 M -1 2 V .12 g 2400 931 M -15 20 V .12 g 2385 951 M -12 16 V .12 g 2373 967 M -3 4 V .12 g 2370 971 M -14 20 V .12 g 2356 991 M -10 14 V .12 g 2346 1005 M -4 6 V .12 g 2342 1011 M -14 20 V .12 g 2328 1031 M -9 13 V .12 g 2319 1044 M -6 8 V .12 g 2313 1052 M -14 20 V .12 g 2299 1072 M -7 11 V .12 g 2292 1083 M -7 9 V .12 g 2285 1092 M -14 20 V .12 g 2271 1112 M -7 10 V .12 g 2264 1122 M -7 10 V .12 g 2257 1132 M -14 20 V .12 g 2243 1152 M -6 9 V .12 g 2237 1161 M -8 11 V .12 g 2229 1172 M -14 21 V .12 g 2215 1193 M -5 7 V .12 g 2210 1200 M -9 13 V .12 g 2201 1213 M -14 20 V .12 g 2187 1233 M -4 6 V stroke 2183 1239 M .12 g 2183 1239 M -11 14 V .12 g 2172 1253 M -14 20 V .12 g 2158 1273 M -3 4 V .12 g 2155 1277 M -12 16 V .12 g 2143 1293 M -14 21 V .12 g 2129 1314 M -1 1 V .12 g 2128 1315 M -14 19 V .12 g 2114 1334 M -13 18 V .12 g 2101 1352 M -2 2 V .12 g 2099 1354 M -15 20 V .12 g 2084 1374 M -10 14 V .12 g 2074 1388 M -5 6 V .12 g 2069 1394 M -16 20 V .12 g 2053 1414 M -7 9 V .12 g 2046 1423 M -9 12 V .12 g 2037 1435 M -15 20 V .12 g 2022 1455 M -3 3 V .12 g 2019 1458 M -14 17 V .12 g 2005 1475 M -13 16 V .12 g 1992 1491 M -3 4 V .12 g 1989 1495 M -17 20 V .12 g 1972 1515 M -7 9 V .12 g 1965 1524 M -10 11 V .12 g 1955 1535 M -18 20 V .12 g 1937 1555 M 0 1 V .12 g 1937 1556 M -17 20 V .12 g 1920 1576 M -10 10 V .12 g 1910 1586 M -9 10 V .12 g 1901 1596 M -18 20 V .12 g .12 g 1883 1616 M -19 20 V .12 g 1864 1636 M -8 9 V .12 g 1856 1645 M -12 11 V .12 g 1844 1656 M -16 16 V .12 g 1828 1672 M -4 4 V .12 g 1824 1676 M -20 21 V .12 g 1804 1697 M -3 3 V .12 g 1801 1700 M -18 17 V .12 g 1783 1717 M -9 9 V .12 g 1774 1726 M -12 11 V .12 g 1762 1737 M -15 15 V .12 g 1747 1752 M -6 5 V .12 g 1741 1757 M -21 20 V .12 g 1720 1777 M -1 0 V .12 g 1719 1777 M -21 20 V .12 g 1698 1797 M -6 6 V .12 g 1692 1803 M -16 14 V 0 g .12 g 1672 4538 M .12 g 1672 4538 M -7 13 V .12 g 1665 4551 M -4 8 V .12 g 1661 4559 M -11 20 V .12 g 1650 4579 M -11 20 V .12 g 1639 4599 M -1 3 V .12 g 1638 4602 M -9 17 V stroke 1629 4619 M 0 g .12 g 2973 3511 M .12 g 2973 3511 M -27 20 V .12 g .12 g 2946 3531 M -28 18 V .12 g 2918 3549 M -2 2 V .12 g 2916 3551 M -25 16 V .12 g 2891 3567 M -6 4 V .12 g 2885 3571 M -21 13 V .12 g 2864 3584 M -11 7 V .12 g 2853 3591 M -16 10 V .12 g 2837 3601 M -18 10 V .12 g 2819 3611 M -10 6 V .12 g 2809 3617 M -26 14 V .12 g 2783 3631 M -1 1 V .12 g 2782 3632 M -27 14 V .12 g 2755 3646 M -11 6 V .12 g 2744 3652 M -16 8 V .12 g 2728 3660 M -26 12 V .12 g 2702 3672 M -2 1 V .12 g 2700 3673 M -27 12 V .12 g 2673 3685 M -16 7 V .12 g 2657 3692 M -11 5 V .12 g 2646 3697 M -27 11 V .12 g 2619 3708 M -11 4 V .12 g 2608 3712 M -17 7 V .12 g 2591 3719 M -27 10 V .12 g 2564 3729 M -9 3 V .12 g 2555 3732 M -18 7 V .12 g 2537 3739 M -27 10 V .12 g 2510 3749 M -11 3 V .12 g 2499 3752 M -17 6 V .12 g 2482 3758 M -27 10 V .12 g 2455 3768 M -13 4 V .12 g 2442 3772 M -14 6 V .12 g 2428 3778 M -27 10 V .12 g 2401 3788 M -14 5 V .12 g 2387 3793 M -14 5 V .12 g 2373 3798 M -27 11 V .12 g 2346 3809 M -10 4 V .12 g 2336 3813 M -17 7 V .12 g 2319 3820 M -27 12 V .12 g 2292 3832 M -2 1 V .12 g 2290 3833 M -26 12 V .12 g 2264 3845 M -15 8 V .12 g 2249 3853 M -12 6 V .12 g 2237 3859 M -24 14 V .12 g 2213 3873 M -3 2 V .12 g 2210 3875 M -27 16 V .12 g 2183 3891 M -3 2 V .12 g 2180 3893 M -25 17 V .12 g 2155 3910 M -5 4 V .12 g 2150 3914 M -22 15 V .12 g 2128 3929 M -6 5 V .12 g 2122 3934 M -21 17 V stroke 2101 3951 M .12 g 2101 3951 M -4 3 V .12 g 2097 3954 M -23 20 V .12 g 2074 3974 M -1 0 V .12 g 2073 3974 M -22 20 V .12 g 2051 3994 M -5 5 V .12 g 2046 3999 M -15 15 V .12 g 2031 4014 M -12 12 V .12 g 2019 4026 M -8 9 V .12 g 2011 4035 M -19 20 V .12 g .12 g 1992 4055 M -18 20 V .12 g 1974 4075 M -9 11 V .12 g 1965 4086 M -8 9 V .12 g 1957 4095 M -16 20 V .12 g 1941 4115 M -4 4 V .12 g 1937 4119 M -12 16 V .12 g 1925 4135 M -15 19 V .12 g 1910 4154 M -1 1 V .12 g 1909 4155 M -15 21 V .12 g 1894 4176 M -11 15 V .12 g 1883 4191 M -3 5 V .12 g 1880 4196 M -14 20 V .12 g 1866 4216 M -10 14 V .12 g 1856 4230 M -4 6 V .12 g 1852 4236 M -14 20 V .12 g 1838 4256 M -10 15 V .12 g 1828 4271 M -3 5 V .12 g 1825 4276 M -13 21 V .12 g 1812 4297 M -11 17 V .12 g 1801 4314 M -2 3 V .12 g 1799 4317 M -12 20 V .12 g 1787 4337 M -12 20 V .12 g 1775 4357 M -1 2 V .12 g 1774 4359 M -11 18 V .12 g 1763 4377 M -12 20 V .12 g 1751 4397 M -4 8 V .12 g 1747 4405 M -8 12 V .12 g 1739 4417 M -11 21 V .12 g 1728 4438 M -9 14 V .12 g 1719 4452 M -3 6 V .12 g 1716 4458 M -11 20 V .12 g 1705 4478 M -11 20 V .12 g 1694 4498 M -2 3 V .12 g 1692 4501 M -9 17 V .12 g 1683 4518 M -11 20 V 0 g .12 g 4417 3572 M .12 g 4417 3572 M -1 -1 V .12 g 4416 3571 M -26 -19 V .12 g 4390 3552 M -1 -1 V .12 g 4389 3551 M -26 -20 V .12 g 4363 3531 M -1 0 V .12 g 4362 3531 M -25 -21 V .12 g 4337 3510 M -2 -1 V .12 g 4335 3509 M -23 -19 V stroke 4312 3490 M .12 g 4312 3490 M -4 -3 V .12 g 4308 3487 M -21 -17 V .12 g 4287 3470 M -6 -5 V .12 g 4281 3465 M -18 -15 V .12 g 4263 3450 M -9 -8 V .12 g 4254 3442 M -15 -12 V .12 g 4239 3430 M -13 -11 V .12 g 4226 3419 M -11 -9 V .12 g 4215 3410 M -16 -14 V .12 g 4199 3396 M -8 -6 V .12 g 4191 3390 M -19 -17 V .12 g 4172 3373 M -5 -4 V .12 g 4167 3369 M -22 -19 V .12 g 4145 3350 M -2 -1 V .12 g 4143 3349 M -24 -20 V .12 g 4119 3329 M -2 -2 V .12 g 4117 3327 M -22 -18 V .12 g 4095 3309 M -5 -4 V .12 g 4090 3305 M -20 -16 V .12 g 4070 3289 M -7 -6 V .12 g 4063 3283 M -18 -14 V .12 g 4045 3269 M -9 -8 V .12 g 4036 3261 M -18 -13 V .12 g 4018 3248 M -10 -7 V .12 g 4008 3241 M -17 -13 V .12 g 3991 3228 M -10 -7 V .12 g 3981 3221 M -19 -13 V .12 g 3962 3208 M -8 -6 V .12 g 3954 3202 M -22 -14 V .12 g 3932 3188 M -5 -3 V .12 g 3927 3185 M -28 -17 V .12 g 3899 3168 M -1 0 V .12 g 3898 3168 M -26 -15 V .12 g 3872 3153 M -12 -5 V .12 g 3860 3148 M -15 -8 V .12 g 3845 3140 M -27 -12 V .12 g 3818 3128 M -3 0 V .12 g 3815 3128 M -25 -9 V .12 g 3790 3119 M -27 -8 V .12 g 3763 3111 M -15 -4 V .12 g 3748 3107 M -12 -2 V .12 g 3736 3105 M -27 -4 V .12 g 3709 3101 M -28 -2 V .12 g 3681 3099 M -27 0 V .12 g 3654 3099 M -27 2 V .12 g 3627 3101 M -27 4 V .12 g 3600 3105 M -12 2 V .12 g 3588 3107 M -16 4 V .12 g 3572 3111 M -27 8 V .12 g 3545 3119 M -24 9 V .12 g 3521 3128 M -3 1 V .12 g 3518 3129 M -27 11 V stroke 3491 3140 M .12 g 3491 3140 M -17 8 V .12 g 3474 3148 M -11 5 V .12 g 3463 3153 M -27 15 V .12 g .12 g 3436 3168 M -27 15 V .12 g 3409 3183 M -7 5 V .12 g 3402 3188 M -20 13 V .12 g 3382 3201 M -12 7 V .12 g 3370 3208 M -16 11 V .12 g 3354 3219 M -13 9 V .12 g 3341 3228 M -14 10 V .12 g 3327 3238 M -14 10 V .12 g 3313 3248 M -13 10 V .12 g 3300 3258 M -15 11 V .12 g 3285 3269 M -12 9 V .12 g 3273 3278 M -14 11 V .12 g 3259 3289 M -14 10 V .12 g 3245 3299 M -12 10 V .12 g 3233 3309 M -15 12 V .12 g 3218 3321 M -10 8 V .12 g 3208 3329 M -17 14 V .12 g 3191 3343 M -9 6 V .12 g 3182 3349 M -18 15 V .12 g 3164 3364 M -7 5 V .12 g 3157 3369 M -21 17 V .12 g 3136 3386 M -4 4 V .12 g 3132 3390 M -23 18 V .12 g 3109 3408 M -2 2 V .12 g 3107 3410 M -25 19 V .12 g 3082 3429 M -1 1 V .12 g 3081 3430 M -26 20 V .12 g 3055 3450 M 0 1 V .12 g 3055 3451 M -26 19 V .12 g 3029 3470 M -2 1 V .12 g 3027 3471 M -25 19 V .12 g 3002 3490 M -2 2 V .12 g 3000 3492 M -26 18 V .12 g 2974 3510 M -1 1 V 0 g .12 g 5674 4619 M .12 g 5674 4619 M -3 -7 V .12 g 5671 4612 M -7 -13 V .12 g 5664 4599 M -11 -20 V .12 g 5653 4579 M -10 -18 V .12 g 5643 4561 M -1 -2 V .12 g 5642 4559 M -11 -21 V .12 g 5631 4538 M -11 -20 V .12 g 5620 4518 M -4 -6 V .12 g 5616 4512 M -8 -14 V .12 g 5608 4498 M -11 -20 V .12 g 5597 4478 M -8 -14 V .12 g 5589 4464 M -4 -6 V .12 g 5585 4458 M -12 -20 V .12 g 5573 4438 M -11 -20 V .12 g 5562 4418 M -1 -1 V stroke 5561 4417 M .12 g 5561 4417 M -12 -20 V .12 g 5549 4397 M -12 -20 V .12 g 5537 4377 M -3 -4 V .12 g 5534 4373 M -10 -16 V .12 g 5524 4357 M -13 -20 V .12 g 5511 4337 M -4 -7 V .12 g 5507 4330 M -9 -13 V .12 g 5498 4317 M -13 -20 V .12 g 5485 4297 M -5 -8 V .12 g 5480 4289 M -9 -13 V .12 g 5471 4276 M -14 -20 V .12 g 5457 4256 M -4 -6 V .12 g 5453 4250 M -11 -14 V .12 g 5442 4236 M -15 -20 V .12 g 5427 4216 M -2 -3 V .12 g 5425 4213 M -13 -17 V .12 g 5412 4196 M -14 -18 V .12 g 5398 4178 M -2 -2 V .12 g 5396 4176 M -17 -21 V .12 g 5379 4155 M -8 -10 V .12 g 5371 4145 M -9 -10 V .12 g 5362 4135 M -18 -20 V .12 g 5344 4115 M 0 -1 V .12 g 5344 4114 M -18 -19 V .12 g 5326 4095 M -10 -10 V .12 g 5316 4085 M -10 -10 V .12 g 5306 4075 M -17 -17 V .12 g 5289 4058 M -4 -3 V .12 g 5285 4055 M -22 -20 V .12 g 5263 4035 M -1 -2 V .12 g 5262 4033 M -22 -19 V .12 g 5240 4014 M -5 -4 V .12 g 5235 4010 M -20 -16 V .12 g 5215 3994 M -8 -6 V .12 g 5207 3988 M -19 -14 V .12 g 5188 3974 M -8 -6 V .12 g 5180 3968 M -21 -14 V .12 g 5159 3954 M -6 -4 V .12 g 5153 3950 M -26 -16 V .12 g 5127 3934 M -1 -1 V .12 g 5126 3933 M -28 -16 V .12 g 5098 3917 M -6 -3 V .12 g 5092 3914 M -21 -12 V .12 g 5071 3902 M -17 -9 V .12 g 5054 3893 M -10 -5 V .12 g 5044 3888 M -27 -12 V .12 g 5017 3876 M -6 -3 V .12 g 5011 3873 M -22 -10 V .12 g 4989 3863 M -23 -10 V .12 g 4966 3853 M -4 -1 V .12 g 4962 3852 M -27 -12 V .12 g 4935 3840 M -18 -7 V stroke 4917 3833 M .12 g 4917 3833 M -9 -4 V .12 g 4908 3829 M -28 -11 V .12 g 4880 3818 M -13 -5 V .12 g 4867 3813 M -14 -6 V .12 g 4853 3807 M -27 -11 V .12 g 4826 3796 M -9 -3 V .12 g 4817 3793 M -18 -8 V .12 g 4799 3785 M -28 -11 V .12 g 4771 3774 M -2 -2 V .12 g 4769 3772 M -25 -10 V .12 g 4744 3762 M -21 -10 V .12 g 4723 3752 M -6 -3 V .12 g 4717 3749 M -27 -12 V .12 g 4690 3737 M -10 -5 V .12 g 4680 3732 M -18 -9 V .12 g 4662 3723 M -22 -11 V .12 g 4640 3712 M -5 -3 V .12 g 4635 3709 M -27 -14 V .12 g 4608 3695 M -5 -3 V .12 g 4603 3692 M -22 -13 V .12 g 4581 3679 M -13 -7 V .12 g 4568 3672 M -15 -9 V .12 g 4553 3663 M -19 -11 V .12 g 4534 3652 M -8 -6 V .12 g 4526 3646 M -23 -15 V .12 g 4503 3631 M -4 -2 V .12 g 4499 3629 M -26 -18 V .12 g 4473 3611 M -1 0 V .12 g 4472 3611 M -28 -19 V .12 g 4444 3592 M 0 -1 V .12 g 4444 3591 M -27 -19 V 0 g .12 g 5037 1112 M .12 g 5037 1112 M -13 -20 V .12 g 5024 1092 M -7 -11 V .12 g 5017 1081 M -7 -9 V .12 g 5010 1072 M -14 -20 V .12 g 4996 1052 M -7 -10 V .12 g 4989 1042 M -7 -11 V .12 g 4982 1031 M -14 -20 V .12 g 4968 1011 M -6 -9 V .12 g 4962 1002 M -8 -11 V .12 g 4954 991 M -14 -20 V .12 g 4940 971 M -5 -7 V .12 g 4935 964 M -10 -13 V .12 g 4925 951 M -14 -20 V .12 g 4911 931 M -3 -5 V .12 g 4908 926 M -12 -16 V .12 g 4896 910 M -15 -20 V .12 g 4881 890 M -1 -1 V .12 g 4880 889 M -14 -19 V .12 g 4866 870 M -13 -17 V .12 g 4853 853 M -3 -3 V .12 g 4850 850 M -15 -20 V stroke 4835 830 M .12 g 4835 830 M -9 -11 V .12 g 4826 819 M -8 -9 V .12 g 4818 810 M -16 -20 V .12 g 4802 790 M -3 -5 V .12 g 4799 785 M -14 -16 V .12 g 4785 769 M -14 -16 V .12 g 4771 753 M -3 -4 V .12 g 4768 749 M -18 -20 V .12 g 4750 729 M -6 -7 V .12 g 4744 722 M -12 -13 V .12 g 4732 709 M -15 -16 V .12 g 4717 693 M -4 -4 V .12 g 4713 689 M -20 -20 V .12 g 4693 669 M -3 -4 V .12 g 4690 665 M -18 -17 V .12 g 4672 648 M -10 -9 V .12 g 4662 639 M -12 -11 V .12 g 4650 628 M -15 -13 V .12 g 4635 615 M -8 -7 V .12 g 4627 608 M -19 -16 V .12 g 4608 592 M -6 -4 V 0 g .12 g 6052 2326 M .12 g 6052 2326 M -4 -5 V .12 g 6048 2321 M -15 -20 V .12 g 6033 2301 M -8 -12 V .12 g 6025 2289 M -7 -8 V .12 g 6018 2281 M -15 -20 V .12 g 6003 2261 M -5 -7 V .12 g 5998 2254 M -11 -13 V .12 g 5987 2241 M -16 -20 V .12 g 5971 2221 M -1 -1 V .12 g 5970 2220 M -16 -20 V .12 g 5954 2200 M -11 -13 V .12 g 5943 2187 M -6 -7 V .12 g 5937 2180 M -17 -20 V .12 g 5920 2160 M -4 -5 V .12 g 5916 2155 M -14 -15 V .12 g 5902 2140 M -13 -15 V .12 g 5889 2125 M -5 -5 V .12 g 5884 2120 M -19 -20 V .12 g 5865 2100 M -4 -5 V .12 g 5861 2095 M -15 -16 V .12 g 5846 2079 M -12 -13 V .12 g 5834 2066 M -7 -7 V .12 g 5827 2059 M -20 -20 V .12 g 5807 2039 M 0 -1 V .12 g 5807 2038 M -20 -19 V .12 g 5787 2019 M -7 -8 V .12 g 5780 2011 M -13 -12 V .12 g 5767 1999 M -15 -15 V .12 g 5752 1984 M -6 -5 V .12 g 5746 1979 M -20 -20 V .12 g 5726 1959 M -1 -1 V stroke 5725 1958 M .12 g 5725 1958 M -20 -20 V .12 g 5705 1938 M -7 -7 V .12 g 5698 1931 M -14 -13 V .12 g 5684 1918 M -13 -13 V .12 g 5671 1905 M -8 -7 V .12 g 5663 1898 M -20 -19 V .12 g 5643 1879 M 0 -1 V .12 g 5643 1878 M -21 -20 V .12 g 5622 1858 M -6 -6 V .12 g 5616 1852 M -14 -14 V .12 g 5602 1838 M -13 -13 V .12 g 5589 1825 M -8 -8 V .12 g 5581 1817 M -19 -20 V .12 g .12 g 5562 1797 M -20 -20 V .12 g 5542 1777 M -8 -8 V .12 g 5534 1769 M -11 -12 V .12 g 5523 1757 M -16 -17 V .12 g 5507 1740 M -3 -3 V .12 g 5504 1737 M -19 -20 V .12 g 5485 1717 M -5 -7 V .12 g 5480 1710 M -13 -13 V .12 g 5467 1697 M -14 -17 V .12 g 5453 1680 M -4 -4 V .12 g 5449 1676 M -17 -20 V .12 g 5432 1656 M -7 -8 V .12 g 5425 1648 M -10 -12 V .12 g 5415 1636 M -17 -20 V .12 g .12 g 5398 1616 M -16 -20 V .12 g 5382 1596 M -11 -14 V .12 g 5371 1582 M -6 -6 V .12 g 5365 1576 M -15 -21 V .12 g 5350 1555 M -6 -7 V .12 g 5344 1548 M -10 -13 V .12 g 5334 1535 M -16 -20 V .12 g 5318 1515 M -2 -3 V .12 g 5316 1512 M -13 -17 V .12 g 5303 1495 M -14 -19 V .12 g 5289 1476 M -1 -1 V .12 g 5288 1475 M -15 -20 V .12 g 5273 1455 M -11 -16 V .12 g 5262 1439 M -3 -4 V .12 g 5259 1435 M -15 -21 V .12 g 5244 1414 M -9 -13 V .12 g 5235 1401 M -5 -7 V .12 g 5230 1394 M -14 -20 V .12 g 5216 1374 M -9 -12 V .12 g 5207 1362 M -5 -8 V .12 g 5202 1354 M -14 -20 V .12 g 5188 1334 M -8 -12 V .12 g 5180 1322 M -6 -8 V .12 g 5174 1314 M -14 -21 V .12 g 5160 1293 M -7 -10 V stroke 5153 1283 M .12 g 5153 1283 M -7 -10 V .12 g 5146 1273 M -13 -20 V .12 g 5133 1253 M -7 -11 V .12 g 5126 1242 M -7 -9 V .12 g 5119 1233 M -14 -20 V .12 g 5105 1213 M -7 -11 V .12 g 5098 1202 M -6 -9 V .12 g 5092 1193 M -14 -21 V .12 g 5078 1172 M -7 -10 V .12 g 5071 1162 M -6 -10 V .12 g 5065 1152 M -14 -20 V .12 g 5051 1132 M -7 -11 V .12 g 5044 1121 M -7 -9 V 0 g .1 g 912 3047 M .1 g 912 3047 M -9 20 V .1 g 903 3067 M -1 4 V .1 g 902 3071 M -7 16 V .1 g 895 3087 M -9 20 V .1 g 886 3107 M -9 21 V .1 g 877 3128 M -2 6 V .1 g 875 3134 M -6 14 V .1 g 869 3148 M -9 20 V .1 g 860 3168 M -8 20 V .1 g 852 3188 M -5 10 V .1 g 847 3198 M -4 10 V .1 g 843 3208 M -8 20 V .1 g 835 3228 M -9 20 V .1 g 826 3248 M -6 16 V .1 g 820 3264 M -2 5 V .1 g 818 3269 M -8 20 V .1 g 810 3289 M -8 20 V .1 g 802 3309 M -8 20 V .1 g 794 3329 M -1 2 V .1 g 793 3331 M -7 18 V .1 g 786 3349 M -8 20 V .1 g 778 3369 M -8 21 V .1 g 770 3390 M -5 10 V .1 g 765 3400 M -3 10 V .1 g 762 3410 M -8 20 V .1 g 754 3430 M -8 20 V .1 g 746 3450 M -8 19 V .1 g 738 3469 M 0 1 V .1 g 738 3470 M -8 20 V .1 g 730 3490 M -8 20 V .1 g 722 3510 M -7 21 V .1 g 715 3531 M -4 9 V .1 g 711 3540 M -4 11 V .1 g 707 3551 M -8 20 V .1 g 699 3571 M -7 20 V .1 g 692 3591 M -8 20 V .1 g 684 3611 M -8 20 V .1 g 676 3631 M -7 21 V .1 g 669 3652 M -8 20 V stroke 661 3672 M .1 g 661 3672 M -4 11 V .1 g 657 3683 M -4 9 V .1 g 653 3692 M -7 20 V .1 g 646 3712 M -8 20 V .1 g 638 3732 M -7 20 V .1 g 631 3752 M -2 4 V .1 g 629 3756 M -6 16 V .1 g 623 3772 M -7 21 V .1 g 616 3793 M -8 20 V .1 g 608 3813 M -6 16 V 0 g .1 g 1883 1785 M .1 g 1883 1785 M -13 12 V .1 g 1870 1797 M -14 16 V .1 g 1856 1813 M -5 4 V .1 g 1851 1817 M -21 21 V .1 g 1830 1838 M -2 1 V .1 g 1828 1839 M -19 19 V .1 g 1809 1858 M -8 7 V .1 g 1801 1865 M -13 13 V .1 g 1788 1878 M -14 13 V .1 g 1774 1891 M -8 7 V .1 g 1766 1898 M -19 17 V .1 g 1747 1915 M -4 3 V .1 g 1743 1918 M -23 20 V .1 g 1720 1938 M -1 1 V .1 g 1719 1939 M -22 20 V .1 g 1697 1959 M -5 4 V .1 g 1692 1963 M -19 16 V .1 g 1673 1979 M -8 7 V .1 g 1665 1986 M -15 13 V .1 g 1650 1999 M -12 11 V .1 g 1638 2010 M -11 9 V .1 g 1627 2019 M -17 14 V .1 g 1610 2033 M -7 6 V .1 g 1603 2039 M -20 18 V .1 g 1583 2057 M -3 2 V .1 g 1580 2059 M -23 20 V .1 g 1557 2079 M -1 2 V .1 g 1556 2081 M -21 19 V .1 g 1535 2100 M -6 6 V .1 g 1529 2106 M -15 14 V .1 g 1514 2120 M -13 11 V .1 g 1501 2131 M -8 9 V .1 g 1493 2140 M -19 18 V .1 g 1474 2158 M -2 2 V .1 g 1472 2160 M -20 20 V .1 g 1452 2180 M -5 5 V .1 g 1447 2185 M -15 15 V .1 g 1432 2200 M -12 14 V .1 g 1420 2214 M -6 7 V .1 g 1414 2221 M -19 20 V .1 g 1395 2241 M -3 3 V .1 g 1392 2244 M -15 17 V stroke 1377 2261 M .1 g 1377 2261 M -12 14 V .1 g 1365 2275 M -5 6 V .1 g 1360 2281 M -17 20 V .1 g 1343 2301 M -5 7 V .1 g 1338 2308 M -11 13 V .1 g 1327 2321 M -16 20 V .1 g 1311 2341 M 0 1 V .1 g 1311 2342 M -15 20 V .1 g 1296 2362 M -13 16 V .1 g 1283 2378 M -3 4 V .1 g 1280 2382 M -14 20 V .1 g 1266 2402 M -10 13 V .1 g 1256 2415 M -5 7 V .1 g 1251 2422 M -14 20 V .1 g 1237 2442 M -8 13 V .1 g 1229 2455 M -5 7 V .1 g 1224 2462 M -14 21 V .1 g 1210 2483 M -8 13 V .1 g 1202 2496 M -5 7 V .1 g 1197 2503 M -13 20 V .1 g 1184 2523 M -10 16 V .1 g 1174 2539 M -2 4 V .1 g 1172 2543 M -12 20 V .1 g 1160 2563 M -13 20 V .1 g 1147 2583 M 0 1 V .1 g 1147 2584 M -11 20 V .1 g 1136 2604 M -12 20 V .1 g 1124 2624 M -4 6 V .1 g 1120 2630 M -8 14 V .1 g 1112 2644 M -11 20 V .1 g 1101 2664 M -8 15 V .1 g 1093 2679 M -3 5 V .1 g 1090 2684 M -11 20 V .1 g 1079 2704 M -11 20 V .1 g 1068 2724 M -3 5 V .1 g 1065 2729 M -8 16 V .1 g 1057 2745 M -10 20 V .1 g 1047 2765 M -9 17 V .1 g 1038 2782 M -2 3 V .1 g 1036 2785 M -10 20 V .1 g 1026 2805 M -10 20 V .1 g 1016 2825 M -5 11 V .1 g 1011 2836 M -5 9 V .1 g 1006 2845 M -9 21 V .1 g 997 2866 M -10 20 V .1 g 987 2886 M -3 6 V .1 g 984 2892 M -7 14 V .1 g 977 2906 M -9 20 V .1 g 968 2926 M -10 20 V .1 g 958 2946 M -2 4 V .1 g 956 2950 M -7 16 V .1 g 949 2966 M -9 20 V stroke 940 2986 M .1 g 940 2986 M -10 21 V .1 g 930 3007 M -1 3 V .1 g 929 3010 M -8 17 V .1 g 921 3027 M -9 20 V 0 g .1 g 2927 588 M .1 g 2927 588 M -9 3 V .1 g 2918 591 M -27 10 V .1 g 2891 601 M -18 7 V .1 g 2873 608 M -9 4 V .1 g 2864 612 M -27 14 V .1 g 2837 626 M -5 2 V .1 g 2832 628 M -23 14 V .1 g 2809 642 M -11 6 V .1 g 2798 648 M -16 11 V .1 g 2782 659 M -14 10 V .1 g 2768 669 M -13 9 V .1 g 2755 678 M -14 11 V .1 g 2741 689 M -13 11 V .1 g 2728 700 M -12 9 V .1 g 2716 709 M -16 14 V .1 g 2700 723 M -7 6 V .1 g 2693 729 M -20 18 V .1 g 2673 747 M -2 2 V .1 g 2671 749 M -21 20 V .1 g 2650 769 M -4 5 V .1 g 2646 774 M -15 16 V .1 g 2631 790 M -12 12 V .1 g 2619 802 M -7 8 V .1 g 2612 810 M -19 20 V .1 g 2593 830 M -2 2 V .1 g 2591 832 M -15 18 V .1 g 2576 850 M -12 14 V .1 g 2564 864 M -5 6 V .1 g 2559 870 M -17 20 V .1 g 2542 890 M -5 7 V .1 g 2537 897 M -11 13 V .1 g 2526 910 M -16 21 V .1 g .1 g 2510 931 M -16 20 V .1 g 2494 951 M -12 15 V .1 g 2482 966 M -3 5 V .1 g 2479 971 M -15 20 V .1 g 2464 991 M -9 12 V .1 g 2455 1003 M -6 8 V .1 g 2449 1011 M -15 20 V .1 g 2434 1031 M -6 10 V .1 g 2428 1041 M -8 11 V .1 g 2420 1052 M -14 20 V .1 g 2406 1072 M -5 7 V .1 g 2401 1079 M -9 13 V .1 g 2392 1092 M -14 20 V .1 g 2378 1112 M -5 7 V .1 g 2373 1119 M -9 13 V .1 g 2364 1132 M -14 20 V stroke 2350 1152 M .1 g 2350 1152 M -4 7 V .1 g 2346 1159 M -9 13 V .1 g 2337 1172 M -14 21 V .1 g 2323 1193 M -4 6 V .1 g 2319 1199 M -10 14 V .1 g 2309 1213 M -13 20 V .1 g 2296 1233 M -4 7 V .1 g 2292 1240 M -10 13 V .1 g 2282 1253 M -13 20 V .1 g 2269 1273 M -5 7 V .1 g 2264 1280 M -8 13 V .1 g 2256 1293 M -14 21 V .1 g 2242 1314 M -5 7 V .1 g 2237 1321 M -8 13 V .1 g 2229 1334 M -14 20 V .1 g 2215 1354 M -5 8 V .1 g 2210 1362 M -9 12 V .1 g 2201 1374 M -13 20 V .1 g 2188 1394 M -5 8 V .1 g 2183 1402 M -9 12 V .1 g 2174 1414 M -14 21 V .1 g 2160 1435 M -5 7 V .1 g 2155 1442 M -9 13 V .1 g 2146 1455 M -14 20 V .1 g 2132 1475 M -4 6 V .1 g 2128 1481 M -10 14 V .1 g 2118 1495 M -15 20 V .1 g 2103 1515 M -2 4 V .1 g 2101 1519 M -12 16 V .1 g 2089 1535 M -15 20 V .1 g 2074 1555 M 0 1 V .1 g 2074 1556 M -15 20 V .1 g 2059 1576 M -13 16 V .1 g 2046 1592 M -3 4 V .1 g 2043 1596 M -15 20 V .1 g 2028 1616 M -9 11 V .1 g 2019 1627 M -7 9 V .1 g 2012 1636 M -16 20 V .1 g 1996 1656 M -4 5 V .1 g 1992 1661 M -13 15 V .1 g 1979 1676 M -14 18 V .1 g 1965 1694 M -3 3 V .1 g 1962 1697 M -17 20 V .1 g 1945 1717 M -8 8 V .1 g 1937 1725 M -10 12 V .1 g 1927 1737 M -17 19 V .1 g 1910 1756 M -1 1 V .1 g 1909 1757 M -19 20 V .1 g 1890 1777 M -7 8 V 0 g .1 g 1761 4216 M .1 g 1761 4216 M -11 20 V .1 g 1750 4236 M -3 6 V .1 g 1747 4242 M -9 14 V stroke 1738 4256 M .1 g 1738 4256 M -11 20 V .1 g 1727 4276 M -8 15 V .1 g 1719 4291 M -3 6 V .1 g 1716 4297 M -11 20 V .1 g 1705 4317 M -11 20 V .1 g 1694 4337 M -2 4 V .1 g 1692 4341 M -8 16 V .1 g 1684 4357 M -11 20 V .1 g 1673 4377 M -8 16 V .1 g 1665 4393 M -3 4 V .1 g 1662 4397 M -10 20 V .1 g 1652 4417 M -10 21 V .1 g 1642 4438 M -4 7 V .1 g 1638 4445 M -7 13 V .1 g 1631 4458 M -10 20 V .1 g 1621 4478 M -10 20 V .1 g 1611 4498 M -1 1 V .1 g 1610 4499 M -9 19 V .1 g 1601 4518 M -10 20 V .1 g 1591 4538 M -8 16 V .1 g 1583 4554 M -2 5 V .1 g 1581 4559 M -10 20 V .1 g 1571 4579 M -10 20 V .1 g 1561 4599 M -5 10 V .1 g 1556 4609 M -5 10 V 0 g .1 g 3128 3248 M .1 g 3128 3248 M -19 17 V .1 g 3109 3265 M -5 4 V .1 g 3104 3269 M -22 18 V .1 g 3082 3287 M -2 2 V .1 g 3080 3289 M -25 20 V .1 g 3055 3309 M 0 1 V .1 g 3055 3310 M -25 19 V .1 g 3030 3329 M -3 2 V .1 g 3027 3331 M -23 18 V .1 g 3004 3349 M -4 4 V .1 g 3000 3353 M -22 16 V .1 g 2978 3369 M -5 4 V .1 g 2973 3373 M -23 17 V .1 g 2950 3390 M -4 3 V .1 g 2946 3393 M -24 17 V .1 g 2922 3410 M -4 2 V .1 g 2918 3412 M -26 18 V .1 g 2892 3430 M -1 0 V .1 g 2891 3430 M -27 18 V .1 g 2864 3448 M -4 2 V .1 g 2860 3450 M -23 14 V .1 g 2837 3464 M -10 6 V .1 g 2827 3470 M -18 10 V .1 g 2809 3480 M -18 10 V .1 g 2791 3490 M -9 5 V .1 g 2782 3495 M -27 14 V .1 g 2755 3509 M -3 1 V stroke 2752 3510 M .1 g 2752 3510 M -24 13 V .1 g 2728 3523 M -18 8 V .1 g 2710 3531 M -10 4 V .1 g 2700 3535 M -27 12 V .1 g 2673 3547 M -10 4 V .1 g 2663 3551 M -17 7 V .1 g 2646 3558 M -27 10 V .1 g 2619 3568 M -8 3 V .1 g 2611 3571 M -20 7 V .1 g 2591 3578 M -27 9 V .1 g 2564 3587 M -12 4 V .1 g 2552 3591 M -15 5 V .1 g 2537 3596 M -27 8 V .1 g 2510 3604 M -23 7 V .1 g 2487 3611 M -5 2 V .1 g 2482 3613 M -27 8 V .1 g 2455 3621 M -27 8 V .1 g 2428 3629 M -7 2 V .1 g 2421 3631 M -20 7 V .1 g 2401 3638 M -28 8 V .1 g 2373 3646 M -16 6 V .1 g 2357 3652 M -11 3 V .1 g 2346 3655 M -27 10 V .1 g 2319 3665 M -17 7 V .1 g 2302 3672 M -10 4 V .1 g 2292 3676 M -28 11 V .1 g 2264 3687 M -10 5 V .1 g 2254 3692 M -17 7 V .1 g 2237 3699 M -25 13 V .1 g 2212 3712 M -2 1 V .1 g 2210 3713 M -27 15 V .1 g 2183 3728 M -7 4 V .1 g 2176 3732 M -21 13 V .1 g 2155 3745 M -11 7 V .1 g 2144 3752 M -16 11 V .1 g 2128 3763 M -12 9 V .1 g 2116 3772 M -15 12 V .1 g 2101 3784 M -11 9 V .1 g 2090 3793 M -16 13 V .1 g 2074 3806 M -8 7 V .1 g 2066 3813 M -20 17 V .1 g 2046 3830 M -3 3 V .1 g 2043 3833 M -20 20 V .1 g 2023 3853 M -4 4 V .1 g 2019 3857 M -16 16 V .1 g 2003 3873 M -11 12 V .1 g 1992 3885 M -7 8 V .1 g 1985 3893 M -18 21 V .1 g 1967 3914 M -2 2 V .1 g 1965 3916 M -15 18 V .1 g 1950 3934 M -13 15 V .1 g 1937 3949 M -3 5 V stroke 1934 3954 M .1 g 1934 3954 M -16 20 V .1 g 1918 3974 M -8 11 V .1 g 1910 3985 M -7 9 V .1 g 1903 3994 M -14 20 V .1 g 1889 4014 M -6 9 V .1 g 1883 4023 M -8 12 V .1 g 1875 4035 M -14 20 V .1 g 1861 4055 M -5 7 V .1 g 1856 4062 M -9 13 V .1 g 1847 4075 M -13 20 V .1 g 1834 4095 M -6 9 V .1 g 1828 4104 M -6 11 V .1 g 1822 4115 M -13 20 V .1 g 1809 4135 M -8 13 V .1 g 1801 4148 M -4 7 V .1 g 1797 4155 M -12 21 V .1 g 1785 4176 M -11 18 V .1 g 1774 4194 M -1 2 V .1 g 1773 4196 M -12 20 V 0 g .1 g 4560 3531 M .1 g 4560 3531 M -7 -4 V .1 g 4553 3527 M -26 -17 V .1 g 4527 3510 M -1 0 V .1 g 4526 3510 M -27 -18 V .1 g 4499 3492 M -3 -2 V .1 g 4496 3490 M -24 -16 V .1 g 4472 3474 M -5 -4 V .1 g 4467 3470 M -23 -16 V .1 g 4444 3454 M -6 -4 V .1 g 4438 3450 M -21 -16 V .1 g 4417 3434 M -6 -4 V .1 g 4411 3430 M -21 -17 V .1 g 4390 3413 M -5 -3 V .1 g 4385 3410 M -22 -18 V .1 g 4363 3392 M -3 -2 V .1 g 4360 3390 M -25 -20 V .1 g 4335 3370 M 0 -1 V .1 g 4335 3369 M -24 -20 V .1 g 4311 3349 M -3 -2 V .1 g 4308 3347 M -21 -18 V .1 g 4287 3329 M -6 -6 V .1 g 4281 3323 M -17 -14 V .1 g 4264 3309 M -10 -9 V .1 g 4254 3300 M -13 -11 V .1 g 4241 3289 M -15 -14 V .1 g 4226 3275 M -7 -6 V .1 g 4219 3269 M -20 -18 V .1 g 4199 3251 M -3 -3 V .1 g 4196 3248 M -22 -20 V .1 g 4174 3228 M -2 -2 V .1 g 4172 3226 M -21 -18 V .1 g 4151 3208 M -6 -6 V .1 g 4145 3202 M -16 -14 V stroke 4129 3188 M .1 g 4129 3188 M -12 -10 V .1 g 4117 3178 M -11 -10 V .1 g 4106 3168 M -16 -15 V .1 g 4090 3153 M -7 -5 V .1 g 4083 3148 M -20 -18 V .1 g 4063 3130 M -3 -2 V .1 g 4060 3128 M -24 -21 V .1 g .1 g 4036 3107 M -24 -20 V .1 g 4012 3087 M -4 -3 V .1 g 4008 3084 M -22 -17 V .1 g 3986 3067 M -5 -4 V .1 g 3981 3063 M -21 -16 V .1 g 3960 3047 M -6 -5 V .1 g 3954 3042 M -22 -15 V .1 g 3932 3027 M -5 -4 V .1 g 3927 3023 M -26 -16 V .1 g 3901 3007 M -2 -2 V .1 g 3899 3005 M -27 -16 V .1 g 3872 2989 M -5 -3 V .1 g 3867 2986 M -22 -12 V .1 g 3845 2974 M -18 -8 V .1 g 3827 2966 M -9 -4 V .1 g 3818 2962 M -28 -11 V .1 g 3790 2951 M -14 -5 V .1 g 3776 2946 M -13 -4 V .1 g 3763 2942 M -27 -7 V .1 g 3736 2935 M -27 -4 V .1 g 3709 2931 M -28 -2 V .1 g 3681 2929 M -27 0 V .1 g 3654 2929 M -27 2 V .1 g 3627 2931 M -27 5 V .1 g 3600 2936 M -28 7 V .1 g 3572 2943 M -10 3 V .1 g 3562 2946 M -17 6 V .1 g 3545 2952 M -27 10 V .1 g 3518 2962 M -8 4 V .1 g 3510 2966 M -19 9 V .1 g 3491 2975 M -22 11 V .1 g 3469 2986 M -6 4 V .1 g 3463 2990 M -27 16 V .1 g 3436 3006 M -1 1 V .1 g 3435 3007 M -26 16 V .1 g 3409 3023 M -5 4 V .1 g 3404 3027 M -22 15 V .1 g 3382 3042 M -7 5 V .1 g 3375 3047 M -21 15 V .1 g 3354 3062 M -7 5 V .1 g 3347 3067 M -20 16 V .1 g 3327 3083 M -6 4 V .1 g 3321 3087 M -21 17 V .1 g 3300 3104 M -4 3 V .1 g 3296 3107 M -23 19 V stroke 3273 3126 M .1 g 3273 3126 M -2 2 V .1 g 3271 3128 M -24 20 V .1 g 3247 3148 M -2 1 V .1 g 3245 3149 M -22 19 V .1 g 3223 3168 M -5 4 V .1 g 3218 3172 M -19 16 V .1 g 3199 3188 M -8 7 V .1 g 3191 3195 M -15 13 V .1 g 3176 3208 M -12 11 V .1 g 3164 3219 M -12 9 V .1 g 3152 3228 M -16 14 V .1 g 3136 3242 M -8 6 V 0 g .1 g 5754 4619 M .1 g 5754 4619 M -2 -4 V .1 g 5752 4615 M -8 -16 V .1 g 5744 4599 M -10 -20 V .1 g 5734 4579 M -9 -19 V .1 g 5725 4560 M -1 -1 V .1 g 5724 4559 M -10 -21 V .1 g 5714 4538 M -10 -20 V .1 g 5704 4518 M -6 -13 V .1 g 5698 4505 M -4 -7 V .1 g 5694 4498 M -10 -20 V .1 g 5684 4478 M -11 -20 V .1 g 5673 4458 M -2 -6 V .1 g 5671 4452 M -8 -14 V .1 g 5663 4438 M -11 -21 V .1 g 5652 4417 M -9 -17 V .1 g 5643 4400 M -1 -3 V .1 g 5642 4397 M -11 -20 V .1 g 5631 4377 M -11 -20 V .1 g 5620 4357 M -4 -8 V .1 g 5616 4349 M -7 -12 V .1 g 5609 4337 M -11 -20 V .1 g 5598 4317 M -9 -17 V .1 g 5589 4300 M -2 -3 V .1 g 5587 4297 M -12 -21 V .1 g 5575 4276 M -11 -20 V .1 g 5564 4256 M -2 -4 V .1 g 5562 4252 M -10 -16 V .1 g 5552 4236 M -12 -20 V .1 g 5540 4216 M -6 -10 V .1 g 5534 4206 M -6 -10 V .1 g 5528 4196 M -13 -20 V .1 g 5515 4176 M -8 -13 V .1 g 5507 4163 M -5 -8 V .1 g 5502 4155 M -13 -20 V .1 g 5489 4135 M -9 -14 V .1 g 5480 4121 M -4 -6 V .1 g 5476 4115 M -14 -20 V .1 g 5462 4095 M -9 -14 V .1 g 5453 4081 M -5 -6 V .1 g 5448 4075 M -15 -20 V stroke 5433 4055 M .1 g 5433 4055 M -8 -12 V .1 g 5425 4043 M -7 -8 V .1 g 5418 4035 M -15 -21 V .1 g 5403 4014 M -5 -6 V .1 g 5398 4008 M -11 -14 V .1 g 5387 3994 M -16 -19 V .1 g 5371 3975 M -1 -1 V .1 g 5370 3974 M -18 -20 V .1 g 5352 3954 M -8 -10 V .1 g 5344 3944 M -11 -10 V .1 g 5333 3934 M -17 -18 V .1 g 5316 3916 M -2 -2 V .1 g 5314 3914 M -21 -21 V .1 g 5293 3893 M -4 -3 V .1 g 5289 3890 M -18 -17 V .1 g 5271 3873 M -9 -7 V .1 g 5262 3866 M -15 -13 V .1 g 5247 3853 M -12 -10 V .1 g 5235 3843 M -14 -10 V .1 g 5221 3833 M -14 -10 V .1 g 5207 3823 M -15 -10 V .1 g 5192 3813 M -12 -8 V .1 g 5180 3805 M -19 -12 V .1 g 5161 3793 M -8 -5 V .1 g 5153 3788 M -27 -16 V .1 g .1 g 5126 3772 M -28 -14 V .1 g 5098 3758 M -12 -6 V .1 g 5086 3752 M -15 -7 V .1 g 5071 3745 M -27 -12 V .1 g 5044 3733 M -2 -1 V .1 g 5042 3732 M -25 -10 V .1 g 5017 3722 M -25 -10 V .1 g 4992 3712 M -3 -1 V .1 g 4989 3711 M -27 -10 V .1 g 4962 3701 M -26 -9 V .1 g 4936 3692 M -1 -1 V .1 g 4935 3691 M -27 -9 V .1 g 4908 3682 M -28 -10 V .1 g 4880 3672 M -1 0 V .1 g 4879 3672 M -26 -9 V .1 g 4853 3663 M -27 -10 V .1 g 4826 3653 M -4 -1 V .1 g 4822 3652 M -23 -9 V .1 g 4799 3643 M -28 -10 V .1 g 4771 3633 M -3 -2 V .1 g 4768 3631 M -24 -9 V .1 g 4744 3622 M -25 -11 V .1 g 4719 3611 M -2 -1 V .1 g 4717 3610 M -27 -12 V .1 g 4690 3598 M -16 -7 V .1 g 4674 3591 M -12 -6 V .1 g 4662 3585 M -27 -13 V stroke 4635 3572 M .1 g 4635 3572 M -2 -1 V .1 g 4633 3571 M -25 -13 V .1 g 4608 3558 M -13 -7 V .1 g 4595 3551 M -14 -8 V .1 g 4581 3543 M -21 -12 V 0 g .1 g 3436 659 M .1 g 3436 659 M -27 -10 V .1 g 3409 649 M -3 -1 V .1 g 3406 648 M -24 -8 V .1 g 3382 640 M -28 -9 V .1 g 3354 631 M -7 -3 V .1 g 3347 628 M -20 -6 V .1 g 3327 622 M -27 -9 V .1 g 3300 613 M -14 -5 V .1 g 3286 608 M -13 -4 V .1 g 3273 604 M -28 -8 V .1 g 3245 596 M -27 -7 V .1 g 3218 589 M -3 -1 V 0 g .1 g 5028 1253 M .1 g 5028 1253 M -11 -18 V .1 g 5017 1235 M -2 -2 V .1 g 5015 1233 M -13 -20 V .1 g 5002 1213 M -13 -19 V .1 g 4989 1194 M -1 -1 V .1 g 4988 1193 M -13 -21 V .1 g 4975 1172 M -13 -19 V .1 g 4962 1153 M 0 -1 V .1 g 4962 1152 M -14 -20 V .1 g 4948 1132 M -13 -19 V .1 g 4935 1113 M -1 -1 V .1 g 4934 1112 M -14 -20 V .1 g 4920 1092 M -12 -18 V .1 g 4908 1074 M -2 -2 V .1 g 4906 1072 M -14 -20 V .1 g 4892 1052 M -12 -17 V .1 g 4880 1035 M -3 -4 V .1 g 4877 1031 M -14 -20 V .1 g 4863 1011 M -10 -13 V .1 g 4853 998 M -5 -7 V .1 g 4848 991 M -15 -20 V .1 g 4833 971 M -7 -9 V .1 g 4826 962 M -9 -11 V .1 g 4817 951 M -16 -20 V .1 g 4801 931 M -2 -4 V .1 g 4799 927 M -14 -17 V .1 g 4785 910 M -14 -16 V .1 g 4771 894 M -3 -4 V .1 g 4768 890 M -17 -20 V .1 g 4751 870 M -7 -8 V .1 g 4744 862 M -11 -12 V .1 g 4733 850 M -16 -18 V .1 g 4717 832 M -3 -2 V .1 g 4714 830 M -19 -20 V stroke 4695 810 M .1 g 4695 810 M -5 -6 V .1 g 4690 804 M -15 -14 V .1 g 4675 790 M -13 -13 V .1 g 4662 777 M -8 -8 V .1 g 4654 769 M -19 -17 V .1 g 4635 752 M -3 -3 V .1 g 4632 749 M -24 -20 V .1 g .1 g 4608 729 M -26 -20 V .1 g 4582 709 M -1 -1 V .1 g 4581 708 M -27 -19 V .1 g 4554 689 M -1 -1 V .1 g 4553 688 M -27 -17 V .1 g 4526 671 M -4 -2 V .1 g 4522 669 M -23 -14 V .1 g 4499 655 M -14 -7 V .1 g 4485 648 M -13 -6 V .1 g 4472 642 M -28 -12 V .1 g 4444 630 M -4 -2 V .1 g 4440 628 M -23 -8 V .1 g 4417 620 M -27 -8 V .1 g 4390 612 M -15 -4 V .1 g 4375 608 M -12 -3 V .1 g 4363 605 M -28 -4 V .1 g 4335 601 M -27 -4 V .1 g 4308 597 M -27 -1 V .1 g 4281 596 M -27 0 V .1 g 4254 596 M -28 1 V .1 g 4226 597 M -27 3 V .1 g 4199 600 M -27 4 V .1 g 4172 604 M -26 4 V .1 g 4146 608 M -1 0 V .1 g 4145 608 M -28 6 V .1 g 4117 614 M -27 7 V .1 g 4090 621 M -27 7 V .1 g 4063 628 M -2 0 V .1 g 4061 628 M -25 7 V .1 g 4036 635 M -28 8 V .1 g 4008 643 M -17 5 V .1 g 3991 648 M -10 3 V .1 g 3981 651 M -27 8 V .1 g 3954 659 M -27 8 V .1 g 3927 667 M -5 2 V .1 g 3922 669 M -23 6 V .1 g 3899 675 M -27 7 V .1 g 3872 682 M -27 6 V .1 g 3845 688 M -3 1 V .1 g 3842 689 M -24 5 V .1 g 3818 694 M -28 5 V .1 g 3790 699 M -27 3 V .1 g 3763 702 M -27 3 V .1 g 3736 705 M -27 1 V .1 g 3709 706 M -28 0 V stroke 3681 706 M .1 g 3681 706 M -27 -1 V .1 g 3654 705 M -27 -2 V .1 g 3627 703 M -27 -3 V .1 g 3600 700 M -28 -5 V .1 g 3572 695 M -27 -6 V .1 g 3545 689 M -2 0 V .1 g 3543 689 M -25 -6 V .1 g 3518 683 M -27 -8 V .1 g 3491 675 M -23 -6 V .1 g 3468 669 M -5 -2 V .1 g 3463 667 M -27 -8 V 0 g .1 g 6052 2466 M .1 g 6052 2466 M -3 -4 V .1 g 6049 2462 M -15 -20 V .1 g 6034 2442 M -9 -12 V .1 g 6025 2430 M -6 -8 V .1 g 6019 2422 M -16 -20 V .1 g 6003 2402 M -5 -7 V .1 g 5998 2395 M -12 -13 V .1 g 5986 2382 M -16 -20 V .1 g .1 g 5970 2362 M -18 -21 V .1 g 5952 2341 M -9 -10 V .1 g 5943 2331 M -8 -10 V .1 g 5935 2321 M -18 -20 V .1 g 5917 2301 M -1 -1 V .1 g 5916 2300 M -18 -19 V .1 g 5898 2281 M -9 -10 V .1 g 5889 2271 M -11 -10 V .1 g 5878 2261 M -17 -18 V .1 g 5861 2243 M -2 -2 V .1 g 5859 2241 M -20 -20 V .1 g 5839 2221 M -5 -5 V .1 g 5834 2216 M -16 -16 V .1 g 5818 2200 M -11 -10 V .1 g 5807 2190 M -10 -10 V .1 g 5797 2180 M -17 -16 V .1 g 5780 2164 M -5 -4 V .1 g 5775 2160 M -21 -20 V .1 g 5754 2140 M -2 -1 V .1 g 5752 2139 M -21 -19 V .1 g 5731 2120 M -6 -6 V .1 g 5725 2114 M -16 -14 V .1 g 5709 2100 M -11 -11 V .1 g 5698 2089 M -11 -10 V .1 g 5687 2079 M -16 -15 V .1 g 5671 2064 M -6 -5 V .1 g 5665 2059 M -22 -19 V .1 g 5643 2040 M 0 -1 V .1 g 5643 2039 M -22 -20 V .1 g 5621 2019 M -5 -4 V .1 g 5616 2015 M -17 -16 V .1 g 5599 1999 M -10 -10 V .1 g 5589 1989 M -11 -10 V stroke 5578 1979 M .1 g 5578 1979 M -16 -16 V .1 g 5562 1963 M -5 -4 V .1 g 5557 1959 M -20 -21 V .1 g 5537 1938 M -3 -2 V .1 g 5534 1936 M -17 -18 V .1 g 5517 1918 M -10 -10 V .1 g 5507 1908 M -9 -10 V .1 g 5498 1898 M -18 -19 V .1 g 5480 1879 M -1 -1 V .1 g 5479 1878 M -19 -20 V .1 g 5460 1858 M -7 -9 V .1 g 5453 1849 M -11 -11 V .1 g 5442 1838 M -17 -20 V .1 g 5425 1818 M 0 -1 V .1 g 5425 1817 M -17 -20 V .1 g 5408 1797 M -10 -11 V .1 g 5398 1786 M -7 -9 V .1 g 5391 1777 M -16 -20 V .1 g 5375 1757 M -4 -5 V .1 g 5371 1752 M -12 -15 V .1 g 5359 1737 M -15 -20 V .1 g 5344 1717 M -1 0 V .1 g 5343 1717 M -15 -20 V .1 g 5328 1697 M -12 -16 V .1 g 5316 1681 M -3 -5 V .1 g 5313 1676 M -15 -20 V .1 g 5298 1656 M -9 -12 V .1 g 5289 1644 M -6 -8 V .1 g 5283 1636 M -14 -20 V .1 g 5269 1616 M -7 -10 V .1 g 5262 1606 M -7 -10 V .1 g 5255 1596 M -14 -20 V .1 g 5241 1576 M -6 -9 V .1 g 5235 1567 M -8 -12 V .1 g 5227 1555 M -14 -20 V .1 g 5213 1535 M -6 -8 V .1 g 5207 1527 M -8 -12 V .1 g 5199 1515 M -13 -20 V .1 g 5186 1495 M -6 -9 V .1 g 5180 1486 M -7 -11 V .1 g 5173 1475 M -14 -20 V .1 g 5159 1455 M -6 -10 V .1 g 5153 1445 M -7 -10 V .1 g 5146 1435 M -13 -21 V .1 g 5133 1414 M -7 -11 V .1 g 5126 1403 M -6 -9 V .1 g 5120 1394 M -13 -20 V .1 g 5107 1374 M -9 -13 V .1 g 5098 1361 M -4 -7 V .1 g 5094 1354 M -13 -20 V .1 g 5081 1334 M -10 -15 V .1 g 5071 1319 M -4 -5 V stroke 5067 1314 M .1 g 5067 1314 M -13 -21 V .1 g 5054 1293 M -10 -16 V .1 g 5044 1277 M -3 -4 V .1 g 5041 1273 M -13 -20 V 0 g .08 g 1863 3853 M .08 g 1863 3853 M -7 12 V .08 g 1856 3865 M -6 8 V .08 g 1850 3873 M -13 20 V .08 g 1837 3893 M -9 15 V .08 g 1828 3908 M -3 6 V .08 g 1825 3914 M -12 20 V .08 g 1813 3934 M -12 20 V .08 g 1801 3954 M -12 20 V .08 g 1789 3974 M -11 20 V .08 g 1778 3994 M -4 8 V .08 g 1774 4002 M -7 12 V .08 g 1767 4014 M -11 21 V .08 g 1756 4035 M -9 16 V .08 g 1747 4051 M -2 4 V .08 g 1745 4055 M -11 20 V .08 g 1734 4075 M -11 20 V .08 g 1723 4095 M -4 8 V .08 g 1719 4103 M -6 12 V .08 g 1713 4115 M -10 20 V .08 g 1703 4135 M -11 20 V .08 g 1692 4155 M 0 1 V .08 g 1692 4156 M -10 20 V .08 g 1682 4176 M -10 20 V .08 g 1672 4196 M -7 14 V .08 g 1665 4210 M -3 6 V .08 g 1662 4216 M -10 20 V .08 g 1652 4236 M -10 20 V .08 g 1642 4256 M -4 9 V .08 g 1638 4265 M -6 11 V .08 g 1632 4276 M -10 21 V .08 g 1622 4297 M -9 20 V .08 g 1613 4317 M -3 5 V .08 g 1610 4322 M -7 15 V .08 g 1603 4337 M -10 20 V .08 g 1593 4357 M -9 20 V .08 g 1584 4377 M -1 2 V .08 g 1583 4379 M -9 18 V .08 g 1574 4397 M -9 20 V .08 g 1565 4417 M -9 19 V .08 g 1556 4436 M -1 2 V .08 g 1555 4438 M -9 20 V .08 g 1546 4458 M -10 20 V .08 g 1536 4478 M -7 16 V .08 g 1529 4494 M -2 4 V .08 g 1527 4498 M -10 20 V .08 g 1517 4518 M -9 20 V .08 g 1508 4538 M -7 14 V .08 g 1501 4552 M -3 7 V stroke 1498 4559 M .08 g 1498 4559 M -9 20 V .08 g 1489 4579 M -10 20 V .08 g 1479 4599 M -5 11 V .08 g 1474 4610 M -4 9 V 0 g .08 g 3303 2926 M .08 g 3303 2926 M -3 3 V .08 g 3300 2929 M -19 17 V .08 g 3281 2946 M -8 8 V .08 g 3273 2954 M -14 12 V .08 g 3259 2966 M -14 13 V .08 g 3245 2979 M -8 7 V .08 g 3237 2986 M -19 18 V .08 g 3218 3004 M -3 3 V .08 g 3215 3007 M -21 20 V .08 g 3194 3027 M -3 2 V .08 g 3191 3029 M -19 18 V .08 g 3172 3047 M -8 8 V .08 g 3164 3055 M -14 12 V .08 g 3150 3067 M -14 13 V .08 g 3136 3080 M -8 7 V .08 g 3128 3087 M -19 17 V .08 g 3109 3104 M -3 3 V .08 g 3106 3107 M -23 21 V .08 g 3083 3128 M -1 1 V .08 g 3082 3129 M -22 19 V .08 g 3060 3148 M -5 4 V .08 g 3055 3152 M -19 16 V .08 g 3036 3168 M -9 7 V .08 g 3027 3175 M -15 13 V .08 g 3012 3188 M -12 10 V .08 g 3000 3198 M -13 10 V .08 g 2987 3208 M -14 11 V .08 g 2973 3219 M -12 9 V .08 g 2961 3228 M -15 12 V .08 g 2946 3240 M -12 8 V .08 g 2934 3248 M -16 12 V .08 g 2918 3260 M -12 9 V .08 g 2906 3269 M -15 10 V .08 g 2891 3279 M -16 10 V .08 g 2875 3289 M -11 7 V .08 g 2864 3296 M -20 13 V .08 g 2844 3309 M -7 4 V .08 g 2837 3313 M -28 16 V .08 g 2809 3329 M -27 15 V .08 g 2782 3344 M -11 5 V .08 g 2771 3349 M -16 9 V .08 g 2755 3358 M -25 11 V .08 g 2730 3369 M -2 1 V .08 g 2728 3370 M -28 12 V .08 g 2700 3382 M -18 8 V .08 g 2682 3390 M -9 3 V .08 g 2673 3393 M -27 10 V .08 g 2646 3403 M -19 7 V stroke 2627 3410 M .08 g 2627 3410 M -8 2 V .08 g 2619 3412 M -28 9 V .08 g 2591 3421 M -27 8 V .08 g 2564 3429 M -4 1 V .08 g 2560 3430 M -23 6 V .08 g 2537 3436 M -27 7 V .08 g 2510 3443 M -28 6 V .08 g 2482 3449 M -3 1 V .08 g 2479 3450 M -24 5 V .08 g 2455 3455 M -27 6 V .08 g 2428 3461 M -27 7 V .08 g 2401 3468 M -12 2 V .08 g 2389 3470 M -16 4 V .08 g 2373 3474 M -27 6 V .08 g 2346 3480 M -27 8 V .08 g 2319 3488 M -10 2 V .08 g 2309 3490 M -17 6 V .08 g 2292 3496 M -28 8 V .08 g 2264 3504 M -17 6 V .08 g 2247 3510 M -10 4 V .08 g 2237 3514 M -27 11 V .08 g 2210 3525 M -11 6 V .08 g 2199 3531 M -16 7 V .08 g 2183 3538 M -24 13 V .08 g 2159 3551 M -4 2 V .08 g 2155 3553 M -27 16 V .08 g 2128 3569 M -3 2 V .08 g 2125 3571 M -24 16 V .08 g 2101 3587 M -5 4 V .08 g 2096 3591 M -22 17 V .08 g 2074 3608 M -4 3 V .08 g 2070 3611 M -24 20 V .08 g .08 g 2046 3631 M -22 21 V .08 g 2024 3652 M -5 4 V .08 g 2019 3656 M -15 16 V .08 g 2004 3672 M -12 13 V .08 g 1992 3685 M -7 7 V .08 g 1985 3692 M -18 20 V .08 g 1967 3712 M -2 3 V .08 g 1965 3715 M -14 17 V .08 g 1951 3732 M -14 17 V .08 g 1937 3749 M -3 3 V .08 g 1934 3752 M -15 20 V .08 g 1919 3772 M -9 13 V .08 g 1910 3785 M -6 8 V .08 g 1904 3793 M -14 20 V .08 g 1890 3813 M -7 10 V .08 g 1883 3823 M -7 10 V .08 g 1876 3833 M -13 20 V 0 g .08 g 4744 3466 M .08 g 4744 3466 M -27 -11 V .08 g 4717 3455 M -13 -5 V .08 g 4704 3450 M -14 -6 V stroke 4690 3444 M .08 g 4690 3444 M -28 -12 V .08 g 4662 3432 M -5 -2 V .08 g 4657 3430 M -22 -10 V .08 g 4635 3420 M -20 -10 V .08 g 4615 3410 M -7 -4 V .08 g 4608 3406 M -27 -15 V .08 g 4581 3391 M -3 -1 V .08 g 4578 3390 M -25 -15 V .08 g 4553 3375 M -10 -6 V .08 g 4543 3369 M -17 -10 V .08 g 4526 3359 M -14 -10 V .08 g 4512 3349 M -13 -8 V .08 g 4499 3341 M -17 -12 V .08 g 4482 3329 M -10 -7 V .08 g 4472 3322 M -19 -13 V .08 g 4453 3309 M -9 -7 V .08 g 4444 3302 M -18 -13 V .08 g 4426 3289 M -9 -7 V .08 g 4417 3282 M -16 -13 V .08 g 4401 3269 M -11 -9 V .08 g 4390 3260 M -14 -12 V .08 g 4376 3248 M -13 -11 V .08 g 4363 3237 M -11 -9 V .08 g 4352 3228 M -17 -14 V .08 g 4335 3214 M -7 -6 V .08 g 4328 3208 M -20 -18 V .08 g 4308 3190 M -2 -2 V .08 g 4306 3188 M -22 -20 V .08 g 4284 3168 M -3 -3 V .08 g 4281 3165 M -19 -17 V .08 g 4262 3148 M -8 -8 V .08 g 4254 3140 M -13 -12 V .08 g 4241 3128 M -15 -14 V .08 g 4226 3114 M -7 -7 V .08 g 4219 3107 M -20 -19 V .08 g 4199 3088 M -1 -1 V .08 g 4198 3087 M -20 -20 V .08 g 4178 3067 M -6 -6 V .08 g 4172 3061 M -15 -14 V .08 g 4157 3047 M -12 -12 V .08 g 4145 3035 M -9 -8 V .08 g 4136 3027 M -19 -19 V .08 g 4117 3008 M -1 -1 V .08 g 4116 3007 M -21 -21 V .08 g 4095 2986 M -5 -5 V .08 g 4090 2981 M -16 -15 V .08 g 4074 2966 M -11 -11 V .08 g 4063 2955 M -10 -9 V .08 g 4053 2946 M -17 -16 V .08 g 4036 2930 M -5 -4 V .08 g 4031 2926 M -22 -20 V .08 g 4009 2906 M -1 -1 V stroke 4008 2905 M .08 g 4008 2905 M -21 -19 V .08 g 3987 2886 M -6 -5 V .08 g 3981 2881 M -18 -15 V .08 g 3963 2866 M -9 -8 V .08 g 3954 2858 M -16 -13 V .08 g 3938 2845 M -11 -9 V .08 g 3927 2836 M -15 -11 V .08 g 3912 2825 M -13 -9 V .08 g 3899 2816 M -15 -11 V .08 g 3884 2805 M -12 -8 V .08 g 3872 2797 M -20 -12 V .08 g 3852 2785 M -7 -5 V .08 g 3845 2780 M -27 -14 V .08 g 3818 2766 M -2 -1 V .08 g 3816 2765 M -26 -12 V .08 g 3790 2753 M -23 -8 V .08 g 3767 2745 M -4 -2 V .08 g 3763 2743 M -27 -8 V .08 g 3736 2735 M -27 -5 V .08 g 3709 2730 M -28 -2 V .08 g 3681 2728 M -27 0 V .08 g 3654 2728 M -27 3 V .08 g 3627 2731 M -27 5 V .08 g 3600 2736 M -28 9 V .08 g .08 g 3572 2745 M -27 10 V .08 g 3545 2755 M -21 10 V .08 g 3524 2765 M -6 3 V .08 g 3518 2768 M -27 14 V .08 g 3491 2782 M -5 3 V .08 g 3486 2785 M -23 14 V .08 g 3463 2799 M -9 6 V .08 g 3454 2805 M -18 12 V .08 g 3436 2817 M -10 8 V .08 g 3426 2825 M -17 12 V .08 g 3409 2837 M -10 8 V .08 g 3399 2845 M -17 14 V .08 g 3382 2859 M -9 7 V .08 g 3373 2866 M -19 15 V .08 g 3354 2881 M -5 5 V .08 g 3349 2886 M -22 19 V .08 g 3327 2905 M -1 1 V .08 g 3326 2906 M -23 20 V 0 g .08 g 5836 4619 M .08 g 5836 4619 M -2 -4 V .08 g 5834 4615 M -7 -16 V .08 g 5827 4599 M -10 -20 V .08 g 5817 4579 M -9 -20 V .08 g 5808 4559 M -1 -3 V .08 g 5807 4556 M -8 -18 V .08 g 5799 4538 M -10 -20 V .08 g 5789 4518 M -9 -20 V .08 g 5780 4498 M 0 -1 V .08 g 5780 4497 M -9 -19 V stroke 5771 4478 M .08 g 5771 4478 M -10 -20 V .08 g 5761 4458 M -9 -20 V .08 g .08 g 5752 4438 M -10 -21 V .08 g 5742 4417 M -9 -20 V .08 g 5733 4397 M -8 -16 V .08 g 5725 4381 M -2 -4 V .08 g 5723 4377 M -9 -20 V .08 g 5714 4357 M -10 -20 V .08 g 5704 4337 M -6 -13 V .08 g 5698 4324 M -4 -7 V .08 g 5694 4317 M -9 -20 V .08 g 5685 4297 M -10 -21 V .08 g 5675 4276 M -4 -8 V .08 g 5671 4268 M -6 -12 V .08 g 5665 4256 M -10 -20 V .08 g 5655 4236 M -10 -20 V .08 g 5645 4216 M -2 -3 V .08 g 5643 4213 M -9 -17 V .08 g 5634 4196 M -10 -20 V .08 g 5624 4176 M -8 -16 V .08 g 5616 4160 M -2 -5 V .08 g 5614 4155 M -11 -20 V .08 g 5603 4135 M -11 -20 V .08 g 5592 4115 M -3 -7 V .08 g 5589 4108 M -7 -13 V .08 g 5582 4095 M -11 -20 V .08 g 5571 4075 M -9 -17 V .08 g 5562 4058 M -3 -3 V .08 g 5559 4055 M -11 -20 V .08 g 5548 4035 M -12 -21 V .08 g 5536 4014 M -2 -3 V .08 g 5534 4011 M -10 -17 V .08 g 5524 3994 M -12 -20 V .08 g 5512 3974 M -5 -9 V .08 g 5507 3965 M -7 -11 V .08 g 5500 3954 M -13 -20 V .08 g 5487 3934 M -7 -12 V .08 g 5480 3922 M -6 -8 V .08 g 5474 3914 M -13 -21 V .08 g 5461 3893 M -8 -12 V .08 g 5453 3881 M -6 -8 V .08 g 5447 3873 M -14 -20 V .08 g 5433 3853 M -8 -10 V .08 g 5425 3843 M -7 -10 V .08 g 5418 3833 M -16 -20 V .08 g 5402 3813 M -4 -6 V .08 g 5398 3807 M -12 -14 V .08 g 5386 3793 M -15 -19 V .08 g 5371 3774 M -2 -2 V .08 g 5369 3772 M -18 -20 V .08 g 5351 3752 M -7 -8 V .08 g 5344 3744 M -12 -12 V stroke 5332 3732 M .08 g 5332 3732 M -16 -16 V .08 g 5316 3716 M -4 -4 V .08 g 5312 3712 M -22 -20 V .08 g 5290 3692 M -1 -1 V .08 g 5289 3691 M -23 -19 V .08 g 5266 3672 M -4 -3 V .08 g 5262 3669 M -23 -17 V .08 g 5239 3652 M -4 -4 V .08 g 5235 3648 M -26 -17 V .08 g 5209 3631 M -2 -1 V .08 g 5207 3630 M -27 -16 V .08 g 5180 3614 M -4 -3 V .08 g 5176 3611 M -23 -12 V .08 g 5153 3599 M -17 -8 V .08 g 5136 3591 M -10 -5 V .08 g 5126 3586 M -28 -12 V .08 g 5098 3574 M -9 -3 V .08 g 5089 3571 M -18 -7 V .08 g 5071 3564 M -27 -9 V .08 g 5044 3555 M -12 -4 V .08 g 5032 3551 M -15 -5 V .08 g 5017 3546 M -28 -8 V .08 g 4989 3538 M -25 -7 V .08 g 4964 3531 M -2 -1 V .08 g 4962 3530 M -27 -7 V .08 g 4935 3523 M -27 -8 V .08 g 4908 3515 M -18 -5 V .08 g 4890 3510 M -10 -2 V .08 g 4880 3508 M -27 -8 V .08 g 4853 3500 M -27 -8 V .08 g 4826 3492 M -7 -2 V .08 g 4819 3490 M -20 -6 V .08 g 4799 3484 M -28 -9 V .08 g 4771 3475 M -14 -5 V .08 g 4757 3470 M -13 -4 V 0 g .08 g 1107 2805 M .08 g 1107 2805 M -12 20 V .08 g 1095 2825 M -2 5 V .08 g 1093 2830 M -9 15 V .08 g 1084 2845 M -10 21 V .08 g 1074 2866 M -9 15 V .08 g 1065 2881 M -2 5 V .08 g 1063 2886 M -11 20 V .08 g 1052 2906 M -10 20 V .08 g 1042 2926 M -4 7 V .08 g 1038 2933 M -6 13 V .08 g 1032 2946 M -10 20 V .08 g 1022 2966 M -10 20 V .08 g 1012 2986 M -1 2 V .08 g 1011 2988 M -9 19 V .08 g 1002 3007 M -10 20 V .08 g 992 3027 M -8 18 V .08 g 984 3045 M -1 2 V stroke 983 3047 M .08 g 983 3047 M -10 20 V .08 g 973 3067 M -9 20 V .08 g 964 3087 M -8 17 V .08 g 956 3104 M -1 3 V .08 g 955 3107 M -9 21 V .08 g 946 3128 M -9 20 V .08 g 937 3148 M -8 16 V .08 g 929 3164 M -2 4 V .08 g 927 3168 M -8 20 V .08 g 919 3188 M -9 20 V .08 g 910 3208 M -8 19 V .08 g 902 3227 M -1 1 V .08 g 901 3228 M -8 20 V .08 g 893 3248 M -9 21 V .08 g 884 3269 M -9 20 V .08 g 875 3289 M 0 2 V .08 g 875 3291 M -8 18 V .08 g 867 3309 M -8 20 V .08 g 859 3329 M -9 20 V .08 g 850 3349 M -3 8 V .08 g 847 3357 M -5 12 V .08 g 842 3369 M -8 21 V .08 g 834 3390 M -8 20 V .08 g 826 3410 M -6 14 V .08 g 820 3424 M -2 6 V .08 g 818 3430 M -8 20 V .08 g 810 3450 M -8 20 V .08 g 802 3470 M -8 20 V .08 g 794 3490 M -1 3 V .08 g 793 3493 M -7 17 V .08 g 786 3510 M -8 21 V .08 g 778 3531 M -7 20 V .08 g 771 3551 M -6 13 V .08 g 765 3564 M -2 7 V .08 g 763 3571 M -8 20 V .08 g 755 3591 M -8 20 V .08 g 747 3611 M -7 20 V .08 g 740 3631 M -2 4 V .08 g 738 3635 M -6 17 V .08 g 732 3652 M -7 20 V .08 g 725 3672 M -8 20 V .08 g 717 3692 M -6 16 V .08 g 711 3708 M -1 4 V .08 g 710 3712 M -8 20 V .08 g 702 3732 M -7 20 V .08 g 695 3752 M -8 20 V .08 g 687 3772 M -3 10 V .08 g 684 3782 M -4 11 V .08 g 680 3793 M -7 20 V .08 g 673 3813 M -8 20 V .08 g 665 3833 M -7 20 V .08 g 658 3853 M -1 3 V stroke 657 3856 M .08 g 657 3856 M -7 17 V .08 g 650 3873 M -7 20 V .08 g 643 3893 M -7 21 V .08 g 636 3914 M -7 18 V .08 g 629 3932 M -1 2 V .08 g 628 3934 M -7 20 V .08 g 621 3954 M -7 20 V .08 g 614 3974 M -7 20 V .08 g 607 3994 M -5 13 V 0 g .08 g 2167 1616 M .08 g 2167 1616 M -12 18 V .08 g 2155 1634 M -1 2 V .08 g 2154 1636 M -13 20 V .08 g 2141 1656 M -13 19 V .08 g 2128 1675 M -1 1 V .08 g 2127 1676 M -14 21 V .08 g 2113 1697 M -12 18 V .08 g 2101 1715 M -1 2 V .08 g 2100 1717 M -14 20 V .08 g 2086 1737 M -12 17 V .08 g 2074 1754 M -3 3 V .08 g 2071 1757 M -14 20 V .08 g 2057 1777 M -11 14 V .08 g 2046 1791 M -4 6 V .08 g 2042 1797 M -15 20 V .08 g 2027 1817 M -8 10 V .08 g 2019 1827 M -8 11 V .08 g 2011 1838 M -16 20 V .08 g 1995 1858 M -3 4 V .08 g 1992 1862 M -13 16 V .08 g 1979 1878 M -14 17 V .08 g 1965 1895 M -3 3 V .08 g 1962 1898 M -18 20 V .08 g 1944 1918 M -7 8 V .08 g 1937 1926 M -11 12 V .08 g 1926 1938 M -16 18 V .08 g 1910 1956 M -3 3 V .08 g 1907 1959 M -19 20 V .08 g 1888 1979 M -5 5 V .08 g 1883 1984 M -15 15 V .08 g 1868 1999 M -12 12 V .08 g 1856 2011 M -10 8 V .08 g 1846 2019 M -18 17 V .08 g 1828 2036 M -3 3 V .08 g 1825 2039 M -23 20 V .08 g 1802 2059 M -1 1 V .08 g 1801 2060 M -23 19 V .08 g 1778 2079 M -4 4 V .08 g 1774 2083 M -20 17 V .08 g 1754 2100 M -7 5 V .08 g 1747 2105 M -19 15 V .08 g 1728 2120 M -9 7 V .08 g 1719 2127 M -17 13 V stroke 1702 2140 M .08 g 1702 2140 M -10 8 V .08 g 1692 2148 M -16 12 V .08 g 1676 2160 M -11 9 V .08 g 1665 2169 M -15 11 V .08 g 1650 2180 M -12 10 V .08 g 1638 2190 M -14 10 V .08 g 1624 2200 M -14 10 V .08 g 1610 2210 M -13 11 V .08 g 1597 2221 M -14 11 V .08 g 1583 2232 M -11 9 V .08 g 1572 2241 M -16 12 V .08 g 1556 2253 M -9 8 V .08 g 1547 2261 M -18 15 V .08 g 1529 2276 M -6 5 V .08 g 1523 2281 M -22 18 V .08 g 1501 2299 M -2 2 V .08 g 1499 2301 M -23 20 V .08 g 1476 2321 M -2 2 V .08 g 1474 2323 M -19 18 V .08 g 1455 2341 M -8 8 V .08 g 1447 2349 M -13 13 V .08 g 1434 2362 M -14 14 V .08 g 1420 2376 M -6 6 V .08 g 1414 2382 M -20 20 V .08 g 1394 2402 M -2 2 V .08 g 1392 2404 M -17 18 V .08 g 1375 2422 M -10 11 V .08 g 1365 2433 M -8 9 V .08 g 1357 2442 M -17 20 V .08 g 1340 2462 M -2 3 V .08 g 1338 2465 M -15 18 V .08 g 1323 2483 M -12 15 V .08 g 1311 2498 M -4 5 V .08 g 1307 2503 M -16 20 V .08 g 1291 2523 M -8 9 V .08 g 1283 2532 M -8 11 V .08 g 1275 2543 M -15 20 V .08 g 1260 2563 M -4 6 V .08 g 1256 2569 M -10 14 V .08 g 1246 2583 M -14 21 V .08 g 1232 2604 M -3 3 V .08 g 1229 2607 M -11 17 V .08 g 1218 2624 M -14 20 V .08 g 1204 2644 M -2 4 V .08 g 1202 2648 M -11 16 V .08 g 1191 2664 M -13 20 V .08 g 1178 2684 M -4 6 V .08 g 1174 2690 M -8 14 V .08 g 1166 2704 M -12 20 V .08 g 1154 2724 M -7 11 V .08 g 1147 2735 M -6 10 V .08 g 1141 2745 M -11 20 V stroke 1130 2765 M .08 g 1130 2765 M -10 16 V .08 g 1120 2781 M -2 4 V .08 g 1118 2785 M -11 20 V 0 g .08 g 3463 858 M .08 g 3463 858 M -19 -8 V .08 g 3444 850 M -8 -3 V .08 g 3436 847 M -27 -12 V .08 g 3409 835 M -12 -5 V .08 g 3397 830 M -15 -7 V .08 g 3382 823 M -28 -12 V .08 g 3354 811 M -3 -1 V .08 g 3351 810 M -24 -10 V .08 g 3327 800 M -23 -10 V .08 g 3304 790 M -4 -2 V .08 g 3300 788 M -27 -11 V .08 g 3273 777 M -20 -8 V .08 g 3253 769 M -8 -3 V .08 g 3245 766 M -27 -9 V .08 g 3218 757 M -24 -8 V .08 g 3194 749 M -3 -1 V .08 g 3191 748 M -27 -7 V .08 g 3164 741 M -28 -6 V .08 g 3136 735 M -27 -5 V .08 g 3109 730 M -5 -1 V .08 g 3104 729 M -22 -3 V .08 g 3082 726 M -27 -1 V .08 g 3055 725 M -28 0 V .08 g 3027 725 M -27 1 V .08 g 3000 726 M -21 3 V .08 g 2979 729 M -6 1 V .08 g 2973 730 M -27 5 V .08 g 2946 735 M -28 8 V .08 g 2918 743 M -19 6 V .08 g 2899 749 M -8 3 V .08 g 2891 752 M -27 12 V .08 g 2864 764 M -12 5 V .08 g 2852 769 M -15 8 V .08 g 2837 777 M -22 13 V .08 g 2815 790 M -6 3 V .08 g 2809 793 M -26 17 V .08 g 2783 810 M -1 0 V .08 g 2782 810 M -27 20 V .08 g 2755 830 M -26 20 V .08 g 2729 850 M -1 2 V .08 g 2728 852 M -22 18 V .08 g 2706 870 M -6 5 V .08 g 2700 875 M -16 15 V .08 g 2684 890 M -11 11 V .08 g 2673 901 M -9 9 V .08 g 2664 910 M -18 18 V .08 g 2646 928 M -2 3 V .08 g 2644 931 M -19 20 V .08 g 2625 951 M -6 7 V stroke 2619 958 M .08 g 2619 958 M -12 13 V .08 g 2607 971 M -16 18 V .08 g 2591 989 M -1 2 V .08 g 2590 991 M -17 20 V .08 g 2573 1011 M -9 11 V .08 g 2564 1022 M -7 9 V .08 g 2557 1031 M -16 21 V .08 g 2541 1052 M -4 4 V .08 g 2537 1056 M -12 16 V .08 g 2525 1072 M -15 20 V .08 g .08 g 2510 1092 M -15 20 V .08 g 2495 1112 M -13 18 V .08 g 2482 1130 M -1 2 V .08 g 2481 1132 M -15 20 V .08 g 2466 1152 M -11 17 V .08 g 2455 1169 M -3 3 V .08 g 2452 1172 M -13 21 V .08 g 2439 1193 M -11 16 V .08 g 2428 1209 M -3 4 V .08 g 2425 1213 M -14 20 V .08 g 2411 1233 M -10 16 V .08 g 2401 1249 M -3 4 V .08 g 2398 1253 M -13 20 V .08 g 2385 1273 M -12 18 V .08 g 2373 1291 M -1 2 V .08 g 2372 1293 M -13 21 V .08 g 2359 1314 M -13 20 V .08 g .08 g 2346 1334 M -13 20 V .08 g 2333 1354 M -13 20 V .08 g 2320 1374 M -1 2 V .08 g 2319 1376 M -11 18 V .08 g 2308 1394 M -13 20 V .08 g 2295 1414 M -3 6 V .08 g 2292 1420 M -10 15 V .08 g 2282 1435 M -12 20 V .08 g 2270 1455 M -6 8 V .08 g 2264 1463 M -7 12 V .08 g 2257 1475 M -13 20 V .08 g 2244 1495 M -7 11 V .08 g 2237 1506 M -6 9 V .08 g 2231 1515 M -12 20 V .08 g 2219 1535 M -9 14 V .08 g 2210 1549 M -4 6 V .08 g 2206 1555 M -13 21 V .08 g 2193 1576 M -10 16 V .08 g 2183 1592 M -3 4 V .08 g 2180 1596 M -13 20 V 0 g .08 g 5017 1411 M .08 g 5017 1411 M -11 -17 V .08 g 5006 1394 M -12 -20 V .08 g 4994 1374 M -5 -7 V .08 g 4989 1367 M -8 -13 V .08 g 4981 1354 M -13 -20 V stroke 4968 1334 M .08 g 4968 1334 M -6 -10 V .08 g 4962 1324 M -7 -10 V .08 g 4955 1314 M -13 -21 V .08 g 4942 1293 M -7 -12 V .08 g 4935 1281 M -6 -8 V .08 g 4929 1273 M -13 -20 V .08 g 4916 1253 M -8 -13 V .08 g 4908 1240 M -5 -7 V .08 g 4903 1233 M -14 -20 V .08 g 4889 1213 M -9 -13 V .08 g 4880 1200 M -5 -7 V .08 g 4875 1193 M -14 -21 V .08 g 4861 1172 M -8 -12 V .08 g 4853 1160 M -6 -8 V .08 g 4847 1152 M -14 -20 V .08 g 4833 1132 M -7 -9 V .08 g 4826 1123 M -8 -11 V .08 g 4818 1112 M -15 -20 V .08 g 4803 1092 M -4 -6 V .08 g 4799 1086 M -12 -14 V .08 g 4787 1072 M -16 -20 V .08 g 4771 1052 M 0 -1 V .08 g 4771 1051 M -16 -20 V .08 g 4755 1031 M -11 -13 V .08 g 4744 1018 M -6 -7 V .08 g 4738 1011 M -18 -20 V .08 g 4720 991 M -3 -4 V .08 g 4717 987 M -15 -16 V .08 g 4702 971 M -12 -13 V .08 g 4690 958 M -7 -7 V .08 g 4683 951 M -20 -20 V .08 g 4663 931 M -1 -1 V .08 g 4662 930 M -21 -20 V .08 g 4641 910 M -6 -6 V .08 g 4635 904 M -16 -14 V .08 g 4619 890 M -11 -9 V .08 g 4608 881 M -14 -11 V .08 g 4594 870 M -13 -11 V .08 g 4581 859 M -13 -9 V .08 g 4568 850 M -15 -10 V .08 g 4553 840 M -15 -10 V .08 g 4538 830 M -12 -8 V .08 g 4526 822 M -22 -12 V .08 g 4504 810 M -5 -3 V .08 g 4499 807 M -27 -14 V .08 g 4472 793 M -9 -3 V .08 g 4463 790 M -19 -8 V .08 g 4444 782 M -27 -10 V .08 g 4417 772 M -11 -3 V .08 g 4406 769 M -16 -4 V .08 g 4390 765 M -27 -5 V .08 g 4363 760 M -28 -4 V stroke 4335 756 M .08 g 4335 756 M -27 -2 V .08 g 4308 754 M -27 0 V .08 g 4281 754 M -27 2 V .08 g 4254 756 M -28 3 V .08 g 4226 759 M -27 4 V .08 g 4199 763 M -27 6 V .08 g 4172 769 M -2 0 V .08 g 4170 769 M -25 7 V .08 g 4145 776 M -28 8 V .08 g 4117 784 M -17 6 V .08 g 4100 790 M -10 3 V .08 g 4090 793 M -27 9 V .08 g 4063 802 M -20 8 V .08 g 4043 810 M -7 2 V .08 g 4036 812 M -28 11 V .08 g 4008 823 M -18 7 V .08 g 3990 830 M -9 4 V .08 g 3981 834 M -27 10 V .08 g 3954 844 M -16 6 V .08 g 3938 850 M -11 5 V .08 g 3927 855 M -28 10 V .08 g 3899 865 M -16 5 V .08 g 3883 870 M -11 4 V .08 g 3872 874 M -27 8 V .08 g 3845 882 M -27 8 V .08 g 3818 890 M -2 0 V .08 g 3816 890 M -26 6 V .08 g 3790 896 M -27 5 V .08 g 3763 901 M -27 4 V .08 g 3736 905 M -27 2 V .08 g 3709 907 M -28 0 V .08 g 3681 907 M -27 -1 V .08 g 3654 906 M -27 -3 V .08 g 3627 903 M -27 -4 V .08 g 3600 899 M -28 -6 V .08 g 3572 893 M -10 -3 V .08 g 3562 890 M -17 -4 V .08 g 3545 886 M -27 -8 V .08 g 3518 878 M -21 -8 V .08 g 3497 870 M -6 -2 V .08 g 3491 868 M -28 -10 V 0 g .08 g 6052 2621 M .08 g 6052 2621 M -14 -17 V .08 g 6038 2604 M -13 -18 V .08 g 6025 2586 M -3 -3 V .08 g 6022 2583 M -16 -20 V .08 g 6006 2563 M -8 -10 V .08 g 5998 2553 M -9 -10 V .08 g 5989 2543 M -18 -20 V .08 g 5971 2523 M -1 -1 V .08 g 5970 2522 M -17 -19 V .08 g 5953 2503 M -10 -11 V .08 g 5943 2492 M -9 -9 V stroke 5934 2483 M .08 g 5934 2483 M -18 -20 V .08 g 5916 2463 M -1 -1 V .08 g 5915 2462 M -20 -20 V .08 g 5895 2442 M -6 -6 V .08 g 5889 2436 M -15 -14 V .08 g 5874 2422 M -13 -12 V .08 g 5861 2410 M -9 -8 V .08 g 5852 2402 M -18 -17 V .08 g 5834 2385 M -4 -3 V .08 g 5830 2382 M -23 -20 V .08 g 5807 2362 M 0 -1 V .08 g 5807 2361 M -23 -20 V .08 g 5784 2341 M -4 -3 V .08 g 5780 2338 M -21 -17 V .08 g 5759 2321 M -7 -6 V .08 g 5752 2315 M -17 -14 V .08 g 5735 2301 M -10 -8 V .08 g 5725 2293 M -15 -12 V .08 g 5710 2281 M -12 -10 V .08 g 5698 2271 M -13 -10 V .08 g 5685 2261 M -14 -12 V .08 g 5671 2249 M -11 -8 V .08 g 5660 2241 M -17 -14 V .08 g 5643 2227 M -7 -6 V .08 g 5636 2221 M -20 -17 V .08 g 5616 2204 M -4 -4 V .08 g 5612 2200 M -23 -19 V .08 g 5589 2181 M -1 -1 V .08 g 5588 2180 M -23 -20 V .08 g 5565 2160 M -3 -3 V .08 g 5562 2157 M -19 -17 V .08 g 5543 2140 M -9 -8 V .08 g 5534 2132 M -12 -12 V .08 g 5522 2120 M -15 -15 V .08 g 5507 2105 M -6 -5 V .08 g 5501 2100 M -20 -21 V .08 g 5481 2079 M -1 -1 V .08 g 5480 2078 M -18 -19 V .08 g 5462 2059 M -9 -10 V .08 g 5453 2049 M -9 -10 V .08 g 5444 2039 M -18 -20 V .08 g 5426 2019 M -1 0 V .08 g 5425 2019 M -17 -20 V .08 g 5408 1999 M -10 -12 V .08 g 5398 1987 M -6 -8 V .08 g 5392 1979 M -17 -20 V .08 g 5375 1959 M -4 -6 V .08 g 5371 1953 M -12 -15 V .08 g 5359 1938 M -15 -20 V .08 g .08 g 5344 1918 M -15 -20 V .08 g 5329 1898 M -13 -17 V .08 g 5316 1881 M -2 -3 V stroke 5314 1878 M .08 g 5314 1878 M -14 -20 V .08 g 5300 1858 M -11 -15 V .08 g 5289 1843 M -3 -5 V .08 g 5286 1838 M -14 -21 V .08 g 5272 1817 M -10 -14 V .08 g 5262 1803 M -4 -6 V .08 g 5258 1797 M -13 -20 V .08 g 5245 1777 M -10 -15 V .08 g 5235 1762 M -4 -5 V .08 g 5231 1757 M -13 -20 V .08 g 5218 1737 M -11 -17 V .08 g 5207 1720 M -2 -3 V .08 g 5205 1717 M -13 -20 V .08 g 5192 1697 M -12 -20 V .08 g 5180 1677 M 0 -1 V .08 g 5180 1676 M -13 -20 V .08 g 5167 1656 M -13 -20 V .08 g 5154 1636 M -1 -3 V .08 g 5153 1633 M -11 -17 V .08 g 5142 1616 M -12 -20 V .08 g 5130 1596 M -4 -7 V .08 g 5126 1589 M -9 -13 V .08 g 5117 1576 M -12 -21 V .08 g 5105 1555 M -7 -10 V .08 g 5098 1545 M -5 -10 V .08 g 5093 1535 M -13 -20 V .08 g 5080 1515 M -9 -15 V .08 g 5071 1500 M -3 -5 V .08 g 5068 1495 M -12 -20 V .08 g 5056 1475 M -12 -20 V .08 g 5044 1455 M -1 0 V .08 g 5043 1455 M -12 -20 V .08 g 5031 1435 M -12 -21 V .08 g 5019 1414 M -2 -3 V 0 g .06 g 2028 3390 M .06 g 2028 3390 M -9 8 V .06 g 2019 3398 M -12 12 V .06 g 2007 3410 M -15 15 V .06 g 1992 3425 M -5 5 V .06 g 1987 3430 M -18 20 V .06 g 1969 3450 M -4 5 V .06 g 1965 3455 M -13 15 V .06 g 1952 3470 M -15 19 V .06 g 1937 3489 M -1 1 V .06 g 1936 3490 M -15 20 V .06 g 1921 3510 M -11 16 V .06 g 1910 3526 M -3 5 V .06 g 1907 3531 M -14 20 V .06 g 1893 3551 M -10 16 V .06 g 1883 3567 M -3 4 V .06 g 1880 3571 M -12 20 V .06 g 1868 3591 M -12 20 V .06 g 1856 3611 M -1 0 V stroke 1855 3611 M .06 g 1855 3611 M -12 20 V .06 g 1843 3631 M -11 21 V .06 g 1832 3652 M -4 6 V .06 g 1828 3658 M -8 14 V .06 g 1820 3672 M -11 20 V .06 g 1809 3692 M -8 15 V .06 g 1801 3707 M -3 5 V .06 g 1798 3712 M -10 20 V .06 g 1788 3732 M -11 20 V .06 g 1777 3752 M -3 7 V .06 g 1774 3759 M -7 13 V .06 g 1767 3772 M -10 21 V .06 g 1757 3793 M -10 20 V .06 g 1747 3813 M 0 1 V .06 g 1747 3814 M -10 19 V .06 g 1737 3833 M -10 20 V .06 g 1727 3853 M -8 17 V .06 g 1719 3870 M -1 3 V .06 g 1718 3873 M -10 20 V .06 g 1708 3893 M -9 21 V .06 g 1699 3914 M -7 14 V .06 g 1692 3928 M -3 6 V .06 g 1689 3934 M -9 20 V .06 g 1680 3954 M -9 20 V .06 g 1671 3974 M -6 13 V .06 g 1665 3987 M -4 7 V .06 g 1661 3994 M -9 20 V .06 g 1652 4014 M -9 21 V .06 g 1643 4035 M -5 12 V .06 g 1638 4047 M -4 8 V .06 g 1634 4055 M -9 20 V .06 g 1625 4075 M -9 20 V .06 g 1616 4095 M -6 13 V .06 g 1610 4108 M -3 7 V .06 g 1607 4115 M -9 20 V .06 g 1598 4135 M -9 20 V .06 g 1589 4155 M -6 14 V .06 g 1583 4169 M -3 7 V .06 g 1580 4176 M -9 20 V .06 g 1571 4196 M -9 20 V .06 g 1562 4216 M -6 15 V .06 g 1556 4231 M -3 5 V .06 g 1553 4236 M -9 20 V .06 g 1544 4256 M -8 20 V .06 g 1536 4276 M -7 17 V .06 g 1529 4293 M -2 4 V .06 g 1527 4297 M -9 20 V .06 g 1518 4317 M -9 20 V .06 g 1509 4337 M -8 17 V .06 g 1501 4354 M -1 3 V .06 g 1500 4357 M -9 20 V .06 g 1491 4377 M -9 20 V stroke 1482 4397 M .06 g 1482 4397 M -8 19 V .06 g 1474 4416 M -1 1 V .06 g 1473 4417 M -9 21 V .06 g 1464 4438 M -9 20 V .06 g 1455 4458 M -8 19 V .06 g 1447 4477 M -1 1 V .06 g 1446 4478 M -9 20 V .06 g 1437 4498 M -9 20 V .06 g 1428 4518 M -8 20 V .06 g 1420 4538 M -1 0 V .06 g 1419 4538 M -9 21 V .06 g 1410 4559 M -9 20 V .06 g 1401 4579 M -9 19 V .06 g 1392 4598 M 0 1 V .06 g 1392 4599 M -9 20 V 0 g .06 g 3545 2504 M .06 g 3545 2504 M -27 16 V .06 g 3518 2520 M -4 3 V .06 g 3514 2523 M -23 16 V .06 g 3491 2539 M -5 4 V .06 g 3486 2543 M -23 18 V .06 g 3463 2561 M -3 2 V .06 g 3460 2563 M -24 20 V .06 g 3436 2583 M 0 1 V .06 g 3436 2584 M -22 20 V .06 g 3414 2604 M -5 4 V .06 g 3409 2608 M -16 16 V .06 g 3393 2624 M -11 11 V .06 g 3382 2635 M -10 9 V .06 g 3372 2644 M -18 18 V .06 g 3354 2662 M -2 2 V .06 g 3352 2664 M -19 20 V .06 g 3333 2684 M -6 6 V .06 g 3327 2690 M -14 14 V .06 g 3313 2704 M -13 14 V .06 g 3300 2718 M -6 6 V .06 g 3294 2724 M -19 21 V .06 g 3275 2745 M -2 2 V .06 g 3273 2747 M -17 18 V .06 g 3256 2765 M -11 12 V .06 g 3245 2777 M -7 8 V .06 g 3238 2785 M -19 20 V .06 g 3219 2805 M -1 1 V .06 g 3218 2806 M -18 19 V .06 g 3200 2825 M -9 10 V .06 g 3191 2835 M -10 10 V .06 g 3181 2845 M -17 18 V .06 g 3164 2863 M -3 3 V .06 g 3161 2866 M -19 20 V .06 g 3142 2886 M -6 5 V .06 g 3136 2891 M -14 15 V .06 g 3122 2906 M -13 13 V .06 g 3109 2919 M -7 7 V stroke 3102 2926 M .06 g 3102 2926 M -20 20 V .06 g 3082 2946 M -1 0 V .06 g 3081 2946 M -21 20 V .06 g 3060 2966 M -5 6 V .06 g 3055 2972 M -17 14 V .06 g 3038 2986 M -11 11 V .06 g 3027 2997 M -11 10 V .06 g 3016 3007 M -16 14 V .06 g 3000 3021 M -7 6 V .06 g 2993 3027 M -20 17 V .06 g 2973 3044 M -4 3 V .06 g 2969 3047 M -23 19 V .06 g 2946 3066 M -2 1 V .06 g 2944 3067 M -26 20 V .06 g 2918 3087 M -1 0 V .06 g 2917 3087 M -26 19 V .06 g 2891 3106 M -2 1 V .06 g 2889 3107 M -25 17 V .06 g 2864 3124 M -5 4 V .06 g 2859 3128 M -22 13 V .06 g 2837 3141 M -11 7 V .06 g 2826 3148 M -17 9 V .06 g 2809 3157 M -20 11 V .06 g 2789 3168 M -7 4 V .06 g 2782 3172 M -27 13 V .06 g 2755 3185 M -7 3 V .06 g 2748 3188 M -20 9 V .06 g 2728 3197 M -28 11 V .06 g 2700 3208 M -27 10 V .06 g 2673 3218 M -27 8 V .06 g 2646 3226 M -7 2 V .06 g 2639 3228 M -20 6 V .06 g 2619 3234 M -28 6 V .06 g 2591 3240 M -27 6 V .06 g 2564 3246 M -13 2 V .06 g 2551 3248 M -14 3 V .06 g 2537 3251 M -27 4 V .06 g 2510 3255 M -28 3 V .06 g 2482 3258 M -27 3 V .06 g 2455 3261 M -27 3 V .06 g 2428 3264 M -27 2 V .06 g 2401 3266 M -28 2 V .06 g 2373 3268 M -2 1 V .06 g 2371 3269 M -25 2 V .06 g 2346 3271 M -27 2 V .06 g 2319 3273 M -27 4 V .06 g 2292 3277 M -28 4 V .06 g 2264 3281 M -27 5 V .06 g 2237 3286 M -12 3 V .06 g 2225 3289 M -15 3 V .06 g 2210 3292 M -27 8 V .06 g 2183 3300 M -24 9 V stroke 2159 3309 M .06 g 2159 3309 M -4 1 V .06 g 2155 3310 M -27 12 V .06 g 2128 3322 M -13 7 V .06 g 2115 3329 M -14 8 V .06 g 2101 3337 M -20 12 V .06 g 2081 3349 M -7 5 V .06 g 2074 3354 M -21 15 V .06 g 2053 3369 M -7 5 V .06 g 2046 3374 M -18 16 V 0 g .06 g 4989 3331 M .06 g 4989 3331 M -14 -2 V .06 g 4975 3329 M -13 -2 V .06 g 4962 3327 M -27 -3 V .06 g 4935 3324 M -27 -4 V .06 g 4908 3320 M -28 -4 V .06 g 4880 3316 M -27 -4 V .06 g 4853 3312 M -14 -3 V .06 g 4839 3309 M -13 -3 V .06 g 4826 3306 M -27 -5 V .06 g 4799 3301 M -28 -7 V .06 g 4771 3294 M -19 -5 V .06 g 4752 3289 M -8 -2 V .06 g 4744 3287 M -27 -9 V .06 g 4717 3278 M -27 -9 V .06 g .06 g 4690 3269 M -28 -11 V .06 g 4662 3258 M -22 -10 V .06 g 4640 3248 M -5 -2 V .06 g 4635 3246 M -27 -13 V .06 g 4608 3233 M -10 -5 V .06 g 4598 3228 M -17 -9 V .06 g 4581 3219 M -20 -11 V .06 g 4561 3208 M -8 -4 V .06 g 4553 3204 M -25 -16 V .06 g 4528 3188 M -2 -1 V .06 g 4526 3187 M -27 -18 V .06 g 4499 3169 M -2 -1 V .06 g 4497 3168 M -25 -18 V .06 g 4472 3150 M -3 -2 V .06 g 4469 3148 M -25 -19 V .06 g 4444 3129 M -2 -1 V .06 g 4442 3128 M -25 -20 V .06 g 4417 3108 M 0 -1 V .06 g 4417 3107 M -25 -20 V .06 g 4392 3087 M -2 -2 V .06 g 4390 3085 M -21 -18 V .06 g 4369 3067 M -6 -6 V .06 g 4363 3061 M -16 -14 V .06 g 4347 3047 M -12 -11 V .06 g 4335 3036 M -9 -9 V .06 g 4326 3027 M -18 -17 V .06 g 4308 3010 M -3 -3 V .06 g 4305 3007 M -21 -21 V .06 g 4284 2986 M -3 -3 V stroke 4281 2983 M .06 g 4281 2983 M -17 -17 V .06 g 4264 2966 M -10 -11 V .06 g 4254 2955 M -9 -9 V .06 g 4245 2946 M -19 -19 V .06 g 4226 2927 M 0 -1 V .06 g 4226 2926 M -19 -20 V .06 g 4207 2906 M -8 -9 V .06 g 4199 2897 M -11 -11 V .06 g 4188 2886 M -16 -18 V .06 g 4172 2868 M -2 -2 V .06 g 4170 2866 M -18 -21 V .06 g 4152 2845 M -7 -8 V .06 g 4145 2837 M -12 -12 V .06 g 4133 2825 M -16 -18 V .06 g 4117 2807 M -2 -2 V .06 g 4115 2805 M -18 -20 V .06 g 4097 2785 M -7 -8 V .06 g 4090 2777 M -11 -12 V .06 g 4079 2765 M -16 -19 V .06 g 4063 2746 M -2 -1 V .06 g 4061 2745 M -18 -21 V .06 g 4043 2724 M -7 -8 V .06 g 4036 2716 M -12 -12 V .06 g 4024 2704 M -16 -17 V .06 g 4008 2687 M -2 -3 V .06 g 4006 2684 M -19 -20 V .06 g 3987 2664 M -6 -6 V .06 g 3981 2658 M -14 -14 V .06 g 3967 2644 M -13 -14 V .06 g 3954 2630 M -7 -6 V .06 g 3947 2624 M -20 -20 V .06 g 3927 2604 M -1 0 V .06 g 3926 2604 M -22 -21 V .06 g 3904 2583 M -5 -4 V .06 g 3899 2579 M -18 -16 V .06 g 3881 2563 M -9 -8 V .06 g 3872 2555 M -16 -12 V .06 g 3856 2543 M -11 -9 V .06 g 3845 2534 M -17 -11 V .06 g 3828 2523 M -10 -7 V .06 g 3818 2516 M -23 -13 V .06 g 3795 2503 M -5 -3 V .06 g 3790 2500 M -27 -13 V .06 g 3763 2487 M -12 -4 V .06 g 3751 2483 M -15 -6 V .06 g 3736 2477 M -27 -7 V .06 g 3709 2470 M -28 -3 V .06 g 3681 2467 M -27 1 V .06 g 3654 2468 M -27 4 V .06 g 3627 2472 M -27 7 V .06 g 3600 2479 M -8 4 V .06 g 3592 2483 M -20 7 V stroke 3572 2490 M .06 g 3572 2490 M -25 13 V .06 g 3547 2503 M -2 1 V 0 g .06 g 5923 4619 M .06 g 5923 4619 M -7 -16 V .06 g 5916 4603 M -2 -4 V .06 g 5914 4599 M -9 -20 V .06 g 5905 4579 M -9 -20 V .06 g 5896 4559 M -7 -18 V .06 g 5889 4541 M -2 -3 V .06 g 5887 4538 M -8 -20 V .06 g 5879 4518 M -9 -20 V .06 g 5870 4498 M -9 -20 V .06 g .06 g 5861 4478 M -8 -20 V .06 g 5853 4458 M -9 -20 V .06 g 5844 4438 M -9 -21 V .06 g 5835 4417 M -1 -2 V .06 g 5834 4415 M -8 -18 V .06 g 5826 4397 M -8 -20 V .06 g 5818 4377 M -9 -20 V .06 g 5809 4357 M -2 -5 V .06 g 5807 4352 M -7 -15 V .06 g 5800 4337 M -8 -20 V .06 g 5792 4317 M -9 -20 V .06 g 5783 4297 M -3 -8 V .06 g 5780 4289 M -6 -13 V .06 g 5774 4276 M -9 -20 V .06 g 5765 4256 M -8 -20 V .06 g 5757 4236 M -5 -10 V .06 g 5752 4226 M -4 -10 V .06 g 5748 4216 M -9 -20 V .06 g 5739 4196 M -9 -20 V .06 g 5730 4176 M -5 -13 V .06 g 5725 4163 M -4 -8 V .06 g 5721 4155 M -8 -20 V .06 g 5713 4135 M -9 -20 V .06 g 5704 4115 M -6 -13 V .06 g 5698 4102 M -3 -7 V .06 g 5695 4095 M -9 -20 V .06 g 5686 4075 M -9 -20 V .06 g 5677 4055 M -6 -14 V .06 g 5671 4041 M -4 -6 V .06 g 5667 4035 M -9 -21 V .06 g 5658 4014 M -9 -20 V .06 g 5649 3994 M -6 -12 V .06 g 5643 3982 M -3 -8 V .06 g 5640 3974 M -10 -20 V .06 g 5630 3954 M -9 -20 V .06 g 5621 3934 M -5 -10 V .06 g 5616 3924 M -5 -10 V .06 g 5611 3914 M -10 -21 V .06 g 5601 3893 M -9 -20 V .06 g 5592 3873 M -3 -6 V .06 g 5589 3867 M -7 -14 V stroke 5582 3853 M .06 g 5582 3853 M -10 -20 V .06 g 5572 3833 M -10 -20 V .06 g 5562 3813 M -1 0 V .06 g 5561 3813 M -10 -20 V .06 g 5551 3793 M -11 -21 V .06 g 5540 3772 M -6 -11 V .06 g 5534 3761 M -5 -9 V .06 g 5529 3752 M -11 -20 V .06 g 5518 3732 M -11 -20 V .06 g .06 g 5507 3712 M -12 -20 V .06 g 5495 3692 M -12 -20 V .06 g 5483 3672 M -3 -6 V .06 g 5480 3666 M -9 -14 V .06 g 5471 3652 M -13 -21 V .06 g 5458 3631 M -5 -8 V .06 g 5453 3623 M -8 -12 V .06 g 5445 3611 M -14 -20 V .06 g 5431 3591 M -6 -8 V .06 g 5425 3583 M -9 -12 V .06 g 5416 3571 M -15 -20 V .06 g 5401 3551 M -3 -4 V .06 g 5398 3547 M -13 -16 V .06 g 5385 3531 M -14 -17 V .06 g 5371 3514 M -4 -4 V .06 g 5367 3510 M -18 -20 V .06 g 5349 3490 M -5 -5 V .06 g 5344 3485 M -16 -15 V .06 g 5328 3470 M -12 -11 V .06 g 5316 3459 M -10 -9 V .06 g 5306 3450 M -17 -14 V .06 g 5289 3436 M -9 -6 V .06 g 5280 3430 M -18 -13 V .06 g 5262 3417 M -12 -7 V .06 g 5250 3410 M -15 -10 V .06 g 5235 3400 M -21 -10 V .06 g 5214 3390 M -7 -4 V .06 g 5207 3386 M -27 -12 V .06 g 5180 3374 M -13 -5 V .06 g 5167 3369 M -14 -5 V .06 g 5153 3364 M -27 -8 V .06 g 5126 3356 M -28 -7 V .06 g 5098 3349 M -1 0 V .06 g 5097 3349 M -26 -5 V .06 g 5071 3344 M -27 -5 V .06 g 5044 3339 M -27 -4 V .06 g 5017 3335 M -28 -4 V 0 g .06 g 1173 2866 M .06 g 1173 2866 M -13 20 V .06 g 1160 2886 M -12 20 V .06 g 1148 2906 M -1 1 V .06 g 1147 2907 M -11 19 V .06 g 1136 2926 M -12 20 V .06 g 1124 2946 M -4 7 V stroke 1120 2953 M .06 g 1120 2953 M -7 13 V .06 g 1113 2966 M -12 20 V .06 g 1101 2986 M -8 16 V .06 g 1093 3002 M -3 5 V .06 g 1090 3007 M -11 20 V .06 g 1079 3027 M -11 20 V .06 g 1068 3047 M -3 6 V .06 g 1065 3053 M -7 14 V .06 g 1058 3067 M -10 20 V .06 g 1048 3087 M -10 19 V .06 g 1038 3106 M -1 1 V .06 g 1037 3107 M -9 21 V .06 g 1028 3128 M -10 20 V .06 g 1018 3148 M -7 14 V .06 g 1011 3162 M -3 6 V .06 g 1008 3168 M -10 20 V .06 g 998 3188 M -9 20 V .06 g 989 3208 M -5 11 V .06 g 984 3219 M -5 9 V .06 g 979 3228 M -9 20 V .06 g 970 3248 M -9 21 V .06 g 961 3269 M -5 10 V .06 g 956 3279 M -4 10 V .06 g 952 3289 M -9 20 V .06 g 943 3309 M -9 20 V .06 g 934 3329 M -5 12 V .06 g 929 3341 M -3 8 V .06 g 926 3349 M -9 20 V .06 g 917 3369 M -8 21 V .06 g 909 3390 M -7 15 V .06 g 902 3405 M -2 5 V .06 g 900 3410 M -8 20 V .06 g 892 3430 M -9 20 V .06 g 883 3450 M -8 20 V .06 g 875 3470 M 0 2 V .06 g 875 3472 M -8 18 V .06 g 867 3490 M -8 20 V .06 g 859 3510 M -8 21 V .06 g 851 3531 M -4 9 V .06 g 847 3540 M -4 11 V .06 g 843 3551 M -8 20 V .06 g 835 3571 M -8 20 V .06 g 827 3591 M -7 19 V .06 g 820 3610 M -1 1 V .06 g 819 3611 M -7 20 V .06 g 812 3631 M -8 21 V .06 g 804 3652 M -7 20 V .06 g 797 3672 M -4 10 V .06 g 793 3682 M -4 10 V .06 g 789 3692 M -7 20 V .06 g 782 3712 M -8 20 V .06 g 774 3732 M -8 20 V stroke 766 3752 M .06 g 766 3752 M -1 3 V .06 g 765 3755 M -6 17 V .06 g 759 3772 M -7 21 V .06 g 752 3793 M -7 20 V .06 g 745 3813 M -7 17 V .06 g 738 3830 M -1 3 V .06 g 737 3833 M -7 20 V .06 g 730 3853 M -7 20 V .06 g 723 3873 M -7 20 V .06 g 716 3893 M -5 13 V .06 g 711 3906 M -3 8 V .06 g 708 3914 M -7 20 V .06 g 701 3934 M -7 20 V .06 g 694 3954 M -7 20 V .06 g 687 3974 M -3 10 V .06 g 684 3984 M -4 10 V .06 g 680 3994 M -7 20 V .06 g 673 4014 M -7 21 V .06 g 666 4035 M -7 20 V .06 g 659 4055 M -2 8 V .06 g 657 4063 M -5 12 V .06 g 652 4075 M -7 20 V .06 g 645 4095 M -6 20 V .06 g 639 4115 M -7 20 V .06 g 632 4135 M -3 7 V .06 g 629 4142 M -4 13 V .06 g 625 4155 M -7 21 V .06 g 618 4176 M -7 20 V .06 g 611 4196 M -7 20 V .06 g 604 4216 M -2 6 V 0 g .06 g 2259 1697 M .06 g 2259 1697 M -12 20 V .06 g 2247 1717 M -10 18 V .06 g 2237 1735 M -1 2 V .06 g 2236 1737 M -12 20 V .06 g 2224 1757 M -11 20 V .06 g 2213 1777 M -3 6 V .06 g 2210 1783 M -9 14 V .06 g 2201 1797 M -11 20 V .06 g 2190 1817 M -7 13 V .06 g 2183 1830 M -5 8 V .06 g 2178 1838 M -12 20 V .06 g 2166 1858 M -11 18 V .06 g 2155 1876 M -1 2 V .06 g 2154 1878 M -12 20 V .06 g 2142 1898 M -12 20 V .06 g 2130 1918 M -2 4 V .06 g 2128 1922 M -10 16 V .06 g 2118 1938 M -13 21 V .06 g 2105 1959 M -4 7 V .06 g 2101 1966 M -9 13 V .06 g 2092 1979 M -13 20 V .06 g 2079 1999 M -5 9 V stroke 2074 2008 M .06 g 2074 2008 M -8 11 V .06 g 2066 2019 M -14 20 V .06 g 2052 2039 M -6 9 V .06 g 2046 2048 M -8 11 V .06 g 2038 2059 M -14 20 V .06 g 2024 2079 M -5 7 V .06 g 2019 2086 M -10 14 V .06 g 2009 2100 M -16 20 V .06 g 1993 2120 M -1 2 V .06 g 1992 2122 M -15 18 V .06 g 1977 2140 M -12 15 V .06 g 1965 2155 M -5 5 V .06 g 1960 2160 M -18 20 V .06 g 1942 2180 M -5 6 V .06 g 1937 2186 M -13 14 V .06 g 1924 2200 M -14 14 V .06 g 1910 2214 M -6 7 V .06 g 1904 2221 M -21 19 V .06 g 1883 2240 M -1 1 V .06 g 1882 2241 M -22 20 V .06 g 1860 2261 M -4 3 V .06 g 1856 2264 M -21 17 V .06 g 1835 2281 M -7 5 V .06 g 1828 2286 M -20 15 V .06 g 1808 2301 M -7 6 V .06 g 1801 2307 M -21 14 V .06 g 1780 2321 M -6 4 V .06 g 1774 2325 M -25 16 V .06 g 1749 2341 M -2 2 V .06 g 1747 2343 M -28 17 V .06 g 1719 2360 M -3 2 V .06 g 1716 2362 M -24 14 V .06 g 1692 2376 M -9 6 V .06 g 1683 2382 M -18 10 V .06 g 1665 2392 M -17 10 V .06 g 1648 2402 M -10 6 V .06 g 1638 2408 M -23 14 V .06 g 1615 2422 M -5 3 V .06 g 1610 2425 M -27 16 V .06 g 1583 2441 M -1 1 V .06 g 1582 2442 M -26 17 V .06 g 1556 2459 M -5 3 V .06 g 1551 2462 M -22 15 V .06 g 1529 2477 M -8 6 V .06 g 1521 2483 M -20 14 V .06 g 1501 2497 M -7 6 V .06 g 1494 2503 M -20 15 V .06 g 1474 2518 M -6 5 V .06 g 1468 2523 M -21 17 V .06 g 1447 2540 M -4 3 V .06 g 1443 2543 M -23 20 V .06 g .06 g 1420 2563 M -22 20 V stroke 1398 2583 M .06 g 1398 2583 M -6 6 V .06 g 1392 2589 M -14 15 V .06 g 1378 2604 M -13 12 V .06 g 1365 2616 M -7 8 V .06 g 1358 2624 M -19 20 V .06 g 1339 2644 M -1 1 V .06 g 1338 2645 M -17 19 V .06 g 1321 2664 M -10 12 V .06 g 1311 2676 M -7 8 V .06 g 1304 2684 M -17 20 V .06 g 1287 2704 M -4 5 V .06 g 1283 2709 M -11 15 V .06 g 1272 2724 M -16 20 V .06 g 1256 2744 M 0 1 V .06 g 1256 2745 M -15 20 V .06 g 1241 2765 M -12 17 V .06 g 1229 2782 M -2 3 V .06 g 1227 2785 M -14 20 V .06 g 1213 2805 M -11 16 V .06 g 1202 2821 M -3 4 V .06 g 1199 2825 M -13 20 V .06 g 1186 2845 M -12 18 V .06 g 1174 2863 M -1 3 V 0 g .06 g 3534 1132 M .06 g 3534 1132 M -16 -7 V .06 g 3518 1125 M -26 -13 V .06 g 3492 1112 M -1 -1 V .06 g 3491 1111 M -28 -15 V .06 g 3463 1096 M -7 -4 V .06 g 3456 1092 M -20 -11 V .06 g 3436 1081 M -15 -9 V .06 g 3421 1072 M -12 -8 V .06 g 3409 1064 M -21 -12 V .06 g 3388 1052 M -6 -4 V .06 g 3382 1048 M -27 -17 V .06 g 3355 1031 M -1 0 V .06 g 3354 1031 M -27 -17 V .06 g 3327 1014 M -5 -3 V .06 g 3322 1011 M -22 -13 V .06 g 3300 998 M -13 -7 V .06 g 3287 991 M -14 -8 V .06 g 3273 983 M -23 -12 V .06 g 3250 971 M -5 -2 V .06 g 3245 969 M -27 -14 V .06 g 3218 955 M -10 -4 V .06 g 3208 951 M -17 -8 V .06 g 3191 943 M -27 -11 V .06 g 3164 932 M -5 -1 V .06 g 3159 931 M -23 -8 V .06 g 3136 923 M -27 -8 V .06 g 3109 915 M -22 -5 V .06 g 3087 910 M -5 -1 V .06 g 3082 909 M -27 -4 V stroke 3055 905 M .06 g 3055 905 M -28 -2 V .06 g 3027 903 M -27 0 V .06 g 3000 903 M -27 2 V .06 g 2973 905 M -27 5 V .06 g 2946 910 M -4 0 V .06 g 2942 910 M -24 6 V .06 g 2918 916 M -27 9 V .06 g 2891 925 M -15 6 V .06 g 2876 931 M -12 5 V .06 g 2864 936 M -27 13 V .06 g 2837 949 M -4 2 V .06 g 2833 951 M -24 13 V .06 g 2809 964 M -10 7 V .06 g 2799 971 M -17 11 V .06 g 2782 982 M -12 9 V .06 g 2770 991 M -15 11 V .06 g 2755 1002 M -11 9 V .06 g 2744 1011 M -16 14 V .06 g 2728 1025 M -8 6 V .06 g 2720 1031 M -20 18 V .06 g 2700 1049 M -2 3 V .06 g 2698 1052 M -20 20 V .06 g 2678 1072 M -5 4 V .06 g 2673 1076 M -15 16 V .06 g 2658 1092 M -12 13 V .06 g 2646 1105 M -6 7 V .06 g 2640 1112 M -18 20 V .06 g 2622 1132 M -3 4 V .06 g 2619 1136 M -14 16 V .06 g 2605 1152 M -14 17 V .06 g 2591 1169 M -2 3 V .06 g 2589 1172 M -16 21 V .06 g 2573 1193 M -9 12 V .06 g 2564 1205 M -6 8 V .06 g 2558 1213 M -15 20 V .06 g 2543 1233 M -6 9 V .06 g 2537 1242 M -8 11 V .06 g 2529 1253 M -15 20 V .06 g 2514 1273 M -4 7 V .06 g 2510 1280 M -9 13 V .06 g 2501 1293 M -14 21 V .06 g 2487 1314 M -5 7 V .06 g 2482 1321 M -8 13 V .06 g 2474 1334 M -13 20 V .06 g 2461 1354 M -6 9 V .06 g 2455 1363 M -7 11 V .06 g 2448 1374 M -13 20 V .06 g 2435 1394 M -7 12 V .06 g 2428 1406 M -5 8 V .06 g 2423 1414 M -13 21 V .06 g 2410 1435 M -9 16 V .06 g 2401 1451 M -3 4 V stroke 2398 1455 M .06 g 2398 1455 M -12 20 V .06 g 2386 1475 M -12 20 V .06 g 2374 1495 M -1 2 V .06 g 2373 1497 M -11 18 V .06 g 2362 1515 M -11 20 V .06 g 2351 1535 M -5 8 V .06 g 2346 1543 M -7 12 V .06 g 2339 1555 M -12 21 V .06 g 2327 1576 M -8 15 V .06 g 2319 1591 M -3 5 V .06 g 2316 1596 M -12 20 V .06 g 2304 1616 M -11 20 V .06 g 2293 1636 M -1 2 V .06 g 2292 1638 M -11 18 V .06 g 2281 1656 M -11 20 V .06 g 2270 1676 M -6 11 V .06 g 2264 1687 M -5 10 V 0 g .06 g 5002 1596 M .06 g 5002 1596 M -12 -20 V .06 g 4990 1576 M -1 -2 V .06 g 4989 1574 M -10 -19 V .06 g 4979 1555 M -12 -20 V .06 g 4967 1535 M -5 -8 V .06 g 4962 1527 M -7 -12 V .06 g 4955 1515 M -12 -20 V .06 g 4943 1495 M -8 -15 V .06 g 4935 1480 M -4 -5 V .06 g 4931 1475 M -12 -20 V .06 g 4919 1455 M -11 -20 V .06 g 4908 1435 M -1 0 V .06 g 4907 1435 M -12 -21 V .06 g 4895 1414 M -13 -20 V .06 g 4882 1394 M -2 -3 V .06 g 4880 1391 M -11 -17 V .06 g 4869 1374 M -13 -20 V .06 g 4856 1354 M -3 -5 V .06 g 4853 1349 M -10 -15 V .06 g 4843 1334 M -14 -20 V .06 g 4829 1314 M -3 -5 V .06 g 4826 1309 M -11 -16 V .06 g 4815 1293 M -14 -20 V .06 g 4801 1273 M -2 -3 V .06 g 4799 1270 M -13 -17 V .06 g 4786 1253 M -14 -20 V .06 g 4772 1233 M -1 0 V .06 g 4771 1233 M -15 -20 V .06 g 4756 1213 M -12 -15 V .06 g 4744 1198 M -4 -5 V .06 g 4740 1193 M -17 -21 V .06 g 4723 1172 M -6 -8 V .06 g 4717 1164 M -11 -12 V .06 g 4706 1152 M -16 -19 V .06 g 4690 1133 M -2 -1 V stroke 4688 1132 M .06 g 4688 1132 M -19 -20 V .06 g 4669 1112 M -7 -7 V .06 g 4662 1105 M -13 -13 V .06 g 4649 1092 M -14 -14 V .06 g 4635 1078 M -7 -6 V .06 g 4628 1072 M -20 -19 V .06 g 4608 1053 M -3 -1 V .06 g 4605 1052 M -24 -21 V .06 g .06 g 4581 1031 M -28 -20 V .06 g .06 g 4553 1011 M -27 -17 V .06 g 4526 994 M -5 -3 V .06 g 4521 991 M -22 -12 V .06 g 4499 979 M -16 -8 V .06 g 4483 971 M -11 -5 V .06 g 4472 966 M -28 -11 V .06 g 4444 955 M -13 -4 V .06 g 4431 951 M -14 -5 V .06 g 4417 946 M -27 -6 V .06 g 4390 940 M -27 -4 V .06 g 4363 936 M -28 -2 V .06 g 4335 934 M -27 0 V .06 g 4308 934 M -27 2 V .06 g 4281 936 M -27 4 V .06 g 4254 940 M -28 6 V .06 g 4226 946 M -17 5 V .06 g 4209 951 M -10 2 V .06 g 4199 953 M -27 10 V .06 g 4172 963 M -22 8 V .06 g 4150 971 M -5 2 V .06 g 4145 973 M -28 12 V .06 g 4117 985 M -14 6 V .06 g 4103 991 M -13 7 V .06 g 4090 998 M -27 13 V .06 g 4063 1011 M -27 15 V .06 g 4036 1026 M -11 5 V .06 g 4025 1031 M -17 10 V .06 g 4008 1041 M -19 11 V .06 g 3989 1052 M -8 4 V .06 g 3981 1056 M -27 16 V .06 g .06 g 3954 1072 M -27 15 V .06 g 3927 1087 M -10 5 V .06 g 3917 1092 M -18 10 V .06 g 3899 1102 M -20 10 V .06 g 3879 1112 M -7 3 V .06 g 3872 1115 M -27 13 V .06 g 3845 1128 M -10 4 V .06 g 3835 1132 M -17 8 V .06 g 3818 1140 M -28 10 V .06 g 3790 1150 M -10 2 V .06 g 3780 1152 M -17 5 V .06 g 3763 1157 M -27 6 V .06 g 3736 1163 M -27 4 V stroke 3709 1167 M .06 g 3709 1167 M -28 1 V .06 g 3681 1168 M -27 -2 V .06 g 3654 1166 M -27 -4 V .06 g 3627 1162 M -27 -6 V .06 g 3600 1156 M -12 -4 V .06 g 3588 1152 M -16 -4 V .06 g 3572 1148 M -27 -11 V .06 g 3545 1137 M -11 -5 V 0 g .06 g 6052 2799 M .06 g 6052 2799 M -12 -14 V .06 g 6040 2785 M -15 -19 V .06 g 6025 2766 M -1 -1 V .06 g 6024 2765 M -18 -20 V .06 g 6006 2745 M -8 -10 V .06 g 5998 2735 M -10 -11 V .06 g 5988 2724 M -18 -18 V .06 g 5970 2706 M -1 -2 V .06 g 5969 2704 M -21 -20 V .06 g 5948 2684 M -5 -5 V .06 g 5943 2679 M -16 -15 V .06 g 5927 2664 M -11 -11 V .06 g 5916 2653 M -11 -9 V .06 g 5905 2644 M -16 -15 V .06 g 5889 2629 M -7 -5 V .06 g 5882 2624 M -21 -17 V .06 g 5861 2607 M -4 -3 V .06 g 5857 2604 M -23 -19 V .06 g 5834 2585 M -3 -2 V .06 g 5831 2583 M -24 -18 V .06 g 5807 2565 M -3 -2 V .06 g 5804 2563 M -24 -17 V .06 g 5780 2546 M -5 -3 V .06 g 5775 2543 M -23 -15 V .06 g 5752 2528 M -8 -5 V .06 g 5744 2523 M -19 -13 V .06 g 5725 2510 M -12 -7 V .06 g 5713 2503 M -15 -10 V .06 g 5698 2493 M -17 -10 V .06 g 5681 2483 M -10 -7 V .06 g 5671 2476 M -21 -14 V .06 g 5650 2462 M -7 -4 V .06 g 5643 2458 M -24 -16 V .06 g 5619 2442 M -3 -2 V .06 g 5616 2440 M -26 -18 V .06 g 5590 2422 M -1 -1 V .06 g 5589 2421 M -27 -19 V .06 g .06 g 5562 2402 M -26 -20 V .06 g 5536 2382 M -2 -1 V .06 g 5534 2381 M -23 -19 V .06 g 5511 2362 M -4 -4 V .06 g 5507 2358 M -19 -17 V .06 g 5488 2341 M -8 -7 V .06 g 5480 2334 M -13 -13 V stroke 5467 2321 M .06 g 5467 2321 M -14 -14 V .06 g 5453 2307 M -6 -6 V .06 g 5447 2301 M -19 -20 V .06 g 5428 2281 M -3 -3 V .06 g 5425 2278 M -15 -17 V .06 g 5410 2261 M -12 -14 V .06 g 5398 2247 M -5 -6 V .06 g 5393 2241 M -16 -20 V .06 g 5377 2221 M -6 -8 V .06 g 5371 2213 M -10 -13 V .06 g 5361 2200 M -15 -20 V .06 g 5346 2180 M -2 -3 V .06 g 5344 2177 M -12 -17 V .06 g 5332 2160 M -15 -20 V .06 g 5317 2140 M -1 -2 V .06 g 5316 2138 M -12 -18 V .06 g 5304 2120 M -14 -20 V .06 g 5290 2100 M -1 -3 V .06 g 5289 2097 M -11 -18 V .06 g 5278 2079 M -13 -20 V .06 g 5265 2059 M -3 -4 V .06 g 5262 2055 M -10 -16 V .06 g 5252 2039 M -12 -20 V .06 g 5240 2019 M -5 -9 V .06 g 5235 2010 M -7 -11 V .06 g 5228 1999 M -12 -20 V .06 g 5216 1979 M -9 -15 V .06 g 5207 1964 M -3 -5 V .06 g 5204 1959 M -11 -21 V .06 g 5193 1938 M -12 -20 V .06 g 5181 1918 M -1 -2 V .06 g 5180 1916 M -10 -18 V .06 g 5170 1898 M -12 -20 V .06 g 5158 1878 M -5 -10 V .06 g 5153 1868 M -6 -10 V .06 g 5147 1858 M -11 -20 V .06 g 5136 1838 M -10 -19 V .06 g 5126 1819 M -1 -2 V .06 g 5125 1817 M -11 -20 V .06 g 5114 1797 M -12 -20 V .06 g 5102 1777 M -4 -7 V .06 g 5098 1770 M -7 -13 V .06 g 5091 1757 M -11 -20 V .06 g 5080 1737 M -9 -17 V .06 g 5071 1720 M -2 -3 V .06 g 5069 1717 M -11 -20 V .06 g 5058 1697 M -11 -21 V .06 g 5047 1676 M -3 -5 V .06 g 5044 1671 M -9 -15 V .06 g 5035 1656 M -11 -20 V .06 g 5024 1636 M -7 -14 V .06 g 5017 1622 M -4 -6 V stroke 5013 1616 M .06 g 5013 1616 M -11 -20 V 0 g .04 g 1708 3551 M .04 g 1708 3551 M -8 20 V .04 g 1700 3571 M -7 20 V .04 g 1693 3591 M -1 3 V .04 g 1692 3594 M -6 17 V .04 g 1686 3611 M -8 20 V .04 g 1678 3631 M -7 21 V .04 g 1671 3652 M -6 16 V .04 g 1665 3668 M -2 4 V .04 g 1663 3672 M -7 20 V .04 g 1656 3692 M -7 20 V .04 g 1649 3712 M -8 20 V .04 g 1641 3732 M -3 10 V .04 g 1638 3742 M -4 10 V .04 g 1634 3752 M -8 20 V .04 g 1626 3772 M -7 21 V .04 g 1619 3793 M -8 20 V .04 g 1611 3813 M -1 2 V .04 g 1610 3815 M -6 18 V .04 g 1604 3833 M -8 20 V .04 g 1596 3853 M -7 20 V .04 g 1589 3873 M -6 15 V .04 g 1583 3888 M -2 5 V .04 g 1581 3893 M -8 21 V .04 g 1573 3914 M -7 20 V .04 g 1566 3934 M -8 20 V .04 g 1558 3954 M -2 6 V .04 g 1556 3960 M -6 14 V .04 g 1550 3974 M -7 20 V .04 g 1543 3994 M -8 20 V .04 g 1535 4014 M -6 17 V .04 g 1529 4031 M -2 4 V .04 g 1527 4035 M -8 20 V .04 g 1519 4055 M -8 20 V .04 g 1511 4075 M -7 20 V .04 g 1504 4095 M -3 6 V .04 g 1501 4101 M -5 14 V .04 g 1496 4115 M -8 20 V .04 g 1488 4135 M -8 20 V .04 g 1480 4155 M -6 15 V .04 g 1474 4170 M -2 6 V .04 g 1472 4176 M -8 20 V .04 g 1464 4196 M -8 20 V .04 g 1456 4216 M -8 20 V .04 g 1448 4236 M -1 2 V .04 g 1447 4238 M -8 18 V .04 g 1439 4256 M -8 20 V .04 g 1431 4276 M -8 21 V .04 g 1423 4297 M -3 8 V .04 g 1420 4305 M -6 12 V .04 g 1414 4317 M -8 20 V .04 g 1406 4337 M -8 20 V stroke 1398 4357 M .04 g 1398 4357 M -6 13 V .04 g 1392 4370 M -3 7 V .04 g 1389 4377 M -8 20 V .04 g 1381 4397 M -9 20 V .04 g 1372 4417 M -7 17 V .04 g 1365 4434 M -2 4 V .04 g 1363 4438 M -8 20 V .04 g 1355 4458 M -9 20 V .04 g 1346 4478 M -8 19 V .04 g 1338 4497 M -1 1 V .04 g 1337 4498 M -9 20 V .04 g 1328 4518 M -9 20 V .04 g 1319 4538 M -8 20 V .04 g 1311 4558 M -1 1 V .04 g 1310 4559 M -9 20 V .04 g 1301 4579 M -9 20 V .04 g 1292 4599 M -9 18 V .04 g 1283 4617 M 0 2 V 0 g .04 g 3023 2785 M .04 g 3023 2785 M -21 20 V .04 g 3002 2805 M -2 2 V .04 g 3000 2807 M -19 18 V .04 g 2981 2825 M -8 8 V .04 g 2973 2833 M -14 12 V .04 g 2959 2845 M -13 12 V .04 g 2946 2857 M -11 9 V .04 g 2935 2866 M -17 14 V .04 g 2918 2880 M -8 6 V .04 g 2910 2886 M -19 14 V .04 g 2891 2900 M -8 6 V .04 g 2883 2906 M -19 14 V .04 g 2864 2920 M -10 6 V .04 g 2854 2926 M -17 11 V .04 g 2837 2937 M -16 9 V .04 g 2821 2946 M -12 7 V .04 g 2809 2953 M -25 13 V .04 g 2784 2966 M -2 1 V .04 g 2782 2967 M -27 13 V .04 g 2755 2980 M -17 6 V .04 g 2738 2986 M -10 5 V .04 g 2728 2991 M -28 9 V .04 g 2700 3000 M -24 7 V .04 g 2676 3007 M -3 1 V .04 g 2673 3008 M -27 6 V .04 g 2646 3014 M -27 4 V .04 g 2619 3018 M -28 3 V .04 g 2591 3021 M -27 2 V .04 g 2564 3023 M -27 0 V .04 g 2537 3023 M -27 -1 V .04 g 2510 3022 M -28 -3 V .04 g 2482 3019 M -27 -4 V .04 g 2455 3015 M -27 -4 V .04 g 2428 3011 M -19 -4 V stroke 2409 3007 M .04 g 2409 3007 M -8 -2 V .04 g 2401 3005 M -28 -7 V .04 g 2373 2998 M -27 -8 V .04 g 2346 2990 M -12 -4 V .04 g 2334 2986 M -15 -5 V .04 g 2319 2981 M -27 -9 V .04 g 2292 2972 M -18 -6 V .04 g 2274 2966 M -10 -4 V .04 g 2264 2962 M -27 -10 V .04 g 2237 2952 M -17 -6 V .04 g 2220 2946 M -10 -4 V .04 g 2210 2942 M -27 -10 V .04 g 2183 2932 M -17 -6 V .04 g 2166 2926 M -11 -4 V .04 g 2155 2922 M -27 -10 V .04 g 2128 2912 M -22 -6 V .04 g 2106 2906 M -5 -2 V .04 g 2101 2904 M -27 -7 V .04 g 2074 2897 M -28 -3 V .04 g 2046 2894 M -27 2 V .04 g 2019 2896 M -23 10 V .04 g 1996 2906 M -4 2 V .04 g 1992 2908 M -21 18 V .04 g 1971 2926 M -6 6 V .04 g 1965 2932 M -11 14 V .04 g 1954 2946 M -13 20 V .04 g 1941 2966 M -4 6 V .04 g 1937 2972 M -7 14 V .04 g 1930 2986 M -11 21 V .04 g 1919 3007 M -9 18 V .04 g 1910 3025 M -1 2 V .04 g 1909 3027 M -9 20 V .04 g 1900 3047 M -9 20 V .04 g 1891 3067 M -8 20 V .04 g .04 g 1883 3087 M -9 20 V .04 g 1874 3107 M -8 21 V .04 g 1866 3128 M -8 20 V .04 g 1858 3148 M -2 6 V .04 g 1856 3154 M -6 14 V .04 g 1850 3168 M -8 20 V .04 g 1842 3188 M -7 20 V .04 g 1835 3208 M -7 17 V .04 g 1828 3225 M -1 3 V .04 g 1827 3228 M -8 20 V .04 g 1819 3248 M -7 21 V .04 g 1812 3269 M -8 20 V .04 g 1804 3289 M -3 8 V .04 g 1801 3297 M -4 12 V .04 g 1797 3309 M -8 20 V .04 g 1789 3329 M -7 20 V .04 g 1782 3349 M -8 20 V .04 g 1774 3369 M 0 2 V stroke 1774 3371 M .04 g 1774 3371 M -7 19 V .04 g 1767 3390 M -8 20 V .04 g 1759 3410 M -7 20 V .04 g 1752 3430 M -5 15 V .04 g 1747 3445 M -2 5 V .04 g 1745 3450 M -8 20 V .04 g 1737 3470 M -7 20 V .04 g 1730 3490 M -7 20 V .04 g 1723 3510 M -4 9 V .04 g 1719 3519 M -4 12 V .04 g 1715 3531 M -7 20 V 0 g .04 g 3993 2362 M .04 g 3993 2362 M -12 -20 V .04 g 3981 2342 M 0 -1 V .04 g 3981 2341 M -13 -20 V .04 g 3968 2321 M -13 -20 V .04 g 3955 2301 M -1 -2 V .04 g 3954 2299 M -12 -18 V .04 g 3942 2281 M -13 -20 V .04 g 3929 2261 M -2 -5 V .04 g 3927 2256 M -11 -15 V .04 g 3916 2241 M -12 -20 V .04 g 3904 2221 M -5 -8 V .04 g 3899 2213 M -8 -13 V .04 g 3891 2200 M -13 -20 V .04 g 3878 2180 M -6 -10 V .04 g 3872 2170 M -7 -10 V .04 g 3865 2160 M -13 -20 V .04 g 3852 2140 M -7 -12 V .04 g 3845 2128 M -6 -8 V .04 g 3839 2120 M -13 -20 V .04 g 3826 2100 M -8 -13 V .04 g 3818 2087 M -6 -8 V .04 g 3812 2079 M -14 -20 V .04 g 3798 2059 M -8 -12 V .04 g 3790 2047 M -6 -8 V .04 g 3784 2039 M -15 -20 V .04 g 3769 2019 M -6 -9 V .04 g 3763 2010 M -11 -11 V .04 g 3752 1999 M -16 -20 V .04 g 3736 1979 M -1 0 V .04 g 3735 1979 M -23 -20 V .04 g 3712 1959 M -3 -3 V .04 g 3709 1956 M -28 -11 V .04 g 3681 1945 M -27 4 V .04 g 3654 1949 M -13 10 V .04 g 3641 1959 M -14 8 V .04 g 3627 1967 M -10 12 V .04 g 3617 1979 M -17 17 V .04 g 3600 1996 M -3 3 V .04 g 3597 1999 M -16 20 V .04 g 3581 2019 M -9 10 V .04 g 3572 2029 M -6 10 V stroke 3566 2039 M .04 g 3566 2039 M -15 20 V .04 g 3551 2059 M -6 8 V .04 g 3545 2067 M -8 12 V .04 g 3537 2079 M -14 21 V .04 g 3523 2100 M -5 6 V .04 g 3518 2106 M -9 14 V .04 g 3509 2120 M -13 20 V .04 g 3496 2140 M -5 7 V .04 g 3491 2147 M -9 13 V .04 g 3482 2160 M -13 20 V .04 g 3469 2180 M -6 9 V .04 g 3463 2189 M -7 11 V .04 g 3456 2200 M -13 21 V .04 g 3443 2221 M -7 9 V .04 g 3436 2230 M -7 11 V .04 g 3429 2241 M -13 20 V .04 g 3416 2261 M -7 11 V .04 g 3409 2272 M -6 9 V .04 g 3403 2281 M -13 20 V .04 g 3390 2301 M -8 13 V .04 g 3382 2314 M -5 7 V .04 g 3377 2321 M -14 20 V .04 g 3363 2341 M -9 14 V .04 g 3354 2355 M -4 7 V .04 g 3350 2362 M -13 20 V .04 g 3337 2382 M -10 14 V .04 g 3327 2396 M -4 6 V .04 g 3323 2402 M -14 20 V .04 g 3309 2422 M -9 14 V .04 g 3300 2436 M -5 6 V .04 g 3295 2442 M -14 20 V .04 g 3281 2462 M -8 13 V .04 g 3273 2475 M -6 8 V .04 g 3267 2483 M -14 20 V .04 g 3253 2503 M -8 11 V .04 g 3245 2514 M -6 9 V .04 g 3239 2523 M -15 20 V .04 g 3224 2543 M -6 8 V .04 g 3218 2551 M -9 12 V .04 g 3209 2563 M -15 20 V .04 g 3194 2583 M -3 5 V .04 g 3191 2588 M -12 16 V .04 g 3179 2604 M -15 19 V .04 g 3164 2623 M -1 1 V .04 g 3163 2624 M -16 20 V .04 g 3147 2644 M -11 13 V .04 g 3136 2657 M -5 7 V .04 g 3131 2664 M -17 20 V .04 g 3114 2684 M -5 6 V .04 g 3109 2690 M -12 14 V .04 g 3097 2704 M -15 18 V .04 g 3082 2722 M -3 2 V stroke 3079 2724 M .04 g 3079 2724 M -18 21 V .04 g 3061 2745 M -6 7 V .04 g 3055 2752 M -13 13 V .04 g 3042 2765 M -15 15 V .04 g 3027 2780 M -4 5 V 0 g .04 g 5425 3071 M .04 g 5425 3071 M -2 -4 V .04 g 5423 3067 M -11 -20 V .04 g 5412 3047 M -13 -20 V .04 g 5399 3027 M -1 -2 V .04 g 5398 3025 M -15 -18 V .04 g 5383 3007 M -12 -13 V .04 g 5371 2994 M -12 -8 V .04 g 5359 2986 M -15 -9 V .04 g 5344 2977 M -28 -6 V .04 g 5316 2971 M -27 1 V .04 g 5289 2972 M -27 4 V .04 g 5262 2976 M -27 7 V .04 g 5235 2983 M -13 3 V .04 g 5222 2986 M -15 4 V .04 g 5207 2990 M -27 9 V .04 g 5180 2999 M -22 8 V .04 g 5158 3007 M -5 1 V .04 g 5153 3008 M -27 9 V .04 g 5126 3017 M -28 9 V .04 g 5098 3026 M -2 1 V .04 g 5096 3027 M -25 8 V .04 g 5071 3035 M -27 8 V .04 g 5044 3043 M -15 4 V .04 g 5029 3047 M -12 3 V .04 g 5017 3050 M -28 7 V .04 g 4989 3057 M -27 6 V .04 g 4962 3063 M -22 4 V .04 g 4940 3067 M -5 1 V .04 g 4935 3068 M -27 4 V .04 g 4908 3072 M -28 3 V .04 g 4880 3075 M -27 1 V .04 g 4853 3076 M -27 1 V .04 g 4826 3077 M -27 -1 V .04 g 4799 3076 M -28 -3 V .04 g 4771 3073 M -27 -3 V .04 g 4744 3070 M -13 -3 V .04 g 4731 3067 M -14 -3 V .04 g 4717 3064 M -27 -7 V .04 g 4690 3057 M -28 -8 V .04 g 4662 3049 M -6 -2 V .04 g 4656 3047 M -21 -8 V .04 g 4635 3039 M -27 -12 V .04 g 4608 3027 M -2 0 V .04 g 4606 3027 M -25 -13 V .04 g 4581 3014 M -14 -7 V .04 g 4567 3007 M -14 -8 V .04 g 4553 2999 M -21 -13 V stroke 4532 2986 M .04 g 4532 2986 M -6 -3 V .04 g 4526 2983 M -24 -17 V .04 g 4502 2966 M -3 -2 V .04 g 4499 2964 M -25 -18 V .04 g 4474 2946 M -2 -1 V .04 g 4472 2945 M -24 -19 V .04 g 4448 2926 M -4 -3 V .04 g 4444 2923 M -20 -17 V .04 g 4424 2906 M -7 -6 V .04 g 4417 2900 M -15 -14 V .04 g 4402 2886 M -12 -11 V .04 g 4390 2875 M -10 -9 V .04 g 4380 2866 M -17 -17 V .04 g 4363 2849 M -4 -4 V .04 g 4359 2845 M -19 -20 V .04 g 4340 2825 M -5 -4 V .04 g 4335 2821 M -14 -16 V .04 g 4321 2805 M -13 -14 V .04 g 4308 2791 M -6 -6 V .04 g 4302 2785 M -17 -20 V .04 g 4285 2765 M -4 -5 V .04 g 4281 2760 M -14 -15 V .04 g 4267 2745 M -13 -17 V .04 g 4254 2728 M -3 -4 V .04 g 4251 2724 M -17 -20 V .04 g 4234 2704 M -8 -10 V .04 g 4226 2694 M -8 -10 V .04 g 4218 2684 M -15 -20 V .04 g 4203 2664 M -4 -5 V .04 g 4199 2659 M -12 -15 V .04 g 4187 2644 M -15 -20 V .04 g 4172 2624 M 0 -1 V .04 g 4172 2623 M -15 -19 V .04 g 4157 2604 M -12 -18 V .04 g 4145 2586 M -2 -3 V .04 g 4143 2583 M -15 -20 V .04 g 4128 2563 M -11 -16 V .04 g 4117 2547 M -3 -4 V .04 g 4114 2543 M -14 -20 V .04 g 4100 2523 M -10 -15 V .04 g 4090 2508 M -3 -5 V .04 g 4087 2503 M -14 -20 V .04 g 4073 2483 M -10 -16 V .04 g 4063 2467 M -4 -5 V .04 g 4059 2462 M -13 -20 V .04 g 4046 2442 M -10 -16 V .04 g 4036 2426 M -3 -4 V .04 g 4033 2422 M -13 -20 V .04 g 4020 2402 M -12 -18 V .04 g 4008 2384 M -1 -2 V .04 g 4007 2382 M -14 -20 V 0 g .04 g 6021 4619 M .04 g 6021 4619 M -9 -20 V stroke 6012 4599 M .04 g 6012 4599 M -8 -20 V .04 g 6004 4579 M -6 -14 V .04 g 5998 4565 M -3 -6 V .04 g 5995 4559 M -8 -21 V .04 g 5987 4538 M -9 -20 V .04 g 5978 4518 M -8 -18 V .04 g 5970 4500 M 0 -2 V .04 g 5970 4498 M -9 -20 V .04 g 5961 4478 M -8 -20 V .04 g 5953 4458 M -8 -20 V .04 g 5945 4438 M -2 -4 V .04 g 5943 4434 M -6 -17 V .04 g 5937 4417 M -9 -20 V .04 g 5928 4397 M -8 -20 V .04 g 5920 4377 M -4 -11 V .04 g 5916 4366 M -4 -9 V .04 g 5912 4357 M -8 -20 V .04 g 5904 4337 M -8 -20 V .04 g 5896 4317 M -7 -20 V .04 g 5889 4297 M -1 0 V .04 g 5888 4297 M -8 -21 V .04 g 5880 4276 M -7 -20 V .04 g 5873 4256 M -8 -20 V .04 g 5865 4236 M -4 -9 V .04 g 5861 4227 M -4 -11 V .04 g 5857 4216 M -8 -20 V .04 g 5849 4196 M -8 -20 V .04 g 5841 4176 M -7 -20 V .04 g 5834 4156 M 0 -1 V .04 g 5834 4155 M -8 -20 V .04 g 5826 4135 M -8 -20 V .04 g 5818 4115 M -7 -20 V .04 g 5811 4095 M -4 -11 V .04 g 5807 4084 M -4 -9 V .04 g 5803 4075 M -7 -20 V .04 g 5796 4055 M -8 -20 V .04 g 5788 4035 M -7 -21 V .04 g 5781 4014 M -1 -3 V .04 g 5780 4011 M -7 -17 V .04 g 5773 3994 M -7 -20 V .04 g 5766 3974 M -8 -20 V .04 g 5758 3954 M -6 -16 V .04 g 5752 3938 M -1 -4 V .04 g 5751 3934 M -8 -20 V .04 g 5743 3914 M -7 -21 V .04 g 5736 3893 M -7 -20 V .04 g 5729 3873 M -4 -10 V .04 g 5725 3863 M -4 -10 V .04 g 5721 3853 M -7 -20 V .04 g 5714 3833 M -7 -20 V .04 g 5707 3813 M -8 -20 V .04 g 5699 3793 M -1 -5 V stroke 5698 3788 M .04 g 5698 3788 M -6 -16 V .04 g 5692 3772 M -7 -20 V .04 g 5685 3752 M -8 -20 V .04 g 5677 3732 M -6 -19 V .04 g 5671 3713 M -1 -1 V .04 g 5670 3712 M -7 -20 V .04 g 5663 3692 M -7 -20 V .04 g 5656 3672 M -8 -20 V .04 g 5648 3652 M -5 -15 V .04 g 5643 3637 M -2 -6 V .04 g 5641 3631 M -7 -20 V .04 g 5634 3611 M -7 -20 V .04 g 5627 3591 M -8 -20 V .04 g 5619 3571 M -3 -10 V .04 g 5616 3561 M -4 -10 V .04 g 5612 3551 M -7 -20 V .04 g 5605 3531 M -7 -21 V .04 g 5598 3510 M -8 -20 V .04 g 5590 3490 M -1 -4 V .04 g 5589 3486 M -6 -16 V .04 g 5583 3470 M -7 -20 V .04 g 5576 3450 M -8 -20 V .04 g 5568 3430 M -6 -19 V .04 g 5562 3411 M -1 -1 V .04 g 5561 3410 M -7 -20 V .04 g 5554 3390 M -8 -21 V .04 g 5546 3369 M -7 -20 V .04 g 5539 3349 M -5 -13 V .04 g 5534 3336 M -3 -7 V .04 g 5531 3329 M -7 -20 V .04 g 5524 3309 M -8 -20 V .04 g 5516 3289 M -7 -20 V .04 g 5509 3269 M -2 -5 V .04 g 5507 3264 M -6 -16 V .04 g 5501 3248 M -8 -20 V .04 g 5493 3228 M -8 -20 V .04 g 5485 3208 M -5 -14 V .04 g 5480 3194 M -3 -6 V .04 g 5477 3188 M -8 -20 V .04 g 5469 3168 M -8 -20 V .04 g 5461 3148 M -8 -19 V .04 g 5453 3129 M -1 -1 V .04 g 5452 3128 M -9 -21 V .04 g 5443 3107 M -10 -20 V .04 g 5433 3087 M -8 -16 V 0 g .04 g 739 4075 M .04 g 739 4075 M -1 2 V .04 g 738 4077 M -6 18 V .04 g 732 4095 M -6 20 V .04 g 726 4115 M -7 20 V .04 g 719 4135 M -6 20 V .04 g 713 4155 M -2 6 V .04 g 711 4161 M -5 15 V stroke 706 4176 M .04 g 706 4176 M -6 20 V .04 g 700 4196 M -6 20 V .04 g 694 4216 M -7 20 V .04 g 687 4236 M -3 11 V .04 g 684 4247 M -3 9 V .04 g 681 4256 M -6 20 V .04 g 675 4276 M -7 21 V .04 g 668 4297 M -6 20 V .04 g 662 4317 M -5 18 V .04 g 657 4335 M -1 2 V .04 g 656 4337 M -6 20 V .04 g 650 4357 M -6 20 V .04 g 644 4377 M -6 20 V .04 g 638 4397 M -7 20 V .04 g 631 4417 M -2 8 V .04 g 629 4425 M -4 13 V .04 g 625 4438 M -5 20 V .04 g 620 4458 M -6 20 V .04 g 614 4478 M -7 20 V .04 g 607 4498 M -5 18 V 0 g .04 g 1583 2722 M .04 g 1583 2722 M -8 2 V .04 g 1575 2724 M -19 6 V .04 g 1556 2730 M -27 9 V .04 g 1529 2739 M -14 6 V .04 g 1515 2745 M -14 5 V .04 g 1501 2750 M -27 13 V .04 g 1474 2763 M -2 2 V .04 g 1472 2765 M -25 14 V .04 g 1447 2779 M -9 6 V .04 g 1438 2785 M -18 12 V .04 g 1420 2797 M -11 8 V .04 g 1409 2805 M -17 12 V .04 g 1392 2817 M -10 8 V .04 g 1382 2825 M -17 14 V .04 g 1365 2839 M -6 6 V .04 g 1359 2845 M -21 19 V .04 g 1338 2864 M -1 2 V .04 g 1337 2866 M -20 20 V .04 g 1317 2886 M -6 6 V .04 g 1311 2892 M -13 14 V .04 g 1298 2906 M -15 16 V .04 g 1283 2922 M -3 4 V .04 g 1280 2926 M -17 20 V .04 g 1263 2946 M -7 9 V .04 g 1256 2955 M -9 11 V .04 g 1247 2966 M -16 20 V .04 g 1231 2986 M -2 4 V .04 g 1229 2990 M -12 17 V .04 g 1217 3007 M -15 20 V .04 g 1202 3027 M 0 1 V .04 g 1202 3028 M -13 19 V .04 g 1189 3047 M -14 20 V stroke 1175 3067 M .04 g 1175 3067 M -1 1 V .04 g 1174 3068 M -11 19 V .04 g 1163 3087 M -13 20 V .04 g 1150 3107 M -3 5 V .04 g 1147 3112 M -9 16 V .04 g 1138 3128 M -12 20 V .04 g 1126 3148 M -6 10 V .04 g 1120 3158 M -6 10 V .04 g 1114 3168 M -11 20 V .04 g 1103 3188 M -10 18 V .04 g 1093 3206 M -2 2 V .04 g 1091 3208 M -10 20 V .04 g 1081 3228 M -11 20 V .04 g 1070 3248 M -5 10 V .04 g 1065 3258 M -5 11 V .04 g 1060 3269 M -10 20 V .04 g 1050 3289 M -11 20 V .04 g 1039 3309 M -1 3 V .04 g 1038 3312 M -8 17 V .04 g 1030 3329 M -10 20 V .04 g 1020 3349 M -9 19 V .04 g 1011 3368 M -1 1 V .04 g 1010 3369 M -9 21 V .04 g 1001 3390 M -9 20 V .04 g 992 3410 M -8 18 V .04 g 984 3428 M -1 2 V .04 g 983 3430 M -9 20 V .04 g 974 3450 M -9 20 V .04 g 965 3470 M -9 20 V .04 g .04 g 956 3490 M -8 20 V .04 g 948 3510 M -9 21 V .04 g 939 3531 M -8 20 V .04 g 931 3551 M -2 4 V .04 g 929 3555 M -7 16 V .04 g 922 3571 M -8 20 V .04 g 914 3591 M -8 20 V .04 g 906 3611 M -4 11 V .04 g 902 3622 M -4 9 V .04 g 898 3631 M -8 21 V .04 g 890 3652 M -8 20 V .04 g 882 3672 M -7 20 V .04 g 875 3692 M -1 0 V .04 g 874 3692 M -7 20 V .04 g 867 3712 M -8 20 V .04 g 859 3732 M -7 20 V .04 g 852 3752 M -5 12 V .04 g 847 3764 M -3 8 V .04 g 844 3772 M -7 21 V .04 g 837 3793 M -7 20 V .04 g 830 3813 M -8 20 V .04 g 822 3833 M -2 6 V .04 g 820 3839 M -5 14 V stroke 815 3853 M .04 g 815 3853 M -7 20 V .04 g 808 3873 M -7 20 V .04 g 801 3893 M -7 21 V .04 g 794 3914 M -1 2 V .04 g 793 3916 M -6 18 V .04 g 787 3934 M -7 20 V .04 g 780 3954 M -7 20 V .04 g 773 3974 M -7 20 V .04 g 766 3994 M -1 1 V .04 g 765 3995 M -6 19 V .04 g 759 4014 M -6 21 V .04 g 753 4035 M -7 20 V .04 g 746 4055 M -7 20 V 0 g .04 g 2547 1455 M .04 g 2547 1455 M -10 15 V .04 g 2537 1470 M -3 5 V .04 g 2534 1475 M -13 20 V .04 g 2521 1495 M -11 19 V .04 g 2510 1514 M -1 1 V .04 g 2509 1515 M -12 20 V .04 g 2497 1535 M -12 20 V .04 g 2485 1555 M -3 5 V .04 g 2482 1560 M -9 16 V .04 g 2473 1576 M -11 20 V .04 g 2462 1596 M -7 13 V .04 g 2455 1609 M -4 7 V .04 g 2451 1616 M -11 20 V .04 g 2440 1636 M -11 20 V .04 g 2429 1656 M -1 3 V .04 g 2428 1659 M -9 17 V .04 g 2419 1676 M -10 21 V .04 g 2409 1697 M -8 15 V .04 g 2401 1712 M -3 5 V .04 g 2398 1717 M -10 20 V .04 g 2388 1737 M -10 20 V .04 g 2378 1757 M -5 10 V .04 g 2373 1767 M -5 10 V .04 g 2368 1777 M -9 20 V .04 g 2359 1797 M -10 20 V .04 g 2349 1817 M -3 7 V .04 g 2346 1824 M -6 14 V .04 g 2340 1838 M -10 20 V .04 g 2330 1858 M -9 20 V .04 g 2321 1878 M -2 5 V .04 g 2319 1883 M -7 15 V .04 g 2312 1898 M -9 20 V .04 g 2303 1918 M -9 20 V .04 g 2294 1938 M -2 5 V .04 g 2292 1943 M -7 16 V .04 g 2285 1959 M -9 20 V .04 g 2276 1979 M -9 20 V .04 g 2267 1999 M -3 6 V .04 g 2264 2005 M -6 14 V stroke 2258 2019 M .04 g 2258 2019 M -9 20 V .04 g 2249 2039 M -8 20 V .04 g 2241 2059 M -4 9 V .04 g 2237 2068 M -5 11 V .04 g 2232 2079 M -8 21 V .04 g 2224 2100 M -9 20 V .04 g 2215 2120 M -5 13 V .04 g 2210 2133 M -3 7 V .04 g 2207 2140 M -9 20 V .04 g 2198 2160 M -8 20 V .04 g 2190 2180 M -7 18 V .04 g 2183 2198 M -1 2 V .04 g 2182 2200 M -9 21 V .04 g 2173 2221 M -8 20 V .04 g 2165 2241 M -8 20 V .04 g 2157 2261 M -2 4 V .04 g 2155 2265 M -6 16 V .04 g 2149 2281 M -9 20 V .04 g 2140 2301 M -8 20 V .04 g 2132 2321 M -4 11 V .04 g 2128 2332 M -4 9 V .04 g 2124 2341 M -8 21 V .04 g 2116 2362 M -9 20 V .04 g 2107 2382 M -6 16 V .04 g 2101 2398 M -2 4 V .04 g 2099 2402 M -8 20 V .04 g 2091 2422 M -8 20 V .04 g 2083 2442 M -9 20 V .04 g 2074 2462 M 0 2 V .04 g 2074 2464 M -8 19 V .04 g 2066 2483 M -9 20 V .04 g 2057 2503 M -9 20 V .04 g 2048 2523 M -2 5 V .04 g 2046 2528 M -7 15 V .04 g 2039 2543 M -9 20 V .04 g 2030 2563 M -9 20 V .04 g 2021 2583 M -2 4 V .04 g 2019 2587 M -8 17 V .04 g 2011 2604 M -11 20 V .04 g 2000 2624 M -8 15 V .04 g 1992 2639 M -4 5 V .04 g 1988 2644 M -13 20 V .04 g 1975 2664 M -10 14 V .04 g 1965 2678 M -7 6 V .04 g 1958 2684 M -21 19 V .04 g 1937 2703 M -2 1 V .04 g 1935 2704 M -25 12 V .04 g 1910 2716 M -27 5 V .04 g 1883 2721 M -27 0 V .04 g 1856 2721 M -28 -2 V .04 g 1828 2719 M -27 -2 V .04 g 1801 2717 M -27 -3 V stroke 1774 2714 M .04 g 1774 2714 M -27 -2 V .04 g 1747 2712 M -28 -2 V .04 g 1719 2710 M -27 0 V .04 g 1692 2710 M -27 1 V .04 g 1665 2711 M -27 2 V .04 g 1638 2713 M -28 4 V .04 g 1610 2717 M -27 5 V 0 g .04 g 3828 1555 M .04 g 3828 1555 M -10 14 V .04 g 3818 1569 M -7 7 V .04 g 3811 1576 M -16 20 V .04 g 3795 1596 M -5 6 V .04 g 3790 1602 M -12 14 V .04 g 3778 1616 M -15 18 V .04 g 3763 1634 M -3 2 V .04 g 3760 1636 M -20 20 V .04 g 3740 1656 M -4 5 V .04 g 3736 1661 M -21 15 V .04 g 3715 1676 M -6 6 V .04 g 3709 1682 M -28 9 V .04 g 3681 1691 M -27 -6 V .04 g 3654 1685 M -12 -9 V .04 g 3642 1676 M -15 -9 V .04 g 3627 1667 M -10 -11 V .04 g 3617 1656 M -17 -16 V .04 g 3600 1640 M -3 -4 V .04 g 3597 1636 M -17 -20 V .04 g 3580 1616 M -8 -8 V .04 g 3572 1608 M -9 -12 V .04 g 3563 1596 M -16 -20 V .04 g 3547 1576 M -2 -2 V .04 g 3545 1574 M -14 -19 V .04 g 3531 1555 M -13 -16 V .04 g 3518 1539 M -3 -4 V .04 g 3515 1535 M -15 -20 V .04 g 3500 1515 M -9 -12 V .04 g 3491 1503 M -7 -8 V .04 g 3484 1495 M -15 -20 V .04 g 3469 1475 M -6 -7 V .04 g 3463 1468 M -10 -13 V .04 g 3453 1455 M -16 -20 V .04 g 3437 1435 M -1 -1 V .04 g 3436 1434 M -16 -20 V .04 g 3420 1414 M -11 -13 V .04 g 3409 1401 M -5 -7 V .04 g 3404 1394 M -17 -20 V .04 g 3387 1374 M -5 -6 V .04 g 3382 1368 M -13 -14 V .04 g 3369 1354 M -15 -16 V .04 g 3354 1338 M -3 -4 V .04 g 3351 1334 M -19 -20 V .04 g 3332 1314 M -5 -6 V .04 g 3327 1308 M -15 -15 V stroke 3312 1293 M .04 g 3312 1293 M -12 -12 V .04 g 3300 1281 M -8 -8 V .04 g 3292 1273 M -19 -18 V .04 g 3273 1255 M -3 -2 V .04 g 3270 1253 M -23 -20 V .04 g 3247 1233 M -2 -2 V .04 g 3245 1231 M -23 -18 V .04 g 3222 1213 M -4 -3 V .04 g 3218 1210 M -23 -17 V .04 g 3195 1193 M -4 -3 V .04 g 3191 1190 M -27 -18 V .04 g .04 g 3164 1172 M -28 -15 V .04 g 3136 1157 M -10 -5 V .04 g 3126 1152 M -17 -8 V .04 g 3109 1144 M -27 -10 V .04 g 3082 1134 M -5 -2 V .04 g 3077 1132 M -22 -7 V .04 g 3055 1125 M -28 -5 V .04 g 3027 1120 M -27 -3 V .04 g 3000 1117 M -27 -1 V .04 g 2973 1116 M -27 2 V .04 g 2946 1118 M -28 5 V .04 g 2918 1123 M -27 7 V .04 g 2891 1130 M -5 2 V .04 g 2886 1132 M -22 8 V .04 g 2864 1140 M -26 12 V .04 g 2838 1152 M -1 1 V .04 g 2837 1153 M -28 16 V .04 g 2809 1169 M -5 3 V .04 g 2804 1172 M -22 15 V .04 g 2782 1187 M -7 6 V .04 g 2775 1193 M -20 15 V .04 g 2755 1208 M -6 5 V .04 g 2749 1213 M -21 18 V .04 g 2728 1231 M -2 2 V .04 g 2726 1233 M -21 20 V .04 g 2705 1253 M -5 5 V .04 g 2700 1258 M -14 15 V .04 g 2686 1273 M -13 14 V .04 g 2673 1287 M -6 6 V .04 g 2667 1293 M -17 21 V .04 g 2650 1314 M -4 4 V .04 g 2646 1318 M -13 16 V .04 g 2633 1334 M -14 18 V .04 g 2619 1352 M -2 2 V .04 g 2617 1354 M -15 20 V .04 g 2602 1374 M -11 15 V .04 g 2591 1389 M -3 5 V .04 g 2588 1394 M -14 20 V .04 g 2574 1414 M -10 14 V .04 g 2564 1428 M -4 7 V .04 g 2560 1435 M -13 20 V stroke 2547 1455 M 0 g .04 g 4989 1848 M .04 g 4989 1848 M -5 -10 V .04 g 4984 1838 M -9 -21 V .04 g 4975 1817 M -10 -20 V .04 g 4965 1797 M -3 -6 V .04 g 4962 1791 M -7 -14 V .04 g 4955 1777 M -10 -20 V .04 g 4945 1757 M -10 -20 V .04 g 4935 1737 M 0 -1 V .04 g 4935 1736 M -10 -19 V .04 g 4925 1717 M -11 -20 V .04 g 4914 1697 M -6 -14 V .04 g 4908 1683 M -4 -7 V .04 g 4904 1676 M -11 -20 V .04 g 4893 1656 M -11 -20 V .04 g 4882 1636 M -2 -3 V .04 g 4880 1633 M -9 -17 V .04 g 4871 1616 M -12 -20 V .04 g 4859 1596 M -6 -12 V .04 g 4853 1584 M -5 -8 V .04 g 4848 1576 M -12 -21 V .04 g 4836 1555 M -10 -17 V .04 g 4826 1538 M -2 -3 V .04 g 4824 1535 M -13 -20 V .04 g 4811 1515 M -12 -20 V .04 g .04 g 4799 1495 M -14 -20 V .04 g 4785 1475 M -13 -20 V .04 g 4772 1455 M -1 -2 V .04 g 4771 1453 M -13 -18 V .04 g 4758 1435 M -14 -21 V .04 g .04 g 4744 1414 M -15 -20 V .04 g 4729 1394 M -12 -16 V .04 g 4717 1378 M -4 -4 V .04 g 4713 1374 M -16 -20 V .04 g 4697 1354 M -7 -9 V .04 g 4690 1345 M -10 -11 V .04 g 4680 1334 M -18 -20 V .04 g 4662 1314 M 0 -1 V .04 g 4662 1313 M -19 -20 V .04 g 4643 1293 M -8 -8 V .04 g 4635 1285 M -12 -12 V .04 g 4623 1273 M -15 -14 V .04 g 4608 1259 M -8 -6 V .04 g 4600 1253 M -19 -17 V .04 g 4581 1236 M -5 -3 V .04 g 4576 1233 M -23 -17 V .04 g 4553 1216 M -4 -3 V .04 g 4549 1213 M -23 -15 V .04 g 4526 1198 M -10 -5 V .04 g 4516 1193 M -17 -10 V .04 g 4499 1183 M -24 -11 V .04 g 4475 1172 M -3 -1 V .04 g 4472 1171 M -28 -10 V stroke 4444 1161 M .04 g 4444 1161 M -27 -7 V .04 g 4417 1154 M -13 -2 V .04 g 4404 1152 M -14 -2 V .04 g 4390 1150 M -27 -1 V .04 g 4363 1149 M -28 0 V .04 g 4335 1149 M -22 3 V .04 g 4313 1152 M -5 1 V .04 g 4308 1153 M -27 6 V .04 g 4281 1159 M -27 9 V .04 g 4254 1168 M -13 4 V .04 g 4241 1172 M -15 6 V .04 g 4226 1178 M -27 14 V .04 g 4199 1192 M -2 1 V .04 g 4197 1193 M -25 14 V .04 g 4172 1207 M -9 6 V .04 g 4163 1213 M -18 12 V .04 g 4145 1225 M -12 8 V .04 g 4133 1233 M -16 12 V .04 g 4117 1245 M -11 8 V .04 g 4106 1253 M -16 14 V .04 g 4090 1267 M -8 6 V .04 g 4082 1273 M -19 17 V .04 g 4063 1290 M -4 3 V .04 g 4059 1293 M -21 21 V .04 g 4038 1314 M -2 2 V .04 g 4036 1316 M -19 18 V .04 g 4017 1334 M -9 9 V .04 g 4008 1343 M -10 11 V .04 g 3998 1354 M -17 18 V .04 g 3981 1372 M -2 2 V .04 g 3979 1374 M -18 20 V .04 g 3961 1394 M -7 9 V .04 g 3954 1403 M -11 11 V .04 g 3943 1414 M -16 20 V .04 g 3927 1434 M -1 1 V .04 g 3926 1435 M -17 20 V .04 g 3909 1455 M -10 12 V .04 g 3899 1467 M -6 8 V .04 g 3893 1475 M -17 20 V .04 g 3876 1495 M -4 6 V .04 g 3872 1501 M -12 14 V .04 g 3860 1515 M -15 20 V .04 g 3845 1535 M -1 0 V .04 g 3844 1535 M -16 20 V 0 g .04 g 6052 3014 M .04 g 6052 3014 M -7 -7 V .04 g 6045 3007 M -18 -21 V .04 g 6027 2986 M -2 -2 V .04 g 6025 2984 M -18 -18 V .04 g 6007 2966 M -9 -9 V .04 g 5998 2957 M -13 -11 V .04 g 5985 2946 M -15 -14 V .04 g 5970 2932 M -8 -6 V stroke 5962 2926 M .04 g 5962 2926 M -19 -16 V .04 g 5943 2910 M -6 -4 V .04 g 5937 2906 M -21 -16 V .04 g 5916 2890 M -7 -4 V .04 g 5909 2886 M -20 -13 V .04 g 5889 2873 M -13 -7 V .04 g 5876 2866 M -15 -9 V .04 g 5861 2857 M -24 -12 V .04 g 5837 2845 M -3 -1 V .04 g 5834 2844 M -27 -11 V .04 g 5807 2833 M -22 -8 V .04 g 5785 2825 M -5 -2 V .04 g 5780 2823 M -28 -7 V .04 g 5752 2816 M -27 -6 V .04 g 5725 2810 M -27 -4 V .04 g 5698 2806 M -14 -1 V .04 g 5684 2805 M -13 -1 V .04 g 5671 2804 M -28 -1 V .04 g 5643 2803 M -27 -1 V .04 g 5616 2802 M -27 1 V .04 g 5589 2803 M -27 1 V .04 g 5562 2804 M -14 1 V .04 g 5548 2805 M -14 1 V .04 g 5534 2806 M -27 1 V .04 g 5507 2807 M -27 -1 V .04 g 5480 2806 M -6 -1 V .04 g 5474 2805 M -21 -3 V .04 g 5453 2802 M -28 -11 V .04 g 5425 2791 M -8 -6 V .04 g 5417 2785 M -19 -16 V .04 g 5398 2769 M -4 -4 V .04 g 5394 2765 M -15 -20 V .04 g 5379 2745 M -8 -11 V .04 g 5371 2734 M -5 -10 V .04 g 5366 2724 M -12 -20 V .04 g 5354 2704 M -10 -20 V .04 g 5344 2684 M -10 -20 V .04 g 5334 2664 M -9 -20 V .04 g 5325 2644 M -9 -18 V .04 g 5316 2626 M -1 -2 V .04 g 5315 2624 M -8 -20 V .04 g 5307 2604 M -9 -21 V .04 g 5298 2583 M -8 -20 V .04 g 5290 2563 M -1 -1 V .04 g 5289 2562 M -8 -19 V .04 g 5281 2543 M -8 -20 V .04 g 5273 2523 M -8 -20 V .04 g 5265 2503 M -3 -8 V .04 g 5262 2495 M -5 -12 V .04 g 5257 2483 M -8 -21 V .04 g 5249 2462 M -9 -20 V .04 g 5240 2442 M -5 -14 V stroke 5235 2428 M .04 g 5235 2428 M -3 -6 V .04 g 5232 2422 M -8 -20 V .04 g 5224 2402 M -8 -20 V .04 g 5216 2382 M -8 -20 V .04 g 5208 2362 M -1 -3 V .04 g 5207 2359 M -7 -18 V .04 g 5200 2341 M -8 -20 V .04 g 5192 2321 M -8 -20 V .04 g 5184 2301 M -4 -9 V .04 g 5180 2292 M -4 -11 V .04 g 5176 2281 M -8 -20 V .04 g 5168 2261 M -9 -20 V .04 g 5159 2241 M -6 -17 V .04 g 5153 2224 M -2 -3 V .04 g 5151 2221 M -8 -21 V .04 g 5143 2200 M -8 -20 V .04 g 5135 2180 M -9 -20 V .04 g 5126 2160 M 0 -2 V .04 g 5126 2158 M -8 -18 V .04 g 5118 2140 M -8 -20 V .04 g 5110 2120 M -9 -20 V .04 g 5101 2100 M -3 -7 V .04 g 5098 2093 M -5 -14 V .04 g 5093 2079 M -9 -20 V .04 g 5084 2059 M -9 -20 V .04 g 5075 2039 M -4 -10 V .04 g 5071 2029 M -4 -10 V .04 g 5067 2019 M -9 -20 V .04 g 5058 1999 M -9 -20 V .04 g 5049 1979 M -5 -12 V .04 g 5044 1967 M -4 -8 V .04 g 5040 1959 M -9 -21 V .04 g 5031 1938 M -9 -20 V .04 g 5022 1918 M -5 -11 V .04 g 5017 1907 M -4 -9 V .04 g 5013 1898 M -10 -20 V .04 g 5003 1878 M -9 -20 V .04 g 4994 1858 M -5 -10 V 0 g .02 g 2394 2321 M .02 g 2394 2321 M -1 20 V .02 g 2393 2341 M 0 21 V .02 g 2393 2362 M 0 20 V .02 g 2393 2382 M 1 20 V .02 g 2394 2402 M 1 20 V .02 g 2395 2422 M 2 20 V .02 g 2397 2442 M 3 20 V .02 g 2400 2462 M 1 3 V .02 g 2401 2465 M 3 18 V .02 g 2404 2483 M 5 20 V .02 g 2409 2503 M 5 20 V .02 g 2414 2523 M 7 20 V .02 g 2421 2543 M 7 16 V .02 g 2428 2559 M 2 4 V stroke 2430 2563 M .02 g 2430 2563 M 10 20 V .02 g 2440 2583 M 11 21 V .02 g 2451 2604 M 4 6 V .02 g 2455 2610 M 10 14 V .02 g 2465 2624 M 16 20 V .02 g 2481 2644 M 1 1 V .02 g 2482 2645 M 20 19 V .02 g 2502 2664 M 8 6 V .02 g 2510 2670 M 18 14 V .02 g 2528 2684 M 9 6 V .02 g 2537 2690 M 27 14 V .02 g .02 g 2564 2704 M 27 11 V .02 g 2591 2715 M 28 6 V .02 g 2619 2721 M 23 3 V .02 g 2642 2724 M 4 1 V .02 g 2646 2725 M 27 0 V .02 g 2673 2725 M 8 -1 V .02 g 2681 2724 M 19 -1 V .02 g 2700 2723 M 28 -6 V .02 g 2728 2717 M 27 -8 V .02 g 2755 2709 M 12 -5 V .02 g 2767 2704 M 15 -6 V .02 g 2782 2698 M 27 -13 V .02 g 2809 2685 M 2 -1 V .02 g 2811 2684 M 26 -15 V .02 g 2837 2669 M 7 -5 V .02 g 2844 2664 M 20 -13 V .02 g 2864 2651 M 9 -7 V .02 g 2873 2644 M 18 -15 V .02 g 2891 2629 M 7 -5 V .02 g 2898 2624 M 20 -18 V .02 g 2918 2606 M 2 -2 V .02 g 2920 2604 M 21 -21 V .02 g 2941 2583 M 5 -4 V .02 g 2946 2579 M 14 -16 V .02 g 2960 2563 M 13 -13 V .02 g 2973 2550 M 5 -7 V .02 g 2978 2543 M 18 -20 V .02 g 2996 2523 M 4 -6 V .02 g 3000 2517 M 11 -14 V .02 g 3011 2503 M 16 -20 V .02 g 3027 2483 M 0 -1 V .02 g 3027 2482 M 14 -20 V .02 g 3041 2462 M 14 -19 V .02 g 3055 2443 M 0 -1 V .02 g 3055 2442 M 13 -20 V .02 g 3068 2422 M 13 -20 V .02 g 3081 2402 M 1 -1 V .02 g 3082 2401 M 11 -19 V .02 g 3093 2382 M 12 -20 V .02 g 3105 2362 M 4 -8 V .02 g 3109 2354 M 7 -13 V stroke 3116 2341 M .02 g 3116 2341 M 11 -20 V .02 g 3127 2321 M 9 -19 V .02 g 3136 2302 M 1 -1 V .02 g 3137 2301 M 10 -20 V .02 g 3147 2281 M 9 -20 V .02 g 3156 2261 M 8 -17 V .02 g 3164 2244 M 1 -3 V .02 g 3165 2241 M 8 -20 V .02 g 3173 2221 M 8 -21 V .02 g 3181 2200 M 8 -20 V .02 g 3189 2180 M 2 -5 V .02 g 3191 2175 M 5 -15 V .02 g 3196 2160 M 7 -20 V .02 g 3203 2140 M 6 -20 V .02 g 3209 2120 M 6 -20 V .02 g 3215 2100 M 3 -11 V .02 g 3218 2089 M 3 -10 V .02 g 3221 2079 M 5 -20 V .02 g 3226 2059 M 4 -20 V .02 g 3230 2039 M 4 -20 V .02 g 3234 2019 M 4 -20 V .02 g 3238 1999 M 3 -20 V .02 g 3241 1979 M 3 -20 V .02 g 3244 1959 M 1 -17 V .02 g 3245 1942 M 1 -4 V .02 g 3246 1938 M 1 -20 V .02 g 3247 1918 M 1 -20 V .02 g 3248 1898 M 1 -20 V .02 g 3249 1878 M -1 -20 V .02 g 3248 1858 M 0 -20 V .02 g 3248 1838 M -1 -21 V 0 g .02 g 3247 1817 M .02 g 3247 1817 M -2 -13 V .02 g 3245 1804 M 0 -7 V .02 g 3245 1797 M -3 -20 V .02 g 3242 1777 M -3 -20 V .02 g 3239 1757 M -4 -20 V .02 g 3235 1737 M -4 -20 V .02 g 3231 1717 M -6 -20 V .02 g 3225 1697 M -5 -21 V .02 g 3220 1676 M -2 -5 V .02 g 3218 1671 M -5 -15 V .02 g 3213 1656 M -8 -20 V .02 g 3205 1636 M -8 -20 V .02 g 3197 1616 M -6 -14 V .02 g 3191 1602 M -3 -6 V .02 g 3188 1596 M -11 -20 V .02 g 3177 1576 M -11 -21 V .02 g 3166 1555 M -2 -3 V .02 g 3164 1552 M -11 -17 V .02 g 3153 1535 M -14 -20 V .02 g 3139 1515 M -3 -3 V .02 g 3136 1512 M -14 -17 V stroke 3122 1495 M .02 g 3122 1495 M -13 -15 V .02 g 3109 1480 M -5 -5 V .02 g 3104 1475 M -22 -20 V .02 g 3082 1455 M 0 -1 V .02 g 3082 1454 M -26 -19 V .02 g 3056 1435 M -1 -1 V .02 g 3055 1434 M -28 -16 V .02 g 3027 1418 M -8 -4 V .02 g 3019 1414 M -19 -7 V .02 g 3000 1407 M -27 -7 V .02 g 2973 1400 M -27 -4 V .02 g 2946 1396 M -28 1 V .02 g 2918 1397 M -27 4 V .02 g 2891 1401 M -27 8 V .02 g 2864 1409 M -12 5 V .02 g 2852 1414 M -15 7 V .02 g 2837 1421 M -24 14 V .02 g 2813 1435 M -4 2 V .02 g 2809 1437 M -26 18 V .02 g 2783 1455 M -1 1 V .02 g 2782 1456 M -23 19 V .02 g 2759 1475 M -4 3 V .02 g 2755 1478 M -17 17 V .02 g 2738 1495 M -10 10 V .02 g 2728 1505 M -10 10 V .02 g 2718 1515 M -18 20 V .02 g .02 g 2700 1535 M -16 20 V .02 g 2684 1555 M -11 14 V .02 g 2673 1569 M -5 7 V .02 g 2668 1576 M -14 20 V .02 g 2654 1596 M -8 11 V .02 g 2646 1607 M -6 9 V .02 g 2640 1616 M -13 20 V .02 g 2627 1636 M -8 13 V .02 g 2619 1649 M -5 7 V .02 g 2614 1656 M -12 20 V .02 g 2602 1676 M -11 19 V .02 g 2591 1695 M 0 2 V .02 g 2591 1697 M -11 20 V .02 g 2580 1717 M -11 20 V .02 g 2569 1737 M -5 9 V .02 g 2564 1746 M -5 11 V .02 g 2559 1757 M -10 20 V .02 g 2549 1777 M -10 20 V .02 g 2539 1797 M -2 6 V .02 g 2537 1803 M -7 14 V .02 g 2530 1817 M -9 21 V .02 g 2521 1838 M -9 20 V .02 g 2512 1858 M -2 7 V .02 g 2510 1865 M -6 13 V .02 g 2504 1878 M -8 20 V .02 g 2496 1898 M -8 20 V stroke 2488 1918 M .02 g 2488 1918 M -6 17 V .02 g 2482 1935 M -1 3 V .02 g 2481 1938 M -7 21 V .02 g 2474 1959 M -7 20 V .02 g 2467 1979 M -7 20 V .02 g 2460 1999 M -5 15 V .02 g 2455 2014 M -1 5 V .02 g 2454 2019 M -7 20 V .02 g 2447 2039 M -5 20 V .02 g 2442 2059 M -6 20 V .02 g 2436 2079 M -5 21 V .02 g 2431 2100 M -3 11 V .02 g 2428 2111 M -2 9 V .02 g 2426 2120 M -5 20 V .02 g 2421 2140 M -5 20 V .02 g 2416 2160 M -4 20 V .02 g 2412 2180 M -3 20 V .02 g 2409 2200 M -4 21 V .02 g 2405 2221 M -3 20 V .02 g 2402 2241 M -1 11 V .02 g 2401 2252 M -2 9 V .02 g 2399 2261 M -2 20 V .02 g 2397 2281 M -2 20 V .02 g 2395 2301 M -1 20 V 0 g .02 g 4110 1979 M .02 g 4110 1979 M 2 20 V .02 g 4112 1999 M 3 20 V .02 g 4115 2019 M 2 10 V .02 g 4117 2029 M 2 10 V .02 g 4119 2039 M 4 20 V .02 g 4123 2059 M 4 20 V .02 g 4127 2079 M 5 21 V .02 g 4132 2100 M 6 20 V .02 g 4138 2120 M 5 20 V .02 g 4143 2140 M 2 3 V .02 g 4145 2143 M 5 17 V .02 g 4150 2160 M 6 20 V .02 g 4156 2180 M 7 20 V .02 g 4163 2200 M 8 21 V .02 g 4171 2221 M 1 2 V .02 g 4172 2223 M 7 18 V .02 g 4179 2241 M 8 20 V .02 g 4187 2261 M 8 20 V .02 g 4195 2281 M 4 8 V .02 g 4199 2289 M 6 12 V .02 g 4205 2301 M 9 20 V .02 g 4214 2321 M 10 20 V .02 g 4224 2341 M 2 5 V .02 g 4226 2346 M 8 16 V .02 g 4234 2362 M 11 20 V .02 g 4245 2382 M 9 16 V .02 g 4254 2398 M 2 4 V .02 g 4256 2402 M 12 20 V stroke 4268 2422 M .02 g 4268 2422 M 12 20 V .02 g 4280 2442 M 1 2 V .02 g 4281 2444 M 11 18 V .02 g 4292 2462 M 13 21 V .02 g 4305 2483 M 3 4 V .02 g 4308 2487 M 11 16 V .02 g 4319 2503 M 14 20 V .02 g 4333 2523 M 2 2 V .02 g 4335 2525 M 14 18 V .02 g 4349 2543 M 14 18 V .02 g 4363 2561 M 1 2 V .02 g 4364 2563 M 17 20 V .02 g 4381 2583 M 9 10 V .02 g 4390 2593 M 9 11 V .02 g 4399 2604 M 18 19 V .02 g 4417 2623 M 0 1 V .02 g 4417 2624 M 21 20 V .02 g 4438 2644 M 6 6 V .02 g 4444 2650 M 16 14 V .02 g 4460 2664 M 12 10 V .02 g 4472 2674 M 12 10 V .02 g 4484 2684 M 15 12 V .02 g 4499 2696 M 12 8 V .02 g 4511 2704 M 15 11 V .02 g 4526 2715 M 16 9 V .02 g 4542 2724 M 11 7 V .02 g 4553 2731 M 27 14 V .02 g 4580 2745 M 1 0 V .02 g 4581 2745 M 27 11 V .02 g 4608 2756 M 27 8 V .02 g 4635 2764 M 1 1 V .02 g 4636 2765 M 26 5 V .02 g 4662 2770 M 28 3 V .02 g 4690 2773 M 27 0 V .02 g 4717 2773 M 27 -3 V .02 g 4744 2770 M 21 -5 V .02 g 4765 2765 M 6 -2 V .02 g 4771 2763 M 28 -10 V .02 g 4799 2753 M 15 -8 V .02 g 4814 2745 M 12 -7 V .02 g 4826 2738 M 19 -14 V .02 g 4845 2724 M 8 -6 V .02 g 4853 2718 M 14 -14 V .02 g 4867 2704 M 13 -13 V .02 g 4880 2691 M 6 -7 V .02 g 4886 2684 M 14 -20 V .02 g 4900 2664 M 8 -11 V .02 g 4908 2653 M 5 -9 V .02 g 4913 2644 M 10 -20 V .02 g 4923 2624 M 9 -20 V .02 g 4932 2604 M 3 -9 V .02 g 4935 2595 M 4 -12 V stroke 4939 2583 M .02 g 4939 2583 M 5 -20 V .02 g 4944 2563 M 5 -20 V .02 g 4949 2543 M 4 -20 V .02 g 4953 2523 M 3 -20 V .02 g 4956 2503 M 2 -20 V .02 g 4958 2483 M 2 -21 V .02 g 4960 2462 M 1 -20 V .02 g 4961 2442 M 0 -20 V .02 g 4961 2422 M -1 -20 V .02 g 4960 2402 M -1 -20 V .02 g 4959 2382 M -1 -20 V .02 g 4958 2362 M -2 -21 V .02 g 4956 2341 M -2 -20 V .02 g 4954 2321 M -3 -20 V .02 g 4951 2301 M -3 -20 V .02 g 4948 2281 M -3 -20 V .02 g 4945 2261 M -4 -20 V .02 g 4941 2241 M -4 -20 V 0 g .02 g 4937 2221 M .02 g 4937 2221 M -2 -12 V .02 g 4935 2209 M -2 -9 V .02 g 4933 2200 M -5 -20 V .02 g 4928 2180 M -5 -20 V .02 g 4923 2160 M -5 -20 V .02 g 4918 2140 M -6 -20 V .02 g 4912 2120 M -4 -18 V .02 g 4908 2102 M -1 -2 V .02 g 4907 2100 M -6 -21 V .02 g 4901 2079 M -7 -20 V .02 g 4894 2059 M -6 -20 V .02 g 4888 2039 M -7 -20 V .02 g 4881 2019 M -1 -2 V .02 g 4880 2017 M -6 -18 V .02 g 4874 1999 M -7 -20 V .02 g 4867 1979 M -8 -20 V .02 g 4859 1959 M -6 -16 V .02 g 4853 1943 M -2 -5 V .02 g 4851 1938 M -8 -20 V .02 g 4843 1918 M -8 -20 V .02 g 4835 1898 M -9 -20 V .02 g 4826 1878 M 0 -1 V .02 g 4826 1877 M -9 -19 V .02 g 4817 1858 M -9 -20 V .02 g 4808 1838 M -9 -21 V .02 g .02 g 4799 1817 M -11 -20 V .02 g 4788 1797 M -10 -20 V .02 g 4778 1777 M -7 -14 V .02 g 4771 1763 M -3 -6 V .02 g 4768 1757 M -11 -20 V .02 g 4757 1737 M -12 -20 V .02 g 4745 1717 M -1 -3 V .02 g 4744 1714 M -11 -17 V .02 g 4733 1697 M -12 -21 V stroke 4721 1676 M .02 g 4721 1676 M -4 -6 V .02 g 4717 1670 M -9 -14 V .02 g 4708 1656 M -14 -20 V .02 g 4694 1636 M -4 -7 V .02 g 4690 1629 M -10 -13 V .02 g 4680 1616 M -15 -20 V .02 g 4665 1596 M -3 -4 V .02 g 4662 1592 M -14 -16 V .02 g 4648 1576 M -13 -16 V .02 g 4635 1560 M -4 -5 V .02 g 4631 1555 M -19 -20 V .02 g 4612 1535 M -4 -4 V .02 g 4608 1531 M -17 -16 V .02 g 4591 1515 M -10 -9 V .02 g 4581 1506 M -14 -11 V .02 g 4567 1495 M -14 -11 V .02 g 4553 1484 M -14 -9 V .02 g 4539 1475 M -13 -9 V .02 g 4526 1466 M -22 -11 V .02 g 4504 1455 M -5 -3 V .02 g 4499 1452 M -27 -11 V .02 g 4472 1441 M -26 -6 V .02 g 4446 1435 M -2 -1 V .02 g 4444 1434 M -27 -3 V .02 g 4417 1431 M -27 1 V .02 g 4390 1432 M -18 3 V .02 g 4372 1435 M -9 1 V .02 g 4363 1436 M -28 9 V .02 g 4335 1445 M -21 10 V .02 g 4314 1455 M -6 3 V .02 g 4308 1458 M -27 17 V .02 g .02 g 4281 1475 M -24 20 V .02 g 4257 1495 M -3 3 V .02 g 4254 1498 M -18 17 V .02 g 4236 1515 M -10 11 V .02 g 4226 1526 M -7 9 V .02 g 4219 1535 M -15 20 V .02 g 4204 1555 M -5 7 V .02 g 4199 1562 M -9 14 V .02 g 4190 1576 M -12 20 V .02 g 4178 1596 M -6 11 V .02 g 4172 1607 M -5 9 V .02 g 4167 1616 M -9 20 V .02 g 4158 1636 M -9 20 V .02 g 4149 1656 M -4 11 V .02 g 4145 1667 M -4 9 V .02 g 4141 1676 M -7 21 V .02 g 4134 1697 M -6 20 V .02 g 4128 1717 M -5 20 V .02 g 4123 1737 M -5 20 V .02 g 4118 1757 M -1 5 V .02 g 4117 1762 M -3 15 V stroke 4114 1777 M .02 g 4114 1777 M -3 20 V .02 g 4111 1797 M -2 20 V .02 g 4109 1817 M -2 21 V .02 g 4107 1838 M -1 20 V .02 g 4106 1858 M -1 20 V .02 g 4105 1878 M 0 20 V .02 g 4105 1898 M 0 20 V .02 g 4105 1918 M 1 20 V .02 g 4106 1938 M 2 21 V .02 g 4108 1959 M 2 20 V 0 g .02 g 1287 3208 M .02 g 1287 3208 M -4 3 V .02 g 1283 3211 M -18 17 V .02 g 1265 3228 M -9 9 V .02 g 1256 3237 M -10 11 V .02 g 1246 3248 M -17 19 V .02 g 1229 3267 M -1 2 V .02 g 1228 3269 M -16 20 V .02 g 1212 3289 M -10 12 V .02 g 1202 3301 M -6 8 V .02 g 1196 3309 M -14 20 V .02 g 1182 3329 M -8 10 V .02 g 1174 3339 M -6 10 V .02 g 1168 3349 M -14 20 V .02 g 1154 3369 M -7 11 V .02 g 1147 3380 M -5 10 V .02 g 1142 3390 M -13 20 V .02 g 1129 3410 M -9 15 V .02 g 1120 3425 M -3 5 V .02 g 1117 3430 M -11 20 V .02 g 1106 3450 M -11 20 V .02 g 1095 3470 M -2 4 V .02 g 1093 3474 M -9 16 V .02 g 1084 3490 M -10 20 V .02 g 1074 3510 M -9 17 V .02 g 1065 3527 M -2 4 V .02 g 1063 3531 M -9 20 V .02 g 1054 3551 M -10 20 V .02 g 1044 3571 M -6 12 V .02 g 1038 3583 M -4 8 V .02 g 1034 3591 M -9 20 V .02 g 1025 3611 M -9 20 V .02 g 1016 3631 M -5 11 V .02 g 1011 3642 M -4 10 V .02 g 1007 3652 M -9 20 V .02 g 998 3672 M -8 20 V .02 g 990 3692 M -6 14 V .02 g 984 3706 M -3 6 V .02 g 981 3712 M -8 20 V .02 g 973 3732 M -8 20 V .02 g 965 3752 M -8 20 V .02 g 957 3772 M -1 1 V .02 g 956 3773 M -7 20 V stroke 949 3793 M .02 g 949 3793 M -8 20 V .02 g 941 3813 M -7 20 V .02 g 934 3833 M -5 12 V .02 g 929 3845 M -3 8 V .02 g 926 3853 M -7 20 V .02 g 919 3873 M -7 20 V .02 g 912 3893 M -8 21 V .02 g 904 3914 M -2 6 V .02 g 902 3920 M -5 14 V .02 g 897 3934 M -7 20 V .02 g 890 3954 M -7 20 V .02 g 883 3974 M -7 20 V .02 g 876 3994 M -1 6 V .02 g 875 4000 M -5 14 V .02 g 870 4014 M -7 21 V .02 g 863 4035 M -6 20 V .02 g 857 4055 M -7 20 V .02 g 850 4075 M -3 10 V .02 g 847 4085 M -3 10 V .02 g 844 4095 M -6 20 V .02 g 838 4115 M -6 20 V .02 g 832 4135 M -6 20 V .02 g 826 4155 M -6 19 V .02 g 820 4174 M 0 2 V .02 g 820 4176 M -6 20 V .02 g 814 4196 M -6 20 V .02 g 808 4216 M -5 20 V .02 g 803 4236 M -6 20 V .02 g 797 4256 M -4 15 V .02 g 793 4271 M -2 5 V .02 g 791 4276 M -5 21 V .02 g 786 4297 M -5 20 V .02 g 781 4317 M -6 20 V .02 g 775 4337 M -5 20 V .02 g 770 4357 M -5 17 V .02 g 765 4374 M 0 3 V .02 g 765 4377 M -5 20 V .02 g 760 4397 M -5 20 V .02 g 755 4417 M -5 21 V .02 g 750 4438 M -4 20 V .02 g 746 4458 M -5 20 V .02 g 741 4478 M -3 11 V .02 g 738 4489 M -2 9 V .02 g 736 4498 M -4 20 V .02 g 732 4518 M -4 20 V .02 g 728 4538 M -4 21 V .02 g 724 4559 M -4 20 V .02 g 720 4579 M -4 20 V .02 g 716 4599 M -4 20 V 0 g .02 g 1149 4619 M .02 g 1149 4619 M 10 -20 V .02 g 1159 4599 M 11 -20 V .02 g 1170 4579 M 4 -9 V stroke 1174 4570 M .02 g 1174 4570 M 6 -11 V .02 g 1180 4559 M 9 -21 V .02 g 1189 4538 M 10 -20 V .02 g 1199 4518 M 3 -4 V .02 g 1202 4514 M 7 -16 V .02 g 1209 4498 M 9 -20 V .02 g 1218 4478 M 9 -20 V .02 g 1227 4458 M 2 -3 V .02 g 1229 4455 M 7 -17 V .02 g 1236 4438 M 9 -21 V .02 g 1245 4417 M 9 -20 V .02 g 1254 4397 M 2 -4 V .02 g 1256 4393 M 7 -16 V .02 g 1263 4377 M 8 -20 V .02 g 1271 4357 M 9 -20 V .02 g 1280 4337 M 3 -8 V .02 g 1283 4329 M 5 -12 V .02 g 1288 4317 M 8 -20 V .02 g 1296 4297 M 8 -21 V .02 g 1304 4276 M 7 -15 V .02 g 1311 4261 M 1 -5 V .02 g 1312 4256 M 8 -20 V .02 g 1320 4236 M 8 -20 V .02 g 1328 4216 M 8 -20 V .02 g 1336 4196 M 2 -6 V .02 g 1338 4190 M 5 -14 V .02 g 1343 4176 M 7 -21 V .02 g 1350 4155 M 8 -20 V .02 g 1358 4135 M 7 -19 V .02 g 1365 4116 M 0 -1 V .02 g 1365 4115 M 7 -20 V .02 g 1372 4095 M 7 -20 V .02 g 1379 4075 M 7 -20 V .02 g 1386 4055 M 6 -18 V .02 g 1392 4037 M 1 -2 V .02 g 1393 4035 M 7 -21 V .02 g 1400 4014 M 6 -20 V .02 g 1406 3994 M 7 -20 V .02 g 1413 3974 M 6 -20 V .02 g 1419 3954 M 1 0 V .02 g 1420 3954 M 6 -20 V .02 g 1426 3934 M 6 -20 V .02 g 1432 3914 M 6 -21 V .02 g 1438 3893 M 6 -20 V .02 g 1444 3873 M 3 -10 V .02 g 1447 3863 M 3 -10 V .02 g 1450 3853 M 5 -20 V .02 g 1455 3833 M 6 -20 V .02 g 1461 3813 M 5 -20 V .02 g 1466 3793 M 6 -21 V .02 g 1472 3772 M 2 -8 V .02 g 1474 3764 M 3 -12 V stroke 1477 3752 M .02 g 1477 3752 M 5 -20 V .02 g 1482 3732 M 5 -20 V .02 g 1487 3712 M 5 -20 V .02 g 1492 3692 M 4 -20 V .02 g 1496 3672 M 5 -20 V .02 g 1501 3652 M 0 -2 V .02 g 1501 3650 M 4 -19 V .02 g 1505 3631 M 4 -20 V .02 g 1509 3611 M 4 -20 V .02 g 1513 3591 M 3 -20 V .02 g 1516 3571 M 4 -20 V .02 g 1520 3551 M 3 -20 V .02 g 1523 3531 M 3 -21 V .02 g 1526 3510 M 3 -18 V .02 g 1529 3492 M 0 -2 V .02 g 1529 3490 M 2 -20 V .02 g 1531 3470 M 2 -20 V .02 g 1533 3450 M 1 -20 V .02 g 1534 3430 M 1 -20 V .02 g 1535 3410 M 1 -20 V .02 g 1536 3390 M 0 -21 V .02 g 1536 3369 M 0 -20 V .02 g 1536 3349 M -1 -20 V .02 g 1535 3329 M -2 -20 V .02 g 1533 3309 M -3 -20 V .02 g 1530 3289 M -1 -10 V .02 g 1529 3279 M -3 -10 V .02 g 1526 3269 M -5 -21 V .02 g 1521 3248 M -7 -20 V .02 g 1514 3228 M -9 -20 V .02 g 1505 3208 M -4 -6 V .02 g 1501 3202 M -10 -14 V .02 g 1491 3188 M -17 -19 V .02 g 1474 3169 M -2 -1 V .02 g 1472 3168 M -25 -14 V .02 g 1447 3154 M -27 -6 V .02 g 1420 3148 M -28 2 V .02 g 1392 3150 M -27 8 V .02 g 1365 3158 M -21 10 V .02 g 1344 3168 M -6 3 V .02 g 1338 3171 M -27 17 V .02 g 1311 3188 M 0 1 V .02 g 1311 3189 M -24 19 V 0 g .02 g 6052 3307 M .02 g 6052 3307 M -25 -18 V .02 g 6027 3289 M -2 -2 V .02 g 6025 3287 M -27 -16 V .02 g 5998 3271 M -6 -2 V .02 g 5992 3269 M -22 -9 V .02 g 5970 3260 M -27 -5 V .02 g 5943 3255 M -27 1 V .02 g 5916 3256 M -27 11 V .02 g 5889 3267 M -3 2 V stroke 5886 3269 M .02 g 5886 3269 M -23 20 V .02 g 5863 3289 M -2 2 V .02 g 5861 3291 M -11 18 V .02 g 5850 3309 M -10 20 V .02 g 5840 3329 M -6 15 V .02 g 5834 3344 M -2 5 V .02 g 5832 3349 M -5 20 V .02 g 5827 3369 M -4 21 V .02 g 5823 3390 M -2 20 V .02 g 5821 3410 M -2 20 V .02 g 5819 3430 M -1 20 V .02 g 5818 3450 M -1 20 V .02 g 5817 3470 M 0 20 V .02 g 5817 3490 M 1 20 V .02 g 5818 3510 M 1 21 V .02 g 5819 3531 M 2 20 V .02 g 5821 3551 M 2 20 V .02 g 5823 3571 M 2 20 V .02 g 5825 3591 M 2 20 V .02 g 5827 3611 M 3 20 V .02 g 5830 3631 M 3 21 V .02 g 5833 3652 M 1 4 V .02 g 5834 3656 M 3 16 V .02 g 5837 3672 M 3 20 V .02 g 5840 3692 M 4 20 V .02 g 5844 3712 M 4 20 V .02 g 5848 3732 M 4 20 V .02 g 5852 3752 M 5 20 V .02 g 5857 3772 M 4 21 V .02 g 5861 3793 M 0 1 V .02 g 5861 3794 M 5 19 V .02 g 5866 3813 M 5 20 V .02 g 5871 3833 M 5 20 V .02 g 5876 3853 M 5 20 V .02 g 5881 3873 M 5 20 V .02 g 5886 3893 M 3 10 V .02 g 5889 3903 M 2 11 V .02 g 5891 3914 M 6 20 V .02 g 5897 3934 M 6 20 V .02 g 5903 3954 M 5 20 V .02 g 5908 3974 M 6 20 V .02 g 5914 3994 M 2 6 V .02 g 5916 4000 M 4 14 V .02 g 5920 4014 M 6 21 V .02 g 5926 4035 M 6 20 V .02 g 5932 4055 M 7 20 V .02 g 5939 4075 M 4 14 V .02 g 5943 4089 M 2 6 V .02 g 5945 4095 M 7 20 V .02 g 5952 4115 M 6 20 V .02 g 5958 4135 M 7 20 V .02 g 5965 4155 M 5 17 V stroke 5970 4172 M .02 g 5970 4172 M 1 4 V .02 g 5971 4176 M 8 20 V .02 g 5979 4196 M 7 20 V .02 g 5986 4216 M 6 20 V .02 g 5992 4236 M 6 15 V .02 g 5998 4251 M 2 5 V .02 g 6000 4256 M 7 20 V .02 g 6007 4276 M 7 21 V .02 g 6014 4297 M 8 20 V .02 g 6022 4317 M 3 8 V .02 g 6025 4325 M 4 12 V .02 g 6029 4337 M 8 20 V .02 g 6037 4357 M 8 20 V .02 g 6045 4377 M 7 19 V % End plot #1 % Begin plot #2 1.500 UP stroke 6.000 UL LT0 0.55 0.10 0.05 C 3600 4518 M 1299 3219 L -57 460 V -117 320 V -35 91 V 26 -27 V -12 11 V 6 -6 V -2 2 V 1 0 V -1 0 V 3600 4518 CircleF 1299 3219 CircleF 1242 3679 CircleF 1125 3999 CircleF 1090 4090 CircleF 1116 4063 CircleF 1104 4074 CircleF 1110 4068 CircleF 1108 4070 CircleF 1109 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF 1108 4070 CircleF % End plot #2 % Begin plot #3 1.500 UP 6.000 UL LT1 0.37 0.61 0.21 C 3600 4518 M -155 -79 V 3289 4222 L 3077 3729 L 2848 2964 L 2525 2442 L 223 -256 V 136 -138 V -92 15 V 55 -16 V -30 5 V 5 1 V -2 1 V 1 0 V 3600 4518 TriUF 3445 4439 TriUF 3289 4222 TriUF 3077 3729 TriUF 2848 2964 TriUF 2525 2442 TriUF 2748 2186 TriUF 2884 2048 TriUF 2792 2063 TriUF 2847 2047 TriUF 2817 2052 TriUF 2822 2053 TriUF 2820 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF 2821 2054 TriUF % End plot #3 % Begin plot #4 1.500 UP 6.000 UL LT2 0.00 0.38 0.68 C 3600 4518 M 1988 3715 L 3160 1440 L -415 600 V 158 -40 V -158 91 V 137 -41 V -69 -20 V 12 17 V -7 6 V 4 2 V -2 -1 V 1 1 V 0 -1 V 3600 4518 Circle 1988 3715 Circle 3160 1440 Circle 2745 2040 Circle 2903 2000 Circle 2745 2091 Circle 2882 2050 Circle 2813 2030 Circle 2825 2047 Circle 2818 2053 Circle 2822 2055 Circle 2820 2054 Circle 2821 2055 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle 2821 2054 Circle % End plot #4 % Begin plot #5 1.500 UP 6.000 UL LT3 0.95 0.35 0.00 C 3600 4518 M 1988 3715 L 3198 1467 L -475 568 V 163 -26 V -66 7 V 7 21 V -16 28 V 12 -6 V -5 -5 V 3 1 V -1 -1 V 1 0 V -1 0 V 1 0 V 3600 4518 Crs 1988 3715 Crs 3198 1467 Crs 2723 2035 Crs 2886 2009 Crs 2820 2016 Crs 2827 2037 Crs 2811 2065 Crs 2823 2059 Crs 2818 2054 Crs 2821 2055 Crs 2820 2054 Crs 2821 2054 Crs 2820 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs 2821 2054 Crs % End plot #5 % Begin plot #6 1.500 UP 6.000 UL LT4 0.46 0.44 0.70 C 3600 4518 M 2085 3705 L 3289 1441 L -655 583 V 230 -13 V -56 33 V 15 4 V -3 4 V 2 1 V -2 1 V 1 0 V -1 0 V 1 0 V 3600 4518 Star 2085 3705 Star 3289 1441 Star 2634 2024 Star 2864 2011 Star 2808 2044 Star 2823 2048 Star 2820 2052 Star 2822 2053 Star 2820 2054 Star 2821 2054 Star 2820 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star 2821 2054 Star % End plot #6 LCw setrgbcolor 1.000 3262 651 2706 700 BoxColFill % Begin plot #7 2.000 UL LT0 0 g % End plot #7 % Begin plot #8 1.500 UP 6.000 UL LT0 0.55 0.10 0.05 C 5446 1281 M [ [(Arial-Bold) 140.0 0.0 true true 0 (LM)] ] -46.7 MRshow LT0 0.55 0.10 0.05 C 5530 1281 M 354 0 V 5707 1281 CircleF % End plot #8 % Begin plot #9 1.500 UP 6.000 UL LT1 0.37 0.61 0.21 C 5446 1141 M [ [(Arial-Bold) 140.0 0.0 true true 0 (LM + geodesic acceleration)] ] -46.7 MRshow LT1 0.37 0.61 0.21 C 5530 1141 M 354 0 V 5707 1141 TriUF % End plot #9 % Begin plot #10 1.500 UP 6.000 UL LT2 0.00 0.38 0.68 C 5446 1001 M [ [(Arial-Bold) 140.0 0.0 true true 0 (Dogleg)] ] -46.7 MRshow LT2 0.00 0.38 0.68 C 5530 1001 M 354 0 V 5707 1001 Circle % End plot #10 % Begin plot #11 1.500 UP 6.000 UL LT3 0.95 0.35 0.00 C 5446 861 M [ [(Arial-Bold) 140.0 0.0 true true 0 (Double Dogleg)] ] -46.7 MRshow LT3 0.95 0.35 0.00 C 5530 861 M 354 0 V 5707 861 Crs % End plot #11 % Begin plot #12 1.500 UP 6.000 UL LT4 0.46 0.44 0.70 C 5446 721 M [ [(Arial-Bold) 140.0 0.0 true true 0 (2D Subspace)] ] -46.7 MRshow LT4 0.46 0.44 0.70 C 5530 721 M 354 0 V 5707 721 Star % End plot #12 1.000 UL LTb LCb setrgbcolor 602 4619 N 602 588 L 5450 0 V 0 4031 V -5450 0 V Z stroke stroke gsave %% draw gray scale smooth box maxcolors 0 gt {/imax maxcolors def} {/imax 1024 def} ifelse 6188 588 translate 272 4031 scale 0 setlinewidth /ystep 1 imax div def /y0 0 def /ii 0 def { y0 g 0 y0 N 1 0 V 0 ystep V -1 0 f /y0 y0 ystep add def /ii ii 1 add def ii imax ge {exit} if } loop grestore 0 setgray 1.000 UL LTb LCb setrgbcolor 6188 588 N 272 0 V 0 4031 V -272 0 V 0 -4031 V Z stroke 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6460 588 M -63 0 V stroke 6544 588 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 588 M 63 0 V 209 403 R -63 0 V stroke 6544 991 M [ [(Helvetica) 140.0 0.0 true true 0 ( 50)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 991 M 63 0 V 209 403 R -63 0 V stroke 6544 1394 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 1394 M 63 0 V 209 403 R -63 0 V stroke 6544 1797 M [ [(Helvetica) 140.0 0.0 true true 0 ( 150)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 1797 M 63 0 V 209 403 R -63 0 V stroke 6544 2200 M [ [(Helvetica) 140.0 0.0 true true 0 ( 200)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 2200 M 63 0 V 209 403 R -63 0 V stroke 6544 2603 M [ [(Helvetica) 140.0 0.0 true true 0 ( 250)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 2603 M 63 0 V 209 403 R -63 0 V stroke 6544 3006 M [ [(Helvetica) 140.0 0.0 true true 0 ( 300)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 3006 M 63 0 V 209 403 R -63 0 V stroke 6544 3409 M [ [(Helvetica) 140.0 0.0 true true 0 ( 350)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 3409 M 63 0 V 209 403 R -63 0 V stroke 6544 3812 M [ [(Helvetica) 140.0 0.0 true true 0 ( 400)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 3812 M 63 0 V 209 403 R -63 0 V stroke 6544 4215 M [ [(Helvetica) 140.0 0.0 true true 0 ( 450)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 4215 M 63 0 V 209 404 R -63 0 V stroke 6544 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 500)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6188 4619 M 63 0 V 0.300 UP stroke LTb LCb setrgbcolor grestore % colour palette end stroke grestore end showpage %%Trailer %%DocumentFonts: Arial-Bold Helvetica gsl-doc-2.3/doc/sort.texi0000664000175000017500000003136512620026734013423 0ustar eddedd@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}, const 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_sort2 (double * @var{data1}, const size_t @var{stride1}, double * @var{data2}, const size_t @var{stride2}, size_t @var{n}) This function sorts the @var{n} elements of the array @var{data1} with stride @var{stride1} into ascending numerical order, while making the same rearrangement of the array @var{data2} with stride @var{stride2}, also of size @var{n}. @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 @deftypefun void gsl_sort_vector2 (gsl_vector * @var{v1}, gsl_vector * @var{v2}) This function sorts the elements of the vector @var{v1} into ascending numerical order, while making the same rearrangement of the vector @var{v2}. @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.txt @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 @w{} @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 @w{} @item Robert Sedgewick, @cite{Algorithms in C}, Addison-Wesley, ISBN 0201514257. @end itemize gsl-doc-2.3/doc/rand-rayleigh-tail.tex0000664000175000017500000005340412616157443015745 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-rayleigh-tail.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-rayleigh-tail.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1978 R -31 0 V 31 1979 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 3957 V 19 -2 V 20 -3 V 19 -6 V 19 -8 V 20 -10 V 19 -12 V 20 -14 V 19 -16 V 20 -17 V 19 -20 V 19 -21 V 20 -23 V 19 -25 V 20 -26 V 19 -28 V 20 -29 V 19 -30 V 19 -32 V 20 -34 V 19 -34 V 20 -36 V 19 -37 V 20 -38 V 19 -39 V 19 -40 V 20 -41 V 19 -42 V 20 -43 V 19 -43 V 20 -44 V 19 -45 V 19 -46 V 20 -45 V 19 -47 V 20 -47 V 19 -47 V 20 -48 V 19 -47 V 19 -49 V 20 -48 V 19 -48 V 20 -49 V 3052 3180 L 20 -48 V 19 -49 V 19 -49 V 20 -48 V 19 -49 V 20 -48 V 19 -48 V 20 -48 V 19 -47 V 19 -47 V 20 -47 V 19 -47 V 20 -46 V 19 -45 V 20 -46 V 19 -45 V 19 -44 V 20 -44 V 19 -43 V 20 -43 V 19 -42 V 20 -42 V 19 -41 V 19 -40 V 20 -40 V 19 -39 V 20 -39 V 19 -38 V 20 -37 V 19 -37 V 19 -36 V 20 -35 V 19 -35 V 20 -34 V 19 -33 V 20 -32 V 19 -32 V 19 -31 V 20 -31 V 19 -30 V 20 -29 V 19 -28 V 20 -28 V 19 -27 V 19 -27 V 20 -26 V 19 -25 V 20 -24 V 19 -24 V 19 -24 V 20 -22 V 19 -22 V 20 -22 V 19 -20 V 20 -21 V 19 -19 V 19 -19 V 20 -19 V 19 -17 V 20 -18 V 19 -17 V 20 -16 V 19 -16 V 19 -15 V 20 -15 V 19 -14 V 20 -14 V 19 -13 V 20 -13 V 19 -13 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 19 -8 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -6 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 5092 685 L 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 -1 V 19 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 0 V 19 -1 V 20 0 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 -1 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 0 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 496 V 19 16 V 20 15 V 19 15 V 20 15 V 19 15 V 19 15 V 20 15 V 19 15 V 20 14 V 19 15 V 20 14 V 19 14 V 19 14 V 20 14 V 19 14 V 20 13 V 19 14 V 20 13 V 19 13 V 19 13 V 20 13 V 19 12 V 20 13 V 19 12 V 20 13 V 19 12 V 19 11 V 20 12 V 19 12 V 20 11 V 19 11 V 20 11 V 19 11 V 19 11 V 20 10 V 19 10 V 20 10 V 19 10 V 20 10 V 19 10 V 19 9 V 20 9 V 19 9 V 20 9 V 19 9 V 20 8 V 19 8 V 19 8 V 20 8 V 19 8 V 20 7 V 19 7 V 20 7 V 19 7 V 19 7 V 20 6 V 19 7 V 20 6 V 19 6 V 20 5 V 19 6 V 19 5 V 20 5 V 19 5 V 20 5 V 19 4 V 20 5 V 19 4 V 19 4 V 20 3 V 19 4 V 20 3 V 3052 1844 L 20 3 V 19 3 V 19 3 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 0 V 20 1 V 19 0 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 5092 1413 L 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -8 V 19 -7 V 19 -7 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -7 V 19 -6 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -7 V 19 -6 V 20 -7 V 19 -6 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -6 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -4 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=0.5,\sigma=2$}}% \put(5957,4781){\rjust{\strut{}$a=1,\sigma=1$}}% \put(3955,5244){\cjust{\strut{}Rayleigh Tail Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4588){\rjust{\strut{} 1}}% \put(900,2609){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/combination.texi0000664000175000017500000002051012620026734014724 0ustar eddedd@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 @tindex gsl_combination 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. @inlinefn{} @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}. In ISO C99 the type modifier @code{z} represents @code{size_t}, so @code{"%zu\n"} is a suitable format.@footnote{In versions of the GNU C library prior to the ISO C99 standard, the type modifier @code{Z} was used instead.} 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.txt @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 @w{} @item Donald L. Kreher, Douglas R. Stinson, @cite{Combinatorial Algorithms: Generation, Enumeration and Search}, 1998, CRC Press LLC, ISBN 084933988X @end itemize @noindent gsl-doc-2.3/doc/specfunc-log.texi0000664000175000017500000000360712616157443015026 0ustar eddedd@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 gsl-doc-2.3/doc/specfunc.texi0000664000175000017500000002440112620026734014233 0ustar eddedd@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 @tindex gsl_sf_result @tindex 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.txt @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.txt @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 @w{} @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 @w{} @item Allan J. MacLeod, 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 N. M. Temme, Special Functions: An Introduction to the Classical Functions of Mathematical Physics (1996), ISBN 978-0471113133. @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). @item S. A. Holmes and W. E. Featherstone, A unified approach to the Clenshaw summation and the recursive computation of very high degree and order normalised associated Legendre functions, Journal of Geodesy, 76, pg. 279-299, 2002. @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 gsl-doc-2.3/doc/histogram.eps0000664000175000017500000013144512616157443014256 0ustar eddedd%!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 gsl-doc-2.3/doc/linalg.texi0000644000175000017500000022362113017374533013702 0ustar eddedd@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} with Level-1 and Level-2 BLAS calls for efficiency. 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:: * Complete Orthogonal Decomposition:: * Singular Value Decomposition:: * Cholesky Decomposition:: * Pivoted Cholesky Decomposition:: * Modified Cholesky Decomposition:: * Tridiagonal Decomposition of Real Symmetric Matrices:: * Tridiagonal Decomposition of Hermitian Matrices:: * Hessenberg Decomposition of Real Matrices:: * Hessenberg-Triangular Decomposition of Real Matrices:: * Bidiagonalization:: * Givens Rotations:: * Householder Transformations:: * Householder solver for linear systems:: * Tridiagonal Systems:: * Triangular Systems:: * Balancing:: * Linear Algebra Examples:: * Linear Algebra References and Further Reading:: @end menu @node LU Decomposition @section LU Decomposition @cindex LU decomposition A general @math{N}-by-@math{N} 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} on output. 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} as input. @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 precomputed @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{work}) @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{work}) These functions apply an iterative improvement to @var{x}, the solution of @math{A x = b}, from the precomputed @math{LU} decomposition of @math{A} into (@var{LU},@var{p}). Additional workspace of length @var{N} is required in @var{work}. @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} held in (@var{QR}, @var{tau}) which must have been computed previously with @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} held in (@var{QR},@var{tau}) which must have been computed previously 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 requires as input 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_QTmat (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, gsl_matrix * @var{A}) This function applies the matrix @math{Q^T} encoded in the decomposition (@var{QR},@var{tau}) to the matrix @var{A}, storing the result @math{Q^T A} in @var{A}. 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_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 of an @math{M}-by-@math{N} matrix @math{A} 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}. When @math{A} is rank deficient with @math{r = {\rm rank}(A)}, the matrix @math{R} can be partitioned as @tex \beforedisplay $$ R = \left( \matrix{ R_{11} & R_{12} \cr 0 & R_{22} \cr } \right) \approx \left( \matrix{ R_{11} & R_{12} \cr 0 & 0 \cr } \right) $$ \afterdisplay @end tex @ifinfo @example R = [ R11 R12; 0 R22 ] =~ [ R11 R12; 0 0 ] @end example @end ifinfo where @math{R_{11}} is @math{r}-by-@math{r} and nonsingular. In this case, a ``basic'' least squares solution for the overdetermined system @math{A x = b} can be obtained as @tex \beforedisplay $$ x = P \left( \matrix{ R_{11}^{-1} c_1 \cr 0 \cr } \right) $$ \afterdisplay @end tex @ifinfo @example x = P [ R11^-1 c1 ; 0 ] @end example @end ifinfo where @math{c_1} consists of the first @math{r} elements of @math{Q^T b}. This basic solution is not guaranteed to be the minimum norm solution unless @math{R_{12} = 0} (see @ref{Complete Orthogonal Decomposition}). @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} held in (@var{QR}, @var{tau}, @var{p}) which must have been computed previously 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} held in (@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_lssolve (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_permutation * @var{p}, 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 and is assumed to have full rank. The least squares solution minimizes the Euclidean norm of the residual, @math{||b - A x||}. The routine requires as input the @math{QR} decomposition of @math{A} into (@var{QR}, @var{tau}, @var{p}) given by @code{gsl_linalg_QRPT_decomp}. The solution is returned in @var{x}. The residual is computed as a by-product and stored in @var{residual}. For rank deficient matrices, @code{gsl_linalg_QRPT_lssolve2} should be used instead. @end deftypefun @deftypefun int gsl_linalg_QRPT_lssolve2 (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, const size_t @var{rank}, 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 and has rank given by the input @var{rank}. If the user does not know the rank of @math{A}, the routine @code{gsl_linalg_QRPT_rank} can be called to estimate it. The least squares solution is the so-called ``basic'' solution discussed above and may not be the minimum norm solution. The routine requires as input the @math{QR} decomposition of @math{A} into (@var{QR}, @var{tau}, @var{p}) given by @code{gsl_linalg_QRPT_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_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{w}, 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 P)} 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 @deftypefun size_t gsl_linalg_QRPT_rank (const gsl_matrix * @var{QR}, const double @var{tol}) This function estimates the rank of the triangular matrix @math{R} contained in @var{QR}. The algorithm simply counts the number of diagonal elements of @math{R} whose absolute value is greater than the specified tolerance @var{tol}. If the input @var{tol} is negative, a default value of @math{20 (M + N) eps(max(|diag(R)|))} is used. @end deftypefun @deftypefun int gsl_linalg_QRPT_rcond (const gsl_matrix * @var{QR}, double * @var{rcond}, gsl_vector * @var{work}) This function estimates the reciprocal condition number (using the 1-norm) of the @math{R} factor, stored in the upper triangle of @var{QR}. The reciprocal condition number estimate, defined as @math{1 / (||R||_1 \cdot ||R^{-1}||_1)}, is stored in @var{rcond}. Additional workspace of size @math{3 N} is required in @var{work}. @end deftypefun @node Complete Orthogonal Decomposition @section Complete Orthogonal Decomposition The complete orthogonal decomposition of a @math{M}-by-@math{N} matrix @math{A} is a generalization of the QR decomposition with column pivoting, given by @tex \beforedisplay $$ A P = Q \left( \matrix{ R_{11} & 0 \cr 0 & 0 \cr } \right) Z $$ \afterdisplay @end tex @ifinfo @example A P = Q [ R11 0 ] Z [ 0 0 ] @end example @end ifinfo @noindent where @math{P} is a @math{N}-by-@math{N} permutation matrix, @math{Q} is @math{M}-by-@math{M} orthogonal, @math{R_{11}} is @math{r}-by-@math{r} upper triangular, with @math{r = {\rm rank}(A)}, and @math{Z} is @math{N}-by-@math{N} orthogonal. If @math{A} has full rank, then @math{R_{11} = R}, @math{Z = I} and this reduces to the QR decomposition with column pivoting. The advantage of using the complete orthogonal decomposition for rank deficient matrices is the ability to compute the minimum norm solution to the linear least squares problem @math{Ax = b}, which is given by @tex \beforedisplay $$ x = P Z^T \left( \matrix{ R_{11}^{-1} c_1 \cr 0 \cr } \right) $$ \afterdisplay @end tex @ifinfo @example x = P Z^T [ R11^-1 c1 ] [ 0 ] @end example @end ifinfo and the vector @math{c_1} is the first @math{r} elements of @math{Q^T b}. @deftypefun int gsl_linalg_COD_decomp (gsl_matrix * @var{A}, gsl_vector * @var{tau_Q}, gsl_vector * @var{tau_Z}, gsl_permutation * @var{p}, size_t * @var{rank}, gsl_vector * @var{work}) @deftypefunx int gsl_linalg_COD_decomp_e (gsl_matrix * @var{A}, gsl_vector * @var{tau_Q}, gsl_vector * @var{tau_Z}, gsl_permutation * @var{p}, double @var{tol}, size_t * @var{rank}, gsl_vector * @var{work}) These functions factor the @math{M}-by-@math{N} matrix @var{A} into the decomposition @math{A = Q R Z P^T}. The rank of @var{A} is computed as the number of diagonal elements of @math{R} greater than the tolerance @var{tol} and output in @var{rank}. If @var{tol} is not specified, a default value is used (see @code{gsl_linalg_QRPT_rank}). On output, the permutation matrix @math{P} is stored in @var{p}. The matrix @math{R_{11}} is stored in the upper @var{rank}-by-@var{rank} block of @var{A}. The matrices @math{Q} and @math{Z} are encoded in packed storage in @var{A} on output. The vectors @var{tau_Q} and @var{tau_Z} contain the Householder scalars corresponding to the matrices @math{Q} and @math{Z} respectively and must be of length @math{k = \min(M,N)}. The vector @var{work} is additional workspace of length @math{N}. @end deftypefun @deftypefun int gsl_linalg_COD_lssolve (const gsl_matrix * @var{QRZ}, const gsl_vector * @var{tau_Q}, const gsl_vector * @var{tau_Z}, const gsl_permutation * @var{p}, const size_t @var{rank}, 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{||b - A x||}. The routine requires as input the @math{QRZ} decomposition of @math{A} into (@var{QRZ}, @var{tau_Q}, @var{tau_Z}, @var{p}, @var{rank}) given by @code{gsl_linalg_COD_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_COD_unpack (const gsl_matrix * @var{QRZ}, const gsl_vector * @var{tau_Q}, const gsl_vector * @var{tau_Z}, const size_t @var{rank}, gsl_matrix * @var{Q}, gsl_matrix * @var{R}, gsl_matrix * @var{Z}) This function unpacks the encoded @math{QRZ} decomposition (@var{QRZ}, @var{tau_Q}, @var{tau_Z}, @var{rank}) into the matrices @var{Q}, @var{R}, and @var{Z}, where @var{Q} is @math{M}-by-@math{M}, @var{R} is @math{M}-by-@math{N}, and @var{Z} is @math{N}-by-@math{N}. @end deftypefun @deftypefun int gsl_linalg_COD_matZ (const gsl_matrix * @var{QRZ}, const gsl_vector * @var{tau_Z}, const size_t @var{rank}, gsl_matrix * @var{A}, gsl_vector * @var{work}) This function multiplies the input matrix @var{A} on the right by @var{Z}, @math{A' = A Z} using the encoded @math{QRZ} decomposition (@var{QRZ}, @var{tau_Z}, @var{rank}). @var{A} must have @math{N} columns but may have any number of rows. Additional workspace of length @math{M} is provided in @var{work}. @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. Note that the routines here compute the ``thin'' version of the SVD with @math{U} as @math{M}-by-@math{N} orthogonal matrix. This allows in-place computation and is the most commonly-used form in practice. Mathematically, the ``full'' SVD is defined with @math{U} as an @math{M}-by-@math{M} orthogonal matrix and @math{S} as an @math{M}-by-@math{N} diagonal matrix (with additional rows of zeros). @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}) @cindex Jacobi orthogonalization 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 (const gsl_matrix * @var{U}, const gsl_matrix * @var{V}, const 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} which must have been computed previously with @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 @deftypefun int gsl_linalg_SV_leverage (const gsl_matrix * @var{U}, gsl_vector * @var{h}) This function computes the statistical leverage values @math{h_i} of a matrix @math{A} using its singular value decomposition (@var{U}, @var{S}, @var{V}) previously computed with @code{gsl_linalg_SV_decomp}. @math{h_i} are the diagonal values of the matrix @math{A (A^T A)^{-1} A^T} and depend only on the matrix @var{U} which is the input to this function. @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. If the matrix @math{A} is near singular, it is sometimes possible to reduce the condition number and recover a more accurate solution vector @math{x} by scaling as @tex \beforedisplay $$ \left( S A S \right) \left( S^{-1} x \right) = S b $$ \afterdisplay @end tex @ifinfo @example ( S A S ) ( S^(-1) x ) = S b @end example @end ifinfo where @math{S} is a diagonal matrix whose elements are given by @math{S_{ii} = 1/\sqrt{A_{ii}}}. This scaling is also known as Jacobi preconditioning. There are routines below to solve both the scaled and unscaled systems. @deftypefun int gsl_linalg_cholesky_decomp1 (gsl_matrix * @var{A}) @deftypefunx int gsl_linalg_complex_cholesky_decomp (gsl_matrix_complex * @var{A}) These functions factorize the symmetric, positive-definite square matrix @var{A} into the Cholesky decomposition @math{A = L L^T} (or @c{$A = L L^{\dagger}$} @math{A = L L^H} for the complex case). On input, the values from the diagonal and lower-triangular part of the matrix @var{A} are used (the upper triangular part is ignored). On output the diagonal and lower triangular part of the input matrix @var{A} contain the matrix @math{L}, while the upper triangular part is unmodified. If the matrix is not positive-definite then the decomposition will fail, returning the error code @code{GSL_EDOM}. When testing whether a matrix is positive-definite, disable the error handler first to avoid triggering an error. @end deftypefun @deftypefun int gsl_linalg_cholesky_decomp (gsl_matrix * @var{A}) This function is now deprecated and is provided only for backward compatibility. @end deftypefun @deftypefun int gsl_linalg_cholesky_solve (const gsl_matrix * @var{cholesky}, const gsl_vector * @var{b}, gsl_vector * @var{x}) @deftypefunx int gsl_linalg_complex_cholesky_solve (const gsl_matrix_complex * @var{cholesky}, const gsl_vector_complex * @var{b}, gsl_vector_complex * @var{x}) These functions solve the system @math{A x = b} using the Cholesky decomposition of @math{A} held in the matrix @var{cholesky} which must have been previously computed by @code{gsl_linalg_cholesky_decomp} or @code{gsl_linalg_complex_cholesky_decomp}. @end deftypefun @deftypefun int gsl_linalg_cholesky_svx (const gsl_matrix * @var{cholesky}, gsl_vector * @var{x}) @deftypefunx int gsl_linalg_complex_cholesky_svx (const gsl_matrix_complex * @var{cholesky}, gsl_vector_complex * @var{x}) These functions solve the system @math{A x = b} in-place using the Cholesky decomposition of @math{A} held in the matrix @var{cholesky} which must have been previously computed by @code{gsl_linalg_cholesky_decomp} or @code{gsl_linalg_complex_cholesky_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_cholesky_invert (gsl_matrix * @var{cholesky}) @deftypefunx int gsl_linalg_complex_cholesky_invert (gsl_matrix_complex * @var{cholesky}) These functions compute the inverse of a matrix from its Cholesky decomposition @var{cholesky}, which must have been previously computed by @code{gsl_linalg_cholesky_decomp} or @code{gsl_linalg_complex_cholesky_decomp}. On output, the inverse is stored in-place in @var{cholesky}. @end deftypefun @deftypefun int gsl_linalg_cholesky_decomp2 (gsl_matrix * @var{A}, gsl_vector * @var{S}) This function calculates a diagonal scaling transformation @math{S} for the symmetric, positive-definite square matrix @var{A}, and then computes the Cholesky decomposition @math{S A S = L L^T}. On input, the values from the diagonal and lower-triangular part of the matrix @var{A} are used (the upper triangular part is ignored). On output the diagonal and lower triangular part of the input matrix @var{A} contain the matrix @math{L}, while the upper triangular part of the input matrix is overwritten with @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}. The diagonal scale factors are stored in @var{S} on output. When testing whether a matrix is positive-definite, disable the error handler first to avoid triggering an error. @end deftypefun @deftypefun int gsl_linalg_cholesky_solve2 (const gsl_matrix * @var{cholesky}, const gsl_vector * @var{S}, const gsl_vector * @var{b}, gsl_vector * @var{x}) This function solves the system @math{(S A S) (S^{-1} x) = S b} using the Cholesky decomposition of @math{S A S} held in the matrix @var{cholesky} which must have been previously computed by @code{gsl_linalg_cholesky_decomp2}. @end deftypefun @deftypefun int gsl_linalg_cholesky_svx2 (const gsl_matrix * @var{cholesky}, const gsl_vector * @var{S}, gsl_vector * @var{x}) This function solves the system @math{(S A S) (S^{-1} x) = S b} in-place using the Cholesky decomposition of @math{S A S} held in the matrix @var{cholesky} which must have been previously computed by @code{gsl_linalg_cholesky_decomp2}. 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_cholesky_scale (const gsl_matrix * @var{A}, gsl_vector * @var{S}) This function calculates a diagonal scaling transformation of the symmetric, positive definite matrix @var{A}, such that @math{S A S} has a condition number within a factor of @math{N} of the matrix of smallest possible condition number over all possible diagonal scalings. On output, @var{S} contains the scale factors, given by @math{S_i = 1/\sqrt{A_{ii}}}. For any @math{A_{ii} \le 0}, the corresponding scale factor @math{S_i} is set to @math{1}. @end deftypefun @deftypefun int gsl_linalg_cholesky_scale_apply (gsl_matrix * @var{A}, const gsl_vector * @var{S}) This function applies the scaling transformation @var{S} to the matrix @var{A}. On output, @var{A} is replaced by @math{S A S}. @end deftypefun @deftypefun int gsl_linalg_cholesky_rcond (const gsl_matrix * @var{cholesky}, double * @var{rcond}, gsl_vector * @var{work}) This function estimates the reciprocal condition number (using the 1-norm) of the symmetric positive definite matrix @math{A}, using its Cholesky decomposition provided in @var{cholesky}. The reciprocal condition number estimate, defined as @math{1 / (||A||_1 \cdot ||A^{-1}||_1)}, is stored in @var{rcond}. Additional workspace of size @math{3 N} is required in @var{work}. @end deftypefun @node Pivoted Cholesky Decomposition @section Pivoted Cholesky Decomposition @cindex Cholesky decomposition, pivoted @cindex Pivoted Cholesky Decomposition A symmetric, positive definite square matrix @math{A} has an alternate Cholesky decomposition into a product of a lower unit triangular matrix @math{L}, a diagonal matrix @math{D} and @math{L^T}, given by @math{L D L^T}. This is equivalent to the Cholesky formulation discussed above, with the standard Cholesky lower triangular factor given by @math{L D^{1 \over 2}}. For ill-conditioned matrices, it can help to use a pivoting strategy to prevent the entries of @math{D} and @math{L} from growing too large, and also ensure @math{D_1 \ge D_2 \ge \cdots \ge D_n > 0}, where @math{D_i} are the diagonal entries of @math{D}. The final decomposition is given by @tex \beforedisplay $$ P A P^T = L D L^T $$ \afterdisplay @end tex @ifinfo @example P A P^T = L D L^T @end example @end ifinfo where @math{P} is a permutation matrix. @deftypefun int gsl_linalg_pcholesky_decomp (gsl_matrix * @var{A}, gsl_permutation * @var{p}) This function factors the symmetric, positive-definite square matrix @var{A} into the Pivoted Cholesky decomposition @math{P A P^T = L D L^T}. On input, the values from the diagonal and lower-triangular part of the matrix @var{A} are used to construct the factorization. On output the diagonal of the input matrix @var{A} stores the diagonal elements of @math{D}, and the lower triangular portion of @var{A} contains the matrix @math{L}. Since @math{L} has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of @var{A} is unmodified. The permutation matrix @math{P} is stored in @var{p} on output. @end deftypefun @deftypefun int gsl_linalg_pcholesky_solve (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x}) This function solves the system @math{A x = b} using the Pivoted Cholesky decomposition of @math{A} held in the matrix @var{LDLT} and permutation @var{p} which must have been previously computed by @code{gsl_linalg_pcholesky_decomp}. @end deftypefun @deftypefun int gsl_linalg_pcholesky_svx (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, gsl_vector * @var{x}) This function solves the system @math{A x = b} in-place using the Pivoted Cholesky decomposition of @math{A} held in the matrix @var{LDLT} and permutation @var{p} which must have been previously computed by @code{gsl_linalg_pcholesky_decomp}. On input, @var{x} contains the right hand side vector @math{b} which is replaced by the solution vector on output. @end deftypefun @deftypefun int gsl_linalg_pcholesky_decomp2 (gsl_matrix * @var{A}, gsl_permutation * @var{p}, gsl_vector * @var{S}) This function computes the pivoted Cholesky factorization of the matrix @math{S A S}, where the input matrix @var{A} is symmetric and positive definite, and the diagonal scaling matrix @var{S} is computed to reduce the condition number of @var{A} as much as possible. See @ref{Cholesky Decomposition} for more information on the matrix @var{S}. The Pivoted Cholesky decomposition satisfies @math{P S A S P^T = L D L^T}. On input, the values from the diagonal and lower-triangular part of the matrix @var{A} are used to construct the factorization. On output the diagonal of the input matrix @var{A} stores the diagonal elements of @math{D}, and the lower triangular portion of @var{A} contains the matrix @math{L}. Since @math{L} has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of @var{A} is unmodified. The permutation matrix @math{P} is stored in @var{p} on output. The diagonal scaling transformation is stored in @var{S} on output. @end deftypefun @deftypefun int gsl_linalg_pcholesky_solve2 (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, const gsl_vector * @var{S}, const gsl_vector * @var{b}, gsl_vector * @var{x}) This function solves the system @math{(S A S) (S^{-1} x) = S b} using the Pivoted Cholesky decomposition of @math{S A S} held in the matrix @var{LDLT}, permutation @var{p}, and vector @var{S}, which must have been previously computed by @code{gsl_linalg_pcholesky_decomp2}. @end deftypefun @deftypefun int gsl_linalg_pcholesky_svx2 (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, const gsl_vector * @var{S}, gsl_vector * @var{x}) This function solves the system @math{(S A S) (S^{-1} x) = S b} in-place using the Pivoted Cholesky decomposition of @math{S A S} held in the matrix @var{LDLT}, permutation @var{p} and vector @var{S}, which must have been previously computed by @code{gsl_linalg_pcholesky_decomp2}. On input, @var{x} contains the right hand side vector @math{b} which is replaced by the solution vector on output. @end deftypefun @deftypefun int gsl_linalg_pcholesky_invert (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, gsl_matrix * @var{Ainv}) This function computes the inverse of the matrix @math{A}, using the Pivoted Cholesky decomposition stored in @var{LDLT} and @var{p}. On output, the matrix @var{Ainv} contains @math{A^{-1}}. @end deftypefun @deftypefun int gsl_linalg_pcholesky_rcond (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, double * @var{rcond}, gsl_vector * @var{work}) This function estimates the reciprocal condition number (using the 1-norm) of the symmetric positive definite matrix @math{A}, using its pivoted Cholesky decomposition provided in @var{LDLT}. The reciprocal condition number estimate, defined as @math{1 / (||A||_1 \cdot ||A^{-1}||_1)}, is stored in @var{rcond}. Additional workspace of size @math{3 N} is required in @var{work}. @end deftypefun @node Modified Cholesky Decomposition @section Modified Cholesky Decomposition @cindex Cholesky decomposition, modified @cindex Modified Cholesky Decomposition The modified Cholesky decomposition is suitable for solving systems @math{A x = b} where @math{A} is a symmetric indefinite matrix. Such matrices arise in nonlinear optimization algorithms. The standard Cholesky decomposition requires a positive definite matrix and would fail in this case. Instead of resorting to a method like QR or SVD, which do not take into account the symmetry of the matrix, we can instead introduce a small perturbation to the matrix @math{A} to make it positive definite, and then use a Cholesky decomposition on the perturbed matrix. The resulting decomposition satisfies @tex \beforedisplay $$ P (A + E) P^T = L D L^T $$ \afterdisplay @end tex @ifinfo @example P (A + E) P^T = L D L^T @end example @end ifinfo where @math{P} is a permutation matrix, @math{E} is a diagonal perturbation matrix, @math{L} is unit lower triangular, and @math{D} is diagonal. If @math{A} is sufficiently positive definite, then the perturbation matrix @math{E} will be zero and this method is equivalent to the pivoted Cholesky algorithm. For indefinite matrices, the perturbation matrix @math{E} is computed to ensure that @math{A + E} is positive definite and well conditioned. @deftypefun int gsl_linalg_mcholesky_decomp (gsl_matrix * @var{A}, gsl_permutation * @var{p}, gsl_vector * @var{E}) This function factors the symmetric, indefinite square matrix @var{A} into the Modified Cholesky decomposition @math{P (A + E) P^T = L D L^T}. On input, the values from the diagonal and lower-triangular part of the matrix @var{A} are used to construct the factorization. On output the diagonal of the input matrix @var{A} stores the diagonal elements of @math{D}, and the lower triangular portion of @var{A} contains the matrix @math{L}. Since @math{L} has ones on its diagonal these do not need to be explicitely stored. The upper triangular portion of @var{A} is unmodified. The permutation matrix @math{P} is stored in @var{p} on output. The diagonal perturbation matrix is stored in @var{E} on output. The parameter @var{E} may be set to NULL if it is not required. @end deftypefun @deftypefun int gsl_linalg_mcholesky_solve (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x}) This function solves the perturbed system @math{(A + E) x = b} using the Cholesky decomposition of @math{A + E} held in the matrix @var{LDLT} and permutation @var{p} which must have been previously computed by @code{gsl_linalg_mcholesky_decomp}. @end deftypefun @deftypefun int gsl_linalg_mcholesky_svx (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, gsl_vector * @var{x}) This function solves the perturbed system @math{(A + E) x = b} in-place using the Cholesky decomposition of @math{A + E} held in the matrix @var{LDLT} and permutation @var{p} which must have been previously computed by @code{gsl_linalg_mcholesky_decomp}. On input, @var{x} contains the right hand side vector @math{b} which is replaced by the solution vector on output. @end deftypefun @deftypefun int gsl_linalg_mcholesky_rcond (const gsl_matrix * @var{LDLT}, const gsl_permutation * @var{p}, double * @var{rcond}, gsl_vector * @var{work}) This function estimates the reciprocal condition number (using the 1-norm) of the perturbed matrix @math{A + E}, using its pivoted Cholesky decomposition provided in @var{LDLT}. The reciprocal condition number estimate, defined as @math{1 / (||A + E||_1 \cdot ||(A + E)^{-1}||_1)}, is stored in @var{rcond}. Additional workspace of size @math{3 N} is required in @var{work}. @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 unitary matrix @math{U}. 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{U}, 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 real 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_decomp (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_decomp}. @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 int 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_decomp}. @end deftypefun @node Hessenberg-Triangular Decomposition of Real Matrices @section Hessenberg-Triangular Decomposition of Real Matrices @cindex Hessenberg triangular decomposition A general real matrix pair (@math{A}, @math{B}) can be decomposed by orthogonal similarity transformations into the form @tex \beforedisplay $$ A = U H V^T $$ $$ B = U R V^T $$ \afterdisplay @end tex @ifinfo @example A = U H V^T B = U R V^T @end example @end ifinfo where @math{U} and @math{V} are orthogonal, @math{H} is an upper Hessenberg matrix, and @math{R} is upper triangular. The Hessenberg-Triangular reduction is the first step in the generalized Schur decomposition for the generalized eigenvalue problem. @deftypefun int gsl_linalg_hesstri_decomp (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_matrix * @var{U}, gsl_matrix * @var{V}, gsl_vector * @var{work}) This function computes the Hessenberg-Triangular decomposition of the matrix pair (@var{A}, @var{B}). On output, @math{H} is stored in @var{A}, and @math{R} is stored in @var{B}. If @var{U} and @var{V} are provided (they may be null), the similarity transformations are stored in them. Additional workspace of length @math{N} is needed in @var{work}. @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} produced 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} produced 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} from @code{gsl_linalg_bidiag_decomp}, into the diagonal vector @var{diag} and superdiagonal vector @var{superdiag}. @end deftypefun @node Givens Rotations @section Givens Rotations @cindex Givens rotation A Givens rotation is a rotation in the plane acting on two elements of a given vector. It can be represented in matrix form as @tex \beforedisplay $$ G(i,j,\theta) = \left( \matrix{ 1 & \ldots & 0 & \ldots & 0 & \ldots & 0 \cr \vdots & \ddots & \vdots & & \vdots & & \vdots \cr 0 & \ldots & \cos{\theta} & \ldots & -\sin{\theta} & \ldots & 0 \cr \vdots & & \vdots & \ddots & \vdots & & \vdots \cr 0 & \ldots & \sin{\theta} & \ldots & \cos{\theta} & \ldots & 0 \cr \vdots & & \vdots & & \vdots & \ddots & \vdots \cr 0 & \ldots & 0 & \ldots & 0 & \ldots & 1 \cr } \right) $$ \afterdisplay @end tex @ifinfo @example @end example @end ifinfo where the @math{\cos{\theta}} and @math{\sin{\theta}} appear at the intersection of the @math{i}th and @math{j}th rows and columns. When acting on a vector @math{x}, @math{G(i,j,\theta) x} performs a rotation of the @math{(i,j)} elements of @math{x}. Givens rotations are typically used to introduce zeros in vectors, such as during the QR decomposition of a matrix. In this case, it is typically desired to find @math{c} and @math{s} such that @tex \beforedisplay $$ \left( \matrix{ c & -s \cr s & c } \right) \left( \matrix{ a \cr b } \right) = \left( \matrix{ r \cr 0 } \right) $$ \afterdisplay @end tex @ifinfo @example @end example @end ifinfo with @math{r = \sqrt{a^2 + b^2}}. @deftypefun void gsl_linalg_givens (const double @var{a}, const double @var{b}, double * @var{c}, double * @var{s}) This function computes @math{c = \cos{\theta}} and @math{s = \sin{\theta}} so that the Givens matrix @math{G(\theta)} acting on the vector @math{(a,b)} produces @math{(r, 0)}, with @math{r = \sqrt{a^2 + b^2}}. @end deftypefun @deftypefun void gsl_linalg_givens_gv (gsl_vector * @var{v}, const size_t @var{i}, const size_t @var{j}, const double @var{c}, const double @var{s}) This function applies the Givens rotation defined by @math{c = \cos{\theta}} and @math{s = \sin{\theta}} to the @var{i} and @var{j} elements of @var{v}. On output, @math{(v(i),v(j)) \leftarrow G(\theta) (v(i),v(j))}. @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{w}) @deftypefunx gsl_complex gsl_linalg_complex_householder_transform (gsl_vector_complex * @var{w}) 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 @var{w} except the first. On output the Householder vector @var{v} is stored in @var{w} and the scalar @math{\tau} is returned. The householder vector @var{v} is normalized so that @var{v}[0] = 1, however this 1 is not stored in the output vector. Instead, @var{w}[0] is set to the first element of the transformed vector, so that if @math{u = P w}, @var{w}[0] = @math{u}[0] on output and the remainder of @math{u} is zero. @end deftypefun @deftypefun int gsl_linalg_householder_hm (double @var{tau}, const gsl_vector * @var{v}, gsl_matrix * @var{A}) @deftypefunx int gsl_linalg_complex_householder_hm (gsl_complex @var{tau}, const gsl_vector_complex * @var{v}, gsl_matrix_complex * @var{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 @var{tau}, const gsl_vector * @var{v}, gsl_matrix * @var{A}) @deftypefunx int gsl_linalg_complex_householder_mh (gsl_complex @var{tau}, const gsl_vector_complex * @var{v}, gsl_matrix_complex * @var{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 @var{tau}, const gsl_vector * @var{v}, gsl_vector * @var{w}) @deftypefunx int gsl_linalg_complex_householder_hv (gsl_complex @var{tau}, const gsl_vector_complex * @var{v}, gsl_vector_complex * @var{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 The functions described in this section efficiently solve symmetric, non-symmetric and cyclic tridiagonal systems with minimal storage. Note that the current implementations of these functions use a variant of Cholesky decomposition, so the tridiagonal matrix must be positive definite. For non-positive definite matrices, the functions return the error code @code{GSL_ESING}. @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 @noindent @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 @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 Triangular Systems @section Triangular Systems @cindex triangular systems @deftypefun int gsl_linalg_tri_upper_invert (gsl_matrix * @var{T}) @deftypefunx int gsl_linalg_tri_lower_invert (gsl_matrix * @var{T}) @deftypefunx int gsl_linalg_tri_upper_unit_invert (gsl_matrix * @var{T}) @deftypefunx int gsl_linalg_tri_lower_unit_invert (gsl_matrix * @var{T}) These functions calculate the in-place inverse of the triangular matrix @var{T}. When the @code{upper} prefix is specified, then the upper triangle of @var{T} is used, and when the @code{lower} prefix is specified, the lower triangle is used. If the @code{unit} prefix is specified, then the diagonal elements of the matrix @var{T} are taken as unity and are not referenced. Otherwise the diagonal elements are used in the inversion. @end deftypefun @deftypefun int gsl_linalg_tri_upper_rcond (const gsl_matrix * @var{T}, double * @var{rcond}, gsl_vector * @var{work}) @deftypefunx int gsl_linalg_tri_lower_rcond (const gsl_matrix * @var{T}, double * @var{rcond}, gsl_vector * @var{work}) These functions estimate the reciprocal condition number, in the 1-norm, of the upper or lower @math{N}-by-@math{N} triangular matrix @var{T}. The reciprocal condition number is stored in @var{rcond} on output, and is defined by @math{1 / (||T||_1 \cdot ||T^{-1}||_1)}. Additional workspace of size @math{3 N} is required in @var{work}. @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.txt @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 @w{} @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 @w{} @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 @w{} @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 @w{} @item J.C. Nash, ``A one-sided transformation method for the singular value decomposition and algebraic eigenproblem'', @cite{Computer Journal}, Volume 18, Number 1 (1975), p 74--76 @item J.C. Nash and S. Shlien ``Simple algorithms for the partial singular value decomposition'', @cite{Computer Journal}, Volume 30 (1987), p 268--275. @item James Demmel, Kre@v{s}imir Veseli@'c, ``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 @noindent The algorithm for estimating a matrix condition number is described in the following paper, @itemize @w{} @item N. J. Higham, "FORTRAN codes for estimating the one-norm of a real or complex matrix, with applications to condition estimation", ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. @end itemize gsl-doc-2.3/doc/dwt-samp.eps0000664000175000017500000012277412616157443014022 0ustar eddedd%!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 gsl-doc-2.3/doc/ntuple.eps0000664000175000017500000003076012616157443013566 0ustar eddedd%!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 gsl-doc-2.3/doc/dwt.texi0000664000175000017500000004113212620431100013206 0ustar eddedd@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 @tindex gsl_wavelet_type 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}) @tindex gsl_wavelet 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 This 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}) @tindex gsl_wavelet_workspace 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. A null pointer is returned if insufficient memory is available. @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 form 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.txt $ graph -T ps -x 0 256 32 -h 0.3 -a dwt.txt > 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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @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 @w{} @item I. Daubechies. Orthonormal Bases of Compactly Supported Wavelets. @cite{Communications on Pure and Applied Mathematics}, 41 (1988) 909--996. @end itemize @itemize @w{} @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 @w{} @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 gsl-doc-2.3/doc/rand-flat.tex0000664000175000017500000005240512616157443014140 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-flat.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-flat.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 2157 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 3033 2788 L 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -2157 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 5053 631 L 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 1198 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 3033 1829 L 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 5073 1829 L 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -1198 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=1.2,b=4.8$}}% \put(5957,4781){\rjust{\strut{}$a=0.5,b=2.5$}}% \put(3955,5244){\cjust{\strut{}Flat Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/randist.texi0000644000175000017500000022737312752715635014117 0ustar eddedd@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 Multivariate 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-Muller 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}) @cindex Ziggurat method 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 Multivariate Gaussian Distribution @section The Multivariate Gaussian Distribution @deftypefun int gsl_ran_multivariate_gaussian (const gsl_rng * @var{r}, const gsl_vector * @var{mu}, const gsl_matrix * @var{L}, gsl_vector * @var{result}) @cindex Bivariate Gaussian distribution @cindex two dimensional Gaussian distribution @cindex Gaussian distribution, bivariate This function generates a random vector satisfying the @math{k}-dimensional multivariate Gaussian distribution with mean @math{\mu} and variance-covariance matrix @math{\Sigma}. On input, the @math{k}-vector @math{\mu} is given in @var{mu}, and the Cholesky factor of the @math{k}-by-@math{k} matrix @math{\Sigma = L L^T} is given in the lower triangle of @var{L}, as output from @code{gsl_linalg_cholesky_decomp}. The random vector is stored in @var{result} on output. The probability distribution for multivariate Gaussian random variates is @tex \beforedisplay $$ p(x_1,\dots,x_k) dx_1 \dots dx_k = {1 \over \sqrt{(2 \pi)^k |\Sigma|}} \exp \left(-{1 \over 2} (x - \mu)^T \Sigma^{-1} (x - \mu)\right) dx_1 \dots dx_k $$ \afterdisplay @end tex @ifinfo @example p(x_1,...,x_k) dx_1 ... dx_k = @{1 \over \sqrt@{(2 \pi)^k |\Sigma|@} \exp \left(-@{1 \over 2@} (x - \mu)^T \Sigma^@{-1@} (x - \mu)\right) dx_1 \dots dx_k @end example @end ifinfo @end deftypefun @deftypefun int gsl_ran_multivariate_gaussian_pdf (const gsl_vector * @var{x}, const gsl_vector * @var{mu}, const gsl_matrix * @var{L}, double * @var{result}, gsl_vector * @var{work}) @deftypefunx int gsl_ran_multivariate_gaussian_log_pdf (const gsl_vector * @var{x}, const gsl_vector * @var{mu}, const gsl_matrix * @var{L}, double * @var{result}, gsl_vector * @var{work}) These functions compute @math{p(x)} or @math{\log{p(x)}} at the point @var{x}, using mean vector @var{mu} and variance-covariance matrix specified by its Cholesky factor @var{L} using the formula above. Additional workspace of length @math{k} is required in @var{work}. @end deftypefun @deftypefun int gsl_ran_multivariate_gaussian_mean (const gsl_matrix * @var{X}, gsl_vector * @var{mu_hat}) Given a set of @math{n} samples @math{X_j} from a @math{k}-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the mean of the distribution, given by @tex \beforedisplay $$ \Hat{\mu} = {1 \over n} \sum_{j=1}^n X_j $$ \afterdisplay @end tex @ifinfo @example \Hat@{\mu@} = @{1 \over n@} \sum_@{j=1@}^n X_j @end example @end ifinfo The samples @math{X_1,X_2,\dots,X_n} are given in the @math{n}-by-@math{k} matrix @var{X}, and the maximum likelihood estimate of the mean is stored in @var{mu_hat} on output. @end deftypefun @deftypefun int gsl_ran_multivariate_gaussian_vcov (const gsl_matrix * @var{X}, gsl_matrix * @var{sigma_hat}) Given a set of @math{n} samples @math{X_j} from a @math{k}-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the variance-covariance matrix of the distribution, given by @tex \beforedisplay $$ \Hat{\Sigma} = {1 \over n} \sum_{j=1}^n \left( X_j - \Hat{\mu} \right) \left( X_j - \Hat{\mu} \right)^T $$ \afterdisplay @end tex @ifinfo @example \Hat@{\Sigma@} = @{1 \over n@} \sum_@{j=1@}^n \left( X_j - \Hat@{\mu@} \right) \left( X_j - \Hat@{\mu@} \right)^T @end example @end ifinfo The samples @math{X_1,X_2,\dots,X_n} are given in the @math{n}-by-@math{k} matrix @var{X} and the maximum likelihood estimate of the variance-covariance matrix is stored in @var{sigma_hat} on output. @end deftypefun @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 > 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 variables 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}) @tindex gsl_ran_discrete_t @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. Davis, @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.txt @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/randpoisson2.txt @end example @noindent The following program generates a random walk in two dimensions. @example @verbatiminclude examples/randwalk.c @end example @noindent Here is some output from the program, four 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.txt @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 @w{} @item Luc Devroye, @cite{Non-Uniform Random Variate Generation}, Springer-Verlag, ISBN 0-387-96305-7. Available online at @uref{http://cg.scs.carleton.ca/~luc/rnbookindex.html}. @end itemize @noindent The subject of random variate generation is also reviewed by Knuth, who describes algorithms for all the major distributions. @itemize @w{} @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 @w{} @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 @w{} @item William E. Kennedy and James E. Gentle, @cite{Statistical Computing} (1980), Marcel Dekker, ISBN 0-8247-6898-1. @end itemize @itemize @w{} @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 @w{} @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 @w{} @item @cite{Rational Chebyshev Approximations for the Error Function}, W.J. Cody. Mathematics of Computation 23, n107, 631--637 (July 1969). @end itemize gsl-doc-2.3/doc/specfunc-debye.texi0000664000175000017500000000441612616157443015334 0ustar eddedd@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 gsl-doc-2.3/doc/Makefile.in0000644000175000017500000011374413022372405013602 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(gsl_ref_TEXINFOS) mdate-sh \ $(srcdir)/version.texi $(srcdir)/stamp-vti texinfo.tex \ 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 = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = 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 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(man3dir)" 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 man3dir = $(mandir)/man3 NROFF = nroff MANS = $(man_MANS) DATA = $(noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . examples 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 rstat.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 multiset.texi complex.texi \ math.texi fitting.texi multifit-nlinear.texi const.texi \ ntuple.texi diff.texi qrng.texi cheb.texi multimin.texi \ gpl.texi fdl.texi autoconf.texi bspline.texi spblas.texi \ spmatrix.texi splinalg.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 interp2d.eps \ nlfit2.eps nlfit3.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 robust.eps sparse_poisson.eps \ interp_compare.eps regularized.eps regularized2.eps \ multilarge.eps noinst_DATA = $(figures) EXTRA_DIST = $(man_MANS) $(noinst_DATA) gsl-design.texi fftalgorithms.tex fftalgorithms.bib algorithm.sty algorithmic.sty calc.sty statnotes.tex all: all-recursive .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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__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; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)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.texi $(gsl_ref_TEXINFOS) gsl-ref.dvi: gsl-ref.texi $(srcdir)/version.texi $(gsl_ref_TEXINFOS) gsl-ref.pdf: gsl-ref.texi $(srcdir)/version.texi $(gsl_ref_TEXINFOS) gsl-ref.html: gsl-ref.texi $(srcdir)/version.texi $(gsl_ref_TEXINFOS) $(srcdir)/version.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.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); 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'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ 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 test -d "$(DESTDIR)$(infodir)" && 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 uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ 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; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf gsl-ref.t2d gsl-ref.t2p clean-aminfo: -test -z "gsl-ref.dvi gsl-ref.pdf gsl-ref.ps gsl-ref.html" \ || rm -rf 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: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) # 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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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; \ ($(am__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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ 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 || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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 \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-recursive all-am: Makefile $(INFO_DEPS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-aminfo clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: $(DVIS) html: html-recursive html-am: $(HTMLS) info: info-recursive info-am: $(INFO_DEPS) install-data-am: install-info-am install-man install-dvi: install-dvi-recursive install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-recursive install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-recursive install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ 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 \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ 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 install-pdf: install-pdf-recursive install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-recursive install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf-am: $(PDFS) ps: ps-recursive ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-man uninstall-pdf-am uninstall-ps-am uninstall-man: uninstall-man1 uninstall-man3 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-aminfo clean-generic clean-libtool \ cscopelist-am ctags ctags-am dist-info distclean \ 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-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am 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 tags tags-am uninstall uninstall-am \ uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-man uninstall-man1 uninstall-man3 uninstall-pdf-am \ uninstall-ps-am # 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: gsl-doc-2.3/doc/siman.texi0000664000175000017500000003036312616157443013547 0ustar eddedd@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 #-iter #-evals temperature position energy best_energy @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, $5@}' | 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: -103.2 34.41 Clovis ###final_city_coord: -96.77 32.79 Dallas ###final_city_coord: -106.76 32.34 Las Cruces ###final_city_coord: -112.07 33.54 Phoenix ###final_city_coord: -108.74 35.52 Gallup ###final_city_coord: -108.58 37.35 Cortez ###final_city_coord: -107.87 37.29 Durango ###final_city_coord: -107.84 35.15 Grants ###final_city_coord: -106.62 35.12 Albuquerque ###final_city_coord: -106.28 35.89 Los Alamos ###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 @w{} @item @cite{Modern Heuristic Techniques for Combinatorial Problems}, Colin R. Reeves (ed.), McGraw-Hill, 1995 (ISBN 0-07-709239-2). @end itemize gsl-doc-2.3/doc/ChangeLog0000664000175000017500000000427012616157443013315 0ustar eddedd2012-07-12 Rhys Ulerich * randplots.gnp: Use "set view map" to fix orientation of Bivariate Gaussian as suggested by Jorge Barros de Abreu 2009-07-10 Brian Gough * gsl-ref.texi: use the dircategory "Software libraries" as used in the Free Software Directory 2006-02-09 Brian Gough * 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 * gsl-ref.texi: small changes to update the author list. Mon Oct 23 21:49:25 2000 Brian Gough * usage.texi: added info on portability functions Sat Jul 15 23:52:59 2000 Brian Gough * Makefile.am (EXTRA_DIST): added gsl-design.texi to the distributed files Thu May 18 12:11:24 2000 Brian Gough * 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 * math.texi: added a chapter on the elementary functions and constants in gsl_math.h Tue Apr 4 21:45:27 2000 Brian Gough * upgraded texinfo.tex to texinfo-4.0 2000-04-01 Mark Galassi * roots.texi (Providing the function to solve): fixed a typo, THANKS Dave Morrison. 1999-12-03 Mark Galassi * gsl-ref.texi, gsl-design.texi: updated my email address. * gsl-design.texi: minor changes. Tue Feb 16 11:36:03 1999 Brian Gough * 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. gsl-doc-2.3/doc/rand-tdist.tex0000664000175000017500000005425112616157443014342 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-tdist.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-tdist.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 1051 631 M 0 -31 V 726 31 R 0 -31 V 726 31 R 0 -31 V 726 31 R 0 -31 V 727 31 R 0 -31 V 726 31 R 0 -31 V 726 31 R 0 -31 V 726 31 R 0 -31 V 726 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 793 M 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 3 V 19 2 V 20 2 V 19 3 V 20 2 V 19 3 V 20 2 V 19 3 V 19 3 V 20 3 V 19 2 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 4 V 20 3 V 19 3 V 20 4 V 19 3 V 19 4 V 20 4 V 19 3 V 20 4 V 19 4 V 20 4 V 19 4 V 19 5 V 20 4 V 19 4 V 20 5 V 19 5 V 20 4 V 19 5 V 19 5 V 20 5 V 19 5 V 20 6 V 19 5 V 20 6 V 19 6 V 19 6 V 20 6 V 19 6 V 20 6 V 19 7 V 20 6 V 19 7 V 19 7 V 20 8 V 19 7 V 20 8 V 19 8 V 20 8 V 19 8 V 19 9 V 20 8 V 19 9 V 20 10 V 19 9 V 20 10 V 19 10 V 19 10 V 20 11 V 19 11 V 20 11 V 19 12 V 20 12 V 19 12 V 19 13 V 20 13 V 19 14 V 20 14 V 19 14 V 20 15 V 19 15 V 19 16 V 20 16 V 19 17 V 20 18 V 19 17 V 20 19 V 19 19 V 19 20 V 20 20 V 19 21 V 20 21 V 19 23 V 20 23 V 19 23 V 19 25 V 20 25 V 19 26 V 20 27 V 3052 1709 L 20 28 V 19 30 V 19 30 V 20 31 V 19 33 V 20 33 V 19 34 V 20 35 V 19 36 V 19 37 V 20 38 V 19 40 V 20 40 V 19 41 V 20 41 V 19 43 V 19 44 V 20 44 V 19 45 V 20 46 V 19 47 V 20 46 V 19 48 V 19 47 V 20 48 V 19 48 V 20 47 V 19 47 V 20 47 V 19 46 V 19 45 V 20 44 V 19 42 V 20 41 V 19 38 V 20 37 V 19 34 V 19 32 V 20 28 V 19 26 V 20 23 V 19 19 V 20 15 V 19 12 V 19 7 V 20 4 V 19 0 V 20 -4 V 19 -7 V 19 -12 V 20 -15 V 19 -19 V 20 -23 V 19 -26 V 20 -28 V 19 -32 V 19 -34 V 20 -37 V 19 -38 V 20 -41 V 19 -42 V 20 -44 V 19 -45 V 19 -46 V 20 -47 V 19 -47 V 20 -47 V 19 -48 V 20 -48 V 19 -47 V 19 -48 V 20 -46 V 19 -47 V 20 -46 V 19 -45 V 20 -44 V 19 -44 V 19 -43 V 20 -41 V 19 -41 V 20 -40 V 19 -40 V 20 -38 V 19 -37 V 19 -36 V 20 -35 V 19 -34 V 20 -33 V 19 -33 V 20 -31 V 19 -30 V 19 -30 V 20 -28 V 19 -28 V 20 -27 V 19 -26 V 20 -25 V 19 -25 V 19 -23 V 20 -23 V 19 -23 V 20 -21 V 19 -21 V 20 -20 V 5092 1427 L 19 -19 V 20 -19 V 19 -17 V 20 -18 V 19 -17 V 20 -16 V 19 -16 V 19 -15 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 20 -13 V 19 -13 V 19 -12 V 20 -12 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -8 V 19 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -5 V 19 -4 V 20 -4 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 675 M 19 2 V 20 1 V 19 1 V 20 2 V 19 2 V 20 1 V 19 2 V 19 2 V 20 1 V 19 2 V 20 2 V 19 2 V 20 2 V 19 3 V 19 2 V 20 2 V 19 2 V 20 3 V 19 3 V 20 2 V 19 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 3 V 19 4 V 20 4 V 19 4 V 20 4 V 19 4 V 20 5 V 19 4 V 19 5 V 20 5 V 19 5 V 20 6 V 19 5 V 20 6 V 19 6 V 19 6 V 20 7 V 19 6 V 20 7 V 19 8 V 20 7 V 19 8 V 19 8 V 20 8 V 19 9 V 20 9 V 19 9 V 20 10 V 19 10 V 19 10 V 20 11 V 19 11 V 20 12 V 19 12 V 20 13 V 19 12 V 19 14 V 20 14 V 19 14 V 20 15 V 19 16 V 20 16 V 19 17 V 19 17 V 20 18 V 19 18 V 20 20 V 19 19 V 20 21 V 19 21 V 19 22 V 20 23 V 19 24 V 20 24 V 19 25 V 20 26 V 19 26 V 19 28 V 20 28 V 19 30 V 20 30 V 19 31 V 20 32 V 19 33 V 19 34 V 20 35 V 19 35 V 20 37 V 19 38 V 20 38 V 19 40 V 19 40 V 20 41 V 19 43 V 20 43 V 3052 2089 L 20 45 V 19 46 V 19 46 V 20 47 V 19 48 V 20 49 V 19 49 V 20 50 V 19 51 V 19 50 V 20 52 V 19 51 V 20 52 V 19 52 V 20 52 V 19 52 V 19 52 V 20 52 V 19 51 V 20 52 V 19 50 V 20 50 V 19 49 V 19 48 V 20 48 V 19 46 V 20 45 V 19 44 V 20 42 V 19 41 V 19 39 V 20 37 V 19 35 V 20 33 V 19 31 V 20 29 V 19 27 V 19 24 V 20 22 V 19 19 V 20 16 V 19 14 V 20 11 V 19 9 V 19 5 V 20 3 V 19 0 V 20 -3 V 19 -5 V 19 -9 V 20 -11 V 19 -14 V 20 -16 V 19 -19 V 20 -22 V 19 -24 V 19 -27 V 20 -29 V 19 -31 V 20 -33 V 19 -35 V 20 -37 V 19 -39 V 19 -41 V 20 -42 V 19 -44 V 20 -45 V 19 -46 V 20 -48 V 19 -48 V 19 -49 V 20 -50 V 19 -50 V 20 -52 V 19 -51 V 20 -52 V 19 -52 V 19 -52 V 20 -52 V 19 -52 V 20 -52 V 19 -51 V 20 -52 V 19 -50 V 19 -51 V 20 -50 V 19 -49 V 20 -49 V 19 -48 V 20 -47 V 19 -46 V 19 -46 V 20 -45 V 19 -44 V 20 -43 V 19 -43 V 20 -41 V 19 -40 V 19 -40 V 20 -38 V 19 -38 V 20 -37 V 19 -35 V 20 -35 V 5092 1621 L 19 -33 V 20 -32 V 19 -31 V 20 -30 V 19 -30 V 20 -28 V 19 -28 V 19 -26 V 20 -26 V 19 -25 V 20 -24 V 19 -24 V 20 -23 V 19 -22 V 19 -21 V 20 -21 V 19 -19 V 20 -20 V 19 -18 V 20 -18 V 19 -17 V 19 -17 V 20 -16 V 19 -16 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 19 -12 V 20 -13 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\nu_1=5$}}% \put(5957,4781){\rjust{\strut{}$\nu_1=1$}}% \put(3955,5244){\cjust{\strut{}Student's t distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}4}}% \put(6134,400){\cjust{\strut{}3}}% \put(5408,400){\cjust{\strut{}2}}% \put(4682,400){\cjust{\strut{}1}}% \put(3956,400){\cjust{\strut{}0}}% \put(3229,400){\cjust{\strut{}-1}}% \put(2503,400){\cjust{\strut{}-2}}% \put(1777,400){\cjust{\strut{}-3}}% \put(1051,400){\cjust{\strut{}-4}}% \put(900,4944){\rjust{\strut{} 0.5}}% \put(900,4081){\rjust{\strut{} 0.4}}% \put(900,3219){\rjust{\strut{} 0.3}}% \put(900,2356){\rjust{\strut{} 0.2}}% \put(900,1494){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/dwt-orig.eps0000664000175000017500000012277412616157443014022 0ustar eddedd%!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 gsl-doc-2.3/doc/fftalgorithms.tex0000664000175000017500000031262712616157443015146 0ustar eddedd\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 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,\footnote{Erratum: due to a difference in sign convention, these transforms are actually for $x_a = \sum_{b=0}^{N-1} W_N^{-ab} z_b$. Thanks to Andrew Holme for the correction.} % \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 structure 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} - p_{i-1}/2) \Leftarrow -g(b p_{i} + 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} gsl-doc-2.3/doc/complex.texi0000664000175000017500000004434212616157443014111 0ustar eddedd@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 * Representation of 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 Representation of complex numbers @section Representation of complex numbers @cindex representations of complex numbers @cindex polar form of complex numbers @tindex 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}. @inlinefn{} @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 @w{} @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 @w{} @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 gsl-doc-2.3/doc/min-interval.eps0000664000175000017500000002700212616157443014657 0ustar eddedd%!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 gsl-doc-2.3/doc/gsl-ref.info-50000644000175000017500000172661013022372752014123 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  File: gsl-ref.info, Node: Nonlinear Least-Squares Geodesic Acceleration Example, Next: Nonlinear Least-Squares Comparison Example, Prev: Nonlinear Least-Squares Exponential Fit Example, Up: Nonlinear Least-Squares Examples 39.12.2 Geodesic Acceleration Example ------------------------------------- The following example program minimizes a modified Rosenbrock function, which is characterized by a narrow canyon with steep walls. The starting point is selected high on the canyon wall, so the solver must first find the canyon bottom and then navigate to the minimum. The problem is solved both with and without using geodesic acceleration for comparison. The cost function is given by Phi(x) = 1/2 (f1^2 + f2^2) f1 = 100 ( x2 - x1^2 ) f2 = 1 - x1 The Jacobian matrix is given by J = [ -200*x1 100 ; -1 0 ] In order to use geodesic acceleration, the user must provide the second directional derivative of each residual in the velocity direction, D_v^2 f_i = \sum_{\alpha\beta} v_{\alpha} v_{\beta} \partial_{\alpha} \partial_{\beta} f_i. The velocity vector v is provided by the solver. For this example, these derivatives are given by fvv = [ -200 v1^2 ; 0 ] The solution of this minimization problem is given by x* = [ 1 ; 1 ] Phi(x*) = 0 The program output is shown below. === Solving system without acceleration === NITER = 53 NFEV = 56 NJEV = 54 NAEV = 0 initial cost = 2.250225000000e+04 final cost = 6.674986031430e-18 final x = (9.999999974165e-01, 9.999999948328e-01) final cond(J) = 6.000096055094e+02 === Solving system with acceleration === NITER = 15 NFEV = 17 NJEV = 16 NAEV = 16 initial cost = 2.250225000000e+04 final cost = 7.518932873279e-19 final x = (9.999999991329e-01, 9.999999982657e-01) final cond(J) = 6.000097233278e+02 We can see that enabling geodesic acceleration requires less than a third of the number of Jacobian evaluations in order to locate the minimum. The path taken by both methods is shown in the figure below. The contours show the cost function \Phi(x_1,x_2). We see that both methods quickly find the canyon bottom, but the geodesic acceleration method navigates along the bottom to the solution with significantly fewer iterations. The program is given below. #include #include #include #include #include #include int func_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 100.0 * (x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); return GSL_SUCCESS; } int func_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); gsl_matrix_set(J, 0, 0, -200.0*x1); gsl_matrix_set(J, 0, 1, 100.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 1, 1, 0.0); return GSL_SUCCESS; } int func_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); gsl_vector_set(fvv, 0, -200.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector * x = gsl_multifit_nlinear_position(w); /* print out current location */ printf("%f %f\n", gsl_vector_get(x, 0), gsl_vector_get(x, 1)); } void solve_system(gsl_vector *x0, gsl_multifit_nlinear_fdf *fdf, gsl_multifit_nlinear_parameters *params) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multifit_nlinear_workspace *work = gsl_multifit_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multifit_nlinear_residual(work); gsl_vector * x = gsl_multifit_nlinear_position(work); int info; double chisq0, chisq, rcond; /* initialize solver */ gsl_multifit_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, callback, NULL, &info, work); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* store cond(J(x)) */ gsl_multifit_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "NITER = %zu\n", gsl_multifit_nlinear_niter(work)); fprintf(stderr, "NFEV = %zu\n", fdf->nevalf); fprintf(stderr, "NJEV = %zu\n", fdf->nevaldf); fprintf(stderr, "NAEV = %zu\n", fdf->nevalfvv); fprintf(stderr, "initial cost = %.12e\n", chisq0); fprintf(stderr, "final cost = %.12e\n", chisq); fprintf(stderr, "final x = (%.12e, %.12e)\n", gsl_vector_get(x, 0), gsl_vector_get(x, 1)); fprintf(stderr, "final cond(J) = %.12e\n", 1.0 / rcond); printf("\n\n"); gsl_multifit_nlinear_free(work); } int main (void) { const size_t n = 2; const size_t p = 2; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); /* print map of Phi(x1, x2) */ { double x1, x2, chisq; double *f1 = gsl_vector_ptr(f, 0); double *f2 = gsl_vector_ptr(f, 1); for (x1 = -1.2; x1 < 1.3; x1 += 0.1) { for (x2 = -0.5; x2 < 2.1; x2 += 0.1) { gsl_vector_set(x, 0, x1); gsl_vector_set(x, 1, x2); func_f(x, NULL, f); chisq = (*f1) * (*f1) + (*f2) * (*f2); printf("%f %f %f\n", x1, x2, chisq); } printf("\n"); } printf("\n\n"); } /* define function to be minimized */ fdf.f = func_f; fdf.df = func_df; fdf.fvv = func_fvv; fdf.n = n; fdf.p = p; fdf.params = NULL; /* starting point */ gsl_vector_set(x, 0, -0.5); gsl_vector_set(x, 1, 1.75); fprintf(stderr, "=== Solving system without acceleration ===\n"); fdf_params.trs = gsl_multifit_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fprintf(stderr, "=== Solving system with acceleration ===\n"); fdf_params.trs = gsl_multifit_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); return 0; }  File: gsl-ref.info, Node: Nonlinear Least-Squares Comparison Example, Next: Nonlinear Least-Squares Large Example, Prev: Nonlinear Least-Squares Geodesic Acceleration Example, Up: Nonlinear Least-Squares Examples 39.12.3 Comparing TRS Methods Example ------------------------------------- The following program compares all available nonlinear least squares trust-region subproblem (TRS) methods on the Branin function, a common optimization test problem. The cost function is given by \Phi(x) &= 1/2 (f_1^2 + f_2^2) f_1 &= x_2 + a_1 x_1^2 + a_2 x_1 + a_3 f_2 &= sqrt(a_4) sqrt(1 + (1 - a_5) cos(x_1)) with a_1 = -{5.1 \over 4 \pi^2}, a_2 = {5 \over \pi}, a_3 = -6, a_4 = 10, a_5 = {1 \over 8\pi}. There are three minima of this function in the range (x_1,x_2) \in [-5,15] \times [-5,15]. The program below uses the starting point (x_1,x_2) = (6,14.5) and calculates the solution with all available nonlinear least squares TRS methods. The program output is shown below. Method NITER NFEV NJEV Initial Cost Final cost Final cond(J) Final x levenberg-marquardt 20 27 21 1.9874e+02 3.9789e-01 6.1399e+07 (-3.14e+00, 1.23e+01) levenberg-marquardt+accel 27 36 28 1.9874e+02 3.9789e-01 1.4465e+07 (3.14e+00, 2.27e+00) dogleg 23 64 23 1.9874e+02 3.9789e-01 5.0692e+08 (3.14e+00, 2.28e+00) double-dogleg 24 69 24 1.9874e+02 3.9789e-01 3.4879e+07 (3.14e+00, 2.27e+00) 2D-subspace 23 54 24 1.9874e+02 3.9789e-01 2.5142e+07 (3.14e+00, 2.27e+00) The first row of output above corresponds to standard Levenberg-Marquardt, while the second row includes geodesic acceleration. We see that the standard LM method converges to the minimum at (-\pi,12.275) and also uses the least number of iterations and Jacobian evaluations. All other methods converge to the minimum (\pi,2.275) and perform similarly in terms of number of Jacobian evaluations. We see that J is fairly ill-conditioned at both minima, indicating that the QR (or SVD) solver is the best choice for this problem. Since there are only two parameters in this optimization problem, we can easily visualize the paths taken by each method, which are shown in the figure below. The figure shows contours of the cost function \Phi(x_1,x_2) which exhibits three global minima in the range [-5,15] \times [-5,15]. The paths taken by each solver are shown as colored lines. The program is given below. #include #include #include #include #include #include /* parameters to model */ struct model_params { double a1; double a2; double a3; double a4; double a5; }; /* Branin function */ int func_f (const gsl_vector * x, void *params, gsl_vector * f) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double f1 = x2 + par->a1 * x1 * x1 + par->a2 * x1 + par->a3; double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * cos(x1)); gsl_vector_set(f, 0, f1); gsl_vector_set(f, 1, f2); return GSL_SUCCESS; } int func_df (const gsl_vector * x, void *params, gsl_matrix * J) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * cos(x1)); gsl_matrix_set(J, 0, 0, 2.0 * par->a1 * x1 + par->a2); gsl_matrix_set(J, 0, 1, 1.0); gsl_matrix_set(J, 1, 0, -0.5 * par->a4 / f2 * (1.0 - par->a5) * sin(x1)); gsl_matrix_set(J, 1, 1, 0.0); return GSL_SUCCESS; } int func_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { struct model_params *par = (struct model_params *) params; double x1 = gsl_vector_get(x, 0); double v1 = gsl_vector_get(v, 0); double c = cos(x1); double s = sin(x1); double f2 = sqrt(par->a4) * sqrt(1.0 + (1.0 - par->a5) * c); double t = 0.5 * par->a4 * (1.0 - par->a5) / f2; gsl_vector_set(fvv, 0, 2.0 * par->a1 * v1 * v1); gsl_vector_set(fvv, 1, -t * (c + s*s/f2) * v1 * v1); return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector * x = gsl_multifit_nlinear_position(w); double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); /* print out current location */ printf("%f %f\n", x1, x2); } void solve_system(gsl_vector *x0, gsl_multifit_nlinear_fdf *fdf, gsl_multifit_nlinear_parameters *params) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multifit_nlinear_workspace *work = gsl_multifit_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multifit_nlinear_residual(work); gsl_vector * x = gsl_multifit_nlinear_position(work); int info; double chisq0, chisq, rcond; printf("# %s/%s\n", gsl_multifit_nlinear_name(work), gsl_multifit_nlinear_trs_name(work)); /* initialize solver */ gsl_multifit_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, callback, NULL, &info, work); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* store cond(J(x)) */ gsl_multifit_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "%-25s %-6zu %-5zu %-5zu %-13.4e %-12.4e %-13.4e (%.2e, %.2e)\n", gsl_multifit_nlinear_trs_name(work), gsl_multifit_nlinear_niter(work), fdf->nevalf, fdf->nevaldf, chisq0, chisq, 1.0 / rcond, gsl_vector_get(x, 0), gsl_vector_get(x, 1)); printf("\n\n"); gsl_multifit_nlinear_free(work); } int main (void) { const size_t n = 2; const size_t p = 2; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); struct model_params params; params.a1 = -5.1 / (4.0 * M_PI * M_PI); params.a2 = 5.0 / M_PI; params.a3 = -6.0; params.a4 = 10.0; params.a5 = 1.0 / (8.0 * M_PI); /* print map of Phi(x1, x2) */ { double x1, x2, chisq; for (x1 = -5.0; x1 < 15.0; x1 += 0.1) { for (x2 = -5.0; x2 < 15.0; x2 += 0.1) { gsl_vector_set(x, 0, x1); gsl_vector_set(x, 1, x2); func_f(x, ¶ms, f); gsl_blas_ddot(f, f, &chisq); printf("%f %f %f\n", x1, x2, chisq); } printf("\n"); } printf("\n\n"); } /* define function to be minimized */ fdf.f = func_f; fdf.df = func_df; fdf.fvv = func_fvv; fdf.n = n; fdf.p = p; fdf.params = ¶ms; /* starting point */ gsl_vector_set(x, 0, 6.0); gsl_vector_set(x, 1, 14.5); fprintf(stderr, "%-25s %-6s %-5s %-5s %-13s %-12s %-13s %-15s\n", "Method", "NITER", "NFEV", "NJEV", "Initial Cost", "Final cost", "Final cond(J)", "Final x"); fdf_params.trs = gsl_multifit_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_dogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_ddogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multifit_nlinear_trs_subspace2D; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); return 0; }  File: gsl-ref.info, Node: Nonlinear Least-Squares Large Example, Prev: Nonlinear Least-Squares Comparison Example, Up: Nonlinear Least-Squares Examples 39.12.4 Large Nonlinear Least Squares Example --------------------------------------------- The following program illustrates the large nonlinear least squares solvers on a system with significant sparse structure in the Jacobian. The cost function is given by \Phi(x) &= 1/2 \sum_{i=1}^{p+1} f_i^2 f_i &= \sqrt{\alpha} (x_i - 1), 1 \le i \le p f_{p+1} &= ||x||^2 - 1/4 with \alpha = 10^{-5}. The residual f_{p+1} imposes a constraint on the p parameters x, to ensure that ||x||^2 \approx {1 \over 4}. The (p+1)-by-p Jacobian for this system is given by J(x) = [ \sqrt{alpha} I_p; 2 x^T ] and the normal equations matrix is given by J^T J = [ \alpha I_p + 4 x x^T ] Finally, the second directional derivative of f for the geodesic acceleration method is given by fvv = [ 0; 2 ||v||^2 ] Since the upper p-by-p block of J is diagonal, this sparse structure should be exploited in the nonlinear solver. For comparison, the following program solves the system for p = 2000 using the dense direct Cholesky solver based on the normal equations matrix J^T J, as well as the iterative Steihaug-Toint solver, based on sparse matrix-vector products J u and J^T u. The program output is shown below. Method NITER NFEV NJUEV NJTJEV NAEV Init Cost Final cost cond(J) Final |x|^2 Time (s) levenberg-marquardt 25 31 26 26 0 7.1218e+18 1.9555e-02 447.50 2.5044e-01 46.28 levenberg-marquardt+accel 22 23 45 23 22 7.1218e+18 1.9555e-02 447.64 2.5044e-01 33.92 dogleg 37 87 36 36 0 7.1218e+18 1.9555e-02 447.59 2.5044e-01 56.05 double-dogleg 35 88 34 34 0 7.1218e+18 1.9555e-02 447.62 2.5044e-01 52.65 2D-subspace 37 88 36 36 0 7.1218e+18 1.9555e-02 447.71 2.5044e-01 59.75 steihaug-toint 35 88 345 0 0 7.1218e+18 1.9555e-02 inf 2.5044e-01 0.09 The first five rows use methods based on factoring the dense J^T J matrix while the last row uses the iterative Steihaug-Toint method. While the number of Jacobian matrix-vector products (NJUEV) is less for the dense methods, the added time to construct and factor the J^T J matrix (NJTJEV) results in a much larger runtime than the iterative method (see last column). The program is given below. #include #include #include #include #include #include #include #include #include /* parameters for functions */ struct model_params { double alpha; gsl_spmatrix *J; }; /* penalty function */ int penalty_f (const gsl_vector * x, void *params, gsl_vector * f) { struct model_params *par = (struct model_params *) params; const double sqrt_alpha = sqrt(par->alpha); const size_t p = x->size; size_t i; double sum = 0.0; for (i = 0; i < p; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, sqrt_alpha*(xi - 1.0)); sum += xi * xi; } gsl_vector_set(f, p, sum - 0.25); return GSL_SUCCESS; } int penalty_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x, const gsl_vector * u, void * params, gsl_vector * v, gsl_matrix * JTJ) { struct model_params *par = (struct model_params *) params; const size_t p = x->size; size_t j; /* store 2*x in last row of J */ for (j = 0; j < p; ++j) { double xj = gsl_vector_get(x, j); gsl_spmatrix_set(par->J, p, j, 2.0 * xj); } /* compute v = op(J) u */ if (v) gsl_spblas_dgemv(TransJ, 1.0, par->J, u, 0.0, v); if (JTJ) { gsl_vector_view diag = gsl_matrix_diagonal(JTJ); /* compute J^T J = [ alpha*I_p + 4 x x^T ] */ gsl_matrix_set_zero(JTJ); /* store 4 x x^T in lower half of JTJ */ gsl_blas_dsyr(CblasLower, 4.0, x, JTJ); /* add alpha to diag(JTJ) */ gsl_vector_add_constant(&diag.vector, par->alpha); } return GSL_SUCCESS; } int penalty_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const size_t p = x->size; double normv = gsl_blas_dnrm2(v); gsl_vector_set_zero(fvv); gsl_vector_set(fvv, p, 2.0 * normv * normv); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } void solve_system(const gsl_vector *x0, gsl_multilarge_nlinear_fdf *fdf, gsl_multilarge_nlinear_parameters *params) { const gsl_multilarge_nlinear_type *T = gsl_multilarge_nlinear_trust; const size_t max_iter = 200; const double xtol = 1.0e-8; const double gtol = 1.0e-8; const double ftol = 1.0e-8; const size_t n = fdf->n; const size_t p = fdf->p; gsl_multilarge_nlinear_workspace *work = gsl_multilarge_nlinear_alloc(T, params, n, p); gsl_vector * f = gsl_multilarge_nlinear_residual(work); gsl_vector * x = gsl_multilarge_nlinear_position(work); int info; double chisq0, chisq, rcond, xsq; struct timeval tv0, tv1; gettimeofday(&tv0, NULL); /* initialize solver */ gsl_multilarge_nlinear_init(x0, fdf, work); /* store initial cost */ gsl_blas_ddot(f, f, &chisq0); /* iterate until convergence */ gsl_multilarge_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, work); gettimeofday(&tv1, NULL); /* store final cost */ gsl_blas_ddot(f, f, &chisq); /* compute final ||x||^2 */ gsl_blas_ddot(x, x, &xsq); /* store cond(J(x)) */ gsl_multilarge_nlinear_rcond(&rcond, work); /* print summary */ fprintf(stderr, "%-25s %-5zu %-4zu %-5zu %-6zu %-4zu %-10.4e %-10.4e %-7.2f %-11.4e %.2f\n", gsl_multilarge_nlinear_trs_name(work), gsl_multilarge_nlinear_niter(work), fdf->nevalf, fdf->nevaldfu, fdf->nevaldf2, fdf->nevalfvv, chisq0, chisq, 1.0 / rcond, xsq, (tv1.tv_sec - tv0.tv_sec) + 1.0e-6 * (tv1.tv_usec - tv0.tv_usec)); gsl_multilarge_nlinear_free(work); } int main (void) { const size_t p = 2000; const size_t n = p + 1; gsl_vector *f = gsl_vector_alloc(n); gsl_vector *x = gsl_vector_alloc(p); /* allocate sparse Jacobian matrix with 2*p non-zero elements in triplet format */ gsl_spmatrix *J = gsl_spmatrix_alloc_nzmax(n, p, 2 * p, GSL_SPMATRIX_TRIPLET); gsl_multilarge_nlinear_fdf fdf; gsl_multilarge_nlinear_parameters fdf_params = gsl_multilarge_nlinear_default_parameters(); struct model_params params; size_t i; params.alpha = 1.0e-5; params.J = J; /* define function to be minimized */ fdf.f = penalty_f; fdf.df = penalty_df; fdf.fvv = penalty_fvv; fdf.n = n; fdf.p = p; fdf.params = ¶ms; for (i = 0; i < p; ++i) { /* starting point */ gsl_vector_set(x, i, i + 1.0); /* store sqrt(alpha)*I_p in upper p-by-p block of J */ gsl_spmatrix_set(J, i, i, sqrt(params.alpha)); } fprintf(stderr, "%-25s %-4s %-4s %-5s %-6s %-4s %-10s %-10s %-7s %-11s %-10s\n", "Method", "NITER", "NFEV", "NJUEV", "NJTJEV", "NAEV", "Init Cost", "Final cost", "cond(J)", "Final |x|^2", "Time (s)"); fdf_params.scale = gsl_multilarge_nlinear_scale_levenberg; fdf_params.trs = gsl_multilarge_nlinear_trs_lm; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_lmaccel; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_dogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_ddogleg; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_subspace2D; solve_system(x, &fdf, &fdf_params); fdf_params.trs = gsl_multilarge_nlinear_trs_cgst; solve_system(x, &fdf, &fdf_params); gsl_vector_free(f); gsl_vector_free(x); gsl_spmatrix_free(J); return 0; }  File: gsl-ref.info, Node: Nonlinear Least-Squares References and Further Reading, Prev: Nonlinear Least-Squares Examples, Up: Nonlinear Least-Squares Fitting 39.13 References and Further Reading ==================================== The following publications are relevant to the algorithms described in this section, J.J. More', 'The Levenberg-Marquardt Algorithm: Implementation and Theory', Lecture Notes in Mathematics, v630 (1978), ed G. Watson. H. B. Nielsen, "Damping Parameter in Marquardt's Method", IMM Department of Mathematical Modeling, DTU, Tech. Report IMM-REP-1999-05 (1999). K. Madsen and H. B. Nielsen, "Introduction to Optimization and Data Fitting", IMM Department of Mathematical Modeling, DTU, 2010. J. E. Dennis and R. B. Schnabel, Numerical Methods for Unconstrained Optimization and Nonlinear Equations, SIAM, 1996. M. K. Transtrum, B. B. Machta, and J. P. Sethna, Geometry of nonlinear least squares with applications to sloppy models and optimization, Phys. Rev. E 83, 036701, 2011. M. K. Transtrum and J. P. Sethna, Improvements to the Levenberg-Marquardt algorithm for nonlinear least-squares minimization, arXiv:1201.5885, 2012. 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. H. B. Nielsen, "UCTP Test Problems for Unconstrained Optimization", IMM Department of Mathematical Modeling, DTU, Tech. Report IMM-REP-2000-17 (2000).  File: gsl-ref.info, Node: Basis Splines, Next: Sparse Matrices, Prev: Nonlinear Least-Squares Fitting, Up: Top 40 Basis Splines **************** This chapter describes functions for the computation of smoothing basis splines (B-splines). A smoothing spline differs from an interpolating spline in that the resulting curve is not required to pass through each datapoint. *Note Interpolation::, for information about interpolating splines. The header file 'gsl_bspline.h' contains the 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:: * Evaluation of B-spline basis function derivatives:: * Working with the Greville abscissae:: * Example programs for B-splines:: * B-Spline References and Further Reading::  File: gsl-ref.info, Node: Overview of B-splines, Next: Initializing the B-splines solver, Up: Basis Splines 40.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, ..., 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, ..., 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 coefficients 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 40.2 Initializing the B-splines solver ====================================== The computation of B-spline functions requires a preallocated workspace of type 'gsl_bspline_workspace'. -- 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(2k^2 + 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 40.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: Evaluation of B-spline basis function derivatives, Prev: Constructing the knots vector, Up: Basis Splines 40.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 the vector B, so that the i-th element is B_i(x). The vector B must be of length n = nbreak + k - 2. This value may also be obtained by calling 'gsl_bspline_ncoeffs'. Computing all the basis functions at once is more efficient than computing them individually, due to the nature of the defining recurrence relation. -- Function: int gsl_bspline_eval_nonzero (const double X, gsl_vector * BK, size_t * ISTART, size_t * IEND, gsl_bspline_workspace * W) This function evaluates all potentially nonzero B-spline basis functions at the position X and stores them in the vector BK, so that the i-th element is B_(istart+i)(x). The last element of BK is B_(iend)(x). The vector BK must be of length k. By returning only the nonzero basis functions, this function allows quantities involving linear combinations of the B_i(x) to be computed without unnecessary terms (such linear combinations occur, for example, when evaluating an interpolated function). -- Function: size_t gsl_bspline_ncoeffs (gsl_bspline_workspace * W) This function returns the number of B-spline coefficients given by n = nbreak + k - 2.  File: gsl-ref.info, Node: Evaluation of B-spline basis function derivatives, Next: Working with the Greville abscissae, Prev: Evaluation of B-spline basis functions, Up: Basis Splines 40.5 Evaluation of B-spline derivatives ======================================= -- Function: int gsl_bspline_deriv_eval (const double X, const size_t NDERIV, gsl_matrix * DB, gsl_bspline_workspace * W) This function evaluates all B-spline basis function derivatives of orders 0 through nderiv (inclusive) at the position X and stores them in the matrix DB. The (i,j)-th element of DB is d^jB_i(x)/dx^j. The matrix DB must be of size n = nbreak + k - 2 by nderiv + 1. The value n may also be obtained by calling 'gsl_bspline_ncoeffs'. Note that function evaluations are included as the zeroth order derivatives in DB. Computing all the basis function derivatives at once is more efficient than computing them individually, due to the nature of the defining recurrence relation. -- Function: int gsl_bspline_deriv_eval_nonzero (const double X, const size_t NDERIV, gsl_matrix * DB, size_t * ISTART, size_t * IEND, gsl_bspline_workspace * W) This function evaluates all potentially nonzero B-spline basis function derivatives of orders 0 through nderiv (inclusive) at the position X and stores them in the matrix DB. The (i,j)-th element of DB is d^j/dx^j B_(istart+i)(x). The last row of DB contains d^j/dx^j B_(iend)(x). The matrix DB must be of size k by at least nderiv + 1. Note that function evaluations are included as the zeroth order derivatives in DB. By returning only the nonzero basis functions, this function allows quantities involving linear combinations of the B_i(x) and their derivatives to be computed without unnecessary terms.  File: gsl-ref.info, Node: Working with the Greville abscissae, Next: Example programs for B-splines, Prev: Evaluation of B-spline basis function derivatives, Up: Basis Splines 40.6 Working with the Greville abscissae ======================================== The Greville abscissae are defined to be the mean location of k-1 consecutive knots in the knot vector for each basis spline function of order k. With the first and last knots in the 'gsl_bspline_workspace' knot vector excluded, there are 'gsl_bspline_ncoeffs' Greville abscissae for any given B-spline basis. These values are often used in B-spline collocation applications and may also be called Marsden-Schoenberg points. -- Function: double gsl_bspline_greville_abscissa (size_t I, gsl_bspline_workspace *W); Returns the location of the i-th Greville abscissa for the given B-spline basis. For the ill-defined case when k=1, the implementation chooses to return breakpoint interval midpoints.  File: gsl-ref.info, Node: Example programs for B-splines, Next: B-Spline References and Further Reading, Prev: Working with the Greville abscissae, Up: Basis Splines 40.7 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 y(x) = \cos{(x)} \exp{(-x/10)} on the interval [0, 15] with Gaussian noise added. #include #include #include #include #include #include #include #include /* number of data points to fit */ #define N 200 /* number of fit coefficients */ #define NCOEFFS 12 /* 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, Rsq, dof, tss; 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 * yi; 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); dof = n - ncoeffs; tss = gsl_stats_wtss(w->data, 1, y->data, 1, y->size); Rsq = 1.0 - chisq / tss; fprintf(stderr, "chisq/dof = %e, Rsq = %f\n", chisq / dof, Rsq); /* 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.txt chisq/dof = 1.118217e+00, Rsq = 0.989771 $ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.txt > bspline.ps  File: gsl-ref.info, Node: B-Spline References and Further Reading, Prev: Example programs for B-splines, Up: Basis Splines 40.8 B-Spline 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. Further information of Greville abscissae and B-spline collocation can be found in the following paper, Richard W. Johnson, Higher order B-spline collocation at the Greville abscissae. 'Applied Numerical Mathematics'. vol. 52, 2005, 63-75. A large collection of B-spline routines is available in the PPPACK library available at , which is also part of SLATEC.  File: gsl-ref.info, Node: Sparse Matrices, Next: Sparse BLAS Support, Prev: Basis Splines, Up: Top 41 Sparse Matrices ****************** This chapter describes functions for the construction and manipulation of sparse matrices, matrices which are populated primarily with zeros and contain only a few non-zero elements. Sparse matrices often appear in the solution of partial differential equations. It is beneficial to use specialized data structures and algorithms for storing and working with sparse matrices, since dense matrix algorithms and structures can be very slow and use huge amounts of memory when applied to sparse matrices. The header file 'gsl_spmatrix.h' contains the prototypes for the sparse matrix functions and related declarations. * Menu: * Sparse Matrices Overview:: * Sparse Matrices Allocation:: * Sparse Matrices Accessing Elements:: * Sparse Matrices Initializing Elements:: * Sparse Matrices Reading and Writing:: * Sparse Matrices Copying:: * Sparse Matrices Exchanging Rows and Columns:: * Sparse Matrices Operations:: * Sparse Matrices Properties:: * Sparse Matrices Finding Maximum and Minimum Elements:: * Sparse Matrices Compressed Format:: * Sparse Matrices Conversion Between Sparse and Dense:: * Sparse Matrices Examples:: * Sparse Matrices References and Further Reading::  File: gsl-ref.info, Node: Sparse Matrices Overview, Next: Sparse Matrices Allocation, Up: Sparse Matrices 41.1 Overview ============= These routines provide support for constructing and manipulating sparse matrices in GSL, using an API similar to 'gsl_matrix'. The basic structure is called 'gsl_spmatrix'. There are three supported storage formats for sparse matrices: the triplet, compressed column storage (CCS) and compressed row storage (CRS) formats. The triplet format stores triplets (i,j,x) for each non-zero element of the matrix. This notation means that the (i,j) element of the matrix A is A_{ij} = x. Compressed column storage stores each column of non-zero values in the sparse matrix in a continuous memory block, keeping pointers to the beginning of each column in that memory block, and storing the row indices of each non-zero element. Compressed row storage stores each row of non-zero values in a continuous memory block, keeping pointers to the beginning of each row in the block and storing the column indices of each non-zero element. The triplet format is ideal for adding elements to the sparse matrix structure while it is being constructed, while the compressed storage formats are better suited for matrix-matrix multiplication or linear solvers. The 'gsl_spmatrix' structure is defined as typedef struct { size_t size1; size_t size2; size_t *i; double *data; size_t *p; size_t nzmax; size_t nz; gsl_spmatrix_tree *tree_data; void *work; size_t sptype; } gsl_spmatrix; This defines a SIZE1-by-SIZE2 sparse matrix. The number of non-zero elements currently in the matrix is given by NZ. For the triplet representation, I, P, and DATA are arrays of size NZ which contain the row indices, column indices, and element value, respectively. So if data[k] = A(i,j), then i = i[k] and j = p[k]. For compressed column storage, I and DATA are arrays of size NZ containing the row indices and element values, identical to the triplet case. P is an array of size size2 + 1 where p[j] points to the index in DATA of the start of column J. Thus, if data[k] = A(i,j), then i = i[k] and p[j] <= k < p[j+1]. For compressed row storage, I and DATA are arrays of size NZ containing the column indices and element values, identical to the triplet case. P is an array of size size1 + 1 where p[i] points to the index in DATA of the start of row I. Thus, if data[k] = A(i,j), then j = i[k] and p[i] <= k < p[i+1]. The parameter TREE_DATA is a binary tree structure used in the triplet representation, specifically a balanced AVL tree. This speeds up element searches and duplicate detection during the matrix assembly process. The parameter WORK is additional workspace needed for various operations like converting from triplet to compressed storage. SPTYPE indicates the type of storage format being used (triplet, CCS or CRS). The compressed storage format defined above makes it very simple to interface with sophisticated external linear solver libraries which accept compressed storage input. The user can simply pass the arrays I, P, and DATA as the inputs to external libraries.  File: gsl-ref.info, Node: Sparse Matrices Allocation, Next: Sparse Matrices Accessing Elements, Prev: Sparse Matrices Overview, Up: Sparse Matrices 41.2 Allocation =============== The functions for allocating memory for a sparse matrix follow the style of 'malloc' and 'free'. They also perform their own error checking. If there is insufficient memory available to allocate a matrix then the functions call the GSL error handler with an error code of 'GSL_ENOMEM' in addition to returning a null pointer. -- Function: gsl_spmatrix * gsl_spmatrix_alloc (const size_t N1, const size_t N2) This function allocates a sparse matrix of size N1-by-N2 and initializes it to all zeros. If the size of the matrix is not known at allocation time, both N1 and N2 may be set to 1, and they will automatically grow as elements are added to the matrix. This function sets the matrix to the triplet representation, which is the easiest for adding and accessing matrix elements. This function tries to make a reasonable guess for the number of non-zero elements (NZMAX) which will be added to the matrix by assuming a sparse density of 10\%. The function 'gsl_spmatrix_alloc_nzmax' can be used if this number is known more accurately. The workspace is of size O(nzmax). -- Function: gsl_spmatrix * gsl_spmatrix_alloc_nzmax (const size_t N1, const size_t N2, const size_t NZMAX, const size_t SPTYPE) This function allocates a sparse matrix of size N1-by-N2 and initializes it to all zeros. If the size of the matrix is not known at allocation time, both N1 and N2 may be set to 1, and they will automatically grow as elements are added to the matrix. The parameter NZMAX specifies the maximum number of non-zero elements which will be added to the matrix. It does not need to be precisely known in advance, since storage space will automatically grow using 'gsl_spmatrix_realloc' if NZMAX is not large enough. Accurate knowledge of this parameter reduces the number of reallocation calls required. The parameter SPTYPE specifies the storage format of the sparse matrix. Possible values are 'GSL_SPMATRIX_TRIPLET' This flag specifies triplet storage. 'GSL_SPMATRIX_CCS' This flag specifies compressed column storage. 'GSL_SPMATRIX_CRS' This flag specifies compressed row storage. The allocated 'gsl_spmatrix' structure is of size O(nzmax). -- Function: int gsl_spmatrix_realloc (const size_t NZMAX, gsl_spmatrix * M) This function reallocates the storage space for M to accomodate NZMAX non-zero elements. It is typically called internally by 'gsl_spmatrix_set' if the user wants to add more elements to the sparse matrix than the previously specified NZMAX. -- Function: void gsl_spmatrix_free (gsl_spmatrix * M) This function frees the memory associated with the sparse matrix M.  File: gsl-ref.info, Node: Sparse Matrices Accessing Elements, Next: Sparse Matrices Initializing Elements, Prev: Sparse Matrices Allocation, Up: Sparse Matrices 41.3 Accessing Matrix Elements ============================== -- Function: double gsl_spmatrix_get (const gsl_spmatrix * M, const size_t I, const size_t J) This function returns element (I,J) of the matrix M. The matrix may be in triplet or compressed format. -- Function: int gsl_spmatrix_set (gsl_spmatrix * M, const size_t I, const size_t J, const double X) This function sets element (I,J) of the matrix M to the value X. The matrix must be in triplet representation. -- Function: double * gsl_spmatrix_ptr (gsl_spmatrix * M, const size_t I, const size_t J) This function returns a pointer to the (I,J) element of the matrix M. If the (I,J) element is not explicitly stored in the matrix, a null pointer is returned.  File: gsl-ref.info, Node: Sparse Matrices Initializing Elements, Next: Sparse Matrices Reading and Writing, Prev: Sparse Matrices Accessing Elements, Up: Sparse Matrices 41.4 Initializing Matrix Elements ================================= Since the sparse matrix format only stores the non-zero elements, it is automatically initialized to zero upon allocation. The function 'gsl_spmatrix_set_zero' may be used to re-initialize a matrix to zero after elements have been added to it. -- Function: int gsl_spmatrix_set_zero (gsl_spmatrix * M) This function sets (or resets) all the elements of the matrix M to zero.  File: gsl-ref.info, Node: Sparse Matrices Reading and Writing, Next: Sparse Matrices Copying, Prev: Sparse Matrices Initializing Elements, Up: Sparse Matrices 41.5 Reading and Writing Matrices ================================= -- Function: int gsl_spmatrix_fwrite (FILE * STREAM, const gsl_spmatrix * 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_spmatrix_fread (FILE * STREAM, gsl_spmatrix * 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 storage format, dimensions and have a sufficiently large 'nzmax' in order to read in all matrix elements, otherwise 'GSL_EBADLEN' is returned. 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_spmatrix_fprintf (FILE * STREAM, const gsl_spmatrix * 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. The function returns 0 for success and 'GSL_EFAILED' if there was a problem writing to the file. The input matrix M may be in any storage format, and the output file will be written in MatrixMarket format. -- Function: gsl_spmatrix * gsl_spmatrix_fscanf (FILE * STREAM) This function reads sparse matrix data in the MatrixMarket format from the stream STREAM and stores it in a newly allocated matrix which is returned in triplet format. The function returns 0 for success and 'GSL_EFAILED' if there was a problem reading from the file. The user should free the returned matrix when it is no longer needed.  File: gsl-ref.info, Node: Sparse Matrices Copying, Next: Sparse Matrices Exchanging Rows and Columns, Prev: Sparse Matrices Reading and Writing, Up: Sparse Matrices 41.6 Copying Matrices ===================== -- Function: int gsl_spmatrix_memcpy (gsl_spmatrix * DEST, const gsl_spmatrix * SRC) This function copies the elements of the sparse matrix SRC into DEST. The two matrices must have the same dimensions and be in the same storage format.  File: gsl-ref.info, Node: Sparse Matrices Exchanging Rows and Columns, Next: Sparse Matrices Operations, Prev: Sparse Matrices Copying, Up: Sparse Matrices 41.7 Exchanging Rows and Columns ================================ -- Function: int gsl_spmatrix_transpose_memcpy (gsl_spmatrix * DEST, const gsl_spmatrix * SRC) This function copies the transpose of the sparse matrix SRC into DEST. The dimensions of DEST must match the transpose of the matrix SRC. Also, both matrices must use the same sparse storage format. -- Function: int gsl_spmatrix_transpose (gsl_spmatrix * M) This function replaces the matrix M by its transpose, preserving the storage format of the input matrix. Currently, only triplet matrix inputs are supported. -- Function: int gsl_spmatrix_transpose2 (gsl_spmatrix * M) This function replaces the matrix M by its transpose, but changes the storage format for compressed matrix inputs. Since compressed column storage is the transpose of compressed row storage, this function simply converts a CCS matrix to CRS and vice versa. This is the most efficient way to transpose a compressed storage matrix, but the user should note that the storage format of their compressed matrix will change on output. For triplet matrices, the output matrix is also in triplet storage.  File: gsl-ref.info, Node: Sparse Matrices Operations, Next: Sparse Matrices Properties, Prev: Sparse Matrices Exchanging Rows and Columns, Up: Sparse Matrices 41.8 Matrix Operations ====================== -- Function: int gsl_spmatrix_add (gsl_spmatrix * C, const gsl_spmatrix * A, const gsl_spmatrix * B) This function computes the sum c = a + b. The three matrices must have the same dimensions and be stored in a compressed format. -- Function: int gsl_spmatrix_scale (gsl_spmatrix * M, const double X) This function scales all elements of the matrix M by the constant factor X. The result m(i,j) \leftarrow x m(i,j) is stored in M.  File: gsl-ref.info, Node: Sparse Matrices Properties, Next: Sparse Matrices Finding Maximum and Minimum Elements, Prev: Sparse Matrices Operations, Up: Sparse Matrices 41.9 Matrix Properties ====================== -- Function: size_t gsl_spmatrix_nnz (const gsl_spmatrix * M) This function returns the number of non-zero elements in M. -- Function: int gsl_spmatrix_equal (const gsl_spmatrix * A, const gsl_spmatrix * B) This function returns 1 if the matrices A and B are equal (by comparison of element values) and 0 otherwise. The matrices A and B must be in the same sparse storage format for comparison.  File: gsl-ref.info, Node: Sparse Matrices Finding Maximum and Minimum Elements, Next: Sparse Matrices Compressed Format, Prev: Sparse Matrices Properties, Up: Sparse Matrices 41.10 Finding Maximum and Minimum Elements ========================================== -- Function: int gsl_spmatrix_minmax (const gsl_spmatrix * M, double * MIN_OUT, double * MAX_OUT) This function returns the minimum and maximum elements of the matrix M, storing them in MIN_OUT and MAX_OUT, and searching only the non-zero values.  File: gsl-ref.info, Node: Sparse Matrices Compressed Format, Next: Sparse Matrices Conversion Between Sparse and Dense, Prev: Sparse Matrices Finding Maximum and Minimum Elements, Up: Sparse Matrices 41.11 Compressed Format ======================= GSL supports compressed column storage (CCS) and compressed row storage (CRS) formats. -- Function: gsl_spmatrix * gsl_spmatrix_ccs (const gsl_spmatrix * T) This function creates a sparse matrix in compressed column format from the input sparse matrix T which must be in triplet format. A pointer to a newly allocated matrix is returned. The calling function should free the newly allocated matrix when it is no longer needed. -- Function: gsl_spmatrix * gsl_spmatrix_crs (const gsl_spmatrix * T) This function creates a sparse matrix in compressed row format from the input sparse matrix T which must be in triplet format. A pointer to a newly allocated matrix is returned. The calling function should free the newly allocated matrix when it is no longer needed.  File: gsl-ref.info, Node: Sparse Matrices Conversion Between Sparse and Dense, Next: Sparse Matrices Examples, Prev: Sparse Matrices Compressed Format, Up: Sparse Matrices 41.12 Conversion Between Sparse and Dense Matrices ================================================== The 'gsl_spmatrix' structure can be converted into the dense 'gsl_matrix' format and vice versa with the following routines. -- Function: int gsl_spmatrix_d2sp (gsl_spmatrix * S, const gsl_matrix * A) This function converts the dense matrix A into sparse triplet format and stores the result in S. -- Function: int gsl_spmatrix_sp2d (gsl_matrix * A, const gsl_spmatrix * S) This function converts the sparse matrix S into a dense matrix and stores the result in A. S must be in triplet format.  File: gsl-ref.info, Node: Sparse Matrices Examples, Next: Sparse Matrices References and Further Reading, Prev: Sparse Matrices Conversion Between Sparse and Dense, Up: Sparse Matrices 41.13 Examples ============== The following example program builds a 5-by-4 sparse matrix and prints it in triplet, compressed column, and compressed row format. The matrix which is constructed is The output of the program is printing all matrix elements: A(0,0) = 0 A(0,1) = 0 A(0,2) = 3.1 A(0,3) = 4.6 A(1,0) = 1 . . . A(4,0) = 4.1 A(4,1) = 0 A(4,2) = 0 A(4,3) = 0 matrix in triplet format (i,j,Aij): (0, 2, 3.1) (0, 3, 4.6) (1, 0, 1.0) (1, 2, 7.2) (3, 0, 2.1) (3, 1, 2.9) (3, 3, 8.5) (4, 0, 4.1) matrix in compressed column format: i = [ 1, 3, 4, 3, 0, 1, 0, 3, ] p = [ 0, 3, 4, 6, 8, ] d = [ 1, 2.1, 4.1, 2.9, 3.1, 7.2, 4.6, 8.5, ] matrix in compressed row format: i = [ 2, 3, 0, 2, 0, 1, 3, 0, ] p = [ 0, 2, 4, 4, 7, 8, ] d = [ 3.1, 4.6, 1, 7.2, 2.1, 2.9, 8.5, 4.1, ] We see in the compressed column output, the data array stores each column contiguously, the array i stores the row index of the corresponding data element, and the array p stores the index of the start of each column in the data array. Similarly, for the compressed row output, the data array stores each row contiguously, the array i stores the column index of the corresponding data element, and the p array stores the index of the start of each row in the data array. #include #include #include int main() { gsl_spmatrix *A = gsl_spmatrix_alloc(5, 4); /* triplet format */ gsl_spmatrix *B, *C; size_t i, j; /* build the sparse matrix */ gsl_spmatrix_set(A, 0, 2, 3.1); gsl_spmatrix_set(A, 0, 3, 4.6); gsl_spmatrix_set(A, 1, 0, 1.0); gsl_spmatrix_set(A, 1, 2, 7.2); gsl_spmatrix_set(A, 3, 0, 2.1); gsl_spmatrix_set(A, 3, 1, 2.9); gsl_spmatrix_set(A, 3, 3, 8.5); gsl_spmatrix_set(A, 4, 0, 4.1); printf("printing all matrix elements:\n"); for (i = 0; i < 5; ++i) for (j = 0; j < 4; ++j) printf("A(%zu,%zu) = %g\n", i, j, gsl_spmatrix_get(A, i, j)); /* print out elements in triplet format */ printf("matrix in triplet format (i,j,Aij):\n"); gsl_spmatrix_fprintf(stdout, A, "%.1f"); /* convert to compressed column format */ B = gsl_spmatrix_ccs(A); printf("matrix in compressed column format:\n"); printf("i = [ "); for (i = 0; i < B->nz; ++i) printf("%zu, ", B->i[i]); printf("]\n"); printf("p = [ "); for (i = 0; i < B->size2 + 1; ++i) printf("%zu, ", B->p[i]); printf("]\n"); printf("d = [ "); for (i = 0; i < B->nz; ++i) printf("%g, ", B->data[i]); printf("]\n"); /* convert to compressed row format */ C = gsl_spmatrix_crs(A); printf("matrix in compressed row format:\n"); printf("i = [ "); for (i = 0; i < C->nz; ++i) printf("%zu, ", C->i[i]); printf("]\n"); printf("p = [ "); for (i = 0; i < C->size1 + 1; ++i) printf("%zu, ", C->p[i]); printf("]\n"); printf("d = [ "); for (i = 0; i < C->nz; ++i) printf("%g, ", C->data[i]); printf("]\n"); gsl_spmatrix_free(A); gsl_spmatrix_free(B); gsl_spmatrix_free(C); return 0; }  File: gsl-ref.info, Node: Sparse Matrices References and Further Reading, Prev: Sparse Matrices Examples, Up: Sparse Matrices 41.14 References and Further Reading ==================================== The algorithms used by these functions are described in the following sources: T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM, 2006. CSparse software library,  File: gsl-ref.info, Node: Sparse BLAS Support, Next: Sparse Linear Algebra, Prev: Sparse Matrices, Up: Top 42 Sparse BLAS Support ********************** The Sparse Basic Linear Algebra Subprograms (BLAS) define a set of fundamental operations on vectors and sparse matrices which can be used to create optimized higher-level linear algebra functionality. GSL supports a limited number of BLAS operations for sparse matrices. The header file 'gsl_spblas.h' contains the prototypes for the sparse BLAS functions and related declarations. * Menu: * Sparse BLAS operations:: * Sparse BLAS References and Further Reading::  File: gsl-ref.info, Node: Sparse BLAS operations, Next: Sparse BLAS References and Further Reading, Up: Sparse BLAS Support 42.1 Sparse BLAS operations =========================== -- Function: int gsl_spblas_dgemv (const CBLAS_TRANSPOSE_t TransA, const double ALPHA, const gsl_spmatrix * A, const gsl_vector * X, const double BETA, gsl_vector * Y) This function computes the matrix-vector product and sum y \leftarrow \alpha op(A) x + \beta y, where op(A) = A, A^T for TRANSA = 'CblasNoTrans', 'CblasTrans'. In-place computations are not supported, so X and Y must be distinct vectors. The matrix A may be in triplet or compressed format. -- Function: int gsl_spblas_dgemm (const double ALPHA, const gsl_spmatrix * A, const gsl_spmatrix * B, gsl_spmatrix * C) This function computes the sparse matrix-matrix product C = \alpha A B. The matrices must be in compressed format.  File: gsl-ref.info, Node: Sparse BLAS References and Further Reading, Prev: Sparse BLAS operations, Up: Sparse BLAS Support 42.2 References and Further Reading =================================== The algorithms used by these functions are described in the following sources: T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM, 2006. CSparse software library,  File: gsl-ref.info, Node: Sparse Linear Algebra, Next: Physical Constants, Prev: Sparse BLAS Support, Up: Top 43 Sparse Linear Algebra ************************ This chapter describes functions for solving sparse linear systems of equations. The library provides linear algebra routines which operate directly on the 'gsl_spmatrix' and 'gsl_vector' objects. The functions described in this chapter are declared in the header file 'gsl_splinalg.h'. * Menu: * Overview of Sparse Linear Algebra:: * Sparse Iterative Solvers:: * Sparse Linear Algebra Examples:: * Sparse Linear Algebra References and Further Reading::  File: gsl-ref.info, Node: Overview of Sparse Linear Algebra, Next: Sparse Iterative Solvers, Up: Sparse Linear Algebra 43.1 Overview ============= This chapter is primarily concerned with the solution of the linear system A x = b where A is a general square n-by-n non-singular sparse matrix, x is an unknown n-by-1 vector, and b is a given n-by-1 right hand side vector. There exist many methods for solving such sparse linear systems, which broadly fall into either direct or iterative categories. Direct methods include LU and QR decompositions, while iterative methods start with an initial guess for the vector x and update the guess through iteration until convergence. GSL does not currently provide any direct sparse solvers.  File: gsl-ref.info, Node: Sparse Iterative Solvers, Next: Sparse Linear Algebra Examples, Prev: Overview of Sparse Linear Algebra, Up: Sparse Linear Algebra 43.2 Sparse Iterative Solvers ============================= * Menu: * Sparse Iterative Solver Overview:: * Sparse Iterative Solvers Types:: * Iterating the Sparse Linear System::  File: gsl-ref.info, Node: Sparse Iterative Solver Overview, Next: Sparse Iterative Solvers Types, Up: Sparse Iterative Solvers 43.2.1 Overview --------------- Many practical iterative methods of solving large n-by-n sparse linear systems involve projecting an approximate solution for X onto a subspace of {\bf R}^n. If we define a m-dimensional subspace {\cal K} as the subspace of approximations to the solution X, then m constraints must be imposed to determine the next approximation. These m constraints define another m-dimensional subspace denoted by {\cal L}. The subspace dimension m is typically chosen to be much smaller than n in order to reduce the computational effort needed to generate the next approximate solution vector. The many iterative algorithms which exist differ mainly in their choice of {\cal K} and {\cal L}.  File: gsl-ref.info, Node: Sparse Iterative Solvers Types, Next: Iterating the Sparse Linear System, Prev: Sparse Iterative Solver Overview, Up: Sparse Iterative Solvers 43.2.2 Types of Sparse Iterative Solvers ---------------------------------------- The sparse linear algebra library provides the following types of iterative solvers: -- Sparse Iterative Type: gsl_splinalg_itersolve_gmres This specifies the Generalized Minimum Residual Method (GMRES). This is a projection method using {\cal K} = {\cal K}_m and {\cal L} = A {\cal K}_m where {\cal K}_m is the m-th Krylov subspace K_m = span( r_0, A r_0, ..., A^(m-1) r_0) and r_0 = b - A x_0 is the residual vector of the initial guess x_0. If m is set equal to n, then the Krylov subspace is {\bf R}^n and GMRES will provide the exact solution X. However, the goal is for the method to arrive at a very good approximation to X using a much smaller subspace {\cal K}_m. By default, the GMRES method selects m = MIN(n,10) but the user may specify a different value for m. The GMRES storage requirements grow as O(n(m+1)) and the number of flops grow as O(4 m^2 n - 4 m^3 / 3). In the below function 'gsl_splinalg_itersolve_iterate', one GMRES iteration is defined as projecting the approximate solution vector onto each Krylov subspace {\cal K}_1, ..., {\cal K}_m, and so m can be kept smaller by "restarting" the method and calling 'gsl_splinalg_itersolve_iterate' multiple times, providing the updated approximation X to each new call. If the method is not adequately converging, the user may try increasing the parameter m. GMRES is considered a robust general purpose iterative solver, however there are cases where the method stagnates if the matrix is not positive-definite and fails to reduce the residual until the very last projection onto the subspace {\cal K}_n = {\bf R}^n. In these cases, preconditioning the linear system can help, but GSL does not currently provide any preconditioners.  File: gsl-ref.info, Node: Iterating the Sparse Linear System, Prev: Sparse Iterative Solvers Types, Up: Sparse Iterative Solvers 43.2.3 Iterating the Sparse Linear System ----------------------------------------- The following functions are provided to allocate storage for the sparse linear solvers and iterate the system to a solution. -- Function: gsl_splinalg_itersolve * gsl_splinalg_itersolve_alloc (const gsl_splinalg_itersolve_type * T, const size_t N, const size_t M) This function allocates a workspace for the iterative solution of N-by-N sparse matrix systems. The iterative solver type is specified by T. The argument M specifies the size of the solution candidate subspace {\cal K}_m. The dimension M may be set to 0 in which case a reasonable default value is used. -- Function: void gsl_splinalg_itersolve_free (gsl_splinalg_itersolve * W) This function frees the memory associated with the workspace W. -- Function: const char * gsl_splinalg_itersolve_name (const gsl_splinalg_itersolve * W) This function returns a string pointer to the name of the solver. -- Function: int gsl_splinalg_itersolve_iterate (const gsl_spmatrix *A, const gsl_vector *B, const double TOL, gsl_vector *X, gsl_splinalg_itersolve *W) This function performs one iteration of the iterative method for the sparse linear system specfied by the matrix A, right hand side vector B and solution vector X. On input, X must be set to an initial guess for the solution. On output, X is updated to give the current solution estimate. The parameter TOL specifies the relative tolerance between the residual norm and norm of B in order to check for convergence. When the following condition is satisfied: || A x - b || <= tol * || b || the method has converged, the function returns 'GSL_SUCCESS' and the final solution is provided in X. Otherwise, the function returns 'GSL_CONTINUE' to signal that more iterations are required. Here, || \cdot || represents the Euclidean norm. The input matrix A may be in triplet or compressed column format. -- Function: double gsl_splinalg_itersolve_normr (const gsl_splinalg_itersolve *W) This function returns the current residual norm ||r|| = ||A x - b||, which is updated after each call to 'gsl_splinalg_itersolve_iterate'.  File: gsl-ref.info, Node: Sparse Linear Algebra Examples, Next: Sparse Linear Algebra References and Further Reading, Prev: Sparse Iterative Solvers, Up: Sparse Linear Algebra 43.3 Examples ============= This example program demonstrates the sparse linear algebra routines on the solution of a simple 1D Poisson equation on [0,1]: u''(x) = f(x) = -\pi^2 \sin(\pi x) with boundary conditions u(0) = u(1) = 0. The analytic solution of this simple problem is u(x) = \sin{\pi x}. We will solve this problem by finite differencing the left hand side to give 1/h^2 ( u_(i+1) - 2 u_i + u_(i-1) ) = f_i Defining a grid of N points, h = 1/(N-1). In the finite difference equation above, u_0 = u_{N-1} = 0 are known from the boundary conditions, so we will only put the equations for i = 1, ..., N-2 into the matrix system. The resulting (N-2) \times (N-2) matrix equation is An example program which constructs and solves this system is given below. The system is solved using the iterative GMRES solver. Here is the output of the program: iter 0 residual = 4.297275996844e-11 Converged showing that the method converged in a single iteration. The calculated solution is shown in the following plot. #include #include #include #include #include #include #include int main() { const size_t N = 100; /* number of grid points */ const size_t n = N - 2; /* subtract 2 to exclude boundaries */ const double h = 1.0 / (N - 1.0); /* grid spacing */ gsl_spmatrix *A = gsl_spmatrix_alloc(n ,n); /* triplet format */ gsl_spmatrix *C; /* compressed format */ gsl_vector *f = gsl_vector_alloc(n); /* right hand side vector */ gsl_vector *u = gsl_vector_alloc(n); /* solution vector */ size_t i; /* construct the sparse matrix for the finite difference equation */ /* construct first row */ gsl_spmatrix_set(A, 0, 0, -2.0); gsl_spmatrix_set(A, 0, 1, 1.0); /* construct rows [1:n-2] */ for (i = 1; i < n - 1; ++i) { gsl_spmatrix_set(A, i, i + 1, 1.0); gsl_spmatrix_set(A, i, i, -2.0); gsl_spmatrix_set(A, i, i - 1, 1.0); } /* construct last row */ gsl_spmatrix_set(A, n - 1, n - 1, -2.0); gsl_spmatrix_set(A, n - 1, n - 2, 1.0); /* scale by h^2 */ gsl_spmatrix_scale(A, 1.0 / (h * h)); /* construct right hand side vector */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double fi = -M_PI * M_PI * sin(M_PI * xi); gsl_vector_set(f, i, fi); } /* convert to compressed column format */ C = gsl_spmatrix_ccs(A); /* now solve the system with the GMRES iterative solver */ { const double tol = 1.0e-6; /* solution relative tolerance */ const size_t max_iter = 10; /* maximum iterations */ const gsl_splinalg_itersolve_type *T = gsl_splinalg_itersolve_gmres; gsl_splinalg_itersolve *work = gsl_splinalg_itersolve_alloc(T, n, 0); size_t iter = 0; double residual; int status; /* initial guess u = 0 */ gsl_vector_set_zero(u); /* solve the system A u = f */ do { status = gsl_splinalg_itersolve_iterate(C, f, tol, u, work); /* print out residual norm ||A*u - f|| */ residual = gsl_splinalg_itersolve_normr(work); fprintf(stderr, "iter %zu residual = %.12e\n", iter, residual); if (status == GSL_SUCCESS) fprintf(stderr, "Converged\n"); } while (status == GSL_CONTINUE && ++iter < max_iter); /* output solution */ for (i = 0; i < n; ++i) { double xi = (i + 1) * h; double u_exact = sin(M_PI * xi); double u_gsl = gsl_vector_get(u, i); printf("%f %.12e %.12e\n", xi, u_gsl, u_exact); } gsl_splinalg_itersolve_free(work); } gsl_spmatrix_free(A); gsl_spmatrix_free(C); gsl_vector_free(f); gsl_vector_free(u); return 0; } /* main() */  File: gsl-ref.info, Node: Sparse Linear Algebra References and Further Reading, Prev: Sparse Linear Algebra Examples, Up: Sparse Linear Algebra 43.4 References and Further Reading =================================== The implementation of the GMRES iterative solver closely follows the publications H. F. Walker, Implementation of the GMRES method using Householder transformations, SIAM J. Sci. Stat. Comput. 9(1), 1988. Y. Saad, Iterative methods for sparse linear systems, 2nd edition, SIAM, 2003.  File: gsl-ref.info, Node: Physical Constants, Next: IEEE floating-point arithmetic, Prev: Sparse Linear Algebra, Up: Top 44 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 44.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 44.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 44.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_\infty by Ry = h c R_\infty. '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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 44.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 #include 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 44.18 References and Further Reading ==================================== The authoritative sources for physical constants are the 2006 CODATA recommended values, published in the article below. Further information on the values of physical constants is also available from the NIST website. P.J. Mohr, B.N. Taylor, D.B. Newell, "CODATA Recommended Values of the Fundamental Physical Constants: 2006", Reviews of Modern Physics, 80(2), pp. 633-730 (2008).  File: gsl-ref.info, Node: IEEE floating-point arithmetic, Next: Debugging Numerical Programs, Prev: Physical Constants, Up: Top 45 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 45.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 #include 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 45.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. Note that on the x86 series of processors this function sets both the original x87 mode and the newer MXCSR mode, which controls SSE floating-point operations. The SSE floating-point units do not have a precision-control bit, and always work in double-precision. The single-precision and extended-precision keywords have no effect in this case. 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 #include #include 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 final result is higher than the correct value (when we add each term to the sum the final result is always rounded up, which increases the sum by at least one tick until the added term underflows to zero). 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 45.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 -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. '-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 cyclic functions and the initial functions 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 and wrote the ode-initval2 routines. *Lowell Johnson* Implementation of the Mathieu functions. *Patrick Alken* Implementation of nonsymmetric and generalized eigensystems, B-splines, robust linear regression, and sparse matrices. *Rhys Ulerich* Wrote the multiset routines. *Pavel Holoborodko* Wrote the fixed order Gauss-Legendre quadrature routines. *Pedro Gonnet* Wrote the CQUAD integration routines. 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],[cos]) AC_CHECK_LIB([gslcblas],[cblas_dgemm]) AC_CHECK_LIB([gsl],[gsl_blas_dgemm]) 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 cos in -lm... yes checking for cblas_dgemm in -lgslcblas... yes checking for gsl_blas_dgemm 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: AX_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 'AX_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 ' to substitute 'gsl_hypot' for each occurrence of 'hypot' when 'hypot' is not available.  File: gsl-ref.info, Node: GSL CBLAS Library, Next: GNU General Public License, 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 #include 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: GNU General Public License, Next: GNU Free Documentation License, Prev: GSL CBLAS Library, Up: Top GNU General Public License ************************** Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program-to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS ==================== 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a. The work must carry prominent notices stating that you modified it, and giving a relevant date. b. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d. Limiting the use for publicity purposes of names of licensors or authors of the material; or e. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read .  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.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. 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. The "publisher" means any person or entity that distributes copies of the Document to the public. 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 under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 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 . 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. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. 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.3 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.  File: gsl-ref.info, Node: Function Index, Next: Variable Index, Prev: GNU Free Documentation License, Up: Top Function Index ************** [index] * Menu: * cblas_caxpy: Level 1 CBLAS Functions. (line 90) * cblas_ccopy: Level 1 CBLAS Functions. (line 87) * cblas_cdotc_sub: Level 1 CBLAS Functions. (line 21) * cblas_cdotu_sub: Level 1 CBLAS Functions. (line 18) * cblas_cgbmv: Level 2 CBLAS Functions. (line 93) * cblas_cgemm: Level 3 CBLAS Functions. (line 76) * cblas_cgemv: Level 2 CBLAS Functions. (line 88) * cblas_cgerc: Level 2 CBLAS Functions. (line 264) * cblas_cgeru: Level 2 CBLAS Functions. (line 260) * cblas_chbmv: Level 2 CBLAS Functions. (line 250) * cblas_chemm: Level 3 CBLAS Functions. (line 146) * cblas_chemv: Level 2 CBLAS Functions. (line 245) * cblas_cher: Level 2 CBLAS Functions. (line 268) * cblas_cher2: Level 2 CBLAS Functions. (line 276) * cblas_cher2k: Level 3 CBLAS Functions. (line 157) * cblas_cherk: Level 3 CBLAS Functions. (line 152) * cblas_chpmv: Level 2 CBLAS Functions. (line 255) * cblas_chpr: Level 2 CBLAS Functions. (line 272) * cblas_chpr2: Level 2 CBLAS Functions. (line 281) * cblas_cscal: Level 1 CBLAS Functions. (line 132) * cblas_csscal: Level 1 CBLAS Functions. (line 138) * cblas_cswap: Level 1 CBLAS Functions. (line 84) * cblas_csymm: Level 3 CBLAS Functions. (line 82) * cblas_csyr2k: Level 3 CBLAS Functions. (line 93) * cblas_csyrk: Level 3 CBLAS Functions. (line 88) * cblas_ctbmv: Level 2 CBLAS Functions. (line 104) * cblas_ctbsv: Level 2 CBLAS Functions. (line 119) * cblas_ctpmv: Level 2 CBLAS Functions. (line 109) * cblas_ctpsv: Level 2 CBLAS Functions. (line 124) * cblas_ctrmm: Level 3 CBLAS Functions. (line 99) * cblas_ctrmv: Level 2 CBLAS Functions. (line 99) * cblas_ctrsm: Level 3 CBLAS Functions. (line 105) * cblas_ctrsv: Level 2 CBLAS Functions. (line 114) * cblas_dasum: Level 1 CBLAS Functions. (line 39) * cblas_daxpy: Level 1 CBLAS Functions. (line 81) * cblas_dcopy: Level 1 CBLAS Functions. (line 78) * cblas_ddot: Level 1 CBLAS Functions. (line 15) * cblas_dgbmv: Level 2 CBLAS Functions. (line 52) * cblas_dgemm: Level 3 CBLAS Functions. (line 41) * cblas_dgemv: Level 2 CBLAS Functions. (line 47) * cblas_dger: Level 2 CBLAS Functions. (line 222) * cblas_dnrm2: Level 1 CBLAS Functions. (line 36) * cblas_drot: Level 1 CBLAS Functions. (line 120) * cblas_drotg: Level 1 CBLAS Functions. (line 114) * cblas_drotm: Level 1 CBLAS Functions. (line 123) * cblas_drotmg: Level 1 CBLAS Functions. (line 117) * cblas_dsbmv: Level 2 CBLAS Functions. (line 212) * cblas_dscal: Level 1 CBLAS Functions. (line 129) * cblas_dsdot: Level 1 CBLAS Functions. (line 9) * cblas_dspmv: Level 2 CBLAS Functions. (line 217) * cblas_dspr: Level 2 CBLAS Functions. (line 231) * cblas_dspr2: Level 2 CBLAS Functions. (line 240) * cblas_dswap: Level 1 CBLAS Functions. (line 75) * cblas_dsymm: Level 3 CBLAS Functions. (line 47) * cblas_dsymv: Level 2 CBLAS Functions. (line 207) * cblas_dsyr: Level 2 CBLAS Functions. (line 227) * cblas_dsyr2: Level 2 CBLAS Functions. (line 235) * cblas_dsyr2k: Level 3 CBLAS Functions. (line 58) * cblas_dsyrk: Level 3 CBLAS Functions. (line 53) * cblas_dtbmv: Level 2 CBLAS Functions. (line 63) * cblas_dtbsv: Level 2 CBLAS Functions. (line 78) * cblas_dtpmv: Level 2 CBLAS Functions. (line 68) * cblas_dtpsv: Level 2 CBLAS Functions. (line 83) * cblas_dtrmm: Level 3 CBLAS Functions. (line 64) * cblas_dtrmv: Level 2 CBLAS Functions. (line 58) * cblas_dtrsm: Level 3 CBLAS Functions. (line 70) * cblas_dtrsv: Level 2 CBLAS Functions. (line 73) * cblas_dzasum: Level 1 CBLAS Functions. (line 51) * cblas_dznrm2: Level 1 CBLAS Functions. (line 48) * cblas_icamax: Level 1 CBLAS Functions. (line 60) * cblas_idamax: Level 1 CBLAS Functions. (line 57) * cblas_isamax: Level 1 CBLAS Functions. (line 54) * cblas_izamax: Level 1 CBLAS Functions. (line 63) * cblas_sasum: Level 1 CBLAS Functions. (line 33) * cblas_saxpy: Level 1 CBLAS Functions. (line 72) * cblas_scasum: Level 1 CBLAS Functions. (line 45) * cblas_scnrm2: Level 1 CBLAS Functions. (line 42) * cblas_scopy: Level 1 CBLAS Functions. (line 69) * cblas_sdot: Level 1 CBLAS Functions. (line 12) * cblas_sdsdot: Level 1 CBLAS Functions. (line 6) * cblas_sgbmv: Level 2 CBLAS Functions. (line 11) * cblas_sgemm: Level 3 CBLAS Functions. (line 6) * cblas_sgemv: Level 2 CBLAS Functions. (line 6) * cblas_sger: Level 2 CBLAS Functions. (line 185) * cblas_snrm2: Level 1 CBLAS Functions. (line 30) * cblas_srot: Level 1 CBLAS Functions. (line 108) * cblas_srotg: Level 1 CBLAS Functions. (line 102) * cblas_srotm: Level 1 CBLAS Functions. (line 111) * cblas_srotmg: Level 1 CBLAS Functions. (line 105) * cblas_ssbmv: Level 2 CBLAS Functions. (line 175) * cblas_sscal: Level 1 CBLAS Functions. (line 126) * cblas_sspmv: Level 2 CBLAS Functions. (line 180) * cblas_sspr: Level 2 CBLAS Functions. (line 194) * cblas_sspr2: Level 2 CBLAS Functions. (line 203) * cblas_sswap: Level 1 CBLAS Functions. (line 66) * cblas_ssymm: Level 3 CBLAS Functions. (line 12) * cblas_ssymv: Level 2 CBLAS Functions. (line 170) * cblas_ssyr: Level 2 CBLAS Functions. (line 190) * cblas_ssyr2: Level 2 CBLAS Functions. (line 198) * cblas_ssyr2k: Level 3 CBLAS Functions. (line 23) * cblas_ssyrk: Level 3 CBLAS Functions. (line 18) * cblas_stbmv: Level 2 CBLAS Functions. (line 22) * cblas_stbsv: Level 2 CBLAS Functions. (line 37) * cblas_stpmv: Level 2 CBLAS Functions. (line 27) * cblas_stpsv: Level 2 CBLAS Functions. (line 42) * cblas_strmm: Level 3 CBLAS Functions. (line 29) * cblas_strmv: Level 2 CBLAS Functions. (line 17) * cblas_strsm: Level 3 CBLAS Functions. (line 35) * cblas_strsv: Level 2 CBLAS Functions. (line 32) * cblas_xerbla: Level 3 CBLAS Functions. (line 180) * cblas_zaxpy: Level 1 CBLAS Functions. (line 99) * cblas_zcopy: Level 1 CBLAS Functions. (line 96) * cblas_zdotc_sub: Level 1 CBLAS Functions. (line 27) * cblas_zdotu_sub: Level 1 CBLAS Functions. (line 24) * cblas_zdscal: Level 1 CBLAS Functions. (line 141) * cblas_zgbmv: Level 2 CBLAS Functions. (line 134) * cblas_zgemm: Level 3 CBLAS Functions. (line 111) * cblas_zgemv: Level 2 CBLAS Functions. (line 129) * cblas_zgerc: Level 2 CBLAS Functions. (line 304) * cblas_zgeru: Level 2 CBLAS Functions. (line 300) * cblas_zhbmv: Level 2 CBLAS Functions. (line 290) * cblas_zhemm: Level 3 CBLAS Functions. (line 163) * cblas_zhemv: Level 2 CBLAS Functions. (line 285) * cblas_zher: Level 2 CBLAS Functions. (line 308) * cblas_zher2: Level 2 CBLAS Functions. (line 316) * cblas_zher2k: Level 3 CBLAS Functions. (line 174) * cblas_zherk: Level 3 CBLAS Functions. (line 169) * cblas_zhpmv: Level 2 CBLAS Functions. (line 295) * cblas_zhpr: Level 2 CBLAS Functions. (line 312) * cblas_zhpr2: Level 2 CBLAS Functions. (line 321) * cblas_zscal: Level 1 CBLAS Functions. (line 135) * cblas_zswap: Level 1 CBLAS Functions. (line 93) * cblas_zsymm: Level 3 CBLAS Functions. (line 117) * cblas_zsyr2k: Level 3 CBLAS Functions. (line 128) * cblas_zsyrk: Level 3 CBLAS Functions. (line 123) * cblas_ztbmv: Level 2 CBLAS Functions. (line 145) * cblas_ztbsv: Level 2 CBLAS Functions. (line 160) * cblas_ztpmv: Level 2 CBLAS Functions. (line 150) * cblas_ztpsv: Level 2 CBLAS Functions. (line 165) * cblas_ztrmm: Level 3 CBLAS Functions. (line 134) * cblas_ztrmv: Level 2 CBLAS Functions. (line 140) * cblas_ztrsm: Level 3 CBLAS Functions. (line 140) * cblas_ztrsv: Level 2 CBLAS Functions. (line 155) * gsl_acosh: Elementary Functions. (line 32) * gsl_asinh: Elementary Functions. (line 36) * gsl_atanh: Elementary Functions. (line 40) * gsl_blas_caxpy: Level 1 GSL BLAS Interface. (line 92) * gsl_blas_ccopy: Level 1 GSL BLAS Interface. (line 81) * gsl_blas_cdotc: Level 1 GSL BLAS Interface. (line 27) * gsl_blas_cdotu: Level 1 GSL BLAS Interface. (line 20) * gsl_blas_cgemm: Level 3 GSL BLAS Interface. (line 13) * gsl_blas_cgemv: Level 2 GSL BLAS Interface. (line 12) * gsl_blas_cgerc: Level 2 GSL BLAS Interface. (line 106) * gsl_blas_cgeru: Level 2 GSL BLAS Interface. (line 97) * gsl_blas_chemm: Level 3 GSL BLAS Interface. (line 47) * gsl_blas_chemv: Level 2 GSL BLAS Interface. (line 78) * gsl_blas_cher: Level 2 GSL BLAS Interface. (line 126) * gsl_blas_cher2: Level 2 GSL BLAS Interface. (line 150) * gsl_blas_cher2k: Level 3 GSL BLAS Interface. (line 168) * gsl_blas_cherk: Level 3 GSL BLAS Interface. (line 130) * gsl_blas_cscal: Level 1 GSL BLAS Interface. (line 101) * gsl_blas_csscal: Level 1 GSL BLAS Interface. (line 105) * gsl_blas_cswap: Level 1 GSL BLAS Interface. (line 72) * gsl_blas_csymm: Level 3 GSL BLAS Interface. (line 32) * gsl_blas_csyr2k: Level 3 GSL BLAS Interface. (line 151) * gsl_blas_csyrk: Level 3 GSL BLAS Interface. (line 115) * gsl_blas_ctrmm: Level 3 GSL BLAS Interface. (line 69) * gsl_blas_ctrmv: Level 2 GSL BLAS Interface. (line 30) * gsl_blas_ctrsm: Level 3 GSL BLAS Interface. (line 92) * gsl_blas_ctrsv: Level 2 GSL BLAS Interface. (line 51) * gsl_blas_dasum: Level 1 GSL BLAS Interface. (line 46) * gsl_blas_daxpy: Level 1 GSL BLAS Interface. (line 90) * gsl_blas_dcopy: Level 1 GSL BLAS Interface. (line 80) * gsl_blas_ddot: Level 1 GSL BLAS Interface. (line 15) * gsl_blas_dgemm: Level 3 GSL BLAS Interface. (line 10) * gsl_blas_dgemv: Level 2 GSL BLAS Interface. (line 9) * gsl_blas_dger: Level 2 GSL BLAS Interface. (line 95) * gsl_blas_dnrm2: Level 1 GSL BLAS Interface. (line 35) * gsl_blas_drot: Level 1 GSL BLAS Interface. (line 126) * gsl_blas_drotg: Level 1 GSL BLAS Interface. (line 114) * gsl_blas_drotm: Level 1 GSL BLAS Interface. (line 141) * gsl_blas_drotmg: Level 1 GSL BLAS Interface. (line 133) * gsl_blas_dscal: Level 1 GSL BLAS Interface. (line 100) * gsl_blas_dsdot: Level 1 GSL BLAS Interface. (line 13) * gsl_blas_dswap: Level 1 GSL BLAS Interface. (line 71) * gsl_blas_dsymm: Level 3 GSL BLAS Interface. (line 29) * gsl_blas_dsymv: Level 2 GSL BLAS Interface. (line 68) * gsl_blas_dsyr: Level 2 GSL BLAS Interface. (line 117) * gsl_blas_dsyr2: Level 2 GSL BLAS Interface. (line 141) * gsl_blas_dsyr2k: Level 3 GSL BLAS Interface. (line 148) * gsl_blas_dsyrk: Level 3 GSL BLAS Interface. (line 112) * gsl_blas_dtrmm: Level 3 GSL BLAS Interface. (line 66) * gsl_blas_dtrmv: Level 2 GSL BLAS Interface. (line 27) * gsl_blas_dtrsm: Level 3 GSL BLAS Interface. (line 89) * gsl_blas_dtrsv: Level 2 GSL BLAS Interface. (line 48) * gsl_blas_dzasum: Level 1 GSL BLAS Interface. (line 51) * gsl_blas_dznrm2: Level 1 GSL BLAS Interface. (line 40) * gsl_blas_icamax: Level 1 GSL BLAS Interface. (line 58) * gsl_blas_idamax: Level 1 GSL BLAS Interface. (line 57) * gsl_blas_isamax: Level 1 GSL BLAS Interface. (line 56) * gsl_blas_izamax: Level 1 GSL BLAS Interface. (line 60) * gsl_blas_sasum: Level 1 GSL BLAS Interface. (line 45) * gsl_blas_saxpy: Level 1 GSL BLAS Interface. (line 88) * gsl_blas_scasum: Level 1 GSL BLAS Interface. (line 50) * gsl_blas_scnrm2: Level 1 GSL BLAS Interface. (line 39) * gsl_blas_scopy: Level 1 GSL BLAS Interface. (line 78) * gsl_blas_sdot: Level 1 GSL BLAS Interface. (line 11) * gsl_blas_sdsdot: Level 1 GSL BLAS Interface. (line 6) * gsl_blas_sgemm: Level 3 GSL BLAS Interface. (line 6) * gsl_blas_sgemv: Level 2 GSL BLAS Interface. (line 6) * gsl_blas_sger: Level 2 GSL BLAS Interface. (line 93) * gsl_blas_snrm2: Level 1 GSL BLAS Interface. (line 34) * gsl_blas_srot: Level 1 GSL BLAS Interface. (line 124) * gsl_blas_srotg: Level 1 GSL BLAS Interface. (line 112) * gsl_blas_srotm: Level 1 GSL BLAS Interface. (line 139) * gsl_blas_srotmg: Level 1 GSL BLAS Interface. (line 131) * gsl_blas_sscal: Level 1 GSL BLAS Interface. (line 99) * gsl_blas_sswap: Level 1 GSL BLAS Interface. (line 69) * gsl_blas_ssymm: Level 3 GSL BLAS Interface. (line 26) * gsl_blas_ssymv: Level 2 GSL BLAS Interface. (line 65) * gsl_blas_ssyr: Level 2 GSL BLAS Interface. (line 115) * gsl_blas_ssyr2: Level 2 GSL BLAS Interface. (line 138) * gsl_blas_ssyr2k: Level 3 GSL BLAS Interface. (line 145) * gsl_blas_ssyrk: Level 3 GSL BLAS Interface. (line 109) * gsl_blas_strmm: Level 3 GSL BLAS Interface. (line 63) * gsl_blas_strmv: Level 2 GSL BLAS Interface. (line 24) * gsl_blas_strsm: Level 3 GSL BLAS Interface. (line 86) * gsl_blas_strsv: Level 2 GSL BLAS Interface. (line 45) * gsl_blas_zaxpy: Level 1 GSL BLAS Interface. (line 94) * gsl_blas_zcopy: Level 1 GSL BLAS Interface. (line 83) * gsl_blas_zdotc: Level 1 GSL BLAS Interface. (line 29) * gsl_blas_zdotu: Level 1 GSL BLAS Interface. (line 22) * gsl_blas_zdscal: Level 1 GSL BLAS Interface. (line 107) * gsl_blas_zgemm: Level 3 GSL BLAS Interface. (line 17) * gsl_blas_zgemv: Level 2 GSL BLAS Interface. (line 16) * gsl_blas_zgerc: Level 2 GSL BLAS Interface. (line 109) * gsl_blas_zgeru: Level 2 GSL BLAS Interface. (line 100) * gsl_blas_zhemm: Level 3 GSL BLAS Interface. (line 51) * gsl_blas_zhemv: Level 2 GSL BLAS Interface. (line 82) * gsl_blas_zher: Level 2 GSL BLAS Interface. (line 128) * gsl_blas_zher2: Level 2 GSL BLAS Interface. (line 154) * gsl_blas_zher2k: Level 3 GSL BLAS Interface. (line 172) * gsl_blas_zherk: Level 3 GSL BLAS Interface. (line 133) * gsl_blas_zscal: Level 1 GSL BLAS Interface. (line 103) * gsl_blas_zswap: Level 1 GSL BLAS Interface. (line 74) * gsl_blas_zsymm: Level 3 GSL BLAS Interface. (line 36) * gsl_blas_zsyr2k: Level 3 GSL BLAS Interface. (line 155) * gsl_blas_zsyrk: Level 3 GSL BLAS Interface. (line 119) * gsl_blas_ztrmm: Level 3 GSL BLAS Interface. (line 73) * gsl_blas_ztrmv: Level 2 GSL BLAS Interface. (line 33) * gsl_blas_ztrsm: Level 3 GSL BLAS Interface. (line 96) * gsl_blas_ztrsv: Level 2 GSL BLAS Interface. (line 54) * gsl_block_alloc: Block allocation. (line 14) * gsl_block_calloc: Block allocation. (line 24) * gsl_block_fprintf: Reading and writing blocks. (line 25) * gsl_block_fread: Reading and writing blocks. (line 16) * gsl_block_free: Block allocation. (line 28) * gsl_block_fscanf: Reading and writing blocks. (line 33) * gsl_block_fwrite: Reading and writing blocks. (line 9) * gsl_bspline_alloc: Initializing the B-splines solver. (line 9) * gsl_bspline_deriv_eval: Evaluation of B-spline basis function derivatives. (line 6) * gsl_bspline_deriv_eval_nonzero: Evaluation of B-spline basis function derivatives. (line 19) * gsl_bspline_eval: Evaluation of B-spline basis functions. (line 6) * gsl_bspline_eval_nonzero: Evaluation of B-spline basis functions. (line 16) * gsl_bspline_free: Initializing the B-splines solver. (line 17) * gsl_bspline_greville_abscissa: Working with the Greville abscissae. (line 14) * gsl_bspline_knots: Constructing the knots vector. (line 6) * gsl_bspline_knots_uniform: Constructing the knots vector. (line 11) * gsl_bspline_ncoeffs: Evaluation of B-spline basis functions. (line 27) * gsl_cdf_beta_P: The Beta Distribution. (line 21) * gsl_cdf_beta_Pinv: The Beta Distribution. (line 23) * gsl_cdf_beta_Q: The Beta Distribution. (line 22) * gsl_cdf_beta_Qinv: The Beta Distribution. (line 24) * gsl_cdf_binomial_P: The Binomial Distribution. (line 24) * gsl_cdf_binomial_Q: The Binomial Distribution. (line 26) * gsl_cdf_cauchy_P: The Cauchy Distribution. (line 22) * gsl_cdf_cauchy_Pinv: The Cauchy Distribution. (line 24) * gsl_cdf_cauchy_Q: The Cauchy Distribution. (line 23) * gsl_cdf_cauchy_Qinv: The Cauchy Distribution. (line 25) * gsl_cdf_chisq_P: The Chi-squared Distribution. (line 29) * gsl_cdf_chisq_Pinv: The Chi-squared Distribution. (line 31) * gsl_cdf_chisq_Q: The Chi-squared Distribution. (line 30) * gsl_cdf_chisq_Qinv: The Chi-squared Distribution. (line 32) * gsl_cdf_exponential_P: The Exponential Distribution. (line 20) * gsl_cdf_exponential_Pinv: The Exponential Distribution. (line 22) * gsl_cdf_exponential_Q: The Exponential Distribution. (line 21) * gsl_cdf_exponential_Qinv: The Exponential Distribution. (line 23) * gsl_cdf_exppow_P: The Exponential Power Distribution. (line 24) * gsl_cdf_exppow_Q: The Exponential Power Distribution. (line 25) * gsl_cdf_fdist_P: The F-distribution. (line 33) * gsl_cdf_fdist_Pinv: The F-distribution. (line 35) * gsl_cdf_fdist_Q: The F-distribution. (line 34) * gsl_cdf_fdist_Qinv: The F-distribution. (line 37) * gsl_cdf_flat_P: The Flat (Uniform) Distribution. (line 20) * gsl_cdf_flat_Pinv: The Flat (Uniform) Distribution. (line 22) * gsl_cdf_flat_Q: The Flat (Uniform) Distribution. (line 21) * gsl_cdf_flat_Qinv: The Flat (Uniform) Distribution. (line 23) * gsl_cdf_gamma_P: The Gamma Distribution. (line 33) * gsl_cdf_gamma_Pinv: The Gamma Distribution. (line 35) * gsl_cdf_gamma_Q: The Gamma Distribution. (line 34) * gsl_cdf_gamma_Qinv: The Gamma Distribution. (line 36) * gsl_cdf_gaussian_P: The Gaussian Distribution. (line 41) * gsl_cdf_gaussian_Pinv: The Gaussian Distribution. (line 43) * gsl_cdf_gaussian_Q: The Gaussian Distribution. (line 42) * gsl_cdf_gaussian_Qinv: The Gaussian Distribution. (line 44) * gsl_cdf_geometric_P: The Geometric Distribution. (line 25) * gsl_cdf_geometric_Q: The Geometric Distribution. (line 26) * gsl_cdf_gumbel1_P: The Type-1 Gumbel Distribution. (line 21) * gsl_cdf_gumbel1_Pinv: The Type-1 Gumbel Distribution. (line 23) * gsl_cdf_gumbel1_Q: The Type-1 Gumbel Distribution. (line 22) * gsl_cdf_gumbel1_Qinv: The Type-1 Gumbel Distribution. (line 24) * gsl_cdf_gumbel2_P: The Type-2 Gumbel Distribution. (line 21) * gsl_cdf_gumbel2_Pinv: The Type-2 Gumbel Distribution. (line 23) * gsl_cdf_gumbel2_Q: The Type-2 Gumbel Distribution. (line 22) * gsl_cdf_gumbel2_Qinv: The Type-2 Gumbel Distribution. (line 24) * gsl_cdf_hypergeometric_P: The Hypergeometric Distribution. (line 29) * gsl_cdf_hypergeometric_Q: The Hypergeometric Distribution. (line 31) * gsl_cdf_laplace_P: The Laplace Distribution. (line 19) * gsl_cdf_laplace_Pinv: The Laplace Distribution. (line 21) * gsl_cdf_laplace_Q: The Laplace Distribution. (line 20) * gsl_cdf_laplace_Qinv: The Laplace Distribution. (line 22) * gsl_cdf_logistic_P: The Logistic Distribution. (line 20) * gsl_cdf_logistic_Pinv: The Logistic Distribution. (line 22) * gsl_cdf_logistic_Q: The Logistic Distribution. (line 21) * gsl_cdf_logistic_Qinv: The Logistic Distribution. (line 23) * gsl_cdf_lognormal_P: The Lognormal Distribution. (line 22) * gsl_cdf_lognormal_Pinv: The Lognormal Distribution. (line 26) * gsl_cdf_lognormal_Q: The Lognormal Distribution. (line 24) * gsl_cdf_lognormal_Qinv: The Lognormal Distribution. (line 28) * gsl_cdf_negative_binomial_P: The Negative Binomial Distribution. (line 24) * gsl_cdf_negative_binomial_Q: The Negative Binomial Distribution. (line 26) * gsl_cdf_pareto_P: The Pareto Distribution. (line 21) * gsl_cdf_pareto_Pinv: The Pareto Distribution. (line 23) * gsl_cdf_pareto_Q: The Pareto Distribution. (line 22) * gsl_cdf_pareto_Qinv: The Pareto Distribution. (line 24) * gsl_cdf_pascal_P: The Pascal Distribution. (line 23) * gsl_cdf_pascal_Q: The Pascal Distribution. (line 25) * gsl_cdf_poisson_P: The Poisson Distribution. (line 21) * gsl_cdf_poisson_Q: The Poisson Distribution. (line 22) * gsl_cdf_rayleigh_P: The Rayleigh Distribution. (line 20) * gsl_cdf_rayleigh_Pinv: The Rayleigh Distribution. (line 22) * gsl_cdf_rayleigh_Q: The Rayleigh Distribution. (line 21) * gsl_cdf_rayleigh_Qinv: The Rayleigh Distribution. (line 23) * gsl_cdf_tdist_P: The t-distribution. (line 29) * gsl_cdf_tdist_Pinv: The t-distribution. (line 31) * gsl_cdf_tdist_Q: The t-distribution. (line 30) * gsl_cdf_tdist_Qinv: The t-distribution. (line 32) * gsl_cdf_ugaussian_P: The Gaussian Distribution. (line 49) * gsl_cdf_ugaussian_Pinv: The Gaussian Distribution. (line 51) * gsl_cdf_ugaussian_Q: The Gaussian Distribution. (line 50) * gsl_cdf_ugaussian_Qinv: The Gaussian Distribution. (line 52) * gsl_cdf_weibull_P: The Weibull Distribution. (line 21) * gsl_cdf_weibull_Pinv: The Weibull Distribution. (line 23) * gsl_cdf_weibull_Q: The Weibull Distribution. (line 22) * gsl_cdf_weibull_Qinv: The Weibull Distribution. (line 24) * gsl_cheb_alloc: Creation and Calculation of Chebyshev Series. (line 6) * gsl_cheb_calc_deriv: Derivatives and Integrals. (line 12) * gsl_cheb_calc_integ: Derivatives and Integrals. (line 18) * gsl_cheb_coeffs: Auxiliary Functions for Chebyshev Series. (line 13) * gsl_cheb_eval: Chebyshev Series Evaluation. (line 6) * gsl_cheb_eval_err: Chebyshev Series Evaluation. (line 10) * gsl_cheb_eval_n: Chebyshev Series Evaluation. (line 17) * gsl_cheb_eval_n_err: Chebyshev Series Evaluation. (line 22) * gsl_cheb_free: Creation and Calculation of Chebyshev Series. (line 10) * gsl_cheb_init: Creation and Calculation of Chebyshev Series. (line 13) * gsl_cheb_order: Auxiliary Functions for Chebyshev Series. (line 9) * gsl_cheb_size: Auxiliary Functions for Chebyshev Series. (line 12) * gsl_combination_alloc: Combination allocation. (line 6) * gsl_combination_calloc: Combination allocation. (line 15) * gsl_combination_data: Combination properties. (line 13) * gsl_combination_fprintf: Reading and writing combinations. (line 27) * gsl_combination_fread: Reading and writing combinations. (line 17) * gsl_combination_free: Combination allocation. (line 30) * gsl_combination_fscanf: Reading and writing combinations. (line 36) * gsl_combination_fwrite: Reading and writing combinations. (line 9) * gsl_combination_get: Accessing combination elements. (line 9) * gsl_combination_init_first: Combination allocation. (line 22) * gsl_combination_init_last: Combination allocation. (line 26) * gsl_combination_k: Combination properties. (line 9) * gsl_combination_memcpy: Combination allocation. (line 33) * gsl_combination_n: Combination properties. (line 6) * gsl_combination_next: Combination functions. (line 6) * gsl_combination_prev: Combination functions. (line 14) * gsl_combination_valid: Combination properties. (line 17) * gsl_complex_abs: Properties of complex numbers. (line 10) * gsl_complex_abs2: Properties of complex numbers. (line 13) * gsl_complex_add: Complex arithmetic operators. (line 6) * gsl_complex_add_imag: Complex arithmetic operators. (line 38) * gsl_complex_add_real: Complex arithmetic operators. (line 22) * gsl_complex_arccos: Inverse Complex Trigonometric Functions. (line 19) * gsl_complex_arccosh: Inverse Complex Hyperbolic Functions. (line 11) * gsl_complex_arccosh_real: Inverse Complex Hyperbolic Functions. (line 18) * gsl_complex_arccos_real: Inverse Complex Trigonometric Functions. (line 24) * gsl_complex_arccot: Inverse Complex Trigonometric Functions. (line 52) * gsl_complex_arccoth: Inverse Complex Hyperbolic Functions. (line 39) * gsl_complex_arccsc: Inverse Complex Trigonometric Functions. (line 44) * gsl_complex_arccsch: Inverse Complex Hyperbolic Functions. (line 35) * gsl_complex_arccsc_real: Inverse Complex Trigonometric Functions. (line 48) * gsl_complex_arcsec: Inverse Complex Trigonometric Functions. (line 36) * gsl_complex_arcsech: Inverse Complex Hyperbolic Functions. (line 31) * gsl_complex_arcsec_real: Inverse Complex Trigonometric Functions. (line 40) * gsl_complex_arcsin: Inverse Complex Trigonometric Functions. (line 6) * gsl_complex_arcsinh: Inverse Complex Hyperbolic Functions. (line 6) * gsl_complex_arcsin_real: Inverse Complex Trigonometric Functions. (line 11) * gsl_complex_arctan: Inverse Complex Trigonometric Functions. (line 31) * gsl_complex_arctanh: Inverse Complex Hyperbolic Functions. (line 22) * gsl_complex_arctanh_real: Inverse Complex Hyperbolic Functions. (line 27) * gsl_complex_arg: Properties of complex numbers. (line 6) * gsl_complex_conjugate: Complex arithmetic operators. (line 54) * gsl_complex_cos: Complex Trigonometric Functions. (line 10) * gsl_complex_cosh: Complex Hyperbolic Functions. (line 10) * gsl_complex_cot: Complex Trigonometric Functions. (line 26) * gsl_complex_coth: Complex Hyperbolic Functions. (line 26) * gsl_complex_csc: Complex Trigonometric Functions. (line 22) * gsl_complex_csch: Complex Hyperbolic Functions. (line 22) * gsl_complex_div: Complex arithmetic operators. (line 18) * gsl_complex_div_imag: Complex arithmetic operators. (line 50) * gsl_complex_div_real: Complex arithmetic operators. (line 34) * gsl_complex_exp: Elementary Complex Functions. (line 24) * gsl_complex_inverse: Complex arithmetic operators. (line 58) * gsl_complex_log: Elementary Complex Functions. (line 28) * gsl_complex_log10: Elementary Complex Functions. (line 33) * gsl_complex_logabs: Properties of complex numbers. (line 17) * gsl_complex_log_b: Elementary Complex Functions. (line 37) * gsl_complex_mul: Complex arithmetic operators. (line 14) * gsl_complex_mul_imag: Complex arithmetic operators. (line 46) * gsl_complex_mul_real: Complex arithmetic operators. (line 30) * gsl_complex_negative: Complex arithmetic operators. (line 62) * gsl_complex_polar: Representation of complex numbers. (line 29) * gsl_complex_poly_complex_eval: Polynomial Evaluation. (line 21) * gsl_complex_pow: Elementary Complex Functions. (line 15) * gsl_complex_pow_real: Elementary Complex Functions. (line 20) * gsl_complex_rect: Representation of complex numbers. (line 24) * gsl_complex_sec: Complex Trigonometric Functions. (line 18) * gsl_complex_sech: Complex Hyperbolic Functions. (line 18) * gsl_complex_sin: Complex Trigonometric Functions. (line 6) * gsl_complex_sinh: Complex Hyperbolic Functions. (line 6) * gsl_complex_sqrt: Elementary Complex Functions. (line 6) * gsl_complex_sqrt_real: Elementary Complex Functions. (line 11) * gsl_complex_sub: Complex arithmetic operators. (line 10) * gsl_complex_sub_imag: Complex arithmetic operators. (line 42) * gsl_complex_sub_real: Complex arithmetic operators. (line 26) * gsl_complex_tan: Complex Trigonometric Functions. (line 14) * gsl_complex_tanh: Complex Hyperbolic Functions. (line 14) * gsl_deriv_backward: Numerical Differentiation functions. (line 40) * gsl_deriv_central: Numerical Differentiation functions. (line 6) * gsl_deriv_forward: Numerical Differentiation functions. (line 22) * gsl_dht_alloc: Discrete Hankel Transform Functions. (line 6) * gsl_dht_apply: Discrete Hankel Transform Functions. (line 22) * gsl_dht_free: Discrete Hankel Transform Functions. (line 19) * gsl_dht_init: Discrete Hankel Transform Functions. (line 10) * gsl_dht_k_sample: Discrete Hankel Transform Functions. (line 36) * gsl_dht_new: Discrete Hankel Transform Functions. (line 14) * gsl_dht_x_sample: Discrete Hankel Transform Functions. (line 31) * gsl_eigen_gen: Real Generalized Nonsymmetric Eigensystems. (line 72) * gsl_eigen_genherm: Complex Generalized Hermitian-Definite Eigensystems. (line 27) * gsl_eigen_genhermv: Complex Generalized Hermitian-Definite Eigensystems. (line 45) * gsl_eigen_genhermv_alloc: Complex Generalized Hermitian-Definite Eigensystems. (line 35) * gsl_eigen_genhermv_free: Complex Generalized Hermitian-Definite Eigensystems. (line 41) * gsl_eigen_genhermv_sort: Sorting Eigenvalues and Eigenvectors. (line 45) * gsl_eigen_genherm_alloc: Complex Generalized Hermitian-Definite Eigensystems. (line 17) * gsl_eigen_genherm_free: Complex Generalized Hermitian-Definite Eigensystems. (line 23) * gsl_eigen_gensymm: Real Generalized Symmetric-Definite Eigensystems. (line 32) * gsl_eigen_gensymmv: Real Generalized Symmetric-Definite Eigensystems. (line 49) * gsl_eigen_gensymmv_alloc: Real Generalized Symmetric-Definite Eigensystems. (line 39) * gsl_eigen_gensymmv_free: Real Generalized Symmetric-Definite Eigensystems. (line 45) * gsl_eigen_gensymmv_sort: Sorting Eigenvalues and Eigenvectors. (line 38) * gsl_eigen_gensymm_alloc: Real Generalized Symmetric-Definite Eigensystems. (line 22) * gsl_eigen_gensymm_free: Real Generalized Symmetric-Definite Eigensystems. (line 28) * gsl_eigen_genv: Real Generalized Nonsymmetric Eigensystems. (line 105) * gsl_eigen_genv_alloc: Real Generalized Nonsymmetric Eigensystems. (line 96) * gsl_eigen_genv_free: Real Generalized Nonsymmetric Eigensystems. (line 102) * gsl_eigen_genv_QZ: Real Generalized Nonsymmetric Eigensystems. (line 120) * gsl_eigen_genv_sort: Sorting Eigenvalues and Eigenvectors. (line 52) * gsl_eigen_gen_alloc: Real Generalized Nonsymmetric Eigensystems. (line 41) * gsl_eigen_gen_free: Real Generalized Nonsymmetric Eigensystems. (line 47) * gsl_eigen_gen_params: Real Generalized Nonsymmetric Eigensystems. (line 50) * gsl_eigen_gen_QZ: Real Generalized Nonsymmetric Eigensystems. (line 89) * gsl_eigen_herm: Complex Hermitian Matrices. (line 18) * gsl_eigen_hermv: Complex Hermitian Matrices. (line 37) * gsl_eigen_hermv_alloc: Complex Hermitian Matrices. (line 28) * gsl_eigen_hermv_free: Complex Hermitian Matrices. (line 34) * gsl_eigen_hermv_sort: Sorting Eigenvalues and Eigenvectors. (line 22) * gsl_eigen_herm_alloc: Complex Hermitian Matrices. (line 9) * gsl_eigen_herm_free: Complex Hermitian Matrices. (line 15) * gsl_eigen_nonsymm: Real Nonsymmetric Matrices. (line 60) * gsl_eigen_nonsymmv: Real Nonsymmetric Matrices. (line 97) * gsl_eigen_nonsymmv_alloc: Real Nonsymmetric Matrices. (line 78) * gsl_eigen_nonsymmv_free: Real Nonsymmetric Matrices. (line 84) * gsl_eigen_nonsymmv_params: Real Nonsymmetric Matrices. (line 88) * gsl_eigen_nonsymmv_sort: Sorting Eigenvalues and Eigenvectors. (line 29) * gsl_eigen_nonsymmv_Z: Real Nonsymmetric Matrices. (line 111) * gsl_eigen_nonsymm_alloc: Real Nonsymmetric Matrices. (line 17) * gsl_eigen_nonsymm_free: Real Nonsymmetric Matrices. (line 23) * gsl_eigen_nonsymm_params: Real Nonsymmetric Matrices. (line 27) * gsl_eigen_nonsymm_Z: Real Nonsymmetric Matrices. (line 72) * gsl_eigen_symm: Real Symmetric Matrices. (line 21) * gsl_eigen_symmv: Real Symmetric Matrices. (line 39) * gsl_eigen_symmv_alloc: Real Symmetric Matrices. (line 30) * gsl_eigen_symmv_free: Real Symmetric Matrices. (line 36) * gsl_eigen_symmv_sort: Sorting Eigenvalues and Eigenvectors. (line 6) * gsl_eigen_symm_alloc: Real Symmetric Matrices. (line 12) * gsl_eigen_symm_free: Real Symmetric Matrices. (line 18) * GSL_ERROR: Using GSL error reporting in your own functions. (line 15) * GSL_ERROR_VAL: Using GSL error reporting in your own functions. (line 36) * gsl_expm1: Elementary Functions. (line 17) * gsl_fcmp: Approximate Comparison of Floating Point Numbers. (line 12) * gsl_fft_complex_backward: Mixed-radix FFT routines for complex data. (line 124) * gsl_fft_complex_forward: Mixed-radix FFT routines for complex data. (line 117) * gsl_fft_complex_inverse: Mixed-radix FFT routines for complex data. (line 127) * gsl_fft_complex_radix2_backward: Radix-2 FFT routines for complex data. (line 23) * gsl_fft_complex_radix2_dif_backward: Radix-2 FFT routines for complex data. (line 47) * gsl_fft_complex_radix2_dif_forward: Radix-2 FFT routines for complex data. (line 40) * gsl_fft_complex_radix2_dif_inverse: Radix-2 FFT routines for complex data. (line 50) * gsl_fft_complex_radix2_dif_transform: Radix-2 FFT routines for complex data. (line 43) * gsl_fft_complex_radix2_forward: Radix-2 FFT routines for complex data. (line 16) * gsl_fft_complex_radix2_inverse: Radix-2 FFT routines for complex data. (line 26) * gsl_fft_complex_radix2_transform: Radix-2 FFT routines for complex data. (line 19) * gsl_fft_complex_transform: Mixed-radix FFT routines for complex data. (line 120) * gsl_fft_complex_wavetable_alloc: Mixed-radix FFT routines for complex data. (line 44) * gsl_fft_complex_wavetable_free: Mixed-radix FFT routines for complex data. (line 63) * gsl_fft_complex_workspace_alloc: Mixed-radix FFT routines for complex data. (line 104) * gsl_fft_complex_workspace_free: Mixed-radix FFT routines for complex data. (line 109) * gsl_fft_halfcomplex_radix2_backward: Radix-2 FFT routines for real data. (line 58) * gsl_fft_halfcomplex_radix2_inverse: Radix-2 FFT routines for real data. (line 56) * gsl_fft_halfcomplex_radix2_unpack: Radix-2 FFT routines for real data. (line 66) * gsl_fft_halfcomplex_transform: Mixed-radix FFT routines for real data. (line 122) * gsl_fft_halfcomplex_unpack: Mixed-radix FFT routines for real data. (line 153) * gsl_fft_halfcomplex_wavetable_alloc: Mixed-radix FFT routines for real data. (line 74) * gsl_fft_halfcomplex_wavetable_free: Mixed-radix FFT routines for real data. (line 95) * gsl_fft_real_radix2_transform: Radix-2 FFT routines for real data. (line 13) * gsl_fft_real_transform: Mixed-radix FFT routines for real data. (line 119) * gsl_fft_real_unpack: Mixed-radix FFT routines for real data. (line 136) * gsl_fft_real_wavetable_alloc: Mixed-radix FFT routines for real data. (line 72) * gsl_fft_real_wavetable_free: Mixed-radix FFT routines for real data. (line 93) * gsl_fft_real_workspace_alloc: Mixed-radix FFT routines for real data. (line 104) * gsl_fft_real_workspace_free: Mixed-radix FFT routines for real data. (line 110) * gsl_finite: Infinities and Not-a-number. (line 25) * gsl_fit_linear: Linear regression with a constant term. (line 9) * gsl_fit_linear_est: Linear regression with a constant term. (line 42) * gsl_fit_mul: Linear regression without a constant term. (line 10) * gsl_fit_mul_est: Linear regression without a constant term. (line 36) * gsl_fit_wlinear: Linear regression with a constant term. (line 25) * gsl_fit_wmul: Linear regression without a constant term. (line 21) * gsl_frexp: Elementary Functions. (line 48) * gsl_heapsort: Sorting objects. (line 16) * gsl_heapsort_index: Sorting objects. (line 58) * gsl_histogram2d_accumulate: Updating and accessing 2D histogram elements. (line 25) * gsl_histogram2d_add: 2D Histogram Operations. (line 11) * gsl_histogram2d_alloc: 2D Histogram allocation. (line 14) * gsl_histogram2d_clone: Copying 2D Histograms. (line 12) * gsl_histogram2d_cov: 2D Histogram Statistics. (line 52) * gsl_histogram2d_div: 2D Histogram Operations. (line 31) * gsl_histogram2d_equal_bins_p: 2D Histogram Operations. (line 6) * gsl_histogram2d_find: Searching 2D histogram ranges. (line 9) * gsl_histogram2d_fprintf: Reading and writing 2D histograms. (line 27) * gsl_histogram2d_fread: Reading and writing 2D histograms. (line 17) * gsl_histogram2d_free: 2D Histogram allocation. (line 37) * gsl_histogram2d_fscanf: Reading and writing 2D histograms. (line 64) * gsl_histogram2d_fwrite: Reading and writing 2D histograms. (line 9) * gsl_histogram2d_get: Updating and accessing 2D histogram elements. (line 31) * gsl_histogram2d_get_xrange: Updating and accessing 2D histogram elements. (line 38) * gsl_histogram2d_get_yrange: Updating and accessing 2D histogram elements. (line 40) * gsl_histogram2d_increment: Updating and accessing 2D histogram elements. (line 12) * gsl_histogram2d_max_bin: 2D Histogram Statistics. (line 10) * gsl_histogram2d_max_val: 2D Histogram Statistics. (line 6) * gsl_histogram2d_memcpy: Copying 2D Histograms. (line 6) * gsl_histogram2d_min_bin: 2D Histogram Statistics. (line 21) * gsl_histogram2d_min_val: 2D Histogram Statistics. (line 17) * gsl_histogram2d_mul: 2D Histogram Operations. (line 24) * gsl_histogram2d_nx: Updating and accessing 2D histogram elements. (line 55) * gsl_histogram2d_ny: Updating and accessing 2D histogram elements. (line 58) * gsl_histogram2d_pdf_alloc: Resampling from 2D histograms. (line 38) * gsl_histogram2d_pdf_free: Resampling from 2D histograms. (line 54) * gsl_histogram2d_pdf_init: Resampling from 2D histograms. (line 46) * gsl_histogram2d_pdf_sample: Resampling from 2D histograms. (line 58) * gsl_histogram2d_reset: Updating and accessing 2D histogram elements. (line 64) * gsl_histogram2d_scale: 2D Histogram Operations. (line 38) * gsl_histogram2d_set_ranges: 2D Histogram allocation. (line 24) * gsl_histogram2d_set_ranges_uniform: 2D Histogram allocation. (line 31) * gsl_histogram2d_shift: 2D Histogram Operations. (line 43) * gsl_histogram2d_sub: 2D Histogram Operations. (line 17) * gsl_histogram2d_sum: 2D Histogram Statistics. (line 58) * gsl_histogram2d_xmax: Updating and accessing 2D histogram elements. (line 53) * gsl_histogram2d_xmean: 2D Histogram Statistics. (line 28) * gsl_histogram2d_xmin: Updating and accessing 2D histogram elements. (line 54) * gsl_histogram2d_xsigma: 2D Histogram Statistics. (line 40) * gsl_histogram2d_ymax: Updating and accessing 2D histogram elements. (line 56) * gsl_histogram2d_ymean: 2D Histogram Statistics. (line 34) * gsl_histogram2d_ymin: Updating and accessing 2D histogram elements. (line 57) * gsl_histogram2d_ysigma: 2D Histogram Statistics. (line 46) * gsl_histogram_accumulate: Updating and accessing histogram elements. (line 25) * gsl_histogram_add: Histogram Operations. (line 11) * gsl_histogram_alloc: Histogram allocation. (line 14) * gsl_histogram_bins: Updating and accessing histogram elements. (line 53) * gsl_histogram_clone: Copying Histograms. (line 12) * gsl_histogram_div: Histogram Operations. (line 30) * gsl_histogram_equal_bins_p: Histogram Operations. (line 6) * gsl_histogram_find: Searching histogram ranges. (line 9) * gsl_histogram_fprintf: Reading and writing histograms. (line 26) * gsl_histogram_fread: Reading and writing histograms. (line 17) * gsl_histogram_free: Histogram allocation. (line 60) * gsl_histogram_fscanf: Reading and writing histograms. (line 51) * gsl_histogram_fwrite: Reading and writing histograms. (line 9) * gsl_histogram_get: Updating and accessing histogram elements. (line 31) * gsl_histogram_get_range: Updating and accessing histogram elements. (line 38) * gsl_histogram_increment: Updating and accessing histogram elements. (line 11) * gsl_histogram_max: Updating and accessing histogram elements. (line 51) * gsl_histogram_max_bin: Histogram Statistics. (line 10) * gsl_histogram_max_val: Histogram Statistics. (line 6) * gsl_histogram_mean: Histogram Statistics. (line 24) * gsl_histogram_memcpy: Copying Histograms. (line 6) * gsl_histogram_min: Updating and accessing histogram elements. (line 52) * gsl_histogram_min_bin: Histogram Statistics. (line 19) * gsl_histogram_min_val: Histogram Statistics. (line 15) * gsl_histogram_mul: Histogram Operations. (line 23) * gsl_histogram_pdf_alloc: The histogram probability distribution struct. (line 33) * gsl_histogram_pdf_free: The histogram probability distribution struct. (line 47) * gsl_histogram_pdf_init: The histogram probability distribution struct. (line 40) * gsl_histogram_pdf_sample: The histogram probability distribution struct. (line 51) * gsl_histogram_reset: Updating and accessing histogram elements. (line 59) * gsl_histogram_scale: Histogram Operations. (line 37) * gsl_histogram_set_ranges: Histogram allocation. (line 23) * gsl_histogram_set_ranges_uniform: Histogram allocation. (line 48) * gsl_histogram_shift: Histogram Operations. (line 41) * gsl_histogram_sigma: Histogram Statistics. (line 30) * gsl_histogram_sub: Histogram Operations. (line 17) * gsl_histogram_sum: Histogram Statistics. (line 37) * gsl_hypot: Elementary Functions. (line 22) * gsl_hypot3: Elementary Functions. (line 27) * gsl_ieee_env_setup: Setting up your IEEE environment. (line 23) * gsl_ieee_fprintf_double: Representation of floating point numbers. (line 55) * gsl_ieee_fprintf_float: Representation of floating point numbers. (line 53) * gsl_ieee_printf_double: Representation of floating point numbers. (line 82) * gsl_ieee_printf_float: Representation of floating point numbers. (line 81) * GSL_IMAG: Representation of complex numbers. (line 35) * gsl_integration_cquad: CQUAD doubly-adaptive integration. (line 33) * gsl_integration_cquad_workspace_alloc: CQUAD doubly-adaptive integration. (line 20) * gsl_integration_cquad_workspace_free: CQUAD doubly-adaptive integration. (line 29) * gsl_integration_glfixed: Fixed order Gauss-Legendre integration. (line 22) * gsl_integration_glfixed_point: Fixed order Gauss-Legendre integration. (line 27) * gsl_integration_glfixed_table_alloc: Fixed order Gauss-Legendre integration. (line 14) * gsl_integration_glfixed_table_free: Fixed order Gauss-Legendre integration. (line 35) * gsl_integration_qag: QAG adaptive integration. (line 27) * gsl_integration_qagi: QAGI adaptive integration on infinite intervals. (line 6) * gsl_integration_qagil: QAGI adaptive integration on infinite intervals. (line 37) * gsl_integration_qagiu: QAGI adaptive integration on infinite intervals. (line 22) * gsl_integration_qagp: QAGP adaptive integration with known singular points. (line 6) * gsl_integration_qags: QAGS adaptive integration with singularities. (line 15) * gsl_integration_qawc: QAWC adaptive integration for Cauchy principal values. (line 6) * gsl_integration_qawf: QAWF adaptive integration for Fourier integrals. (line 6) * gsl_integration_qawo: QAWO adaptive integration for oscillatory functions. (line 53) * gsl_integration_qawo_table_alloc: QAWO adaptive integration for oscillatory functions. (line 11) * gsl_integration_qawo_table_free: QAWO adaptive integration for oscillatory functions. (line 49) * gsl_integration_qawo_table_set: QAWO adaptive integration for oscillatory functions. (line 38) * gsl_integration_qawo_table_set_length: QAWO adaptive integration for oscillatory functions. (line 44) * gsl_integration_qaws: QAWS adaptive integration for singular functions. (line 48) * gsl_integration_qaws_table_alloc: QAWS adaptive integration for singular functions. (line 11) * gsl_integration_qaws_table_free: QAWS adaptive integration for singular functions. (line 43) * gsl_integration_qaws_table_set: QAWS adaptive integration for singular functions. (line 37) * gsl_integration_qng: QNG non-adaptive Gauss-Kronrod integration. (line 10) * gsl_integration_workspace_alloc: QAG adaptive integration. (line 15) * gsl_integration_workspace_free: QAG adaptive integration. (line 23) * gsl_interp2d_alloc: 2D Interpolation Functions. (line 9) * gsl_interp2d_bicubic: 2D Interpolation Types. (line 12) * gsl_interp2d_bilinear: 2D Interpolation Types. (line 8) * gsl_interp2d_eval: 2D Evaluation of Interpolating Functions. (line 6) * gsl_interp2d_eval_deriv_x: 2D Evaluation of Interpolating Functions. (line 34) * gsl_interp2d_eval_deriv_xx: 2D Evaluation of Interpolating Functions. (line 62) * gsl_interp2d_eval_deriv_xx_e: 2D Evaluation of Interpolating Functions. (line 66) * gsl_interp2d_eval_deriv_xy: 2D Evaluation of Interpolating Functions. (line 90) * gsl_interp2d_eval_deriv_xy_e: 2D Evaluation of Interpolating Functions. (line 94) * gsl_interp2d_eval_deriv_x_e: 2D Evaluation of Interpolating Functions. (line 38) * gsl_interp2d_eval_deriv_y: 2D Evaluation of Interpolating Functions. (line 48) * gsl_interp2d_eval_deriv_yy: 2D Evaluation of Interpolating Functions. (line 76) * gsl_interp2d_eval_deriv_yy_e: 2D Evaluation of Interpolating Functions. (line 80) * gsl_interp2d_eval_deriv_y_e: 2D Evaluation of Interpolating Functions. (line 52) * gsl_interp2d_eval_e: 2D Evaluation of Interpolating Functions. (line 10) * gsl_interp2d_eval_extrap: 2D Evaluation of Interpolating Functions. (line 20) * gsl_interp2d_eval_extrap_e: 2D Evaluation of Interpolating Functions. (line 24) * gsl_interp2d_free: 2D Interpolation Functions. (line 28) * gsl_interp2d_get: 2D Interpolation Grids. (line 21) * gsl_interp2d_idx: 2D Interpolation Grids. (line 26) * gsl_interp2d_init: 2D Interpolation Functions. (line 15) * gsl_interp2d_min_size: 2D Interpolation Types. (line 27) * gsl_interp2d_name: 2D Interpolation Types. (line 15) * gsl_interp2d_set: 2D Interpolation Grids. (line 16) * gsl_interp2d_type_min_size: 2D Interpolation Types. (line 29) * gsl_interp_accel_alloc: 1D Index Look-up and Acceleration. (line 19) * gsl_interp_accel_find: 1D Index Look-up and Acceleration. (line 25) * gsl_interp_accel_free: 1D Index Look-up and Acceleration. (line 39) * gsl_interp_accel_reset: 1D Index Look-up and Acceleration. (line 34) * gsl_interp_akima: 1D Interpolation Types. (line 34) * gsl_interp_akima_periodic: 1D Interpolation Types. (line 38) * gsl_interp_alloc: 1D Interpolation Functions. (line 9) * gsl_interp_bsearch: 1D Index Look-up and Acceleration. (line 12) * gsl_interp_cspline: 1D Interpolation Types. (line 19) * gsl_interp_cspline_periodic: 1D Interpolation Types. (line 25) * gsl_interp_eval: 1D Evaluation of Interpolating Functions. (line 6) * gsl_interp_eval_deriv: 1D Evaluation of Interpolating Functions. (line 17) * gsl_interp_eval_deriv2: 1D Evaluation of Interpolating Functions. (line 27) * gsl_interp_eval_deriv2_e: 1D Evaluation of Interpolating Functions. (line 30) * gsl_interp_eval_deriv_e: 1D Evaluation of Interpolating Functions. (line 20) * gsl_interp_eval_e: 1D Evaluation of Interpolating Functions. (line 9) * gsl_interp_eval_integ: 1D Evaluation of Interpolating Functions. (line 37) * gsl_interp_eval_integ_e: 1D Evaluation of Interpolating Functions. (line 40) * gsl_interp_free: 1D Interpolation Functions. (line 24) * gsl_interp_init: 1D Interpolation Functions. (line 14) * gsl_interp_linear: 1D Interpolation Types. (line 8) * gsl_interp_min_size: 1D Interpolation Types. (line 64) * gsl_interp_name: 1D Interpolation Types. (line 53) * gsl_interp_polynomial: 1D Interpolation Types. (line 12) * gsl_interp_steffen: 1D Interpolation Types. (line 42) * gsl_interp_type_min_size: 1D Interpolation Types. (line 66) * gsl_isinf: Infinities and Not-a-number. (line 21) * gsl_isnan: Infinities and Not-a-number. (line 18) * GSL_IS_EVEN: Testing for Odd and Even Numbers. (line 10) * GSL_IS_ODD: Testing for Odd and Even Numbers. (line 6) * gsl_ldexp: Elementary Functions. (line 44) * gsl_linalg_balance_matrix: Balancing. (line 17) * gsl_linalg_bidiag_decomp: Bidiagonalization. (line 15) * gsl_linalg_bidiag_unpack: Bidiagonalization. (line 26) * gsl_linalg_bidiag_unpack2: Bidiagonalization. (line 35) * gsl_linalg_bidiag_unpack_B: Bidiagonalization. (line 42) * gsl_linalg_cholesky_decomp: Cholesky Decomposition. (line 45) * gsl_linalg_cholesky_decomp1: Cholesky Decomposition. (line 29) * gsl_linalg_cholesky_decomp2: Cholesky Decomposition. (line 78) * gsl_linalg_cholesky_invert: Cholesky Decomposition. (line 69) * gsl_linalg_cholesky_rcond: Cholesky Decomposition. (line 126) * gsl_linalg_cholesky_scale: Cholesky Decomposition. (line 111) * gsl_linalg_cholesky_scale_apply: Cholesky Decomposition. (line 121) * gsl_linalg_cholesky_solve: Cholesky Decomposition. (line 49) * gsl_linalg_cholesky_solve2: Cholesky Decomposition. (line 95) * gsl_linalg_cholesky_svx: Cholesky Decomposition. (line 59) * gsl_linalg_cholesky_svx2: Cholesky Decomposition. (line 103) * gsl_linalg_COD_decomp: Complete Orthogonal Decomposition. (line 25) * gsl_linalg_COD_decomp_e: Complete Orthogonal Decomposition. (line 28) * gsl_linalg_COD_lssolve: Complete Orthogonal Decomposition. (line 43) * gsl_linalg_COD_matZ: Complete Orthogonal Decomposition. (line 62) * gsl_linalg_COD_unpack: Complete Orthogonal Decomposition. (line 55) * gsl_linalg_complex_cholesky_decomp: Cholesky Decomposition. (line 30) * gsl_linalg_complex_cholesky_invert: Cholesky Decomposition. (line 70) * gsl_linalg_complex_cholesky_solve: Cholesky Decomposition. (line 51) * gsl_linalg_complex_cholesky_svx: Cholesky Decomposition. (line 61) * gsl_linalg_complex_householder_hm: Householder Transformations. (line 31) * gsl_linalg_complex_householder_hv: Householder Transformations. (line 47) * gsl_linalg_complex_householder_mh: Householder Transformations. (line 39) * gsl_linalg_complex_householder_transform: Householder Transformations. (line 18) * gsl_linalg_complex_LU_decomp: LU Decomposition. (line 20) * gsl_linalg_complex_LU_det: LU Decomposition. (line 83) * gsl_linalg_complex_LU_invert: LU Decomposition. (line 71) * gsl_linalg_complex_LU_lndet: LU Decomposition. (line 91) * gsl_linalg_complex_LU_refine: LU Decomposition. (line 61) * gsl_linalg_complex_LU_sgndet: LU Decomposition. (line 99) * gsl_linalg_complex_LU_solve: LU Decomposition. (line 42) * gsl_linalg_complex_LU_svx: LU Decomposition. (line 51) * gsl_linalg_givens: Givens Rotations. (line 16) * gsl_linalg_givens_gv: Givens Rotations. (line 22) * gsl_linalg_hermtd_decomp: Tridiagonal Decomposition of Hermitian Matrices. (line 14) * gsl_linalg_hermtd_unpack: Tridiagonal Decomposition of Hermitian Matrices. (line 26) * gsl_linalg_hermtd_unpack_T: Tridiagonal Decomposition of Hermitian Matrices. (line 34) * gsl_linalg_hessenberg_decomp: Hessenberg Decomposition of Real Matrices. (line 16) * gsl_linalg_hessenberg_set_zero: Hessenberg Decomposition of Real Matrices. (line 42) * gsl_linalg_hessenberg_unpack: Hessenberg Decomposition of Real Matrices. (line 27) * gsl_linalg_hessenberg_unpack_accum: Hessenberg Decomposition of Real Matrices. (line 33) * gsl_linalg_hesstri_decomp: Hessenberg-Triangular Decomposition of Real Matrices. (line 17) * gsl_linalg_HH_solve: Householder solver for linear systems. (line 6) * gsl_linalg_HH_svx: Householder solver for linear systems. (line 13) * gsl_linalg_householder_hm: Householder Transformations. (line 29) * gsl_linalg_householder_hv: Householder Transformations. (line 45) * gsl_linalg_householder_mh: Householder Transformations. (line 37) * gsl_linalg_householder_transform: Householder Transformations. (line 17) * gsl_linalg_LU_decomp: LU Decomposition. (line 18) * gsl_linalg_LU_det: LU Decomposition. (line 82) * gsl_linalg_LU_invert: LU Decomposition. (line 69) * gsl_linalg_LU_lndet: LU Decomposition. (line 90) * gsl_linalg_LU_refine: LU Decomposition. (line 58) * gsl_linalg_LU_sgndet: LU Decomposition. (line 98) * gsl_linalg_LU_solve: LU Decomposition. (line 40) * gsl_linalg_LU_svx: LU Decomposition. (line 49) * gsl_linalg_mcholesky_decomp: Modified Cholesky Decomposition. (line 25) * gsl_linalg_mcholesky_rcond: Modified Cholesky Decomposition. (line 55) * gsl_linalg_mcholesky_solve: Modified Cholesky Decomposition. (line 39) * gsl_linalg_mcholesky_svx: Modified Cholesky Decomposition. (line 47) * gsl_linalg_pcholesky_decomp: Pivoted Cholesky Decomposition. (line 20) * gsl_linalg_pcholesky_decomp2: Pivoted Cholesky Decomposition. (line 48) * gsl_linalg_pcholesky_invert: Pivoted Cholesky Decomposition. (line 83) * gsl_linalg_pcholesky_rcond: Pivoted Cholesky Decomposition. (line 89) * gsl_linalg_pcholesky_solve: Pivoted Cholesky Decomposition. (line 32) * gsl_linalg_pcholesky_solve2: Pivoted Cholesky Decomposition. (line 65) * gsl_linalg_pcholesky_svx: Pivoted Cholesky Decomposition. (line 40) * gsl_linalg_pcholesky_svx2: Pivoted Cholesky Decomposition. (line 73) * gsl_linalg_QRPT_decomp: QR Decomposition with Column Pivoting. (line 31) * gsl_linalg_QRPT_decomp2: QR Decomposition with Column Pivoting. (line 52) * gsl_linalg_QRPT_lssolve: QR Decomposition with Column Pivoting. (line 73) * gsl_linalg_QRPT_lssolve2: QR Decomposition with Column Pivoting. (line 86) * gsl_linalg_QRPT_QRsolve: QR Decomposition with Column Pivoting. (line 100) * gsl_linalg_QRPT_rank: QR Decomposition with Column Pivoting. (line 127) * gsl_linalg_QRPT_rcond: QR Decomposition with Column Pivoting. (line 135) * gsl_linalg_QRPT_Rsolve: QR Decomposition with Column Pivoting. (line 116) * gsl_linalg_QRPT_Rsvx: QR Decomposition with Column Pivoting. (line 121) * gsl_linalg_QRPT_solve: QR Decomposition with Column Pivoting. (line 59) * gsl_linalg_QRPT_svx: QR Decomposition with Column Pivoting. (line 66) * gsl_linalg_QRPT_update: QR Decomposition with Column Pivoting. (line 107) * gsl_linalg_QR_decomp: QR Decomposition. (line 19) * gsl_linalg_QR_lssolve: QR Decomposition. (line 50) * gsl_linalg_QR_QRsolve: QR Decomposition. (line 102) * gsl_linalg_QR_QTmat: QR Decomposition. (line 76) * gsl_linalg_QR_QTvec: QR Decomposition. (line 61) * gsl_linalg_QR_Qvec: QR Decomposition. (line 69) * gsl_linalg_QR_Rsolve: QR Decomposition. (line 84) * gsl_linalg_QR_Rsvx: QR Decomposition. (line 90) * gsl_linalg_QR_solve: QR Decomposition. (line 35) * gsl_linalg_QR_svx: QR Decomposition. (line 42) * gsl_linalg_QR_unpack: QR Decomposition. (line 97) * gsl_linalg_QR_update: QR Decomposition. (line 108) * gsl_linalg_R_solve: QR Decomposition. (line 115) * gsl_linalg_R_svx: QR Decomposition. (line 120) * gsl_linalg_solve_cyc_tridiag: Tridiagonal Systems. (line 39) * gsl_linalg_solve_symm_cyc_tridiag: Tridiagonal Systems. (line 53) * gsl_linalg_solve_symm_tridiag: Tridiagonal Systems. (line 26) * gsl_linalg_solve_tridiag: Tridiagonal Systems. (line 13) * gsl_linalg_SV_decomp: Singular Value Decomposition. (line 37) * gsl_linalg_SV_decomp_jacobi: Singular Value Decomposition. (line 56) * gsl_linalg_SV_decomp_mod: Singular Value Decomposition. (line 50) * gsl_linalg_SV_leverage: Singular Value Decomposition. (line 79) * gsl_linalg_SV_solve: Singular Value Decomposition. (line 63) * gsl_linalg_symmtd_decomp: Tridiagonal Decomposition of Real Symmetric Matrices. (line 13) * gsl_linalg_symmtd_unpack: Tridiagonal Decomposition of Real Symmetric Matrices. (line 24) * gsl_linalg_symmtd_unpack_T: Tridiagonal Decomposition of Real Symmetric Matrices. (line 32) * gsl_linalg_tri_lower_invert: Triangular Systems. (line 7) * gsl_linalg_tri_lower_rcond: Triangular Systems. (line 20) * gsl_linalg_tri_lower_unit_invert: Triangular Systems. (line 9) * gsl_linalg_tri_upper_invert: Triangular Systems. (line 6) * gsl_linalg_tri_upper_rcond: Triangular Systems. (line 18) * gsl_linalg_tri_upper_unit_invert: Triangular Systems. (line 8) * gsl_log1p: Elementary Functions. (line 12) * gsl_matrix_add: Matrix operations. (line 8) * gsl_matrix_add_constant: Matrix operations. (line 38) * gsl_matrix_alloc: Matrix allocation. (line 14) * gsl_matrix_calloc: Matrix allocation. (line 21) * gsl_matrix_column: Creating row and column views. (line 24) * gsl_matrix_const_column: Creating row and column views. (line 26) * gsl_matrix_const_diagonal: Creating row and column views. (line 63) * gsl_matrix_const_ptr: Accessing matrix elements. (line 36) * gsl_matrix_const_row: Creating row and column views. (line 14) * gsl_matrix_const_subcolumn: Creating row and column views. (line 51) * gsl_matrix_const_subdiagonal: Creating row and column views. (line 76) * gsl_matrix_const_submatrix: Matrix views. (line 20) * gsl_matrix_const_subrow: Creating row and column views. (line 38) * gsl_matrix_const_superdiagonal: Creating row and column views. (line 88) * gsl_matrix_const_view_array: Matrix views. (line 51) * gsl_matrix_const_view_array_with_tda: Matrix views. (line 75) * gsl_matrix_const_view_vector: Matrix views. (line 101) * gsl_matrix_const_view_vector_with_tda: Matrix views. (line 125) * gsl_matrix_diagonal: Creating row and column views. (line 62) * gsl_matrix_div_elements: Matrix operations. (line 27) * gsl_matrix_equal: Matrix properties. (line 20) * gsl_matrix_fprintf: Reading and writing matrices. (line 26) * gsl_matrix_fread: Reading and writing matrices. (line 17) * gsl_matrix_free: Matrix allocation. (line 25) * gsl_matrix_fscanf: Reading and writing matrices. (line 34) * gsl_matrix_fwrite: Reading and writing matrices. (line 9) * gsl_matrix_get: Accessing matrix elements. (line 20) * gsl_matrix_get_col: Copying rows and columns. (line 19) * gsl_matrix_get_row: Copying rows and columns. (line 13) * gsl_matrix_isneg: Matrix properties. (line 12) * gsl_matrix_isnonneg: Matrix properties. (line 13) * gsl_matrix_isnull: Matrix properties. (line 10) * gsl_matrix_ispos: Matrix properties. (line 11) * gsl_matrix_max: Finding maximum and minimum elements of matrices. (line 8) * gsl_matrix_max_index: Finding maximum and minimum elements of matrices. (line 19) * gsl_matrix_memcpy: Copying matrices. (line 6) * gsl_matrix_min: Finding maximum and minimum elements of matrices. (line 11) * gsl_matrix_minmax: Finding maximum and minimum elements of matrices. (line 14) * gsl_matrix_minmax_index: Finding maximum and minimum elements of matrices. (line 33) * gsl_matrix_min_index: Finding maximum and minimum elements of matrices. (line 26) * gsl_matrix_mul_elements: Matrix operations. (line 20) * gsl_matrix_ptr: Accessing matrix elements. (line 34) * gsl_matrix_row: Creating row and column views. (line 13) * gsl_matrix_scale: Matrix operations. (line 34) * gsl_matrix_set: Accessing matrix elements. (line 27) * gsl_matrix_set_all: Initializing matrix elements. (line 6) * gsl_matrix_set_col: Copying rows and columns. (line 31) * gsl_matrix_set_identity: Initializing matrix elements. (line 12) * gsl_matrix_set_row: Copying rows and columns. (line 25) * gsl_matrix_set_zero: Initializing matrix elements. (line 9) * gsl_matrix_sub: Matrix operations. (line 14) * gsl_matrix_subcolumn: Creating row and column views. (line 49) * gsl_matrix_subdiagonal: Creating row and column views. (line 74) * gsl_matrix_submatrix: Matrix views. (line 18) * gsl_matrix_subrow: Creating row and column views. (line 36) * gsl_matrix_superdiagonal: Creating row and column views. (line 86) * gsl_matrix_swap: Copying matrices. (line 11) * gsl_matrix_swap_columns: Exchanging rows and columns. (line 14) * gsl_matrix_swap_rowcol: Exchanging rows and columns. (line 19) * gsl_matrix_swap_rows: Exchanging rows and columns. (line 9) * gsl_matrix_transpose: Exchanging rows and columns. (line 32) * gsl_matrix_transpose_memcpy: Exchanging rows and columns. (line 25) * gsl_matrix_view_array: Matrix views. (line 49) * gsl_matrix_view_array_with_tda: Matrix views. (line 73) * gsl_matrix_view_vector: Matrix views. (line 99) * gsl_matrix_view_vector_with_tda: Matrix views. (line 123) * GSL_MAX: Maximum and Minimum functions. (line 10) * GSL_MAX_DBL: Maximum and Minimum functions. (line 18) * GSL_MAX_INT: Maximum and Minimum functions. (line 32) * GSL_MAX_LDBL: Maximum and Minimum functions. (line 39) * GSL_MIN: Maximum and Minimum functions. (line 14) * GSL_MIN_DBL: Maximum and Minimum functions. (line 25) * gsl_min_fminimizer_alloc: Initializing the Minimizer. (line 6) * gsl_min_fminimizer_brent: Minimization Algorithms. (line 30) * gsl_min_fminimizer_free: Initializing the Minimizer. (line 39) * gsl_min_fminimizer_f_lower: Minimization Iteration. (line 45) * gsl_min_fminimizer_f_minimum: Minimization Iteration. (line 41) * gsl_min_fminimizer_f_upper: Minimization Iteration. (line 43) * gsl_min_fminimizer_goldensection: Minimization Algorithms. (line 13) * gsl_min_fminimizer_iterate: Minimization Iteration. (line 12) * gsl_min_fminimizer_name: Initializing the Minimizer. (line 42) * gsl_min_fminimizer_quad_golden: Minimization Algorithms. (line 46) * gsl_min_fminimizer_set: Initializing the Minimizer. (line 21) * gsl_min_fminimizer_set_with_values: Initializing the Minimizer. (line 31) * gsl_min_fminimizer_x_lower: Minimization Iteration. (line 36) * gsl_min_fminimizer_x_minimum: Minimization Iteration. (line 29) * gsl_min_fminimizer_x_upper: Minimization Iteration. (line 34) * GSL_MIN_INT: Maximum and Minimum functions. (line 33) * GSL_MIN_LDBL: Maximum and Minimum functions. (line 41) * gsl_min_test_interval: Minimization Stopping Parameters. (line 18) * gsl_monte_miser_alloc: MISER. (line 45) * gsl_monte_miser_free: MISER. (line 68) * gsl_monte_miser_init: MISER. (line 50) * gsl_monte_miser_integrate: MISER. (line 55) * gsl_monte_miser_params_get: MISER. (line 75) * gsl_monte_miser_params_set: MISER. (line 80) * gsl_monte_plain_alloc: PLAIN Monte Carlo. (line 29) * gsl_monte_plain_free: PLAIN Monte Carlo. (line 51) * gsl_monte_plain_init: PLAIN Monte Carlo. (line 33) * gsl_monte_plain_integrate: PLAIN Monte Carlo. (line 38) * gsl_monte_vegas_alloc: VEGAS. (line 50) * gsl_monte_vegas_chisq: VEGAS. (line 113) * gsl_monte_vegas_free: VEGAS. (line 77) * gsl_monte_vegas_init: VEGAS. (line 55) * gsl_monte_vegas_integrate: VEGAS. (line 60) * gsl_monte_vegas_params_get: VEGAS. (line 131) * gsl_monte_vegas_params_set: VEGAS. (line 136) * gsl_monte_vegas_runval: VEGAS. (line 122) * gsl_multifit_linear: Multi-parameter regression. (line 65) * gsl_multifit_linear_alloc: Multi-parameter regression. (line 42) * gsl_multifit_linear_applyW: Regularized regression. (line 205) * gsl_multifit_linear_bsvd: Multi-parameter regression. (line 58) * gsl_multifit_linear_est: Multi-parameter regression. (line 136) * gsl_multifit_linear_free: Multi-parameter regression. (line 49) * gsl_multifit_linear_gcv(const: Regularized regression. (line 301) * gsl_multifit_linear_gcv_calc(const: Regularized regression. (line 295) * gsl_multifit_linear_gcv_curve(const: Regularized regression. (line 277) * gsl_multifit_linear_gcv_init(const: Regularized regression. (line 267) * gsl_multifit_linear_gcv_min(const: Regularized regression. (line 285) * gsl_multifit_linear_genform1: Regularized regression. (line 177) * gsl_multifit_linear_genform2: Regularized regression. (line 187) * gsl_multifit_linear_lcorner: Regularized regression. (line 232) * gsl_multifit_linear_lcorner2: Regularized regression. (line 247) * gsl_multifit_linear_lcurve: Regularized regression. (line 215) * gsl_multifit_linear_Lk: Regularized regression. (line 312) * gsl_multifit_linear_Lsobolev: Regularized regression. (line 318) * gsl_multifit_linear_L_decomp: Regularized regression. (line 126) * gsl_multifit_linear_rank: Multi-parameter regression. (line 149) * gsl_multifit_linear_rcond: Regularized regression. (line 332) * gsl_multifit_linear_residuals: Multi-parameter regression. (line 144) * gsl_multifit_linear_solve: Regularized regression. (line 159) * gsl_multifit_linear_stdform1: Regularized regression. (line 103) * gsl_multifit_linear_stdform2: Regularized regression. (line 137) * gsl_multifit_linear_svd: Multi-parameter regression. (line 53) * gsl_multifit_linear_tsvd: Multi-parameter regression. (line 85) * gsl_multifit_linear_wgenform2: Regularized regression. (line 191) * gsl_multifit_linear_wstdform1: Regularized regression. (line 106) * gsl_multifit_linear_wstdform2: Regularized regression. (line 141) * gsl_multifit_nlinear_alloc: Nonlinear Least-Squares Initialization. (line 6) * gsl_multifit_nlinear_covar: Nonlinear Least-Squares Covariance Matrix. (line 6) * gsl_multifit_nlinear_default_parameters: Nonlinear Least-Squares Initialization. (line 43) * gsl_multifit_nlinear_driver: Nonlinear Least-Squares High Level Driver. (line 9) * gsl_multifit_nlinear_free: Nonlinear Least-Squares Initialization. (line 73) * gsl_multifit_nlinear_init: Nonlinear Least-Squares Initialization. (line 52) * gsl_multifit_nlinear_iterate: Nonlinear Least-Squares Iteration. (line 10) * gsl_multifit_nlinear_jac: Nonlinear Least-Squares Iteration. (line 54) * gsl_multifit_nlinear_name: Nonlinear Least-Squares Initialization. (line 80) * gsl_multifit_nlinear_niter: Nonlinear Least-Squares Iteration. (line 60) * gsl_multifit_nlinear_position: Nonlinear Least-Squares Iteration. (line 39) * gsl_multifit_nlinear_rcond: Nonlinear Least-Squares Iteration. (line 68) * gsl_multifit_nlinear_residual: Nonlinear Least-Squares Iteration. (line 46) * gsl_multifit_nlinear_test: Nonlinear Least-Squares Testing for Convergence. (line 19) * gsl_multifit_nlinear_trs_name: Nonlinear Least-Squares Initialization. (line 92) * gsl_multifit_nlinear_winit: Nonlinear Least-Squares Initialization. (line 55) * gsl_multifit_robust: Robust linear regression. (line 178) * gsl_multifit_robust_alloc: Robust linear regression. (line 70) * gsl_multifit_robust_bisquare: Robust linear regression. (line 82) * gsl_multifit_robust_cauchy: Robust linear regression. (line 91) * gsl_multifit_robust_default: Robust linear regression. (line 77) * gsl_multifit_robust_est: Robust linear regression. (line 198) * gsl_multifit_robust_fair: Robust linear regression. (line 102) * gsl_multifit_robust_free: Robust linear regression. (line 143) * gsl_multifit_robust_huber: Robust linear regression. (line 111) * gsl_multifit_robust_maxiter: Robust linear regression. (line 160) * gsl_multifit_robust_name: Robust linear regression. (line 147) * gsl_multifit_robust_ols: Robust linear regression. (line 124) * gsl_multifit_robust_residuals: Robust linear regression. (line 206) * gsl_multifit_robust_statistics: Robust linear regression. (line 216) * gsl_multifit_robust_tune: Robust linear regression. (line 152) * gsl_multifit_robust_weights: Robust linear regression. (line 166) * gsl_multifit_robust_welsch: Robust linear regression. (line 134) * gsl_multifit_wlinear: Multi-parameter regression. (line 103) * gsl_multifit_wlinear_tsvd: Multi-parameter regression. (line 118) * gsl_multilarge_linear_accumulate: Large Dense Linear Systems Routines. (line 89) * gsl_multilarge_linear_alloc: Large Dense Linear Systems Routines. (line 6) * gsl_multilarge_linear_free: Large Dense Linear Systems Routines. (line 29) * gsl_multilarge_linear_genform1: Large Dense Linear Systems Routines. (line 107) * gsl_multilarge_linear_genform2: Large Dense Linear Systems Routines. (line 117) * gsl_multilarge_linear_lcurve: Large Dense Linear Systems Routines. (line 125) * gsl_multilarge_linear_L_decomp: Large Dense Linear Systems Routines. (line 63) * gsl_multilarge_linear_name: Large Dense Linear Systems Routines. (line 33) * gsl_multilarge_linear_normal: Large Dense Linear Systems Routines. (line 15) * gsl_multilarge_linear_rcond: Large Dense Linear Systems Routines. (line 141) * gsl_multilarge_linear_reset: Large Dense Linear Systems Routines. (line 38) * gsl_multilarge_linear_solve: Large Dense Linear Systems Routines. (line 97) * gsl_multilarge_linear_stdform1: Large Dense Linear Systems Routines. (line 43) * gsl_multilarge_linear_stdform2: Large Dense Linear Systems Routines. (line 71) * gsl_multilarge_linear_tsqr: Large Dense Linear Systems Routines. (line 22) * gsl_multilarge_linear_wstdform1: Large Dense Linear Systems Routines. (line 46) * gsl_multilarge_linear_wstdform2: Large Dense Linear Systems Routines. (line 75) * gsl_multilarge_nlinear_alloc: Nonlinear Least-Squares Initialization. (line 10) * gsl_multilarge_nlinear_covar: Nonlinear Least-Squares Covariance Matrix. (line 8) * gsl_multilarge_nlinear_default_parameters: Nonlinear Least-Squares Initialization. (line 45) * gsl_multilarge_nlinear_driver: Nonlinear Least-Squares High Level Driver. (line 14) * gsl_multilarge_nlinear_free: Nonlinear Least-Squares Initialization. (line 75) * gsl_multilarge_nlinear_init: Nonlinear Least-Squares Initialization. (line 58) * gsl_multilarge_nlinear_iterate: Nonlinear Least-Squares Iteration. (line 12) * gsl_multilarge_nlinear_name: Nonlinear Least-Squares Initialization. (line 82) * gsl_multilarge_nlinear_niter: Nonlinear Least-Squares Iteration. (line 62) * gsl_multilarge_nlinear_position: Nonlinear Least-Squares Iteration. (line 41) * gsl_multilarge_nlinear_rcond: Nonlinear Least-Squares Iteration. (line 70) * gsl_multilarge_nlinear_residual: Nonlinear Least-Squares Iteration. (line 48) * gsl_multilarge_nlinear_test: Nonlinear Least-Squares Testing for Convergence. (line 22) * gsl_multilarge_nlinear_trs_name: Nonlinear Least-Squares Initialization. (line 94) * gsl_multilarge_nlinear_winit: Nonlinear Least-Squares Initialization. (line 61) * gsl_multimin_fdfminimizer_alloc: Initializing the Multidimensional Minimizer. (line 10) * gsl_multimin_fdfminimizer_conjugate_fr: Multimin Algorithms with Derivatives. (line 11) * gsl_multimin_fdfminimizer_conjugate_pr: Multimin Algorithms with Derivatives. (line 28) * gsl_multimin_fdfminimizer_dx: Multimin Iteration. (line 36) * gsl_multimin_fdfminimizer_free: Initializing the Multidimensional Minimizer. (line 46) * gsl_multimin_fdfminimizer_gradient: Multimin Iteration. (line 34) * gsl_multimin_fdfminimizer_iterate: Multimin Iteration. (line 11) * gsl_multimin_fdfminimizer_minimum: Multimin Iteration. (line 30) * gsl_multimin_fdfminimizer_name: Initializing the Multidimensional Minimizer. (line 52) * gsl_multimin_fdfminimizer_restart: Multimin Iteration. (line 45) * gsl_multimin_fdfminimizer_set: Initializing the Multidimensional Minimizer. (line 21) * gsl_multimin_fdfminimizer_steepest_descent: Multimin Algorithms with Derivatives. (line 55) * gsl_multimin_fdfminimizer_vector_bfgs: Multimin Algorithms with Derivatives. (line 36) * gsl_multimin_fdfminimizer_vector_bfgs2: Multimin Algorithms with Derivatives. (line 35) * gsl_multimin_fdfminimizer_x: Multimin Iteration. (line 26) * gsl_multimin_fminimizer_alloc: Initializing the Multidimensional Minimizer. (line 13) * gsl_multimin_fminimizer_free: Initializing the Multidimensional Minimizer. (line 48) * gsl_multimin_fminimizer_iterate: Multimin Iteration. (line 13) * gsl_multimin_fminimizer_minimum: Multimin Iteration. (line 32) * gsl_multimin_fminimizer_name: Initializing the Multidimensional Minimizer. (line 54) * gsl_multimin_fminimizer_nmsimplex: Multimin Algorithms without Derivatives. (line 10) * gsl_multimin_fminimizer_nmsimplex2: Multimin Algorithms without Derivatives. (line 9) * gsl_multimin_fminimizer_nmsimplex2rand: Multimin Algorithms without Derivatives. (line 49) * gsl_multimin_fminimizer_set: Initializing the Multidimensional Minimizer. (line 24) * gsl_multimin_fminimizer_size: Multimin Iteration. (line 38) * gsl_multimin_fminimizer_x: Multimin Iteration. (line 28) * gsl_multimin_test_gradient: Multimin Stopping Criteria. (line 18) * gsl_multimin_test_size: Multimin Stopping Criteria. (line 32) * gsl_multiroot_fdfsolver_alloc: Initializing the Multidimensional Solver. (line 27) * gsl_multiroot_fdfsolver_dx: Iteration of the multidimensional solver. (line 48) * gsl_multiroot_fdfsolver_f: Iteration of the multidimensional solver. (line 41) * gsl_multiroot_fdfsolver_free: Initializing the Multidimensional Solver. (line 54) * gsl_multiroot_fdfsolver_gnewton: Algorithms using Derivatives. (line 90) * gsl_multiroot_fdfsolver_hybridj: Algorithms using Derivatives. (line 64) * gsl_multiroot_fdfsolver_hybridsj: Algorithms using Derivatives. (line 13) * gsl_multiroot_fdfsolver_iterate: Iteration of the multidimensional solver. (line 14) * gsl_multiroot_fdfsolver_name: Initializing the Multidimensional Solver. (line 60) * gsl_multiroot_fdfsolver_newton: Algorithms using Derivatives. (line 70) * gsl_multiroot_fdfsolver_root: Iteration of the multidimensional solver. (line 34) * gsl_multiroot_fdfsolver_set: Initializing the Multidimensional Solver. (line 45) * gsl_multiroot_fsolver_alloc: Initializing the Multidimensional Solver. (line 11) * gsl_multiroot_fsolver_broyden: Algorithms without Derivatives. (line 45) * gsl_multiroot_fsolver_dnewton: Algorithms without Derivatives. (line 25) * gsl_multiroot_fsolver_dx: Iteration of the multidimensional solver. (line 46) * gsl_multiroot_fsolver_f: Iteration of the multidimensional solver. (line 39) * gsl_multiroot_fsolver_free: Initializing the Multidimensional Solver. (line 52) * gsl_multiroot_fsolver_hybrid: Algorithms without Derivatives. (line 21) * gsl_multiroot_fsolver_hybrids: Algorithms without Derivatives. (line 13) * gsl_multiroot_fsolver_iterate: Iteration of the multidimensional solver. (line 12) * gsl_multiroot_fsolver_name: Initializing the Multidimensional Solver. (line 58) * gsl_multiroot_fsolver_root: Iteration of the multidimensional solver. (line 32) * gsl_multiroot_fsolver_set: Initializing the Multidimensional Solver. (line 43) * gsl_multiroot_test_delta: Search Stopping Parameters for the multidimensional solver. (line 20) * gsl_multiroot_test_residual: Search Stopping Parameters for the multidimensional solver. (line 32) * gsl_multiset_alloc: Multiset allocation. (line 6) * gsl_multiset_calloc: Multiset allocation. (line 14) * gsl_multiset_data: Multiset properties. (line 12) * gsl_multiset_fprintf: Reading and writing multisets. (line 26) * gsl_multiset_fread: Reading and writing multisets. (line 17) * gsl_multiset_free: Multiset allocation. (line 28) * gsl_multiset_fscanf: Reading and writing multisets. (line 35) * gsl_multiset_fwrite: Reading and writing multisets. (line 9) * gsl_multiset_get: Accessing multiset elements. (line 8) * gsl_multiset_init_first: Multiset allocation. (line 20) * gsl_multiset_init_last: Multiset allocation. (line 24) * gsl_multiset_k: Multiset properties. (line 9) * gsl_multiset_memcpy: Multiset allocation. (line 31) * gsl_multiset_n: Multiset properties. (line 6) * gsl_multiset_next: Multiset functions. (line 6) * gsl_multiset_prev: Multiset functions. (line 14) * gsl_multiset_valid: Multiset properties. (line 16) * gsl_ntuple_bookdata: Writing ntuples. (line 10) * gsl_ntuple_close: Closing an ntuple file. (line 6) * gsl_ntuple_create: Creating ntuples. (line 6) * gsl_ntuple_open: Opening an existing ntuple file. (line 6) * gsl_ntuple_project: Histogramming ntuple values. (line 35) * gsl_ntuple_read: Reading ntuples. (line 6) * gsl_ntuple_write: Writing ntuples. (line 6) * gsl_odeiv2_control_alloc: Adaptive Step-size Control. (line 73) * gsl_odeiv2_control_errlevel: Adaptive Step-size Control. (line 115) * gsl_odeiv2_control_free: Adaptive Step-size Control. (line 86) * gsl_odeiv2_control_hadjust: Adaptive Step-size Control. (line 90) * gsl_odeiv2_control_init: Adaptive Step-size Control. (line 80) * gsl_odeiv2_control_name: Adaptive Step-size Control. (line 105) * gsl_odeiv2_control_scaled_new: Adaptive Step-size Control. (line 60) * gsl_odeiv2_control_set_driver: Adaptive Step-size Control. (line 122) * gsl_odeiv2_control_standard_new: Adaptive Step-size Control. (line 10) * gsl_odeiv2_control_yp_new: Adaptive Step-size Control. (line 52) * gsl_odeiv2_control_y_new: Adaptive Step-size Control. (line 44) * gsl_odeiv2_driver_alloc_scaled_new: Driver. (line 19) * gsl_odeiv2_driver_alloc_standard_new: Driver. (line 15) * gsl_odeiv2_driver_alloc_yp_new: Driver. (line 12) * gsl_odeiv2_driver_alloc_y_new: Driver. (line 9) * gsl_odeiv2_driver_apply: Driver. (line 46) * gsl_odeiv2_driver_apply_fixed_step: Driver. (line 61) * gsl_odeiv2_driver_free: Driver. (line 78) * gsl_odeiv2_driver_reset: Driver. (line 69) * gsl_odeiv2_driver_reset_hstart: Driver. (line 72) * gsl_odeiv2_driver_set_hmax: Driver. (line 36) * gsl_odeiv2_driver_set_hmin: Driver. (line 31) * gsl_odeiv2_driver_set_nmax: Driver. (line 41) * gsl_odeiv2_evolve_alloc: Evolution. (line 10) * gsl_odeiv2_evolve_apply: Evolution. (line 14) * gsl_odeiv2_evolve_apply_fixed_step: Evolution. (line 52) * gsl_odeiv2_evolve_free: Evolution. (line 68) * gsl_odeiv2_evolve_reset: Evolution. (line 63) * gsl_odeiv2_evolve_set_driver: Evolution. (line 72) * gsl_odeiv2_step_alloc: Stepping Functions. (line 10) * gsl_odeiv2_step_apply: Stepping Functions. (line 51) * gsl_odeiv2_step_bsimp: Stepping Functions. (line 122) * gsl_odeiv2_step_free: Stepping Functions. (line 23) * gsl_odeiv2_step_msadams: Stepping Functions. (line 127) * gsl_odeiv2_step_msbdf: Stepping Functions. (line 135) * gsl_odeiv2_step_name: Stepping Functions. (line 27) * gsl_odeiv2_step_order: Stepping Functions. (line 37) * gsl_odeiv2_step_reset: Stepping Functions. (line 18) * gsl_odeiv2_step_rk1imp: Stepping Functions. (line 104) * gsl_odeiv2_step_rk2: Stepping Functions. (line 86) * gsl_odeiv2_step_rk2imp: Stepping Functions. (line 110) * gsl_odeiv2_step_rk4: Stepping Functions. (line 89) * gsl_odeiv2_step_rk4imp: Stepping Functions. (line 116) * gsl_odeiv2_step_rk8pd: Stepping Functions. (line 101) * gsl_odeiv2_step_rkck: Stepping Functions. (line 98) * gsl_odeiv2_step_rkf45: Stepping Functions. (line 94) * gsl_odeiv2_step_set_driver: Stepping Functions. (line 43) * gsl_permutation_alloc: Permutation allocation. (line 6) * gsl_permutation_calloc: Permutation allocation. (line 14) * gsl_permutation_canonical_cycles: Permutations in cyclic form. (line 67) * gsl_permutation_canonical_to_linear: Permutations in cyclic form. (line 49) * gsl_permutation_data: Permutation properties. (line 9) * gsl_permutation_fprintf: Reading and writing permutations. (line 27) * gsl_permutation_fread: Reading and writing permutations. (line 17) * gsl_permutation_free: Permutation allocation. (line 23) * gsl_permutation_fscanf: Reading and writing permutations. (line 36) * gsl_permutation_fwrite: Reading and writing permutations. (line 9) * gsl_permutation_get: Accessing permutation elements. (line 9) * gsl_permutation_init: Permutation allocation. (line 19) * gsl_permutation_inverse: Permutation functions. (line 9) * gsl_permutation_inversions: Permutations in cyclic form. (line 54) * gsl_permutation_linear_cycles: Permutations in cyclic form. (line 62) * gsl_permutation_linear_to_canonical: Permutations in cyclic form. (line 44) * gsl_permutation_memcpy: Permutation allocation. (line 26) * gsl_permutation_mul: Applying Permutations. (line 44) * gsl_permutation_next: Permutation functions. (line 14) * gsl_permutation_prev: Permutation functions. (line 22) * gsl_permutation_reverse: Permutation functions. (line 6) * gsl_permutation_size: Permutation properties. (line 6) * gsl_permutation_swap: Accessing permutation elements. (line 16) * gsl_permutation_valid: Permutation properties. (line 13) * gsl_permute: Applying Permutations. (line 6) * gsl_permute_inverse: Applying Permutations. (line 11) * gsl_permute_matrix: Applying Permutations. (line 35) * gsl_permute_vector: Applying Permutations. (line 16) * gsl_permute_vector_inverse: Applying Permutations. (line 25) * gsl_poly_complex_eval: Polynomial Evaluation. (line 16) * gsl_poly_complex_solve: General Polynomial Equations. (line 25) * gsl_poly_complex_solve_cubic: Cubic Equations. (line 24) * gsl_poly_complex_solve_quadratic: Quadratic Equations. (line 28) * gsl_poly_complex_workspace_alloc: General Polynomial Equations. (line 11) * gsl_poly_complex_workspace_free: General Polynomial Equations. (line 21) * gsl_poly_dd_eval: Divided Difference Representation of Polynomials. (line 38) * gsl_poly_dd_hermite_init: Divided Difference Representation of Polynomials. (line 54) * gsl_poly_dd_init: Divided Difference Representation of Polynomials. (line 30) * gsl_poly_dd_taylor: Divided Difference Representation of Polynomials. (line 45) * gsl_poly_eval: Polynomial Evaluation. (line 11) * gsl_poly_eval_derivs: Polynomial Evaluation. (line 26) * gsl_poly_solve_cubic: Cubic Equations. (line 6) * gsl_poly_solve_quadratic: Quadratic Equations. (line 6) * gsl_pow_2: Small integer powers. (line 19) * gsl_pow_3: Small integer powers. (line 20) * gsl_pow_4: Small integer powers. (line 21) * gsl_pow_5: Small integer powers. (line 22) * gsl_pow_6: Small integer powers. (line 23) * gsl_pow_7: Small integer powers. (line 24) * gsl_pow_8: Small integer powers. (line 25) * gsl_pow_9: Small integer powers. (line 26) * gsl_pow_int: Small integer powers. (line 11) * gsl_pow_uint: Small integer powers. (line 12) * gsl_qrng_alloc: Quasi-random number generator initialization. (line 6) * gsl_qrng_clone: Saving and restoring quasi-random number generator state. (line 12) * gsl_qrng_free: Quasi-random number generator initialization. (line 14) * gsl_qrng_get: Sampling from a quasi-random number generator. (line 6) * gsl_qrng_halton: Quasi-random number generator algorithms. (line 18) * gsl_qrng_init: Quasi-random number generator initialization. (line 17) * gsl_qrng_memcpy: Saving and restoring quasi-random number generator state. (line 6) * gsl_qrng_name: Auxiliary quasi-random number generator functions. (line 6) * gsl_qrng_niederreiter_2: Quasi-random number generator algorithms. (line 8) * gsl_qrng_reversehalton: Quasi-random number generator algorithms. (line 19) * gsl_qrng_size: Auxiliary quasi-random number generator functions. (line 9) * gsl_qrng_sobol: Quasi-random number generator algorithms. (line 13) * gsl_qrng_state: Auxiliary quasi-random number generator functions. (line 10) * gsl_ran_bernoulli: The Bernoulli Distribution. (line 6) * gsl_ran_bernoulli_pdf: The Bernoulli Distribution. (line 15) * gsl_ran_beta: The Beta Distribution. (line 6) * gsl_ran_beta_pdf: The Beta Distribution. (line 15) * gsl_ran_binomial: The Binomial Distribution. (line 6) * gsl_ran_binomial_pdf: The Binomial Distribution. (line 17) * gsl_ran_bivariate_gaussian: The Bivariate Gaussian Distribution. (line 6) * gsl_ran_bivariate_gaussian_pdf: The Bivariate Gaussian Distribution. (line 18) * gsl_ran_cauchy: The Cauchy Distribution. (line 6) * gsl_ran_cauchy_pdf: The Cauchy Distribution. (line 16) * gsl_ran_chisq: The Chi-squared Distribution. (line 14) * gsl_ran_chisq_pdf: The Chi-squared Distribution. (line 23) * gsl_ran_choose: Shuffling and Sampling. (line 33) * gsl_ran_dirichlet: The Dirichlet Distribution. (line 6) * gsl_ran_dirichlet_lnpdf: The Dirichlet Distribution. (line 30) * gsl_ran_dirichlet_pdf: The Dirichlet Distribution. (line 24) * gsl_ran_dir_2d: Spherical Vector Distributions. (line 10) * gsl_ran_dir_2d_trig_method: Spherical Vector Distributions. (line 12) * gsl_ran_dir_3d: Spherical Vector Distributions. (line 31) * gsl_ran_dir_nd: Spherical Vector Distributions. (line 40) * gsl_ran_discrete: General Discrete Distributions. (line 59) * gsl_ran_discrete_free: General Discrete Distributions. (line 72) * gsl_ran_discrete_pdf: General Discrete Distributions. (line 64) * gsl_ran_discrete_preproc: General Discrete Distributions. (line 49) * gsl_ran_exponential: The Exponential Distribution. (line 6) * gsl_ran_exponential_pdf: The Exponential Distribution. (line 14) * gsl_ran_exppow: The Exponential Power Distribution. (line 6) * gsl_ran_exppow_pdf: The Exponential Power Distribution. (line 18) * gsl_ran_fdist: The F-distribution. (line 13) * gsl_ran_fdist_pdf: The F-distribution. (line 26) * gsl_ran_flat: The Flat (Uniform) Distribution. (line 6) * gsl_ran_flat_pdf: The Flat (Uniform) Distribution. (line 15) * gsl_ran_gamma: The Gamma Distribution. (line 6) * gsl_ran_gamma_knuth: The Gamma Distribution. (line 22) * gsl_ran_gamma_pdf: The Gamma Distribution. (line 27) * gsl_ran_gaussian: The Gaussian Distribution. (line 6) * gsl_ran_gaussian_pdf: The Gaussian Distribution. (line 19) * gsl_ran_gaussian_ratio_method: The Gaussian Distribution. (line 27) * gsl_ran_gaussian_tail: The Gaussian Tail Distribution. (line 6) * gsl_ran_gaussian_tail_pdf: The Gaussian Tail Distribution. (line 23) * gsl_ran_gaussian_ziggurat: The Gaussian Distribution. (line 25) * gsl_ran_geometric: The Geometric Distribution. (line 6) * gsl_ran_geometric_pdf: The Geometric Distribution. (line 19) * gsl_ran_gumbel1: The Type-1 Gumbel Distribution. (line 6) * gsl_ran_gumbel1_pdf: The Type-1 Gumbel Distribution. (line 15) * gsl_ran_gumbel2: The Type-2 Gumbel Distribution. (line 6) * gsl_ran_gumbel2_pdf: The Type-2 Gumbel Distribution. (line 15) * gsl_ran_hypergeometric: The Hypergeometric Distribution. (line 6) * gsl_ran_hypergeometric_pdf: The Hypergeometric Distribution. (line 22) * gsl_ran_landau: The Landau Distribution. (line 6) * gsl_ran_landau_pdf: The Landau Distribution. (line 17) * gsl_ran_laplace: The Laplace Distribution. (line 6) * gsl_ran_laplace_pdf: The Laplace Distribution. (line 14) * gsl_ran_levy: The Levy alpha-Stable Distributions. (line 6) * gsl_ran_levy_skew: The Levy skew alpha-Stable Distribution. (line 6) * gsl_ran_logarithmic: The Logarithmic Distribution. (line 6) * gsl_ran_logarithmic_pdf: The Logarithmic Distribution. (line 16) * gsl_ran_logistic: The Logistic Distribution. (line 6) * gsl_ran_logistic_pdf: The Logistic Distribution. (line 14) * gsl_ran_lognormal: The Lognormal Distribution. (line 6) * gsl_ran_lognormal_pdf: The Lognormal Distribution. (line 15) * gsl_ran_multinomial: The Multinomial Distribution. (line 6) * gsl_ran_multinomial_lnpdf: The Multinomial Distribution. (line 34) * gsl_ran_multinomial_pdf: The Multinomial Distribution. (line 28) * gsl_ran_multivariate_gaussian: The Multivariate Gaussian Distribution. (line 6) * gsl_ran_multivariate_gaussian_log_pdf: The Multivariate Gaussian Distribution. (line 23) * gsl_ran_multivariate_gaussian_mean: The Multivariate Gaussian Distribution. (line 31) * gsl_ran_multivariate_gaussian_pdf: The Multivariate Gaussian Distribution. (line 20) * gsl_ran_multivariate_gaussian_vcov: The Multivariate Gaussian Distribution. (line 43) * gsl_ran_negative_binomial: The Negative Binomial Distribution. (line 6) * gsl_ran_negative_binomial_pdf: The Negative Binomial Distribution. (line 17) * gsl_ran_pareto: The Pareto Distribution. (line 6) * gsl_ran_pareto_pdf: The Pareto Distribution. (line 15) * gsl_ran_pascal: The Pascal Distribution. (line 6) * gsl_ran_pascal_pdf: The Pascal Distribution. (line 16) * gsl_ran_poisson: The Poisson Distribution. (line 6) * gsl_ran_poisson_pdf: The Poisson Distribution. (line 16) * gsl_ran_rayleigh: The Rayleigh Distribution. (line 6) * gsl_ran_rayleigh_pdf: The Rayleigh Distribution. (line 14) * gsl_ran_rayleigh_tail: The Rayleigh Tail Distribution. (line 6) * gsl_ran_rayleigh_tail_pdf: The Rayleigh Tail Distribution. (line 16) * gsl_ran_sample: Shuffling and Sampling. (line 59) * gsl_ran_shuffle: Shuffling and Sampling. (line 13) * gsl_ran_tdist: The t-distribution. (line 14) * gsl_ran_tdist_pdf: The t-distribution. (line 23) * gsl_ran_ugaussian: The Gaussian Distribution. (line 34) * gsl_ran_ugaussian_pdf: The Gaussian Distribution. (line 35) * gsl_ran_ugaussian_ratio_method: The Gaussian Distribution. (line 36) * gsl_ran_ugaussian_tail: The Gaussian Tail Distribution. (line 30) * gsl_ran_ugaussian_tail_pdf: The Gaussian Tail Distribution. (line 32) * gsl_ran_weibull: The Weibull Distribution. (line 6) * gsl_ran_weibull_pdf: The Weibull Distribution. (line 15) * GSL_REAL: Representation of complex numbers. (line 34) * gsl_rng_alloc: Random number generator initialization. (line 6) * gsl_rng_borosh13: Other random number generators. (line 174) * gsl_rng_clone: Copying random number generator state. (line 16) * gsl_rng_cmrg: Random number generator algorithms. (line 98) * gsl_rng_coveyou: Other random number generators. (line 201) * gsl_rng_env_setup: Random number environment variables. (line 11) * gsl_rng_fishman18: Other random number generators. (line 175) * gsl_rng_fishman20: Other random number generators. (line 176) * gsl_rng_fishman2x: Other random number generators. (line 191) * gsl_rng_fread: Reading and writing random number generator state. (line 17) * gsl_rng_free: Random number generator initialization. (line 45) * gsl_rng_fwrite: Reading and writing random number generator state. (line 9) * gsl_rng_get: Sampling from a random number generator. (line 11) * gsl_rng_gfsr4: Random number generator algorithms. (line 173) * gsl_rng_knuthran: Other random number generators. (line 167) * gsl_rng_knuthran2: Other random number generators. (line 157) * gsl_rng_knuthran2002: Other random number generators. (line 166) * gsl_rng_lecuyer21: Other random number generators. (line 177) * gsl_rng_max: Auxiliary random number generator functions. (line 19) * gsl_rng_memcpy: Copying random number generator state. (line 11) * gsl_rng_min: Auxiliary random number generator functions. (line 23) * gsl_rng_minstd: Other random number generators. (line 113) * gsl_rng_mrg: Random number generator algorithms. (line 120) * gsl_rng_mt19937: Random number generator algorithms. (line 19) * gsl_rng_name: Auxiliary random number generator functions. (line 10) * gsl_rng_r250: Other random number generators. (line 59) * gsl_rng_rand: Unix random number generators. (line 17) * gsl_rng_rand48: Unix random number generators. (line 57) * gsl_rng_random_bsd: Unix random number generators. (line 26) * gsl_rng_random_glibc2: Unix random number generators. (line 28) * gsl_rng_random_libc5: Unix random number generators. (line 27) * gsl_rng_randu: Other random number generators. (line 104) * gsl_rng_ranf: Other random number generators. (line 22) * gsl_rng_ranlux: Random number generator algorithms. (line 71) * gsl_rng_ranlux389: Random number generator algorithms. (line 72) * gsl_rng_ranlxd1: Random number generator algorithms. (line 64) * gsl_rng_ranlxd2: Random number generator algorithms. (line 65) * gsl_rng_ranlxs0: Random number generator algorithms. (line 44) * gsl_rng_ranlxs1: Random number generator algorithms. (line 45) * gsl_rng_ranlxs2: Random number generator algorithms. (line 46) * gsl_rng_ranmar: Other random number generators. (line 53) * gsl_rng_set: Random number generator initialization. (line 25) * gsl_rng_size: Auxiliary random number generator functions. (line 30) * gsl_rng_slatec: Other random number generators. (line 140) * gsl_rng_state: Auxiliary random number generator functions. (line 29) * gsl_rng_taus: Random number generator algorithms. (line 137) * gsl_rng_taus2: Random number generator algorithms. (line 138) * gsl_rng_transputer: Other random number generators. (line 95) * gsl_rng_tt800: Other random number generators. (line 74) * gsl_rng_types_setup: Auxiliary random number generator functions. (line 40) * gsl_rng_uni: Other random number generators. (line 133) * gsl_rng_uni32: Other random number generators. (line 134) * gsl_rng_uniform: Sampling from a random number generator. (line 18) * gsl_rng_uniform_int: Sampling from a random number generator. (line 36) * gsl_rng_uniform_pos: Sampling from a random number generator. (line 28) * gsl_rng_vax: Other random number generators. (line 86) * gsl_rng_waterman14: Other random number generators. (line 178) * gsl_rng_zuf: Other random number generators. (line 144) * gsl_root_fdfsolver_alloc: Initializing the Solver. (line 21) * gsl_root_fdfsolver_free: Initializing the Solver. (line 48) * gsl_root_fdfsolver_iterate: Root Finding Iteration. (line 13) * gsl_root_fdfsolver_name: Initializing the Solver. (line 53) * gsl_root_fdfsolver_newton: Root Finding Algorithms using Derivatives. (line 15) * gsl_root_fdfsolver_root: Root Finding Iteration. (line 33) * gsl_root_fdfsolver_secant: Root Finding Algorithms using Derivatives. (line 29) * gsl_root_fdfsolver_set: Initializing the Solver. (line 42) * gsl_root_fdfsolver_steffenson: Root Finding Algorithms using Derivatives. (line 60) * gsl_root_fsolver_alloc: Initializing the Solver. (line 6) * gsl_root_fsolver_bisection: Root Bracketing Algorithms. (line 16) * gsl_root_fsolver_brent: Root Bracketing Algorithms. (line 49) * gsl_root_fsolver_falsepos: Root Bracketing Algorithms. (line 32) * gsl_root_fsolver_free: Initializing the Solver. (line 47) * gsl_root_fsolver_iterate: Root Finding Iteration. (line 12) * gsl_root_fsolver_name: Initializing the Solver. (line 51) * gsl_root_fsolver_root: Root Finding Iteration. (line 32) * gsl_root_fsolver_set: Initializing the Solver. (line 36) * gsl_root_fsolver_x_lower: Root Finding Iteration. (line 38) * gsl_root_fsolver_x_upper: Root Finding Iteration. (line 40) * gsl_root_test_delta: Search Stopping Parameters. (line 41) * gsl_root_test_interval: Search Stopping Parameters. (line 19) * gsl_root_test_residual: Search Stopping Parameters. (line 52) * gsl_rstat_add: Running Statistics Adding Data to the Accumulator. (line 6) * gsl_rstat_alloc: Running Statistics Initializing the Accumulator. (line 6) * gsl_rstat_free: Running Statistics Initializing the Accumulator. (line 10) * gsl_rstat_kurtosis: Running Statistics Current Statistics. (line 47) * gsl_rstat_max: Running Statistics Current Statistics. (line 9) * gsl_rstat_mean: Running Statistics Current Statistics. (line 12) * gsl_rstat_median: Running Statistics Current Statistics. (line 53) * gsl_rstat_min: Running Statistics Current Statistics. (line 6) * gsl_rstat_n: Running Statistics Adding Data to the Accumulator. (line 12) * gsl_rstat_quantile_add: Running Statistics Quantiles. (line 28) * gsl_rstat_quantile_alloc: Running Statistics Quantiles. (line 13) * gsl_rstat_quantile_free: Running Statistics Quantiles. (line 19) * gsl_rstat_quantile_get: Running Statistics Quantiles. (line 33) * gsl_rstat_quantile_reset: Running Statistics Quantiles. (line 23) * gsl_rstat_reset: Running Statistics Initializing the Accumulator. (line 13) * gsl_rstat_rms: Running Statistics Current Statistics. (line 35) * gsl_rstat_sd: Running Statistics Current Statistics. (line 24) * gsl_rstat_sd_mean: Running Statistics Current Statistics. (line 29) * gsl_rstat_skew: Running Statistics Current Statistics. (line 41) * gsl_rstat_variance: Running Statistics Current Statistics. (line 18) * GSL_SET_COMPLEX: Representation of complex numbers. (line 39) * gsl_set_error_handler: Error Handlers. (line 43) * gsl_set_error_handler_off: Error Handlers. (line 69) * GSL_SET_IMAG: Representation of complex numbers. (line 49) * GSL_SET_REAL: Representation of complex numbers. (line 48) * gsl_sf_airy_Ai: Airy Functions. (line 6) * gsl_sf_airy_Ai_deriv: Derivatives of Airy Functions. (line 6) * gsl_sf_airy_Ai_deriv_e: Derivatives of Airy Functions. (line 7) * gsl_sf_airy_Ai_deriv_scaled: Derivatives of Airy Functions. (line 18) * gsl_sf_airy_Ai_deriv_scaled_e: Derivatives of Airy Functions. (line 20) * gsl_sf_airy_Ai_e: Airy Functions. (line 7) * gsl_sf_airy_Ai_scaled: Airy Functions. (line 18) * gsl_sf_airy_Ai_scaled_e: Airy Functions. (line 19) * gsl_sf_airy_Bi: Airy Functions. (line 12) * gsl_sf_airy_Bi_deriv: Derivatives of Airy Functions. (line 12) * gsl_sf_airy_Bi_deriv_e: Derivatives of Airy Functions. (line 13) * gsl_sf_airy_Bi_deriv_scaled: Derivatives of Airy Functions. (line 26) * gsl_sf_airy_Bi_deriv_scaled_e: Derivatives of Airy Functions. (line 28) * gsl_sf_airy_Bi_e: Airy Functions. (line 13) * gsl_sf_airy_Bi_scaled: Airy Functions. (line 25) * gsl_sf_airy_Bi_scaled_e: Airy Functions. (line 26) * gsl_sf_airy_zero_Ai: Zeros of Airy Functions. (line 6) * gsl_sf_airy_zero_Ai_deriv: Zeros of Derivatives of Airy Functions. (line 6) * gsl_sf_airy_zero_Ai_deriv_e: Zeros of Derivatives of Airy Functions. (line 7) * gsl_sf_airy_zero_Ai_e: Zeros of Airy Functions. (line 7) * gsl_sf_airy_zero_Bi: Zeros of Airy Functions. (line 12) * gsl_sf_airy_zero_Bi_deriv: Zeros of Derivatives of Airy Functions. (line 12) * gsl_sf_airy_zero_Bi_deriv_e: Zeros of Derivatives of Airy Functions. (line 13) * gsl_sf_airy_zero_Bi_e: Zeros of Airy Functions. (line 13) * gsl_sf_angle_restrict_pos: Restriction Functions. (line 15) * gsl_sf_angle_restrict_pos_e: Restriction Functions. (line 16) * gsl_sf_angle_restrict_symm: Restriction Functions. (line 6) * gsl_sf_angle_restrict_symm_e: Restriction Functions. (line 7) * gsl_sf_atanint: Arctangent Integral. (line 6) * gsl_sf_atanint_e: Arctangent Integral. (line 7) * gsl_sf_bessel_I0: Regular Modified Cylindrical Bessel Functions. (line 6) * gsl_sf_bessel_I0_e: Regular Modified Cylindrical Bessel Functions. (line 7) * gsl_sf_bessel_I0_scaled: Regular Modified Cylindrical Bessel Functions. (line 31) * gsl_sf_bessel_i0_scaled: Regular Modified Spherical Bessel Functions. (line 10) * gsl_sf_bessel_I0_scaled_e: Regular Modified Cylindrical Bessel Functions. (line 32) * gsl_sf_bessel_i0_scaled_e: Regular Modified Spherical Bessel Functions. (line 11) * gsl_sf_bessel_I1: Regular Modified Cylindrical Bessel Functions. (line 11) * gsl_sf_bessel_I1_e: Regular Modified Cylindrical Bessel Functions. (line 12) * gsl_sf_bessel_I1_scaled: Regular Modified Cylindrical Bessel Functions. (line 37) * gsl_sf_bessel_i1_scaled: Regular Modified Spherical Bessel Functions. (line 16) * gsl_sf_bessel_I1_scaled_e: Regular Modified Cylindrical Bessel Functions. (line 38) * gsl_sf_bessel_i1_scaled_e: Regular Modified Spherical Bessel Functions. (line 17) * gsl_sf_bessel_i2_scaled: Regular Modified Spherical Bessel Functions. (line 22) * gsl_sf_bessel_i2_scaled_e: Regular Modified Spherical Bessel Functions. (line 23) * gsl_sf_bessel_il_scaled: Regular Modified Spherical Bessel Functions. (line 28) * gsl_sf_bessel_il_scaled_array: Regular Modified Spherical Bessel Functions. (line 34) * gsl_sf_bessel_il_scaled_e: Regular Modified Spherical Bessel Functions. (line 29) * gsl_sf_bessel_In: Regular Modified Cylindrical Bessel Functions. (line 16) * gsl_sf_bessel_Inu: Regular Modified Bessel Functions - Fractional Order. (line 6) * gsl_sf_bessel_Inu_e: Regular Modified Bessel Functions - Fractional Order. (line 7) * gsl_sf_bessel_Inu_scaled: Regular Modified Bessel Functions - Fractional Order. (line 12) * gsl_sf_bessel_Inu_scaled_e: Regular Modified Bessel Functions - Fractional Order. (line 13) * gsl_sf_bessel_In_array: Regular Modified Cylindrical Bessel Functions. (line 22) * gsl_sf_bessel_In_e: Regular Modified Cylindrical Bessel Functions. (line 17) * gsl_sf_bessel_In_scaled: Regular Modified Cylindrical Bessel Functions. (line 43) * gsl_sf_bessel_In_scaled_array: Regular Modified Cylindrical Bessel Functions. (line 49) * gsl_sf_bessel_In_scaled_e: Regular Modified Cylindrical Bessel Functions. (line 44) * gsl_sf_bessel_J0: Regular Cylindrical Bessel Functions. (line 6) * gsl_sf_bessel_j0: Regular Spherical Bessel Functions. (line 6) * gsl_sf_bessel_J0_e: Regular Cylindrical Bessel Functions. (line 7) * gsl_sf_bessel_j0_e: Regular Spherical Bessel Functions. (line 7) * gsl_sf_bessel_J1: Regular Cylindrical Bessel Functions. (line 11) * gsl_sf_bessel_j1: Regular Spherical Bessel Functions. (line 11) * gsl_sf_bessel_J1_e: Regular Cylindrical Bessel Functions. (line 12) * gsl_sf_bessel_j1_e: Regular Spherical Bessel Functions. (line 12) * gsl_sf_bessel_j2: Regular Spherical Bessel Functions. (line 16) * gsl_sf_bessel_j2_e: Regular Spherical Bessel Functions. (line 17) * gsl_sf_bessel_jl: Regular Spherical Bessel Functions. (line 21) * gsl_sf_bessel_jl_array: Regular Spherical Bessel Functions. (line 27) * gsl_sf_bessel_jl_e: Regular Spherical Bessel Functions. (line 22) * gsl_sf_bessel_jl_steed_array: Regular Spherical Bessel Functions. (line 35) * gsl_sf_bessel_Jn: Regular Cylindrical Bessel Functions. (line 16) * gsl_sf_bessel_Jnu: Regular Bessel Function - Fractional Order. (line 6) * gsl_sf_bessel_Jnu_e: Regular Bessel Function - Fractional Order. (line 7) * gsl_sf_bessel_Jn_array: Regular Cylindrical Bessel Functions. (line 22) * gsl_sf_bessel_Jn_e: Regular Cylindrical Bessel Functions. (line 17) * gsl_sf_bessel_K0: Irregular Modified Cylindrical Bessel Functions. (line 6) * gsl_sf_bessel_K0_e: Irregular Modified Cylindrical Bessel Functions. (line 7) * gsl_sf_bessel_K0_scaled: Irregular Modified Cylindrical Bessel Functions. (line 32) * gsl_sf_bessel_k0_scaled: Irregular Modified Spherical Bessel Functions. (line 10) * gsl_sf_bessel_K0_scaled_e: Irregular Modified Cylindrical Bessel Functions. (line 33) * gsl_sf_bessel_k0_scaled_e: Irregular Modified Spherical Bessel Functions. (line 11) * gsl_sf_bessel_K1: Irregular Modified Cylindrical Bessel Functions. (line 11) * gsl_sf_bessel_K1_e: Irregular Modified Cylindrical Bessel Functions. (line 12) * gsl_sf_bessel_K1_scaled: Irregular Modified Cylindrical Bessel Functions. (line 38) * gsl_sf_bessel_k1_scaled: Irregular Modified Spherical Bessel Functions. (line 16) * gsl_sf_bessel_K1_scaled_e: Irregular Modified Cylindrical Bessel Functions. (line 39) * gsl_sf_bessel_k1_scaled_e: Irregular Modified Spherical Bessel Functions. (line 17) * gsl_sf_bessel_k2_scaled: Irregular Modified Spherical Bessel Functions. (line 22) * gsl_sf_bessel_k2_scaled_e: Irregular Modified Spherical Bessel Functions. (line 23) * gsl_sf_bessel_kl_scaled: Irregular Modified Spherical Bessel Functions. (line 28) * gsl_sf_bessel_kl_scaled_array: Irregular Modified Spherical Bessel Functions. (line 34) * gsl_sf_bessel_kl_scaled_e: Irregular Modified Spherical Bessel Functions. (line 29) * gsl_sf_bessel_Kn: Irregular Modified Cylindrical Bessel Functions. (line 16) * gsl_sf_bessel_Knu: Irregular Modified Bessel Functions - Fractional Order. (line 6) * gsl_sf_bessel_Knu_e: Irregular Modified Bessel Functions - Fractional Order. (line 7) * gsl_sf_bessel_Knu_scaled: Irregular Modified Bessel Functions - Fractional Order. (line 19) * gsl_sf_bessel_Knu_scaled_e: Irregular Modified Bessel Functions - Fractional Order. (line 20) * gsl_sf_bessel_Kn_array: Irregular Modified Cylindrical Bessel Functions. (line 22) * gsl_sf_bessel_Kn_e: Irregular Modified Cylindrical Bessel Functions. (line 17) * gsl_sf_bessel_Kn_scaled: Irregular Modified Cylindrical Bessel Functions. (line 44) * gsl_sf_bessel_Kn_scaled_array: Irregular Modified Cylindrical Bessel Functions. (line 50) * gsl_sf_bessel_Kn_scaled_e: Irregular Modified Cylindrical Bessel Functions. (line 45) * gsl_sf_bessel_lnKnu: Irregular Modified Bessel Functions - Fractional Order. (line 12) * gsl_sf_bessel_lnKnu_e: Irregular Modified Bessel Functions - Fractional Order. (line 13) * gsl_sf_bessel_sequence_Jnu_e: Regular Bessel Function - Fractional Order. (line 12) * gsl_sf_bessel_Y0: Irregular Cylindrical Bessel Functions. (line 6) * gsl_sf_bessel_y0: Irregular Spherical Bessel Functions. (line 6) * gsl_sf_bessel_Y0_e: Irregular Cylindrical Bessel Functions. (line 7) * gsl_sf_bessel_y0_e: Irregular Spherical Bessel Functions. (line 7) * gsl_sf_bessel_Y1: Irregular Cylindrical Bessel Functions. (line 11) * gsl_sf_bessel_y1: Irregular Spherical Bessel Functions. (line 11) * gsl_sf_bessel_Y1_e: Irregular Cylindrical Bessel Functions. (line 12) * gsl_sf_bessel_y1_e: Irregular Spherical Bessel Functions. (line 12) * gsl_sf_bessel_y2: Irregular Spherical Bessel Functions. (line 16) * gsl_sf_bessel_y2_e: Irregular Spherical Bessel Functions. (line 17) * gsl_sf_bessel_yl: Irregular Spherical Bessel Functions. (line 21) * gsl_sf_bessel_yl_array: Irregular Spherical Bessel Functions. (line 27) * gsl_sf_bessel_yl_e: Irregular Spherical Bessel Functions. (line 22) * gsl_sf_bessel_Yn: Irregular Cylindrical Bessel Functions. (line 16) * gsl_sf_bessel_Ynu: Irregular Bessel Functions - Fractional Order. (line 6) * gsl_sf_bessel_Ynu_e: Irregular Bessel Functions - Fractional Order. (line 7) * gsl_sf_bessel_Yn_array: Irregular Cylindrical Bessel Functions. (line 22) * gsl_sf_bessel_Yn_e: Irregular Cylindrical Bessel Functions. (line 17) * gsl_sf_bessel_zero_J0: Zeros of Regular Bessel Functions. (line 6) * gsl_sf_bessel_zero_J0_e: Zeros of Regular Bessel Functions. (line 7) * gsl_sf_bessel_zero_J1: Zeros of Regular Bessel Functions. (line 12) * gsl_sf_bessel_zero_J1_e: Zeros of Regular Bessel Functions. (line 13) * gsl_sf_bessel_zero_Jnu: Zeros of Regular Bessel Functions. (line 18) * gsl_sf_bessel_zero_Jnu_e: Zeros of Regular Bessel Functions. (line 19) * gsl_sf_beta: Beta Functions. (line 6) * gsl_sf_beta_e: Beta Functions. (line 7) * gsl_sf_beta_inc: Incomplete Beta Function. (line 6) * gsl_sf_beta_inc_e: Incomplete Beta Function. (line 7) * gsl_sf_Chi: Hyperbolic Integrals. (line 11) * gsl_sf_Chi_e: Hyperbolic Integrals. (line 12) * gsl_sf_choose: Factorials. (line 38) * gsl_sf_choose_e: Factorials. (line 39) * gsl_sf_Ci: Trigonometric Integrals. (line 11) * gsl_sf_Ci_e: Trigonometric Integrals. (line 12) * gsl_sf_clausen: Clausen Functions. (line 14) * gsl_sf_clausen_e: Clausen Functions. (line 15) * gsl_sf_complex_cos_e: Trigonometric Functions for Complex Arguments. (line 11) * gsl_sf_complex_dilog_e: Complex Argument. (line 6) * gsl_sf_complex_logsin_e: Trigonometric Functions for Complex Arguments. (line 16) * gsl_sf_complex_log_e: Logarithm and Related Functions. (line 19) * gsl_sf_complex_sin_e: Trigonometric Functions for Complex Arguments. (line 6) * gsl_sf_conicalP_0: Conical Functions. (line 22) * gsl_sf_conicalP_0_e: Conical Functions. (line 23) * gsl_sf_conicalP_1: Conical Functions. (line 28) * gsl_sf_conicalP_1_e: Conical Functions. (line 29) * gsl_sf_conicalP_cyl_reg: Conical Functions. (line 41) * gsl_sf_conicalP_cyl_reg_e: Conical Functions. (line 43) * gsl_sf_conicalP_half: Conical Functions. (line 10) * gsl_sf_conicalP_half_e: Conical Functions. (line 11) * gsl_sf_conicalP_mhalf: Conical Functions. (line 16) * gsl_sf_conicalP_mhalf_e: Conical Functions. (line 17) * gsl_sf_conicalP_sph_reg: Conical Functions. (line 34) * gsl_sf_conicalP_sph_reg_e: Conical Functions. (line 36) * gsl_sf_cos: Circular Trigonometric Functions. (line 10) * gsl_sf_cos_e: Circular Trigonometric Functions. (line 11) * gsl_sf_cos_err_e: Trigonometric Functions With Error Estimates. (line 13) * gsl_sf_coulomb_CL_array: Coulomb Wave Function Normalization Constant. (line 14) * gsl_sf_coulomb_CL_e: Coulomb Wave Function Normalization Constant. (line 9) * gsl_sf_coulomb_wave_FGp_array: Coulomb Wave Functions. (line 47) * gsl_sf_coulomb_wave_FG_array: Coulomb Wave Functions. (line 39) * gsl_sf_coulomb_wave_FG_e: Coulomb Wave Functions. (line 19) * gsl_sf_coulomb_wave_F_array: Coulomb Wave Functions. (line 33) * gsl_sf_coulomb_wave_sphF_array: Coulomb Wave Functions. (line 57) * gsl_sf_coupling_3j: 3-j Symbols. (line 6) * gsl_sf_coupling_3j_e: 3-j Symbols. (line 8) * gsl_sf_coupling_6j: 6-j Symbols. (line 6) * gsl_sf_coupling_6j_e: 6-j Symbols. (line 8) * gsl_sf_coupling_9j: 9-j Symbols. (line 6) * gsl_sf_coupling_9j_e: 9-j Symbols. (line 9) * gsl_sf_dawson: Dawson Function. (line 11) * gsl_sf_dawson_e: Dawson Function. (line 12) * gsl_sf_debye_1: Debye Functions. (line 13) * gsl_sf_debye_1_e: Debye Functions. (line 14) * gsl_sf_debye_2: Debye Functions. (line 18) * gsl_sf_debye_2_e: Debye Functions. (line 19) * gsl_sf_debye_3: Debye Functions. (line 23) * gsl_sf_debye_3_e: Debye Functions. (line 24) * gsl_sf_debye_4: Debye Functions. (line 28) * gsl_sf_debye_4_e: Debye Functions. (line 29) * gsl_sf_debye_5: Debye Functions. (line 33) * gsl_sf_debye_5_e: Debye Functions. (line 34) * gsl_sf_debye_6: Debye Functions. (line 38) * gsl_sf_debye_6_e: Debye Functions. (line 39) * gsl_sf_dilog: Real Argument. (line 6) * gsl_sf_dilog_e: Real Argument. (line 7) * gsl_sf_doublefact: Factorials. (line 18) * gsl_sf_doublefact_e: Factorials. (line 19) * gsl_sf_ellint_D: Legendre Form of Incomplete Elliptic Integrals. (line 34) * gsl_sf_ellint_D_e: Legendre Form of Incomplete Elliptic Integrals. (line 36) * gsl_sf_ellint_E: Legendre Form of Incomplete Elliptic Integrals. (line 15) * gsl_sf_ellint_Ecomp: Legendre Form of Complete Elliptic Integrals. (line 13) * gsl_sf_ellint_Ecomp_e: Legendre Form of Complete Elliptic Integrals. (line 14) * gsl_sf_ellint_E_e: Legendre Form of Incomplete Elliptic Integrals. (line 17) * gsl_sf_ellint_F: Legendre Form of Incomplete Elliptic Integrals. (line 6) * gsl_sf_ellint_F_e: Legendre Form of Incomplete Elliptic Integrals. (line 8) * gsl_sf_ellint_Kcomp: Legendre Form of Complete Elliptic Integrals. (line 6) * gsl_sf_ellint_Kcomp_e: Legendre Form of Complete Elliptic Integrals. (line 7) * gsl_sf_ellint_P: Legendre Form of Incomplete Elliptic Integrals. (line 24) * gsl_sf_ellint_Pcomp: Legendre Form of Complete Elliptic Integrals. (line 20) * gsl_sf_ellint_Pcomp_e: Legendre Form of Complete Elliptic Integrals. (line 22) * gsl_sf_ellint_P_e: Legendre Form of Incomplete Elliptic Integrals. (line 26) * gsl_sf_ellint_RC: Carlson Forms. (line 6) * gsl_sf_ellint_RC_e: Carlson Forms. (line 8) * gsl_sf_ellint_RD: Carlson Forms. (line 13) * gsl_sf_ellint_RD_e: Carlson Forms. (line 15) * gsl_sf_ellint_RF: Carlson Forms. (line 20) * gsl_sf_ellint_RF_e: Carlson Forms. (line 22) * gsl_sf_ellint_RJ: Carlson Forms. (line 27) * gsl_sf_ellint_RJ_e: Carlson Forms. (line 29) * gsl_sf_elljac_e: Elliptic Functions (Jacobi). (line 10) * gsl_sf_erf: Error Function. (line 6) * gsl_sf_erfc: Complementary Error Function. (line 6) * gsl_sf_erfc_e: Complementary Error Function. (line 7) * gsl_sf_erf_e: Error Function. (line 7) * gsl_sf_erf_Q: Probability functions. (line 14) * gsl_sf_erf_Q_e: Probability functions. (line 15) * gsl_sf_erf_Z: Probability functions. (line 9) * gsl_sf_erf_Z_e: Probability functions. (line 10) * gsl_sf_eta: Eta Function. (line 12) * gsl_sf_eta_e: Eta Function. (line 13) * gsl_sf_eta_int: Eta Function. (line 8) * gsl_sf_eta_int_e: Eta Function. (line 9) * gsl_sf_exp: Exponential Function. (line 6) * gsl_sf_expint_3: Ei_3(x). (line 6) * gsl_sf_expint_3_e: Ei_3(x). (line 7) * gsl_sf_expint_E1: Exponential Integral. (line 6) * gsl_sf_expint_E1_e: Exponential Integral. (line 7) * gsl_sf_expint_E2: Exponential Integral. (line 12) * gsl_sf_expint_E2_e: Exponential Integral. (line 13) * gsl_sf_expint_Ei: Ei(x). (line 6) * gsl_sf_expint_Ei_e: Ei(x). (line 7) * gsl_sf_expint_En: Exponential Integral. (line 19) * gsl_sf_expint_En_e: Exponential Integral. (line 20) * gsl_sf_expm1: Relative Exponential Functions. (line 6) * gsl_sf_expm1_e: Relative Exponential Functions. (line 7) * gsl_sf_exprel: Relative Exponential Functions. (line 11) * gsl_sf_exprel_2: Relative Exponential Functions. (line 18) * gsl_sf_exprel_2_e: Relative Exponential Functions. (line 19) * gsl_sf_exprel_e: Relative Exponential Functions. (line 12) * gsl_sf_exprel_n: Relative Exponential Functions. (line 25) * gsl_sf_exprel_n_e: Relative Exponential Functions. (line 26) * gsl_sf_exp_e: Exponential Function. (line 7) * gsl_sf_exp_e10_e: Exponential Function. (line 11) * gsl_sf_exp_err_e: Exponentiation With Error Estimate. (line 6) * gsl_sf_exp_err_e10_e: Exponentiation With Error Estimate. (line 10) * gsl_sf_exp_mult: Exponential Function. (line 18) * gsl_sf_exp_mult_e: Exponential Function. (line 19) * gsl_sf_exp_mult_e10_e: Exponential Function. (line 24) * gsl_sf_exp_mult_err_e: Exponentiation With Error Estimate. (line 16) * gsl_sf_exp_mult_err_e10_e: Exponentiation With Error Estimate. (line 21) * gsl_sf_fact: Factorials. (line 11) * gsl_sf_fact_e: Factorials. (line 12) * gsl_sf_fermi_dirac_0: Complete Fermi-Dirac Integrals. (line 19) * gsl_sf_fermi_dirac_0_e: Complete Fermi-Dirac Integrals. (line 20) * gsl_sf_fermi_dirac_1: Complete Fermi-Dirac Integrals. (line 25) * gsl_sf_fermi_dirac_1_e: Complete Fermi-Dirac Integrals. (line 26) * gsl_sf_fermi_dirac_2: Complete Fermi-Dirac Integrals. (line 31) * gsl_sf_fermi_dirac_2_e: Complete Fermi-Dirac Integrals. (line 32) * gsl_sf_fermi_dirac_3half: Complete Fermi-Dirac Integrals. (line 56) * gsl_sf_fermi_dirac_3half_e: Complete Fermi-Dirac Integrals. (line 57) * gsl_sf_fermi_dirac_half: Complete Fermi-Dirac Integrals. (line 50) * gsl_sf_fermi_dirac_half_e: Complete Fermi-Dirac Integrals. (line 51) * gsl_sf_fermi_dirac_inc_0: Incomplete Fermi-Dirac Integrals. (line 10) * gsl_sf_fermi_dirac_inc_0_e: Incomplete Fermi-Dirac Integrals. (line 11) * gsl_sf_fermi_dirac_int: Complete Fermi-Dirac Integrals. (line 37) * gsl_sf_fermi_dirac_int_e: Complete Fermi-Dirac Integrals. (line 38) * gsl_sf_fermi_dirac_m1: Complete Fermi-Dirac Integrals. (line 12) * gsl_sf_fermi_dirac_m1_e: Complete Fermi-Dirac Integrals. (line 13) * gsl_sf_fermi_dirac_mhalf: Complete Fermi-Dirac Integrals. (line 44) * gsl_sf_fermi_dirac_mhalf_e: Complete Fermi-Dirac Integrals. (line 45) * gsl_sf_gamma: Gamma Functions. (line 14) * gsl_sf_gammainv: Gamma Functions. (line 49) * gsl_sf_gammainv_e: Gamma Functions. (line 50) * gsl_sf_gammastar: Gamma Functions. (line 40) * gsl_sf_gammastar_e: Gamma Functions. (line 41) * gsl_sf_gamma_e: Gamma Functions. (line 15) * gsl_sf_gamma_inc: Incomplete Gamma Functions. (line 6) * gsl_sf_gamma_inc_e: Incomplete Gamma Functions. (line 7) * gsl_sf_gamma_inc_P: Incomplete Gamma Functions. (line 20) * gsl_sf_gamma_inc_P_e: Incomplete Gamma Functions. (line 21) * gsl_sf_gamma_inc_Q: Incomplete Gamma Functions. (line 13) * gsl_sf_gamma_inc_Q_e: Incomplete Gamma Functions. (line 14) * gsl_sf_gegenpoly_1: Gegenbauer Functions. (line 11) * gsl_sf_gegenpoly_1_e: Gegenbauer Functions. (line 14) * gsl_sf_gegenpoly_2: Gegenbauer Functions. (line 12) * gsl_sf_gegenpoly_2_e: Gegenbauer Functions. (line 16) * gsl_sf_gegenpoly_3: Gegenbauer Functions. (line 13) * gsl_sf_gegenpoly_3_e: Gegenbauer Functions. (line 18) * gsl_sf_gegenpoly_array: Gegenbauer Functions. (line 30) * gsl_sf_gegenpoly_n: Gegenbauer Functions. (line 23) * gsl_sf_gegenpoly_n_e: Gegenbauer Functions. (line 24) * gsl_sf_hazard: Probability functions. (line 27) * gsl_sf_hazard_e: Probability functions. (line 28) * gsl_sf_hydrogenicR: Normalized Hydrogenic Bound States. (line 12) * gsl_sf_hydrogenicR_1: Normalized Hydrogenic Bound States. (line 6) * gsl_sf_hydrogenicR_1_e: Normalized Hydrogenic Bound States. (line 7) * gsl_sf_hydrogenicR_e: Normalized Hydrogenic Bound States. (line 14) * gsl_sf_hyperg_0F1: Hypergeometric Functions. (line 10) * gsl_sf_hyperg_0F1_e: Hypergeometric Functions. (line 11) * gsl_sf_hyperg_1F1: Hypergeometric Functions. (line 21) * gsl_sf_hyperg_1F1_e: Hypergeometric Functions. (line 22) * gsl_sf_hyperg_1F1_int: Hypergeometric Functions. (line 15) * gsl_sf_hyperg_1F1_int_e: Hypergeometric Functions. (line 16) * gsl_sf_hyperg_2F0: Hypergeometric Functions. (line 85) * gsl_sf_hyperg_2F0_e: Hypergeometric Functions. (line 86) * gsl_sf_hyperg_2F1: Hypergeometric Functions. (line 51) * gsl_sf_hyperg_2F1_conj: Hypergeometric Functions. (line 63) * gsl_sf_hyperg_2F1_conj_e: Hypergeometric Functions. (line 65) * gsl_sf_hyperg_2F1_conj_renorm: Hypergeometric Functions. (line 77) * gsl_sf_hyperg_2F1_conj_renorm_e: Hypergeometric Functions. (line 79) * gsl_sf_hyperg_2F1_e: Hypergeometric Functions. (line 53) * gsl_sf_hyperg_2F1_renorm: Hypergeometric Functions. (line 70) * gsl_sf_hyperg_2F1_renorm_e: Hypergeometric Functions. (line 72) * gsl_sf_hyperg_U: Hypergeometric Functions. (line 39) * gsl_sf_hyperg_U_e: Hypergeometric Functions. (line 40) * gsl_sf_hyperg_U_e10_e: Hypergeometric Functions. (line 45) * gsl_sf_hyperg_U_int: Hypergeometric Functions. (line 27) * gsl_sf_hyperg_U_int_e: Hypergeometric Functions. (line 28) * gsl_sf_hyperg_U_int_e10_e: Hypergeometric Functions. (line 33) * gsl_sf_hypot: Circular Trigonometric Functions. (line 14) * gsl_sf_hypot_e: Circular Trigonometric Functions. (line 15) * gsl_sf_hzeta: Hurwitz Zeta Function. (line 9) * gsl_sf_hzeta_e: Hurwitz Zeta Function. (line 10) * gsl_sf_laguerre_1: Laguerre Functions. (line 16) * gsl_sf_laguerre_1_e: Laguerre Functions. (line 19) * gsl_sf_laguerre_2: Laguerre Functions. (line 17) * gsl_sf_laguerre_2_e: Laguerre Functions. (line 21) * gsl_sf_laguerre_3: Laguerre Functions. (line 18) * gsl_sf_laguerre_3_e: Laguerre Functions. (line 23) * gsl_sf_laguerre_n: Laguerre Functions. (line 28) * gsl_sf_laguerre_n_e: Laguerre Functions. (line 30) * gsl_sf_lambert_W0: Lambert W Functions. (line 13) * gsl_sf_lambert_W0_e: Lambert W Functions. (line 14) * gsl_sf_lambert_Wm1: Lambert W Functions. (line 18) * gsl_sf_lambert_Wm1_e: Lambert W Functions. (line 19) * gsl_sf_legendre_array: Associated Legendre Polynomials and Spherical Harmonics. (line 69) * gsl_sf_legendre_array_e: Associated Legendre Polynomials and Spherical Harmonics. (line 71) * gsl_sf_legendre_array_index: Associated Legendre Polynomials and Spherical Harmonics. (line 162) * gsl_sf_legendre_array_n: Associated Legendre Polynomials and Spherical Harmonics. (line 155) * gsl_sf_legendre_array_size: Associated Legendre Polynomials and Spherical Harmonics. (line 200) * gsl_sf_legendre_deriv2_alt_array: Associated Legendre Polynomials and Spherical Harmonics. (line 135) * gsl_sf_legendre_deriv2_alt_array_e: Associated Legendre Polynomials and Spherical Harmonics. (line 139) * gsl_sf_legendre_deriv2_array: Associated Legendre Polynomials and Spherical Harmonics. (line 116) * gsl_sf_legendre_deriv2_array_e: Associated Legendre Polynomials and Spherical Harmonics. (line 120) * gsl_sf_legendre_deriv_alt_array: Associated Legendre Polynomials and Spherical Harmonics. (line 100) * gsl_sf_legendre_deriv_alt_array_e: Associated Legendre Polynomials and Spherical Harmonics. (line 103) * gsl_sf_legendre_deriv_array: Associated Legendre Polynomials and Spherical Harmonics. (line 85) * gsl_sf_legendre_deriv_array_e: Associated Legendre Polynomials and Spherical Harmonics. (line 88) * gsl_sf_legendre_H3d: Radial Functions for Hyperbolic Space. (line 30) * gsl_sf_legendre_H3d_0: Radial Functions for Hyperbolic Space. (line 11) * gsl_sf_legendre_H3d_0_e: Radial Functions for Hyperbolic Space. (line 12) * gsl_sf_legendre_H3d_1: Radial Functions for Hyperbolic Space. (line 20) * gsl_sf_legendre_H3d_1_e: Radial Functions for Hyperbolic Space. (line 21) * gsl_sf_legendre_H3d_array: Radial Functions for Hyperbolic Space. (line 39) * gsl_sf_legendre_H3d_e: Radial Functions for Hyperbolic Space. (line 32) * gsl_sf_legendre_P1: Legendre Polynomials. (line 6) * gsl_sf_legendre_P1_e: Legendre Polynomials. (line 9) * gsl_sf_legendre_P2: Legendre Polynomials. (line 7) * gsl_sf_legendre_P2_e: Legendre Polynomials. (line 11) * gsl_sf_legendre_P3: Legendre Polynomials. (line 8) * gsl_sf_legendre_P3_e: Legendre Polynomials. (line 13) * gsl_sf_legendre_Pl: Legendre Polynomials. (line 18) * gsl_sf_legendre_Plm: Associated Legendre Polynomials and Spherical Harmonics. (line 169) * gsl_sf_legendre_Plm_array: Associated Legendre Polynomials and Spherical Harmonics. (line 184) * gsl_sf_legendre_Plm_deriv_array: Associated Legendre Polynomials and Spherical Harmonics. (line 186) * gsl_sf_legendre_Plm_e: Associated Legendre Polynomials and Spherical Harmonics. (line 170) * gsl_sf_legendre_Pl_array: Legendre Polynomials. (line 24) * gsl_sf_legendre_Pl_deriv_array: Legendre Polynomials. (line 26) * gsl_sf_legendre_Pl_e: Legendre Polynomials. (line 19) * gsl_sf_legendre_Q0: Legendre Polynomials. (line 32) * gsl_sf_legendre_Q0_e: Legendre Polynomials. (line 33) * gsl_sf_legendre_Q1: Legendre Polynomials. (line 38) * gsl_sf_legendre_Q1_e: Legendre Polynomials. (line 39) * gsl_sf_legendre_Ql: Legendre Polynomials. (line 44) * gsl_sf_legendre_Ql_e: Legendre Polynomials. (line 45) * gsl_sf_legendre_sphPlm: Associated Legendre Polynomials and Spherical Harmonics. (line 175) * gsl_sf_legendre_sphPlm_array: Associated Legendre Polynomials and Spherical Harmonics. (line 192) * gsl_sf_legendre_sphPlm_deriv_array: Associated Legendre Polynomials and Spherical Harmonics. (line 194) * gsl_sf_legendre_sphPlm_e: Associated Legendre Polynomials and Spherical Harmonics. (line 176) * gsl_sf_lnbeta: Beta Functions. (line 13) * gsl_sf_lnbeta_e: Beta Functions. (line 14) * gsl_sf_lnchoose: Factorials. (line 44) * gsl_sf_lnchoose_e: Factorials. (line 45) * gsl_sf_lncosh: Hyperbolic Trigonometric Functions. (line 10) * gsl_sf_lncosh_e: Hyperbolic Trigonometric Functions. (line 11) * gsl_sf_lndoublefact: Factorials. (line 32) * gsl_sf_lndoublefact_e: Factorials. (line 33) * gsl_sf_lnfact: Factorials. (line 25) * gsl_sf_lnfact_e: Factorials. (line 26) * gsl_sf_lngamma: Gamma Functions. (line 22) * gsl_sf_lngamma_complex_e: Gamma Functions. (line 54) * gsl_sf_lngamma_e: Gamma Functions. (line 23) * gsl_sf_lngamma_sgn_e: Gamma Functions. (line 30) * gsl_sf_lnpoch: Pochhammer Symbol. (line 14) * gsl_sf_lnpoch_e: Pochhammer Symbol. (line 15) * gsl_sf_lnpoch_sgn_e: Pochhammer Symbol. (line 20) * gsl_sf_lnsinh: Hyperbolic Trigonometric Functions. (line 6) * gsl_sf_lnsinh_e: Hyperbolic Trigonometric Functions. (line 7) * gsl_sf_log: Logarithm and Related Functions. (line 10) * gsl_sf_log_1plusx: Logarithm and Related Functions. (line 25) * gsl_sf_log_1plusx_e: Logarithm and Related Functions. (line 26) * gsl_sf_log_1plusx_mx: Logarithm and Related Functions. (line 30) * gsl_sf_log_1plusx_mx_e: Logarithm and Related Functions. (line 31) * gsl_sf_log_abs: Logarithm and Related Functions. (line 14) * gsl_sf_log_abs_e: Logarithm and Related Functions. (line 15) * gsl_sf_log_e: Logarithm and Related Functions. (line 11) * gsl_sf_log_erfc: Log Complementary Error Function. (line 6) * gsl_sf_log_erfc_e: Log Complementary Error Function. (line 7) * gsl_sf_mathieu_a: Mathieu Function Characteristic Values. (line 6) * gsl_sf_mathieu_alloc: Mathieu Function Workspace. (line 10) * gsl_sf_mathieu_a_array: Mathieu Function Characteristic Values. (line 15) * gsl_sf_mathieu_a_e: Mathieu Function Characteristic Values. (line 7) * gsl_sf_mathieu_b: Mathieu Function Characteristic Values. (line 9) * gsl_sf_mathieu_b_array: Mathieu Function Characteristic Values. (line 18) * gsl_sf_mathieu_b_e: Mathieu Function Characteristic Values. (line 10) * gsl_sf_mathieu_ce: Angular Mathieu Functions. (line 6) * gsl_sf_mathieu_ce_array: Angular Mathieu Functions. (line 15) * gsl_sf_mathieu_ce_e: Angular Mathieu Functions. (line 7) * gsl_sf_mathieu_free: Mathieu Function Workspace. (line 17) * gsl_sf_mathieu_Mc: Radial Mathieu Functions. (line 6) * gsl_sf_mathieu_Mc_array: Radial Mathieu Functions. (line 19) * gsl_sf_mathieu_Mc_e: Radial Mathieu Functions. (line 7) * gsl_sf_mathieu_Ms: Radial Mathieu Functions. (line 9) * gsl_sf_mathieu_Ms_array: Radial Mathieu Functions. (line 22) * gsl_sf_mathieu_Ms_e: Radial Mathieu Functions. (line 10) * gsl_sf_mathieu_se: Angular Mathieu Functions. (line 9) * gsl_sf_mathieu_se_array: Angular Mathieu Functions. (line 18) * gsl_sf_mathieu_se_e: Angular Mathieu Functions. (line 10) * gsl_sf_multiply_e: Elementary Operations. (line 10) * gsl_sf_multiply_err_e: Elementary Operations. (line 15) * gsl_sf_poch: Pochhammer Symbol. (line 6) * gsl_sf_pochrel: Pochhammer Symbol. (line 27) * gsl_sf_pochrel_e: Pochhammer Symbol. (line 28) * gsl_sf_poch_e: Pochhammer Symbol. (line 7) * gsl_sf_polar_to_rect: Conversion Functions. (line 6) * gsl_sf_pow_int: Power Function. (line 10) * gsl_sf_pow_int_e: Power Function. (line 11) * gsl_sf_psi: Digamma Function. (line 11) * gsl_sf_psi_1: Trigamma Function. (line 11) * gsl_sf_psi_1piy: Digamma Function. (line 16) * gsl_sf_psi_1piy_e: Digamma Function. (line 17) * gsl_sf_psi_1_e: Trigamma Function. (line 12) * gsl_sf_psi_1_int: Trigamma Function. (line 6) * gsl_sf_psi_1_int_e: Trigamma Function. (line 7) * gsl_sf_psi_e: Digamma Function. (line 12) * gsl_sf_psi_int: Digamma Function. (line 6) * gsl_sf_psi_int_e: Digamma Function. (line 7) * gsl_sf_psi_n: Polygamma Function. (line 6) * gsl_sf_psi_n_e: Polygamma Function. (line 7) * gsl_sf_rect_to_polar: Conversion Functions. (line 12) * gsl_sf_Shi: Hyperbolic Integrals. (line 6) * gsl_sf_Shi_e: Hyperbolic Integrals. (line 7) * gsl_sf_Si: Trigonometric Integrals. (line 6) * gsl_sf_sin: Circular Trigonometric Functions. (line 6) * gsl_sf_sinc: Circular Trigonometric Functions. (line 20) * gsl_sf_sinc_e: Circular Trigonometric Functions. (line 21) * gsl_sf_sin_e: Circular Trigonometric Functions. (line 7) * gsl_sf_sin_err_e: Trigonometric Functions With Error Estimates. (line 6) * gsl_sf_Si_e: Trigonometric Integrals. (line 7) * gsl_sf_synchrotron_1: Synchrotron Functions. (line 9) * gsl_sf_synchrotron_1_e: Synchrotron Functions. (line 10) * gsl_sf_synchrotron_2: Synchrotron Functions. (line 15) * gsl_sf_synchrotron_2_e: Synchrotron Functions. (line 16) * gsl_sf_taylorcoeff: Factorials. (line 50) * gsl_sf_taylorcoeff_e: Factorials. (line 51) * gsl_sf_transport_2: Transport Functions. (line 10) * gsl_sf_transport_2_e: Transport Functions. (line 11) * gsl_sf_transport_3: Transport Functions. (line 15) * gsl_sf_transport_3_e: Transport Functions. (line 16) * gsl_sf_transport_4: Transport Functions. (line 20) * gsl_sf_transport_4_e: Transport Functions. (line 21) * gsl_sf_transport_5: Transport Functions. (line 25) * gsl_sf_transport_5_e: Transport Functions. (line 26) * gsl_sf_zeta: Riemann Zeta Function. (line 14) * gsl_sf_zetam1: Riemann Zeta Function Minus One. (line 14) * gsl_sf_zetam1_e: Riemann Zeta Function Minus One. (line 15) * gsl_sf_zetam1_int: Riemann Zeta Function Minus One. (line 10) * gsl_sf_zetam1_int_e: Riemann Zeta Function Minus One. (line 11) * gsl_sf_zeta_e: Riemann Zeta Function. (line 15) * gsl_sf_zeta_int: Riemann Zeta Function. (line 9) * gsl_sf_zeta_int_e: Riemann Zeta Function. (line 10) * GSL_SIGN: Testing the Sign of Numbers. (line 6) * gsl_siman_solve: Simulated Annealing functions. (line 6) * gsl_sort: Sorting vectors. (line 23) * gsl_sort2: Sorting vectors. (line 28) * gsl_sort_index: Sorting vectors. (line 44) * gsl_sort_largest: Selecting the k smallest or largest elements. (line 23) * gsl_sort_largest_index: Selecting the k smallest or largest elements. (line 49) * gsl_sort_smallest: Selecting the k smallest or largest elements. (line 16) * gsl_sort_smallest_index: Selecting the k smallest or largest elements. (line 41) * gsl_sort_vector: Sorting vectors. (line 35) * gsl_sort_vector2: Sorting vectors. (line 39) * gsl_sort_vector_index: Sorting vectors. (line 54) * gsl_sort_vector_largest: Selecting the k smallest or largest elements. (line 32) * gsl_sort_vector_largest_index: Selecting the k smallest or largest elements. (line 59) * gsl_sort_vector_smallest: Selecting the k smallest or largest elements. (line 30) * gsl_sort_vector_smallest_index: Selecting the k smallest or largest elements. (line 57) * gsl_spblas_dgemm: Sparse BLAS operations. (line 15) * gsl_spblas_dgemv: Sparse BLAS operations. (line 6) * gsl_splinalg_itersolve_alloc: Iterating the Sparse Linear System. (line 9) * gsl_splinalg_itersolve_free: Iterating the Sparse Linear System. (line 18) * gsl_splinalg_itersolve_gmres: Sparse Iterative Solvers Types. (line 9) * gsl_splinalg_itersolve_iterate: Iterating the Sparse Linear System. (line 26) * gsl_splinalg_itersolve_name: Iterating the Sparse Linear System. (line 22) * gsl_splinalg_itersolve_normr: Iterating the Sparse Linear System. (line 44) * gsl_spline2d_alloc: 2D Higher-level Interface. (line 13) * gsl_spline2d_eval: 2D Higher-level Interface. (line 28) * gsl_spline2d_eval_deriv_x: 2D Higher-level Interface. (line 35) * gsl_spline2d_eval_deriv_xx: 2D Higher-level Interface. (line 49) * gsl_spline2d_eval_deriv_xx_e: 2D Higher-level Interface. (line 52) * gsl_spline2d_eval_deriv_xy: 2D Higher-level Interface. (line 63) * gsl_spline2d_eval_deriv_xy_e: 2D Higher-level Interface. (line 66) * gsl_spline2d_eval_deriv_x_e: 2D Higher-level Interface. (line 38) * gsl_spline2d_eval_deriv_y: 2D Higher-level Interface. (line 42) * gsl_spline2d_eval_deriv_yy: 2D Higher-level Interface. (line 56) * gsl_spline2d_eval_deriv_yy_e: 2D Higher-level Interface. (line 59) * gsl_spline2d_eval_deriv_y_e: 2D Higher-level Interface. (line 45) * gsl_spline2d_eval_e: 2D Higher-level Interface. (line 31) * gsl_spline2d_free: 2D Higher-level Interface. (line 20) * gsl_spline2d_get: 2D Higher-level Interface. (line 73) * gsl_spline2d_init: 2D Higher-level Interface. (line 16) * gsl_spline2d_min_size: 2D Higher-level Interface. (line 25) * gsl_spline2d_name: 2D Higher-level Interface. (line 22) * gsl_spline2d_set: 2D Higher-level Interface. (line 70) * gsl_spline_alloc: 1D Higher-level Interface. (line 13) * gsl_spline_eval: 1D Higher-level Interface. (line 26) * gsl_spline_eval_deriv: 1D Higher-level Interface. (line 31) * gsl_spline_eval_deriv2: 1D Higher-level Interface. (line 36) * gsl_spline_eval_deriv2_e: 1D Higher-level Interface. (line 38) * gsl_spline_eval_deriv_e: 1D Higher-level Interface. (line 33) * gsl_spline_eval_e: 1D Higher-level Interface. (line 28) * gsl_spline_eval_integ: 1D Higher-level Interface. (line 41) * gsl_spline_eval_integ_e: 1D Higher-level Interface. (line 43) * gsl_spline_free: 1D Higher-level Interface. (line 19) * gsl_spline_init: 1D Higher-level Interface. (line 16) * gsl_spline_min_size: 1D Higher-level Interface. (line 23) * gsl_spline_name: 1D Higher-level Interface. (line 21) * gsl_spmatrix_add: Sparse Matrices Operations. (line 6) * gsl_spmatrix_alloc: Sparse Matrices Allocation. (line 12) * gsl_spmatrix_alloc_nzmax: Sparse Matrices Allocation. (line 26) * gsl_spmatrix_ccs: Sparse Matrices Compressed Format. (line 9) * gsl_spmatrix_crs: Sparse Matrices Compressed Format. (line 16) * gsl_spmatrix_d2sp: Sparse Matrices Conversion Between Sparse and Dense. (line 9) * gsl_spmatrix_equal: Sparse Matrices Properties. (line 9) * gsl_spmatrix_fprintf: Sparse Matrices Reading and Writing. (line 24) * gsl_spmatrix_fread: Sparse Matrices Reading and Writing. (line 14) * gsl_spmatrix_free: Sparse Matrices Allocation. (line 56) * gsl_spmatrix_fscanf: Sparse Matrices Reading and Writing. (line 34) * gsl_spmatrix_fwrite: Sparse Matrices Reading and Writing. (line 6) * gsl_spmatrix_get: Sparse Matrices Accessing Elements. (line 6) * gsl_spmatrix_memcpy: Sparse Matrices Copying. (line 6) * gsl_spmatrix_minmax: Sparse Matrices Finding Maximum and Minimum Elements. (line 6) * gsl_spmatrix_nnz: Sparse Matrices Properties. (line 6) * gsl_spmatrix_ptr: Sparse Matrices Accessing Elements. (line 16) * gsl_spmatrix_realloc: Sparse Matrices Allocation. (line 49) * gsl_spmatrix_scale: Sparse Matrices Operations. (line 11) * gsl_spmatrix_set: Sparse Matrices Accessing Elements. (line 11) * gsl_spmatrix_set_zero: Sparse Matrices Initializing Elements. (line 11) * gsl_spmatrix_sp2d: Sparse Matrices Conversion Between Sparse and Dense. (line 14) * gsl_spmatrix_transpose: Sparse Matrices Exchanging Rows and Columns. (line 13) * gsl_spmatrix_transpose2: Sparse Matrices Exchanging Rows and Columns. (line 18) * gsl_spmatrix_transpose_memcpy: Sparse Matrices Exchanging Rows and Columns. (line 6) * gsl_stats_absdev: Absolute deviation. (line 6) * gsl_stats_absdev_m: Absolute deviation. (line 19) * gsl_stats_correlation: Correlation. (line 6) * gsl_stats_covariance: Covariance. (line 6) * gsl_stats_covariance_m: Covariance. (line 14) * gsl_stats_kurtosis: Higher moments (skewness and kurtosis). (line 29) * gsl_stats_kurtosis_m_sd: Higher moments (skewness and kurtosis). (line 40) * gsl_stats_lag1_autocorrelation: Autocorrelation. (line 6) * gsl_stats_lag1_autocorrelation_m: Autocorrelation. (line 15) * gsl_stats_max: Maximum and Minimum values. (line 12) * gsl_stats_max_index: Maximum and Minimum values. (line 37) * gsl_stats_mean: Mean and standard deviation and variance. (line 6) * gsl_stats_median_from_sorted_data: Median and Percentiles. (line 10) * gsl_stats_min: Maximum and Minimum values. (line 22) * gsl_stats_minmax: Maximum and Minimum values. (line 32) * gsl_stats_minmax_index: Maximum and Minimum values. (line 53) * gsl_stats_min_index: Maximum and Minimum values. (line 45) * gsl_stats_quantile_from_sorted_data: Median and Percentiles. (line 25) * gsl_stats_sd: Mean and standard deviation and variance. (line 44) * gsl_stats_sd_m: Mean and standard deviation and variance. (line 46) * gsl_stats_sd_with_fixed_mean: Mean and standard deviation and variance. (line 73) * gsl_stats_skew: Higher moments (skewness and kurtosis). (line 6) * gsl_stats_skew_m_sd: Higher moments (skewness and kurtosis). (line 19) * gsl_stats_spearman: Correlation. (line 18) * gsl_stats_tss: Mean and standard deviation and variance. (line 52) * gsl_stats_tss_m: Mean and standard deviation and variance. (line 54) * gsl_stats_variance: Mean and standard deviation and variance. (line 18) * gsl_stats_variance_m: Mean and standard deviation and variance. (line 36) * gsl_stats_variance_with_fixed_mean: Mean and standard deviation and variance. (line 63) * gsl_stats_wabsdev: Weighted Samples. (line 83) * gsl_stats_wabsdev_m: Weighted Samples. (line 91) * gsl_stats_wkurtosis: Weighted Samples. (line 110) * gsl_stats_wkurtosis_m_sd: Weighted Samples. (line 116) * gsl_stats_wmean: Weighted Samples. (line 14) * gsl_stats_wsd: Weighted Samples. (line 42) * gsl_stats_wsd_m: Weighted Samples. (line 48) * gsl_stats_wsd_with_fixed_mean: Weighted Samples. (line 64) * gsl_stats_wskew: Weighted Samples. (line 97) * gsl_stats_wskew_m_sd: Weighted Samples. (line 103) * gsl_stats_wtss: Weighted Samples. (line 71) * gsl_stats_wtss_m: Weighted Samples. (line 73) * gsl_stats_wvariance: Weighted Samples. (line 22) * gsl_stats_wvariance_m: Weighted Samples. (line 36) * gsl_stats_wvariance_with_fixed_mean: Weighted Samples. (line 53) * gsl_strerror: Error Codes. (line 37) * gsl_sum_levin_utrunc_accel: Acceleration functions without error estimation. (line 32) * gsl_sum_levin_utrunc_alloc: Acceleration functions without error estimation. (line 22) * gsl_sum_levin_utrunc_free: Acceleration functions without error estimation. (line 28) * gsl_sum_levin_u_accel: Acceleration functions. (line 31) * gsl_sum_levin_u_alloc: Acceleration functions. (line 23) * gsl_sum_levin_u_free: Acceleration functions. (line 28) * gsl_vector_add: Vector operations. (line 6) * gsl_vector_add_constant: Vector operations. (line 32) * gsl_vector_alloc: Vector allocation. (line 14) * gsl_vector_calloc: Vector allocation. (line 21) * gsl_vector_complex_const_imag: Vector views. (line 108) * gsl_vector_complex_const_real: Vector views. (line 97) * gsl_vector_complex_imag: Vector views. (line 106) * gsl_vector_complex_real: Vector views. (line 95) * gsl_vector_const_ptr: Accessing vector elements. (line 54) * gsl_vector_const_subvector: Vector views. (line 29) * gsl_vector_const_subvector_with_stride: Vector views. (line 59) * gsl_vector_const_view_array: Vector views. (line 119) * gsl_vector_const_view_array_with_stride: Vector views. (line 142) * gsl_vector_div: Vector operations. (line 23) * gsl_vector_equal: Vector properties. (line 18) * gsl_vector_fprintf: Reading and writing vectors. (line 26) * gsl_vector_fread: Reading and writing vectors. (line 17) * gsl_vector_free: Vector allocation. (line 25) * gsl_vector_fscanf: Reading and writing vectors. (line 34) * gsl_vector_fwrite: Reading and writing vectors. (line 9) * gsl_vector_get: Accessing vector elements. (line 39) * gsl_vector_isneg: Vector properties. (line 12) * gsl_vector_isnonneg: Vector properties. (line 13) * gsl_vector_isnull: Vector properties. (line 10) * gsl_vector_ispos: Vector properties. (line 11) * gsl_vector_max: Finding maximum and minimum elements of vectors. (line 8) * gsl_vector_max_index: Finding maximum and minimum elements of vectors. (line 19) * gsl_vector_memcpy: Copying vectors. (line 12) * gsl_vector_min: Finding maximum and minimum elements of vectors. (line 11) * gsl_vector_minmax: Finding maximum and minimum elements of vectors. (line 14) * gsl_vector_minmax_index: Finding maximum and minimum elements of vectors. (line 29) * gsl_vector_min_index: Finding maximum and minimum elements of vectors. (line 24) * gsl_vector_mul: Vector operations. (line 17) * gsl_vector_ptr: Accessing vector elements. (line 53) * gsl_vector_reverse: Exchanging elements. (line 14) * gsl_vector_scale: Vector operations. (line 28) * gsl_vector_set: Accessing vector elements. (line 46) * gsl_vector_set_all: Initializing vector elements. (line 6) * gsl_vector_set_basis: Initializing vector elements. (line 12) * gsl_vector_set_zero: Initializing vector elements. (line 9) * gsl_vector_sub: Vector operations. (line 11) * gsl_vector_subvector: Vector views. (line 27) * gsl_vector_subvector_with_stride: Vector views. (line 57) * gsl_vector_swap: Copying vectors. (line 17) * gsl_vector_swap_elements: Exchanging elements. (line 9) * gsl_vector_view_array: Vector views. (line 117) * gsl_vector_view_array_with_stride: Vector views. (line 140) * gsl_wavelet2d_nstransform: DWT in two dimension. (line 64) * gsl_wavelet2d_nstransform_forward: DWT in two dimension. (line 67) * gsl_wavelet2d_nstransform_inverse: DWT in two dimension. (line 70) * gsl_wavelet2d_nstransform_matrix: DWT in two dimension. (line 76) * gsl_wavelet2d_nstransform_matrix_forward: DWT in two dimension. (line 79) * gsl_wavelet2d_nstransform_matrix_inverse: DWT in two dimension. (line 81) * gsl_wavelet2d_transform: DWT in two dimension. (line 29) * gsl_wavelet2d_transform_forward: DWT in two dimension. (line 32) * gsl_wavelet2d_transform_inverse: DWT in two dimension. (line 35) * gsl_wavelet2d_transform_matrix: DWT in two dimension. (line 54) * gsl_wavelet2d_transform_matrix_forward: DWT in two dimension. (line 57) * gsl_wavelet2d_transform_matrix_inverse: DWT in two dimension. (line 59) * gsl_wavelet_alloc: DWT Initialization. (line 9) * gsl_wavelet_bspline: DWT Initialization. (line 29) * gsl_wavelet_bspline_centered: DWT Initialization. (line 30) * gsl_wavelet_daubechies: DWT Initialization. (line 18) * gsl_wavelet_daubechies_centered: DWT Initialization. (line 19) * gsl_wavelet_free: DWT Initialization. (line 44) * gsl_wavelet_haar: DWT Initialization. (line 24) * gsl_wavelet_haar_centered: DWT Initialization. (line 25) * gsl_wavelet_name: DWT Initialization. (line 40) * gsl_wavelet_transform: DWT in one dimension. (line 6) * gsl_wavelet_transform_forward: DWT in one dimension. (line 9) * gsl_wavelet_transform_inverse: DWT in one dimension. (line 12) * gsl_wavelet_workspace_alloc: DWT Initialization. (line 51) * gsl_wavelet_workspace_free: DWT Initialization. (line 61) gsl-doc-2.3/doc/rand-beta.tex0000664000175000017500000006044512616157443014130 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-beta.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-beta.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 811 631 M -31 0 V 31 1078 R -31 0 V 31 1079 R -31 0 V 31 1078 R -31 0 V 31 1078 R -31 0 V 811 631 M 0 -31 V 1512 31 R 0 -31 V 1513 31 R 0 -31 V 1512 31 R 0 -31 V 1512 31 R 0 -31 V 811 4944 M 811 631 L 6049 0 V 0 4313 V -6049 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 811 631 M 20 22 V 20 21 V 21 21 V 20 21 V 20 21 V 20 21 V 21 21 V 20 20 V 20 21 V 20 20 V 21 20 V 20 20 V 20 20 V 20 20 V 20 19 V 21 20 V 20 19 V 20 19 V 20 19 V 21 19 V 20 18 V 20 19 V 20 18 V 21 19 V 20 18 V 20 18 V 20 17 V 20 18 V 21 18 V 20 17 V 20 17 V 20 17 V 21 17 V 20 17 V 20 17 V 20 16 V 21 17 V 20 16 V 20 16 V 20 16 V 20 15 V 21 16 V 20 16 V 20 15 V 20 15 V 21 15 V 20 15 V 20 15 V 20 14 V 21 15 V 20 14 V 20 14 V 20 14 V 20 14 V 21 14 V 20 14 V 20 13 V 20 14 V 21 13 V 20 13 V 20 13 V 20 12 V 21 13 V 20 12 V 20 13 V 20 12 V 20 12 V 21 12 V 20 11 V 20 12 V 20 11 V 21 12 V 20 11 V 20 11 V 20 11 V 21 10 V 20 11 V 20 10 V 20 11 V 20 10 V 21 10 V 20 10 V 20 9 V 20 10 V 21 9 V 20 10 V 20 9 V 20 9 V 21 9 V 20 8 V 20 9 V 20 8 V 20 8 V 21 8 V 20 8 V 20 8 V 20 8 V 21 7 V 20 8 V 20 7 V 20 7 V 21 7 V 2895 2092 L 20 7 V 20 6 V 20 6 V 21 7 V 20 6 V 20 6 V 20 5 V 21 6 V 20 6 V 20 5 V 20 5 V 21 5 V 20 5 V 20 5 V 20 5 V 20 4 V 21 4 V 20 5 V 20 4 V 20 4 V 21 3 V 20 4 V 20 3 V 20 4 V 21 3 V 20 3 V 20 3 V 20 3 V 20 2 V 21 3 V 20 2 V 20 2 V 20 2 V 21 2 V 20 2 V 20 1 V 20 2 V 21 1 V 20 1 V 20 1 V 20 1 V 20 1 V 21 0 V 20 1 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 -1 V 21 0 V 20 -1 V 20 -1 V 20 -1 V 20 -1 V 21 -1 V 20 -2 V 20 -1 V 20 -2 V 21 -2 V 20 -2 V 20 -2 V 20 -2 V 21 -3 V 20 -2 V 20 -3 V 20 -3 V 20 -3 V 21 -3 V 20 -4 V 20 -3 V 20 -4 V 21 -3 V 20 -4 V 20 -4 V 20 -5 V 21 -4 V 20 -4 V 20 -5 V 20 -5 V 20 -5 V 21 -5 V 20 -5 V 20 -5 V 20 -6 V 21 -6 V 20 -5 V 20 -6 V 20 -6 V 21 -7 V 20 -6 V 20 -6 V 20 -7 V 20 -7 V 21 -7 V 20 -7 V 20 -7 V 20 -8 V 21 -7 V 20 -8 V 20 -8 V 20 -8 V 21 -8 V 20 -8 V 5019 2001 L 20 -9 V 20 -8 V 21 -9 V 20 -9 V 20 -9 V 20 -10 V 21 -9 V 20 -10 V 20 -9 V 20 -10 V 21 -10 V 20 -10 V 20 -11 V 20 -10 V 20 -11 V 21 -10 V 20 -11 V 20 -11 V 20 -11 V 21 -12 V 20 -11 V 20 -12 V 20 -11 V 21 -12 V 20 -12 V 20 -12 V 20 -13 V 20 -12 V 21 -13 V 20 -12 V 20 -13 V 20 -13 V 21 -13 V 20 -14 V 20 -13 V 20 -14 V 21 -14 V 20 -14 V 20 -14 V 20 -14 V 20 -14 V 21 -15 V 20 -14 V 20 -15 V 20 -15 V 21 -15 V 20 -15 V 20 -15 V 20 -16 V 21 -16 V 20 -15 V 20 -16 V 20 -16 V 20 -16 V 21 -17 V 20 -16 V 20 -17 V 20 -17 V 21 -17 V 20 -17 V 20 -17 V 20 -17 V 21 -18 V 20 -18 V 20 -17 V 20 -18 V 20 -18 V 21 -19 V 20 -18 V 20 -19 V 20 -18 V 21 -19 V 20 -19 V 20 -19 V 20 -19 V 21 -20 V 20 -19 V 20 -20 V 20 -20 V 20 -20 V 21 -20 V 20 -20 V 20 -21 V 20 -20 V 21 -21 V 20 -21 V 20 -21 V 20 -21 V 21 -21 V 20 -21 V 20 -22 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 811 631 M 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 20 1 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 1 V 20 0 V 21 0 V 20 1 V 20 0 V 20 0 V 20 1 V 21 0 V 20 0 V 20 1 V 20 0 V 21 1 V 20 0 V 20 1 V 20 1 V 21 0 V 20 1 V 20 1 V 20 0 V 20 1 V 21 1 V 20 1 V 20 1 V 20 1 V 21 1 V 20 1 V 20 1 V 20 1 V 21 1 V 20 1 V 20 2 V 20 1 V 20 1 V 21 2 V 20 1 V 20 2 V 20 1 V 21 2 V 20 2 V 20 2 V 20 1 V 21 2 V 20 2 V 20 2 V 20 2 V 20 3 V 21 2 V 20 2 V 20 2 V 20 3 V 21 2 V 20 3 V 20 2 V 20 3 V 21 3 V 20 3 V 20 3 V 20 3 V 20 3 V 21 3 V 20 3 V 20 3 V 20 4 V 21 3 V 20 4 V 20 3 V 20 4 V 21 4 V 20 4 V 20 4 V 20 4 V 20 4 V 21 4 V 20 4 V 20 5 V 20 4 V 21 5 V 20 5 V 20 4 V 20 5 V 21 5 V 2895 807 L 20 5 V 20 6 V 20 5 V 21 6 V 20 5 V 20 6 V 20 6 V 21 6 V 20 6 V 20 6 V 20 6 V 21 6 V 20 7 V 20 6 V 20 7 V 20 7 V 21 7 V 20 7 V 20 7 V 20 7 V 21 8 V 20 7 V 20 8 V 20 8 V 21 7 V 20 8 V 20 8 V 20 9 V 20 8 V 21 9 V 20 8 V 20 9 V 20 9 V 21 9 V 20 9 V 20 9 V 20 10 V 21 9 V 20 10 V 20 10 V 20 10 V 20 10 V 21 10 V 20 11 V 20 10 V 20 11 V 21 11 V 20 11 V 20 11 V 20 11 V 21 11 V 20 12 V 20 12 V 20 11 V 20 12 V 21 13 V 20 12 V 20 12 V 20 13 V 21 13 V 20 13 V 20 13 V 20 13 V 21 13 V 20 14 V 20 14 V 20 14 V 20 14 V 21 14 V 20 14 V 20 15 V 20 15 V 21 15 V 20 15 V 20 15 V 20 15 V 21 16 V 20 16 V 20 16 V 20 16 V 20 16 V 21 17 V 20 16 V 20 17 V 20 17 V 21 17 V 20 18 V 20 17 V 20 18 V 21 18 V 20 18 V 20 18 V 20 19 V 20 19 V 21 18 V 20 20 V 20 19 V 20 19 V 21 20 V 20 20 V 20 20 V 20 20 V 21 20 V 20 21 V 5019 2083 L 20 21 V 20 21 V 21 22 V 20 21 V 20 22 V 20 22 V 21 23 V 20 22 V 20 23 V 20 23 V 21 23 V 20 23 V 20 24 V 20 23 V 20 24 V 21 24 V 20 25 V 20 24 V 20 25 V 21 25 V 20 26 V 20 25 V 20 26 V 21 26 V 20 26 V 20 26 V 20 27 V 20 27 V 21 27 V 20 27 V 20 28 V 20 27 V 21 28 V 20 29 V 20 28 V 20 29 V 21 29 V 20 29 V 20 29 V 20 30 V 20 30 V 21 30 V 20 30 V 20 31 V 20 31 V 21 31 V 20 31 V 20 32 V 20 32 V 21 32 V 20 32 V 20 33 V 20 33 V 20 33 V 21 33 V 20 34 V 20 34 V 20 34 V 21 34 V 20 35 V 20 35 V 20 35 V 21 35 V 20 36 V 20 36 V 20 36 V 20 37 V 21 36 V 20 37 V 20 38 V 20 37 V 21 38 V 20 38 V 20 38 V 20 39 V 21 39 V 20 39 V 20 40 V 20 39 V 20 40 V 21 41 V 20 40 V 20 41 V 20 41 V 21 42 V 20 41 V 20 42 V 20 42 V 21 43 V 20 43 V 20 43 V stroke LT2 LTb LT2 6077 4381 M 543 0 V 811 4944 M 20 -43 V 20 -43 V 21 -43 V 20 -42 V 20 -42 V 20 -41 V 21 -42 V 20 -41 V 20 -41 V 20 -40 V 21 -41 V 20 -40 V 20 -39 V 20 -40 V 20 -39 V 21 -39 V 20 -39 V 20 -38 V 20 -38 V 21 -38 V 20 -37 V 20 -38 V 20 -37 V 21 -36 V 20 -37 V 20 -36 V 20 -36 V 20 -36 V 21 -35 V 20 -35 V 20 -35 V 20 -35 V 21 -34 V 20 -34 V 20 -34 V 20 -34 V 21 -33 V 20 -33 V 20 -33 V 20 -33 V 20 -32 V 21 -32 V 20 -32 V 20 -32 V 20 -31 V 21 -31 V 20 -31 V 20 -31 V 20 -30 V 21 -30 V 20 -30 V 20 -30 V 20 -29 V 20 -29 V 21 -29 V 20 -29 V 20 -28 V 20 -29 V 21 -28 V 20 -27 V 20 -28 V 20 -27 V 21 -27 V 20 -27 V 20 -27 V 20 -26 V 20 -26 V 21 -26 V 20 -26 V 20 -25 V 20 -26 V 21 -25 V 20 -25 V 20 -24 V 20 -25 V 21 -24 V 20 -24 V 20 -23 V 20 -24 V 20 -23 V 21 -23 V 20 -23 V 20 -23 V 20 -22 V 21 -23 V 20 -22 V 20 -22 V 20 -21 V 21 -22 V 20 -21 V 20 -21 V 20 -21 V 20 -21 V 21 -20 V 20 -20 V 20 -20 V 20 -20 V 21 -20 V 20 -19 V 20 -19 V 20 -20 V 21 -18 V 2895 1846 L 20 -19 V 20 -18 V 20 -18 V 21 -18 V 20 -18 V 20 -17 V 20 -18 V 21 -17 V 20 -17 V 20 -17 V 20 -16 V 21 -17 V 20 -16 V 20 -16 V 20 -16 V 20 -16 V 21 -16 V 20 -15 V 20 -15 V 20 -15 V 21 -15 V 20 -15 V 20 -15 V 20 -14 V 21 -14 V 20 -14 V 20 -14 V 20 -14 V 20 -14 V 21 -13 V 20 -13 V 20 -13 V 20 -13 V 21 -13 V 20 -13 V 20 -12 V 20 -12 V 21 -13 V 20 -12 V 20 -11 V 20 -12 V 20 -12 V 21 -11 V 20 -11 V 20 -11 V 20 -11 V 21 -11 V 20 -11 V 20 -10 V 20 -11 V 21 -10 V 20 -10 V 20 -10 V 20 -10 V 20 -10 V 21 -9 V 20 -10 V 20 -9 V 20 -9 V 21 -9 V 20 -9 V 20 -9 V 20 -8 V 21 -9 V 20 -8 V 20 -9 V 20 -8 V 20 -8 V 21 -7 V 20 -8 V 20 -8 V 20 -7 V 21 -8 V 20 -7 V 20 -7 V 20 -7 V 21 -7 V 20 -7 V 20 -7 V 20 -6 V 20 -7 V 21 -6 V 20 -6 V 20 -6 V 20 -6 V 21 -6 V 20 -6 V 20 -6 V 20 -5 V 21 -6 V 20 -5 V 20 -6 V 20 -5 V 20 -5 V 21 -5 V 20 -5 V 20 -4 V 20 -5 V 21 -5 V 20 -4 V 20 -5 V 20 -4 V 21 -4 V 20 -4 V 5019 753 L 20 -4 V 20 -4 V 21 -4 V 20 -4 V 20 -3 V 20 -4 V 21 -3 V 20 -4 V 20 -3 V 20 -3 V 21 -3 V 20 -3 V 20 -3 V 20 -3 V 20 -3 V 21 -3 V 20 -3 V 20 -2 V 20 -3 V 21 -2 V 20 -3 V 20 -2 V 20 -2 V 21 -2 V 20 -3 V 20 -2 V 20 -2 V 20 -2 V 21 -2 V 20 -1 V 20 -2 V 20 -2 V 21 -2 V 20 -1 V 20 -2 V 20 -1 V 21 -2 V 20 -1 V 20 -1 V 20 -2 V 20 -1 V 21 -1 V 20 -1 V 20 -1 V 20 -1 V 21 -1 V 20 -1 V 20 -1 V 20 -1 V 21 -1 V 20 -1 V 20 0 V 20 -1 V 20 -1 V 21 0 V 20 -1 V 20 -1 V 20 0 V 21 -1 V 20 0 V 20 -1 V 20 0 V 21 0 V 20 -1 V 20 0 V 20 0 V 20 -1 V 21 0 V 20 0 V 20 -1 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 -1 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V 20 0 V 21 0 V 20 0 V 20 0 V stroke 0.500 UL LTb 811 4944 M 811 631 L 6049 0 V 0 4313 V -6049 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4381){\rjust{\strut{}$a=1,b=4$}}% \put(5957,4581){\rjust{\strut{}$a=4,b=1$}}% \put(5957,4781){\rjust{\strut{}$a=2,b=2$}}% \put(3835,5244){\cjust{\strut{}Beta Distribution}}% \put(3835,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}1}}% \put(5348,400){\cjust{\strut{}0.75}}% \put(3836,400){\cjust{\strut{}0.5}}% \put(2323,400){\cjust{\strut{}0.25}}% \put(811,400){\cjust{\strut{}0}}% \put(660,4944){\rjust{\strut{} 4}}% \put(660,3866){\rjust{\strut{} 3}}% \put(660,2788){\rjust{\strut{} 2}}% \put(660,1709){\rjust{\strut{} 1}}% \put(660,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/rand-logarithmic.tex0000664000175000017500000004764212616157443015523 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-logarithmic.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-logarithmic.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 3582 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -2328 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -669 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 2994 1216 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -278 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -135 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -72 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -40 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 4956 691 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -23 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -14 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 -9 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -5 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.7$}}% \put(3955,5244){\cjust{\strut{}Logarithmic Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.7}}% \put(900,4328){\rjust{\strut{} 0.6}}% \put(900,3712){\rjust{\strut{} 0.5}}% \put(900,3096){\rjust{\strut{} 0.4}}% \put(900,2479){\rjust{\strut{} 0.3}}% \put(900,1863){\rjust{\strut{} 0.2}}% \put(900,1247){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/specfunc-hyperg.texi0000664000175000017500000001252412616157443015541 0ustar eddedd@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) = F(a,b,c,x)$} @math{2F1(a,b,c,x) = F(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}. @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 gsl-doc-2.3/doc/cheb.eps0000664000175000017500000007327712616157443013172 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-landau.tex0000664000175000017500000004534312616157443014461 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-landau.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-landau.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -31 V 387 31 R 0 -31 V 388 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 388 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 388 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 387 31 R 0 -31 V 388 31 R 0 -31 V 387 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 1051 631 M 39 0 V 38 0 V 39 0 V 39 0 V 39 0 V 38 0 V 39 0 V 39 0 V 39 0 V 38 0 V 39 0 V 39 0 V 38 0 V 39 0 V 39 0 V 39 0 V 38 1 V 39 2 V 39 4 V 39 8 V 38 13 V 39 22 V 39 35 V 38 51 V 39 72 V 39 95 V 39 121 V 38 149 V 39 175 V 39 201 V 39 221 V 38 238 V 39 250 V 39 255 V 38 255 V 39 249 V 39 238 V 39 223 V 38 204 V 39 183 V 39 159 V 39 136 V 38 112 V 39 87 V 39 65 V 38 43 V 39 24 V 39 4 V 39 -11 V 38 -27 V 39 -40 V 39 -50 V 39 -61 V 38 -68 V 39 -75 V 39 -80 V 38 -84 V 39 -87 V 39 -90 V 39 -91 V 38 -91 V 39 -91 V 39 -91 V 39 -90 V 38 -89 V 39 -87 V 39 -86 V 38 -83 V 39 -81 V 39 -80 V 39 -76 V 38 -75 V 39 -72 V 39 -69 V 38 -67 V 39 -65 V 39 -63 V 39 -60 V 38 -58 V 39 -56 V 39 -54 V 39 -51 V 38 -50 V 39 -48 V 39 -45 V 38 -45 V 39 -42 V 39 -41 V 39 -39 V 38 -37 V 39 -36 V 39 -35 V 39 -33 V 38 -32 V 39 -31 V 39 -30 V 38 -28 V 39 -28 V 39 -26 V 39 -25 V 38 -25 V 39 -23 V 39 -23 V 39 -22 V 5117 1362 L 39 -20 V 39 -19 V 38 -19 V 39 -18 V 39 -18 V 39 -16 V 38 -17 V 39 -15 V 39 -15 V 39 -15 V 38 -14 V 39 -14 V 39 -13 V 38 -13 V 39 -12 V 39 -12 V 39 -11 V 38 -11 V 39 -11 V 39 -11 V 39 -10 V 38 -9 V 39 -10 V 39 -9 V 38 -9 V 39 -8 V 39 -9 V 39 -8 V 38 -8 V 39 -7 V 39 -8 V 39 -7 V 38 -7 V 39 -7 V 39 -6 V 38 -7 V 39 -6 V 39 -6 V 39 -6 V 38 -5 V 39 -6 V 39 -5 V 39 -6 V 38 -5 V 39 -5 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(3955,5244){\cjust{\strut{}Landau Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}10}}% \put(6473,400){\cjust{\strut{}9}}% \put(6085,400){\cjust{\strut{}8}}% \put(5698,400){\cjust{\strut{}7}}% \put(5311,400){\cjust{\strut{}6}}% \put(4924,400){\cjust{\strut{}5}}% \put(4536,400){\cjust{\strut{}4}}% \put(4149,400){\cjust{\strut{}3}}% \put(3762,400){\cjust{\strut{}2}}% \put(3375,400){\cjust{\strut{}1}}% \put(2987,400){\cjust{\strut{}0}}% \put(2600,400){\cjust{\strut{}-1}}% \put(2213,400){\cjust{\strut{}-2}}% \put(1826,400){\cjust{\strut{}-3}}% \put(1438,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4944){\rjust{\strut{} 0.2}}% \put(900,2788){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/err.texi0000664000175000017500000002526512616157443013235 0ustar eddedd@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 @deftypevr {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 deftypevr @deftypevr {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 deftypevr @deftypevr {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 deftypevr @deftypevr {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 deftypevr 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 #include #include ... int status; size_t n = 37; gsl_set_error_handler_off(); status = gsl_fft_complex_radix2_forward (data, stride, 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. gsl-doc-2.3/doc/rand-exppow.tex0000664000175000017500000005374712616157443014546 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-exppow.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-exppow.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1078 R -31 0 V 31 1079 R -31 0 V 31 1078 R -31 0 V 31 1078 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 1 V 19 0 V 20 0 V 19 0 V 20 1 V 19 0 V 19 1 V 20 1 V 19 1 V 20 2 V 19 2 V 20 2 V 19 3 V 19 4 V 20 4 V 19 6 V 20 6 V 19 8 V 20 9 V 19 11 V 19 13 V 20 14 V 19 17 V 20 20 V 3052 780 L 20 26 V 19 29 V 19 33 V 20 36 V 19 41 V 20 45 V 19 50 V 20 54 V 19 59 V 19 64 V 20 68 V 19 73 V 20 78 V 19 81 V 20 86 V 19 90 V 19 93 V 20 96 V 19 99 V 20 100 V 19 102 V 20 102 V 19 103 V 19 102 V 20 101 V 19 99 V 20 96 V 19 93 V 20 90 V 19 85 V 19 81 V 20 75 V 19 70 V 20 64 V 19 59 V 20 52 V 19 46 V 19 40 V 20 34 V 19 28 V 20 22 V 19 18 V 20 12 V 19 8 V 19 4 V 20 2 V 19 0 V 20 -2 V 19 -4 V 19 -8 V 20 -12 V 19 -18 V 20 -22 V 19 -28 V 20 -34 V 19 -40 V 19 -46 V 20 -52 V 19 -59 V 20 -64 V 19 -70 V 20 -75 V 19 -81 V 19 -85 V 20 -90 V 19 -93 V 20 -96 V 19 -99 V 20 -101 V 19 -102 V 19 -103 V 20 -102 V 19 -102 V 20 -100 V 19 -99 V 20 -96 V 19 -93 V 19 -90 V 20 -86 V 19 -81 V 20 -78 V 19 -73 V 20 -68 V 19 -64 V 19 -59 V 20 -54 V 19 -50 V 20 -45 V 19 -41 V 20 -36 V 19 -33 V 19 -29 V 20 -26 V 19 -23 V 20 -20 V 19 -17 V 20 -14 V 19 -13 V 19 -11 V 20 -9 V 19 -8 V 20 -6 V 19 -6 V 20 -4 V 5092 645 L 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 775 M 19 1 V 20 1 V 19 1 V 20 1 V 19 2 V 20 1 V 19 1 V 19 1 V 20 1 V 19 1 V 20 2 V 19 1 V 20 1 V 19 1 V 19 2 V 20 1 V 19 1 V 20 2 V 19 1 V 20 1 V 19 2 V 19 1 V 20 1 V 19 2 V 20 1 V 19 2 V 20 1 V 19 2 V 19 1 V 20 2 V 19 1 V 20 2 V 19 1 V 20 2 V 19 1 V 19 2 V 20 2 V 19 1 V 20 2 V 19 2 V 20 2 V 19 1 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 1 V 19 2 V 20 2 V 19 3 V 20 2 V 19 2 V 20 2 V 19 2 V 19 2 V 20 2 V 19 3 V 20 2 V 19 2 V 20 3 V 19 2 V 19 2 V 20 3 V 19 2 V 20 3 V 19 3 V 20 2 V 19 3 V 19 3 V 20 2 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 3 V 20 3 V 19 4 V 19 3 V 20 4 V 19 3 V 20 4 V 19 4 V 20 4 V 19 4 V 19 4 V 20 4 V 19 4 V 20 4 V 19 5 V 20 4 V 19 5 V 19 4 V 20 5 V 19 5 V 20 5 V 3052 1018 L 20 6 V 19 5 V 19 5 V 20 6 V 19 6 V 20 6 V 19 6 V 20 6 V 19 7 V 19 6 V 20 7 V 19 7 V 20 8 V 19 7 V 20 8 V 19 8 V 19 8 V 20 9 V 19 9 V 20 9 V 19 9 V 20 10 V 19 10 V 19 11 V 20 11 V 19 12 V 20 12 V 19 13 V 20 13 V 19 14 V 19 15 V 20 16 V 19 16 V 20 18 V 19 19 V 20 20 V 19 22 V 19 24 V 20 26 V 19 29 V 20 32 V 19 36 V 20 43 V 19 52 V 19 68 V 20 107 V 19 0 V 20 -107 V 19 -68 V 19 -52 V 20 -43 V 19 -36 V 20 -32 V 19 -29 V 20 -26 V 19 -24 V 19 -22 V 20 -20 V 19 -19 V 20 -18 V 19 -16 V 20 -16 V 19 -15 V 19 -14 V 20 -13 V 19 -13 V 20 -12 V 19 -12 V 20 -11 V 19 -11 V 19 -10 V 20 -10 V 19 -9 V 20 -9 V 19 -9 V 20 -9 V 19 -8 V 19 -8 V 20 -8 V 19 -7 V 20 -8 V 19 -7 V 20 -7 V 19 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -5 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 5092 964 L 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -4 V 20 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=1, b=0.5$}}% \put(5957,4781){\rjust{\strut{}$a=1, b=2.5$}}% \put(3955,5244){\cjust{\strut{}Exponential Power Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4944){\rjust{\strut{} 0.8}}% \put(900,3866){\rjust{\strut{} 0.6}}% \put(900,2788){\rjust{\strut{} 0.4}}% \put(900,1709){\rjust{\strut{} 0.2}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/qrng.eps0000664000175000017500000006206412616157443013230 0ustar eddedd%!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 gsl-doc-2.3/doc/multimin.texi0000644000175000017500000005650312737536472014307 0ustar eddedd@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 with Derivatives:: * Multimin Algorithms without Derivatives:: * 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. Algorithms which do not require the gradient of the function use different strategies. For example, the Nelder-Mead Simplex algorithm maintains @math{n+1} trial parameter vectors as the vertices of a @math{n}-dimensional simplex. On each iteration it tries to improve the worst vertex of the simplex by geometrical transformations. The iterations are continued until the overall size of the simplex has decreased sufficiently. 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}) @tindex gsl_multimin_fdfminimizer @tindex gsl_multimin_fminimizer @tindex gsl_multimin_fdfminimizer_type @tindex gsl_multimin_fminimizer_type 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}) @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}) The function @code{gsl_multimin_fdfminimizer_set} 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. The function @code{gsl_multimin_fminimizer_set} 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}. If the function cannot be computed, an error value of @code{GSL_NAN} should be returned. @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}. If the function cannot be computed, an error value of @code{GSL_NAN} should be returned. @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 two-dimensional paraboloid with five parameters, @example @verbatiminclude examples/multiminfn.c @end example @noindent The function can be initialized using the following code, @example gsl_multimin_function_fdf my_func; /* Paraboloid center at (1,2), scale factors (10, 20), minimum value 30 */ double p[5] = @{ 1.0, 2.0, 10.0, 20.0, 30.0 @}; my_func.n = 2; /* number of function components */ my_func.f = &my_f; my_func.df = &my_df; my_func.fdf = &my_fdf; 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. The error code @code{GSL_ENOPROG} signifies that the minimizer is unable to improve on its current estimate, either due to numerical difficulty or because a genuine local minimum has been reached. @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 {gsl_vector *} gsl_multimin_fdfminimizer_dx (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, the last step increment of the estimate, 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 with Derivatives @section Algorithms with Derivatives There are several minimization methods available. The best choice of algorithm depends on the problem. The algorithms described in this section use the value of the function and its gradient at each evaluation point. @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 supersedes 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 @node Multimin Algorithms without Derivatives @section Algorithms without Derivatives The algorithms described in this section use only the value of the function at each evaluation point. @deffn {Minimizer} gsl_multimin_fminimizer_nmsimplex2 @deffnx {Minimizer} gsl_multimin_fminimizer_nmsimplex @cindex Nelder-Mead simplex algorithm for minimization @cindex simplex algorithm, minimization @cindex minimization, simplex algorithm These methods use the Simplex algorithm of Nelder and Mead. Starting from the initial vector @math{@var{x} = p_0}, the algorithm constructs an additional @math{n} vectors @math{p_i} using the step size vector @c{$s = \var{step\_size}$} @math{s = @var{step_size}} as follows: @tex \beforedisplay $$ \eqalign{ p_0 & = (x_0, x_1, \cdots , x_n) \cr p_1 & = (x_0 + s_0, x_1, \cdots , x_n) \cr p_2 & = (x_0, x_1 + s_1, \cdots , x_n) \cr \dots &= \dots \cr p_n & = (x_0, x_1, \cdots , x_n + s_n) \cr } $$ \afterdisplay @end tex @ifinfo @example p_0 = (x_0, x_1, ... , x_n) p_1 = (x_0 + s_0, x_1, ... , x_n) p_2 = (x_0, x_1 + s_1, ... , x_n) ... = ... p_n = (x_0, x_1, ... , x_n + s_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 uses simple geometrical transformations to update the vector corresponding to the highest function value. The geometric transformations are reflection, reflection followed by expansion, contraction and multiple contraction. Using these transformations the simplex moves through the 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 minimizer-specific characteristic size is calculated 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}. The @code{nmsimplex2} version of this minimiser is a new @math{O(N)} operations implementation of the earlier @math{O(N^2)} operations @code{nmsimplex} minimiser. It uses the same underlying algorithm, but the simplex updates are computed more efficiently for high-dimensional problems. In addition, the size of simplex is calculated as the @sc{rms} distance of each vertex from the center rather than the mean distance, allowing a linear update of this quantity on each step. The memory usage is @math{O(N^2)} for both algorithms. @end deffn @deffn {Minimizer} gsl_multimin_fminimizer_nmsimplex2rand This method is a variant of @code{nmsimplex2} which initialises the simplex around the starting point @var{x} using a randomly-oriented set of basis vectors instead of the fixed coordinate axes. The final dimensions of the simplex are scaled along the coordinate axes by the vector @var{step_size}. The randomisation uses a simple deterministic generator so that repeated calls to @code{gsl_multimin_fminimizer_set} for a given solver object will vary the orientation in a well-defined way. @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 @verbatiminclude examples/multimin.c @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 @verbatiminclude examples/multimin.txt @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 @verbatiminclude examples/nmsimplex.c @end smallexample @noindent The minimum search stops when the Simplex size drops to 0.01. The output is shown below. @example @verbatiminclude examples/nmsimplex.txt @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 @w{} @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 @w{} @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 @w{} @item J.A. Nelder and R. Mead, @cite{A simplex method for function minimization}, Computer Journal vol.@: 7 (1965), 308--313. @end itemize @noindent gsl-doc-2.3/doc/fft-real-mixedradix.eps0000664000175000017500000001623212616157443016111 0ustar eddedd%!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 gsl-doc-2.3/doc/specfunc-lambert.texi0000664000175000017500000000214112616157443015663 0ustar eddedd@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 gsl-doc-2.3/doc/rand-pareto.tex0000664000175000017500000005355612616157443014514 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-pareto.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-pareto.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1078 R -31 0 V 31 1079 R -31 0 V 31 1078 R -31 0 V 31 1078 R -31 0 V 1051 631 M 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1161 31 R 0 -31 V 1162 31 R 0 -31 V 1162 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 2142 V 19 -70 V 20 -66 V 19 -63 V 19 -60 V 20 -58 V 19 -55 V 20 -52 V 19 -50 V 20 -48 V 19 -46 V 19 -44 V 20 -42 V 19 -41 V 20 -39 V 19 -37 V 20 -36 V 19 -34 V 19 -33 V 20 -32 V 19 -31 V 20 -30 V 19 -28 V 20 -28 V 19 -26 V 19 -26 V 20 -24 V 19 -24 V 20 -23 V 19 -22 V 20 -22 V 19 -21 V 19 -20 V 20 -19 V 19 -19 V 20 -19 V 19 -17 V 20 -17 V 19 -17 V 19 -16 V 20 -16 V 19 -15 V 20 -15 V 3052 1358 L 20 -14 V 19 -14 V 19 -13 V 20 -12 V 19 -13 V 20 -12 V 19 -12 V 20 -11 V 19 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -9 V 19 -9 V 20 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -7 V 20 -6 V 19 -7 V 19 -7 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 19 -5 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -3 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 5092 809 L 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 0 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 19 -1 V 20 0 V 19 -1 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 3052 631 L 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 3192 V 20 -104 V 19 -100 V 20 -96 V 19 -93 V 20 -88 V 19 -85 V 19 -82 V 20 -78 V 19 -76 V 20 -73 V 19 -70 V 20 -67 V 19 -65 V 19 -62 V 20 -60 V 19 -58 V 20 -56 V 19 -54 V 20 -52 V 19 -50 V 19 -48 V 20 -47 V 19 -45 V 20 -44 V 19 -42 V 20 -40 V 19 -40 V 19 -38 V 20 -36 V 19 -36 V 20 -34 V 19 -33 V 19 -32 V 20 -31 V 19 -30 V 20 -29 V 19 -29 V 20 -27 V 19 -26 V 19 -26 V 20 -25 V 19 -24 V 20 -23 V 19 -23 V 20 -22 V 19 -21 V 19 -21 V 20 -20 V 19 -20 V 20 -19 V 19 -18 V 20 -18 V 19 -17 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -15 V 20 -14 V 19 -15 V 19 -13 V 20 -14 V 19 -13 V 20 -13 V 19 -12 V 20 -12 V 19 -12 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 20 -10 V 19 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -8 V 19 -9 V 20 -8 V 19 -9 V 19 -7 V 20 -8 V 19 -8 V 20 -7 V 19 -7 V 20 -8 V 5092 985 L 19 -7 V 20 -7 V 19 -6 V 20 -6 V 19 -6 V 20 -6 V 19 -6 V 19 -6 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -6 V 19 -5 V 19 -4 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 20 -4 V 19 -4 V 19 -4 V 20 -5 V 19 -4 V 20 -3 V 19 -4 V 20 -4 V 19 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 20 -3 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -2 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$a=3, b=2 $}}% \put(5957,4781){\rjust{\strut{}$a=1, b=1$}}% \put(3955,5244){\cjust{\strut{}Pareto Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(5698,400){\cjust{\strut{}4}}% \put(4536,400){\cjust{\strut{}3}}% \put(3375,400){\cjust{\strut{}2}}% \put(2213,400){\cjust{\strut{}1}}% \put(1051,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 2}}% \put(900,3866){\rjust{\strut{} 1.5}}% \put(900,2788){\rjust{\strut{} 1}}% \put(900,1709){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/cheb.texi0000664000175000017500000001645612616157443013350 0ustar eddedd@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:: * Auxiliary Functions for Chebyshev Series:: * Chebyshev Series Evaluation:: * Derivatives and Integrals:: * Chebyshev Approximation Examples:: * Chebyshev Approximation References and Further Reading:: @end menu @node Chebyshev Definitions @section Definitions @tindex gsl_cheb_series 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 Auxiliary Functions for Chebyshev Series @section Auxiliary Functions The following functions provide information about an existing Chebyshev series. @deftypefun size_t gsl_cheb_order (const gsl_cheb_series * @var{cs}) This function returns the order of Chebyshev series @var{cs}. @end deftypefun @deftypefun size_t gsl_cheb_size (const gsl_cheb_series * @var{cs}) @deftypefunx {double *} gsl_cheb_coeffs (const gsl_cheb_series * @var{cs}) These functions return the size of the Chebyshev coefficient array @code{c[]} and a pointer to its location in memory for the Chebyshev series @var{cs}. @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{x}, 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 @w{} @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 gsl-doc-2.3/doc/interp.texi0000644000175000017500000007571612736044021013740 0ustar eddedd@cindex interpolation @cindex spline This chapter describes functions for performing interpolation. The library provides a variety of interpolation methods, including Cubic, Akima, and Steffen 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. Routines are provided for interpolating both one and two dimensional datasets. These interpolation methods produce curves that pass through each datapoint. To interpolate noisy data with a smoothing curve see @ref{Basis Splines}. The functions described in this section are declared in the header files @file{gsl_interp.h} and @file{gsl_spline.h}. @menu * 1D Introduction to Interpolation:: * 1D Interpolation Functions:: * 1D Interpolation Types:: * 1D Index Look-up and Acceleration:: * 1D Evaluation of Interpolating Functions:: * 1D Higher-level Interface:: * 1D Interpolation Example programs:: * 1D Interpolation References and Further Reading:: * 2D Introduction to Interpolation:: * 2D Interpolation Functions:: * 2D Interpolation Grids:: * 2D Interpolation Types:: * 2D Evaluation of Interpolating Functions:: * 2D Higher-level Interface:: * 2D Interpolation Example programs:: @end menu @node 1D Introduction to Interpolation @section Introduction to 1D Interpolation 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 1D Interpolation Functions @section 1D 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}) @tindex gsl_interp 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, with increasing @math{x} values; 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 1D Interpolation Types @section 1D Interpolation Types @tindex gsl_interp_type The interpolation library provides the following 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 @deffn {Interpolation Type} gsl_interp_steffen Steffen's method guarantees the monotonicity of the interpolating function between the given data points. Therefore, minima and maxima can only occur exactly at the data points, and there can never be spurious oscillations between data points. The interpolated function is piecewise cubic in each interval. The resulting curve and its first derivative are guaranteed to be continuous, but the second derivative may be discontinuous. @end deffn @noindent 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}) @deftypefunx {unsigned int} gsl_interp_type_min_size (const gsl_interp_type * @var{T}) These functions return the minimum number of points required by the interpolation object @var{interp} or interpolation type @var{T}. For example, Akima spline interpolation requires a minimum of 5 points. @end deftypefun @node 1D Index Look-up and Acceleration @section 1D 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}]. @inlinefn{} @end deftypefun @deftypefun {gsl_interp_accel *} gsl_interp_accel_alloc (void) @tindex gsl_interp_accel 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]}. @inlinefn{} @end deftypefun @deftypefun int gsl_interp_accel_reset (gsl_interp_accel * @var{acc}); This function reinitializes the accelerator object @var{acc}. It should be used when the cached information is no longer applicable---for example, when switching to a new dataset. @end deftypefun @deftypefun void gsl_interp_accel_free (gsl_interp_accel* @var{acc}) This function frees the accelerator object @var{acc}. @end deftypefun @node 1D Evaluation of Interpolating Functions @section 1D 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}. When @var{x} is outside the range of @var{xa}, the error code @code{GSL_EDOM} is returned with a value of @code{GSL_NAN} for @var{y}. @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 1D Higher-level Interface @section 1D 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}) @tindex gsl_spline @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 1D Interpolation Example programs @section Examples of 1D Interpolation 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 be 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. The next program illustrates the difference between the cubic spline, Akima, and Steffen interpolation types on a difficult dataset. @example @verbatiminclude examples/interp_compare.c @end example @iftex @sp 1 @center @image{interp_compare,6in} @end iftex @noindent The cubic method exhibits a local maxima between the 6th and 7th data points and continues oscillating for the rest of the data. Akima also shows a local maxima but recovers and follows the data well after the 7th grid point. Steffen preserves monotonicity in all intervals and does not exhibit oscillations, at the expense of having a discontinuous second derivative. @node 1D Interpolation References and Further Reading @section References and Further Reading Descriptions of the interpolation algorithms and further references can be found in the following publications: @itemize @w{} @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. @item M. Steffen, @cite{A simple method for monotonic interpolation in one dimension}, Astron. Astrophys. 239, 443-450, 1990. @end itemize @node 2D Introduction to Interpolation @section Introduction to 2D Interpolation Given a set of @math{x} coordinates @math{x_1,...,x_m} and a set of @math{y} coordinates @math{y_1,...,y_n}, each in increasing order, plus a set of function values @math{z_{ij}} for each grid point @math{(x_i,y_j)}, the routines described in this section compute a continuous interpolation function @math{z(x,y)} such that @math{z(x_i,y_j) = z_{ij}}. @node 2D Interpolation Functions @section 2D Interpolation Functions The interpolation function for a given dataset is stored in a @code{gsl_interp2d} object. These are created by the following functions. @deftypefun {gsl_interp2d *} gsl_interp2d_alloc (const gsl_interp2d_type * @var{T}, const size_t @var{xsize}, const size_t @var{ysize}) @tindex gsl_interp This function returns a pointer to a newly allocated interpolation object of type @var{T} for @var{xsize} grid points in the @math{x} direction and @var{ysize} grid points in the @math{y} direction. @end deftypefun @deftypefun int gsl_interp2d_init (gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const size_t @var{xsize}, const size_t @var{ysize}) This function initializes the interpolation object @var{interp} for the data (@var{xa},@var{ya},@var{za}) where @var{xa} and @var{ya} are arrays of the @math{x} and @math{y} grid points of size @var{xsize} and @var{ysize} respectively, and @var{za} is an array of function values of size @var{xsize}*@var{ysize}. The interpolation object (@code{gsl_interp2d}) does not save the data arrays @var{xa}, @var{ya}, and @var{za} and only stores the static state computed from the data. The @var{xa} and @var{ya} data arrays are always assumed to be strictly ordered, with increasing @math{x,y} values; the behavior for other arrangements is not defined. @end deftypefun @deftypefun void gsl_interp2d_free (gsl_interp2d * @var{interp}) This function frees the interpolation object @var{interp}. @end deftypefun @node 2D Interpolation Grids @section 2D Interpolation Grids The 2D interpolation routines access the function values @math{z_{ij}} with the following ordering: @tex \beforedisplay $$ z_{ij} = za[j*xsize + i] $$ \afterdisplay @end tex @ifinfo @example z_ij = za[j*xsize + i] @end example @end ifinfo with @math{i = 0,...,xsize-1} and @math{j = 0,...,ysize-1}. However, for ease of use, the following functions are provided to add and retrieve elements from the function grid without requiring knowledge of the internal ordering. @deftypefun int gsl_interp2d_set (const gsl_interp2d * @var{interp}, double @var{za}[], const size_t @var{i}, const size_t @var{j}, const double @var{z}) This function sets the value @math{z_{ij}} for grid point (@var{i},@var{j}) of the array @var{za} to @var{z}. @end deftypefun @deftypefun double gsl_interp2d_get (const gsl_interp2d * @var{interp}, const double @var{za}[], const size_t @var{i}, const size_t @var{j}) This function returns the value @math{z_{ij}} for grid point (@var{i},@var{j}) stored in the array @var{za}. @end deftypefun @deftypefun size_t gsl_interp2d_idx (const gsl_interp2d * @var{interp}, const size_t @var{i}, const size_t @var{j}) This function returns the index corresponding to the grid point (@var{i},@var{j}). The index is given by @math{j*xsize + i}. @end deftypefun @node 2D Interpolation Types @section 2D Interpolation Types @tindex gsl_interp2d_type The interpolation library provides the following 2D interpolation types: @deffn {Interpolation Type} gsl_interp2d_bilinear @cindex bilinear interpolation Bilinear interpolation. This interpolation method does not require any additional memory. @end deffn @deffn {Interpolation Type} gsl_interp2d_bicubic @cindex bicubic interpolation Bicubic interpolation. @end deffn @deftypefun {const char *} gsl_interp2d_name (const gsl_interp2d * @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_interp2d_name (interp)); @end example @noindent would print something like, @example interp uses 'bilinear' interpolation. @end example @end deftypefun @deftypefun {unsigned int} gsl_interp2d_min_size (const gsl_interp2d * @var{interp}) @deftypefunx {unsigned int} gsl_interp2d_type_min_size (const gsl_interp2d_type * @var{T}) These functions return the minimum number of points required by the interpolation object @var{interp} or interpolation type @var{T}. For example, bicubic interpolation requires a minimum of 4 points. @end deftypefun @node 2D Evaluation of Interpolating Functions @section 2D Evaluation of Interpolating Functions @deftypefun double gsl_interp2d_eval (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{z}) These functions return the interpolated value of @var{z} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @deftypefun double gsl_interp2d_eval_extrap (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_extrap_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{z}) These functions return the interpolated value of @var{z} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. The functions perform no bounds checking, so when @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, extrapolation is performed. @end deftypefun @deftypefun double gsl_interp2d_eval_deriv_x (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_deriv_x_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) These functions return the interpolated value @var{d} @math{= \partial z / \partial x} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @deftypefun double gsl_interp2d_eval_deriv_y (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_deriv_y_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) These functions return the interpolated value @var{d} @math{= \partial z / \partial y} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @deftypefun double gsl_interp2d_eval_deriv_xx (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_deriv_xx_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) These functions return the interpolated value @var{d} @math{= \partial^2 z / \partial x^2} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @deftypefun double gsl_interp2d_eval_deriv_yy (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_deriv_yy_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) These functions return the interpolated value @var{d} @math{= \partial^2 z / \partial y^2} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @deftypefun double gsl_interp2d_eval_deriv_xy (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_interp2d_eval_deriv_xy_e (const gsl_interp2d * @var{interp}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) These functions return the interpolated value @var{d} @math{= \partial^2 z / \partial x \partial y} for a given point (@var{x},@var{y}), using the interpolation object @var{interp}, data arrays @var{xa}, @var{ya}, and @var{za} and the accelerators @var{xacc} and @var{yacc}. When @var{x} is outside the range of @var{xa} or @var{y} is outside the range of @var{ya}, the error code @code{GSL_EDOM} is returned. @end deftypefun @node 2D Higher-level Interface @section 2D Higher-level Interface The functions described in the previous sections required the user to supply pointers to the @math{x}, @math{y}, and @math{z} arrays on each call. The following functions are equivalent to the corresponding @code{gsl_interp2d} functions but maintain a copy of this data in the @code{gsl_spline2d} object. This removes the need to pass @var{xa}, @var{ya}, and @var{za} as arguments on each evaluation. These functions are defined in the header file @file{gsl_spline2d.h}. @deftypefun {gsl_spline2d *} gsl_spline2d_alloc (const gsl_interp2d_type * @var{T}, size_t @var{xsize}, size_t @var{ysize}) @tindex gsl_spline2d @end deftypefun @deftypefun int gsl_spline2d_init (gsl_spline2d * @var{spline}, const double @var{xa}[], const double @var{ya}[], const double @var{za}[], size_t @var{xsize}, size_t @var{ysize}) @end deftypefun @deftypefun void gsl_spline2d_free (gsl_spline2d * @var{spline}) @end deftypefun @deftypefun {const char *} gsl_spline2d_name (const gsl_spline2d * @var{spline}) @end deftypefun @deftypefun {unsigned int} gsl_spline2d_min_size (const gsl_spline2d * @var{spline}) @end deftypefun @deftypefun double gsl_spline2d_eval (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{z}) @end deftypefun @deftypefun double gsl_spline2d_eval_deriv_x (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_deriv_x_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) @end deftypefun @deftypefun double gsl_spline2d_eval_deriv_y (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_deriv_y_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) @end deftypefun @deftypefun double gsl_spline2d_eval_deriv_xx (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_deriv_xx_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) @end deftypefun @deftypefun double gsl_spline2d_eval_deriv_yy (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_deriv_yy_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) @end deftypefun @deftypefun double gsl_spline2d_eval_deriv_xy (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}) @deftypefunx int gsl_spline2d_eval_deriv_xy_e (const gsl_spline2d * @var{spline}, const double @var{x}, const double @var{y}, gsl_interp_accel * @var{xacc}, gsl_interp_accel * @var{yacc}, double * @var{d}) @end deftypefun @deftypefun int gsl_spline2d_set (const gsl_spline2d * @var{spline}, double @var{za}[], const size_t @var{i}, const size_t @var{j}, const double @var{z}) @end deftypefun @deftypefun double gsl_spline2d_get (const gsl_spline2d * @var{spline}, const double @var{za}[], const size_t @var{i}, const size_t @var{j}) This function returns the value @math{z_{ij}} for grid point (@var{i},@var{j}) stored in the array @var{za}. @end deftypefun @node 2D Interpolation Example programs @section 2D Interpolation Example programs The following example performs bilinear interpolation on the unit square, using @math{z} values of @math{(0,1,0.5,1)} going clockwise around the square. @example @verbatiminclude examples/interp2d.c @end example @noindent The results of the interpolation are shown in the following plot, where the corners are labeled with their fixed @math{z} values. @iftex @sp 1 @center @image{interp2d,6in} @end iftex gsl-doc-2.3/doc/gsl-config.10000664000175000017500000000265312616157443013660 0ustar eddedd.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 \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. gsl-doc-2.3/doc/specfunc-fermi-dirac.texi0000664000175000017500000001102612616157443016421 0ustar eddedd@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/\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1)) @end example @end ifinfo @noindent Note that the Fermi-Dirac integral is sometimes defined without the normalisation factor in other texts. @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 gsl-doc-2.3/doc/roots-secant-method.eps0000664000175000017500000001566312616157443016163 0ustar eddedd%!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 gsl-doc-2.3/doc/gsl-ref.info-60000644000175000017500000042021313022372752014111 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  File: gsl-ref.info, Node: Variable Index, Next: Type Index, Prev: Function Index, Up: Top Variable Index ************** [index] * Menu: * alpha: MISER. (line 113) * alpha <1>: VEGAS. (line 148) * avmax: Nonlinear Least-Squares Tunable Parameters. (line 199) * dither: MISER. (line 129) * estimate_frac: MISER. (line 92) * factor_down: Nonlinear Least-Squares Tunable Parameters. (line 194) * factor_up: Nonlinear Least-Squares Tunable Parameters. (line 189) * fdtype: Nonlinear Least-Squares Tunable Parameters. (line 156) * 'GSL_C99_INLINE': Inline functions. (line 6) * 'GSL_C99_INLINE' <1>: Accessing vector elements. (line 26) * gsl_check_range: Accessing vector elements. (line 31) * GSL_EDOM: Error Codes. (line 13) * GSL_EINVAL: Error Codes. (line 29) * GSL_ENOMEM: Error Codes. (line 23) * GSL_ERANGE: Error Codes. (line 18) * 'GSL_IEEE_MODE': Setting up your IEEE environment. (line 24) * GSL_MULTIFIT_NLINEAR_CTRDIFF: Nonlinear Least-Squares Tunable Parameters. (line 179) * GSL_MULTIFIT_NLINEAR_FWDIFF: Nonlinear Least-Squares Tunable Parameters. (line 163) * gsl_multifit_nlinear_scale_levenberg: Nonlinear Least-Squares Tunable Parameters. (line 98) * gsl_multifit_nlinear_scale_marquardt: Nonlinear Least-Squares Tunable Parameters. (line 108) * gsl_multifit_nlinear_scale_more: Nonlinear Least-Squares Tunable Parameters. (line 82) * gsl_multifit_nlinear_solver_cholesky: Nonlinear Least-Squares Tunable Parameters. (line 134) * gsl_multifit_nlinear_solver_qr: Nonlinear Least-Squares Tunable Parameters. (line 127) * gsl_multifit_nlinear_solver_svd: Nonlinear Least-Squares Tunable Parameters. (line 150) * gsl_multifit_nlinear_trs_ddogleg: Nonlinear Least-Squares Tunable Parameters. (line 64) * gsl_multifit_nlinear_trs_dogleg: Nonlinear Least-Squares Tunable Parameters. (line 60) * gsl_multifit_nlinear_trs_lm: Nonlinear Least-Squares Tunable Parameters. (line 51) * gsl_multifit_nlinear_trs_lmaccel: Nonlinear Least-Squares Tunable Parameters. (line 55) * gsl_multifit_nlinear_trs_subspace2D: Nonlinear Least-Squares Tunable Parameters. (line 68) * gsl_multilarge_nlinear_scale_levenberg: Nonlinear Least-Squares Tunable Parameters. (line 99) * gsl_multilarge_nlinear_scale_marquardt: Nonlinear Least-Squares Tunable Parameters. (line 109) * gsl_multilarge_nlinear_scale_more: Nonlinear Least-Squares Tunable Parameters. (line 83) * gsl_multilarge_nlinear_solver_cholesky: Nonlinear Least-Squares Tunable Parameters. (line 135) * gsl_multilarge_nlinear_trs_cgst: Nonlinear Least-Squares Tunable Parameters. (line 72) * gsl_multilarge_nlinear_trs_ddogleg: Nonlinear Least-Squares Tunable Parameters. (line 65) * gsl_multilarge_nlinear_trs_dogleg: Nonlinear Least-Squares Tunable Parameters. (line 61) * gsl_multilarge_nlinear_trs_lm: Nonlinear Least-Squares Tunable Parameters. (line 52) * gsl_multilarge_nlinear_trs_lmaccel: Nonlinear Least-Squares Tunable Parameters. (line 56) * gsl_multilarge_nlinear_trs_subspace2D: Nonlinear Least-Squares Tunable Parameters. (line 69) * GSL_NAN: Infinities and Not-a-number. (line 14) * GSL_NEGINF: Infinities and Not-a-number. (line 10) * GSL_POSINF: Infinities and Not-a-number. (line 6) * 'GSL_RANGE_CHECK_OFF': Accessing vector elements. (line 17) * gsl_rng_default: Random number environment variables. (line 12) * gsl_rng_default_seed: Random number generator initialization. (line 17) * gsl_rng_default_seed <1>: Random number environment variables. (line 12) * 'GSL_RNG_SEED': Random number generator initialization. (line 17) * 'GSL_RNG_SEED' <1>: Random number environment variables. (line 12) * 'GSL_RNG_TYPE': Random number environment variables. (line 12) * 'HAVE_INLINE': Inline functions. (line 6) * h_df: Nonlinear Least-Squares Tunable Parameters. (line 218) * h_fvv: Nonlinear Least-Squares Tunable Parameters. (line 224) * iterations: VEGAS. (line 153) * min_calls: MISER. (line 97) * min_calls_per_bisection: MISER. (line 105) * mode: VEGAS. (line 171) * ostream: VEGAS. (line 181) * scale: Nonlinear Least-Squares Tunable Parameters. (line 76) * scale <1>: Nonlinear Least-Squares Tunable Parameters. (line 77) * solver: Nonlinear Least-Squares Tunable Parameters. (line 116) * solver <1>: Nonlinear Least-Squares Tunable Parameters. (line 117) * stage: VEGAS. (line 157) * trs: Nonlinear Least-Squares Tunable Parameters. (line 45) * trs <1>: Nonlinear Least-Squares Tunable Parameters. (line 46) * verbose: VEGAS. (line 180)  File: gsl-ref.info, Node: Type Index, Next: Concept Index, Prev: Variable Index, Up: Top Type Index ********** [index] * Menu: * gsl_block: Blocks. (line 6) * gsl_bspline_workspace: Initializing the B-splines solver. (line 11) * gsl_cheb_series: Chebyshev Definitions. (line 6) * gsl_combination: The Combination struct. (line 6) * gsl_complex: Representation of complex numbers. (line 6) * gsl_dht: Discrete Hankel Transform Functions. (line 7) * gsl_eigen_genhermv_workspace: Complex Generalized Hermitian-Definite Eigensystems. (line 37) * gsl_eigen_genherm_workspace: Complex Generalized Hermitian-Definite Eigensystems. (line 19) * gsl_eigen_gensymmv_workspace: Real Generalized Symmetric-Definite Eigensystems. (line 41) * gsl_eigen_gensymm_workspace: Real Generalized Symmetric-Definite Eigensystems. (line 24) * gsl_eigen_genv_workspace: Real Generalized Nonsymmetric Eigensystems. (line 98) * gsl_eigen_gen_workspace: Real Generalized Nonsymmetric Eigensystems. (line 43) * gsl_eigen_hermv_workspace: Complex Hermitian Matrices. (line 30) * gsl_eigen_herm_workspace: Complex Hermitian Matrices. (line 11) * gsl_eigen_nonsymmv_workspace: Real Nonsymmetric Matrices. (line 80) * gsl_eigen_nonsymm_workspace: Real Nonsymmetric Matrices. (line 19) * gsl_eigen_symmv_workspace: Real Symmetric Matrices. (line 32) * gsl_eigen_symm_workspace: Real Symmetric Matrices. (line 14) * gsl_error_handler_t: Error Handlers. (line 23) * gsl_fft_complex_wavetable: Mixed-radix FFT routines for complex data. (line 77) * gsl_fft_complex_workspace: Mixed-radix FFT routines for complex data. (line 106) * gsl_fft_halfcomplex_wavetable: Mixed-radix FFT routines for real data. (line 76) * gsl_fft_real_wavetable: Mixed-radix FFT routines for real data. (line 76) * gsl_fft_real_workspace: Mixed-radix FFT routines for real data. (line 106) * gsl_function: Providing the function to solve. (line 11) * gsl_function_fdf: Providing the function to solve. (line 50) * gsl_histogram: The histogram struct. (line 8) * gsl_histogram2d: The 2D histogram struct. (line 8) * gsl_histogram2d_pdf: Resampling from 2D histograms. (line 20) * gsl_histogram_pdf: The histogram probability distribution struct. (line 18) * gsl_integration_cquad_workspace: CQUAD doubly-adaptive integration. (line 22) * gsl_integration_glfixed_table: Fixed order Gauss-Legendre integration. (line 16) * gsl_integration_glfixed_table <1>: Fixed order Gauss-Legendre integration. (line 37) * gsl_integration_qawo_table: QAWO adaptive integration for oscillatory functions. (line 14) * gsl_integration_qaws_table: QAWS adaptive integration for singular functions. (line 14) * gsl_integration_workspace: QAG adaptive integration. (line 17) * gsl_interp: 1D Interpolation Functions. (line 11) * gsl_interp <1>: 2D Interpolation Functions. (line 11) * gsl_interp2d_type: 2D Interpolation Types. (line 6) * gsl_interp_accel: 1D Index Look-up and Acceleration. (line 20) * gsl_interp_type: 1D Interpolation Types. (line 6) * gsl_matrix: Matrices. (line 10) * gsl_matrix_const_view: Matrix views. (line 6) * gsl_matrix_view: Matrix views. (line 6) * gsl_min_fminimizer: Initializing the Minimizer. (line 8) * gsl_min_fminimizer_type: Initializing the Minimizer. (line 8) * gsl_monte_function: Monte Carlo Interface. (line 27) * gsl_monte_miser_state: MISER. (line 46) * gsl_monte_plain_state: PLAIN Monte Carlo. (line 30) * gsl_monte_vegas_state: VEGAS. (line 51) * gsl_multifit_linear_workspace: Multi-parameter regression. (line 44) * gsl_multifit_nlinear_alloc: Nonlinear Least-Squares Initialization. (line 15) * gsl_multifit_nlinear_fdf: Nonlinear Least-Squares Function Definition. (line 10) * gsl_multifit_nlinear_type: Nonlinear Least-Squares Initialization. (line 15) * gsl_multifit_robust_workspace: Robust linear regression. (line 73) * gsl_multilarge_nlinear_fdf: Nonlinear Least-Squares Function Definition. (line 71) * gsl_multimin_fdfminimizer: Initializing the Multidimensional Minimizer. (line 15) * gsl_multimin_fdfminimizer_type: Initializing the Multidimensional Minimizer. (line 15) * gsl_multimin_fminimizer: Initializing the Multidimensional Minimizer. (line 15) * gsl_multimin_fminimizer_type: Initializing the Multidimensional Minimizer. (line 15) * gsl_multimin_function: Providing a function to minimize. (line 41) * gsl_multimin_function_fdf: Providing a function to minimize. (line 13) * gsl_multiroot_fdfsolver: Initializing the Multidimensional Solver. (line 29) * gsl_multiroot_fdfsolver_type: Initializing the Multidimensional Solver. (line 29) * gsl_multiroot_fsolver: Initializing the Multidimensional Solver. (line 13) * gsl_multiroot_fsolver_type: Initializing the Multidimensional Solver. (line 13) * gsl_multiroot_function: Providing the multidimensional system of equations to solve. (line 10) * gsl_multiroot_function_fdf: Providing the multidimensional system of equations to solve. (line 57) * gsl_multiset: The Multiset struct. (line 6) * gsl_ntuple: The ntuple struct. (line 6) * gsl_ntuple_select_fn: Histogramming ntuple values. (line 13) * gsl_ntuple_value_fn: Histogramming ntuple values. (line 24) * gsl_odeiv2_control: Adaptive Step-size Control. (line 12) * gsl_odeiv2_control_type: Adaptive Step-size Control. (line 12) * gsl_odeiv2_evolve: Evolution. (line 11) * gsl_odeiv2_step: Stepping Functions. (line 12) * gsl_odeiv2_step_type: Stepping Functions. (line 12) * gsl_odeiv2_system: Defining the ODE System. (line 14) * gsl_permutation: The Permutation struct. (line 6) * gsl_poly_complex_workspace: General Polynomial Equations. (line 13) * gsl_qrng: Quasi-random number generator initialization. (line 8) * gsl_qrng_type: Quasi-random number generator initialization. (line 8) * gsl_ran_discrete_t: General Discrete Distributions. (line 51) * gsl_rng: Random number generator initialization. (line 7) * gsl_rng_type: The Random Number Generator Interface. (line 18) * gsl_root_fdfsolver: Initializing the Solver. (line 23) * gsl_root_fdfsolver_type: Initializing the Solver. (line 23) * gsl_root_fsolver: Initializing the Solver. (line 8) * gsl_root_fsolver_type: Initializing the Solver. (line 8) * gsl_sf_mathieu_workspace: Mathieu Function Workspace. (line 12) * gsl_sf_result: The gsl_sf_result struct. (line 6) * gsl_sf_result_e10: The gsl_sf_result struct. (line 6) * gsl_siman_copy_construct_t: Simulated Annealing functions. (line 81) * gsl_siman_copy_t: Simulated Annealing functions. (line 76) * gsl_siman_destroy_t: Simulated Annealing functions. (line 87) * gsl_siman_Efunc_t: Simulated Annealing functions. (line 51) * gsl_siman_metric_t: Simulated Annealing functions. (line 64) * gsl_siman_params_t: Simulated Annealing functions. (line 93) * gsl_siman_print_t: Simulated Annealing functions. (line 70) * gsl_siman_step_t: Simulated Annealing functions. (line 56) * gsl_spline: 1D Higher-level Interface. (line 15) * gsl_spline2d: 2D Higher-level Interface. (line 15) * gsl_spmatrix: Sparse Matrices Overview. (line 24) * gsl_sum_levin_utrunc_workspace: Acceleration functions without error estimation. (line 24) * gsl_sum_levin_u_workspace: Acceleration functions. (line 25) * gsl_vector: Vectors. (line 11) * gsl_vector_const_view: Vector views. (line 12) * gsl_vector_view: Vector views. (line 12) * gsl_wavelet: DWT Initialization. (line 11) * gsl_wavelet_type: DWT Initialization. (line 6) * gsl_wavelet_workspace: DWT Initialization. (line 53)  File: gsl-ref.info, Node: Concept Index, Prev: Type Index, Up: Top Concept Index ************* [index] * Menu: * '$', shell prompt: Conventions used in this manual. (line 6) * 2D histograms: Two dimensional histograms. (line 6) * 2D random direction vector: Spherical Vector Distributions. (line 14) * 3-j symbols: Coupling Coefficients. (line 6) * 3D random direction vector: Spherical Vector Distributions. (line 33) * 6-j symbols: Coupling Coefficients. (line 6) * 9-j symbols: Coupling Coefficients. (line 6) * acceleration of series: Series Acceleration. (line 6) * acosh: Elementary Functions. (line 33) * Adams method: Stepping Functions. (line 128) * Adaptive step-size control, differential equations: Adaptive Step-size Control. (line 6) * Ai(x): Airy Functions and Derivatives. (line 6) * Airy functions: Airy Functions and Derivatives. (line 6) * Akima splines: 1D Interpolation Types. (line 35) * aliasing of arrays: Aliasing of arrays. (line 6) * alternative optimized functions: Alternative optimized functions. (line 6) * AMAX, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 62) * Angular Mathieu Functions: Angular Mathieu Functions. (line 6) * angular reduction: Restriction Functions. (line 6) * ANSI C, use of: Using the library. (line 6) * Apell symbol, see Pochhammer symbol: Pochhammer Symbol. (line 9) * approximate comparison of floating point numbers: Approximate Comparison of Floating Point Numbers. (line 13) * arctangent integral: Arctangent Integral. (line 6) * argument of complex number: Properties of complex numbers. (line 7) * arithmetic exceptions: Setting up your IEEE environment. (line 6) * asinh: Elementary Functions. (line 37) * astronomical constants: Astronomy and Astrophysics. (line 6) * ASUM, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 47) * atanh: Elementary Functions. (line 41) * atomic physics, constants: Atomic and Nuclear Physics. (line 6) * autoconf, using with GSL: Autoconf Macros. (line 6) * AXPY, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 96) * B-spline wavelets: DWT Initialization. (line 31) * Bader and Deuflhard, Bulirsch-Stoer method.: Stepping Functions. (line 123) * balancing matrices: Balancing. (line 6) * Basic Linear Algebra Subroutines (BLAS): BLAS Support. (line 6) * Basic Linear Algebra Subroutines (BLAS) <1>: GSL CBLAS Library. (line 6) * basis splines, B-splines: Basis Splines. (line 6) * basis splines, derivatives: Evaluation of B-spline basis function derivatives. (line 6) * basis splines, evaluation: Evaluation of B-spline basis functions. (line 6) * basis splines, examples: Example programs for B-splines. (line 6) * basis splines, Greville abscissae: Working with the Greville abscissae. (line 6) * basis splines, initializing: Initializing the B-splines solver. (line 6) * basis splines, Marsden-Schoenberg points: Working with the Greville abscissae. (line 6) * basis splines, overview: Overview of B-splines. (line 6) * BDF method: Stepping Functions. (line 136) * Bernoulli trial, random variates: The Bernoulli Distribution. (line 8) * Bessel functions: Bessel Functions. (line 6) * Bessel Functions, Fractional Order: Regular Bessel Function - Fractional Order. (line 6) * best-fit parameters, covariance: Nonlinear Least-Squares Covariance Matrix. (line 6) * Beta distribution: The Beta Distribution. (line 8) * Beta function: Beta Functions. (line 9) * Beta function, incomplete normalized: Incomplete Beta Function. (line 9) * BFGS algorithm, minimization: Multimin Algorithms with Derivatives. (line 37) * Bi(x): Airy Functions and Derivatives. (line 6) * bias, IEEE format: Representation of floating point numbers. (line 6) * bicubic interpolation: 2D Interpolation Types. (line 13) * bidiagonalization of real matrices: Bidiagonalization. (line 6) * bilinear interpolation: 2D Interpolation Types. (line 9) * binning data: Histograms. (line 6) * Binomial random variates: The Binomial Distribution. (line 8) * biorthogonal wavelets: DWT Initialization. (line 31) * bisection algorithm for finding roots: Root Bracketing Algorithms. (line 18) * Bivariate Gaussian distribution: The Bivariate Gaussian Distribution. (line 8) * Bivariate Gaussian distribution <1>: The Multivariate Gaussian Distribution. (line 9) * BLAS: BLAS Support. (line 6) * BLAS, Low-level C interface: GSL CBLAS Library. (line 6) * BLAS, sparse: Sparse BLAS Support. (line 6) * blocks: Vectors and Matrices. (line 6) * bounds checking, extension to GCC: Accessing vector elements. (line 6) * breakpoints: Using gdb. (line 6) * Brent's method for finding minima: Minimization Algorithms. (line 31) * Brent's method for finding roots: Root Bracketing Algorithms. (line 50) * Broyden algorithm for multidimensional roots: Algorithms without Derivatives. (line 46) * BSD random number generator: Unix random number generators. (line 18) * bug-gsl mailing list: Reporting Bugs. (line 6) * bugs, how to report: Reporting Bugs. (line 6) * Bulirsch-Stoer method: Stepping Functions. (line 123) * C extensions, compatible use of: Using the library. (line 6) * C++, compatibility: Compatibility with C++. (line 6) * C99, inline keyword: Inline functions. (line 6) * Carlson forms of Elliptic integrals: Definition of Carlson Forms. (line 6) * Cash-Karp, Runge-Kutta method: Stepping Functions. (line 99) * Cauchy distribution: The Cauchy Distribution. (line 7) * Cauchy principal value, by numerical quadrature: QAWC adaptive integration for Cauchy principal values. (line 6) * CBLAS: BLAS Support. (line 6) * CBLAS, Low-level interface: GSL CBLAS Library. (line 6) * CDFs, cumulative distribution functions: Random Number Distributions. (line 6) * ce(q,x), Mathieu function: Angular Mathieu Functions. (line 6) * Chebyshev series: Chebyshev Approximations. (line 6) * checking combination for validity: Combination properties. (line 18) * checking multiset for validity: Multiset properties. (line 17) * checking permutation for validity: Permutation properties. (line 14) * Chi(x): Hyperbolic Integrals. (line 6) * Chi-squared distribution: The Chi-squared Distribution. (line 15) * Cholesky decomposition: Cholesky Decomposition. (line 6) * Cholesky decomposition, modified: Modified Cholesky Decomposition. (line 6) * Cholesky decomposition, pivoted: Pivoted Cholesky Decomposition. (line 6) * Ci(x): Trigonometric Integrals. (line 6) * Clausen functions: Clausen Functions. (line 6) * Clenshaw-Curtis quadrature: Integrands with weight functions. (line 6) * CMRG, combined multiple recursive random number generator: Random number generator algorithms. (line 99) * code reuse in applications: Code Reuse. (line 6) * combinations: Combinations. (line 6) * combinatorial factor C(m,n): Factorials. (line 41) * combinatorial optimization: Simulated Annealing. (line 6) * comparison functions, definition: Sorting objects. (line 16) * compatibility: Using the library. (line 6) * compiling programs, include paths: Compiling and Linking. (line 6) * compiling programs, library paths: Linking programs with the library. (line 6) * complementary incomplete Gamma function: Incomplete Gamma Functions. (line 23) * complete Fermi-Dirac integrals: Complete Fermi-Dirac Integrals. (line 6) * complex arithmetic: Complex arithmetic operators. (line 6) * complex cosine function, special functions: Trigonometric Functions for Complex Arguments. (line 13) * Complex Gamma function: Gamma Functions. (line 56) * complex hermitian matrix, eigensystem: Complex Hermitian Matrices. (line 9) * complex log sine function, special functions: Trigonometric Functions for Complex Arguments. (line 18) * complex numbers: Complex Numbers. (line 6) * complex sinc function, special functions: Circular Trigonometric Functions. (line 22) * complex sine function, special functions: Trigonometric Functions for Complex Arguments. (line 8) * confluent hypergeometric function: Laguerre Functions. (line 6) * confluent hypergeometric functions: Hypergeometric Functions. (line 6) * conical functions: Legendre Functions and Spherical Harmonics. (line 6) * Conjugate gradient algorithm, minimization: Multimin Algorithms with Derivatives. (line 12) * conjugate of complex number: Complex arithmetic operators. (line 55) * constant matrix: Initializing matrix elements. (line 6) * constants, fundamental: Fundamental Constants. (line 6) * constants, mathematical--defined as macros: Mathematical Constants. (line 6) * constants, physical: Physical Constants. (line 6) * constants, prefixes: Prefixes. (line 6) * contacting the GSL developers: Further Information. (line 6) * conventions, used in manual: Conventions used in this manual. (line 6) * convergence, accelerating a series: Series Acceleration. (line 6) * conversion of units: Physical Constants. (line 6) * cooling schedule: Simulated Annealing algorithm. (line 23) * COPY, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 85) * correlation, of two datasets: Correlation. (line 6) * cosine function, special functions: Circular Trigonometric Functions. (line 12) * cosine of complex number: Complex Trigonometric Functions. (line 11) * cost function: Simulated Annealing. (line 6) * Coulomb wave functions: Coulomb Functions. (line 6) * coupling coefficients: Coupling Coefficients. (line 6) * covariance matrix, from linear regression: Linear regression with a constant term. (line 9) * covariance matrix, linear fits: Fitting Overview. (line 21) * covariance matrix, nonlinear fits: Nonlinear Least-Squares Covariance Matrix. (line 6) * covariance, of two datasets: Covariance. (line 6) * cquad, doubly-adaptive integration: CQUAD doubly-adaptive integration. (line 6) * CRAY random number generator, RANF: Other random number generators. (line 23) * cubic equation, solving: Cubic Equations. (line 6) * cubic splines: 1D Interpolation Types. (line 20) * cumulative distribution functions (CDFs): Random Number Distributions. (line 6) * Cylindrical Bessel Functions: Regular Cylindrical Bessel Functions. (line 6) * Daubechies wavelets: DWT Initialization. (line 20) * Dawson function: Dawson Function. (line 6) * DAXPY, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 96) * debugging numerical programs: Using gdb. (line 6) * Debye functions: Debye Functions. (line 6) * denormalized form, IEEE format: Representation of floating point numbers. (line 14) * deprecated functions: Deprecated Functions. (line 6) * derivatives, calculating numerically: Numerical Differentiation. (line 6) * determinant of a matrix, by LU decomposition: LU Decomposition. (line 82) * Deuflhard and Bader, Bulirsch-Stoer method.: Stepping Functions. (line 123) * DFTs, see FFT: Fast Fourier Transforms. (line 6) * diagonal, of a matrix: Creating row and column views. (line 62) * differential equations, initial value problems: Ordinary Differential Equations. (line 6) * differentiation of functions, numeric: Numerical Differentiation. (line 6) * digamma function: Psi (Digamma) Function. (line 6) * dilogarithm: Dilogarithm. (line 6) * direction vector, random 2D: Spherical Vector Distributions. (line 14) * direction vector, random 3D: Spherical Vector Distributions. (line 33) * direction vector, random N-dimensional: Spherical Vector Distributions. (line 42) * Dirichlet distribution: The Dirichlet Distribution. (line 8) * discontinuities, in ODE systems: Evolution. (line 77) * Discrete Fourier Transforms, see FFT: Fast Fourier Transforms. (line 6) * discrete Hankel transforms: Discrete Hankel Transforms. (line 6) * Discrete Newton algorithm for multidimensional roots: Algorithms without Derivatives. (line 27) * Discrete random numbers: General Discrete Distributions. (line 51) * Discrete random numbers <1>: General Discrete Distributions. (line 61) * Discrete random numbers <2>: General Discrete Distributions. (line 66) * Discrete random numbers <3>: General Discrete Distributions. (line 73) * Discrete random numbers, preprocessing: General Discrete Distributions. (line 51) * divided differences, polynomials: Divided Difference Representation of Polynomials. (line 6) * division by zero, IEEE exceptions: Setting up your IEEE environment. (line 6) * Dogleg algorithm: Nonlinear Least-Squares TRS Dogleg. (line 6) * Dogleg algorithm, double: Nonlinear Least-Squares TRS Double Dogleg. (line 6) * dollar sign '$', shell prompt: Conventions used in this manual. (line 11) * DOT, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 8) * double Dogleg algorithm: Nonlinear Least-Squares TRS Double Dogleg. (line 6) * double factorial: Factorials. (line 21) * double precision, IEEE format: Representation of floating point numbers. (line 40) * downloading GSL: Obtaining GSL. (line 6) * DWT initialization: DWT Initialization. (line 6) * DWT, mathematical definition: DWT Definitions. (line 6) * DWT, one dimensional: DWT in one dimension. (line 6) * DWT, see wavelet transforms: Wavelet Transforms. (line 6) * DWT, two dimensional: DWT in two dimension. (line 6) * e, defined as a macro: Mathematical Constants. (line 10) * E1(x), E2(x), Ei(x): Exponential Integral. (line 6) * eigenvalues and eigenvectors: Eigensystems. (line 6) * elementary functions: Mathematical Functions. (line 6) * elementary operations: Elementary Operations. (line 6) * elliptic functions (Jacobi): Elliptic Functions (Jacobi). (line 6) * elliptic integrals: Elliptic Integrals. (line 6) * energy function: Simulated Annealing. (line 6) * energy, units of: Thermal Energy and Power. (line 6) * erf(x): Error Functions. (line 6) * erfc(x): Error Functions. (line 6) * Erlang distribution: The Gamma Distribution. (line 15) * error codes: Error Codes. (line 13) * error codes, reserved: Error Codes. (line 6) * error function: Error Functions. (line 6) * Error handlers: Error Handlers. (line 6) * error handling: Error Handling. (line 6) * error handling macros: Using GSL error reporting in your own functions. (line 6) * Errors: Error Handling. (line 6) * estimated standard deviation: Statistics. (line 6) * estimated variance: Statistics. (line 6) * Eta Function: Eta Function. (line 6) * euclidean distance function, hypot: Elementary Functions. (line 23) * euclidean distance function, hypot <1>: Elementary Functions. (line 29) * Euler's constant, defined as a macro: Mathematical Constants. (line 58) * evaluation of polynomials: Polynomial Evaluation. (line 6) * evaluation of polynomials, in divided difference form: Divided Difference Representation of Polynomials. (line 6) * examples, conventions used in: Conventions used in this manual. (line 6) * exceptions, C++: Compatibility with C++. (line 6) * exceptions, floating point: Handling floating point exceptions. (line 6) * exceptions, IEEE arithmetic: Setting up your IEEE environment. (line 6) * exchanging permutation elements: Accessing permutation elements. (line 18) * exp: Exponential Functions. (line 6) * expm1: Elementary Functions. (line 18) * exponent, IEEE format: Representation of floating point numbers. (line 6) * Exponential distribution: The Exponential Distribution. (line 7) * exponential function: Exponential Functions. (line 6) * exponential integrals: Exponential Integrals. (line 6) * Exponential power distribution: The Exponential Power Distribution. (line 8) * exponential, difference from 1 computed accurately: Elementary Functions. (line 18) * exponentiation of complex number: Elementary Complex Functions. (line 16) * 'extern inline': Inline functions. (line 6) * F-distribution: The F-distribution. (line 15) * factorial: Factorials. (line 6) * factorial <1>: Factorials. (line 13) * factorization of matrices: Linear Algebra. (line 6) * false position algorithm for finding roots: Root Bracketing Algorithms. (line 33) * Fast Fourier Transforms, see FFT: Fast Fourier Transforms. (line 6) * Fehlberg method, differential equations: Stepping Functions. (line 95) * Fermi-Dirac function: Fermi-Dirac Function. (line 6) * FFT: Fast Fourier Transforms. (line 6) * FFT mathematical definition: Mathematical Definitions. (line 6) * FFT of complex data, mixed-radix algorithm: Mixed-radix FFT routines for complex data. (line 6) * FFT of complex data, radix-2 algorithm: Radix-2 FFT routines for complex data. (line 6) * FFT of real data: Overview of real data FFTs. (line 6) * FFT of real data, mixed-radix algorithm: Mixed-radix FFT routines for real data. (line 6) * FFT of real data, radix-2 algorithm: Radix-2 FFT routines for real data. (line 6) * FFT, complex data: Overview of complex data FFTs. (line 6) * finding minima: One dimensional Minimization. (line 6) * finding roots: One dimensional Root-Finding. (line 6) * finding zeros: One dimensional Root-Finding. (line 6) * fits, multi-parameter linear: Multi-parameter regression. (line 6) * fitting: Least-Squares Fitting. (line 6) * fitting, using Chebyshev polynomials: Chebyshev Approximations. (line 6) * Fj(x), Fermi-Dirac integral: Complete Fermi-Dirac Integrals. (line 6) * Fj(x,b), incomplete Fermi-Dirac integral: Incomplete Fermi-Dirac Integrals. (line 6) * flat distribution: The Flat (Uniform) Distribution. (line 8) * Fletcher-Reeves conjugate gradient algorithm, minimization: Multimin Algorithms with Derivatives. (line 12) * floating point exceptions: Handling floating point exceptions. (line 6) * floating point numbers, approximate comparison: Approximate Comparison of Floating Point Numbers. (line 13) * floating point registers: Examining floating point registers. (line 6) * force and energy, units of: Force and Energy. (line 6) * Fortran range checking, equivalent in gcc: Accessing vector elements. (line 6) * Four-tap Generalized Feedback Shift Register: Random number generator algorithms. (line 174) * Fourier integrals, numerical: QAWF adaptive integration for Fourier integrals. (line 6) * Fourier Transforms, see FFT: Fast Fourier Transforms. (line 6) * Fractional Order Bessel Functions: Regular Bessel Function - Fractional Order. (line 6) * free software, explanation of: GSL is Free Software. (line 6) * frexp: Elementary Functions. (line 49) * functions, numerical differentiation: Numerical Differentiation. (line 6) * fundamental constants: Fundamental Constants. (line 6) * Gamma distribution: The Gamma Distribution. (line 8) * gamma functions: Gamma Functions. (line 6) * Gauss-Kronrod quadrature: Integrands without weight functions. (line 6) * Gaussian distribution: The Gaussian Distribution. (line 7) * Gaussian distribution, bivariate: The Bivariate Gaussian Distribution. (line 8) * Gaussian distribution, bivariate <1>: The Multivariate Gaussian Distribution. (line 9) * Gaussian Tail distribution: The Gaussian Tail Distribution. (line 8) * gcc extensions, range-checking: Accessing vector elements. (line 6) * gcc warning options: GCC warning options for numerical programs. (line 6) * gdb: Using gdb. (line 6) * Gegenbauer functions: Gegenbauer Functions. (line 6) * GEMM, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 21) * GEMV, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 20) * general polynomial equations, solving: General Polynomial Equations. (line 6) * generalized eigensystems: Real Generalized Nonsymmetric Eigensystems. (line 6) * generalized hermitian definite eigensystems: Complex Generalized Hermitian-Definite Eigensystems. (line 6) * generalized symmetric eigensystems: Real Generalized Symmetric-Definite Eigensystems. (line 6) * Geometric random variates: The Geometric Distribution. (line 8) * Geometric random variates <1>: The Hypergeometric Distribution. (line 8) * GER, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 103) * GERC, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 112) * GERU, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 103) * Givens rotation: Givens Rotations. (line 6) * Givens Rotation, BLAS: Level 1 GSL BLAS Interface. (line 116) * Givens Rotation, Modified, BLAS: Level 1 GSL BLAS Interface. (line 135) * gmres: Sparse Iterative Solvers Types. (line 10) * GNU General Public License: Introduction. (line 6) * golden section algorithm for finding minima: Minimization Algorithms. (line 15) * GSL_C99_INLINE: Inline functions. (line 6) * 'GSL_RNG_SEED': Random number generator initialization. (line 17) * gsl_sf_result: The gsl_sf_result struct. (line 6) * gsl_sf_result_e10: The gsl_sf_result struct. (line 6) * Gumbel distribution (Type 1): The Type-1 Gumbel Distribution. (line 8) * Gumbel distribution (Type 2): The Type-2 Gumbel Distribution. (line 8) * Haar wavelets: DWT Initialization. (line 26) * Hankel transforms, discrete: Discrete Hankel Transforms. (line 6) * HAVE_INLINE: Inline functions. (line 6) * hazard function, normal distribution: Probability functions. (line 19) * HBOOK: Ntuple References and Further Reading. (line 6) * header files, including: Compiling and Linking. (line 6) * heapsort: Sorting. (line 6) * HEMM, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 55) * HEMV, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 85) * HER, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 130) * HER2, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 157) * HER2K, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 176) * HERK, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 136) * hermitian matrix, complex, eigensystem: Complex Hermitian Matrices. (line 9) * Hessenberg decomposition: Hessenberg Decomposition of Real Matrices. (line 6) * Hessenberg triangular decomposition: Hessenberg-Triangular Decomposition of Real Matrices. (line 6) * histogram statistics: Histogram Statistics. (line 6) * histogram, from ntuple: Histogramming ntuple values. (line 35) * histograms: Histograms. (line 6) * histograms, random sampling from: The histogram probability distribution struct. (line 6) * Householder linear solver: Householder solver for linear systems. (line 6) * Householder matrix: Householder Transformations. (line 6) * Householder transformation: Householder Transformations. (line 6) * Hurwitz Zeta Function: Hurwitz Zeta Function. (line 6) * HYBRID algorithm, unscaled without derivatives: Algorithms without Derivatives. (line 22) * HYBRID algorithms for nonlinear systems: Algorithms using Derivatives. (line 13) * HYBRIDJ algorithm: Algorithms using Derivatives. (line 65) * HYBRIDS algorithm, scaled without derivatives: Algorithms without Derivatives. (line 14) * HYBRIDSJ algorithm: Algorithms using Derivatives. (line 14) * hydrogen atom: Coulomb Functions. (line 6) * hyperbolic cosine, inverse: Elementary Functions. (line 33) * hyperbolic functions, complex numbers: Complex Hyperbolic Functions. (line 6) * hyperbolic integrals: Hyperbolic Integrals. (line 6) * hyperbolic sine, inverse: Elementary Functions. (line 37) * hyperbolic space: Legendre Functions and Spherical Harmonics. (line 6) * hyperbolic tangent, inverse: Elementary Functions. (line 41) * hypergeometric functions: Hypergeometric Functions. (line 6) * hypergeometric random variates: The Hypergeometric Distribution. (line 6) * hypot: Elementary Functions. (line 23) * hypot function, special functions: Circular Trigonometric Functions. (line 17) * I(x), Bessel Functions: Regular Modified Cylindrical Bessel Functions. (line 6) * i(x), Bessel Functions: Regular Modified Spherical Bessel Functions. (line 6) * identity matrix: Initializing matrix elements. (line 6) * identity permutation: Permutation allocation. (line 20) * IEEE exceptions: Setting up your IEEE environment. (line 6) * IEEE floating point: IEEE floating-point arithmetic. (line 6) * IEEE format for floating point numbers: Representation of floating point numbers. (line 6) * IEEE infinity, defined as a macro: Infinities and Not-a-number. (line 6) * IEEE NaN, defined as a macro: Infinities and Not-a-number. (line 6) * illumination, units of: Light and Illumination. (line 6) * imperial units: Imperial Units. (line 6) * Implicit Euler method: Stepping Functions. (line 105) * Implicit Runge-Kutta method: Stepping Functions. (line 111) * importance sampling, VEGAS: VEGAS. (line 6) * including GSL header files: Compiling and Linking. (line 6) * incomplete Beta function, normalized: Incomplete Beta Function. (line 9) * incomplete Fermi-Dirac integral: Incomplete Fermi-Dirac Integrals. (line 6) * incomplete Gamma function: Incomplete Gamma Functions. (line 16) * indirect sorting: Sorting objects. (line 58) * indirect sorting, of vector elements: Sorting vectors. (line 44) * infinity, defined as a macro: Infinities and Not-a-number. (line 6) * infinity, IEEE format: Representation of floating point numbers. (line 27) * info-gsl mailing list: Obtaining GSL. (line 6) * initial value problems, differential equations: Ordinary Differential Equations. (line 6) * initializing matrices: Initializing matrix elements. (line 6) * initializing vectors: Initializing vector elements. (line 6) * inline functions: Inline functions. (line 6) * integer powers: Power Function. (line 6) * integrals, exponential: Exponential Integrals. (line 6) * integration, numerical (quadrature): Numerical Integration. (line 6) * interpolation: Interpolation. (line 6) * interpolation, using Chebyshev polynomials: Chebyshev Approximations. (line 6) * inverse complex trigonometric functions: Inverse Complex Trigonometric Functions. (line 6) * inverse cumulative distribution functions: Random Number Distributions. (line 6) * inverse hyperbolic cosine: Elementary Functions. (line 33) * inverse hyperbolic functions, complex numbers: Inverse Complex Hyperbolic Functions. (line 6) * inverse hyperbolic sine: Elementary Functions. (line 37) * inverse hyperbolic tangent: Elementary Functions. (line 41) * inverse of a matrix, by LU decomposition: LU Decomposition. (line 69) * inverting a permutation: Permutation functions. (line 11) * Irregular Cylindrical Bessel Functions: Irregular Cylindrical Bessel Functions. (line 6) * Irregular Modified Bessel Functions, Fractional Order: Irregular Modified Bessel Functions - Fractional Order. (line 6) * Irregular Modified Cylindrical Bessel Functions: Irregular Modified Cylindrical Bessel Functions. (line 6) * Irregular Modified Spherical Bessel Functions: Irregular Modified Spherical Bessel Functions. (line 6) * Irregular Spherical Bessel Functions: Irregular Spherical Bessel Functions. (line 6) * iterating through combinations: Combination functions. (line 7) * iterating through multisets: Multiset functions. (line 7) * iterating through permutations: Permutation functions. (line 15) * iterative refinement of solutions in linear systems: LU Decomposition. (line 58) * J(x), Bessel Functions: Regular Cylindrical Bessel Functions. (line 6) * j(x), Bessel Functions: Regular Spherical Bessel Functions. (line 6) * Jacobi elliptic functions: Elliptic Functions (Jacobi). (line 6) * Jacobi orthogonalization: Singular Value Decomposition. (line 58) * Jacobian matrix, ODEs: Defining the ODE System. (line 34) * Jacobian matrix, root finding: Overview of Multidimensional Root Finding. (line 42) * K(x), Bessel Functions: Irregular Modified Cylindrical Bessel Functions. (line 6) * k(x), Bessel Functions: Irregular Modified Spherical Bessel Functions. (line 6) * knots, basis splines: Constructing the knots vector. (line 6) * kurtosis: Higher moments (skewness and kurtosis). (line 6) * Laguerre functions: Laguerre Functions. (line 6) * Lambert function: Lambert W Functions. (line 6) * Landau distribution: The Landau Distribution. (line 7) * LAPACK: Eigenvalue and Eigenvector References. (line 18) * Laplace distribution: The Laplace Distribution. (line 7) * large dense linear least squares: Large Dense Linear Systems. (line 6) * large linear least squares, normal equations: Large Dense Linear Systems Normal Equations. (line 6) * large linear least squares, routines: Large Dense Linear Systems Routines. (line 6) * large linear least squares, steps: Large Dense Linear Systems Solution Steps. (line 6) * large linear least squares, TSQR: Large Dense Linear Systems TSQR. (line 6) * ldexp: Elementary Functions. (line 45) * LD_LIBRARY_PATH: Shared Libraries. (line 6) * leading dimension, matrices: Matrices. (line 6) * least squares fit: Least-Squares Fitting. (line 6) * least squares troubleshooting: Troubleshooting. (line 6) * least squares, covariance of best-fit parameters: Nonlinear Least-Squares Covariance Matrix. (line 6) * least squares, nonlinear: Nonlinear Least-Squares Fitting. (line 6) * least squares, regularized: Regularized regression. (line 6) * least squares, robust: Robust linear regression. (line 6) * Legendre forms of elliptic integrals: Definition of Legendre Forms. (line 6) * Legendre functions: Legendre Functions and Spherical Harmonics. (line 6) * Legendre polynomials: Legendre Functions and Spherical Harmonics. (line 6) * length, computed accurately using hypot: Elementary Functions. (line 23) * length, computed accurately using hypot <1>: Elementary Functions. (line 29) * Levenberg-Marquardt algorithm: Nonlinear Least-Squares TRS Levenberg-Marquardt. (line 6) * Levenberg-Marquardt algorithm, geodesic acceleration: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration. (line 6) * Levin u-transform: Series Acceleration. (line 6) * Levy distribution: The Levy alpha-Stable Distributions. (line 8) * Levy distribution, skew: The Levy skew alpha-Stable Distribution. (line 8) * libraries, linking with: Linking programs with the library. (line 6) * libraries, shared: Shared Libraries. (line 6) * license of GSL: Introduction. (line 6) * light, units of: Light and Illumination. (line 6) * linear algebra: Linear Algebra. (line 6) * linear algebra, BLAS: BLAS Support. (line 6) * linear algebra, sparse: Sparse Linear Algebra. (line 6) * linear interpolation: 1D Interpolation Types. (line 9) * linear least squares, large: Large Dense Linear Systems. (line 6) * linear regression: Linear regression. (line 6) * linear systems, refinement of solutions: LU Decomposition. (line 58) * linear systems, solution of: LU Decomposition. (line 40) * linking with GSL libraries: Linking programs with the library. (line 6) * log1p: Elementary Functions. (line 13) * logarithm and related functions: Logarithm and Related Functions. (line 6) * logarithm of Beta function: Beta Functions. (line 16) * logarithm of combinatorial factor C(m,n): Factorials. (line 47) * logarithm of complex number: Elementary Complex Functions. (line 29) * logarithm of cosh function, special functions: Hyperbolic Trigonometric Functions. (line 12) * logarithm of double factorial: Factorials. (line 35) * logarithm of factorial: Factorials. (line 28) * logarithm of Gamma function: Gamma Functions. (line 24) * logarithm of Pochhammer symbol: Pochhammer Symbol. (line 17) * logarithm of sinh function, special functions: Hyperbolic Trigonometric Functions. (line 8) * logarithm of the determinant of a matrix: LU Decomposition. (line 90) * logarithm, computed accurately near 1: Elementary Functions. (line 13) * Logarithmic random variates: The Logarithmic Distribution. (line 8) * Logistic distribution: The Logistic Distribution. (line 7) * Lognormal distribution: The Lognormal Distribution. (line 8) * long double: Long double. (line 6) * low discrepancy sequences: Quasi-Random Sequences. (line 6) * Low-level CBLAS: GSL CBLAS Library. (line 6) * LU decomposition: LU Decomposition. (line 6) * macros for mathematical constants: Mathematical Constants. (line 6) * magnitude of complex number: Properties of complex numbers. (line 11) * mailing list archives: Further Information. (line 6) * mailing list for GSL announcements: Obtaining GSL. (line 6) * mailing list, bug-gsl: Reporting Bugs. (line 6) * mantissa, IEEE format: Representation of floating point numbers. (line 6) * mass, units of: Mass and Weight. (line 6) * mathematical constants, defined as macros: Mathematical Constants. (line 6) * mathematical functions, elementary: Mathematical Functions. (line 6) * Mathieu Function Characteristic Values: Mathieu Function Characteristic Values. (line 6) * Mathieu functions: Mathieu Functions. (line 6) * matrices: Vectors and Matrices. (line 6) * matrices <1>: Matrices. (line 6) * matrices, initializing: Initializing matrix elements. (line 6) * matrices, range-checking: Accessing matrix elements. (line 6) * matrices, sparse: Sparse Matrices. (line 6) * matrix determinant: LU Decomposition. (line 82) * matrix diagonal: Creating row and column views. (line 62) * matrix factorization: Linear Algebra. (line 6) * matrix inverse: LU Decomposition. (line 69) * matrix square root, Cholesky decomposition: Cholesky Decomposition. (line 6) * matrix subdiagonal: Creating row and column views. (line 74) * matrix superdiagonal: Creating row and column views. (line 86) * matrix, constant: Initializing matrix elements. (line 6) * matrix, identity: Initializing matrix elements. (line 6) * matrix, operations: BLAS Support. (line 6) * matrix, zero: Initializing matrix elements. (line 6) * max: Statistics. (line 6) * maximal phase, Daubechies wavelets: DWT Initialization. (line 20) * maximization, see minimization: One dimensional Minimization. (line 6) * maximum of two numbers: Maximum and Minimum functions. (line 11) * maximum value, from histogram: Histogram Statistics. (line 6) * mean: Statistics. (line 6) * mean value, from histogram: Histogram Statistics. (line 24) * Mills' ratio, inverse: Probability functions. (line 19) * min: Statistics. (line 6) * minimization, BFGS algorithm: Multimin Algorithms with Derivatives. (line 37) * minimization, caveats: Minimization Caveats. (line 6) * minimization, conjugate gradient algorithm: Multimin Algorithms with Derivatives. (line 12) * minimization, multidimensional: Multidimensional Minimization. (line 6) * minimization, one-dimensional: One dimensional Minimization. (line 6) * minimization, overview: Minimization Overview. (line 6) * minimization, Polak-Ribiere algorithm: Multimin Algorithms with Derivatives. (line 29) * minimization, providing a function to minimize: Providing the function to minimize. (line 6) * minimization, simplex algorithm: Multimin Algorithms without Derivatives. (line 11) * minimization, steepest descent algorithm: Multimin Algorithms with Derivatives. (line 56) * minimization, stopping parameters: Minimization Stopping Parameters. (line 6) * minimum finding, Brent's method: Minimization Algorithms. (line 31) * minimum finding, golden section algorithm: Minimization Algorithms. (line 15) * minimum of two numbers: Maximum and Minimum functions. (line 15) * minimum value, from histogram: Histogram Statistics. (line 6) * MINPACK, minimization algorithms: Algorithms using Derivatives. (line 14) * MISCFUN: Special Functions References and Further Reading. (line 11) * MISER monte carlo integration: MISER. (line 6) * Mixed-radix FFT, complex data: Mixed-radix FFT routines for complex data. (line 6) * Mixed-radix FFT, real data: Mixed-radix FFT routines for real data. (line 6) * Modified Bessel Functions, Fractional Order: Regular Modified Bessel Functions - Fractional Order. (line 6) * Modified Cholesky Decomposition: Modified Cholesky Decomposition. (line 6) * Modified Clenshaw-Curtis quadrature: Integrands with weight functions. (line 6) * Modified Cylindrical Bessel Functions: Regular Modified Cylindrical Bessel Functions. (line 6) * Modified Givens Rotation, BLAS: Level 1 GSL BLAS Interface. (line 135) * Modified Newton's method for nonlinear systems: Algorithms using Derivatives. (line 91) * Modified Spherical Bessel Functions: Regular Modified Spherical Bessel Functions. (line 6) * Monte Carlo integration: Monte Carlo Integration. (line 6) * MRG, multiple recursive random number generator: Random number generator algorithms. (line 121) * MT19937 random number generator: Random number generator algorithms. (line 20) * multi-parameter regression: Multi-parameter regression. (line 6) * multidimensional integration: Monte Carlo Integration. (line 6) * multidimensional root finding, Broyden algorithm: Algorithms without Derivatives. (line 46) * multidimensional root finding, overview: Overview of Multidimensional Root Finding. (line 6) * multidimensional root finding, providing a function to solve: Providing the multidimensional system of equations to solve. (line 6) * Multimin, caveats: Multimin Caveats. (line 6) * Multinomial distribution: The Multinomial Distribution. (line 8) * multiplication: Elementary Operations. (line 6) * multisets: Multisets. (line 6) * multistep methods, ODEs: Stepping Functions. (line 128) * N-dimensional random direction vector: Spherical Vector Distributions. (line 42) * NaN, defined as a macro: Infinities and Not-a-number. (line 6) * nautical units: Speed and Nautical Units. (line 6) * Negative Binomial distribution, random variates: The Negative Binomial Distribution. (line 8) * Nelder-Mead simplex algorithm for minimization: Multimin Algorithms without Derivatives. (line 11) * Newton algorithm, discrete: Algorithms without Derivatives. (line 27) * Newton algorithm, globally convergent: Algorithms using Derivatives. (line 91) * Newton's method for finding roots: Root Finding Algorithms using Derivatives. (line 16) * Newton's method for systems of nonlinear equations: Algorithms using Derivatives. (line 71) * Niederreiter sequence: Quasi-Random Sequences. (line 6) * NIST Statistical Reference Datasets: Fitting References and Further Reading. (line 16) * non-normalized incomplete Gamma function: Incomplete Gamma Functions. (line 9) * nonlinear equation, solutions of: One dimensional Root-Finding. (line 6) * nonlinear fitting, stopping parameters, convergence: Nonlinear Least-Squares Testing for Convergence. (line 6) * nonlinear functions, minimization: One dimensional Minimization. (line 6) * nonlinear least squares: Nonlinear Least-Squares Fitting. (line 6) * nonlinear least squares, dogleg: Nonlinear Least-Squares TRS Dogleg. (line 6) * nonlinear least squares, double dogleg: Nonlinear Least-Squares TRS Double Dogleg. (line 6) * nonlinear least squares, levenberg-marquardt: Nonlinear Least-Squares TRS Levenberg-Marquardt. (line 6) * nonlinear least squares, levenberg-marquardt, geodesic acceleration: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration. (line 6) * nonlinear least squares, overview: Nonlinear Least-Squares Overview. (line 6) * nonlinear systems of equations, solution of: Multidimensional Root-Finding. (line 6) * nonsymmetric matrix, real, eigensystem: Real Nonsymmetric Matrices. (line 6) * Nordsieck form: Stepping Functions. (line 128) * normalized form, IEEE format: Representation of floating point numbers. (line 14) * normalized incomplete Beta function: Incomplete Beta Function. (line 9) * Not-a-number, defined as a macro: Infinities and Not-a-number. (line 6) * NRM2, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 36) * ntuples: N-tuples. (line 6) * nuclear physics, constants: Atomic and Nuclear Physics. (line 6) * numerical constants, defined as macros: Mathematical Constants. (line 6) * numerical derivatives: Numerical Differentiation. (line 6) * numerical integration (quadrature): Numerical Integration. (line 6) * obtaining GSL: Obtaining GSL. (line 6) * ODEs, initial value problems: Ordinary Differential Equations. (line 6) * online statistics: Running Statistics. (line 6) * optimization, combinatorial: Simulated Annealing. (line 6) * optimization, see minimization: One dimensional Minimization. (line 6) * optimized functions, alternatives: Alternative optimized functions. (line 6) * ordering, matrix elements: Matrices. (line 6) * ordinary differential equations, initial value problem: Ordinary Differential Equations. (line 6) * oscillatory functions, numerical integration of: QAWO adaptive integration for oscillatory functions. (line 6) * overflow, IEEE exceptions: Setting up your IEEE environment. (line 6) * Pareto distribution: The Pareto Distribution. (line 8) * PAW: Ntuple References and Further Reading. (line 6) * permutations: Permutations. (line 6) * physical constants: Physical Constants. (line 6) * physical dimension, matrices: Matrices. (line 6) * pi, defined as a macro: Mathematical Constants. (line 28) * Pivoted Cholesky Decomposition: Pivoted Cholesky Decomposition. (line 6) * plain Monte Carlo: PLAIN Monte Carlo. (line 6) * Pochhammer symbol: Pochhammer Symbol. (line 9) * Poisson random numbers: The Poisson Distribution. (line 8) * Polak-Ribiere algorithm, minimization: Multimin Algorithms with Derivatives. (line 29) * polar form of complex numbers: Representation of complex numbers. (line 6) * polar to rectangular conversion: Conversion Functions. (line 6) * polygamma functions: Psi (Digamma) Function. (line 6) * polynomial evaluation: Polynomial Evaluation. (line 6) * polynomial interpolation: 1D Interpolation Types. (line 13) * polynomials, roots of: Polynomials. (line 6) * power function: Power Function. (line 6) * power of complex number: Elementary Complex Functions. (line 16) * power, units of: Thermal Energy and Power. (line 6) * precision, IEEE arithmetic: Setting up your IEEE environment. (line 6) * predictor-corrector method, ODEs: Stepping Functions. (line 128) * prefixes: Prefixes. (line 6) * pressure, units of: Pressure. (line 6) * Prince-Dormand, Runge-Kutta method: Stepping Functions. (line 102) * printers units: Printers Units. (line 6) * probability distribution, from histogram: The histogram probability distribution struct. (line 6) * probability distributions, from histograms: Resampling from histograms. (line 6) * projection of ntuples: Histogramming ntuple values. (line 35) * psi function: Psi (Digamma) Function. (line 6) * QAG quadrature algorithm: QAG adaptive integration. (line 6) * QAGI quadrature algorithm: QAGI adaptive integration on infinite intervals. (line 6) * QAGP quadrature algorithm: QAGP adaptive integration with known singular points. (line 6) * QAGS quadrature algorithm: QAGS adaptive integration with singularities. (line 6) * QAWC quadrature algorithm: QAWC adaptive integration for Cauchy principal values. (line 6) * QAWF quadrature algorithm: QAWF adaptive integration for Fourier integrals. (line 6) * QAWO quadrature algorithm: QAWO adaptive integration for oscillatory functions. (line 6) * QAWS quadrature algorithm: QAWS adaptive integration for singular functions. (line 6) * QNG quadrature algorithm: QNG non-adaptive Gauss-Kronrod integration. (line 6) * QR decomposition: QR Decomposition. (line 6) * QR decomposition with column pivoting: QR Decomposition with Column Pivoting. (line 6) * QUADPACK: Numerical Integration. (line 6) * quadratic equation, solving: Quadratic Equations. (line 6) * quadrature: Numerical Integration. (line 6) * quantile functions: Random Number Distributions. (line 6) * quasi-random sequences: Quasi-Random Sequences. (line 6) * R250 shift-register random number generator: Other random number generators. (line 60) * Racah coefficients: Coupling Coefficients. (line 6) * Radial Mathieu Functions: Radial Mathieu Functions. (line 6) * radioactivity, units of: Radioactivity. (line 6) * Radix-2 FFT for real data: Radix-2 FFT routines for real data. (line 6) * Radix-2 FFT, complex data: Radix-2 FFT routines for complex data. (line 6) * rand, BSD random number generator: Unix random number generators. (line 17) * rand48 random number generator: Unix random number generators. (line 58) * random number distributions: Random Number Distributions. (line 6) * random number generators: Random Number Generation. (line 6) * random sampling from histograms: The histogram probability distribution struct. (line 6) * RANDU random number generator: Other random number generators. (line 105) * RANF random number generator: Other random number generators. (line 23) * range: Statistics. (line 6) * range-checking for matrices: Accessing matrix elements. (line 6) * range-checking for vectors: Accessing vector elements. (line 6) * RANLUX random number generator: Random number generator algorithms. (line 74) * RANLXD random number generator: Random number generator algorithms. (line 66) * RANLXS random number generator: Random number generator algorithms. (line 47) * RANMAR random number generator: Other random number generators. (line 54) * RANMAR random number generator <1>: Other random number generators. (line 114) * Rayleigh distribution: The Rayleigh Distribution. (line 7) * Rayleigh Tail distribution: The Rayleigh Tail Distribution. (line 8) * real nonsymmetric matrix, eigensystem: Real Nonsymmetric Matrices. (line 6) * real symmetric matrix, eigensystem: Real Symmetric Matrices. (line 6) * Reciprocal Gamma function: Gamma Functions. (line 51) * rectangular to polar conversion: Conversion Functions. (line 6) * recursive stratified sampling, MISER: MISER. (line 6) * reduction of angular variables: Restriction Functions. (line 6) * refinement of solutions in linear systems: LU Decomposition. (line 58) * regression, least squares: Least-Squares Fitting. (line 6) * regression, ridge: Regularized regression. (line 6) * regression, robust: Robust linear regression. (line 6) * regression, Tikhonov: Regularized regression. (line 6) * Regular Bessel Functions, Fractional Order: Regular Bessel Function - Fractional Order. (line 6) * Regular Bessel Functions, Zeros of: Zeros of Regular Bessel Functions. (line 6) * Regular Cylindrical Bessel Functions: Regular Cylindrical Bessel Functions. (line 6) * Regular Modified Bessel Functions, Fractional Order: Regular Modified Bessel Functions - Fractional Order. (line 6) * Regular Modified Cylindrical Bessel Functions: Regular Modified Cylindrical Bessel Functions. (line 6) * Regular Modified Spherical Bessel Functions: Regular Modified Spherical Bessel Functions. (line 6) * Regular Spherical Bessel Functions: Regular Spherical Bessel Functions. (line 6) * Regulated Gamma function: Gamma Functions. (line 42) * relative Pochhammer symbol: Pochhammer Symbol. (line 30) * reporting bugs in GSL: Reporting Bugs. (line 6) * representations of complex numbers: Representation of complex numbers. (line 6) * resampling from histograms: Resampling from histograms. (line 6) * residual, in nonlinear systems of equations: Search Stopping Parameters for the multidimensional solver. (line 32) * reversing a permutation: Permutation functions. (line 7) * ridge regression: Regularized regression. (line 6) * Riemann Zeta Function: Riemann Zeta Function. (line 6) * RK2, Runge-Kutta method: Stepping Functions. (line 87) * RK4, Runge-Kutta method: Stepping Functions. (line 90) * RKF45, Runge-Kutta-Fehlberg method: Stepping Functions. (line 95) * robust regression: Robust linear regression. (line 6) * root finding: One dimensional Root-Finding. (line 6) * root finding, bisection algorithm: Root Bracketing Algorithms. (line 18) * root finding, Brent's method: Root Bracketing Algorithms. (line 50) * root finding, caveats: Root Finding Caveats. (line 6) * root finding, false position algorithm: Root Bracketing Algorithms. (line 33) * root finding, initial guess: Search Bounds and Guesses. (line 6) * root finding, Newton's method: Root Finding Algorithms using Derivatives. (line 16) * root finding, overview: Root Finding Overview. (line 6) * root finding, providing a function to solve: Providing the function to solve. (line 6) * root finding, search bounds: Search Bounds and Guesses. (line 6) * root finding, secant method: Root Finding Algorithms using Derivatives. (line 30) * root finding, Steffenson's method: Root Finding Algorithms using Derivatives. (line 61) * root finding, stopping parameters: Search Stopping Parameters. (line 6) * root finding, stopping parameters <1>: Search Stopping Parameters for the multidimensional solver. (line 6) * roots: One dimensional Root-Finding. (line 6) * ROTG, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 116) * rounding mode: Setting up your IEEE environment. (line 6) * Runge-Kutta Cash-Karp method: Stepping Functions. (line 99) * Runge-Kutta methods, ordinary differential equations: Stepping Functions. (line 87) * Runge-Kutta Prince-Dormand method: Stepping Functions. (line 102) * running statistics: Running Statistics. (line 6) * safe comparison of floating point numbers: Approximate Comparison of Floating Point Numbers. (line 13) * safeguarded step-length algorithm: Minimization Algorithms. (line 47) * sampling from histograms: Resampling from histograms. (line 6) * sampling from histograms <1>: The histogram probability distribution struct. (line 6) * SAXPY, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 96) * SCAL, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 109) * schedule, cooling: Simulated Annealing algorithm. (line 23) * se(q,x), Mathieu function: Angular Mathieu Functions. (line 6) * secant method for finding roots: Root Finding Algorithms using Derivatives. (line 30) * selection function, ntuples: Histogramming ntuple values. (line 13) * series, acceleration: Series Acceleration. (line 6) * shared libraries: Shared Libraries. (line 6) * shell prompt: Conventions used in this manual. (line 6) * Shi(x): Hyperbolic Integrals. (line 6) * shift-register random number generator: Other random number generators. (line 60) * Si(x): Trigonometric Integrals. (line 6) * sign bit, IEEE format: Representation of floating point numbers. (line 6) * sign of the determinant of a matrix: LU Decomposition. (line 98) * simplex algorithm, minimization: Multimin Algorithms without Derivatives. (line 11) * simulated annealing: Simulated Annealing. (line 6) * sin, of complex number: Complex Trigonometric Functions. (line 7) * sine function, special functions: Circular Trigonometric Functions. (line 8) * single precision, IEEE format: Representation of floating point numbers. (line 31) * singular functions, numerical integration of: QAWS adaptive integration for singular functions. (line 6) * singular points, specifying positions in quadrature: QAGP adaptive integration with known singular points. (line 6) * singular value decomposition: Singular Value Decomposition. (line 6) * Skew Levy distribution: The Levy skew alpha-Stable Distribution. (line 8) * skewness: Higher moments (skewness and kurtosis). (line 6) * slope, see numerical derivative: Numerical Differentiation. (line 6) * Sobol sequence: Quasi-Random Sequences. (line 6) * solution of linear system by Householder transformations: Householder solver for linear systems. (line 6) * solution of linear systems, Ax=b: Linear Algebra. (line 6) * solving a nonlinear equation: One dimensional Root-Finding. (line 6) * solving nonlinear systems of equations: Multidimensional Root-Finding. (line 6) * sorting: Sorting. (line 6) * sorting eigenvalues and eigenvectors: Sorting Eigenvalues and Eigenvectors. (line 6) * sorting vector elements: Sorting vectors. (line 23) * source code, reuse in applications: Code Reuse. (line 6) * sparse BLAS: Sparse BLAS Support. (line 6) * sparse linear algebra: Sparse Linear Algebra. (line 6) * sparse linear algebra, examples: Sparse Linear Algebra Examples. (line 6) * sparse linear algebra, iterative solvers: Sparse Iterative Solvers. (line 6) * sparse linear algebra, overview: Overview of Sparse Linear Algebra. (line 6) * sparse linear algebra, references: Sparse Linear Algebra References and Further Reading. (line 6) * sparse matrices: Sparse Matrices. (line 6) * sparse matrices, accessing elements: Sparse Matrices Accessing Elements. (line 6) * sparse matrices, allocation: Sparse Matrices Allocation. (line 6) * sparse matrices, BLAS operations: Sparse BLAS operations. (line 6) * sparse matrices, compression: Sparse Matrices Compressed Format. (line 6) * sparse matrices, conversion: Sparse Matrices Conversion Between Sparse and Dense. (line 6) * sparse matrices, copying: Sparse Matrices Copying. (line 6) * sparse matrices, examples: Sparse Matrices Examples. (line 6) * sparse matrices, exchanging rows and columns: Sparse Matrices Exchanging Rows and Columns. (line 6) * sparse matrices, initializing elements: Sparse Matrices Initializing Elements. (line 6) * sparse matrices, iterative solvers: Sparse Iterative Solvers. (line 6) * sparse matrices, min/max elements: Sparse Matrices Finding Maximum and Minimum Elements. (line 6) * sparse matrices, operations: Sparse Matrices Operations. (line 6) * sparse matrices, overview: Sparse Matrices Overview. (line 6) * sparse matrices, properties: Sparse Matrices Properties. (line 6) * sparse matrices, reading: Sparse Matrices Reading and Writing. (line 6) * sparse matrices, references: Sparse Matrices References and Further Reading. (line 6) * sparse matrices, references <1>: Sparse BLAS References and Further Reading. (line 6) * sparse matrices, writing: Sparse Matrices Reading and Writing. (line 6) * sparse, iterative solvers: Sparse Iterative Solvers. (line 6) * special functions: Special Functions. (line 6) * Spherical Bessel Functions: Regular Spherical Bessel Functions. (line 6) * spherical harmonics: Legendre Functions and Spherical Harmonics. (line 6) * spherical random variates, 2D: Spherical Vector Distributions. (line 14) * spherical random variates, 3D: Spherical Vector Distributions. (line 33) * spherical random variates, N-dimensional: Spherical Vector Distributions. (line 42) * spline: Interpolation. (line 6) * splines, basis: Basis Splines. (line 6) * square root of a matrix, Cholesky decomposition: Cholesky Decomposition. (line 6) * square root of complex number: Elementary Complex Functions. (line 7) * standard deviation: Statistics. (line 6) * standard deviation, from histogram: Histogram Statistics. (line 30) * standards conformance, ANSI C: Using the library. (line 6) * Statistical Reference Datasets (StRD): Fitting References and Further Reading. (line 16) * statistics: Statistics. (line 6) * statistics, from histogram: Histogram Statistics. (line 6) * steepest descent algorithm, minimization: Multimin Algorithms with Derivatives. (line 56) * Steffenson's method for finding roots: Root Finding Algorithms using Derivatives. (line 61) * stratified sampling in Monte Carlo integration: Monte Carlo Integration. (line 6) * stride, of vector index: Vectors. (line 6) * Student t-distribution: The t-distribution. (line 15) * subdiagonal, of a matrix: Creating row and column views. (line 74) * summation, acceleration: Series Acceleration. (line 6) * superdiagonal, matrix: Creating row and column views. (line 86) * SVD: Singular Value Decomposition. (line 6) * SWAP, Level-1 BLAS: Level 1 GSL BLAS Interface. (line 76) * swapping permutation elements: Accessing permutation elements. (line 18) * SYMM, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 40) * symmetric matrix, real, eigensystem: Real Symmetric Matrices. (line 6) * SYMV, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 71) * synchrotron functions: Synchrotron Functions. (line 6) * SYR, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 119) * SYR2, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 143) * SYR2K, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 159) * SYRK, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 122) * systems of equations, nonlinear: Multidimensional Root-Finding. (line 6) * t-distribution: The t-distribution. (line 15) * t-test: Statistics. (line 6) * tangent of complex number: Complex Trigonometric Functions. (line 15) * Tausworthe random number generator: Random number generator algorithms. (line 139) * Taylor coefficients, computation of: Factorials. (line 53) * testing combination for validity: Combination properties. (line 18) * testing multiset for validity: Multiset properties. (line 17) * testing permutation for validity: Permutation properties. (line 14) * thermal energy, units of: Thermal Energy and Power. (line 6) * Tikhonov regression: Regularized regression. (line 6) * time units: Measurement of Time. (line 6) * trailing dimension, matrices: Matrices. (line 6) * transformation, Householder: Householder Transformations. (line 6) * transforms, Hankel: Discrete Hankel Transforms. (line 6) * transforms, wavelet: Wavelet Transforms. (line 6) * transport functions: Transport Functions. (line 6) * traveling salesman problem: Traveling Salesman Problem. (line 6) * triangular systems: Triangular Systems. (line 6) * tridiagonal decomposition: Tridiagonal Decomposition of Real Symmetric Matrices. (line 6) * tridiagonal decomposition <1>: Tridiagonal Decomposition of Hermitian Matrices. (line 6) * tridiagonal systems: Tridiagonal Systems. (line 6) * trigonometric functions: Trigonometric Functions. (line 6) * trigonometric functions of complex numbers: Complex Trigonometric Functions. (line 6) * trigonometric integrals: Trigonometric Integrals. (line 6) * TRMM, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 76) * TRMV, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 36) * TRSM, Level-3 BLAS: Level 3 GSL BLAS Interface. (line 99) * TRSV, Level-2 BLAS: Level 2 GSL BLAS Interface. (line 57) * TSP: Traveling Salesman Problem. (line 6) * TT800 random number generator: Other random number generators. (line 75) * two dimensional Gaussian distribution: The Bivariate Gaussian Distribution. (line 8) * two dimensional Gaussian distribution <1>: The Multivariate Gaussian Distribution. (line 9) * two dimensional histograms: Two dimensional histograms. (line 6) * two-sided exponential distribution: The Laplace Distribution. (line 7) * Type 1 Gumbel distribution, random variates: The Type-1 Gumbel Distribution. (line 8) * Type 2 Gumbel distribution: The Type-2 Gumbel Distribution. (line 8) * u-transform for series: Series Acceleration. (line 6) * underflow, IEEE exceptions: Setting up your IEEE environment. (line 6) * uniform distribution: The Flat (Uniform) Distribution. (line 8) * units, conversion of: Physical Constants. (line 6) * units, imperial: Imperial Units. (line 6) * Unix random number generators, rand: Unix random number generators. (line 17) * Unix random number generators, rand48: Unix random number generators. (line 17) * unnormalized incomplete Gamma function: Incomplete Gamma Functions. (line 9) * unweighted linear fits: Least-Squares Fitting. (line 6) * usage, compiling application programs: Using the library. (line 6) * value function, ntuples: Histogramming ntuple values. (line 24) * Van der Pol oscillator, example: ODE Example programs. (line 6) * variance: Statistics. (line 6) * variance, from histogram: Histogram Statistics. (line 30) * variance-covariance matrix, linear fits: Fitting Overview. (line 47) * VAX random number generator: Other random number generators. (line 87) * vector, operations: BLAS Support. (line 6) * vector, sorting elements of: Sorting vectors. (line 23) * vectors: Vectors and Matrices. (line 6) * vectors <1>: Vectors. (line 6) * vectors, initializing: Initializing vector elements. (line 6) * vectors, range-checking: Accessing vector elements. (line 6) * VEGAS Monte Carlo integration: VEGAS. (line 6) * viscosity, units of: Viscosity. (line 6) * volume units: Volume Area and Length. (line 6) * W function: Lambert W Functions. (line 6) * warning options: GCC warning options for numerical programs. (line 6) * warranty (none): No Warranty. (line 6) * wavelet transforms: Wavelet Transforms. (line 6) * website, developer information: Further Information. (line 6) * Weibull distribution: The Weibull Distribution. (line 8) * weight, units of: Mass and Weight. (line 6) * weighted linear fits: Least-Squares Fitting. (line 6) * Wigner coefficients: Coupling Coefficients. (line 6) * Y(x), Bessel Functions: Irregular Cylindrical Bessel Functions. (line 6) * y(x), Bessel Functions: Irregular Spherical Bessel Functions. (line 6) * zero finding: One dimensional Root-Finding. (line 6) * zero matrix: Initializing matrix elements. (line 6) * zero, IEEE format: Representation of floating point numbers. (line 27) * Zeros of Regular Bessel Functions: Zeros of Regular Bessel Functions. (line 6) * Zeta functions: Zeta Functions. (line 6) * Ziggurat method: The Gaussian Distribution. (line 29) gsl-doc-2.3/doc/permutation.texi0000644000175000017500000003714612737536472015022 0ustar eddedd@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 @tindex gsl_permutation 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. @inlinefn{} @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 (const 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{@var{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{@var{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_matrix (const gsl_permutation * @var{p}, gsl_matrix * @var{A}) This function applies the permutation @var{p} to the matrix @var{A} from the right, @math{A' = A P}. The @math{j}-th column of the permutation matrix @math{P} is given by the @math{@var{p}_j}-th column of the identity matrix. This effectively permutes the columns of @var{A} according to the permutation @var{p}, and so the number of columns of @var{A} must equal the size of the permutation @var{p}. @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 @c{$@var{p} = @var{pa} \ast @var{pb}$} @math{@var{p} = @var{pa} * @var{pb}}. The permutation @var{p} is equivalent to applying @var{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}. In ISO C99 the type modifier @code{z} represents @code{size_t}, so @code{"%zu\n"} is a suitable format.@footnote{In versions of the GNU C library prior to the ISO C99 standard, the type modifier @code{Z} was used instead.} 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 @w{} @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 @w{} @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 gsl-doc-2.3/doc/histogram2d.eps0000664000175000017500000016362212616157443014506 0ustar eddedd%!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 gsl-doc-2.3/doc/multimin.eps0000664000175000017500000003553112616157443014116 0ustar eddedd%!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 gsl-doc-2.3/doc/multiroots.texi0000664000175000017500000010477112616157443014666 0ustar eddedd@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. @cindex Jacobian matrix, root finding 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}) @tindex gsl_multiroot_fsolver @tindex gsl_multiroot_fsolver_type 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}) @tindex gsl_multiroot_fdfsolver @tindex gsl_multiroot_fdfsolver_type 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}, const gsl_vector * @var{x}) @deftypefunx int gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver * @var{s}, gsl_multiroot_function_fdf * @var{fdf}, const gsl_vector * @var{x}) These functions set, or reset, an existing solver @var{s} to use the function @var{f} or function and derivative @var{fdf}, and the initial guess @var{x}. Note that the initial position is copied from @var{x}, this argument is not modified by subsequent iterations. @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 = ¶ms; @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 @code{s->x} and its function value @code{s->f} 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}, given by @code{s->x}. @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}, given by @code{s->f}. @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}, given by @code{s->dx}. @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. If the Jacobian matrix is singular, an error code of @code{GSL_EDOM} is returned. @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 #include #include #include 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 @w{} @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 @w{} @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 gsl-doc-2.3/doc/rand-levy.tex0000664000175000017500000005432712616157443014176 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-levy.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-levy.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 958 R -31 0 V 31 959 R -31 0 V 31 958 R -31 0 V 31 959 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 748 M 19 2 V 20 1 V 19 2 V 20 2 V 19 1 V 20 2 V 19 2 V 19 1 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 3 V 19 2 V 20 2 V 19 3 V 20 2 V 19 3 V 20 3 V 19 2 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 4 V 20 3 V 19 4 V 20 3 V 19 4 V 19 4 V 20 4 V 19 4 V 20 4 V 19 4 V 20 5 V 19 4 V 19 5 V 20 4 V 19 5 V 20 5 V 19 5 V 20 6 V 19 5 V 19 6 V 20 5 V 19 6 V 20 6 V 19 7 V 20 6 V 19 7 V 19 6 V 20 7 V 19 8 V 20 7 V 19 8 V 20 8 V 19 8 V 19 9 V 20 8 V 19 9 V 20 10 V 19 9 V 20 10 V 19 10 V 19 11 V 20 11 V 19 11 V 20 12 V 19 12 V 20 13 V 19 13 V 19 14 V 20 14 V 19 14 V 20 15 V 19 16 V 20 16 V 19 17 V 19 17 V 20 18 V 19 19 V 20 20 V 19 20 V 20 21 V 19 22 V 19 23 V 20 24 V 19 24 V 20 26 V 3052 1523 L 20 28 V 19 29 V 19 30 V 20 31 V 19 33 V 20 33 V 19 35 V 20 37 V 19 38 V 19 39 V 20 41 V 19 43 V 20 44 V 19 46 V 20 47 V 19 49 V 19 51 V 20 53 V 19 54 V 20 56 V 19 57 V 20 59 V 19 61 V 19 62 V 20 63 V 19 64 V 20 65 V 19 66 V 20 66 V 19 67 V 19 66 V 20 65 V 19 64 V 20 63 V 19 61 V 20 58 V 19 55 V 19 52 V 20 47 V 19 43 V 20 38 V 19 32 V 20 27 V 19 20 V 19 13 V 20 7 V 19 0 V 20 -7 V 19 -13 V 19 -20 V 20 -27 V 19 -32 V 20 -38 V 19 -43 V 20 -47 V 19 -52 V 19 -55 V 20 -58 V 19 -61 V 20 -63 V 19 -64 V 20 -65 V 19 -66 V 19 -67 V 20 -66 V 19 -66 V 20 -65 V 19 -64 V 20 -63 V 19 -62 V 19 -61 V 20 -59 V 19 -57 V 20 -56 V 19 -54 V 20 -53 V 19 -51 V 19 -49 V 20 -47 V 19 -46 V 20 -44 V 19 -43 V 20 -41 V 19 -39 V 19 -38 V 20 -37 V 19 -35 V 20 -33 V 19 -33 V 20 -31 V 19 -30 V 19 -29 V 20 -28 V 19 -26 V 20 -26 V 19 -24 V 20 -24 V 19 -23 V 19 -22 V 20 -21 V 19 -20 V 20 -20 V 19 -19 V 20 -18 V 5092 1263 L 19 -17 V 20 -16 V 19 -16 V 20 -15 V 19 -14 V 20 -14 V 19 -14 V 19 -13 V 20 -13 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -11 V 19 -10 V 20 -10 V 19 -9 V 20 -10 V 19 -9 V 20 -8 V 19 -9 V 19 -8 V 20 -8 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -6 V 19 -7 V 20 -6 V 19 -7 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 19 -5 V 20 -6 V 19 -5 V 20 -5 V 19 -5 V 20 -4 V 19 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -3 V 19 -3 V 19 -2 V 20 -3 V 19 -3 V 20 -2 V 19 -3 V 20 -2 V 19 -2 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -2 V 19 -1 V 19 -2 V 20 -2 V 19 -1 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 636 M 19 1 V 20 0 V 19 1 V 20 0 V 19 1 V 20 1 V 19 0 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 1 V 20 2 V 19 1 V 20 1 V 19 2 V 20 2 V 19 2 V 19 2 V 20 2 V 19 2 V 20 2 V 19 3 V 20 3 V 19 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 4 V 20 4 V 19 4 V 19 5 V 20 5 V 19 5 V 20 5 V 19 6 V 20 6 V 19 6 V 19 6 V 20 7 V 19 8 V 20 7 V 19 8 V 20 9 V 19 8 V 19 10 V 20 9 V 19 10 V 20 11 V 19 11 V 20 12 V 19 12 V 19 12 V 20 13 V 19 14 V 20 14 V 19 15 V 20 15 V 19 16 V 19 16 V 20 17 V 19 18 V 20 18 V 19 19 V 20 20 V 19 20 V 19 21 V 20 21 V 19 22 V 20 23 V 19 24 V 20 24 V 19 25 V 19 25 V 20 27 V 19 26 V 20 28 V 19 28 V 20 29 V 19 30 V 19 30 V 20 31 V 19 31 V 20 32 V 19 32 V 20 34 V 19 33 V 19 35 V 20 34 V 19 36 V 20 35 V 19 36 V 20 37 V 19 37 V 19 37 V 20 38 V 19 38 V 20 38 V 3052 2108 L 20 38 V 19 39 V 19 39 V 20 39 V 19 38 V 20 39 V 19 39 V 20 38 V 19 39 V 19 38 V 20 38 V 19 37 V 20 37 V 19 37 V 20 37 V 19 35 V 19 36 V 20 34 V 19 34 V 20 34 V 19 32 V 20 32 V 19 31 V 19 30 V 20 29 V 19 28 V 20 27 V 19 26 V 20 25 V 19 24 V 19 22 V 20 21 V 19 20 V 20 19 V 19 18 V 20 16 V 19 14 V 19 14 V 20 12 V 19 10 V 20 9 V 19 7 V 20 6 V 19 5 V 19 3 V 20 2 V 19 0 V 20 -2 V 19 -3 V 19 -5 V 20 -6 V 19 -7 V 20 -9 V 19 -10 V 20 -12 V 19 -14 V 19 -14 V 20 -16 V 19 -18 V 20 -19 V 19 -20 V 20 -21 V 19 -22 V 19 -24 V 20 -25 V 19 -26 V 20 -27 V 19 -28 V 20 -29 V 19 -30 V 19 -31 V 20 -32 V 19 -32 V 20 -34 V 19 -34 V 20 -34 V 19 -36 V 19 -35 V 20 -37 V 19 -37 V 20 -37 V 19 -37 V 20 -38 V 19 -38 V 19 -39 V 20 -38 V 19 -39 V 20 -39 V 19 -38 V 20 -39 V 19 -39 V 19 -39 V 20 -38 V 19 -38 V 20 -38 V 19 -38 V 20 -38 V 19 -37 V 19 -37 V 20 -37 V 19 -36 V 20 -35 V 19 -36 V 20 -34 V 5092 1669 L 19 -33 V 20 -34 V 19 -32 V 20 -32 V 19 -31 V 20 -31 V 19 -30 V 19 -30 V 20 -29 V 19 -28 V 20 -28 V 19 -26 V 20 -27 V 19 -25 V 19 -25 V 20 -24 V 19 -24 V 20 -23 V 19 -22 V 20 -21 V 19 -21 V 19 -20 V 20 -20 V 19 -19 V 20 -18 V 19 -18 V 20 -17 V 19 -16 V 19 -16 V 20 -15 V 19 -15 V 20 -14 V 19 -14 V 20 -13 V 19 -12 V 19 -12 V 20 -12 V 19 -11 V 20 -11 V 19 -10 V 20 -9 V 19 -10 V 19 -8 V 20 -9 V 19 -8 V 20 -7 V 19 -8 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -5 V 20 -5 V 19 -5 V 19 -4 V 20 -4 V 19 -4 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -3 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -1 V 20 -2 V 19 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 -1 V 20 0 V 19 -1 V 20 0 V 19 -1 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$c=1, \alpha=2.0$}}% \put(5957,4781){\rjust{\strut{}$c=1, \alpha=1.0$}}% \put(3955,5244){\cjust{\strut{}Levy Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4465){\rjust{\strut{} 0.4}}% \put(900,3506){\rjust{\strut{} 0.3}}% \put(900,2548){\rjust{\strut{} 0.2}}% \put(900,1589){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/specfunc-synchrotron.texi0000664000175000017500000000162612616157443016634 0ustar eddedd@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 gsl-doc-2.3/doc/gsl-ref.texi0000644000175000017500000005110712761053075013771 0ustar eddedd\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 Software libraries @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. % \gdef\goodtex{\tex \let\rm\goodrm \let\t\ttfont \mathactive} \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 @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 @macro inlinefn An inline version of this function is used when @code{HAVE_INLINE} is defined. @end macro @macro inlinefns Inline versions of these functions are used when @code{HAVE_INLINE} is defined. @end macro @include version.texi @set GSL @i{GNU Scientific Library} @copying Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual.'' @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 Patrick Alken University of Colorado at Boulder @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 @author Rhys Ulerich @comment @email{rhys.ulerich@gmail.com} @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:: * Multisets:: * Sorting:: * BLAS Support:: * Linear Algebra:: * Eigensystems:: * Fast Fourier Transforms:: * Numerical Integration:: * Random Number Generation:: * Quasi-Random Sequences:: * Random Number Distributions:: * Statistics:: * Running 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:: * Sparse Matrices:: * Sparse BLAS Support:: * Sparse Linear Algebra:: * Physical Constants:: * IEEE floating-point arithmetic:: * Debugging Numerical Programs:: * Contributors to GSL:: * Autoconf Macros:: * GSL CBLAS Library:: * 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, Multisets, Permutations, Top @chapter Combinations @include combination.texi @node Multisets, Sorting, Combinations, Top @chapter Multisets @include multiset.texi @node Sorting, BLAS Support, Multisets, 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, Running Statistics, Random Number Distributions, Top @chapter Statistics @include statistics.texi @node Running Statistics, Histograms, Statistics, Top @chapter Running Statistics @include rstat.texi @node Histograms, N-tuples, Running 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-nlinear.texi @node Basis Splines, Sparse Matrices, Nonlinear Least-Squares Fitting, Top @chapter Basis Splines @include bspline.texi @node Sparse Matrices, Sparse BLAS Support, Basis Splines, Top @chapter Sparse Matrices @include spmatrix.texi @node Sparse BLAS Support, Sparse Linear Algebra, Sparse Matrices, Top @chapter Sparse BLAS Support @include spblas.texi @node Sparse Linear Algebra, Physical Constants, Sparse BLAS Support, Top @chapter Sparse Linear Algebra @include splinalg.texi @node Physical Constants, IEEE floating-point arithmetic, Sparse Linear Algebra, 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 Wrote the routines for generating combinations. @item Nicolas Darnis Wrote the cyclic functions and the initial functions 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 and wrote the ode-initval2 routines. @item Lowell Johnson Implementation of the Mathieu functions. @item Patrick Alken Implementation of nonsymmetric and generalized eigensystems, B-splines, robust linear regression, and sparse matrices. @item Rhys Ulerich Wrote the multiset routines. @item Pavel Holoborodko Wrote the fixed order Gauss-Legendre quadrature routines. @item Pedro Gonnet Wrote the @sc{cquad} integration routines. @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, GNU General Public License, 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 @comment @node Free Software Needs Free Documentation, GNU General Public License, GSL CBLAS Library, Top @comment @unnumbered Free Software Needs Free Documentation @comment @include freemanuals.texi @node GNU General Public License, GNU Free Documentation License, GSL CBLAS Library, 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 gsl-doc-2.3/doc/algorithmic.sty0000664000175000017500000001267412616157443014615 0ustar eddedd% 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}} gsl-doc-2.3/doc/specfunc-elementary.texi0000664000175000017500000000201512616157443016402 0ustar eddedd@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 gsl-doc-2.3/doc/specfunc-pow-int.texi0000664000175000017500000000153612616157443015641 0ustar eddedd@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 /* compute 3.0**12 */ double y = gsl_sf_pow_int(3.0, 12); @end example gsl-doc-2.3/doc/fitting.texi0000644000175000017500000024556313013653244014104 0ustar eddedd@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. @menu * Fitting Overview:: * Linear regression:: * Multi-parameter regression:: * Regularized regression:: * Robust linear regression:: * Large Dense Linear Systems:: * Troubleshooting:: * 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@}@}}. The correlation coefficient of the fit parameters @math{c_a} and @math{c_b} is given by @c{$\rho_{ab} = C_{ab} / \sqrt{C_{aa} C_{bb}}$} @math{\rho_@{ab@} = C_@{ab@} / \sqrt@{C_@{aa@} C_@{bb@}@}}. @node Linear regression @section Linear regression @cindex linear regression The functions in this section are used to fit simple one or two parameter linear regression models. The functions are declared in the header file @file{gsl_fit.h}. @menu * Linear regression with a constant term:: * Linear regression without a constant term:: @end menu @node Linear regression with a constant term @subsection Linear regression with a constant term 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}. Note: the correlation coefficient of the data can be computed using @code{gsl_stats_correlation} (@pxref{Correlation}), it does not depend on the fit. @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{cov00}, double @var{cov01}, double @var{cov11}, 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 regression without a constant term @subsection Linear regression 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{cov11}, 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 regression @section Multi-parameter regression @cindex multi-parameter regression @cindex fits, multi-parameter linear This section describes routines which perform least squares fits to a linear model by minimizing the cost function @tex \beforedisplay $$ \chi^2 = \sum_i w_i (y_i - \sum_j X_{ij} c_j)^2 = || y - Xc ||_W^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = \sum_i w_i (y_i - \sum_j X_ij c_j)^2 = || y - Xc ||_W^2 @end example @end ifinfo where @math{y} is a vector of @math{n} observations, @math{X} is an @math{n}-by-@math{p} matrix of predictor variables, @math{c} is a vector of the @math{p} unknown best-fit parameters to be estimated, and @math{||r||_W^2 = r^T W r}. The matrix @math{W = } diag@math{(w_1,w_2,...,w_n)} defines the weights or uncertainties of the observation vector. 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 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}. These functions are declared in the header file @file{gsl_multifit.h}. @deftypefun {gsl_multifit_linear_workspace *} gsl_multifit_linear_alloc (const size_t @var{n}, const size_t @var{p}) @tindex gsl_multifit_linear_workspace This function allocates a workspace for fitting a model to a maximum of @var{n} observations using a maximum of @var{p} parameters. The user may later supply a smaller least squares system if desired. The size of the workspace is @math{O(np + p^2)}. @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_svd (const gsl_matrix * @var{X}, gsl_multifit_linear_workspace * @var{work}) This function performs a singular value decomposition of the matrix @var{X} and stores the SVD factors internally in @var{work}. @end deftypefun @deftypefun int gsl_multifit_linear_bsvd (const gsl_matrix * @var{X}, gsl_multifit_linear_workspace * @var{work}) This function performs a singular value decomposition of the matrix @var{X} and stores the SVD factors internally in @var{work}. The matrix @var{X} is first balanced by applying column scaling factors to improve the accuracy of the singular values. @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}) This function computes 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}, using the preallocated workspace provided in @var{work}. The @math{p}-by-@math{p} variance-covariance matrix of the model parameters @var{cov} is set to @math{\sigma^2 (X^T X)^{-1}}, where @math{\sigma} is the standard deviation of the fit residuals. The sum of squares of the residuals from the best-fit, @math{\chi^2}, is returned in @var{chisq}. If the coefficient of determination is desired, it can be computed from the expression @math{R^2 = 1 - \chi^2 / TSS}, where the total sum of squares (TSS) of the observations @var{y} may be computed from @code{gsl_stats_tss}. The best-fit is found by singular value decomposition of the matrix @var{X} using the modified Golub-Reinsch SVD algorithm, 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. @end deftypefun @deftypefun int gsl_multifit_linear_tsvd (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, const double @var{tol}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, size_t * @var{rank}, gsl_multifit_linear_workspace * @var{work}) This function computes 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}, using a truncated SVD expansion. Singular values which satisfy @math{s_i \le tol \times s_0} are discarded from the fit, where @math{s_0} is the largest singular value. The @math{p}-by-@math{p} variance-covariance matrix of the model parameters @var{cov} is set to @math{\sigma^2 (X^T X)^{-1}}, where @math{\sigma} is the standard deviation of the fit residuals. The sum of squares of the residuals from the best-fit, @math{\chi^2}, is returned in @var{chisq}. The effective rank (number of singular values used in solution) is returned in @var{rank}. If the coefficient of determination is desired, it can be computed from the expression @math{R^2 = 1 - \chi^2 / TSS}, where the total sum of squares (TSS) of the observations @var{y} may be computed from @code{gsl_stats_tss}. @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}) 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}, using the preallocated workspace provided in @var{work}. The @math{p}-by-@math{p} covariance matrix of the model parameters @var{cov} is computed as @math{(X^T W X)^{-1}}. The weighted sum of squares of the residuals from the best-fit, @math{\chi^2}, is returned in @var{chisq}. If the coefficient of determination is desired, it can be computed from the expression @math{R^2 = 1 - \chi^2 / WTSS}, where the weighted total sum of squares (WTSS) of the observations @var{y} may be computed from @code{gsl_stats_wtss}. @end deftypefun @deftypefun int gsl_multifit_wlinear_tsvd (const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, const double @var{tol}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, size_t * @var{rank}, 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}, using a truncated SVD expansion. Singular values which satisfy @math{s_i \le tol \times s_0} are discarded from the fit, where @math{s_0} is the largest singular value. The @math{p}-by-@math{p} covariance matrix of the model parameters @var{cov} is computed as @math{(X^T W X)^{-1}}. The weighted sum of squares of the residuals from the best-fit, @math{\chi^2}, is returned in @var{chisq}. The effective rank of the system (number of singular values used in the solution) is returned in @var{rank}. If the coefficient of determination is desired, it can be computed from the expression @math{R^2 = 1 - \chi^2 / WTSS}, where the weighted total sum of squares (WTSS) of the observations @var{y} may be computed from @code{gsl_stats_wtss}. @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 @deftypefun int gsl_multifit_linear_residuals (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, const gsl_vector * @var{c}, gsl_vector * @var{r}) This function computes the vector of residuals @math{r = y - X c} for the observations @var{y}, coefficients @var{c} and matrix of predictor variables @var{X}. @end deftypefun @deftypefun size_t gsl_multifit_linear_rank (const double @var{tol}, const gsl_multifit_linear_workspace * @var{work}) This function returns the rank of the matrix @math{X} which must first have its singular value decomposition computed. The rank is computed by counting the number of singular values @math{\sigma_j} which satisfy @math{\sigma_j > tol \times \sigma_0}, where @math{\sigma_0} is the largest singular value. @end deftypefun @node Regularized regression @section Regularized regression @cindex ridge regression @cindex Tikhonov regression @cindex regression, ridge @cindex regression, Tikhonov @cindex least squares, regularized Ordinary weighted least squares models seek a solution vector @math{c} which minimizes the residual @tex \beforedisplay $$ \chi^2 = || y - Xc ||_W^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || y - Xc ||_W^2 @end example @end ifinfo where @math{y} is the @math{n}-by-@math{1} observation vector, @math{X} is the @math{n}-by-@math{p} design matrix, @math{c} is the @math{p}-by-@math{1} solution vector, @math{W =} diag@math{(w_1,...,w_n)} is the data weighting matrix, and @math{||r||_W^2 = r^T W r}. In cases where the least squares matrix @math{X} is ill-conditioned, small perturbations (ie: noise) in the observation vector could lead to widely different solution vectors @math{c}. One way of dealing with ill-conditioned matrices is to use a ``truncated SVD'' in which small singular values, below some given tolerance, are discarded from the solution. The truncated SVD method is available using the functions @code{gsl_multifit_linear_tsvd} and @code{gsl_multifit_wlinear_tsvd}. Another way to help solve ill-posed problems is to include a regularization term in the least squares minimization @tex \beforedisplay $$ \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 @end example @end ifinfo for a suitably chosen regularization parameter @math{\lambda} and matrix @math{L}. This type of regularization is known as Tikhonov, or ridge, regression. In some applications, @math{L} is chosen as the identity matrix, giving preference to solution vectors @math{c} with smaller norms. Including this regularization term leads to the explicit ``normal equations'' solution @tex \beforedisplay $$ c = \left( X^T W X + \lambda^2 L^T L \right)^{-1} X^T W y $$ \afterdisplay @end tex @ifinfo @example c = ( X^T W X + \lambda^2 L^T L )^-1 X^T W y @end example @end ifinfo which reduces to the ordinary least squares solution when @math{L = 0}. In practice, it is often advantageous to transform a regularized least squares system into the form @tex \beforedisplay $$ \chi^2 = || \tilde{y} - \tilde{X} \tilde{c} ||^2 + \lambda^2 || \tilde{c} ||^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || y~ - X~ c~ ||^2 + \lambda^2 || c~ ||^2 @end example @end ifinfo This is known as the Tikhonov ``standard form'' and has the normal equations solution @math{\tilde{c} = \left( \tilde{X}^T \tilde{X} + \lambda^2 I \right)^{-1} \tilde{X}^T \tilde{y}}. For an @math{m}-by-@math{p} matrix @math{L} which is full rank and has @math{m >= p} (ie: @math{L} is square or has more rows than columns), we can calculate the ``thin'' QR decomposition of @math{L}, and note that @math{||L c||} = @math{||R c||} since the @math{Q} factor will not change the norm. Since @math{R} is @math{p}-by-@math{p}, we can then use the transformation @tex \beforedisplay $$ \eqalign{ \tilde{X} &= W^{1 \over 2} X R^{-1} \cr \tilde{y} &= W^{1 \over 2} y \cr \tilde{c} &= R c } $$ \afterdisplay @end tex @ifinfo @example X~ = sqrt(W) X R^-1 y~ = sqrt(W) y c~ = R c @end example @end ifinfo to achieve the standard form. For a rectangular matrix @math{L} with @math{m < p}, a more sophisticated approach is needed (see Hansen 1998, chapter 2.3). In practice, the normal equations solution above is not desirable due to numerical instabilities, and so the system is solved using the singular value decomposition of the matrix @math{\tilde{X}}. The matrix @math{L} is often chosen as the identity matrix, or as a first or second finite difference operator, to ensure a smoothly varying coefficient vector @math{c}, or as a diagonal matrix to selectively damp each model parameter differently. If @math{L \ne I}, the user must first convert the least squares problem to standard form using @code{gsl_multifit_linear_stdform1} or @code{gsl_multifit_linear_stdform2}, solve the system, and then backtransform the solution vector to recover the solution of the original problem (see @code{gsl_multifit_linear_genform1} and @code{gsl_multifit_linear_genform2}). In many regularization problems, care must be taken when choosing the regularization parameter @math{\lambda}. Since both the residual norm @math{||y - X c||} and solution norm @math{||L c||} are being minimized, the parameter @math{\lambda} represents a tradeoff between minimizing either the residuals or the solution vector. A common tool for visualizing the comprimise between the minimization of these two quantities is known as the L-curve. The L-curve is a log-log plot of the residual norm @math{||y - X c||} on the horizontal axis and the solution norm @math{||L c||} on the vertical axis. This curve nearly always as an @math{L} shaped appearance, with a distinct corner separating the horizontal and vertical sections of the curve. The regularization parameter corresponding to this corner is often chosen as the optimal value. GSL provides routines to calculate the L-curve for all relevant regularization parameters as well as locating the corner. Another method of choosing the regularization parameter is known as Generalized Cross Validation (GCV). This method is based on the idea that if an arbitrary element @math{y_i} is left out of the right hand side, the resulting regularized solution should predict this element accurately. This leads to choosing the parameter @math{\lambda} which minimizes the GCV function @tex \beforedisplay $$ G(\lambda) = {||y - X c_{\lambda}||^2 \over \textrm{Tr}(I_n - X X_{\lambda}^I)^2} $$ \afterdisplay @end tex @ifinfo @example G(\lambda) = (||y - X c_@{\lambda@}||^2) / Tr(I_n - X X^I)^2 @end example @end ifinfo where @math{X_{\lambda}^I} is the matrix which relates the solution @math{c_{\lambda}} to the right hand side @math{y}, ie: @math{c_{\lambda} = X_{\lambda}^I y}. GSL provides routines to compute the GCV curve and its minimum. @noindent For most applications, the steps required to solve a regularized least squares problem are as follows: @enumerate @item Construct the least squares system (@math{X}, @math{y}, @math{W}, @math{L}) @item Transform the system to standard form (@math{\tilde{X}},@math{\tilde{y}}). This step can be skipped if @math{L = I_p} and @math{W = I_n}. @item Calculate the SVD of @math{\tilde{X}}. @item Determine an appropriate regularization parameter @math{\lambda} (using for example L-curve or GCV analysis). @item Solve the standard form system using the chosen @math{\lambda} and the SVD of @math{\tilde{X}}. @item Backtransform the standard form solution @math{\tilde{c}} to recover the original solution vector @math{c}. @end enumerate @deftypefun int gsl_multifit_linear_stdform1 (const gsl_vector * @var{L}, const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multifit_linear_workspace * @var{work}) @deftypefunx int gsl_multifit_linear_wstdform1 (const gsl_vector * @var{L}, const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multifit_linear_workspace * @var{work}) These functions define a regularization matrix @math{L =} diag@math{(l_0,l_1,...,l_{p-1})}. The diagonal matrix element @math{l_i} is provided by the @math{i}th element of the input vector @var{L}. The @math{n}-by-@math{p} least squares matrix @var{X} and vector @var{y} of length @math{n} are then converted to standard form as described above and the parameters (@math{\tilde{X}},@math{\tilde{y}}) are stored in @var{Xs} and @var{ys} on output. @var{Xs} and @var{ys} have the same dimensions as @var{X} and @var{y}. Optional data weights may be supplied in the vector @var{w} of length @math{n}. In order to apply this transformation, @math{L^{-1}} must exist and so none of the @math{l_i} may be zero. After the standard form system has been solved, use @code{gsl_multifit_linear_genform1} to recover the original solution vector. It is allowed to have @var{X} = @var{Xs} and @var{y} = @var{ys} for an in-place transform. In order to perform a weighted regularized fit with @math{L = I}, the user may call @code{gsl_multifit_linear_applyW} to convert to standard form. @end deftypefun @deftypefun int gsl_multifit_linear_L_decomp (gsl_matrix * @var{L}, gsl_vector * @var{tau}) This function factors the @math{m}-by-@math{p} regularization matrix @var{L} into a form needed for the later transformation to standard form. @var{L} may have any number of rows @math{m}. If @math{m \ge p} the QR decomposition of @var{L} is computed and stored in @var{L} on output. If @math{m < p}, the QR decomposition of @math{L^T} is computed and stored in @var{L} on output. On output, the Householder scalars are stored in the vector @var{tau} of size @math{MIN(m,p)}. These outputs will be used by @code{gsl_multifit_linear_wstdform2} to complete the transformation to standard form. @end deftypefun @deftypefun int gsl_multifit_linear_stdform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_matrix * @var{M}, gsl_multifit_linear_workspace * @var{work}) @deftypefunx int gsl_multifit_linear_wstdform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_matrix * @var{M}, gsl_multifit_linear_workspace * @var{work}) These functions convert the least squares system (@var{X},@var{y},@var{W},@math{L}) to standard form (@math{\tilde{X}},@math{\tilde{y}}) which are stored in @var{Xs} and @var{ys} respectively. The @math{m}-by-@math{p} regularization matrix @var{L} is specified by the inputs @var{LQR} and @var{Ltau}, which are outputs from @code{gsl_multifit_linear_L_decomp}. The dimensions of the standard form parameters (@math{\tilde{X}},@math{\tilde{y}}) depend on whether @math{m} is larger or less than @math{p}. For @math{m \ge p}, @var{Xs} is @math{n}-by-@math{p}, @var{ys} is @math{n}-by-1, and @var{M} is not used. For @math{m < p}, @var{Xs} is @math{(n - p + m)}-by-@math{m}, @var{ys} is @math{(n - p + m)}-by-1, and @var{M} is additional @math{n}-by-@math{p} workspace, which is required to recover the original solution vector after the system has been solved (see @code{gsl_multifit_linear_genform2}). Optional data weights may be supplied in the vector @var{w} of length @math{n}, where @math{W =} diag(w). @end deftypefun @deftypefun int gsl_multifit_linear_solve (const double @var{lambda}, const gsl_matrix * @var{Xs}, const gsl_vector * @var{ys}, gsl_vector * @var{cs}, double * @var{rnorm}, double * @var{snorm}, gsl_multifit_linear_workspace * @var{work}) This function computes the regularized best-fit parameters @math{\tilde{c}} which minimize the cost function @math{\chi^2 = || \tilde{y} - \tilde{X} \tilde{c} ||^2 + \lambda^2 || \tilde{c} ||^2} which is in standard form. The least squares system must therefore be converted to standard form prior to calling this function. The observation vector @math{\tilde{y}} is provided in @var{ys} and the matrix of predictor variables @math{\tilde{X}} in @var{Xs}. The solution vector @math{\tilde{c}} is returned in @var{cs}, which has length min(@math{m,p}). The SVD of @var{Xs} must be computed prior to calling this function, using @code{gsl_multifit_linear_svd}. The regularization parameter @math{\lambda} is provided in @var{lambda}. The residual norm @math{|| \tilde{y} - \tilde{X} \tilde{c} || = ||y - X c||_W} is returned in @var{rnorm}. The solution norm @math{|| \tilde{c} || = ||L c||} is returned in @var{snorm}. @end deftypefun @deftypefun int gsl_multifit_linear_genform1 (const gsl_vector * @var{L}, const gsl_vector * @var{cs}, gsl_vector * @var{c}, gsl_multifit_linear_workspace * @var{work}) After a regularized system has been solved with @math{L =} diag@math{(\l_0,\l_1,...,\l_{p-1})}, this function backtransforms the standard form solution vector @var{cs} to recover the solution vector of the original problem @var{c}. The diagonal matrix elements @math{l_i} are provided in the vector @var{L}. It is allowed to have @var{c} = @var{cs} for an in-place transform. @end deftypefun @deftypefun int gsl_multifit_linear_genform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{y}, const gsl_vector * @var{cs}, const gsl_matrix * @var{M}, gsl_vector * @var{c}, gsl_multifit_linear_workspace * @var{work}) @deftypefunx int gsl_multifit_linear_wgenform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, const gsl_vector * @var{cs}, const gsl_matrix * @var{M}, gsl_vector * @var{c}, gsl_multifit_linear_workspace * @var{work}) After a regularized system has been solved with a general rectangular matrix @math{L}, specified by (@var{LQR},@var{Ltau}), this function backtransforms the standard form solution @var{cs} to recover the solution vector of the original problem, which is stored in @var{c}, of length @math{p}. The original least squares matrix and observation vector are provided in @var{X} and @var{y} respectively. @var{M} is the matrix computed by @code{gsl_multifit_linear_stdform2}. For weighted fits, the weight vector @var{w} must also be supplied. @end deftypefun @deftypefun int gsl_multifit_linear_applyW (const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_matrix * @var{WX}, gsl_vector * @var{Wy}) For weighted least squares systems with @math{L = I}, this function may be used to convert the system to standard form by applying the weight matrix @math{W =} diag(@var{w}) to the least squares matrix @var{X} and observation vector @var{y}. On output, @var{WX} is equal to @math{W^{1/2} X} and @var{Wy} is equal to @math{W^{1/2} y}. It is allowed for @var{WX} = @var{X} and @var{Wy} = @var{y} for an in-place transform. @end deftypefun @deftypefun int gsl_multifit_linear_lcurve (const gsl_vector * @var{y}, gsl_vector * @var{reg_param}, gsl_vector * @var{rho}, gsl_vector * @var{eta}, gsl_multifit_linear_workspace * @var{work}) This function computes the L-curve for a least squares system using the right hand side vector @var{y} and the SVD decomposition of the least squares matrix @var{X}, which must be provided to @code{gsl_multifit_linear_svd} prior to calling this function. The output vectors @var{reg_param}, @var{rho}, and @var{eta} must all be the same size, and will contain the regularization parameters @math{\lambda_i}, residual norms @math{||y - X c_i||}, and solution norms @math{|| L c_i ||} which compose the L-curve, where @math{c_i} is the regularized solution vector corresponding to @math{\lambda_i}. The user may determine the number of points on the L-curve by adjusting the size of these input arrays. The regularization parameters @math{\lambda_i} are estimated from the singular values of @var{X}, and chosen to represent the most relevant portion of the L-curve. @end deftypefun @deftypefun int gsl_multifit_linear_lcorner (const gsl_vector * @var{rho}, const gsl_vector * @var{eta}, size_t * @var{idx}) This function attempts to locate the corner of the L-curve @math{(||y - X c||, ||L c||)} defined by the @var{rho} and @var{eta} input arrays respectively. The corner is defined as the point of maximum curvature of the L-curve in log-log scale. The @var{rho} and @var{eta} arrays can be outputs of @code{gsl_multifit_linear_lcurve}. The algorithm used simply fits a circle to 3 consecutive points on the L-curve and uses the circle's radius to determine the curvature at the middle point. Therefore, the input array sizes must be @math{\ge 3}. With more points provided for the L-curve, a better estimate of the curvature can be obtained. The array index corresponding to maximum curvature (ie: the corner) is returned in @var{idx}. If the input arrays contain colinear points, this function could fail and return @code{GSL_EINVAL}. @end deftypefun @deftypefun int gsl_multifit_linear_lcorner2 (const gsl_vector * @var{reg_param}, const gsl_vector * @var{eta}, size_t * @var{idx}) This function attempts to locate the corner of an alternate L-curve @math{(\lambda^2, ||L c||^2)} studied by Rezghi and Hosseini, 2009. This alternate L-curve can provide better estimates of the regularization parameter for smooth solution vectors. The regularization parameters @math{\lambda} and solution norms @math{||L c||} are provided in the @var{reg_param} and @var{eta} input arrays respectively. The corner is defined as the point of maximum curvature of this alternate L-curve in linear scale. The @var{reg_param} and @var{eta} arrays can be outputs of @code{gsl_multifit_linear_lcurve}. The algorithm used simply fits a circle to 3 consecutive points on the L-curve and uses the circle's radius to determine the curvature at the middle point. Therefore, the input array sizes must be @math{\ge 3}. With more points provided for the L-curve, a better estimate of the curvature can be obtained. The array index corresponding to maximum curvature (ie: the corner) is returned in @var{idx}. If the input arrays contain colinear points, this function could fail and return @code{GSL_EINVAL}. @end deftypefun @deftypefun int gsl_multifit_linear_gcv_init(const gsl_vector * @var{y}, gsl_vector * @var{reg_param}, gsl_vector * @var{UTy}, double * @var{delta0}, gsl_multifit_linear_workspace * @var{work}) This function performs some initialization in preparation for computing the GCV curve and its minimum. The right hand side vector is provided in @var{y}. On output, @var{reg_param} is set to a vector of regularization parameters in decreasing order and may be of any size. The vector @var{UTy} of size @math{p} is set to @math{U^T y}. The parameter @var{delta0} is needed for subsequent steps of the GCV calculation. @end deftypefun @deftypefun int gsl_multifit_linear_gcv_curve(const gsl_vector * @var{reg_param}, const gsl_vector * @var{UTy}, const double @var{delta0}, gsl_vector * @var{G}, gsl_multifit_linear_workspace * @var{work}) This funtion calculates the GCV curve @math{G(\lambda)} and stores it in @var{G} on output, which must be the same size as @var{reg_param}. The inputs @var{reg_param}, @var{UTy} and @var{delta0} are computed in @code{gsl_multifit_linear_gcv_init}. @end deftypefun @deftypefun int gsl_multifit_linear_gcv_min(const gsl_vector * @var{reg_param}, const gsl_vector * @var{UTy}, const gsl_vector * @var{G}, const double @var{delta0}, double * @var{lambda}, gsl_multifit_linear_workspace * @var{work}) This function computes the value of the regularization parameter which minimizes the GCV curve @math{G(\lambda)} and stores it in @var{lambda}. The input @var{G} is calculated by @code{gsl_multifit_linear_gcv_curve} and the inputs @var{reg_param}, @var{UTy} and @var{delta0} are computed by @code{gsl_multifit_linear_gcv_init}. @end deftypefun @deftypefun double gsl_multifit_linear_gcv_calc(const double @var{lambda}, const gsl_vector * @var{UTy}, const double @var{delta0}, gsl_multifit_linear_workspace * @var{work}) This function returns the value of the GCV curve @math{G(\lambda)} corresponding to the input @var{lambda}. @end deftypefun @deftypefun int gsl_multifit_linear_gcv(const gsl_vector * @var{y}, gsl_vector * @var{reg_param}, gsl_vector * @var{G}, double * @var{lambda}, double * @var{G_lambda}, gsl_multifit_linear_workspace * @var{work}) This function combines the steps @code{gcv_init}, @code{gcv_curve}, and @code{gcv_min} defined above into a single function. The input @var{y} is the right hand side vector. On output, @var{reg_param} and @var{G}, which must be the same size, are set to vectors of @math{\lambda} and @math{G(\lambda)} values respectively. The output @var{lambda} is set to the optimal value of @math{\lambda} which minimizes the GCV curve. The minimum value of the GCV curve is returned in @var{G_lambda}. @end deftypefun @deftypefun int gsl_multifit_linear_Lk (const size_t @var{p}, const size_t @var{k}, gsl_matrix * @var{L}) This function computes the discrete approximation to the derivative operator @math{L_k} of order @var{k} on a regular grid of @var{p} points and stores it in @var{L}. The dimensions of @var{L} are @math{(p-k)}-by-@math{p}. @end deftypefun @deftypefun int gsl_multifit_linear_Lsobolev (const size_t @var{p}, const size_t @var{kmax}, const gsl_vector * @var{alpha}, gsl_matrix * @var{L}, gsl_multifit_linear_workspace * @var{work}) This function computes the regularization matrix @var{L} corresponding to the weighted Sobolov norm @math{||L c||^2 = \sum_k \alpha_k^2 ||L_k c||^2} where @math{L_k} approximates the derivative operator of order @math{k}. This regularization norm can be useful in applications where it is necessary to smooth several derivatives of the solution. @var{p} is the number of model parameters, @var{kmax} is the highest derivative to include in the summation above, and @var{alpha} is the vector of weights of size @var{kmax} + 1, where @var{alpha}[k] = @math{\alpha_k} is the weight assigned to the derivative of order @math{k}. The output matrix @var{L} is size @var{p}-by-@var{p} and upper triangular. @end deftypefun @deftypefun double gsl_multifit_linear_rcond (const gsl_multifit_linear_workspace * @var{work}) This function returns the reciprocal condition number of the least squares matrix @math{X}, defined as the ratio of the smallest and largest singular values, rcond = @math{\sigma_{min}/\sigma_{max}}. The routine @code{gsl_multifit_linear_svd} must first be called to compute the SVD of @math{X}. @end deftypefun @node Robust linear regression @section Robust linear regression @cindex robust regression @cindex regression, robust @cindex least squares, robust Ordinary least squares (OLS) models are often heavily influenced by the presence of outliers. Outliers are data points which do not follow the general trend of the other observations, although there is strictly no precise definition of an outlier. Robust linear regression refers to regression algorithms which are robust to outliers. The most common type of robust regression is M-estimation. The general M-estimator minimizes the objective function @tex \beforedisplay $$ \sum_i \rho(e_i) = \sum_i \rho (y_i - Y(c, x_i)) $$ \afterdisplay @end tex @ifinfo @example \sum_i \rho(e_i) = \sum_i \rho (y_i - Y(c, x_i)) @end example @end ifinfo where @math{e_i = y_i - Y(c, x_i)} is the residual of the ith data point, and @math{\rho(e_i)} is a function which should have the following properties: @itemize @w{} @item @math{\rho(e) \ge 0} @item @math{\rho(0) = 0} @item @math{\rho(-e) = \rho(e)} @item @math{\rho(e_1) > \rho(e_2)} for @math{|e_1| > |e_2|} @end itemize @noindent The special case of ordinary least squares is given by @math{\rho(e_i) = e_i^2}. Letting @math{\psi = \rho'} be the derivative of @math{\rho}, differentiating the objective function with respect to the coefficients @math{c} and setting the partial derivatives to zero produces the system of equations @tex \beforedisplay $$ \sum_i \psi(e_i) X_i = 0 $$ \afterdisplay @end tex @ifinfo @example \sum_i \psi(e_i) X_i = 0 @end example @end ifinfo where @math{X_i} is a vector containing row @math{i} of the design matrix @math{X}. Next, we define a weight function @math{w(e) = \psi(e)/e}, and let @math{w_i = w(e_i)}: @tex \beforedisplay $$ \sum_i w_i e_i X_i = 0 $$ \afterdisplay @end tex @ifinfo @example \sum_i w_i e_i X_i = 0 @end example @end ifinfo This system of equations is equivalent to solving a weighted ordinary least squares problem, minimizing @math{\chi^2 = \sum_i w_i e_i^2}. The weights however, depend on the residuals @math{e_i}, which depend on the coefficients @math{c}, which depend on the weights. Therefore, an iterative solution is used, called Iteratively Reweighted Least Squares (IRLS). @enumerate @item Compute initial estimates of the coefficients @math{c^{(0)}} using ordinary least squares @item For iteration @math{k}, form the residuals @math{e_i^{(k)} = (y_i - X_i c^{(k-1)})/(t \sigma^{(k)} \sqrt{1 - h_i})}, where @math{t} is a tuning constant depending on the choice of @math{\psi}, and @math{h_i} are the statistical leverages (diagonal elements of the matrix @math{X (X^T X)^{-1} X^T}). Including @math{t} and @math{h_i} in the residual calculation has been shown to improve the convergence of the method. The residual standard deviation is approximated as @math{\sigma^{(k)} = MAD / 0.6745}, where MAD is the Median-Absolute-Deviation of the @math{n-p} largest residuals from the previous iteration. @item Compute new weights @math{w_i^{(k)} = \psi(e_i^{(k)})/e_i^{(k)}}. @item Compute new coefficients @math{c^{(k)}} by solving the weighted least squares problem with weights @math{w_i^{(k)}}. @item Steps 2 through 4 are iterated until the coefficients converge or until some maximum iteration limit is reached. Coefficients are tested for convergence using the critera: @tex \beforedisplay $$ |c_i^{(k)} - c_i^{(k-1)}| \le \epsilon \times \hbox{max}(|c_i^{(k)}|, |c_i^{(k-1)}|) $$ \afterdisplay @end tex @ifinfo @example |c_i^(k) - c_i^(k-1)| \le \epsilon \times max(|c_i^(k)|, |c_i^(k-1)|) @end example @end ifinfo for all @math{0 \le i < p} where @math{\epsilon} is a small tolerance factor. @end enumerate @noindent The key to this method lies in selecting the function @math{\psi(e_i)} to assign smaller weights to large residuals, and larger weights to smaller residuals. As the iteration proceeds, outliers are assigned smaller and smaller weights, eventually having very little or no effect on the fitted model. @deftypefun {gsl_multifit_robust_workspace *} gsl_multifit_robust_alloc (const gsl_multifit_robust_type * @var{T}, const size_t @var{n}, const size_t @var{p}) @tindex gsl_multifit_robust_workspace This function allocates a workspace for fitting a model to @var{n} observations using @var{p} parameters. The size of the workspace is @math{O(np + p^2)}. The type @var{T} specifies the function @math{\psi} and can be selected from the following choices. @deffn {Robust type} gsl_multifit_robust_default This specifies the @code{gsl_multifit_robust_bisquare} type (see below) and is a good general purpose choice for robust regression. @end deffn @deffn {Robust type} gsl_multifit_robust_bisquare This is Tukey's biweight (bisquare) function and is a good general purpose choice for robust regression. The weight function is given by @tex \beforedisplay $$ w(e) = \left\{ \matrix{ (1 - e^2)^2, & |e| \le 1\cr 0, & |e| > 1} \right. $$ \afterdisplay @end tex @ifinfo @example w(e) = (1 - e^2)^2 @end example @end ifinfo and the default tuning constant is @math{t = 4.685}. @end deffn @deffn {Robust type} gsl_multifit_robust_cauchy This is Cauchy's function, also known as the Lorentzian function. This function does not guarantee a unique solution, meaning different choices of the coefficient vector @var{c} could minimize the objective function. Therefore this option should be used with care. The weight function is given by @tex \beforedisplay $$ w(e) = {1 \over 1 + e^2} $$ \afterdisplay @end tex @ifinfo @example w(e) = 1 / (1 + e^2) @end example @end ifinfo and the default tuning constant is @math{t = 2.385}. @end deffn @deffn {Robust type} gsl_multifit_robust_fair This is the fair @math{\rho} function, which guarantees a unique solution and has continuous derivatives to three orders. The weight function is given by @tex \beforedisplay $$ w(e) = {1 \over 1 + |e|} $$ \afterdisplay @end tex @ifinfo @example w(e) = 1 / (1 + |e|) @end example @end ifinfo and the default tuning constant is @math{t = 1.400}. @end deffn @deffn {Robust type} gsl_multifit_robust_huber This specifies Huber's @math{\rho} function, which is a parabola in the vicinity of zero and increases linearly for a given threshold @math{|e| > t}. This function is also considered an excellent general purpose robust estimator, however, occasional difficulties can be encountered due to the discontinuous first derivative of the @math{\psi} function. The weight function is given by @tex \beforedisplay $$ w(e) = \left\{ \matrix{ 1, & |e| \le 1\cr {1 \over |e|}, & |e| > 1} \right. $$ \afterdisplay @end tex @ifinfo @example w(e) = 1/max(1,|e|) @end example @end ifinfo and the default tuning constant is @math{t = 1.345}. @end deffn @deffn {Robust type} gsl_multifit_robust_ols This specifies the ordinary least squares solution, which can be useful for quickly checking the difference between the various robust and OLS solutions. The weight function is given by @tex \beforedisplay $$ w(e) = 1 $$ \afterdisplay @end tex @ifinfo @example w(e) = 1 @end example @end ifinfo and the default tuning constant is @math{t = 1}. @end deffn @deffn {Robust type} gsl_multifit_robust_welsch This specifies the Welsch function which can perform well in cases where the residuals have an exponential distribution. The weight function is given by @tex \beforedisplay $$ w(e) = \exp{(-e^2)} $$ \afterdisplay @end tex @ifinfo @example w(e) = \exp(-e^2) @end example @end ifinfo and the default tuning constant is @math{t = 2.985}. @end deffn @end deftypefun @deftypefun void gsl_multifit_robust_free (gsl_multifit_robust_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun {const char *} gsl_multifit_robust_name (const gsl_multifit_robust_workspace * @var{w}) This function returns the name of the robust type @var{T} specified to @code{gsl_multifit_robust_alloc}. @end deftypefun @deftypefun int gsl_multifit_robust_tune (const double @var{tune}, gsl_multifit_robust_workspace * @var{w}) This function sets the tuning constant @math{t} used to adjust the residuals at each iteration to @var{tune}. Decreasing the tuning constant increases the downweight assigned to large residuals, while increasing the tuning constant decreases the downweight assigned to large residuals. @end deftypefun @deftypefun int gsl_multifit_robust_maxiter (const size_t @var{maxiter}, gsl_multifit_robust_workspace * @var{w}) This function sets the maximum number of iterations in the iteratively reweighted least squares algorithm to @var{maxiter}. By default, this value is set to 100 by @code{gsl_multifit_robust_alloc}. @end deftypefun @deftypefun int gsl_multifit_robust_weights (const gsl_vector * @var{r}, gsl_vector * @var{wts}, gsl_multifit_robust_workspace * @var{w}) This function assigns weights to the vector @var{wts} using the residual vector @var{r} and previously specified weighting function. The output weights are given by @math{wts_i = w(r_i / (t \sigma))}, where the weighting functions @math{w} are detailed in @code{gsl_multifit_robust_alloc}. @math{\sigma} is an estimate of the residual standard deviation based on the Median-Absolute-Deviation and @math{t} is the tuning constant. This function is useful if the user wishes to implement their own robust regression rather than using the supplied @code{gsl_multifit_robust} routine below. @end deftypefun @deftypefun int gsl_multifit_robust (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, gsl_multifit_robust_workspace * @var{w}) This function computes 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}, attemping to reduce the influence of outliers using the algorithm outlined above. The @math{p}-by-@math{p} variance-covariance matrix of the model parameters @var{cov} is estimated as @math{\sigma^2 (X^T X)^{-1}}, where @math{\sigma} is an approximation of the residual standard deviation using the theory of robust regression. Special care must be taken when estimating @math{\sigma} and other statistics such as @math{R^2}, and so these are computed internally and are available by calling the function @code{gsl_multifit_robust_statistics}. If the coefficients do not converge within the maximum iteration limit, the function returns @code{GSL_EMAXITER}. In this case, the current estimates of the coefficients and covariance matrix are returned in @var{c} and @var{cov} and the internal fit statistics are computed with these estimates. @end deftypefun @deftypefun int gsl_multifit_robust_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 robust 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 @deftypefun int gsl_multifit_robust_residuals (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, const gsl_vector * @var{c}, gsl_vector * @var{r}, gsl_multifit_robust_workspace * @var{w}) This function computes the vector of studentized residuals @math{r_i = {y_i - (X c)_i \over \sigma \sqrt{1 - h_i}}} for the observations @var{y}, coefficients @var{c} and matrix of predictor variables @var{X}. The routine @code{gsl_multifit_robust} must first be called to compute the statisical leverages @math{h_i} of the matrix @var{X} and residual standard deviation estimate @math{\sigma}. @end deftypefun @deftypefun gsl_multifit_robust_stats gsl_multifit_robust_statistics (const gsl_multifit_robust_workspace * @var{w}) This function returns a structure containing relevant statistics from a robust regression. The function @code{gsl_multifit_robust} must be called first to perform the regression and calculate these statistics. The returned @code{gsl_multifit_robust_stats} structure contains the following fields. @itemize @w{} @item double @code{sigma_ols} This contains the standard deviation of the residuals as computed from ordinary least squares (OLS). @item double @code{sigma_mad} This contains an estimate of the standard deviation of the final residuals using the Median-Absolute-Deviation statistic @item double @code{sigma_rob} This contains an estimate of the standard deviation of the final residuals from the theory of robust regression (see Street et al, 1988). @item double @code{sigma} This contains an estimate of the standard deviation of the final residuals by attemping to reconcile @code{sigma_rob} and @code{sigma_ols} in a reasonable way. @item double @code{Rsq} This contains the @math{R^2} coefficient of determination statistic using the estimate @code{sigma}. @item double @code{adj_Rsq} This contains the adjusted @math{R^2} coefficient of determination statistic using the estimate @code{sigma}. @item double @code{rmse} This contains the root mean squared error of the final residuals @item double @code{sse} This contains the residual sum of squares taking into account the robust covariance matrix. @item size_t @code{dof} This contains the number of degrees of freedom @math{n - p} @item size_t @code{numit} Upon successful convergence, this contains the number of iterations performed @item gsl_vector * @code{weights} This contains the final weight vector of length @var{n} @item gsl_vector * @code{r} This contains the final residual vector of length @var{n}, @math{r = y - X c} @end itemize @end deftypefun @node Large Dense Linear Systems @section Large dense linear systems @cindex large dense linear least squares @cindex linear least squares, large This module is concerned with solving large dense least squares systems @math{X c = y} where the @math{n}-by-@math{p} matrix @math{X} has @math{n >> p} (ie: many more rows than columns). This type of matrix is called a ``tall skinny'' matrix, and for some applications, it may not be possible to fit the entire matrix in memory at once to use the standard SVD approach. Therefore, the algorithms in this module are designed to allow the user to construct smaller blocks of the matrix @math{X} and accumulate those blocks into the larger system one at a time. The algorithms in this module never need to store the entire matrix @math{X} in memory. The large linear least squares routines support data weights and Tikhonov regularization, and are designed to minimize the residual @tex \beforedisplay $$ \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 @end example @end ifinfo where @math{y} is the @math{n}-by-@math{1} observation vector, @math{X} is the @math{n}-by-@math{p} design matrix, @math{c} is the @math{p}-by-@math{1} solution vector, @math{W =} diag@math{(w_1,...,w_n)} is the data weighting matrix, @math{L} is an @math{m}-by-@math{p} regularization matrix, @math{\lambda} is a regularization parameter, and @math{||r||_W^2 = r^T W r}. In the discussion which follows, we will assume that the system has been converted into Tikhonov standard form, @tex \beforedisplay $$ \chi^2 = || \tilde{y} - \tilde{X} \tilde{c} ||^2 + \lambda^2 || \tilde{c} ||^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || y~ - X~ c~ ||^2 + \lambda^2 || c~ ||^2 @end example @end ifinfo and we will drop the tilde characters from the various parameters. For a discussion of the transformation to standard form @pxref{Regularized regression}. The basic idea is to partition the matrix @math{X} and observation vector @math{y} as @tex \beforedisplay $$ \left( \matrix{ X_1 \cr X_2 \cr X_3 \cr \vdots \cr X_k \cr } \right) c = \left( \matrix{ y_1 \cr y_2 \cr y_3 \cr \vdots \cr y_k \cr } \right) $$ \afterdisplay @end tex @ifinfo @example [ X_1 ] c = [ y_1 ] [ X_2 ] [ y_2 ] [ X_3 ] [ y_3 ] [ ... ] [ ... ] [ X_k ] [ y_k ] @end example @end ifinfo into @math{k} blocks, where each block (@math{X_i,y_i}) may have any number of rows, but each @math{X_i} has @math{p} columns. The sections below describe the methods available for solving this partitioned system. The functions are declared in the header file @file{gsl_multilarge.h}. @menu * Large Dense Linear Systems Normal Equations:: * Large Dense Linear Systems TSQR:: * Large Dense Linear Systems Solution Steps:: * Large Dense Linear Systems Routines:: @end menu @node Large Dense Linear Systems Normal Equations @subsection Normal Equations Approach @cindex large linear least squares, normal equations The normal equations approach to the large linear least squares problem described above is popular due to its speed and simplicity. Since the normal equations solution to the problem is given by @tex \beforedisplay $$ c = \left( X^T X + \lambda^2 I \right)^{-1} X^T y $$ \afterdisplay @end tex @ifinfo @example c = ( X^T X + \lambda^2 I )^-1 X^T y @end example @end ifinfo only the @math{p}-by-@math{p} matrix @math{X^T X} and @math{p}-by-1 vector @math{X^T y} need to be stored. Using the partition scheme described above, these are given by @tex \beforedisplay $$ \eqalign{ X^T X &= \sum_i X_i^T X_i \cr X^T y &= \sum_i X_i^T y_i } $$ \afterdisplay @end tex @ifinfo @example X^T X = \sum_i X_i^T X_i X^T y = \sum_i X_i^T y_i @end example @end ifinfo Since the matrix @math{X^T X} is symmetric, only half of it needs to be calculated. Once all of the blocks (@math{X_i,y_i}) have been accumulated into the final @math{X^T X} and @math{X^T y}, the system can be solved with a Cholesky factorization of the @math{X^T X} matrix. If the Cholesky factorization fails (occasionally due to numerical rounding errors), a QR decomposition is then used. In both cases, the @math{X^T X} matrix is first transformed via a diagonal scaling transformation to attempt to reduce its condition number as much as possible to recover a more accurate solution vector. The normal equations approach is the fastest method for solving the large least squares problem, and is accurate for well-conditioned matrices @math{X}. However, for ill-conditioned matrices, as is often the case for large systems, this method can suffer from numerical instabilities (see Trefethen and Bau, 1997). The number of operations for this method is @math{O(np^2 + {1 \over 3}p^3)}. @node Large Dense Linear Systems TSQR @subsection Tall Skinny QR (TSQR) Approach @cindex large linear least squares, TSQR An algorithm which has better numerical stability for ill-conditioned problems is known as the Tall Skinny QR (TSQR) method. This method is based on computing the thin QR decomposition of the least squares matrix @math{X = Q R}, where @math{Q} is an @math{n}-by-@math{p} matrix with orthogonal columns, and @math{R} is a @math{p}-by-@math{p} upper triangular matrix. Once these factors are calculated, the residual becomes @tex \beforedisplay $$ \chi^2 = || Q^T y - R c ||^2 + \lambda^2 || c ||^2 $$ \afterdisplay @end tex @ifinfo @example \chi^2 = || Q^T y - R c ||^2 + \lambda^2 || c ||^2 @end example @end ifinfo which can be written as the matrix equation @tex \beforedisplay $$ \left( \matrix{ R \cr \lambda I } \right) c = \left( \matrix{ Q^T y \cr 0 } \right) $$ \afterdisplay @end tex @ifinfo @example [ R ; \lambda I ] c = [ Q^T b ; 0 ] @end example @end ifinfo The matrix on the left hand side is now a much smaller @math{2p}-by-@math{p} matrix which can be solved with a standard SVD approach. The @math{Q} matrix is just as large as the original matrix @math{X}, however it does not need to be explicitly constructed. The TSQR algorithm computes only the @math{p}-by-@math{p} matrix @math{R} and the @math{p}-by-1 vector @math{Q^T y}, and updates these quantities as new blocks are added to the system. Each time a new block of rows (@math{X_i,y_i}) is added, the algorithm performs a QR decomposition of the matrix @tex \beforedisplay $$ \left( \matrix{ R_{i-1} \cr X_i } \right) $$ \afterdisplay @end tex @ifinfo @example [ R_(i-1) ; X_i ] @end example @end ifinfo where @math{R_{i-1}} is the upper triangular @math{R} factor for the matrix @tex \beforedisplay $$ \left( \matrix{ X_1 \cr \vdots \cr X_{i-1} } \right) $$ \afterdisplay @end tex @ifinfo @example [ X_1 ; ... ; X_(i-1) ] @end example @end ifinfo This QR decomposition is done efficiently taking into account the sparse structure of @math{R_{i-1}}. See Demmel et al, 2008 for more details on how this is accomplished. The number of operations for this method is @math{O(2np^2 - {2 \over 3}p^3)}. @node Large Dense Linear Systems Solution Steps @subsection Large Dense Linear Systems Solution Steps @cindex large linear least squares, steps The typical steps required to solve large regularized linear least squares problems are as follows: @enumerate @item Choose the regularization matrix @math{L}. @item Construct a block of rows of the least squares matrix, right hand side vector, and weight vector (@math{X_i}, @math{y_i}, @math{w_i}). @item Transform the block to standard form (@math{\tilde{X_i}},@math{\tilde{y_i}}). This step can be skipped if @math{L = I} and @math{W = I}. @item Accumulate the standard form block (@math{\tilde{X_i}},@math{\tilde{y_i}}) into the system. @item Repeat steps 2-4 until the entire matrix and right hand side vector have been accumulated. @item Determine an appropriate regularization parameter @math{\lambda} (using for example L-curve analysis). @item Solve the standard form system using the chosen @math{\lambda}. @item Backtransform the standard form solution @math{\tilde{c}} to recover the original solution vector @math{c}. @end enumerate @node Large Dense Linear Systems Routines @subsection Large Dense Linear Least Squares Routines @cindex large linear least squares, routines @deftypefun {gsl_multilarge_linear_workspace *} gsl_multilarge_linear_alloc (const gsl_multilarge_linear_type * @var{T}, const size_t @var{p}) This function allocates a workspace for solving large linear least squares systems. The least squares matrix @math{X} has @var{p} columns, but may have any number of rows. The parameter @var{T} specifies the method to be used for solving the large least squares system and may be selected from the following choices @deffn {Multilarge type} gsl_multilarge_linear_normal This specifies the normal equations approach for solving the least squares system. This method is suitable in cases where performance is critical and it is known that the least squares matrix @math{X} is well conditioned. The size of this workspace is @math{O(p^2)}. @end deffn @deffn {Multilarge type} gsl_multilarge_linear_tsqr This specifies the sequential Tall Skinny QR (TSQR) approach for solving the least squares system. This method is a good general purpose choice for large systems, but requires about twice as many operations as the normal equations method for @math{n >> p}. The size of this workspace is @math{O(p^2)}. @end deffn @end deftypefun @deftypefun void gsl_multilarge_linear_free (gsl_multilarge_linear_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun {const char *} gsl_multilarge_linear_name (gsl_multilarge_linear_workspace * @var{w}) This function returns a string pointer to the name of the multilarge solver. @end deftypefun @deftypefun int gsl_multilarge_linear_reset (gsl_multilarge_linear_workspace * @var{w}) This function resets the workspace @var{w} so it can begin to accumulate a new least squares system. @end deftypefun @deftypefun int gsl_multilarge_linear_stdform1 (const gsl_vector * @var{L}, const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multilarge_linear_workspace * @var{work}) @deftypefunx int gsl_multilarge_linear_wstdform1 (const gsl_vector * @var{L}, const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multilarge_linear_workspace * @var{work}) These functions define a regularization matrix @math{L =} diag@math{(l_0,l_1,...,l_{p-1})}. The diagonal matrix element @math{l_i} is provided by the @math{i}th element of the input vector @var{L}. The block (@var{X},@var{y}) is converted to standard form and the parameters (@math{\tilde{X}},@math{\tilde{y}}) are stored in @var{Xs} and @var{ys} on output. @var{Xs} and @var{ys} have the same dimensions as @var{X} and @var{y}. Optional data weights may be supplied in the vector @var{w}. In order to apply this transformation, @math{L^{-1}} must exist and so none of the @math{l_i} may be zero. After the standard form system has been solved, use @code{gsl_multilarge_linear_genform1} to recover the original solution vector. It is allowed to have @var{X} = @var{Xs} and @var{y} = @var{ys} for an in-place transform. @end deftypefun @deftypefun int gsl_multilarge_linear_L_decomp (gsl_matrix * @var{L}, gsl_vector * @var{tau}) This function calculates the QR decomposition of the @math{m}-by-@math{p} regularization matrix @var{L}. @var{L} must have @math{m \ge p}. On output, the Householder scalars are stored in the vector @var{tau} of size @math{p}. These outputs will be used by @code{gsl_multilarge_linear_wstdform2} to complete the transformation to standard form. @end deftypefun @deftypefun int gsl_multilarge_linear_stdform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multilarge_linear_workspace * @var{work}) @deftypefunx int gsl_multilarge_linear_wstdform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_matrix * @var{Xs}, gsl_vector * @var{ys}, gsl_multilarge_linear_workspace * @var{work}) These functions convert a block of rows (@var{X},@var{y},@var{w}) to standard form (@math{\tilde{X}},@math{\tilde{y}}) which are stored in @var{Xs} and @var{ys} respectively. @var{X}, @var{y}, and @var{w} must all have the same number of rows. The @math{m}-by-@math{p} regularization matrix @var{L} is specified by the inputs @var{LQR} and @var{Ltau}, which are outputs from @code{gsl_multilarge_linear_L_decomp}. @var{Xs} and @var{ys} have the same dimensions as @var{X} and @var{y}. After the standard form system has been solved, use @code{gsl_multilarge_linear_genform2} to recover the original solution vector. Optional data weights may be supplied in the vector @var{w}, where @math{W =} diag(w). @end deftypefun @deftypefun int gsl_multilarge_linear_accumulate (gsl_matrix * @var{X}, gsl_vector * @var{y}, gsl_multilarge_linear_workspace * @var{w}) This function accumulates the standard form block (@math{X,y}) into the current least squares system. @var{X} and @var{y} have the same number of rows, which can be arbitrary. @var{X} must have @math{p} columns. For the TSQR method, @var{X} and @var{y} are destroyed on output. For the normal equations method, they are both unchanged. @end deftypefun @deftypefun int gsl_multilarge_linear_solve (const double @var{lambda}, gsl_vector * @var{c}, double * @var{rnorm}, double * @var{snorm}, gsl_multilarge_linear_workspace * @var{w}) After all blocks (@math{X_i,y_i}) have been accumulated into the large least squares system, this function will compute the solution vector which is stored in @var{c} on output. The regularization parameter @math{\lambda} is provided in @var{lambda}. On output, @var{rnorm} contains the residual norm @math{||y - X c||_W} and @var{snorm} contains the solution norm @math{||L c||}. @end deftypefun @deftypefun int gsl_multilarge_linear_genform1 (const gsl_vector * @var{L}, const gsl_vector * @var{cs}, gsl_vector * @var{c}, gsl_multilarge_linear_workspace * @var{work}) After a regularized system has been solved with @math{L =} diag@math{(\l_0,\l_1,...,\l_{p-1})}, this function backtransforms the standard form solution vector @var{cs} to recover the solution vector of the original problem @var{c}. The diagonal matrix elements @math{l_i} are provided in the vector @var{L}. It is allowed to have @var{c} = @var{cs} for an in-place transform. @end deftypefun @deftypefun int gsl_multilarge_linear_genform2 (const gsl_matrix * @var{LQR}, const gsl_vector * @var{Ltau}, const gsl_vector * @var{cs}, gsl_vector * @var{c}, gsl_multilarge_linear_workspace * @var{work}) After a regularized system has been solved with a regularization matrix @math{L}, specified by (@var{LQR},@var{Ltau}), this function backtransforms the standard form solution @var{cs} to recover the solution vector of the original problem, which is stored in @var{c}, of length @math{p}. @end deftypefun @deftypefun int gsl_multilarge_linear_lcurve (gsl_vector * @var{reg_param}, gsl_vector * @var{rho}, gsl_vector * @var{eta}, gsl_multilarge_linear_workspace * @var{work}) This function computes the L-curve for a large least squares system after it has been fully accumulated into the workspace @var{work}. The output vectors @var{reg_param}, @var{rho}, and @var{eta} must all be the same size, and will contain the regularization parameters @math{\lambda_i}, residual norms @math{||y - X c_i||}, and solution norms @math{|| L c_i ||} which compose the L-curve, where @math{c_i} is the regularized solution vector corresponding to @math{\lambda_i}. The user may determine the number of points on the L-curve by adjusting the size of these input arrays. For the TSQR method, the regularization parameters @math{\lambda_i} are estimated from the singular values of the triangular @math{R} factor. For the normal equations method, they are estimated from the eigenvalues of the @math{X^T X} matrix. @end deftypefun @deftypefun int gsl_multilarge_linear_rcond (double * @var{rcond}, gsl_multilarge_linear_workspace * @var{work}) This function computes the reciprocal condition number, stored in @var{rcond}, of the least squares matrix after it has been accumulated into the workspace @var{work}. For the TSQR algorithm, this is accomplished by calculating the SVD of the @math{R} factor, which has the same singular values as the matrix @math{X}. For the normal equations method, this is done by computing the eigenvalues of @math{X^T X}, which could be inaccurate for ill-conditioned matrices @math{X}. @end deftypefun @node Troubleshooting @section Troubleshooting @cindex least squares troubleshooting When using models based on polynomials, care should be taken when constructing the design matrix @math{X}. If the @math{x} values are large, then the matrix @math{X} could be ill-conditioned since its columns are powers of @math{x}, leading to unstable least-squares solutions. In this case it can often help to center and scale the @math{x} values using the mean and standard deviation: @tex \beforedisplay $$ x' = {x - \mu(x) \over \sigma(x)} $$ \afterdisplay @end tex @ifinfo @example x' = (x - mu)/sigma @end example @end ifinfo @noindent and then construct the @math{X} matrix using the transformed values @math{x'}. @node Fitting Examples @section Examples The example programs in this section demonstrate the various linear regression methods. @menu * Fitting linear regression example:: * Fitting multi-parameter linear regression example:: * Fitting regularized linear regression example 1:: * Fitting regularized linear regression example 2:: * Fitting robust linear regression example:: * Fitting large linear systems example:: @end menu @node Fitting linear regression example @subsection Simple Linear Regression Example 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 @node Fitting multi-parameter linear regression example @subsection Multi-parameter Linear Regression Example The following 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 $ GSL_RNG_TYPE=mt19937_1999 ./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 regularized linear regression example 1 @subsection Regularized Linear Regression Example 1 The next program demonstrates the difference between ordinary and regularized least squares when the design matrix is near-singular. In this program, we generate two random normally distributed variables @math{u} and @math{v}, with @math{v = u + noise} so that @math{u} and @math{v} are nearly colinear. We then set a third dependent variable @math{y = u + v + noise} and solve for the coefficients @math{c_1,c_2} of the model @math{Y(c_1,c_2) = c_1 u + c_2 v}. Since @math{u \approx v}, the design matrix @math{X} is nearly singular, leading to unstable ordinary least squares solutions. @noindent Here is the program output: @example matrix condition number = 1.025113e+04 === Unregularized fit === best fit: y = -43.6588 u + 45.6636 v residual norm = 31.6248 solution norm = 63.1764 chisq/dof = 1.00213 === Regularized fit (L-curve) === optimal lambda: 4.51103 best fit: y = 1.00113 u + 1.0032 v residual norm = 31.6547 solution norm = 1.41728 chisq/dof = 1.04499 === Regularized fit (GCV) === optimal lambda: 0.0232029 best fit: y = -19.8367 u + 21.8417 v residual norm = 31.6332 solution norm = 29.5051 chisq/dof = 1.00314 @end example @noindent We see that the ordinary least squares solution is completely wrong, while the L-curve regularized method with the optimal @math{\lambda = 4.51103} finds the correct solution @math{c_1 \approx c_2 \approx 1}. The GCV regularized method finds a regularization parameter @math{\lambda = 0.0232029} which is too small to give an accurate solution, although it performs better than OLS. The L-curve and its computed corner, as well as the GCV curve and its minimum are plotted below. @iftex @sp 1 @center @image{regularized,5.0in} @end iftex @noindent The program is given below. @example @verbatiminclude examples/fitreg.c @end example @node Fitting regularized linear regression example 2 @subsection Regularized Linear Regression Example 2 The following example program minimizes the cost function @tex \beforedisplay $$ ||y - X c||^2 + \lambda^2 ||x||^2 $$ \afterdisplay @end tex @ifinfo @example ||y - X c||^2 + \lambda^2 ||x||^2 @end example @end ifinfo @noindent where @math{X} is the @math{10}-by-@math{8} Hilbert matrix whose entries are given by @tex \beforedisplay $$ X_{ij} = {1 \over i + j - 1} $$ \afterdisplay @end tex @ifinfo @example X_@{ij@} = 1 / (i + j - 1) @end example @end ifinfo @noindent and the right hand side vector is given by @math{y = [1,-1,1,-1,1,-1,1,-1,1,-1]^T}. Solutions are computed for @math{\lambda = 0} (unregularized) as well as for optimal parameters @math{\lambda} chosen by analyzing the L-curve and GCV curve. @noindent Here is the program output: @example matrix condition number = 3.565872e+09 === Unregularized fit === residual norm = 2.15376 solution norm = 2.92217e+09 chisq/dof = 2.31934 === Regularized fit (L-curve) === optimal lambda: 7.11407e-07 residual norm = 2.60386 solution norm = 424507 chisq/dof = 3.43565 === Regularized fit (GCV) === optimal lambda: 1.72278 residual norm = 3.1375 solution norm = 0.139357 chisq/dof = 4.95076 @end example @noindent Here we see the unregularized solution results in a large solution norm due to the ill-conditioned matrix. The L-curve solution finds a small value of @math{\lambda = 7.11e-7} which still results in a badly conditioned system and a large solution norm. The GCV method finds a parameter @math{\lambda = 1.72} which results in a well-conditioned system and small solution norm. @noindent The L-curve and its computed corner, as well as the GCV curve and its minimum are plotted below. @iftex @sp 1 @center @image{regularized2,5.0in} @end iftex @noindent The program is given below. @example @verbatiminclude examples/fitreg2.c @end example @node Fitting robust linear regression example @subsection Robust Linear Regression Example The next program demonstrates the advantage of robust least squares on a dataset with outliers. The program generates linear @math{(x,y)} data pairs on the line @math{y = 1.45 x + 3.88}, adds some random noise, and inserts 3 outliers into the dataset. Both the robust and ordinary least squares (OLS) coefficients are computed for comparison. @example @verbatiminclude examples/robfit.c @end example The output from the program is shown in the following plot. @iftex @sp 1 @center @image{robust,3.0in} @end iftex @node Fitting large linear systems example @subsection Large Dense Linear Regression Example The following program demostrates the large dense linear least squares solvers. This example is adapted from Trefethen and Bau, and fits the function @math{f(t) = \exp{(\sin^3{(10t)}})} on the interval @math{[0,1]} with a degree 15 polynomial. The program generates @math{n = 50000} equally spaced points @math{t_i} on this interval, calculates the function value and adds random noise to determine the observation value @math{y_i}. The entries of the least squares matrix are @math{X_{ij} = t_i^j}, representing a polynomial fit. The matrix is highly ill-conditioned, with a condition number of about @math{1.4 \cdot 10^{11}}. The program accumulates the matrix into the least squares system in 5 blocks, each with 10000 rows. This way the full matrix @math{X} is never stored in memory. We solve the system with both the normal equations and TSQR methods. The results are shown in the plot below. In the top left plot, we see the unregularized normal equations solution has larger error than TSQR due to the ill-conditioning of the matrix. In the bottom left plot, we show the L-curve, which exhibits multiple corners. In the top right panel, we plot a regularized solution using @math{\lambda = 10^{-6}}. The TSQR and normal solutions now agree, however they are unable to provide a good fit due to the damping. This indicates that for some ill-conditioned problems, regularizing the normal equations does not improve the solution. This is further illustrated in the bottom right panel, where we plot the L-curve calculated from the normal equations. The curve agrees with the TSQR curve for larger damping parameters, but for small @math{\lambda}, the normal equations approach cannot provide accurate solution vectors leading to numerical inaccuracies in the left portion of the curve. @iftex @sp 1 @center @image{multilarge,6.0in} @end iftex @example @verbatiminclude examples/largefit.c @end example @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 @w{} @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}. @noindent More information on Tikhonov regularization can be found in @itemize @w{} @item Hansen, P. C. (1998), Rank-Deficient and Discrete Ill-Posed Problems: Numerical Aspects of Linear Inversion. SIAM Monogr. on Mathematical Modeling and Computation, Society for Industrial and Applied Mathematics @item M. Rezghi and S. M. Hosseini (2009), A new variant of L-curve for Tikhonov regularization, Journal of Computational and Applied Mathematics, Volume 231, Issue 2, pages 914-924. @end itemize @noindent The GSL implementation of robust linear regression closely follows the publications @itemize @w{} @item DuMouchel, W. and F. O'Brien (1989), "Integrating a robust option into a multiple regression computing environment," Computer Science and Statistics: Proceedings of the 21st Symposium on the Interface, American Statistical Association @item Street, J.O., R.J. Carroll, and D. Ruppert (1988), "A note on computing robust regression estimates via iteratively reweighted least squares," The American Statistician, v. 42, pp. 152-154. @end itemize @noindent More information about the normal equations and TSQR approach for solving large linear least squares systems can be found in the publications @itemize @w{} @item Trefethen, L. N. and Bau, D. (1997), "Numerical Linear Algebra", SIAM. @item Demmel, J., Grigori, L., Hoemmen, M. F., and Langou, J. "Communication-optimal parallel and sequential QR and LU factorizations", UCB Technical Report No. UCB/EECS-2008-89, 2008. @end itemize gsl-doc-2.3/doc/specfunc-exp.texi0000664000175000017500000001226412616157443015040 0ustar eddedd@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_exprel_2}. 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 gsl-doc-2.3/doc/histogram.texi0000664000175000017500000014256312616157443014443 0ustar eddedd@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{yrange}. @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 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_histogram2d_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 gsl-doc-2.3/doc/texinfo.tex0000644000175000017500000116703612630105472013741 0ustar eddedd% 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{2013-02-01.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012, 2013 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 3 of the % License, 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 program. If not, see . % % 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 Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % 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} \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\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % 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\putworderror\undefined \gdef\putworderror{error}\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 % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % 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 } % 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\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % 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} % 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 % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % 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). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \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. % \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. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \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 \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \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 \indexdummies \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\relax \unvbox#1\relax \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\argtorun{#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 occurrence of `\^^M' or `\^^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 % Do not use \next, perhaps the caller of \parsearg uses it; 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 \argtorun. % (Similarly, 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\argtorun\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 environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, 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 } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside 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. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % 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\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @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 \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'. Not documented, written for gawk manual. % \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 } % @| 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). This command % is not documented, not supported, and doesn't work. % \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 }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \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\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \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 = {}% } % @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 being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient 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 \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\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, which is what will be displayed in the % outline by the pdf viewer. #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 worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \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}% \readdatafile{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. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \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}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \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}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % 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}} % 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} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \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} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \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}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \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}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % 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{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #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}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % 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 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % 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 } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % 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 % @b, explicit bold. Also @strong. \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\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \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 \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % 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 \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\normaldash{-} \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{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\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. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#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} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \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\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @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 % @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\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\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}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % 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} % @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} % @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 \null % reset \spacefactor=1000 } % @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{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @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`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % 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 % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\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 \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % ctrl is no longer a Texinfo command, but leave this definition for fun. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \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\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \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 \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \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{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\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 \reducedsf \putworderror\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} % @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 symbol 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 } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = ectt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @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}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % 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\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \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 } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % 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 {\secfonts\rmisbold \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 -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @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{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % 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\thisisundefined \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\relax \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 % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @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 . % \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. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % 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 again encounter the problem the 1sp was intended to solve. % --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: \obeylines \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'. \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. \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. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\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-\normaldash \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 executes 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}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @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 \relax % 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{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#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{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % 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\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\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\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \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{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \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\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % 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. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \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}% % \safewhatsit\dosubindwrite }% \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 \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/skips around a whatsit: % % 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 or \pdfdest 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} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip 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-\whatsitskip \fi % #1% % \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\whatsitpenalty>9999 \penalty\whatsitpenalty \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\whatsitskip \fi \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 \plainfrenchspacing \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 freezes 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 % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \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. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \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 plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\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{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \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. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. 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 these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \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 achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \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 < \unnlevel \chardef\unnlevel = \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 > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 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 % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \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 calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \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 to achieve this: TeX expands \the only once, % simply yielding the contents of . (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}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \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 \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \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} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \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{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection 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\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \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. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \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 \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\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 \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \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\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \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.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \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 {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\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 } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \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 \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \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 } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \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\partentry = \shortpartentry \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 \tocreadfilename\space \ifeof 1 \else \readtocfile \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, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % 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. % @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 @ character. \envdef\tex{% \setupmarkupstyle{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 \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \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 \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \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; it will % also clear it, so that its embedded environments do the narrowing again. \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 = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \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. \newdimen\nonfillparindent \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 % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % 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 % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#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 environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{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\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @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. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % 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 } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\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 \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any 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\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % 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}% \setupmarkupstyle{verb}% \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 % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % 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'{'#1'}'{#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 \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \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 \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \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 \printdefunline, 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. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \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 \else \defunpenalty=10002 \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\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % 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 remaining 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 \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % 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}% \doingtypefntrue \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 {} } % Types: % @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{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category 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. We'll always have at % least two. \tempnum = 2 % % 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 % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at 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}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #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. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #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\ }} \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 } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets 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\thisisundefined \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 for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % 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 \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % 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{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \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\margbackslash#1{\char`\#1 } \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\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \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% \addtomacrolist{\the\macname}% \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\definedummyword\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\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % 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}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % 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 some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % 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. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \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} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, 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 \ifnum\paramno<10\relax % at most 9 \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}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \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 % at most 9 \ifnum\paramno<10\relax \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}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \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\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. 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 \addtomacrolist{#1}% \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 \lastsection, % 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 \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\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,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) 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 {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\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 \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\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox 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 \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (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 % 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 the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % 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 {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \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{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\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 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \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. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \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 % % Invoke rest of plain TeX footnote routine. \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. % Similarly, 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\thisisundefined \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 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 \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % 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 \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \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 \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \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 \lastsection 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\lastsection{\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 % % 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 floating, 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 % \lastsection 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,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \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 very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, 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 % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \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{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % 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{673.2pt}{160mm}% that's 51 lines {\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\relax \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.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % 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\_} \let\realunder=_ % 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} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \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 % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. Also revert - to its normal character, in % case the active - from code has slipped in. % {@catcode`- = @active @gdef@normalturnoffactive{% @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % 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 turn back 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 (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @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 gsl-doc-2.3/doc/rand-bernoulli.tex0000664000175000017500000004565312616157443015214 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-bernoulli.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-bernoulli.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 2157 R -31 0 V 31 2156 R -31 0 V 1051 631 M 0 -63 V 1452 63 R 0 -31 V 1453 31 R 0 -63 V 1452 63 R 0 -31 V 1452 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 1925 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 3052 1925 L 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 1725 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 5073 3650 L 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.7$}}% \put(3955,5244){\cjust{\strut{}Bernoulli Trial}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(5408,400){\cjust{\strut{}1}}% \put(2503,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 1}}% \put(900,2788){\rjust{\strut{} 0.5}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/gsl-ref.info0000644000175000017500000007107713022372752013760 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  Indirect: gsl-ref.info-1: 973 gsl-ref.info-2: 302546 gsl-ref.info-3: 601121 gsl-ref.info-4: 902718 gsl-ref.info-5: 1201856 gsl-ref.info-6: 1705030  Tag Table: (Indirect) Node: Top973 Node: Introduction4283 Node: Routines available in GSL5003 Node: GSL is Free Software6616 Node: Obtaining GSL9008 Node: No Warranty10036 Node: Reporting Bugs10542 Ref: Reporting Bugs-Footnote-111494 Node: Further Information11544 Node: Conventions used in this manual12558 Node: Using the library13322 Node: An Example Program14045 Ref: An Example Program-Footnote-114788 Node: Compiling and Linking14895 Node: Linking programs with the library15968 Ref: Linking programs with the library-Footnote-117371 Ref: Linking programs with the library-Footnote-217408 Node: Linking with an alternative BLAS library17461 Node: Shared Libraries18544 Ref: Shared Libraries-Footnote-120019 Node: ANSI C Compliance20067 Node: Inline functions21160 Node: Long double22698 Node: Portability functions24286 Node: Alternative optimized functions25684 Node: Support for different numeric types27142 Node: Compatibility with C++30206 Node: Aliasing of arrays30778 Node: Thread-safety31529 Node: Deprecated Functions32617 Node: Code Reuse33242 Node: Error Handling33887 Node: Error Reporting34687 Node: Error Codes36579 Node: Error Handlers38436 Node: Using GSL error reporting in your own functions42076 Node: Error Reporting Examples44036 Node: Mathematical Functions45248 Node: Mathematical Constants46041 Node: Infinities and Not-a-number47171 Ref: Infinities and Not-a-number-Footnote-148281 Node: Elementary Functions48691 Node: Small integer powers51148 Node: Testing the Sign of Numbers52797 Node: Testing for Odd and Even Numbers53230 Node: Maximum and Minimum functions53789 Node: Approximate Comparison of Floating Point Numbers56070 Node: Complex Numbers57430 Ref: Complex Numbers-Footnote-158775 Node: Representation of complex numbers58839 Node: Properties of complex numbers60779 Node: Complex arithmetic operators61785 Node: Elementary Complex Functions64531 Node: Complex Trigonometric Functions66355 Node: Inverse Complex Trigonometric Functions67576 Node: Complex Hyperbolic Functions70189 Node: Inverse Complex Hyperbolic Functions71485 Node: Complex Number References and Further Reading73473 Node: Polynomials74869 Node: Polynomial Evaluation75673 Node: Divided Difference Representation of Polynomials77084 Node: Quadratic Equations80946 Node: Cubic Equations82883 Node: General Polynomial Equations84466 Node: Roots of Polynomials Examples86823 Node: Roots of Polynomials References and Further Reading88212 Node: Special Functions89258 Node: Special Function Usage91506 Node: The gsl_sf_result struct92690 Node: Special Function Modes93954 Node: Airy Functions and Derivatives94888 Node: Airy Functions95613 Node: Derivatives of Airy Functions96973 Node: Zeros of Airy Functions98485 Node: Zeros of Derivatives of Airy Functions99204 Node: Bessel Functions99963 Node: Regular Cylindrical Bessel Functions101181 Node: Irregular Cylindrical Bessel Functions102505 Node: Regular Modified Cylindrical Bessel Functions103963 Node: Irregular Modified Cylindrical Bessel Functions106791 Node: Regular Spherical Bessel Functions109764 Node: Irregular Spherical Bessel Functions111977 Node: Regular Modified Spherical Bessel Functions113663 Node: Irregular Modified Spherical Bessel Functions115662 Node: Regular Bessel Function - Fractional Order117725 Node: Irregular Bessel Functions - Fractional Order118723 Node: Regular Modified Bessel Functions - Fractional Order119305 Node: Irregular Modified Bessel Functions - Fractional Order120230 Node: Zeros of Regular Bessel Functions121466 Node: Clausen Functions122569 Node: Coulomb Functions123173 Node: Normalized Hydrogenic Bound States123632 Node: Coulomb Wave Functions124745 Node: Coulomb Wave Function Normalization Constant128157 Node: Coupling Coefficients128910 Node: 3-j Symbols129684 Node: 6-j Symbols130288 Node: 9-j Symbols130912 Node: Dawson Function131618 Node: Debye Functions132185 Node: Dilogarithm133959 Node: Real Argument134281 Node: Complex Argument134975 Node: Elementary Operations135445 Node: Elliptic Integrals136269 Node: Definition of Legendre Forms136864 Node: Definition of Carlson Forms137684 Node: Legendre Form of Complete Elliptic Integrals138381 Node: Legendre Form of Incomplete Elliptic Integrals139934 Node: Carlson Forms142026 Node: Elliptic Functions (Jacobi)143573 Node: Error Functions144154 Node: Error Function144630 Node: Complementary Error Function145003 Node: Log Complementary Error Function145463 Node: Probability functions145915 Node: Exponential Functions147168 Node: Exponential Function147563 Node: Relative Exponential Functions148785 Node: Exponentiation With Error Estimate150457 Node: Exponential Integrals151666 Node: Exponential Integral152222 Node: Ei(x)153143 Node: Hyperbolic Integrals153591 Node: Ei_3(x)154246 Node: Trigonometric Integrals154638 Node: Arctangent Integral155237 Node: Fermi-Dirac Function155637 Node: Complete Fermi-Dirac Integrals156011 Node: Incomplete Fermi-Dirac Integrals158576 Node: Gamma and Beta Functions159219 Node: Gamma Functions159854 Node: Factorials162962 Node: Pochhammer Symbol165515 Node: Incomplete Gamma Functions167016 Node: Beta Functions168265 Node: Incomplete Beta Function169017 Node: Gegenbauer Functions169727 Node: Hypergeometric Functions171377 Node: Laguerre Functions175641 Node: Lambert W Functions177204 Node: Legendre Functions and Spherical Harmonics178244 Node: Legendre Polynomials178856 Node: Associated Legendre Polynomials and Spherical Harmonics180912 Node: Conical Functions191665 Node: Radial Functions for Hyperbolic Space193788 Node: Logarithm and Related Functions195965 Node: Mathieu Functions197589 Node: Mathieu Function Workspace198949 Node: Mathieu Function Characteristic Values199762 Node: Angular Mathieu Functions200944 Node: Radial Mathieu Functions202112 Node: Power Function203495 Node: Psi (Digamma) Function204423 Node: Digamma Function204976 Node: Trigamma Function205806 Node: Polygamma Function206383 Node: Synchrotron Functions206767 Node: Transport Functions207530 Node: Trigonometric Functions208677 Node: Circular Trigonometric Functions209323 Node: Trigonometric Functions for Complex Arguments210332 Node: Hyperbolic Trigonometric Functions211368 Node: Conversion Functions211971 Node: Restriction Functions212754 Node: Trigonometric Functions With Error Estimates213685 Node: Zeta Functions214595 Node: Riemann Zeta Function215053 Node: Riemann Zeta Function Minus One215732 Node: Hurwitz Zeta Function216503 Node: Eta Function217008 Node: Special Functions Examples217567 Node: Special Functions References and Further Reading219262 Node: Vectors and Matrices220779 Node: Data types221622 Node: Blocks222825 Node: Block allocation223758 Node: Reading and writing blocks225162 Node: Example programs for blocks227226 Node: Vectors227853 Node: Vector allocation229821 Node: Accessing vector elements231358 Ref: Accessing vector elements-Footnote-1234531 Node: Initializing vector elements234770 Node: Reading and writing vectors235464 Node: Vector views237554 Node: Copying vectors245020 Node: Exchanging elements245880 Node: Vector operations246438 Node: Finding maximum and minimum elements of vectors248211 Node: Vector properties249798 Node: Example programs for vectors250772 Node: Matrices253061 Node: Matrix allocation256001 Node: Accessing matrix elements257587 Node: Initializing matrix elements259560 Node: Reading and writing matrices260357 Node: Matrix views262460 Node: Creating row and column views269596 Node: Copying matrices274073 Node: Copying rows and columns274669 Node: Exchanging rows and columns276346 Node: Matrix operations277824 Node: Finding maximum and minimum elements of matrices279794 Node: Matrix properties281694 Node: Example programs for matrices282797 Node: Vector and Matrix References and Further Reading286869 Node: Permutations287355 Node: The Permutation struct288692 Node: Permutation allocation289195 Node: Accessing permutation elements290631 Node: Permutation properties291474 Node: Permutation functions292179 Node: Applying Permutations293436 Node: Reading and writing permutations295818 Ref: Reading and writing permutations-Footnote-1298034 Node: Permutations in cyclic form298146 Node: Permutation Examples302546 Node: Permutation References and Further Reading305089 Node: Combinations305763 Node: The Combination struct306648 Node: Combination allocation307199 Node: Accessing combination elements308986 Node: Combination properties309645 Node: Combination functions310531 Node: Reading and writing combinations311471 Ref: Reading and writing combinations-Footnote-1313704 Node: Combination Examples313816 Node: Combination References and Further Reading315124 Node: Multisets315527 Node: The Multiset struct316453 Node: Multiset allocation316974 Node: Accessing multiset elements318669 Node: Multiset properties319298 Node: Multiset functions320111 Node: Reading and writing multisets321021 Ref: Reading and writing multisets-Footnote-1323172 Node: Multiset Examples323284 Node: Sorting325392 Node: Sorting objects326391 Node: Sorting vectors329304 Node: Selecting the k smallest or largest elements332465 Node: Computing the rank335806 Node: Sorting Examples337007 Node: Sorting References and Further Reading338654 Node: BLAS Support339200 Ref: BLAS Support-Footnote-1342586 Node: GSL BLAS Interface342755 Node: Level 1 GSL BLAS Interface343248 Node: Level 2 GSL BLAS Interface349988 Node: Level 3 GSL BLAS Interface359278 Node: BLAS Examples370376 Node: BLAS References and Further Reading371797 Node: Linear Algebra373139 Node: LU Decomposition374489 Node: QR Decomposition379714 Node: QR Decomposition with Column Pivoting386023 Node: Complete Orthogonal Decomposition393522 Node: Singular Value Decomposition397149 Node: Cholesky Decomposition401565 Node: Pivoted Cholesky Decomposition408281 Node: Modified Cholesky Decomposition413578 Node: Tridiagonal Decomposition of Real Symmetric Matrices417083 Node: Tridiagonal Decomposition of Hermitian Matrices418940 Node: Hessenberg Decomposition of Real Matrices420894 Node: Hessenberg-Triangular Decomposition of Real Matrices423308 Node: Bidiagonalization424433 Node: Givens Rotations426847 Node: Householder Transformations428178 Node: Householder solver for linear systems430799 Node: Tridiagonal Systems431706 Node: Triangular Systems434588 Node: Balancing436002 Node: Linear Algebra Examples436804 Node: Linear Algebra References and Further Reading438798 Node: Eigensystems440762 Node: Real Symmetric Matrices441991 Node: Complex Hermitian Matrices444505 Node: Real Nonsymmetric Matrices447134 Node: Real Generalized Symmetric-Definite Eigensystems452869 Node: Complex Generalized Hermitian-Definite Eigensystems455748 Node: Real Generalized Nonsymmetric Eigensystems458462 Node: Sorting Eigenvalues and Eigenvectors465069 Node: Eigenvalue and Eigenvector Examples468347 Node: Eigenvalue and Eigenvector References473738 Node: Fast Fourier Transforms474765 Node: Mathematical Definitions475991 Node: Overview of complex data FFTs478396 Node: Radix-2 FFT routines for complex data481341 Node: Mixed-radix FFT routines for complex data485560 Node: Overview of real data FFTs494900 Node: Radix-2 FFT routines for real data497335 Node: Mixed-radix FFT routines for real data501759 Node: FFT References and Further Reading512444 Node: Numerical Integration515314 Node: Numerical Integration Introduction517112 Node: Integrands without weight functions519387 Node: Integrands with weight functions520217 Node: Integrands with singular weight functions520928 Node: QNG non-adaptive Gauss-Kronrod integration521846 Node: QAG adaptive integration523128 Node: QAGS adaptive integration with singularities525917 Node: QAGP adaptive integration with known singular points527717 Node: QAGI adaptive integration on infinite intervals529031 Node: QAWC adaptive integration for Cauchy principal values531311 Node: QAWS adaptive integration for singular functions532481 Node: QAWO adaptive integration for oscillatory functions535707 Node: QAWF adaptive integration for Fourier integrals539495 Node: CQUAD doubly-adaptive integration542119 Node: Fixed order Gauss-Legendre integration545377 Node: Numerical integration error codes547365 Node: Numerical integration examples548121 Node: Numerical integration References and Further Reading550178 Node: Random Number Generation551169 Node: General comments on random numbers552703 Node: The Random Number Generator Interface554655 Node: Random number generator initialization556013 Node: Sampling from a random number generator558384 Node: Auxiliary random number generator functions561628 Node: Random number environment variables563948 Node: Copying random number generator state566473 Node: Reading and writing random number generator state567447 Node: Random number generator algorithms568841 Node: Unix random number generators578783 Node: Other random number generators582497 Node: Random Number Generator Performance591148 Node: Random Number Generator Examples592269 Node: Random Number References and Further Reading593781 Node: Random Number Acknowledgements595076 Node: Quasi-Random Sequences595562 Node: Quasi-random number generator initialization596682 Node: Sampling from a quasi-random number generator597697 Node: Auxiliary quasi-random number generator functions598394 Node: Saving and restoring quasi-random number generator state599340 Node: Quasi-random number generator algorithms601121 Node: Quasi-random number generator examples602259 Node: Quasi-random number references603244 Node: Random Number Distributions603770 Node: Random Number Distribution Introduction607146 Node: The Gaussian Distribution608941 Node: The Gaussian Tail Distribution611601 Node: The Bivariate Gaussian Distribution613265 Node: The Multivariate Gaussian Distribution614589 Node: The Exponential Distribution617437 Node: The Laplace Distribution618579 Node: The Exponential Power Distribution619671 Node: The Cauchy Distribution620939 Node: The Rayleigh Distribution622188 Node: The Rayleigh Tail Distribution623362 Node: The Landau Distribution624235 Node: The Levy alpha-Stable Distributions625190 Node: The Levy skew alpha-Stable Distribution626248 Node: The Gamma Distribution627860 Node: The Flat (Uniform) Distribution629515 Node: The Lognormal Distribution630663 Node: The Chi-squared Distribution632011 Node: The F-distribution633416 Node: The t-distribution635053 Node: The Beta Distribution636447 Node: The Logistic Distribution637606 Node: The Pareto Distribution638735 Node: Spherical Vector Distributions639905 Node: The Weibull Distribution642741 Node: The Type-1 Gumbel Distribution643935 Node: The Type-2 Gumbel Distribution645171 Node: The Dirichlet Distribution646402 Node: General Discrete Distributions648070 Node: The Poisson Distribution651938 Node: The Bernoulli Distribution652945 Node: The Binomial Distribution653696 Node: The Multinomial Distribution654899 Node: The Negative Binomial Distribution656673 Node: The Pascal Distribution658038 Node: The Geometric Distribution659196 Node: The Hypergeometric Distribution660444 Node: The Logarithmic Distribution662097 Node: Shuffling and Sampling662889 Node: Random Number Distribution Examples665701 Node: Random Number Distribution References and Further Reading668875 Node: Statistics671019 Node: Mean and standard deviation and variance672513 Node: Absolute deviation676021 Node: Higher moments (skewness and kurtosis)677313 Node: Autocorrelation679446 Node: Covariance680259 Node: Correlation681225 Node: Weighted Samples682594 Node: Maximum and Minimum values688444 Node: Median and Percentiles691183 Node: Example statistical programs693598 Node: Statistics References and Further Reading696259 Node: Running Statistics697467 Node: Running Statistics Initializing the Accumulator698769 Node: Running Statistics Adding Data to the Accumulator699481 Node: Running Statistics Current Statistics700170 Node: Running Statistics Quantiles702301 Node: Running Statistics Example programs703901 Node: Running Statistics References and Further Reading709451 Node: Histograms709984 Node: The histogram struct711845 Node: Histogram allocation713649 Node: Copying Histograms716606 Node: Updating and accessing histogram elements717282 Node: Searching histogram ranges720551 Node: Histogram Statistics721551 Node: Histogram Operations723417 Node: Reading and writing histograms725492 Node: Resampling from histograms728534 Node: The histogram probability distribution struct729333 Node: Example programs for histograms732367 Node: Two dimensional histograms734430 Node: The 2D histogram struct735151 Node: 2D Histogram allocation736961 Node: Copying 2D Histograms739035 Node: Updating and accessing 2D histogram elements739740 Node: Searching 2D histogram ranges743397 Node: 2D Histogram Statistics744411 Node: 2D Histogram Operations747276 Node: Reading and writing 2D histograms749454 Node: Resampling from 2D histograms753083 Node: Example programs for 2D histograms756104 Node: N-tuples757931 Node: The ntuple struct759254 Node: Creating ntuples759733 Node: Opening an existing ntuple file760400 Node: Writing ntuples761029 Node: Reading ntuples761490 Node: Closing an ntuple file761821 Node: Histogramming ntuple values762161 Node: Example ntuple programs764171 Node: Ntuple References and Further Reading767560 Node: Monte Carlo Integration767881 Node: Monte Carlo Interface769192 Node: PLAIN Monte Carlo771819 Node: MISER774274 Ref: MISER-Footnote-1780954 Node: VEGAS781079 Node: Monte Carlo Examples790640 Node: Monte Carlo Integration References and Further Reading796708 Node: Simulated Annealing797490 Node: Simulated Annealing algorithm798706 Node: Simulated Annealing functions799858 Node: Examples with Simulated Annealing804388 Node: Trivial example804957 Node: Traveling Salesman Problem807590 Node: Simulated Annealing References and Further Reading810903 Node: Ordinary Differential Equations811314 Node: Defining the ODE System812554 Node: Stepping Functions815566 Node: Adaptive Step-size Control822536 Node: Evolution828613 Node: Driver832742 Node: ODE Example programs836976 Node: ODE References and Further Reading842132 Node: Interpolation843896 Node: 1D Introduction to Interpolation845470 Node: 1D Interpolation Functions845957 Node: 1D Interpolation Types847179 Node: 1D Index Look-up and Acceleration850438 Node: 1D Evaluation of Interpolating Functions852505 Node: 1D Higher-level Interface855016 Node: 1D Interpolation Example programs857071 Node: 1D Interpolation References and Further Reading862627 Node: 2D Introduction to Interpolation863382 Node: 2D Interpolation Functions863930 Node: 2D Interpolation Grids865461 Node: 2D Interpolation Types866680 Node: 2D Evaluation of Interpolating Functions867945 Node: 2D Higher-level Interface874052 Node: 2D Interpolation Example programs877796 Node: Numerical Differentiation879978 Node: Numerical Differentiation functions880573 Node: Numerical Differentiation Examples883430 Node: Numerical Differentiation References884903 Node: Chebyshev Approximations885454 Node: Chebyshev Definitions886535 Node: Creation and Calculation of Chebyshev Series887324 Node: Auxiliary Functions for Chebyshev Series888309 Node: Chebyshev Series Evaluation889049 Node: Derivatives and Integrals890429 Node: Chebyshev Approximation Examples891667 Node: Chebyshev Approximation References and Further Reading893219 Node: Series Acceleration893669 Node: Acceleration functions894446 Node: Acceleration functions without error estimation896773 Node: Example of accelerating a series899397 Node: Series Acceleration References902718 Node: Wavelet Transforms903606 Node: DWT Definitions904205 Node: DWT Initialization905157 Node: DWT Transform Functions907805 Node: DWT in one dimension908356 Node: DWT in two dimension910377 Node: DWT Examples914956 Node: DWT References916831 Node: Discrete Hankel Transforms918995 Node: Discrete Hankel Transform Definition919469 Node: Discrete Hankel Transform Functions922780 Node: Discrete Hankel Transform References924445 Node: One dimensional Root-Finding924849 Node: Root Finding Overview926155 Node: Root Finding Caveats928011 Node: Initializing the Solver929780 Node: Providing the function to solve932413 Node: Search Bounds and Guesses935967 Node: Root Finding Iteration936830 Node: Search Stopping Parameters938681 Node: Root Bracketing Algorithms941192 Node: Root Finding Algorithms using Derivatives944490 Ref: Root Finding Algorithms using Derivatives-Footnote-1948033 Node: Root Finding Examples948189 Node: Root Finding References and Further Reading955453 Node: One dimensional Minimization956092 Node: Minimization Overview957435 Node: Minimization Caveats959142 Node: Initializing the Minimizer960480 Node: Providing the function to minimize962721 Node: Minimization Iteration963199 Node: Minimization Stopping Parameters965337 Node: Minimization Algorithms966942 Node: Minimization Examples969536 Node: Minimization References and Further Reading972287 Node: Multidimensional Root-Finding972743 Node: Overview of Multidimensional Root Finding974251 Node: Initializing the Multidimensional Solver976438 Node: Providing the multidimensional system of equations to solve979668 Node: Iteration of the multidimensional solver984580 Node: Search Stopping Parameters for the multidimensional solver986861 Node: Algorithms using Derivatives988599 Node: Algorithms without Derivatives993424 Node: Example programs for Multidimensional Root finding996514 Node: References and Further Reading for Multidimensional Root Finding1005138 Node: Multidimensional Minimization1006377 Node: Multimin Overview1007787 Node: Multimin Caveats1009867 Node: Initializing the Multidimensional Minimizer1010616 Node: Providing a function to minimize1013850 Node: Multimin Iteration1017911 Node: Multimin Stopping Criteria1020255 Node: Multimin Algorithms with Derivatives1021826 Node: Multimin Algorithms without Derivatives1025357 Node: Multimin Examples1028359 Node: Multimin References and Further Reading1034929 Node: Least-Squares Fitting1035793 Node: Fitting Overview1036825 Node: Linear regression1039158 Node: Linear regression with a constant term1039601 Node: Linear regression without a constant term1042244 Node: Multi-parameter regression1044436 Node: Regularized regression1052576 Node: Robust linear regression1071950 Node: Large Dense Linear Systems1084161 Node: Large Dense Linear Systems Normal Equations1086384 Node: Large Dense Linear Systems TSQR1087977 Node: Large Dense Linear Systems Solution Steps1089622 Node: Large Dense Linear Systems Routines1090764 Node: Troubleshooting1099087 Node: Fitting Examples1099712 Node: Fitting linear regression example1100268 Node: Fitting multi-parameter linear regression example1102470 Node: Fitting regularized linear regression example 11107464 Node: Fitting regularized linear regression example 21115049 Node: Fitting robust linear regression example1121969 Node: Fitting large linear systems example1125926 Node: Fitting References and Further Reading1133145 Node: Nonlinear Least-Squares Fitting1135426 Node: Nonlinear Least-Squares Overview1137383 Node: Nonlinear Least-Squares TRS Overview1141784 Node: Nonlinear Least-Squares TRS Levenberg-Marquardt1143918 Node: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration1145525 Node: Nonlinear Least-Squares TRS Dogleg1147279 Node: Nonlinear Least-Squares TRS Double Dogleg1148749 Node: Nonlinear Least-Squares TRS 2D Subspace1149547 Node: Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient1150519 Node: Nonlinear Least-Squares Weighted Overview1151263 Node: Nonlinear Least-Squares Tunable Parameters1152481 Node: Nonlinear Least-Squares Initialization1164018 Node: Nonlinear Least-Squares Function Definition1168948 Node: Nonlinear Least-Squares Iteration1176030 Node: Nonlinear Least-Squares Testing for Convergence1180568 Node: Nonlinear Least-Squares High Level Driver1183464 Node: Nonlinear Least-Squares Covariance Matrix1185684 Node: Nonlinear Least-Squares Troubleshooting1187892 Node: Nonlinear Least-Squares Examples1189916 Node: Nonlinear Least-Squares Exponential Fit Example1190462 Node: Nonlinear Least-Squares Geodesic Acceleration Example1201856 Node: Nonlinear Least-Squares Comparison Example1209181 Node: Nonlinear Least-Squares Large Example1217943 Node: Nonlinear Least-Squares References and Further Reading1226889 Node: Basis Splines1228483 Node: Overview of B-splines1229368 Node: Initializing the B-splines solver1230684 Node: Constructing the knots vector1231549 Node: Evaluation of B-spline basis functions1232337 Node: Evaluation of B-spline basis function derivatives1233985 Node: Working with the Greville abscissae1235867 Node: Example programs for B-splines1236861 Node: B-Spline References and Further Reading1240865 Node: Sparse Matrices1241698 Node: Sparse Matrices Overview1243024 Node: Sparse Matrices Allocation1246235 Node: Sparse Matrices Accessing Elements1249246 Node: Sparse Matrices Initializing Elements1250209 Node: Sparse Matrices Reading and Writing1250844 Node: Sparse Matrices Copying1253066 Node: Sparse Matrices Exchanging Rows and Columns1253548 Node: Sparse Matrices Operations1254943 Node: Sparse Matrices Properties1255623 Node: Sparse Matrices Finding Maximum and Minimum Elements1256275 Node: Sparse Matrices Compressed Format1256818 Node: Sparse Matrices Conversion Between Sparse and Dense1257897 Node: Sparse Matrices Examples1258719 Node: Sparse Matrices References and Further Reading1262365 Node: Sparse BLAS Support1262813 Node: Sparse BLAS operations1263444 Node: Sparse BLAS References and Further Reading1264398 Node: Sparse Linear Algebra1264842 Node: Overview of Sparse Linear Algebra1265469 Node: Sparse Iterative Solvers1266221 Node: Sparse Iterative Solver Overview1266567 Node: Sparse Iterative Solvers Types1267417 Node: Iterating the Sparse Linear System1269521 Node: Sparse Linear Algebra Examples1271991 Node: Sparse Linear Algebra References and Further Reading1276456 Node: Physical Constants1276989 Node: Fundamental Constants1278576 Node: Astronomy and Astrophysics1279716 Node: Atomic and Nuclear Physics1280381 Node: Measurement of Time1282032 Node: Imperial Units1282462 Node: Speed and Nautical Units1282904 Node: Printers Units1283408 Node: Volume Area and Length1283731 Node: Mass and Weight1284417 Node: Thermal Energy and Power1285236 Node: Pressure1285659 Node: Viscosity1286272 Node: Light and Illumination1286548 Node: Radioactivity1287140 Node: Force and Energy1287475 Node: Prefixes1287879 Node: Physical Constant Examples1288622 Node: Physical Constant References and Further Reading1290411 Node: IEEE floating-point arithmetic1291141 Node: Representation of floating point numbers1291733 Node: Setting up your IEEE environment1296219 Node: IEEE References and Further Reading1303192 Node: Debugging Numerical Programs1304352 Node: Using gdb1304869 Node: Examining floating point registers1308212 Node: Handling floating point exceptions1309497 Node: GCC warning options for numerical programs1310909 Node: Debugging References1314857 Node: Contributors to GSL1315569 Node: Autoconf Macros1320080 Node: GSL CBLAS Library1324112 Node: Level 1 CBLAS Functions1324652 Node: Level 2 CBLAS Functions1329954 Node: Level 3 CBLAS Functions1346584 Node: GSL CBLAS Examples1356246 Node: GNU General Public License1357809 Node: GNU Free Documentation License1395383 Node: Function Index1420532 Node: Variable Index1705030 Node: Type Index1713866 Node: Concept Index1729090  End Tag Table gsl-doc-2.3/doc/initial-route.eps0000664000175000017500000051561412616157443015052 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-pascal.tex0000664000175000017500000004726312616157443014463 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-pascal.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-pascal.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 2428 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 899 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -450 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 3013 2877 L 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -561 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -506 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -393 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -280 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 4975 1137 L 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -190 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -123 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 -77 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -47 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.5,n=3$}}% \put(3955,5244){\cjust{\strut{}Pascal Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.3}}% \put(900,3506){\rjust{\strut{} 0.2}}% \put(900,2069){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/statnotes.tex0000664000175000017500000000665312616157443014320 0ustar eddedd\documentclass[fleqn,12pt]{article} \newcommand{\expectation}[1]{\langle #1 \rangle} \begin{document} \title{Statistical Function Notes} \author{Brian Gough} \date{November 2008} \maketitle \section{Weighted mean and variance} We have $N$ samples $x_i$ drawn from a Gaussian distribution $G(\mu,\sigma)$ (or any distribution with finite first and second moments). Each sample has a weight $w_i$ which represents the relative value we place on it. Given the estimate of the mean % \begin{eqnarray} \bar{x} &=& {1 \over W} \sum_i w_i x_i \\ W &=& \sum_i w_i \end{eqnarray} % \noindent we want an unbiased estimator of the variance of the underlying distribution $\sigma^2$. We start with the standard definition of the sample variance $V$ and compute the bias correction factor. % \begin{eqnarray} V &=& {1\over W} \sum_i w_i (x_i - \bar{x})^2 \\ &=& {1\over W} \sum_i w_i \left(x_i - {1\over W}\sum_j w_j x_j\right)^2 \\ &=& {1\over W} \sum_i w_i \left(x_i^2 - {2 \over W} x_i \sum_j w_j x_j + {1 \over W^2} (\sum_j w_j x_j)^2\right) \\ &=& {1\over W} \left( \sum_i w_i x_i^2 - {2 \over W} \sum_i w_i x_i \sum_j w_j x_j + {1 \over W} (\sum_j w_j x_j)^2\right)\\ &=& {1\over W} \left( \sum_i w_i x_i^2 - {1 \over W} \sum_i w_i x_i \sum_j w_j x_j\right)\\ &=& {1\over W} \left( \sum_i w_i x_i^2 - {1 \over W} \sum_{ij} w_i w_j x_i x_j\right) \end{eqnarray} % We find the expectation value $\expectation{V}$ using the Gaussian formulas $\expectation{x_i} = \mu$, $\expectation{x_i x_j} = \mu^2 + \delta_{ij} \sigma^2$. We assume that any random contribution dependent on the weights themselves is zero or can be neglected in comparison to $\sigma$. % \begin{eqnarray} \expectation{V} &=& {1\over W} \left( \sum_i w_i \expectation{x_i^2} - {1 \over W} \sum_{ij} w_i w_j \expectation{x_i x_j}\right)\\ &=& {1\over W} \left( \sum_i w_i (\mu^2 + \sigma^2) - {1 \over W} \sum_{ij} w_i w_j (\mu^2 + \delta_{ij} \sigma^2)\right)\\ &=& {1\over W} \left( W (\mu^2 + \sigma^2) - {1 \over W} ( W^2 \mu^2 +( \sum_i w_i^2) \sigma^2)\right)\\ &=& {1\over W} \left(W \sigma^2 - {1 \over W} ( \sum_i w_i^2)\sigma^2\right)\\ &=& \left({{W^2 - \sum_i w_i^2} \over W^2}\right) \sigma^2 \end{eqnarray} % Therefore an unbiased estimator $U$ of $\sigma^2$ is % \begin{eqnarray} U &=& {W^2 \over {(W^2 - \sum_i w_i^2)}} \expectation{V}\\ &=& {W^2 \over {(W^2 - \sum_i w_i^2)}} {1\over W} \sum_i w_i (x_i - \bar{x})^2 \\ &=& {W \over {(W^2 - \sum_i w_i^2)}} \sum_i w_i (x_i - \bar{x})^2 \end{eqnarray} % And this is the formula used in GSL. \subsection{Notes} Note the following properties: \begin{itemize} \item The formula is invariant under rescaling of the weights. \item For equal weights $w_i = w$ the factor reduces to $N/(N^2-N) = 1/(N-1)$, which is the familiar factor of the unbiased estimator of the variance for data without weights. \item When $\sum_i (w_i/W)^2 \ll 1$ the commonly-used weighted variance formula $V = (1/W)\sum_i w_i (x_i - \bar{x})^2$ is a good approximation. \end{itemize} If we assume that the ``experimental errors'' arising from the weights contribute, the underlying variance $\sigma^2$ is overestimated by this formula (e.g. consider the case $\sigma = 0$---all the variation will come from the Gaussian fluctuations represented by the $w_i$). The appropriate expectation in this case is $\expectation{x_i x_j} = \mu^2 + \delta_{ij} (\sigma^2 + 1/w_i)$ \end{document} gsl-doc-2.3/doc/rand-levyskew.tex0000664000175000017500000004773412616157443015074 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-levyskew.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-levyskew.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1171 631 M -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 617 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 31 616 R -31 0 V 1171 631 M 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 568 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 569 31 R 0 -31 V 1171 4944 M 0 -4313 V 5689 0 V 0 4313 V -5689 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1171 631 M 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 20 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 20 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 0 V 19 1 V 19 0 V 19 0 V 19 1 V 19 0 V 19 1 V 19 1 V 19 2 V 19 2 V 19 3 V 19 3 V 19 4 V 19 5 V 19 7 V 19 8 V 19 10 V 19 11 V 19 14 V 19 17 V 19 19 V 19 23 V 19 25 V 19 30 V 19 34 V 20 38 V 19 43 V 19 48 V 19 52 V 19 58 V 19 63 V 19 68 V 19 73 V 19 78 V 3131 1457 L 19 87 V 19 93 V 19 96 V 19 100 V 19 103 V 19 106 V 19 108 V 19 110 V 19 111 V 19 111 V 19 111 V 19 110 V 19 109 V 19 107 V 19 105 V 19 101 V 19 98 V 19 95 V 19 90 V 19 85 V 19 80 V 19 75 V 19 69 V 19 64 V 19 58 V 19 52 V 19 47 V 20 40 V 19 35 V 19 28 V 19 23 V 19 18 V 19 12 V 19 7 V 19 2 V 19 -2 V 19 -7 V 19 -12 V 19 -15 V 19 -19 V 19 -23 V 19 -26 V 19 -28 V 19 -32 V 19 -34 V 19 -36 V 19 -38 V 19 -40 V 19 -41 V 19 -43 V 19 -44 V 19 -45 V 19 -46 V 19 -46 V 19 -47 V 19 -47 V 19 -47 V 19 -47 V 19 -47 V 19 -47 V 19 -47 V 19 -47 V 19 -46 V 19 -46 V 19 -45 V 20 -44 V 19 -44 V 19 -43 V 19 -43 V 19 -41 V 19 -41 V 19 -41 V 19 -39 V 19 -38 V 19 -38 V 19 -37 V 19 -36 V 19 -35 V 19 -35 V 19 -33 V 19 -33 V 19 -32 V 19 -31 V 19 -30 V 19 -30 V 19 -29 V 19 -28 V 19 -27 V 19 -26 V 19 -26 V 19 -25 V 19 -25 V 19 -24 V 19 -23 V 19 -22 V 19 -22 V 19 -22 V 19 -21 V 19 -20 V 19 -20 V 19 -19 V 19 -19 V 20 -18 V 19 -18 V 5129 1818 L 19 -17 V 19 -16 V 19 -16 V 19 -16 V 19 -15 V 19 -15 V 19 -15 V 19 -14 V 19 -14 V 19 -14 V 19 -13 V 19 -14 V 19 -12 V 19 -13 V 19 -12 V 19 -13 V 19 -11 V 19 -12 V 19 -12 V 19 -11 V 19 -11 V 19 -11 V 19 -11 V 19 -10 V 19 -11 V 19 -10 V 19 -11 V 19 -10 V 19 -10 V 19 -9 V 19 -10 V 19 -10 V 19 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -10 V 19 -9 V 19 -9 V 19 -9 V 19 -9 V 19 -9 V 19 -9 V 19 -8 V 19 -9 V 19 -9 V 19 -8 V 19 -9 V 19 -8 V 19 -9 V 19 -8 V 19 -9 V 19 -8 V 19 -8 V 19 -8 V 19 -9 V 19 -8 V 19 -8 V 19 -8 V 19 -8 V 19 -8 V 19 -8 V 19 -7 V 19 -8 V 19 -8 V 19 -8 V 19 -7 V 19 -8 V 19 -7 V 19 -8 V 19 -7 V 19 -7 V 20 -8 V 19 -7 V 19 -7 V 19 -7 V 19 -7 V 19 -7 V 19 -7 V 19 -6 V 19 -7 V 19 -7 V 19 -6 V 19 -7 V 19 -6 V 19 -6 V 19 -6 V 19 -6 V 19 -6 V 19 -6 V 19 -6 V stroke 0.500 UL LTb 1171 4944 M 0 -4313 V 5689 0 V 0 4313 V -5689 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$c=1, \alpha=1.0, \beta=1.0$}}% \put(4015,5244){\cjust{\strut{}Levy Skew Distribution}}% \put(4015,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6291,400){\cjust{\strut{}4}}% \put(5722,400){\cjust{\strut{}3}}% \put(5153,400){\cjust{\strut{}2}}% \put(4584,400){\cjust{\strut{}1}}% \put(4015,400){\cjust{\strut{}0}}% \put(3447,400){\cjust{\strut{}-1}}% \put(2878,400){\cjust{\strut{}-2}}% \put(2309,400){\cjust{\strut{}-3}}% \put(1740,400){\cjust{\strut{}-4}}% \put(1171,400){\cjust{\strut{}-5}}% \put(1020,4944){\rjust{\strut{} 0.35}}% \put(1020,4328){\rjust{\strut{} 0.3}}% \put(1020,3712){\rjust{\strut{} 0.25}}% \put(1020,3096){\rjust{\strut{} 0.2}}% \put(1020,2479){\rjust{\strut{} 0.15}}% \put(1020,1863){\rjust{\strut{} 0.1}}% \put(1020,1247){\rjust{\strut{} 0.05}}% \put(1020,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/fit-wlinear.eps0000664000175000017500000027336012616157443014505 0ustar eddedd%!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 gsl-doc-2.3/doc/const.texi0000664000175000017500000003164612620026734013564 0ustar eddedd@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_\infty} by @math{Ry = h c R_\infty}. @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.txt @end example @node Physical Constant References and Further Reading @section References and Further Reading The authoritative sources for physical constants are the 2006 CODATA recommended values, published in the article below. Further information on the values of physical constants is also available from the NIST website. @itemize @w{} @item P.J. Mohr, B.N. Taylor, D.B. Newell, ``CODATA Recommended Values of the Fundamental Physical Constants: 2006'', Reviews of Modern Physics, 80(2), pp. 633--730 (2008). @item @uref{http://www.physics.nist.gov/cuu/Constants/index.html} @item @uref{http://physics.nist.gov/Pubs/SP811/appenB9.html} @end itemize gsl-doc-2.3/doc/dht.texi0000664000175000017500000001517212616157443013220 0ustar eddedd@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 zeros 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. Starting with its definition, the Hankel transform (or Bessel transform) of order @math{\nu} of a function @math{f} with @math{\nu > -1/2} is defined as (see Johnson, 1987 and Lemoine, 1994) @tex \beforedisplay $$ F_\nu(u) = \int_0^\infty f(t) J_\nu(u t) t dt $$ \afterdisplay @end tex @ifinfo @example F_\nu(u) = \int_0^\infty f(t) J_\nu(u t) t dt @end example @end ifinfo @noindent If the integral exists, @math{F_\nu} is called the Hankel transformation of @math{f}. The reverse transform is given by @tex \beforedisplay $$ f(t) = \int_0^\infty F_\nu(u) J_\nu(u t) u du , $$ \afterdisplay @end tex @ifinfo @example f(t) = \int_0^\infty F_\nu(u) J_\nu(u t) u du , @end example @end ifinfo @noindent where @math{\int_0^\infty f(t) t^{1/2} dt} must exist and be absolutely convergent, and where @math{f(t)} satisfies Dirichlet's conditions (of limited total fluctuations) in the interval @math{[0,\infty]}. Now the discrete Hankel transform works on a discrete function @math{f}, which is sampled on points @math{n=1...M} located at positions @math{t_n=(j_{\nu,n}/j_{\nu,M}) X} in real space and at @math{u_n=j_{\nu,n}/X} in reciprocal space. Here, @math{j_{\nu,m}} are the m-th zeros of the Bessel function @math{J_\nu(x)} arranged in ascending order. Moreover, the discrete functions are assumed to be band limited, so @math{f(t_n)=0} and @math{F(u_n)=0} for @math{n>M}. Accordingly, the function @math{f} is defined on the interval @math{[0,X]}. Following the work of Johnson, 1987 and Lemoine, 1994, the discrete Hankel transform is given by @tex \beforedisplay $$ F_\nu(u_m) = {{2 X^2}\over{j_{\nu,M}^2}} \sum_{k=1}^{M-1} f\left({{j_{\nu,k} X}\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 F_\nu(u_m) = (2 X^2 / j_(\nu,M)^2) \sum_@{k=1@}^@{M-1@} f(j_(\nu,k) X/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 calculated by GSL. In GSL, forward and backward transforms are defined equally and calculate @math{F_\nu(u_m)}. Following Johnson, the backward transform reads @tex \beforedisplay $$ f(t_k) = {{2}\over{X^2}} \sum_{m=1}^{M-1} F\left({{j_{\nu,m}}\over{X}}\right) {{J_\nu(j_{\nu,m} j_{\nu,k} / j_{\nu,M})}\over{J_{\nu+1}(j_{\nu,m})^2}}. $$ \afterdisplay @end tex @ifinfo @example f(t_k) = (2 / X^2) \sum_@{m=1@}^@{M-1@} F(j_(\nu,m)/X) (J_\nu(j_(\nu,m) j_(\nu,k) / j_(\nu,M)) / J_(\nu+1)(j_(\nu,m))^2). @end example @end ifinfo @noindent Obviously, using the forward transform instead of the backward transform gives an additional factor @math{X^4/j_{\nu,M}^2=t_m^2/u_m^2}. 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 to define the length @math{X} of the fundamental interval, for convenience, while discrete Hankel transforms are often defined on the unit interval instead of @math{[0,X]}. 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}) @tindex gsl_dht 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{xmax}. @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{xmax}. @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. Applying this function to its output gives the original data multiplied by @c{$(X^2/j_{\nu,M})^2$} @math{(1/j_(\nu,M))^2}, up to numerical errors. @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 @w{} @item H. Fisk Johnson, Comp.@: Phys.@: Comm.@: 43, 181 (1987). @end itemize @itemize @w{} @item D. Lemoine, J. Chem.@: Phys.@: 101, 3936 (1994). @end itemize gsl-doc-2.3/doc/blas.texi0000664000175000017500000011101112620026734013340 0ustar eddedd@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 described in this chapter. The functions are declared in the file @file{gsl_blas.h} and 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. Similarly, GSL vectors are restricted to positive strides, whereas the low-level @sc{cblas} interface supports negative strides as specified in the @sc{blas} standard.@footnote{In the low-level @sc{cblas} interface, a negative stride accesses the vector elements in reverse order, i.e. the @math{i}-th element is given by @math{(N-i)*|incx|} for @math{incx < 0}.} The interface for the @code{gsl_cblas} layer is specified in the file @file{gsl_cblas.h}. This interface corresponds to the @sc{blas} Technical Forum's 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 @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''. Note that the vector and matrix arguments to BLAS functions must not be aliased, as the results are undefined when the underlying arrays overlap (@pxref{Aliasing of arrays}). @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 @file{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{dotu} @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{dotc} @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{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 @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.txt @end example @node BLAS References and Further Reading @section References and Further Reading Information on the @sc{blas} standards, including both the legacy and updated interface standards, is available online from the @sc{blas} Homepage and @sc{blas} Technical Forum web-site. @itemize @w{} @item @cite{BLAS Homepage} @* @uref{http://www.netlib.org/blas/} @item @cite{BLAS Technical Forum} @* @uref{http://www.netlib.org/blas/blast-forum/} @end itemize @noindent The following papers contain the specifications for Level 1, Level 2 and Level 3 @sc{blas}. @itemize @w{} @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. gsl-doc-2.3/doc/siman-test.eps0000664000175000017500000044324612616157443014352 0ustar eddedd%!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 gsl-doc-2.3/doc/rand-nbinomial.tex0000664000175000017500000004731712616157443015170 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-nbinomial.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-nbinomial.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 1438 R -31 0 V 31 1437 R -31 0 V 31 1438 R -31 0 V 1051 631 M 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 265 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 264 63 R 0 -31 V 264 31 R 0 -63 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 1902 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 953 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 278 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -209 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 2994 2924 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -430 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -465 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -408 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 0 -318 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 4956 1303 L 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 0 -231 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 0 -159 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 0 -106 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 0 -68 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4781){\rjust{\strut{}$p=0.5,n=3.5$}}% \put(3955,5244){\cjust{\strut{}Negative Binomial Distribution}}% \put(3955,100){\cjust{\strut{}$k$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(k)$}% \special{ps: currentpoint grestore moveto}% }% \put(6596,400){\cjust{\strut{}10}}% \put(6068,400){\cjust{\strut{}9}}% \put(5540,400){\cjust{\strut{}8}}% \put(5012,400){\cjust{\strut{}7}}% \put(4484,400){\cjust{\strut{}6}}% \put(3956,400){\cjust{\strut{}5}}% \put(3427,400){\cjust{\strut{}4}}% \put(2899,400){\cjust{\strut{}3}}% \put(2371,400){\cjust{\strut{}2}}% \put(1843,400){\cjust{\strut{}1}}% \put(1315,400){\cjust{\strut{}0}}% \put(900,4944){\rjust{\strut{} 0.3}}% \put(900,3506){\rjust{\strut{} 0.2}}% \put(900,2069){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/eigen.texi0000664000175000017500000010271712616157443013532 0ustar eddedd@cindex eigenvalues and eigenvectors This chapter describes functions for computing eigenvalues and eigenvectors of matrices. There are routines for real symmetric, real nonsymmetric, complex hermitian, real generalized symmetric-definite, complex generalized hermitian-definite, and real generalized nonsymmetric eigensystems. Eigenvalues can be computed with or without eigenvectors. The hermitian and real symmetric matrix algorithms are symmetric bidiagonalization followed by QR reduction. The nonsymmetric algorithm is the Francis QR double-shift. The generalized nonsymmetric algorithm is the QZ method due to Moler and Stewart. 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:: * Real Generalized Symmetric-Definite Eigensystems:: * Complex Generalized Hermitian-Definite Eigensystems:: * Real Generalized Nonsymmetric Eigensystems:: * 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 For real symmetric matrices, the library uses the symmetric bidiagonalization and QR reduction method. This is described in Golub & van Loan, section 8.3. The computed eigenvalues are accurate to an absolute accuracy of @math{\epsilon ||A||_2}, where @math{\epsilon} is the machine precision. @deftypefun {gsl_eigen_symm_workspace *} gsl_eigen_symm_alloc (const size_t @var{n}) @tindex gsl_eigen_symm_workspace 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}) @tindex gsl_eigen_symmv_workspace 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 For hermitian matrices, the library uses the complex form of the symmetric bidiagonalization and QR reduction method. @cindex hermitian matrix, complex, eigensystem @cindex complex hermitian matrix, eigensystem @deftypefun {gsl_eigen_herm_workspace *} gsl_eigen_herm_alloc (const size_t @var{n}) @tindex gsl_eigen_herm_workspace 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}) @tindex gsl_eigen_hermv_workspace 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}) @tindex gsl_eigen_nonsymm_workspace 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 may 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 that 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}) @tindex gsl_eigen_nonsymmv_workspace 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 void gsl_eigen_nonsymmv_params (const int @var{balance}, gsl_eigen_nonsymm_workspace * @var{w}) This function sets parameters which determine how the eigenvalue problem is solved in subsequent calls to @code{gsl_eigen_nonsymmv}. If @var{balance} is set to 1, a balancing transformation is applied to the matrix. See @code{gsl_eigen_nonsymm_params} for more information. Balancing is turned off by default since it does not preserve the orthogonality of the Schur vectors. @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 unit magnitude. 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 that it also saves the Schur vectors into @var{Z}. @end deftypefun @node Real Generalized Symmetric-Definite Eigensystems @section Real Generalized Symmetric-Definite Eigensystems @cindex generalized symmetric eigensystems The real generalized symmetric-definite eigenvalue problem is to find eigenvalues @math{\lambda} and eigenvectors @math{x} such that @tex \beforedisplay $$ A x = \lambda B x $$ \afterdisplay @end tex @ifinfo @example A x = \lambda B x @end example @end ifinfo where @math{A} and @math{B} are symmetric matrices, and @math{B} is positive-definite. This problem reduces to the standard symmetric eigenvalue problem by applying the Cholesky decomposition to @math{B}: @tex \beforedisplay $$ \eqalign{ A x & = \lambda B x \cr A x & = \lambda L L^t x \cr \left( L^{-1} A L^{-t} \right) L^t x & = \lambda L^t x } $$ \afterdisplay @end tex @ifinfo @example A x = \lambda B x A x = \lambda L L^t x ( L^@{-1@} A L^@{-t@} ) L^t x = \lambda L^t x @end example @end ifinfo Therefore, the problem becomes @math{C y = \lambda y} where @c{$C = L^{-1} A L^{-t}$} @math{C = L^@{-1@} A L^@{-t@}} is symmetric, and @math{y = L^t x}. The standard symmetric eigensolver can be applied to the matrix @math{C}. The resulting eigenvectors are backtransformed to find the vectors of the original problem. The eigenvalues and eigenvectors of the generalized symmetric-definite eigenproblem are always real. @deftypefun {gsl_eigen_gensymm_workspace *} gsl_eigen_gensymm_alloc (const size_t @var{n}) @tindex gsl_eigen_gensymm_workspace This function allocates a workspace for computing eigenvalues of @var{n}-by-@var{n} real generalized symmetric-definite eigensystems. The size of the workspace is @math{O(2n)}. @end deftypefun @deftypefun void gsl_eigen_gensymm_free (gsl_eigen_gensymm_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_eigen_gensymm (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector * @var{eval}, gsl_eigen_gensymm_workspace * @var{w}) This function computes the eigenvalues of the real generalized symmetric-definite matrix pair (@var{A}, @var{B}), and stores them in @var{eval}, using the method outlined above. On output, @var{B} contains its Cholesky decomposition and @var{A} is destroyed. @end deftypefun @deftypefun {gsl_eigen_gensymmv_workspace *} gsl_eigen_gensymmv_alloc (const size_t @var{n}) @tindex gsl_eigen_gensymmv_workspace This function allocates a workspace for computing eigenvalues and eigenvectors of @var{n}-by-@var{n} real generalized symmetric-definite eigensystems. The size of the workspace is @math{O(4n)}. @end deftypefun @deftypefun void gsl_eigen_gensymmv_free (gsl_eigen_gensymmv_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_eigen_gensymmv (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_gensymmv_workspace * @var{w}) This function computes the eigenvalues and eigenvectors of the real generalized symmetric-definite matrix pair (@var{A}, @var{B}), and stores them in @var{eval} and @var{evec} respectively. The computed eigenvectors are normalized to have unit magnitude. On output, @var{B} contains its Cholesky decomposition and @var{A} is destroyed. @end deftypefun @node Complex Generalized Hermitian-Definite Eigensystems @section Complex Generalized Hermitian-Definite Eigensystems @cindex generalized hermitian definite eigensystems The complex generalized hermitian-definite eigenvalue problem is to find eigenvalues @math{\lambda} and eigenvectors @math{x} such that @tex \beforedisplay $$ A x = \lambda B x $$ \afterdisplay @end tex @ifinfo @example A x = \lambda B x @end example @end ifinfo where @math{A} and @math{B} are hermitian matrices, and @math{B} is positive-definite. Similarly to the real case, this can be reduced to @math{C y = \lambda y} where @c{$C = L^{-1} A L^{-\dagger}$} @math{C = L^@{-1@} A L^@{-H@}} is hermitian, and @c{$y = L^{\dagger} x$} @math{y = L^H x}. The standard hermitian eigensolver can be applied to the matrix @math{C}. The resulting eigenvectors are backtransformed to find the vectors of the original problem. The eigenvalues of the generalized hermitian-definite eigenproblem are always real. @deftypefun {gsl_eigen_genherm_workspace *} gsl_eigen_genherm_alloc (const size_t @var{n}) @tindex gsl_eigen_genherm_workspace This function allocates a workspace for computing eigenvalues of @var{n}-by-@var{n} complex generalized hermitian-definite eigensystems. The size of the workspace is @math{O(3n)}. @end deftypefun @deftypefun void gsl_eigen_genherm_free (gsl_eigen_genherm_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_eigen_genherm (gsl_matrix_complex * @var{A}, gsl_matrix_complex * @var{B}, gsl_vector * @var{eval}, gsl_eigen_genherm_workspace * @var{w}) This function computes the eigenvalues of the complex generalized hermitian-definite matrix pair (@var{A}, @var{B}), and stores them in @var{eval}, using the method outlined above. On output, @var{B} contains its Cholesky decomposition and @var{A} is destroyed. @end deftypefun @deftypefun {gsl_eigen_genhermv_workspace *} gsl_eigen_genhermv_alloc (const size_t @var{n}) @tindex gsl_eigen_genhermv_workspace This function allocates a workspace for computing eigenvalues and eigenvectors of @var{n}-by-@var{n} complex generalized hermitian-definite eigensystems. The size of the workspace is @math{O(5n)}. @end deftypefun @deftypefun void gsl_eigen_genhermv_free (gsl_eigen_genhermv_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_eigen_genhermv (gsl_matrix_complex * @var{A}, gsl_matrix_complex * @var{B}, gsl_vector * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_genhermv_workspace * @var{w}) This function computes the eigenvalues and eigenvectors of the complex generalized hermitian-definite matrix pair (@var{A}, @var{B}), and stores them in @var{eval} and @var{evec} respectively. The computed eigenvectors are normalized to have unit magnitude. On output, @var{B} contains its Cholesky decomposition and @var{A} is destroyed. @end deftypefun @node Real Generalized Nonsymmetric Eigensystems @section Real Generalized Nonsymmetric Eigensystems @cindex generalized eigensystems Given two square matrices (@math{A}, @math{B}), the generalized nonsymmetric eigenvalue problem is to find eigenvalues @math{\lambda} and eigenvectors @math{x} such that @tex \beforedisplay $$ A x = \lambda B x $$ \afterdisplay @end tex @ifinfo @example A x = \lambda B x @end example @end ifinfo We may also define the problem as finding eigenvalues @math{\mu} and eigenvectors @math{y} such that @tex \beforedisplay $$ \mu A y = B y $$ \afterdisplay @end tex @ifinfo @example \mu A y = B y @end example @end ifinfo Note that these two problems are equivalent (with @math{\lambda = 1/\mu}) if neither @math{\lambda} nor @math{\mu} is zero. If say, @math{\lambda} is zero, then it is still a well defined eigenproblem, but its alternate problem involving @math{\mu} is not. Therefore, to allow for zero (and infinite) eigenvalues, the problem which is actually solved is @tex \beforedisplay $$ \beta A x = \alpha B x $$ \afterdisplay @end tex @ifinfo @example \beta A x = \alpha B x @end example @end ifinfo The eigensolver routines below will return two values @math{\alpha} and @math{\beta} and leave it to the user to perform the divisions @math{\lambda = \alpha / \beta} and @math{\mu = \beta / \alpha}. If the determinant of the matrix pencil @math{A - \lambda B} is zero for all @math{\lambda}, the problem is said to be singular; otherwise it is called regular. Singularity normally leads to some @math{\alpha = \beta = 0} which means the eigenproblem is ill-conditioned and generally does not have well defined eigenvalue solutions. The routines below are intended for regular matrix pencils and could yield unpredictable results when applied to singular pencils. The solution of the real generalized nonsymmetric eigensystem problem for a matrix pair @math{(A, B)} involves computing the generalized Schur decomposition @tex \beforedisplay $$ A = Q S Z^T $$ $$ B = Q T Z^T $$ \afterdisplay @end tex @ifinfo @example A = Q S Z^T B = Q T Z^T @end example @end ifinfo where @math{Q} and @math{Z} are orthogonal matrices of left and right Schur vectors respectively, and @math{(S, T)} is the generalized Schur form whose diagonal elements give the @math{\alpha} and @math{\beta} values. The algorithm used is the QZ method due to Moler and Stewart (see references). @deftypefun {gsl_eigen_gen_workspace *} gsl_eigen_gen_alloc (const size_t @var{n}) @tindex gsl_eigen_gen_workspace This function allocates a workspace for computing eigenvalues of @var{n}-by-@var{n} real generalized nonsymmetric eigensystems. The size of the workspace is @math{O(n)}. @end deftypefun @deftypefun void gsl_eigen_gen_free (gsl_eigen_gen_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun void gsl_eigen_gen_params (const int @var{compute_s}, const int @var{compute_t}, const int @var{balance}, gsl_eigen_gen_workspace * @var{w}) This function sets some parameters which determine how the eigenvalue problem is solved in subsequent calls to @code{gsl_eigen_gen}. If @var{compute_s} is set to 1, the full Schur form @math{S} will be computed by @code{gsl_eigen_gen}. If it is set to 0, @math{S} will not be computed (this is the default setting). @math{S} is a quasi upper triangular matrix with 1-by-1 and 2-by-2 blocks on its diagonal. 1-by-1 blocks correspond to real eigenvalues, and 2-by-2 blocks correspond to complex eigenvalues. If @var{compute_t} is set to 1, the full Schur form @math{T} will be computed by @code{gsl_eigen_gen}. If it is set to 0, @math{T} will not be computed (this is the default setting). @math{T} is an upper triangular matrix with non-negative elements on its diagonal. Any 2-by-2 blocks in @math{S} will correspond to a 2-by-2 diagonal block in @math{T}. The @var{balance} parameter is currently ignored, since generalized balancing is not yet implemented. @end deftypefun @deftypefun int gsl_eigen_gen (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector_complex * @var{alpha}, gsl_vector * @var{beta}, gsl_eigen_gen_workspace * @var{w}) This function computes the eigenvalues of the real generalized nonsymmetric matrix pair (@var{A}, @var{B}), and stores them as pairs in (@var{alpha}, @var{beta}), where @var{alpha} is complex and @var{beta} is real. If @math{\beta_i} is non-zero, then @math{\lambda = \alpha_i / \beta_i} is an eigenvalue. Likewise, if @math{\alpha_i} is non-zero, then @math{\mu = \beta_i / \alpha_i} is an eigenvalue of the alternate problem @math{\mu A y = B y}. The elements of @var{beta} are normalized to be non-negative. If @math{S} is desired, it is stored in @var{A} on output. If @math{T} is desired, it is stored in @var{B} on output. The ordering of eigenvalues in (@var{alpha}, @var{beta}) follows the ordering of the diagonal blocks in the Schur forms @math{S} and @math{T}. In rare cases, this function may fail to find all eigenvalues. If this occurs, an error code is returned. @end deftypefun @deftypefun int gsl_eigen_gen_QZ (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector_complex * @var{alpha}, gsl_vector * @var{beta}, gsl_matrix * @var{Q}, gsl_matrix * @var{Z}, gsl_eigen_gen_workspace * @var{w}) This function is identical to @code{gsl_eigen_gen} except that it also computes the left and right Schur vectors and stores them into @var{Q} and @var{Z} respectively. @end deftypefun @deftypefun {gsl_eigen_genv_workspace *} gsl_eigen_genv_alloc (const size_t @var{n}) @tindex gsl_eigen_genv_workspace This function allocates a workspace for computing eigenvalues and eigenvectors of @var{n}-by-@var{n} real generalized nonsymmetric eigensystems. The size of the workspace is @math{O(7n)}. @end deftypefun @deftypefun void gsl_eigen_genv_free (gsl_eigen_genv_workspace * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun int gsl_eigen_genv (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector_complex * @var{alpha}, gsl_vector * @var{beta}, gsl_matrix_complex * @var{evec}, gsl_eigen_genv_workspace * @var{w}) This function computes eigenvalues and right eigenvectors of the @var{n}-by-@var{n} real generalized nonsymmetric matrix pair (@var{A}, @var{B}). The eigenvalues are stored in (@var{alpha}, @var{beta}) and the eigenvectors are stored in @var{evec}. It first calls @code{gsl_eigen_gen} to compute the eigenvalues, Schur forms, and Schur vectors. Then it finds eigenvectors of the Schur forms and backtransforms them using the Schur vectors. The Schur vectors are destroyed in the process, but can be saved by using @code{gsl_eigen_genv_QZ}. The computed eigenvectors are normalized to have unit magnitude. On output, (@var{A}, @var{B}) contains the generalized Schur form (@math{S}, @math{T}). If @code{gsl_eigen_gen} fails, no eigenvectors are computed, and an error code is returned. @end deftypefun @deftypefun int gsl_eigen_genv_QZ (gsl_matrix * @var{A}, gsl_matrix * @var{B}, gsl_vector_complex * @var{alpha}, gsl_vector * @var{beta}, gsl_matrix_complex * @var{evec}, gsl_matrix * @var{Q}, gsl_matrix * @var{Z}, gsl_eigen_genv_workspace * @var{w}) This function is identical to @code{gsl_eigen_genv} except that it also computes the left and right Schur vectors and stores them into @var{Q} and @var{Z} respectively. @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 @code{GSL_EIGEN_SORT_ABS_ASC} and @code{GSL_EIGEN_SORT_ABS_DESC} are supported due to the eigenvalues being complex. @end deftypefun @deftypefun int gsl_eigen_gensymmv_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} as shown above. @end deftypefun @deftypefun int gsl_eigen_genhermv_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_genv_sort (gsl_vector_complex * @var{alpha}, gsl_vector * @var{beta}, gsl_matrix_complex * @var{evec}, gsl_eigen_sort_t @var{sort_type}) This function simultaneously sorts the eigenvalues stored in the vectors (@var{alpha}, @var{beta}) 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 @code{GSL_EIGEN_SORT_ABS_ASC} and @code{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 @c{$V(x;i,j) = x_i^{n - j}$} @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} differ by the multiplicative constant @math{0.9999984 + 0.0017674i} which is an arbitrary phase factor of 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 @w{} @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 Further information on the generalized eigensystems QZ algorithm can be found in this paper, @itemize @w{} @item C. Moler, G. Stewart, ``An Algorithm for Generalized Matrix Eigenvalue Problems'', SIAM J. Numer. Anal., Vol 10, No 2, 1973. @end itemize @noindent @cindex LAPACK Eigensystem routines for very large matrices can be found in the Fortran library @sc{lapack}. The @sc{lapack} library is described in, @itemize @w{} @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. gsl-doc-2.3/doc/specfunc-dawson.texi0000664000175000017500000000100712616157443015530 0ustar eddedd@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 gsl-doc-2.3/doc/specfunc-clausen.texi0000664000175000017500000000126312616157443015673 0ustar eddedd@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 gsl-doc-2.3/doc/fit-wlinear2.eps0000664000175000017500000025063112616157443014563 0ustar eddedd%!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 gsl-doc-2.3/doc/statistics.texi0000644000175000017500000007062512737536472014644 0ustar eddedd@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}. All the functions operate on C arrays with a @var{stride} parameter specifying the spacing between elements. @menu * Mean and standard deviation and variance:: * Absolute deviation:: * Higher moments (skewness and kurtosis):: * Autocorrelation:: * Covariance:: * Correlation:: * 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_tss (const double @var{data}[], size_t @var{stride}, size_t @var{n}) @deftypefunx double gsl_stats_tss_m (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean}) These functions return the total sum of squares (TSS) of @var{data} about the mean. For @code{gsl_stats_tss_m} the user-supplied value of @var{mean} is used, and for @code{gsl_stats_tss} it is computed using @code{gsl_stats_mean}. @tex \beforedisplay $$ {\rm TSS} = \sum (x_i - mean)^2 $$ \afterdisplay @end tex @ifinfo @example TSS = \sum (x_i - mean)^2 @end example @end ifinfo @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) @cindex skewness @cindex 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 = 2}^{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 = 2@}^@{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 Correlation @section Correlation @cindex correlation, of two datasets @deftypefun double gsl_stats_correlation (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 efficiently computes the Pearson correlation coefficient between the datasets @var{data1} and @var{data2} which must both be of the same length @var{n}. @tex \beforedisplay $$ r = {cov(x, y) \over \Hat\sigma_x \Hat\sigma_y} = {{1 \over n-1} \sum (x_i - \Hat x) (y_i - \Hat y) \over \sqrt{{1 \over n-1} \sum (x_i - {\Hat x})^2} \sqrt{{1 \over n-1} \sum (y_i - {\Hat y})^2} } $$ \afterdisplay @end tex @ifinfo @example r = cov(x, y) / (\Hat\sigma_x \Hat\sigma_y) = @{1/(n-1) \sum (x_i - \Hat x) (y_i - \Hat y) \over \sqrt@{1/(n-1) \sum (x_i - \Hat x)^2@} \sqrt@{1/(n-1) \sum (y_i - \Hat y)^2@} @} @end example @end ifinfo @end deftypefun @deftypefun double gsl_stats_spearman (const double @var{data1}[], const size_t @var{stride1}, const double @var{data2}[], const size_t @var{stride2}, const size_t @var{n}, double @var{work}[]) This function computes the Spearman rank correlation coefficient between the datasets @var{data1} and @var{data2} which must both be of the same length @var{n}. Additional workspace of size 2*@var{n} is required in @var{work}. The Spearman rank correlation between vectors @math{x} and @math{y} is equivalent to the Pearson correlation between the ranked vectors @math{x_R} and @math{y_R}, where ranks are defined to be the average of the positions of an element in the ascending order of the values. @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 calculated 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 the 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_wtss (const double @var{w}[], const size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}) @deftypefunx double gsl_stats_wtss_m (const double @var{w}[], const size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean}) These functions return the weighted total sum of squares (TSS) of @var{data} about the weighted mean. For @code{gsl_stats_wtss_m} the user-supplied value of @var{wmean} is used, and for @code{gsl_stats_wtss} it is computed using @code{gsl_stats_wmean}. @tex \beforedisplay $$ {\rm TSS} = \sum w_i (x_i - wmean)^2 $$ \afterdisplay @end tex @ifinfo @example TSS = \sum w_i (x_i - wmean)^2 @end example @end ifinfo @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 - {\Hat x})/{\Hat \sigma})^3} \over {\sum w_i}} $$ \afterdisplay @end tex @ifinfo @example skew = (\sum w_i ((x_i - \Hat x)/\Hat \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 - {\Hat x})/{\Hat \sigma})^4} \over {\sum w_i}} - 3 $$ \afterdisplay @end tex @ifinfo @example kurtosis = ((\sum w_i ((x_i - \Hat x)/\Hat \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.txt @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.txt @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 @w{} @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 @w{} @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 @w{} @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/}. gsl-doc-2.3/doc/specfunc-psi.texi0000664000175000017500000000552412616157443015040 0ustar eddedd@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 gsl-doc-2.3/doc/vectors.texi0000664000175000017500000021624012620026734014116 0ustar eddedd@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 @tindex gsl_block 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}. @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.txt @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. @tindex gsl_vector 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. @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.@footnote{Range checking is available in the GNU C Compiler bounds-checking extension, but it is not part of the default installation of GCC. Memory accesses can also be checked with Valgrind or the @code{gcc -fmudflap} memory protection option.} 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 preprocessor macro @code{HAVE_INLINE} defined to use these functions. @vindex @code{GSL_RANGE_CHECK_OFF} 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. @vindex @code{GSL_C99_INLINE} If you use a C99 compiler which requires inline functions in header files to be declared @code{inline} instead of @code{extern inline}, define the macro @code{GSL_C99_INLINE} (@pxref{Inline functions}). With GCC this is selected automatically when compiling in C99 mode (@code{-std=c99}). @vindex gsl_check_range If inline functions are not used, calls to the functions @code{gsl_vector_get} and @code{gsl_vector_set} will link to the compiled versions of these functions in the library itself. The range checking in these functions is controlled by the global integer variable @code{gsl_check_range}. It is enabled by default---to disable it, set @code{gsl_check_range} to zero. Due to function-call overhead, there is less benefit in disabling range checking here than for inline functions. @deftypefun double gsl_vector_get (const gsl_vector * @var{v}, const 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. @inlinefn{} @end deftypefun @deftypefun void gsl_vector_set (gsl_vector * @var{v}, const 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. @inlinefn{} @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. @inlinefns{} @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. @tindex gsl_vector_view @tindex gsl_vector_const_view 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 @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}. The result @math{a_i \leftarrow a_i + b_i} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a_i \leftarrow a_i - b_i} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a_i \leftarrow a_i * b_i} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a_i \leftarrow a_i / b_i} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a_i \leftarrow x a_i} is stored in @var{a}. @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}. The result @math{a_i \leftarrow a_i + x} is stored in @var{a}. @end deftypefun @node Finding maximum and minimum elements of vectors @subsection Finding maximum and minimum elements of vectors The following operations are only defined for real 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 The following functions are defined for real and complex vectors. For complex vectors both the real and imaginary parts must satisfy the conditions. @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}) @deftypefunx int gsl_vector_isnonneg (const gsl_vector * @var{v}) These functions return 1 if all the elements of the vector @var{v} are zero, strictly positive, strictly negative, or non-negative respectively, and 0 otherwise. @end deftypefun @deftypefun int gsl_vector_equal (const gsl_vector * @var{u}, const gsl_vector * @var{v}) This function returns 1 if the vectors @var{u} and @var{v} are equal (by comparison of element values) and 0 otherwise. @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 @cindex ordering, matrix elements 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. @tindex gsl_matrix 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 matrix 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. @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}, const size_t @var{i}, const 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. @inlinefn{} @end deftypefun @deftypefun void gsl_matrix_set (gsl_matrix * @var{m}, const size_t @var{i}, const 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. @inlinefn{} @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. @inlinefns{} @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 @tindex gsl_matrix_view @tindex gsl_matrix_const_view 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 @deftypefun gsl_vector_view gsl_matrix_subrow (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{offset}, size_t @var{n}) @deftypefunx {gsl_vector_const_view} gsl_matrix_const_subrow (const gsl_matrix * @var{m}, size_t @var{i}, size_t @var{offset}, size_t @var{n}) These functions return a vector view of the @var{i}-th row of the matrix @var{m} beginning at @var{offset} elements past the first column and containing @var{n} elements. The @code{data} pointer of the new vector is set to null if @var{i}, @var{offset}, or @var{n} are out of range. The function @code{gsl_vector_const_subrow} is equivalent to @code{gsl_matrix_subrow} but can be used for matrices which are declared @code{const}. @end deftypefun @deftypefun gsl_vector_view gsl_matrix_subcolumn (gsl_matrix * @var{m}, size_t @var{j}, size_t @var{offset}, size_t @var{n}) @deftypefunx {gsl_vector_const_view} gsl_matrix_const_subcolumn (const gsl_matrix * @var{m}, size_t @var{j}, size_t @var{offset}, size_t @var{n}) These functions return a vector view of the @var{j}-th column of the matrix @var{m} beginning at @var{offset} elements past the first row and containing @var{n} elements. The @code{data} pointer of the new vector is set to null if @var{j}, @var{offset}, or @var{n} are out of range. The function @code{gsl_vector_const_subcolumn} is equivalent to @code{gsl_matrix_subcolumn} 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 return 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}. The result @math{a(i,j) \leftarrow a(i,j) + b(i,j)} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a(i,j) \leftarrow a(i,j) - b(i,j)} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a(i,j) \leftarrow a(i,j) * b(i,j)} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a(i,j) \leftarrow a(i,j) / b(i,j)} is stored in @var{a} and @var{b} remains unchanged. 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}. The result @math{a(i,j) \leftarrow x a(i,j)} is stored in @var{a}. @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}. The result @math{a(i,j) \leftarrow a(i,j) + x} is stored in @var{a}. @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 The following functions are defined for real and complex matrices. For complex matrices both the real and imaginary parts must satisfy the conditions. @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}) @deftypefunx int gsl_matrix_isnonneg (const gsl_matrix * @var{m}) These functions return 1 if all the elements of the matrix @var{m} are zero, strictly positive, strictly negative, or non-negative respectively, and 0 otherwise. To test whether a matrix is positive-definite, use the Cholesky decomposition (@pxref{Cholesky Decomposition}). @end deftypefun @deftypefun int gsl_matrix_equal (const gsl_matrix * @var{a}, const gsl_matrix * @var{b}) This function returns 1 if the matrices @var{a} and @var{b} are equal (by comparison of element values) and 0 otherwise. @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.txt @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 @w{} @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 gsl-doc-2.3/doc/spmatrix.texi0000644000175000017500000004372312736044021014277 0ustar eddedd@cindex sparse matrices @cindex matrices, sparse This chapter describes functions for the construction and manipulation of sparse matrices, matrices which are populated primarily with zeros and contain only a few non-zero elements. Sparse matrices often appear in the solution of partial differential equations. It is beneficial to use specialized data structures and algorithms for storing and working with sparse matrices, since dense matrix algorithms and structures can be very slow and use huge amounts of memory when applied to sparse matrices. @noindent The header file @file{gsl_spmatrix.h} contains the prototypes for the sparse matrix functions and related declarations. @menu * Sparse Matrices Overview:: * Sparse Matrices Allocation:: * Sparse Matrices Accessing Elements:: * Sparse Matrices Initializing Elements:: * Sparse Matrices Reading and Writing:: * Sparse Matrices Copying:: * Sparse Matrices Exchanging Rows and Columns:: * Sparse Matrices Operations:: * Sparse Matrices Properties:: * Sparse Matrices Finding Maximum and Minimum Elements:: * Sparse Matrices Compressed Format:: * Sparse Matrices Conversion Between Sparse and Dense:: * Sparse Matrices Examples:: * Sparse Matrices References and Further Reading:: @end menu @node Sparse Matrices Overview @section Overview @cindex sparse matrices, overview These routines provide support for constructing and manipulating sparse matrices in GSL, using an API similar to @code{gsl_matrix}. The basic structure is called @code{gsl_spmatrix}. There are three supported storage formats for sparse matrices: the triplet, compressed column storage (CCS) and compressed row storage (CRS) formats. The triplet format stores triplets @math{(i,j,x)} for each non-zero element of the matrix. This notation means that the @math{(i,j)} element of the matrix @math{A} is @math{A_{ij} = x}. Compressed column storage stores each column of non-zero values in the sparse matrix in a continuous memory block, keeping pointers to the beginning of each column in that memory block, and storing the row indices of each non-zero element. Compressed row storage stores each row of non-zero values in a continuous memory block, keeping pointers to the beginning of each row in the block and storing the column indices of each non-zero element. The triplet format is ideal for adding elements to the sparse matrix structure while it is being constructed, while the compressed storage formats are better suited for matrix-matrix multiplication or linear solvers. @tindex gsl_spmatrix @noindent The @code{gsl_spmatrix} structure is defined as @example typedef struct @{ size_t size1; size_t size2; size_t *i; double *data; size_t *p; size_t nzmax; size_t nz; gsl_spmatrix_tree *tree_data; void *work; size_t sptype; @} gsl_spmatrix; @end example @noindent This defines a @var{size1}-by-@var{size2} sparse matrix. The number of non-zero elements currently in the matrix is given by @var{nz}. For the triplet representation, @var{i}, @var{p}, and @var{data} are arrays of size @var{nz} which contain the row indices, column indices, and element value, respectively. So if @math{data[k] = A(i,j)}, then @math{i = i[k]} and @math{j = p[k]}. @noindent For compressed column storage, @var{i} and @var{data} are arrays of size @var{nz} containing the row indices and element values, identical to the triplet case. @var{p} is an array of size @math{size2 + 1} where @math{p[j]} points to the index in @var{data} of the start of column @var{j}. Thus, if @math{data[k] = A(i,j)}, then @math{i = i[k]} and @math{p[j] <= k < p[j+1]}. @noindent For compressed row storage, @var{i} and @var{data} are arrays of size @var{nz} containing the column indices and element values, identical to the triplet case. @var{p} is an array of size @math{size1 + 1} where @math{p[i]} points to the index in @var{data} of the start of row @var{i}. Thus, if @math{data[k] = A(i,j)}, then @math{j = i[k]} and @math{p[i] <= k < p[i+1]}. @noindent The parameter @var{tree_data} is a binary tree structure used in the triplet representation, specifically a balanced AVL tree. This speeds up element searches and duplicate detection during the matrix assembly process. The parameter @var{work} is additional workspace needed for various operations like converting from triplet to compressed storage. @var{sptype} indicates the type of storage format being used (triplet, CCS or CRS). @noindent The compressed storage format defined above makes it very simple to interface with sophisticated external linear solver libraries which accept compressed storage input. The user can simply pass the arrays @var{i}, @var{p}, and @var{data} as the inputs to external libraries. @node Sparse Matrices Allocation @section Allocation @cindex sparse matrices, allocation The functions for allocating memory for a sparse 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 matrix then the functions call the GSL error handler with an error code of @code{GSL_ENOMEM} in addition to returning a null pointer. @deftypefun {gsl_spmatrix *} gsl_spmatrix_alloc (const size_t @var{n1}, const size_t @var{n2}) This function allocates a sparse matrix of size @var{n1}-by-@var{n2} and initializes it to all zeros. If the size of the matrix is not known at allocation time, both @var{n1} and @var{n2} may be set to 1, and they will automatically grow as elements are added to the matrix. This function sets the matrix to the triplet representation, which is the easiest for adding and accessing matrix elements. This function tries to make a reasonable guess for the number of non-zero elements (@var{nzmax}) which will be added to the matrix by assuming a sparse density of @math{10\%}. The function @code{gsl_spmatrix_alloc_nzmax} can be used if this number is known more accurately. The workspace is of size @math{O(nzmax)}. @end deftypefun @deftypefun {gsl_spmatrix *} gsl_spmatrix_alloc_nzmax (const size_t @var{n1}, const size_t @var{n2}, const size_t @var{nzmax}, const size_t @var{sptype}) This function allocates a sparse matrix of size @var{n1}-by-@var{n2} and initializes it to all zeros. If the size of the matrix is not known at allocation time, both @var{n1} and @var{n2} may be set to 1, and they will automatically grow as elements are added to the matrix. The parameter @var{nzmax} specifies the maximum number of non-zero elements which will be added to the matrix. It does not need to be precisely known in advance, since storage space will automatically grow using @code{gsl_spmatrix_realloc} if @var{nzmax} is not large enough. Accurate knowledge of this parameter reduces the number of reallocation calls required. The parameter @var{sptype} specifies the storage format of the sparse matrix. Possible values are @table @code @item GSL_SPMATRIX_TRIPLET This flag specifies triplet storage. @item GSL_SPMATRIX_CCS This flag specifies compressed column storage. @item GSL_SPMATRIX_CRS This flag specifies compressed row storage. @end table The allocated @code{gsl_spmatrix} structure is of size @math{O(nzmax)}. @end deftypefun @deftypefun int gsl_spmatrix_realloc (const size_t @var{nzmax}, gsl_spmatrix * @var{m}) This function reallocates the storage space for @var{m} to accomodate @var{nzmax} non-zero elements. It is typically called internally by @code{gsl_spmatrix_set} if the user wants to add more elements to the sparse matrix than the previously specified @var{nzmax}. @end deftypefun @deftypefun void gsl_spmatrix_free (gsl_spmatrix * @var{m}) This function frees the memory associated with the sparse matrix @var{m}. @end deftypefun @node Sparse Matrices Accessing Elements @section Accessing Matrix Elements @cindex sparse matrices, accessing elements @deftypefun double gsl_spmatrix_get (const gsl_spmatrix * @var{m}, const size_t @var{i}, const size_t @var{j}) This function returns element (@var{i},@var{j}) of the matrix @var{m}. The matrix may be in triplet or compressed format. @end deftypefun @deftypefun int gsl_spmatrix_set (gsl_spmatrix * @var{m}, const size_t @var{i}, const size_t @var{j}, const double @var{x}) This function sets element (@var{i},@var{j}) of the matrix @var{m} to the value @var{x}. The matrix must be in triplet representation. @end deftypefun @deftypefun {double *} gsl_spmatrix_ptr (gsl_spmatrix * @var{m}, const size_t @var{i}, const size_t @var{j}) This function returns a pointer to the (@var{i},@var{j}) element of the matrix @var{m}. If the (@var{i},@var{j}) element is not explicitly stored in the matrix, a null pointer is returned. @end deftypefun @node Sparse Matrices Initializing Elements @section Initializing Matrix Elements @cindex sparse matrices, initializing elements Since the sparse matrix format only stores the non-zero elements, it is automatically initialized to zero upon allocation. The function @code{gsl_spmatrix_set_zero} may be used to re-initialize a matrix to zero after elements have been added to it. @deftypefun int gsl_spmatrix_set_zero (gsl_spmatrix * @var{m}) This function sets (or resets) all the elements of the matrix @var{m} to zero. @end deftypefun @node Sparse Matrices Reading and Writing @section Reading and Writing Matrices @cindex sparse matrices, reading @cindex sparse matrices, writing @deftypefun int gsl_spmatrix_fwrite (FILE * @var{stream}, const gsl_spmatrix * @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_spmatrix_fread (FILE * @var{stream}, gsl_spmatrix * @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 storage format, dimensions and have a sufficiently large @code{nzmax} in order to read in all matrix elements, otherwise @code{GSL_EBADLEN} is returned. 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_spmatrix_fprintf (FILE * @var{stream}, const gsl_spmatrix * @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. The function returns 0 for success and @code{GSL_EFAILED} if there was a problem writing to the file. The input matrix @var{m} may be in any storage format, and the output file will be written in MatrixMarket format. @end deftypefun @deftypefun {gsl_spmatrix *} gsl_spmatrix_fscanf (FILE * @var{stream}) This function reads sparse matrix data in the MatrixMarket format from the stream @var{stream} and stores it in a newly allocated matrix which is returned in triplet format. The function returns 0 for success and @code{GSL_EFAILED} if there was a problem reading from the file. The user should free the returned matrix when it is no longer needed. @end deftypefun @node Sparse Matrices Copying @section Copying Matrices @cindex sparse matrices, copying @deftypefun int gsl_spmatrix_memcpy (gsl_spmatrix * @var{dest}, const gsl_spmatrix * @var{src}) This function copies the elements of the sparse matrix @var{src} into @var{dest}. The two matrices must have the same dimensions and be in the same storage format. @end deftypefun @node Sparse Matrices Exchanging Rows and Columns @section Exchanging Rows and Columns @cindex sparse matrices, exchanging rows and columns @deftypefun int gsl_spmatrix_transpose_memcpy (gsl_spmatrix * @var{dest}, const gsl_spmatrix * @var{src}) This function copies the transpose of the sparse matrix @var{src} into @var{dest}. The dimensions of @var{dest} must match the transpose of the matrix @var{src}. Also, both matrices must use the same sparse storage format. @end deftypefun @deftypefun int gsl_spmatrix_transpose (gsl_spmatrix * @var{m}) This function replaces the matrix @var{m} by its transpose, preserving the storage format of the input matrix. Currently, only triplet matrix inputs are supported. @end deftypefun @deftypefun int gsl_spmatrix_transpose2 (gsl_spmatrix * @var{m}) This function replaces the matrix @var{m} by its transpose, but changes the storage format for compressed matrix inputs. Since compressed column storage is the transpose of compressed row storage, this function simply converts a CCS matrix to CRS and vice versa. This is the most efficient way to transpose a compressed storage matrix, but the user should note that the storage format of their compressed matrix will change on output. For triplet matrices, the output matrix is also in triplet storage. @end deftypefun @node Sparse Matrices Operations @section Matrix Operations @cindex sparse matrices, operations @deftypefun int gsl_spmatrix_add (gsl_spmatrix * @var{c}, const gsl_spmatrix * @var{a}, const gsl_spmatrix * @var{b}) This function computes the sum @math{c = a + b}. The three matrices must have the same dimensions and be stored in a compressed format. @end deftypefun @deftypefun int gsl_spmatrix_scale (gsl_spmatrix * @var{m}, const double @var{x}) This function scales all elements of the matrix @var{m} by the constant factor @var{x}. The result @math{m(i,j) \leftarrow x m(i,j)} is stored in @var{m}. @end deftypefun @node Sparse Matrices Properties @section Matrix Properties @cindex sparse matrices, properties @deftypefun size_t gsl_spmatrix_nnz (const gsl_spmatrix * @var{m}) This function returns the number of non-zero elements in @var{m}. @end deftypefun @deftypefun int gsl_spmatrix_equal (const gsl_spmatrix * @var{a}, const gsl_spmatrix * @var{b}) This function returns 1 if the matrices @var{a} and @var{b} are equal (by comparison of element values) and 0 otherwise. The matrices @var{a} and @var{b} must be in the same sparse storage format for comparison. @end deftypefun @node Sparse Matrices Finding Maximum and Minimum Elements @section Finding Maximum and Minimum Elements @cindex sparse matrices, min/max elements @deftypefun int gsl_spmatrix_minmax (const gsl_spmatrix * @var{m}, double * @var{min_out}, double * @var{max_out}) This function returns the minimum and maximum elements of the matrix @var{m}, storing them in @var{min_out} and @var{max_out}, and searching only the non-zero values. @end deftypefun @node Sparse Matrices Compressed Format @section Compressed Format @cindex sparse matrices, compression GSL supports compressed column storage (CCS) and compressed row storage (CRS) formats. @deftypefun {gsl_spmatrix *} gsl_spmatrix_ccs (const gsl_spmatrix * @var{T}) This function creates a sparse matrix in compressed column format from the input sparse matrix @var{T} which must be in triplet format. A pointer to a newly allocated matrix is returned. The calling function should free the newly allocated matrix when it is no longer needed. @end deftypefun @deftypefun {gsl_spmatrix *} gsl_spmatrix_crs (const gsl_spmatrix * @var{T}) This function creates a sparse matrix in compressed row format from the input sparse matrix @var{T} which must be in triplet format. A pointer to a newly allocated matrix is returned. The calling function should free the newly allocated matrix when it is no longer needed. @end deftypefun @node Sparse Matrices Conversion Between Sparse and Dense @section Conversion Between Sparse and Dense Matrices @cindex sparse matrices, conversion The @code{gsl_spmatrix} structure can be converted into the dense @code{gsl_matrix} format and vice versa with the following routines. @deftypefun int gsl_spmatrix_d2sp (gsl_spmatrix * @var{S}, const gsl_matrix * @var{A}) This function converts the dense matrix @var{A} into sparse triplet format and stores the result in @var{S}. @end deftypefun @deftypefun int gsl_spmatrix_sp2d (gsl_matrix * @var{A}, const gsl_spmatrix * @var{S}) This function converts the sparse matrix @var{S} into a dense matrix and stores the result in @var{A}. @var{S} must be in triplet format. @end deftypefun @node Sparse Matrices Examples @section Examples @cindex sparse matrices, examples The following example program builds a 5-by-4 sparse matrix and prints it in triplet, compressed column, and compressed row format. The matrix which is constructed is @tex \beforedisplay $$ \left( \matrix{ 0 & 0 & 3.1 & 4.6 \cr 1 & 0 & 7.2 & 0 \cr 0 & 0 & 0 & 0 \cr 2.1 & 2.9 & 0 & 8.5 \cr 4.1 & 0 & 0 & 0 \cr } \right) $$ \afterdisplay @end tex The output of the program is @example printing all matrix elements: A(0,0) = 0 A(0,1) = 0 A(0,2) = 3.1 A(0,3) = 4.6 A(1,0) = 1 . . . A(4,0) = 4.1 A(4,1) = 0 A(4,2) = 0 A(4,3) = 0 matrix in triplet format (i,j,Aij): (0, 2, 3.1) (0, 3, 4.6) (1, 0, 1.0) (1, 2, 7.2) (3, 0, 2.1) (3, 1, 2.9) (3, 3, 8.5) (4, 0, 4.1) matrix in compressed column format: i = [ 1, 3, 4, 3, 0, 1, 0, 3, ] p = [ 0, 3, 4, 6, 8, ] d = [ 1, 2.1, 4.1, 2.9, 3.1, 7.2, 4.6, 8.5, ] matrix in compressed row format: i = [ 2, 3, 0, 2, 0, 1, 3, 0, ] p = [ 0, 2, 4, 4, 7, 8, ] d = [ 3.1, 4.6, 1, 7.2, 2.1, 2.9, 8.5, 4.1, ] @end example @noindent We see in the compressed column output, the data array stores each column contiguously, the array @math{i} stores the row index of the corresponding data element, and the array @math{p} stores the index of the start of each column in the data array. Similarly, for the compressed row output, the data array stores each row contiguously, the array @math{i} stores the column index of the corresponding data element, and the @math{p} array stores the index of the start of each row in the data array. @example @verbatiminclude examples/spmatrix.c @end example @node Sparse Matrices References and Further Reading @section References and Further Reading @cindex sparse matrices, references The algorithms used by these functions are described in the following sources: @itemize @w{} @item T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM, 2006. @item CSparse software library, @uref{https://www.cise.ufl.edu/research/sparse/CSparse} @end itemize gsl-doc-2.3/doc/interpp2.eps0000664000175000017500000010076012616157443014020 0ustar eddedd%!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 gsl-doc-2.3/doc/splinalg.texi0000664000175000017500000002305412653500635014244 0ustar eddedd@cindex sparse linear algebra @cindex linear algebra, sparse This chapter describes functions for solving sparse linear systems of equations. The library provides linear algebra routines which operate directly on the @code{gsl_spmatrix} and @code{gsl_vector} objects. @noindent The functions described in this chapter are declared in the header file @file{gsl_splinalg.h}. @menu * Overview of Sparse Linear Algebra:: * Sparse Iterative Solvers:: * Sparse Linear Algebra Examples:: * Sparse Linear Algebra References and Further Reading:: @end menu @node Overview of Sparse Linear Algebra @section Overview @cindex sparse linear algebra, overview This chapter is primarily concerned with the solution of the linear system @tex \beforedisplay $$ A x = b $$ \afterdisplay @end tex @ifinfo @example A x = b @end example @end ifinfo where @math{A} is a general square @math{n}-by-@math{n} non-singular sparse matrix, @math{x} is an unknown @math{n}-by-@math{1} vector, and @math{b} is a given @math{n}-by-1 right hand side vector. There exist many methods for solving such sparse linear systems, which broadly fall into either direct or iterative categories. Direct methods include LU and QR decompositions, while iterative methods start with an initial guess for the vector @math{x} and update the guess through iteration until convergence. GSL does not currently provide any direct sparse solvers. @node Sparse Iterative Solvers @section Sparse Iterative Solvers @cindex sparse matrices, iterative solvers @cindex sparse linear algebra, iterative solvers @cindex sparse, iterative solvers @menu * Sparse Iterative Solver Overview:: * Sparse Iterative Solvers Types:: * Iterating the Sparse Linear System:: @end menu @node Sparse Iterative Solver Overview @subsection Overview Many practical iterative methods of solving large @math{n}-by-@math{n} sparse linear systems involve projecting an approximate solution for @var{x} onto a subspace of @math{{\bf R}^n}. If we define a @math{m}-dimensional subspace @math{{\cal K}} as the subspace of approximations to the solution @var{x}, then @math{m} constraints must be imposed to determine the next approximation. These @math{m} constraints define another @math{m}-dimensional subspace denoted by @math{{\cal L}}. The subspace dimension @math{m} is typically chosen to be much smaller than @math{n} in order to reduce the computational effort needed to generate the next approximate solution vector. The many iterative algorithms which exist differ mainly in their choice of @math{{\cal K}} and @math{{\cal L}}. @node Sparse Iterative Solvers Types @subsection Types of Sparse Iterative Solvers The sparse linear algebra library provides the following types of iterative solvers: @deffn {Sparse Iterative Type} gsl_splinalg_itersolve_gmres @cindex gmres This specifies the Generalized Minimum Residual Method (GMRES). This is a projection method using @math{{\cal K} = {\cal K}_m} and @math{{\cal L} = A {\cal K}_m} where @math{{\cal K}_m} is the @math{m}-th Krylov subspace @tex \beforedisplay $$ {\cal K}_m = span \left\{ r_0, A r_0, ..., A^{m-1} r_0 \right\} $$ \afterdisplay @end tex @ifinfo @example K_m = span( r_0, A r_0, ..., A^(m-1) r_0) @end example @end ifinfo and @math{r_0 = b - A x_0} is the residual vector of the initial guess @math{x_0}. If @math{m} is set equal to @math{n}, then the Krylov subspace is @math{{\bf R}^n} and GMRES will provide the exact solution @var{x}. However, the goal is for the method to arrive at a very good approximation to @var{x} using a much smaller subspace @math{{\cal K}_m}. By default, the GMRES method selects @math{m = MIN(n,10)} but the user may specify a different value for @math{m}. The GMRES storage requirements grow as @math{O(n(m+1))} and the number of flops grow as @math{O(4 m^2 n - 4 m^3 / 3)}. In the below function @code{gsl_splinalg_itersolve_iterate}, one GMRES iteration is defined as projecting the approximate solution vector onto each Krylov subspace @math{{\cal K}_1, ..., {\cal K}_m}, and so @math{m} can be kept smaller by "restarting" the method and calling @code{gsl_splinalg_itersolve_iterate} multiple times, providing the updated approximation @var{x} to each new call. If the method is not adequately converging, the user may try increasing the parameter @math{m}. GMRES is considered a robust general purpose iterative solver, however there are cases where the method stagnates if the matrix is not positive-definite and fails to reduce the residual until the very last projection onto the subspace @math{{\cal K}_n = {\bf R}^n}. In these cases, preconditioning the linear system can help, but GSL does not currently provide any preconditioners. @end deffn @node Iterating the Sparse Linear System @subsection Iterating the Sparse Linear System The following functions are provided to allocate storage for the sparse linear solvers and iterate the system to a solution. @deftypefun {gsl_splinalg_itersolve *} gsl_splinalg_itersolve_alloc (const gsl_splinalg_itersolve_type * @var{T}, const size_t @var{n}, const size_t @var{m}) This function allocates a workspace for the iterative solution of @var{n}-by-@var{n} sparse matrix systems. The iterative solver type is specified by @var{T}. The argument @var{m} specifies the size of the solution candidate subspace @math{{\cal K}_m}. The dimension @var{m} may be set to 0 in which case a reasonable default value is used. @end deftypefun @deftypefun void gsl_splinalg_itersolve_free (gsl_splinalg_itersolve * @var{w}) This function frees the memory associated with the workspace @var{w}. @end deftypefun @deftypefun {const char *} gsl_splinalg_itersolve_name (const gsl_splinalg_itersolve * @var{w}) This function returns a string pointer to the name of the solver. @end deftypefun @deftypefun int gsl_splinalg_itersolve_iterate (const gsl_spmatrix *@var{A}, const gsl_vector *@var{b}, const double @var{tol}, gsl_vector *@var{x}, gsl_splinalg_itersolve *@var{w}) This function performs one iteration of the iterative method for the sparse linear system specfied by the matrix @var{A}, right hand side vector @var{b} and solution vector @var{x}. On input, @var{x} must be set to an initial guess for the solution. On output, @var{x} is updated to give the current solution estimate. The parameter @var{tol} specifies the relative tolerance between the residual norm and norm of @var{b} in order to check for convergence. When the following condition is satisfied: @tex \beforedisplay $$ || A x - b || \le tol \times || b || $$ \afterdisplay @end tex @ifinfo @example || A x - b || <= tol * || b || @end example @end ifinfo the method has converged, the function returns @code{GSL_SUCCESS} and the final solution is provided in @var{x}. Otherwise, the function returns @code{GSL_CONTINUE} to signal that more iterations are required. Here, @math{|| \cdot ||} represents the Euclidean norm. The input matrix @var{A} may be in triplet or compressed column format. @end deftypefun @deftypefun double gsl_splinalg_itersolve_normr (const gsl_splinalg_itersolve *@var{w}) This function returns the current residual norm @math{||r|| = ||A x - b||}, which is updated after each call to @code{gsl_splinalg_itersolve_iterate}. @end deftypefun @node Sparse Linear Algebra Examples @section Examples @cindex sparse linear algebra, examples This example program demonstrates the sparse linear algebra routines on the solution of a simple 1D Poisson equation on @math{[0,1]}: @tex \beforedisplay $$ {d^2 u(x) \over dx^2} = f(x) = -\pi^2 \sin{(\pi x)} $$ \afterdisplay @end tex @ifinfo @example u''(x) = f(x) = -\pi^2 \sin(\pi x) @end example @end ifinfo with boundary conditions @math{u(0) = u(1) = 0}. The analytic solution of this simple problem is @math{u(x) = \sin{\pi x}}. We will solve this problem by finite differencing the left hand side to give @tex \beforedisplay $$ {1 \over h^2} \left( u_{i+1} - 2 u_i + u_{i-1} \right) = f_i $$ \afterdisplay @end tex @ifinfo @example 1/h^2 ( u_(i+1) - 2 u_i + u_(i-1) ) = f_i @end example @end ifinfo Defining a grid of @math{N} points, @math{h = 1/(N-1)}. In the finite difference equation above, @math{u_0 = u_{N-1} = 0} are known from the boundary conditions, so we will only put the equations for @math{i = 1, ..., N-2} into the matrix system. The resulting @math{(N-2) \times (N-2)} matrix equation is @tex \beforedisplay $$ {1 \over h^2} \left( \matrix{ -2 & 1 & 0 & 0 & \ldots & 0 \cr 1 & -2 & 1 & 0 & \ldots & 0 \cr 0 & 1 & -2 & 1 & \ldots & 0 \cr \vdots & \vdots & \ddots & \ddots & \ddots & \vdots \cr 0 & \ldots & \ldots & 1 & -2 & 1 \cr 0 & \ldots & \ldots & \ldots & 1 & -2 \cr } \right) \left( \matrix{ u_1 \cr u_2 \cr u_3 \cr \vdots \cr u_{N-3} \cr u_{N-2} \cr } \right) = \left( \matrix{ f_1 \cr f_2 \cr f_3 \cr \vdots \cr f_{N-3} \cr f_{N-2} \cr } \right) $$ \afterdisplay @end tex An example program which constructs and solves this system is given below. The system is solved using the iterative GMRES solver. Here is the output of the program: @example iter 0 residual = 4.297275996844e-11 Converged @end example @noindent showing that the method converged in a single iteration. The calculated solution is shown in the following plot. @page @iftex @center @image{sparse_poisson,6in} @end iftex @example @verbatiminclude examples/poisson.c @end example @node Sparse Linear Algebra References and Further Reading @section References and Further Reading @cindex sparse linear algebra, references The implementation of the GMRES iterative solver closely follows the publications @itemize @w{} @item H. F. Walker, Implementation of the GMRES method using Householder transformations, SIAM J. Sci. Stat. Comput. 9(1), 1988. @item Y. Saad, Iterative methods for sparse linear systems, 2nd edition, SIAM, 2003. @end itemize gsl-doc-2.3/doc/gsl-ref.info-40000644000175000017500000111020313022372750014101 0ustar eddeddThis is gsl-ref.info, produced by makeinfo version 5.1 from gsl-ref.texi. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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.3 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 the freedom to copy and modify this GNU Manual." INFO-DIR-SECTION Software libraries START-INFO-DIR-ENTRY * gsl-ref: (gsl-ref). GNU Scientific Library - Reference END-INFO-DIR-ENTRY  File: gsl-ref.info, Node: Series Acceleration References, Prev: Example of accelerating a series, Up: Series Acceleration 31.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, .  File: gsl-ref.info, Node: Wavelet Transforms, Next: Discrete Hankel Transforms, Prev: Series Acceleration, Up: Top 32 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 32.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 32.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 This 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. A null pointer is returned if insufficient memory is available. -- 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 32.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 32.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 32.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 form 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 32.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 #include #include #include int main (int argc, char **argv) { (void)(argc); /* avoid unused parameter warning */ 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.txt $ graph -T ps -x 0 256 32 -h 0.3 -a dwt.txt > dwt.ps  File: gsl-ref.info, Node: DWT References, Prev: DWT Examples, Up: Wavelet Transforms 32.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 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 33 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 33.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 zeros 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. Starting with its definition, the Hankel transform (or Bessel transform) of order \nu of a function f with \nu > -1/2 is defined as (see Johnson, 1987 and Lemoine, 1994) F_\nu(u) = \int_0^\infty f(t) J_\nu(u t) t dt If the integral exists, F_\nu is called the Hankel transformation of f. The reverse transform is given by f(t) = \int_0^\infty F_\nu(u) J_\nu(u t) u du , where \int_0^\infty f(t) t^{1/2} dt must exist and be absolutely convergent, and where f(t) satisfies Dirichlet's conditions (of limited total fluctuations) in the interval [0,\infty]. Now the discrete Hankel transform works on a discrete function f, which is sampled on points n=1...M located at positions t_n=(j_{\nu,n}/j_{\nu,M}) X in real space and at u_n=j_{\nu,n}/X in reciprocal space. Here, j_{\nu,m} are the m-th zeros of the Bessel function J_\nu(x) arranged in ascending order. Moreover, the discrete functions are assumed to be band limited, so f(t_n)=0 and F(u_n)=0 for n>M. Accordingly, the function f is defined on the interval [0,X]. Following the work of Johnson, 1987 and Lemoine, 1994, the discrete Hankel transform is given by F_\nu(u_m) = (2 X^2 / j_(\nu,M)^2) \sum_{k=1}^{M-1} f(j_(\nu,k) X/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 calculated by GSL. In GSL, forward and backward transforms are defined equally and calculate F_\nu(u_m). Following Johnson, the backward transform reads f(t_k) = (2 / X^2) \sum_{m=1}^{M-1} F(j_(\nu,m)/X) (J_\nu(j_(\nu,m) j_(\nu,k) / j_(\nu,M)) / J_(\nu+1)(j_(\nu,m))^2). Obviously, using the forward transform instead of the backward transform gives an additional factor X^4/j_{\nu,M}^2=t_m^2/u_m^2. 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 to define the length X of the fundamental interval, for convenience, while discrete Hankel transforms are often defined on the unit interval instead of [0,X]. 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 33.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 XMAX. -- 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 XMAX. -- 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. Applying this function to its output gives the original data multiplied by (1/j_(\nu,M))^2, up to numerical errors. -- 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 33.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 34 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 34.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 34.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 34.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 34.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 as a function pointer: 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 = ¶ms; The function f(x) can be evaluated using the macro 'GSL_FN_EVAL(&F,x)' defined in 'gsl_math.h'. -- 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 macro 'GSL_FN_FDF_EVAL_F(&FDF,x)' and the derivative f'(x) can be evaluated using the macro 'GSL_FN_FDF_EVAL_DF(&FDF,x)'. Both the function y = f(x) and its derivative dy = f'(x) can be evaluated at the same time using the macro 'GSL_FN_FDF_EVAL_F_DF(&FDF,x,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 34.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 an 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 34.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 34.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 34.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 34.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"(1) 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. ---------- Footnotes ---------- (1) J.F. Steffensen (1873-1961). The spelling used in the name of the function is slightly incorrect, but has been preserved to avoid incompatibility.  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 34.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; 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 #include #include #include #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 = ¶ms; 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 #include #include #include #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 = ¶ms; 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 34.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 35 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 35.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 35.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 35.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 35.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 35.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 35.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 35.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.3819660...) 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. -- Minimizer: gsl_min_fminimizer_quad_golden This is a variant of Brent's algorithm which uses the safeguarded step-length algorithm of Gill and Murray.  File: gsl-ref.info, Node: Minimization Examples, Next: Minimization References and Further Reading, Prev: Minimization Algorithms, Up: One dimensional Minimization 35.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 #include #include #include double fn1 (double x, void * params) { (void)(params); /* avoid unused parameter warning */ 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\n", iter, a, b, m, 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 using brent method iter [ lower, upper] min err err(est) 0 [0.0000000, 6.0000000] 2.0000000 -1.1415927 6.0000000 1 [2.0000000, 6.0000000] 3.5278640 +0.3862713 4.0000000 2 [2.0000000, 3.5278640] 3.1748217 +0.0332290 1.5278640 3 [2.0000000, 3.1748217] 3.1264576 -0.0151351 1.1748217 4 [3.1264576, 3.1748217] 3.1414743 -0.0001183 0.0483641 5 [3.1414743, 3.1748217] 3.1415930 +0.0000004 0.0333474 Converged: 6 [3.1414743, 3.1415930] 3.1415927 +0.0000000 0.0001187  File: gsl-ref.info, Node: Minimization References and Further Reading, Prev: Minimization Examples, Up: One dimensional Minimization 35.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 36 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 36.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 36.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, const gsl_vector * X) -- Function: int gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver * S, gsl_multiroot_function_fdf * FDF, const gsl_vector * X) These functions set, or reset, an existing solver S to use the function F or function and derivative FDF, and the initial guess X. Note that the initial position is copied from X, this argument is not modified by subsequent iterations. -- 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 36.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 = ¶ms; -- 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 36.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 's->x' and its function value 's->f' 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, given by 's->x'. -- 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, given by 's->f'. -- 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, given by 's->dx'.  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 36.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 36.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. If the Jacobian matrix is singular, an error code of 'GSL_EDOM' is returned. -- 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 36.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 36.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 #include #include #include 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 36.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 37 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 with Derivatives:: * Multimin Algorithms without Derivatives:: * Multimin Examples:: * Multimin References and Further Reading::  File: gsl-ref.info, Node: Multimin Overview, Next: Multimin Caveats, Up: Multidimensional Minimization 37.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. Algorithms which do not require the gradient of the function use different strategies. For example, the Nelder-Mead Simplex algorithm maintains n+1 trial parameter vectors as the vertices of a n-dimensional simplex. On each iteration it tries to improve the worst vertex of the simplex by geometrical transformations. The iterations are continued until the overall size of the simplex has decreased sufficiently. 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 37.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 37.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) -- Function: int gsl_multimin_fminimizer_set (gsl_multimin_fminimizer * S, gsl_multimin_function * F, const gsl_vector * X, const gsl_vector * STEP_SIZE) The function 'gsl_multimin_fdfminimizer_set' 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. The function 'gsl_multimin_fminimizer_set' 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 37.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. If the function cannot be computed, an error value of 'GSL_NAN' should be returned. '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. If the function cannot be computed, an error value of 'GSL_NAN' should be returned. '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 two-dimensional paraboloid with five parameters, /* Paraboloid centered on (p[0],p[1]), with scale factors (p[2],p[3]) and minimum p[4] */ double my_f (const gsl_vector *v, void *params) { double x, y; double *p = (double *)params; x = gsl_vector_get(v, 0); y = gsl_vector_get(v, 1); return p[2] * (x - p[0]) * (x - p[0]) + p[3] * (y - p[1]) * (y - p[1]) + p[4]; } /* 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 *p = (double *)params; x = gsl_vector_get(v, 0); y = gsl_vector_get(v, 1); gsl_vector_set(df, 0, 2.0 * p[2] * (x - p[0])); gsl_vector_set(df, 1, 2.0 * p[3] * (y - p[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; /* Paraboloid center at (1,2), scale factors (10, 20), minimum value 30 */ double p[5] = { 1.0, 2.0, 10.0, 20.0, 30.0 }; my_func.n = 2; /* number of function components */ my_func.f = &my_f; my_func.df = &my_df; my_func.fdf = &my_fdf; 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 37.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 error code 'GSL_ENOPROG' signifies that the minimizer is unable to improve on its current estimate, either due to numerical difficulty or because a genuine local minimum has been reached. 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: gsl_vector * gsl_multimin_fdfminimizer_dx (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, the last step increment of the estimate, 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 with Derivatives, Prev: Multimin Iteration, Up: Multidimensional Minimization 37.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 with Derivatives, Next: Multimin Algorithms without Derivatives, Prev: Multimin Stopping Criteria, Up: Multidimensional Minimization 37.7 Algorithms with Derivatives ================================ There are several minimization methods available. The best choice of algorithm depends on the problem. The algorithms described in this section use the value of the function and its gradient at each evaluation point. -- 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 supersedes 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.  File: gsl-ref.info, Node: Multimin Algorithms without Derivatives, Next: Multimin Examples, Prev: Multimin Algorithms with Derivatives, Up: Multidimensional Minimization 37.8 Algorithms without Derivatives =================================== The algorithms described in this section use only the value of the function at each evaluation point. -- Minimizer: gsl_multimin_fminimizer_nmsimplex2 -- Minimizer: gsl_multimin_fminimizer_nmsimplex These methods use the Simplex algorithm of Nelder and Mead. Starting from the initial vector X = p_0, the algorithm constructs an additional n vectors p_i using the step size vector s = STEP_SIZE as follows: p_0 = (x_0, x_1, ... , x_n) p_1 = (x_0 + s_0, x_1, ... , x_n) p_2 = (x_0, x_1 + s_1, ... , x_n) ... = ... p_n = (x_0, x_1, ... , x_n + s_n) These vectors form the n+1 vertices of a simplex in n dimensions. On each iteration the algorithm uses simple geometrical transformations to update the vector corresponding to the highest function value. The geometric transformations are reflection, reflection followed by expansion, contraction and multiple contraction. Using these transformations the simplex moves through the 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 minimizer-specific characteristic size is calculated 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'. The 'nmsimplex2' version of this minimiser is a new O(N) operations implementation of the earlier O(N^2) operations 'nmsimplex' minimiser. It uses the same underlying algorithm, but the simplex updates are computed more efficiently for high-dimensional problems. In addition, the size of simplex is calculated as the RMS distance of each vertex from the center rather than the mean distance, allowing a linear update of this quantity on each step. The memory usage is O(N^2) for both algorithms. -- Minimizer: gsl_multimin_fminimizer_nmsimplex2rand This method is a variant of 'nmsimplex2' which initialises the simplex around the starting point X using a randomly-oriented set of basis vectors instead of the fixed coordinate axes. The final dimensions of the simplex are scaled along the coordinate axes by the vector STEP_SIZE. The randomisation uses a simple deterministic generator so that repeated calls to 'gsl_multimin_fminimizer_set' for a given solver object will vary the orientation in a well-defined way.  File: gsl-ref.info, Node: Multimin Examples, Next: Multimin References and Further Reading, Prev: Multimin Algorithms without Derivatives, Up: Multidimensional Minimization 37.9 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), scale factors 10,20, height 30. */ double par[5] = { 1.0, 2.0, 10.0, 20.0, 30.0 }; gsl_vector *x; gsl_multimin_function_fdf my_func; my_func.n = 2; my_func.f = my_f; my_func.df = my_df; my_func.fdf = my_fdf; 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) { double par[5] = {1.0, 2.0, 10.0, 20.0, 30.0}; const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex2; gsl_multimin_fminimizer *s = NULL; gsl_vector *ss, *x; gsl_multimin_function minex_func; size_t iter = 0; int status; double size; /* Starting point */ x = gsl_vector_alloc (2); gsl_vector_set (x, 0, 5.0); gsl_vector_set (x, 1, 7.0); /* Set initial step sizes to 1 */ ss = gsl_vector_alloc (2); gsl_vector_set_all (ss, 1.0); /* Initialize method and iterate */ minex_func.n = 2; minex_func.f = my_f; minex_func.params = par; s = gsl_multimin_fminimizer_alloc (T, 2); 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 %10.3e %10.3e f() = %7.3f size = %.3f\n", iter, gsl_vector_get (s->x, 0), gsl_vector_get (s->x, 1), 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.130 2 5.250e+00 4.000e+00 f() = 290.625 size = 1.409 3 5.250e+00 4.000e+00 f() = 290.625 size = 1.409 4 5.500e+00 1.000e+00 f() = 252.500 size = 1.409 5 2.625e+00 3.500e+00 f() = 101.406 size = 1.847 6 2.625e+00 3.500e+00 f() = 101.406 size = 1.847 7 0.000e+00 3.000e+00 f() = 60.000 size = 1.847 8 2.094e+00 1.875e+00 f() = 42.275 size = 1.321 9 2.578e-01 1.906e+00 f() = 35.684 size = 1.069 10 5.879e-01 2.445e+00 f() = 35.664 size = 0.841 11 1.258e+00 2.025e+00 f() = 30.680 size = 0.476 12 1.258e+00 2.025e+00 f() = 30.680 size = 0.367 13 1.093e+00 1.849e+00 f() = 30.539 size = 0.300 14 8.830e-01 2.004e+00 f() = 30.137 size = 0.172 15 8.830e-01 2.004e+00 f() = 30.137 size = 0.126 16 9.582e-01 2.060e+00 f() = 30.090 size = 0.106 17 1.022e+00 2.004e+00 f() = 30.005 size = 0.063 18 1.022e+00 2.004e+00 f() = 30.005 size = 0.043 19 1.022e+00 2.004e+00 f() = 30.005 size = 0.043 20 1.022e+00 2.004e+00 f() = 30.005 size = 0.027 21 1.022e+00 2.004e+00 f() = 30.005 size = 0.022 22 9.920e-01 1.997e+00 f() = 30.001 size = 0.016 23 9.920e-01 1.997e+00 f() = 30.001 size = 0.013 converged to minimum at 24 9.920e-01 1.997e+00 f() = 30.001 size = 0.008 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 37.10 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-313.  File: gsl-ref.info, Node: Least-Squares Fitting, Next: Nonlinear Least-Squares Fitting, Prev: Multidimensional Minimization, Up: Top 38 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. * Menu: * Fitting Overview:: * Linear regression:: * Multi-parameter regression:: * Regularized regression:: * Robust linear regression:: * Large Dense Linear Systems:: * Troubleshooting:: * Fitting Examples:: * Fitting References and Further Reading::  File: gsl-ref.info, Node: Fitting Overview, Next: Linear regression, Up: Least-Squares Fitting 38.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}}. The correlation coefficient of the fit parameters c_a and c_b is given by \rho_{ab} = C_{ab} / \sqrt{C_{aa} C_{bb}}.  File: gsl-ref.info, Node: Linear regression, Next: Multi-parameter regression, Prev: Fitting Overview, Up: Least-Squares Fitting 38.2 Linear regression ====================== The functions in this section are used to fit simple one or two parameter linear regression models. The functions are declared in the header file 'gsl_fit.h'. * Menu: * Linear regression with a constant term:: * Linear regression without a constant term::  File: gsl-ref.info, Node: Linear regression with a constant term, Next: Linear regression without a constant term, Up: Linear regression 38.2.1 Linear regression with a constant term --------------------------------------------- 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. Note: the correlation coefficient of the data can be computed using 'gsl_stats_correlation' (*note Correlation::), it does not depend on the fit. -- 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 COV00, double COV01, double COV11, 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.  File: gsl-ref.info, Node: Linear regression without a constant term, Prev: Linear regression with a constant term, Up: Linear regression 38.2.2 Linear regression 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 COV11, 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 regression, Next: Regularized regression, Prev: Linear regression, Up: Least-Squares Fitting 38.3 Multi-parameter regression =============================== This section describes routines which perform least squares fits to a linear model by minimizing the cost function \chi^2 = \sum_i w_i (y_i - \sum_j X_ij c_j)^2 = || y - Xc ||_W^2 where y is a vector of n observations, X is an n-by-p matrix of predictor variables, c is a vector of the p unknown best-fit parameters to be estimated, and ||r||_W^2 = r^T W r. The matrix W = diag(w_1,w_2,...,w_n) defines the weights or uncertainties of the observation vector. 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 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. These functions are declared in the header file 'gsl_multifit.h'. -- Function: gsl_multifit_linear_workspace * gsl_multifit_linear_alloc (const size_t N, const size_t P) This function allocates a workspace for fitting a model to a maximum of N observations using a maximum of P parameters. The user may later supply a smaller least squares system if desired. The size of the workspace is O(np + p^2). -- 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_svd (const gsl_matrix * X, gsl_multifit_linear_workspace * WORK) This function performs a singular value decomposition of the matrix X and stores the SVD factors internally in WORK. -- Function: int gsl_multifit_linear_bsvd (const gsl_matrix * X, gsl_multifit_linear_workspace * WORK) This function performs a singular value decomposition of the matrix X and stores the SVD factors internally in WORK. The matrix X is first balanced by applying column scaling factors to improve the accuracy of the singular values. -- 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) This function computes the best-fit parameters C of the model y = X c for the observations Y and the matrix of predictor variables X, using the preallocated workspace provided in WORK. The p-by-p variance-covariance matrix of the model parameters COV is set to \sigma^2 (X^T X)^{-1}, where \sigma is the standard deviation of the fit residuals. The sum of squares of the residuals from the best-fit, \chi^2, is returned in CHISQ. If the coefficient of determination is desired, it can be computed from the expression R^2 = 1 - \chi^2 / TSS, where the total sum of squares (TSS) of the observations Y may be computed from 'gsl_stats_tss'. The best-fit is found by singular value decomposition of the matrix X using the modified Golub-Reinsch SVD algorithm, 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. -- Function: int gsl_multifit_linear_tsvd (const gsl_matrix * X, const gsl_vector * Y, const double TOL, gsl_vector * C, gsl_matrix * COV, double * CHISQ, size_t * RANK, gsl_multifit_linear_workspace * WORK) This function computes the best-fit parameters C of the model y = X c for the observations Y and the matrix of predictor variables X, using a truncated SVD expansion. Singular values which satisfy s_i \le tol \times s_0 are discarded from the fit, where s_0 is the largest singular value. The p-by-p variance-covariance matrix of the model parameters COV is set to \sigma^2 (X^T X)^{-1}, where \sigma is the standard deviation of the fit residuals. The sum of squares of the residuals from the best-fit, \chi^2, is returned in CHISQ. The effective rank (number of singular values used in solution) is returned in RANK. If the coefficient of determination is desired, it can be computed from the expression R^2 = 1 - \chi^2 / TSS, where the total sum of squares (TSS) of the observations Y may be computed from 'gsl_stats_tss'. -- 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) 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, using the preallocated workspace provided in WORK. The p-by-p covariance matrix of the model parameters COV is computed as (X^T W X)^{-1}. The weighted sum of squares of the residuals from the best-fit, \chi^2, is returned in CHISQ. If the coefficient of determination is desired, it can be computed from the expression R^2 = 1 - \chi^2 / WTSS, where the weighted total sum of squares (WTSS) of the observations Y may be computed from 'gsl_stats_wtss'. -- Function: int gsl_multifit_wlinear_tsvd (const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, const double TOL, gsl_vector * C, gsl_matrix * COV, double * CHISQ, size_t * RANK, 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, using a truncated SVD expansion. Singular values which satisfy s_i \le tol \times s_0 are discarded from the fit, where s_0 is the largest singular value. The p-by-p covariance matrix of the model parameters COV is computed as (X^T W X)^{-1}. The weighted sum of squares of the residuals from the best-fit, \chi^2, is returned in CHISQ. The effective rank of the system (number of singular values used in the solution) is returned in RANK. If the coefficient of determination is desired, it can be computed from the expression R^2 = 1 - \chi^2 / WTSS, where the weighted total sum of squares (WTSS) of the observations Y may be computed from 'gsl_stats_wtss'. -- 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. -- Function: int gsl_multifit_linear_residuals (const gsl_matrix * X, const gsl_vector * Y, const gsl_vector * C, gsl_vector * R) This function computes the vector of residuals r = y - X c for the observations Y, coefficients C and matrix of predictor variables X. -- Function: size_t gsl_multifit_linear_rank (const double TOL, const gsl_multifit_linear_workspace * WORK) This function returns the rank of the matrix X which must first have its singular value decomposition computed. The rank is computed by counting the number of singular values \sigma_j which satisfy \sigma_j > tol \times \sigma_0, where \sigma_0 is the largest singular value.  File: gsl-ref.info, Node: Regularized regression, Next: Robust linear regression, Prev: Multi-parameter regression, Up: Least-Squares Fitting 38.4 Regularized regression =========================== Ordinary weighted least squares models seek a solution vector c which minimizes the residual \chi^2 = || y - Xc ||_W^2 where y is the n-by-1 observation vector, X is the n-by-p design matrix, c is the p-by-1 solution vector, W = diag(w_1,...,w_n) is the data weighting matrix, and ||r||_W^2 = r^T W r. In cases where the least squares matrix X is ill-conditioned, small perturbations (ie: noise) in the observation vector could lead to widely different solution vectors c. One way of dealing with ill-conditioned matrices is to use a "truncated SVD" in which small singular values, below some given tolerance, are discarded from the solution. The truncated SVD method is available using the functions 'gsl_multifit_linear_tsvd' and 'gsl_multifit_wlinear_tsvd'. Another way to help solve ill-posed problems is to include a regularization term in the least squares minimization \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 for a suitably chosen regularization parameter \lambda and matrix L. This type of regularization is known as Tikhonov, or ridge, regression. In some applications, L is chosen as the identity matrix, giving preference to solution vectors c with smaller norms. Including this regularization term leads to the explicit "normal equations" solution c = ( X^T W X + \lambda^2 L^T L )^-1 X^T W y which reduces to the ordinary least squares solution when L = 0. In practice, it is often advantageous to transform a regularized least squares system into the form \chi^2 = || y~ - X~ c~ ||^2 + \lambda^2 || c~ ||^2 This is known as the Tikhonov "standard form" and has the normal equations solution \tilde{c} = \left( \tilde{X}^T \tilde{X} + \lambda^2 I \right)^{-1} \tilde{X}^T \tilde{y}. For an m-by-p matrix L which is full rank and has m >= p (ie: L is square or has more rows than columns), we can calculate the "thin" QR decomposition of L, and note that ||L c|| = ||R c|| since the Q factor will not change the norm. Since R is p-by-p, we can then use the transformation X~ = sqrt(W) X R^-1 y~ = sqrt(W) y c~ = R c to achieve the standard form. For a rectangular matrix L with m < p, a more sophisticated approach is needed (see Hansen 1998, chapter 2.3). In practice, the normal equations solution above is not desirable due to numerical instabilities, and so the system is solved using the singular value decomposition of the matrix \tilde{X}. The matrix L is often chosen as the identity matrix, or as a first or second finite difference operator, to ensure a smoothly varying coefficient vector c, or as a diagonal matrix to selectively damp each model parameter differently. If L \ne I, the user must first convert the least squares problem to standard form using 'gsl_multifit_linear_stdform1' or 'gsl_multifit_linear_stdform2', solve the system, and then backtransform the solution vector to recover the solution of the original problem (see 'gsl_multifit_linear_genform1' and 'gsl_multifit_linear_genform2'). In many regularization problems, care must be taken when choosing the regularization parameter \lambda. Since both the residual norm ||y - X c|| and solution norm ||L c|| are being minimized, the parameter \lambda represents a tradeoff between minimizing either the residuals or the solution vector. A common tool for visualizing the comprimise between the minimization of these two quantities is known as the L-curve. The L-curve is a log-log plot of the residual norm ||y - X c|| on the horizontal axis and the solution norm ||L c|| on the vertical axis. This curve nearly always as an L shaped appearance, with a distinct corner separating the horizontal and vertical sections of the curve. The regularization parameter corresponding to this corner is often chosen as the optimal value. GSL provides routines to calculate the L-curve for all relevant regularization parameters as well as locating the corner. Another method of choosing the regularization parameter is known as Generalized Cross Validation (GCV). This method is based on the idea that if an arbitrary element y_i is left out of the right hand side, the resulting regularized solution should predict this element accurately. This leads to choosing the parameter \lambda which minimizes the GCV function G(\lambda) = (||y - X c_{\lambda}||^2) / Tr(I_n - X X^I)^2 where X_{\lambda}^I is the matrix which relates the solution c_{\lambda} to the right hand side y, ie: c_{\lambda} = X_{\lambda}^I y. GSL provides routines to compute the GCV curve and its minimum. For most applications, the steps required to solve a regularized least squares problem are as follows: 1. Construct the least squares system (X, y, W, L) 2. Transform the system to standard form (\tilde{X},\tilde{y}). This step can be skipped if L = I_p and W = I_n. 3. Calculate the SVD of \tilde{X}. 4. Determine an appropriate regularization parameter \lambda (using for example L-curve or GCV analysis). 5. Solve the standard form system using the chosen \lambda and the SVD of \tilde{X}. 6. Backtransform the standard form solution \tilde{c} to recover the original solution vector c. -- Function: int gsl_multifit_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multifit_linear_workspace * WORK) -- Function: int gsl_multifit_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multifit_linear_workspace * WORK) These functions define a regularization matrix L = diag(l_0,l_1,...,l_{p-1}). The diagonal matrix element l_i is provided by the ith element of the input vector L. The n-by-p least squares matrix X and vector Y of length n are then converted to standard form as described above and the parameters (\tilde{X},\tilde{y}) are stored in XS and YS on output. XS and YS have the same dimensions as X and Y. Optional data weights may be supplied in the vector W of length n. In order to apply this transformation, L^{-1} must exist and so none of the l_i may be zero. After the standard form system has been solved, use 'gsl_multifit_linear_genform1' to recover the original solution vector. It is allowed to have X = XS and Y = YS for an in-place transform. In order to perform a weighted regularized fit with L = I, the user may call 'gsl_multifit_linear_applyW' to convert to standard form. -- Function: int gsl_multifit_linear_L_decomp (gsl_matrix * L, gsl_vector * TAU) This function factors the m-by-p regularization matrix L into a form needed for the later transformation to standard form. L may have any number of rows m. If m \ge p the QR decomposition of L is computed and stored in L on output. If m < p, the QR decomposition of L^T is computed and stored in L on output. On output, the Householder scalars are stored in the vector TAU of size MIN(m,p). These outputs will be used by 'gsl_multifit_linear_wstdform2' to complete the transformation to standard form. -- Function: int gsl_multifit_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_matrix * M, gsl_multifit_linear_workspace * WORK) -- Function: int gsl_multifit_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_matrix * M, gsl_multifit_linear_workspace * WORK) These functions convert the least squares system (X,Y,W,L) to standard form (\tilde{X},\tilde{y}) which are stored in XS and YS respectively. The m-by-p regularization matrix L is specified by the inputs LQR and LTAU, which are outputs from 'gsl_multifit_linear_L_decomp'. The dimensions of the standard form parameters (\tilde{X},\tilde{y}) depend on whether m is larger or less than p. For m \ge p, XS is n-by-p, YS is n-by-1, and M is not used. For m < p, XS is (n - p + m)-by-m, YS is (n - p + m)-by-1, and M is additional n-by-p workspace, which is required to recover the original solution vector after the system has been solved (see 'gsl_multifit_linear_genform2'). Optional data weights may be supplied in the vector W of length n, where W = diag(w). -- Function: int gsl_multifit_linear_solve (const double LAMBDA, const gsl_matrix * XS, const gsl_vector * YS, gsl_vector * CS, double * RNORM, double * SNORM, gsl_multifit_linear_workspace * WORK) This function computes the regularized best-fit parameters \tilde{c} which minimize the cost function \chi^2 = || \tilde{y} - \tilde{X} \tilde{c} ||^2 + \lambda^2 || \tilde{c} ||^2 which is in standard form. The least squares system must therefore be converted to standard form prior to calling this function. The observation vector \tilde{y} is provided in YS and the matrix of predictor variables \tilde{X} in XS. The solution vector \tilde{c} is returned in CS, which has length min(m,p). The SVD of XS must be computed prior to calling this function, using 'gsl_multifit_linear_svd'. The regularization parameter \lambda is provided in LAMBDA. The residual norm || \tilde{y} - \tilde{X} \tilde{c} || = ||y - X c||_W is returned in RNORM. The solution norm || \tilde{c} || = ||L c|| is returned in SNORM. -- Function: int gsl_multifit_linear_genform1 (const gsl_vector * L, const gsl_vector * CS, gsl_vector * C, gsl_multifit_linear_workspace * WORK) After a regularized system has been solved with L = diag(\l_0,\l_1,...,\l_{p-1}), this function backtransforms the standard form solution vector CS to recover the solution vector of the original problem C. The diagonal matrix elements l_i are provided in the vector L. It is allowed to have C = CS for an in-place transform. -- Function: int gsl_multifit_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * Y, const gsl_vector * CS, const gsl_matrix * M, gsl_vector * C, gsl_multifit_linear_workspace * WORK) -- Function: int gsl_multifit_linear_wgenform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, const gsl_vector * CS, const gsl_matrix * M, gsl_vector * C, gsl_multifit_linear_workspace * WORK) After a regularized system has been solved with a general rectangular matrix L, specified by (LQR,LTAU), this function backtransforms the standard form solution CS to recover the solution vector of the original problem, which is stored in C, of length p. The original least squares matrix and observation vector are provided in X and Y respectively. M is the matrix computed by 'gsl_multifit_linear_stdform2'. For weighted fits, the weight vector W must also be supplied. -- Function: int gsl_multifit_linear_applyW (const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, gsl_matrix * WX, gsl_vector * WY) For weighted least squares systems with L = I, this function may be used to convert the system to standard form by applying the weight matrix W = diag(W) to the least squares matrix X and observation vector Y. On output, WX is equal to W^{1/2} X and WY is equal to W^{1/2} y. It is allowed for WX = X and WY = Y for an in-place transform. -- Function: int gsl_multifit_linear_lcurve (const gsl_vector * Y, gsl_vector * REG_PARAM, gsl_vector * RHO, gsl_vector * ETA, gsl_multifit_linear_workspace * WORK) This function computes the L-curve for a least squares system using the right hand side vector Y and the SVD decomposition of the least squares matrix X, which must be provided to 'gsl_multifit_linear_svd' prior to calling this function. The output vectors REG_PARAM, RHO, and ETA must all be the same size, and will contain the regularization parameters \lambda_i, residual norms ||y - X c_i||, and solution norms || L c_i || which compose the L-curve, where c_i is the regularized solution vector corresponding to \lambda_i. The user may determine the number of points on the L-curve by adjusting the size of these input arrays. The regularization parameters \lambda_i are estimated from the singular values of X, and chosen to represent the most relevant portion of the L-curve. -- Function: int gsl_multifit_linear_lcorner (const gsl_vector * RHO, const gsl_vector * ETA, size_t * IDX) This function attempts to locate the corner of the L-curve (||y - X c||, ||L c||) defined by the RHO and ETA input arrays respectively. The corner is defined as the point of maximum curvature of the L-curve in log-log scale. The RHO and ETA arrays can be outputs of 'gsl_multifit_linear_lcurve'. The algorithm used simply fits a circle to 3 consecutive points on the L-curve and uses the circle's radius to determine the curvature at the middle point. Therefore, the input array sizes must be \ge 3. With more points provided for the L-curve, a better estimate of the curvature can be obtained. The array index corresponding to maximum curvature (ie: the corner) is returned in IDX. If the input arrays contain colinear points, this function could fail and return 'GSL_EINVAL'. -- Function: int gsl_multifit_linear_lcorner2 (const gsl_vector * REG_PARAM, const gsl_vector * ETA, size_t * IDX) This function attempts to locate the corner of an alternate L-curve (\lambda^2, ||L c||^2) studied by Rezghi and Hosseini, 2009. This alternate L-curve can provide better estimates of the regularization parameter for smooth solution vectors. The regularization parameters \lambda and solution norms ||L c|| are provided in the REG_PARAM and ETA input arrays respectively. The corner is defined as the point of maximum curvature of this alternate L-curve in linear scale. The REG_PARAM and ETA arrays can be outputs of 'gsl_multifit_linear_lcurve'. The algorithm used simply fits a circle to 3 consecutive points on the L-curve and uses the circle's radius to determine the curvature at the middle point. Therefore, the input array sizes must be \ge 3. With more points provided for the L-curve, a better estimate of the curvature can be obtained. The array index corresponding to maximum curvature (ie: the corner) is returned in IDX. If the input arrays contain colinear points, this function could fail and return 'GSL_EINVAL'. -- Function: int gsl_multifit_linear_gcv_init(const gsl_vector * Y, gsl_vector * REG_PARAM, gsl_vector * UTY, double * DELTA0, gsl_multifit_linear_workspace * WORK) This function performs some initialization in preparation for computing the GCV curve and its minimum. The right hand side vector is provided in Y. On output, REG_PARAM is set to a vector of regularization parameters in decreasing order and may be of any size. The vector UTY of size p is set to U^T y. The parameter DELTA0 is needed for subsequent steps of the GCV calculation. -- Function: int gsl_multifit_linear_gcv_curve(const gsl_vector * REG_PARAM, const gsl_vector * UTY, const double DELTA0, gsl_vector * G, gsl_multifit_linear_workspace * WORK) This funtion calculates the GCV curve G(\lambda) and stores it in G on output, which must be the same size as REG_PARAM. The inputs REG_PARAM, UTY and DELTA0 are computed in 'gsl_multifit_linear_gcv_init'. -- Function: int gsl_multifit_linear_gcv_min(const gsl_vector * REG_PARAM, const gsl_vector * UTY, const gsl_vector * G, const double DELTA0, double * LAMBDA, gsl_multifit_linear_workspace * WORK) This function computes the value of the regularization parameter which minimizes the GCV curve G(\lambda) and stores it in LAMBDA. The input G is calculated by 'gsl_multifit_linear_gcv_curve' and the inputs REG_PARAM, UTY and DELTA0 are computed by 'gsl_multifit_linear_gcv_init'. -- Function: double gsl_multifit_linear_gcv_calc(const double LAMBDA, const gsl_vector * UTY, const double DELTA0, gsl_multifit_linear_workspace * WORK) This function returns the value of the GCV curve G(\lambda) corresponding to the input LAMBDA. -- Function: int gsl_multifit_linear_gcv(const gsl_vector * Y, gsl_vector * REG_PARAM, gsl_vector * G, double * LAMBDA, double * G_LAMBDA, gsl_multifit_linear_workspace * WORK) This function combines the steps 'gcv_init', 'gcv_curve', and 'gcv_min' defined above into a single function. The input Y is the right hand side vector. On output, REG_PARAM and G, which must be the same size, are set to vectors of \lambda and G(\lambda) values respectively. The output LAMBDA is set to the optimal value of \lambda which minimizes the GCV curve. The minimum value of the GCV curve is returned in G_LAMBDA. -- Function: int gsl_multifit_linear_Lk (const size_t P, const size_t K, gsl_matrix * L) This function computes the discrete approximation to the derivative operator L_k of order K on a regular grid of P points and stores it in L. The dimensions of L are (p-k)-by-p. -- Function: int gsl_multifit_linear_Lsobolev (const size_t P, const size_t KMAX, const gsl_vector * ALPHA, gsl_matrix * L, gsl_multifit_linear_workspace * WORK) This function computes the regularization matrix L corresponding to the weighted Sobolov norm ||L c||^2 = \sum_k \alpha_k^2 ||L_k c||^2 where L_k approximates the derivative operator of order k. This regularization norm can be useful in applications where it is necessary to smooth several derivatives of the solution. P is the number of model parameters, KMAX is the highest derivative to include in the summation above, and ALPHA is the vector of weights of size KMAX + 1, where ALPHA[k] = \alpha_k is the weight assigned to the derivative of order k. The output matrix L is size P-by-P and upper triangular. -- Function: double gsl_multifit_linear_rcond (const gsl_multifit_linear_workspace * WORK) This function returns the reciprocal condition number of the least squares matrix X, defined as the ratio of the smallest and largest singular values, rcond = \sigma_{min}/\sigma_{max}. The routine 'gsl_multifit_linear_svd' must first be called to compute the SVD of X.  File: gsl-ref.info, Node: Robust linear regression, Next: Large Dense Linear Systems, Prev: Regularized regression, Up: Least-Squares Fitting 38.5 Robust linear regression ============================= Ordinary least squares (OLS) models are often heavily influenced by the presence of outliers. Outliers are data points which do not follow the general trend of the other observations, although there is strictly no precise definition of an outlier. Robust linear regression refers to regression algorithms which are robust to outliers. The most common type of robust regression is M-estimation. The general M-estimator minimizes the objective function \sum_i \rho(e_i) = \sum_i \rho (y_i - Y(c, x_i)) where e_i = y_i - Y(c, x_i) is the residual of the ith data point, and \rho(e_i) is a function which should have the following properties: \rho(e) \ge 0 \rho(0) = 0 \rho(-e) = \rho(e) \rho(e_1) > \rho(e_2) for |e_1| > |e_2| The special case of ordinary least squares is given by \rho(e_i) = e_i^2. Letting \psi = \rho' be the derivative of \rho, differentiating the objective function with respect to the coefficients c and setting the partial derivatives to zero produces the system of equations \sum_i \psi(e_i) X_i = 0 where X_i is a vector containing row i of the design matrix X. Next, we define a weight function w(e) = \psi(e)/e, and let w_i = w(e_i): \sum_i w_i e_i X_i = 0 This system of equations is equivalent to solving a weighted ordinary least squares problem, minimizing \chi^2 = \sum_i w_i e_i^2. The weights however, depend on the residuals e_i, which depend on the coefficients c, which depend on the weights. Therefore, an iterative solution is used, called Iteratively Reweighted Least Squares (IRLS). 1. Compute initial estimates of the coefficients c^{(0)} using ordinary least squares 2. For iteration k, form the residuals e_i^{(k)} = (y_i - X_i c^{(k-1)})/(t \sigma^{(k)} \sqrt{1 - h_i}), where t is a tuning constant depending on the choice of \psi, and h_i are the statistical leverages (diagonal elements of the matrix X (X^T X)^{-1} X^T). Including t and h_i in the residual calculation has been shown to improve the convergence of the method. The residual standard deviation is approximated as \sigma^{(k)} = MAD / 0.6745, where MAD is the Median-Absolute-Deviation of the n-p largest residuals from the previous iteration. 3. Compute new weights w_i^{(k)} = \psi(e_i^{(k)})/e_i^{(k)}. 4. Compute new coefficients c^{(k)} by solving the weighted least squares problem with weights w_i^{(k)}. 5. Steps 2 through 4 are iterated until the coefficients converge or until some maximum iteration limit is reached. Coefficients are tested for convergence using the critera: |c_i^(k) - c_i^(k-1)| \le \epsilon \times max(|c_i^(k)|, |c_i^(k-1)|) for all 0 \le i < p where \epsilon is a small tolerance factor. The key to this method lies in selecting the function \psi(e_i) to assign smaller weights to large residuals, and larger weights to smaller residuals. As the iteration proceeds, outliers are assigned smaller and smaller weights, eventually having very little or no effect on the fitted model. -- Function: gsl_multifit_robust_workspace * gsl_multifit_robust_alloc (const gsl_multifit_robust_type * T, const size_t N, const size_t P) This function allocates a workspace for fitting a model to N observations using P parameters. The size of the workspace is O(np + p^2). The type T specifies the function \psi and can be selected from the following choices. -- Robust type: gsl_multifit_robust_default This specifies the 'gsl_multifit_robust_bisquare' type (see below) and is a good general purpose choice for robust regression. -- Robust type: gsl_multifit_robust_bisquare This is Tukey's biweight (bisquare) function and is a good general purpose choice for robust regression. The weight function is given by w(e) = (1 - e^2)^2 and the default tuning constant is t = 4.685. -- Robust type: gsl_multifit_robust_cauchy This is Cauchy's function, also known as the Lorentzian function. This function does not guarantee a unique solution, meaning different choices of the coefficient vector C could minimize the objective function. Therefore this option should be used with care. The weight function is given by w(e) = 1 / (1 + e^2) and the default tuning constant is t = 2.385. -- Robust type: gsl_multifit_robust_fair This is the fair \rho function, which guarantees a unique solution and has continuous derivatives to three orders. The weight function is given by w(e) = 1 / (1 + |e|) and the default tuning constant is t = 1.400. -- Robust type: gsl_multifit_robust_huber This specifies Huber's \rho function, which is a parabola in the vicinity of zero and increases linearly for a given threshold |e| > t. This function is also considered an excellent general purpose robust estimator, however, occasional difficulties can be encountered due to the discontinuous first derivative of the \psi function. The weight function is given by w(e) = 1/max(1,|e|) and the default tuning constant is t = 1.345. -- Robust type: gsl_multifit_robust_ols This specifies the ordinary least squares solution, which can be useful for quickly checking the difference between the various robust and OLS solutions. The weight function is given by w(e) = 1 and the default tuning constant is t = 1. -- Robust type: gsl_multifit_robust_welsch This specifies the Welsch function which can perform well in cases where the residuals have an exponential distribution. The weight function is given by w(e) = \exp(-e^2) and the default tuning constant is t = 2.985. -- Function: void gsl_multifit_robust_free (gsl_multifit_robust_workspace * W) This function frees the memory associated with the workspace W. -- Function: const char * gsl_multifit_robust_name (const gsl_multifit_robust_workspace * W) This function returns the name of the robust type T specified to 'gsl_multifit_robust_alloc'. -- Function: int gsl_multifit_robust_tune (const double TUNE, gsl_multifit_robust_workspace * W) This function sets the tuning constant t used to adjust the residuals at each iteration to TUNE. Decreasing the tuning constant increases the downweight assigned to large residuals, while increasing the tuning constant decreases the downweight assigned to large residuals. -- Function: int gsl_multifit_robust_maxiter (const size_t MAXITER, gsl_multifit_robust_workspace * W) This function sets the maximum number of iterations in the iteratively reweighted least squares algorithm to MAXITER. By default, this value is set to 100 by 'gsl_multifit_robust_alloc'. -- Function: int gsl_multifit_robust_weights (const gsl_vector * R, gsl_vector * WTS, gsl_multifit_robust_workspace * W) This function assigns weights to the vector WTS using the residual vector R and previously specified weighting function. The output weights are given by wts_i = w(r_i / (t \sigma)), where the weighting functions w are detailed in 'gsl_multifit_robust_alloc'. \sigma is an estimate of the residual standard deviation based on the Median-Absolute-Deviation and t is the tuning constant. This function is useful if the user wishes to implement their own robust regression rather than using the supplied 'gsl_multifit_robust' routine below. -- Function: int gsl_multifit_robust (const gsl_matrix * X, const gsl_vector * Y, gsl_vector * C, gsl_matrix * COV, gsl_multifit_robust_workspace * W) This function computes the best-fit parameters C of the model y = X c for the observations Y and the matrix of predictor variables X, attemping to reduce the influence of outliers using the algorithm outlined above. The p-by-p variance-covariance matrix of the model parameters COV is estimated as \sigma^2 (X^T X)^{-1}, where \sigma is an approximation of the residual standard deviation using the theory of robust regression. Special care must be taken when estimating \sigma and other statistics such as R^2, and so these are computed internally and are available by calling the function 'gsl_multifit_robust_statistics'. If the coefficients do not converge within the maximum iteration limit, the function returns 'GSL_EMAXITER'. In this case, the current estimates of the coefficients and covariance matrix are returned in C and COV and the internal fit statistics are computed with these estimates. -- Function: int gsl_multifit_robust_est (const gsl_vector * X, const gsl_vector * C, const gsl_matrix * COV, double * Y, double * Y_ERR) This function uses the best-fit robust 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. -- Function: int gsl_multifit_robust_residuals (const gsl_matrix * X, const gsl_vector * Y, const gsl_vector * C, gsl_vector * R, gsl_multifit_robust_workspace * W) This function computes the vector of studentized residuals r_i = {y_i - (X c)_i \over \sigma \sqrt{1 - h_i}} for the observations Y, coefficients C and matrix of predictor variables X. The routine 'gsl_multifit_robust' must first be called to compute the statisical leverages h_i of the matrix X and residual standard deviation estimate \sigma. -- Function: gsl_multifit_robust_stats gsl_multifit_robust_statistics (const gsl_multifit_robust_workspace * W) This function returns a structure containing relevant statistics from a robust regression. The function 'gsl_multifit_robust' must be called first to perform the regression and calculate these statistics. The returned 'gsl_multifit_robust_stats' structure contains the following fields. double 'sigma_ols' This contains the standard deviation of the residuals as computed from ordinary least squares (OLS). double 'sigma_mad' This contains an estimate of the standard deviation of the final residuals using the Median-Absolute-Deviation statistic double 'sigma_rob' This contains an estimate of the standard deviation of the final residuals from the theory of robust regression (see Street et al, 1988). double 'sigma' This contains an estimate of the standard deviation of the final residuals by attemping to reconcile 'sigma_rob' and 'sigma_ols' in a reasonable way. double 'Rsq' This contains the R^2 coefficient of determination statistic using the estimate 'sigma'. double 'adj_Rsq' This contains the adjusted R^2 coefficient of determination statistic using the estimate 'sigma'. double 'rmse' This contains the root mean squared error of the final residuals double 'sse' This contains the residual sum of squares taking into account the robust covariance matrix. size_t 'dof' This contains the number of degrees of freedom n - p size_t 'numit' Upon successful convergence, this contains the number of iterations performed gsl_vector * 'weights' This contains the final weight vector of length N gsl_vector * 'r' This contains the final residual vector of length N, r = y - X c  File: gsl-ref.info, Node: Large Dense Linear Systems, Next: Troubleshooting, Prev: Robust linear regression, Up: Least-Squares Fitting 38.6 Large dense linear systems =============================== This module is concerned with solving large dense least squares systems X c = y where the n-by-p matrix X has n >> p (ie: many more rows than columns). This type of matrix is called a "tall skinny" matrix, and for some applications, it may not be possible to fit the entire matrix in memory at once to use the standard SVD approach. Therefore, the algorithms in this module are designed to allow the user to construct smaller blocks of the matrix X and accumulate those blocks into the larger system one at a time. The algorithms in this module never need to store the entire matrix X in memory. The large linear least squares routines support data weights and Tikhonov regularization, and are designed to minimize the residual \chi^2 = || y - Xc ||_W^2 + \lambda^2 || L c ||^2 where y is the n-by-1 observation vector, X is the n-by-p design matrix, c is the p-by-1 solution vector, W = diag(w_1,...,w_n) is the data weighting matrix, L is an m-by-p regularization matrix, \lambda is a regularization parameter, and ||r||_W^2 = r^T W r. In the discussion which follows, we will assume that the system has been converted into Tikhonov standard form, \chi^2 = || y~ - X~ c~ ||^2 + \lambda^2 || c~ ||^2 and we will drop the tilde characters from the various parameters. For a discussion of the transformation to standard form *note Regularized regression::. The basic idea is to partition the matrix X and observation vector y as [ X_1 ] c = [ y_1 ] [ X_2 ] [ y_2 ] [ X_3 ] [ y_3 ] [ ... ] [ ... ] [ X_k ] [ y_k ] into k blocks, where each block (X_i,y_i) may have any number of rows, but each X_i has p columns. The sections below describe the methods available for solving this partitioned system. The functions are declared in the header file 'gsl_multilarge.h'. * Menu: * Large Dense Linear Systems Normal Equations:: * Large Dense Linear Systems TSQR:: * Large Dense Linear Systems Solution Steps:: * Large Dense Linear Systems Routines::  File: gsl-ref.info, Node: Large Dense Linear Systems Normal Equations, Next: Large Dense Linear Systems TSQR, Up: Large Dense Linear Systems 38.6.1 Normal Equations Approach -------------------------------- The normal equations approach to the large linear least squares problem described above is popular due to its speed and simplicity. Since the normal equations solution to the problem is given by c = ( X^T X + \lambda^2 I )^-1 X^T y only the p-by-p matrix X^T X and p-by-1 vector X^T y need to be stored. Using the partition scheme described above, these are given by X^T X = \sum_i X_i^T X_i X^T y = \sum_i X_i^T y_i Since the matrix X^T X is symmetric, only half of it needs to be calculated. Once all of the blocks (X_i,y_i) have been accumulated into the final X^T X and X^T y, the system can be solved with a Cholesky factorization of the X^T X matrix. If the Cholesky factorization fails (occasionally due to numerical rounding errors), a QR decomposition is then used. In both cases, the X^T X matrix is first transformed via a diagonal scaling transformation to attempt to reduce its condition number as much as possible to recover a more accurate solution vector. The normal equations approach is the fastest method for solving the large least squares problem, and is accurate for well-conditioned matrices X. However, for ill-conditioned matrices, as is often the case for large systems, this method can suffer from numerical instabilities (see Trefethen and Bau, 1997). The number of operations for this method is O(np^2 + {1 \over 3}p^3).  File: gsl-ref.info, Node: Large Dense Linear Systems TSQR, Next: Large Dense Linear Systems Solution Steps, Prev: Large Dense Linear Systems Normal Equations, Up: Large Dense Linear Systems 38.6.2 Tall Skinny QR (TSQR) Approach ------------------------------------- An algorithm which has better numerical stability for ill-conditioned problems is known as the Tall Skinny QR (TSQR) method. This method is based on computing the thin QR decomposition of the least squares matrix X = Q R, where Q is an n-by-p matrix with orthogonal columns, and R is a p-by-p upper triangular matrix. Once these factors are calculated, the residual becomes \chi^2 = || Q^T y - R c ||^2 + \lambda^2 || c ||^2 which can be written as the matrix equation [ R ; \lambda I ] c = [ Q^T b ; 0 ] The matrix on the left hand side is now a much smaller 2p-by-p matrix which can be solved with a standard SVD approach. The Q matrix is just as large as the original matrix X, however it does not need to be explicitly constructed. The TSQR algorithm computes only the p-by-p matrix R and the p-by-1 vector Q^T y, and updates these quantities as new blocks are added to the system. Each time a new block of rows (X_i,y_i) is added, the algorithm performs a QR decomposition of the matrix [ R_(i-1) ; X_i ] where R_{i-1} is the upper triangular R factor for the matrix [ X_1 ; ... ; X_(i-1) ] This QR decomposition is done efficiently taking into account the sparse structure of R_{i-1}. See Demmel et al, 2008 for more details on how this is accomplished. The number of operations for this method is O(2np^2 - {2 \over 3}p^3).  File: gsl-ref.info, Node: Large Dense Linear Systems Solution Steps, Next: Large Dense Linear Systems Routines, Prev: Large Dense Linear Systems TSQR, Up: Large Dense Linear Systems 38.6.3 Large Dense Linear Systems Solution Steps ------------------------------------------------ The typical steps required to solve large regularized linear least squares problems are as follows: 1. Choose the regularization matrix L. 2. Construct a block of rows of the least squares matrix, right hand side vector, and weight vector (X_i, y_i, w_i). 3. Transform the block to standard form (\tilde{X_i},\tilde{y_i}). This step can be skipped if L = I and W = I. 4. Accumulate the standard form block (\tilde{X_i},\tilde{y_i}) into the system. 5. Repeat steps 2-4 until the entire matrix and right hand side vector have been accumulated. 6. Determine an appropriate regularization parameter \lambda (using for example L-curve analysis). 7. Solve the standard form system using the chosen \lambda. 8. Backtransform the standard form solution \tilde{c} to recover the original solution vector c.  File: gsl-ref.info, Node: Large Dense Linear Systems Routines, Prev: Large Dense Linear Systems Solution Steps, Up: Large Dense Linear Systems 38.6.4 Large Dense Linear Least Squares Routines ------------------------------------------------ -- Function: gsl_multilarge_linear_workspace * gsl_multilarge_linear_alloc (const gsl_multilarge_linear_type * T, const size_t P) This function allocates a workspace for solving large linear least squares systems. The least squares matrix X has P columns, but may have any number of rows. The parameter T specifies the method to be used for solving the large least squares system and may be selected from the following choices -- Multilarge type: gsl_multilarge_linear_normal This specifies the normal equations approach for solving the least squares system. This method is suitable in cases where performance is critical and it is known that the least squares matrix X is well conditioned. The size of this workspace is O(p^2). -- Multilarge type: gsl_multilarge_linear_tsqr This specifies the sequential Tall Skinny QR (TSQR) approach for solving the least squares system. This method is a good general purpose choice for large systems, but requires about twice as many operations as the normal equations method for n >> p. The size of this workspace is O(p^2). -- Function: void gsl_multilarge_linear_free (gsl_multilarge_linear_workspace * W) This function frees the memory associated with the workspace W. -- Function: const char * gsl_multilarge_linear_name (gsl_multilarge_linear_workspace * W) This function returns a string pointer to the name of the multilarge solver. -- Function: int gsl_multilarge_linear_reset (gsl_multilarge_linear_workspace * W) This function resets the workspace W so it can begin to accumulate a new least squares system. -- Function: int gsl_multilarge_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multilarge_linear_workspace * WORK) -- Function: int gsl_multilarge_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multilarge_linear_workspace * WORK) These functions define a regularization matrix L = diag(l_0,l_1,...,l_{p-1}). The diagonal matrix element l_i is provided by the ith element of the input vector L. The block (X,Y) is converted to standard form and the parameters (\tilde{X},\tilde{y}) are stored in XS and YS on output. XS and YS have the same dimensions as X and Y. Optional data weights may be supplied in the vector W. In order to apply this transformation, L^{-1} must exist and so none of the l_i may be zero. After the standard form system has been solved, use 'gsl_multilarge_linear_genform1' to recover the original solution vector. It is allowed to have X = XS and Y = YS for an in-place transform. -- Function: int gsl_multilarge_linear_L_decomp (gsl_matrix * L, gsl_vector * TAU) This function calculates the QR decomposition of the m-by-p regularization matrix L. L must have m \ge p. On output, the Householder scalars are stored in the vector TAU of size p. These outputs will be used by 'gsl_multilarge_linear_wstdform2' to complete the transformation to standard form. -- Function: int gsl_multilarge_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multilarge_linear_workspace * WORK) -- Function: int gsl_multilarge_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_matrix * X, const gsl_vector * W, const gsl_vector * Y, gsl_matrix * XS, gsl_vector * YS, gsl_multilarge_linear_workspace * WORK) These functions convert a block of rows (X,Y,W) to standard form (\tilde{X},\tilde{y}) which are stored in XS and YS respectively. X, Y, and W must all have the same number of rows. The m-by-p regularization matrix L is specified by the inputs LQR and LTAU, which are outputs from 'gsl_multilarge_linear_L_decomp'. XS and YS have the same dimensions as X and Y. After the standard form system has been solved, use 'gsl_multilarge_linear_genform2' to recover the original solution vector. Optional data weights may be supplied in the vector W, where W = diag(w). -- Function: int gsl_multilarge_linear_accumulate (gsl_matrix * X, gsl_vector * Y, gsl_multilarge_linear_workspace * W) This function accumulates the standard form block (X,y) into the current least squares system. X and Y have the same number of rows, which can be arbitrary. X must have p columns. For the TSQR method, X and Y are destroyed on output. For the normal equations method, they are both unchanged. -- Function: int gsl_multilarge_linear_solve (const double LAMBDA, gsl_vector * C, double * RNORM, double * SNORM, gsl_multilarge_linear_workspace * W) After all blocks (X_i,y_i) have been accumulated into the large least squares system, this function will compute the solution vector which is stored in C on output. The regularization parameter \lambda is provided in LAMBDA. On output, RNORM contains the residual norm ||y - X c||_W and SNORM contains the solution norm ||L c||. -- Function: int gsl_multilarge_linear_genform1 (const gsl_vector * L, const gsl_vector * CS, gsl_vector * C, gsl_multilarge_linear_workspace * WORK) After a regularized system has been solved with L = diag(\l_0,\l_1,...,\l_{p-1}), this function backtransforms the standard form solution vector CS to recover the solution vector of the original problem C. The diagonal matrix elements l_i are provided in the vector L. It is allowed to have C = CS for an in-place transform. -- Function: int gsl_multilarge_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * LTAU, const gsl_vector * CS, gsl_vector * C, gsl_multilarge_linear_workspace * WORK) After a regularized system has been solved with a regularization matrix L, specified by (LQR,LTAU), this function backtransforms the standard form solution CS to recover the solution vector of the original problem, which is stored in C, of length p. -- Function: int gsl_multilarge_linear_lcurve (gsl_vector * REG_PARAM, gsl_vector * RHO, gsl_vector * ETA, gsl_multilarge_linear_workspace * WORK) This function computes the L-curve for a large least squares system after it has been fully accumulated into the workspace WORK. The output vectors REG_PARAM, RHO, and ETA must all be the same size, and will contain the regularization parameters \lambda_i, residual norms ||y - X c_i||, and solution norms || L c_i || which compose the L-curve, where c_i is the regularized solution vector corresponding to \lambda_i. The user may determine the number of points on the L-curve by adjusting the size of these input arrays. For the TSQR method, the regularization parameters \lambda_i are estimated from the singular values of the triangular R factor. For the normal equations method, they are estimated from the eigenvalues of the X^T X matrix. -- Function: int gsl_multilarge_linear_rcond (double * RCOND, gsl_multilarge_linear_workspace * WORK) This function computes the reciprocal condition number, stored in RCOND, of the least squares matrix after it has been accumulated into the workspace WORK. For the TSQR algorithm, this is accomplished by calculating the SVD of the R factor, which has the same singular values as the matrix X. For the normal equations method, this is done by computing the eigenvalues of X^T X, which could be inaccurate for ill-conditioned matrices X.  File: gsl-ref.info, Node: Troubleshooting, Next: Fitting Examples, Prev: Large Dense Linear Systems, Up: Least-Squares Fitting 38.7 Troubleshooting ==================== When using models based on polynomials, care should be taken when constructing the design matrix X. If the x values are large, then the matrix X could be ill-conditioned since its columns are powers of x, leading to unstable least-squares solutions. In this case it can often help to center and scale the x values using the mean and standard deviation: x' = (x - mu)/sigma and then construct the X matrix using the transformed values x'.  File: gsl-ref.info, Node: Fitting Examples, Next: Fitting References and Further Reading, Prev: Troubleshooting, Up: Least-Squares Fitting 38.8 Examples ============= The example programs in this section demonstrate the various linear regression methods. * Menu: * Fitting linear regression example:: * Fitting multi-parameter linear regression example:: * Fitting regularized linear regression example 1:: * Fitting regularized linear regression example 2:: * Fitting robust linear regression example:: * Fitting large linear systems example::  File: gsl-ref.info, Node: Fitting linear regression example, Next: Fitting multi-parameter linear regression example, Up: Fitting Examples 38.8.1 Simple Linear Regression Example --------------------------------------- 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 #include 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  File: gsl-ref.info, Node: Fitting multi-parameter linear regression example, Next: Fitting regularized linear regression example 1, Prev: Fitting linear regression example, Up: Fitting Examples 38.8.2 Multi-parameter Linear Regression Example ------------------------------------------------ The following 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 #include 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 #include #include 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, $ GSL_RNG_TYPE=mt19937_1999 ./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 regularized linear regression example 1, Next: Fitting regularized linear regression example 2, Prev: Fitting multi-parameter linear regression example, Up: Fitting Examples 38.8.3 Regularized Linear Regression Example 1 ---------------------------------------------- The next program demonstrates the difference between ordinary and regularized least squares when the design matrix is near-singular. In this program, we generate two random normally distributed variables u and v, with v = u + noise so that u and v are nearly colinear. We then set a third dependent variable y = u + v + noise and solve for the coefficients c_1,c_2 of the model Y(c_1,c_2) = c_1 u + c_2 v. Since u \approx v, the design matrix X is nearly singular, leading to unstable ordinary least squares solutions. Here is the program output: matrix condition number = 1.025113e+04 === Unregularized fit === best fit: y = -43.6588 u + 45.6636 v residual norm = 31.6248 solution norm = 63.1764 chisq/dof = 1.00213 === Regularized fit (L-curve) === optimal lambda: 4.51103 best fit: y = 1.00113 u + 1.0032 v residual norm = 31.6547 solution norm = 1.41728 chisq/dof = 1.04499 === Regularized fit (GCV) === optimal lambda: 0.0232029 best fit: y = -19.8367 u + 21.8417 v residual norm = 31.6332 solution norm = 29.5051 chisq/dof = 1.00314 We see that the ordinary least squares solution is completely wrong, while the L-curve regularized method with the optimal \lambda = 4.51103 finds the correct solution c_1 \approx c_2 \approx 1. The GCV regularized method finds a regularization parameter \lambda = 0.0232029 which is too small to give an accurate solution, although it performs better than OLS. The L-curve and its computed corner, as well as the GCV curve and its minimum are plotted below. The program is given below. #include #include #include #include #include #include int main() { const size_t n = 1000; /* number of observations */ const size_t p = 2; /* number of model parameters */ size_t i; gsl_rng *r = gsl_rng_alloc(gsl_rng_default); gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); for (i = 0; i < n; ++i) { /* generate first random variable u */ double ui = 5.0 * gsl_ran_gaussian(r, 1.0); /* set v = u + noise */ double vi = ui + gsl_ran_gaussian(r, 0.001); /* set y = u + v + noise */ double yi = ui + vi + gsl_ran_gaussian(r, 1.0); /* since u =~ v, the matrix X is ill-conditioned */ gsl_matrix_set(X, i, 0, ui); gsl_matrix_set(X, i, 1, vi); /* rhs vector */ gsl_vector_set(y, i, yi); } { const size_t npoints = 200; /* number of points on L-curve and GCV curve */ gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_vector *c = gsl_vector_alloc(p); /* OLS solution */ gsl_vector *c_lcurve = gsl_vector_alloc(p); /* regularized solution (L-curve) */ gsl_vector *c_gcv = gsl_vector_alloc(p); /* regularized solution (GCV) */ gsl_vector *reg_param = gsl_vector_alloc(npoints); gsl_vector *rho = gsl_vector_alloc(npoints); /* residual norms */ gsl_vector *eta = gsl_vector_alloc(npoints); /* solution norms */ gsl_vector *G = gsl_vector_alloc(npoints); /* GCV function values */ double lambda_l; /* optimal regularization parameter (L-curve) */ double lambda_gcv; /* optimal regularization parameter (GCV) */ double G_gcv; /* G(lambda_gcv) */ size_t reg_idx; /* index of optimal lambda */ double rcond; /* reciprocal condition number of X */ double chisq, rnorm, snorm; /* compute SVD of X */ gsl_multifit_linear_svd(X, w); rcond = gsl_multifit_linear_rcond(w); fprintf(stderr, "matrix condition number = %e\n", 1.0 / rcond); /* unregularized (standard) least squares fit, lambda = 0 */ gsl_multifit_linear_solve(0.0, X, y, c, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0); fprintf(stderr, "=== Unregularized fit ===\n"); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c, 0), gsl_vector_get(c, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate L-curve and find its corner */ gsl_multifit_linear_lcurve(y, reg_param, rho, eta, w); gsl_multifit_linear_lcorner(rho, eta, ®_idx); /* store optimal regularization parameter */ lambda_l = gsl_vector_get(reg_param, reg_idx); /* regularize with lambda_l */ gsl_multifit_linear_solve(lambda_l, X, y, c_lcurve, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_l * snorm, 2.0); fprintf(stderr, "=== Regularized fit (L-curve) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_l); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c_lcurve, 0), gsl_vector_get(c_lcurve, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate GCV curve and find its minimum */ gsl_multifit_linear_gcv(y, reg_param, G, &lambda_gcv, &G_gcv, w); /* regularize with lambda_gcv */ gsl_multifit_linear_solve(lambda_gcv, X, y, c_gcv, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_gcv * snorm, 2.0); fprintf(stderr, "=== Regularized fit (GCV) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_gcv); fprintf(stderr, "best fit: y = %g u + %g v\n", gsl_vector_get(c_gcv, 0), gsl_vector_get(c_gcv, 1)); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* output L-curve and GCV curve */ for (i = 0; i < npoints; ++i) { printf("%e %e %e %e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i), gsl_vector_get(G, i)); } /* output L-curve corner point */ printf("\n\n%f %f\n", gsl_vector_get(rho, reg_idx), gsl_vector_get(eta, reg_idx)); /* output GCV curve corner minimum */ printf("\n\n%e %e\n", lambda_gcv, G_gcv); gsl_multifit_linear_free(w); gsl_vector_free(c); gsl_vector_free(c_lcurve); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); gsl_vector_free(G); } gsl_rng_free(r); gsl_matrix_free(X); gsl_vector_free(y); return 0; }  File: gsl-ref.info, Node: Fitting regularized linear regression example 2, Next: Fitting robust linear regression example, Prev: Fitting regularized linear regression example 1, Up: Fitting Examples 38.8.4 Regularized Linear Regression Example 2 ---------------------------------------------- The following example program minimizes the cost function ||y - X c||^2 + \lambda^2 ||x||^2 where X is the 10-by-8 Hilbert matrix whose entries are given by X_{ij} = 1 / (i + j - 1) and the right hand side vector is given by y = [1,-1,1,-1,1,-1,1,-1,1,-1]^T. Solutions are computed for \lambda = 0 (unregularized) as well as for optimal parameters \lambda chosen by analyzing the L-curve and GCV curve. Here is the program output: matrix condition number = 3.565872e+09 === Unregularized fit === residual norm = 2.15376 solution norm = 2.92217e+09 chisq/dof = 2.31934 === Regularized fit (L-curve) === optimal lambda: 7.11407e-07 residual norm = 2.60386 solution norm = 424507 chisq/dof = 3.43565 === Regularized fit (GCV) === optimal lambda: 1.72278 residual norm = 3.1375 solution norm = 0.139357 chisq/dof = 4.95076 Here we see the unregularized solution results in a large solution norm due to the ill-conditioned matrix. The L-curve solution finds a small value of \lambda = 7.11e-7 which still results in a badly conditioned system and a large solution norm. The GCV method finds a parameter \lambda = 1.72 which results in a well-conditioned system and small solution norm. The L-curve and its computed corner, as well as the GCV curve and its minimum are plotted below. The program is given below. #include #include #include #include #include static int hilbert_matrix(gsl_matrix * m) { const size_t N = m->size1; const size_t M = m->size2; size_t i, j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { gsl_matrix_set(m, i, j, 1.0/(i+j+1.0)); } } return GSL_SUCCESS; } int main() { const size_t n = 10; /* number of observations */ const size_t p = 8; /* number of model parameters */ size_t i; gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); /* construct Hilbert matrix and rhs vector */ hilbert_matrix(X); { double val = 1.0; for (i = 0; i < n; ++i) { gsl_vector_set(y, i, val); val *= -1.0; } } { const size_t npoints = 200; /* number of points on L-curve and GCV curve */ gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_vector *c = gsl_vector_alloc(p); /* OLS solution */ gsl_vector *c_lcurve = gsl_vector_alloc(p); /* regularized solution (L-curve) */ gsl_vector *c_gcv = gsl_vector_alloc(p); /* regularized solution (GCV) */ gsl_vector *reg_param = gsl_vector_alloc(npoints); gsl_vector *rho = gsl_vector_alloc(npoints); /* residual norms */ gsl_vector *eta = gsl_vector_alloc(npoints); /* solution norms */ gsl_vector *G = gsl_vector_alloc(npoints); /* GCV function values */ double lambda_l; /* optimal regularization parameter (L-curve) */ double lambda_gcv; /* optimal regularization parameter (GCV) */ double G_gcv; /* G(lambda_gcv) */ size_t reg_idx; /* index of optimal lambda */ double rcond; /* reciprocal condition number of X */ double chisq, rnorm, snorm; /* compute SVD of X */ gsl_multifit_linear_svd(X, w); rcond = gsl_multifit_linear_rcond(w); fprintf(stderr, "matrix condition number = %e\n", 1.0 / rcond); /* unregularized (standard) least squares fit, lambda = 0 */ gsl_multifit_linear_solve(0.0, X, y, c, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0); fprintf(stderr, "=== Unregularized fit ===\n"); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate L-curve and find its corner */ gsl_multifit_linear_lcurve(y, reg_param, rho, eta, w); gsl_multifit_linear_lcorner(rho, eta, ®_idx); /* store optimal regularization parameter */ lambda_l = gsl_vector_get(reg_param, reg_idx); /* regularize with lambda_l */ gsl_multifit_linear_solve(lambda_l, X, y, c_lcurve, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_l * snorm, 2.0); fprintf(stderr, "=== Regularized fit (L-curve) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_l); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* calculate GCV curve and find its minimum */ gsl_multifit_linear_gcv(y, reg_param, G, &lambda_gcv, &G_gcv, w); /* regularize with lambda_gcv */ gsl_multifit_linear_solve(lambda_gcv, X, y, c_gcv, &rnorm, &snorm, w); chisq = pow(rnorm, 2.0) + pow(lambda_gcv * snorm, 2.0); fprintf(stderr, "=== Regularized fit (GCV) ===\n"); fprintf(stderr, "optimal lambda: %g\n", lambda_gcv); fprintf(stderr, "residual norm = %g\n", rnorm); fprintf(stderr, "solution norm = %g\n", snorm); fprintf(stderr, "chisq/dof = %g\n", chisq / (n - p)); /* output L-curve and GCV curve */ for (i = 0; i < npoints; ++i) { printf("%e %e %e %e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i), gsl_vector_get(G, i)); } /* output L-curve corner point */ printf("\n\n%f %f\n", gsl_vector_get(rho, reg_idx), gsl_vector_get(eta, reg_idx)); /* output GCV curve corner minimum */ printf("\n\n%e %e\n", lambda_gcv, G_gcv); gsl_multifit_linear_free(w); gsl_vector_free(c); gsl_vector_free(c_lcurve); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); gsl_vector_free(G); } gsl_matrix_free(X); gsl_vector_free(y); return 0; }  File: gsl-ref.info, Node: Fitting robust linear regression example, Next: Fitting large linear systems example, Prev: Fitting regularized linear regression example 2, Up: Fitting Examples 38.8.5 Robust Linear Regression Example --------------------------------------- The next program demonstrates the advantage of robust least squares on a dataset with outliers. The program generates linear (x,y) data pairs on the line y = 1.45 x + 3.88, adds some random noise, and inserts 3 outliers into the dataset. Both the robust and ordinary least squares (OLS) coefficients are computed for comparison. #include #include #include int dofit(const gsl_multifit_robust_type *T, const gsl_matrix *X, const gsl_vector *y, gsl_vector *c, gsl_matrix *cov) { int s; gsl_multifit_robust_workspace * work = gsl_multifit_robust_alloc (T, X->size1, X->size2); s = gsl_multifit_robust (X, y, c, cov, work); gsl_multifit_robust_free (work); return s; } int main (int argc, char **argv) { size_t i; size_t n; const size_t p = 2; /* linear fit */ gsl_matrix *X, *cov; gsl_vector *x, *y, *c, *c_ols; const double a = 1.45; /* slope */ const double b = 3.88; /* intercept */ gsl_rng *r; if (argc != 2) { fprintf (stderr,"usage: robfit n\n"); exit (-1); } n = atoi (argv[1]); X = gsl_matrix_alloc (n, p); x = gsl_vector_alloc (n); y = gsl_vector_alloc (n); c = gsl_vector_alloc (p); c_ols = gsl_vector_alloc (p); cov = gsl_matrix_alloc (p, p); r = gsl_rng_alloc(gsl_rng_default); /* generate linear dataset */ for (i = 0; i < n - 3; i++) { double dx = 10.0 / (n - 1.0); double ei = gsl_rng_uniform(r); double xi = -5.0 + i * dx; double yi = a * xi + b; gsl_vector_set (x, i, xi); gsl_vector_set (y, i, yi + ei); } /* add a few outliers */ gsl_vector_set(x, n - 3, 4.7); gsl_vector_set(y, n - 3, -8.3); gsl_vector_set(x, n - 2, 3.5); gsl_vector_set(y, n - 2, -6.7); gsl_vector_set(x, n - 1, 4.1); gsl_vector_set(y, n - 1, -6.0); /* construct design matrix X for linear fit */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); gsl_matrix_set (X, i, 0, 1.0); gsl_matrix_set (X, i, 1, xi); } /* perform robust and OLS fit */ dofit(gsl_multifit_robust_ols, X, y, c_ols, cov); dofit(gsl_multifit_robust_bisquare, X, y, c, cov); /* output data and model */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(y, i); gsl_vector_view v = gsl_matrix_row(X, i); double y_ols, y_rob, y_err; gsl_multifit_robust_est(&v.vector, c, cov, &y_rob, &y_err); gsl_multifit_robust_est(&v.vector, c_ols, cov, &y_ols, &y_err); printf("%g %g %g %g\n", xi, yi, y_rob, y_ols); } #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\n", C(0), C(1)); printf ("# covariance matrix:\n"); printf ("# [ %+.5e, %+.5e\n", COV(0,0), COV(0,1)); printf ("# %+.5e, %+.5e\n", COV(1,0), COV(1,1)); } gsl_matrix_free (X); gsl_vector_free (x); gsl_vector_free (y); gsl_vector_free (c); gsl_vector_free (c_ols); gsl_matrix_free (cov); gsl_rng_free(r); return 0; } The output from the program is shown in the following plot.  File: gsl-ref.info, Node: Fitting large linear systems example, Prev: Fitting robust linear regression example, Up: Fitting Examples 38.8.6 Large Dense Linear Regression Example -------------------------------------------- The following program demostrates the large dense linear least squares solvers. This example is adapted from Trefethen and Bau, and fits the function f(t) = \exp{(\sin^3{(10t)}}) on the interval [0,1] with a degree 15 polynomial. The program generates n = 50000 equally spaced points t_i on this interval, calculates the function value and adds random noise to determine the observation value y_i. The entries of the least squares matrix are X_{ij} = t_i^j, representing a polynomial fit. The matrix is highly ill-conditioned, with a condition number of about 1.4 \cdot 10^{11}. The program accumulates the matrix into the least squares system in 5 blocks, each with 10000 rows. This way the full matrix X is never stored in memory. We solve the system with both the normal equations and TSQR methods. The results are shown in the plot below. In the top left plot, we see the unregularized normal equations solution has larger error than TSQR due to the ill-conditioning of the matrix. In the bottom left plot, we show the L-curve, which exhibits multiple corners. In the top right panel, we plot a regularized solution using \lambda = 10^{-6}. The TSQR and normal solutions now agree, however they are unable to provide a good fit due to the damping. This indicates that for some ill-conditioned problems, regularizing the normal equations does not improve the solution. This is further illustrated in the bottom right panel, where we plot the L-curve calculated from the normal equations. The curve agrees with the TSQR curve for larger damping parameters, but for small \lambda, the normal equations approach cannot provide accurate solution vectors leading to numerical inaccuracies in the left portion of the curve. #include #include #include #include #include #include #include #include /* function to be fitted */ double func(const double t) { double x = sin(10.0 * t); return exp(x*x*x); } /* construct a row of the least squares matrix */ int build_row(const double t, gsl_vector *row) { const size_t p = row->size; double Xj = 1.0; size_t j; for (j = 0; j < p; ++j) { gsl_vector_set(row, j, Xj); Xj *= t; } return 0; } int solve_system(const int print_data, const gsl_multilarge_linear_type * T, const double lambda, const size_t n, const size_t p, gsl_vector * c) { const size_t nblock = 5; /* number of blocks to accumulate */ const size_t nrows = n / nblock; /* number of rows per block */ gsl_multilarge_linear_workspace * w = gsl_multilarge_linear_alloc(T, p); gsl_matrix *X = gsl_matrix_alloc(nrows, p); gsl_vector *y = gsl_vector_alloc(nrows); gsl_rng *r = gsl_rng_alloc(gsl_rng_default); const size_t nlcurve = 200; gsl_vector *reg_param = gsl_vector_alloc(nlcurve); gsl_vector *rho = gsl_vector_alloc(nlcurve); gsl_vector *eta = gsl_vector_alloc(nlcurve); size_t rowidx = 0; double rnorm, snorm, rcond; double t = 0.0; double dt = 1.0 / (n - 1.0); while (rowidx < n) { size_t nleft = n - rowidx; /* number of rows left to accumulate */ size_t nr = GSL_MIN(nrows, nleft); /* number of rows in this block */ gsl_matrix_view Xv = gsl_matrix_submatrix(X, 0, 0, nr, p); gsl_vector_view yv = gsl_vector_subvector(y, 0, nr); size_t i; /* build (X,y) block with 'nr' rows */ for (i = 0; i < nr; ++i) { gsl_vector_view row = gsl_matrix_row(&Xv.matrix, i); double fi = func(t); double ei = gsl_ran_gaussian (r, 0.1 * fi); /* noise */ double yi = fi + ei; /* construct this row of LS matrix */ build_row(t, &row.vector); /* set right hand side value with added noise */ gsl_vector_set(&yv.vector, i, yi); if (print_data && (i % 100 == 0)) printf("%f %f\n", t, yi); t += dt; } /* accumulate (X,y) block into LS system */ gsl_multilarge_linear_accumulate(&Xv.matrix, &yv.vector, w); rowidx += nr; } if (print_data) printf("\n\n"); /* compute L-curve */ gsl_multilarge_linear_lcurve(reg_param, rho, eta, w); /* solve large LS system and store solution in c */ gsl_multilarge_linear_solve(lambda, c, &rnorm, &snorm, w); /* compute reciprocal condition number */ gsl_multilarge_linear_rcond(&rcond, w); fprintf(stderr, "=== Method %s ===\n", gsl_multilarge_linear_name(w)); fprintf(stderr, "condition number = %e\n", 1.0 / rcond); fprintf(stderr, "residual norm = %e\n", rnorm); fprintf(stderr, "solution norm = %e\n", snorm); /* output L-curve */ { size_t i; for (i = 0; i < nlcurve; ++i) { printf("%.12e %.12e %.12e\n", gsl_vector_get(reg_param, i), gsl_vector_get(rho, i), gsl_vector_get(eta, i)); } printf("\n\n"); } gsl_matrix_free(X); gsl_vector_free(y); gsl_multilarge_linear_free(w); gsl_rng_free(r); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); return 0; } int main(int argc, char *argv[]) { const size_t n = 50000; /* number of observations */ const size_t p = 16; /* polynomial order + 1 */ double lambda = 0.0; /* regularization parameter */ gsl_vector *c_tsqr = gsl_vector_alloc(p); gsl_vector *c_normal = gsl_vector_alloc(p); if (argc > 1) lambda = atof(argv[1]); /* solve system with TSQR method */ solve_system(1, gsl_multilarge_linear_tsqr, lambda, n, p, c_tsqr); /* solve system with Normal equations method */ solve_system(0, gsl_multilarge_linear_normal, lambda, n, p, c_normal); /* output solutions */ { gsl_vector *v = gsl_vector_alloc(p); double t; for (t = 0.0; t <= 1.0; t += 0.01) { double f_exact = func(t); double f_tsqr, f_normal; build_row(t, v); gsl_blas_ddot(v, c_tsqr, &f_tsqr); gsl_blas_ddot(v, c_normal, &f_normal); printf("%f %e %e %e\n", t, f_exact, f_tsqr, f_normal); } gsl_vector_free(v); } gsl_vector_free(c_tsqr); gsl_vector_free(c_normal); return 0; }  File: gsl-ref.info, Node: Fitting References and Further Reading, Prev: Fitting Examples, Up: Least-Squares Fitting 38.9 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) 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, . More information on Tikhonov regularization can be found in Hansen, P. C. (1998), Rank-Deficient and Discrete Ill-Posed Problems: Numerical Aspects of Linear Inversion. SIAM Monogr. on Mathematical Modeling and Computation, Society for Industrial and Applied Mathematics M. Rezghi and S. M. Hosseini (2009), A new variant of L-curve for Tikhonov regularization, Journal of Computational and Applied Mathematics, Volume 231, Issue 2, pages 914-924. The GSL implementation of robust linear regression closely follows the publications DuMouchel, W. and F. O'Brien (1989), "Integrating a robust option into a multiple regression computing environment," Computer Science and Statistics: Proceedings of the 21st Symposium on the Interface, American Statistical Association Street, J.O., R.J. Carroll, and D. Ruppert (1988), "A note on computing robust regression estimates via iteratively reweighted least squares," The American Statistician, v. 42, pp. 152-154. More information about the normal equations and TSQR approach for solving large linear least squares systems can be found in the publications Trefethen, L. N. and Bau, D. (1997), "Numerical Linear Algebra", SIAM. Demmel, J., Grigori, L., Hoemmen, M. F., and Langou, J. "Communication-optimal parallel and sequential QR and LU factorizations", UCB Technical Report No. UCB/EECS-2008-89, 2008.  File: gsl-ref.info, Node: Nonlinear Least-Squares Fitting, Next: Basis Splines, Prev: Least-Squares Fitting, Up: Top 39 Nonlinear Least-Squares Fitting ********************************** This chapter describes functions for multidimensional nonlinear least-squares fitting. There are generally two classes of algorithms for solving nonlinear least squares problems, which fall under line search methods and trust region methods. GSL currently implements only trust region methods and provides the user with full access to intermediate steps of the iteration. The user also has the ability to tune a number of parameters which affect low-level aspects of the algorithm which can help to accelerate convergence for the specific problem at hand. GSL provides two separate interfaces for nonlinear least squares fitting. The first is designed for small to moderate sized problems, and the second is designed for very large problems, which may or may not have significant sparse structure. The header file 'gsl_multifit_nlinear.h' contains prototypes for the multidimensional nonlinear fitting functions and related declarations relating to the small to moderate sized systems. The header file 'gsl_multilarge_nlinear.h' contains prototypes for the multidimensional nonlinear fitting functions and related declarations relating to large systems. * Menu: * Nonlinear Least-Squares Overview:: * Nonlinear Least-Squares TRS Overview:: * Nonlinear Least-Squares Weighted Overview:: * Nonlinear Least-Squares Tunable Parameters:: * Nonlinear Least-Squares Initialization:: * Nonlinear Least-Squares Function Definition:: * Nonlinear Least-Squares Iteration:: * Nonlinear Least-Squares Testing for Convergence:: * Nonlinear Least-Squares High Level Driver:: * Nonlinear Least-Squares Covariance Matrix:: * Nonlinear Least-Squares Troubleshooting:: * Nonlinear Least-Squares Examples:: * Nonlinear Least-Squares References and Further Reading::  File: gsl-ref.info, Node: Nonlinear Least-Squares Overview, Next: Nonlinear Least-Squares TRS Overview, Up: Nonlinear Least-Squares Fitting 39.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 In trust region methods, the objective (or cost) function \Phi(x) is approximated by a model function m_k(\delta) in the vicinity of some point x_k. The model function is often simply a second order Taylor series expansion around the point x_k, ie: \Phi(x_k + \delta) ~=~ m_k(\delta) = \Phi(x_k) + g_k^T \delta + 1/2 \delta^T B_k \delta where g_k = \nabla \Phi(x_k) = J^T f is the gradient vector at the point x_k, B_k = \nabla^2 \Phi(x_k) is the Hessian matrix at x_k, or some approximation to it, and J is the n-by-p Jacobian matrix J_{ij} = d f_i / d x_j. In order to find the next step \delta, we minimize the model function m_k(\delta), but search for solutions only within a region where we trust that m_k(\delta) is a good approximation to the objective function \Phi(x_k + \delta). In other words, we seek a solution of the trust region subproblem (TRS) \min_(\delta \in R^p) m_k(\delta), s.t. || D_k \delta || <= \Delta_k where \Delta_k > 0 is the trust region radius and D_k is a scaling matrix. If D_k = I, then the trust region is a ball of radius \Delta_k centered at x_k. In some applications, the parameter vector x may have widely different scales. For example, one parameter might be a temperature on the order of 10^3 K, while another might be a length on the order of 10^{-6} m. In such cases, a spherical trust region may not be the best choice, since if \Phi changes rapidly along directions with one scale, and more slowly along directions with a different scale, the model function m_k may be a poor approximation to \Phi along the rapidly changing directions. In such problems, it may be best to use an elliptical trust region, by setting D_k to a diagonal matrix whose entries are designed so that the scaled step D_k \delta has entries of approximately the same order of magnitude. The trust region subproblem above normally amounts to solving a linear least squares system (or multiple systems) for the step \delta. Once \delta is computed, it is checked whether or not it reduces the objective function \Phi(x). A useful statistic for this is to look at the ratio \rho_k = ( \Phi(x_k) - \Phi(x_k + \delta_k) / ( m_k(0) - m_k(\delta_k) ) where the numerator is the actual reduction of the objective function due to the step \delta_k, and the denominator is the predicted reduction due to the model m_k. If \rho_k is negative, it means that the step \delta_k increased the objective function and so it is rejected. If \rho_k is positive, then we have found a step which reduced the objective function and it is accepted. Furthermore, if \rho_k is close to 1, then this indicates that the model function is a good approximation to the objective function in the trust region, and so on the next iteration the trust region is enlarged in order to take more ambitious steps. When a step is rejected, the trust region is made smaller and the TRS is solved again. An outline for the general trust region method used by GSL can now be given. Trust Region Algorithm 1. Initialize: given x_0, construct m_0(\delta), D_0 and \Delta_0 > 0 2. For k = 0, 1, 2, ... a. If converged, then stop b. Solve TRS for trial step \delta_k c. Evaluate trial step by computing \rho_k 1. if step is accepted, set x_{k+1} = x_k + \delta_k and increase radius, \Delta_{k+1} = \alpha \Delta_k 2. if step is rejected, set x_{k+1} = x_k and decrease radius, \Delta_{k+1} = {\Delta_k \over \beta}; goto 2(b) d. Construct m_{k+1}(\delta) and D_{k+1} GSL offers the user a number of different algorithms for solving the trust region subproblem in 2(b), as well as different choices of scaling matrices D_k and different methods of updating the trust region radius \Delta_k. Therefore, while reasonable default methods are provided, the user has a lot of control to fine-tune the various steps of the algorithm for their specific problem.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Overview, Next: Nonlinear Least-Squares Weighted Overview, Prev: Nonlinear Least-Squares Overview, Up: Nonlinear Least-Squares Fitting 39.2 Solving the Trust Region Subproblem (TRS) ============================================== * Menu: * Nonlinear Least-Squares TRS Levenberg-Marquardt:: * Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration:: * Nonlinear Least-Squares TRS Dogleg:: * Nonlinear Least-Squares TRS Double Dogleg:: * Nonlinear Least-Squares TRS 2D Subspace:: * Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient:: Below we describe the methods available for solving the trust region subproblem. The methods available provide either exact or approximate solutions to the trust region subproblem. In all algorithms below, the Hessian matrix B_k is approximated as B_k \approx J_k^T J_k, where J_k = J(x_k). In all methods, the solution of the TRS involves solving a linear least squares system involving the Jacobian matrix. For small to moderate sized problems ('gsl_multifit_nlinear' interface), this is accomplished by factoring the full Jacobian matrix, which is provided by the user, with the Cholesky, QR, or SVD decompositions. For large systems ('gsl_multilarge_nlinear' interface), the user has two choices. One is to solve the system iteratively, without needing to store the full Jacobian matrix in memory. With this method, the user must provide a routine to calculate the matrix-vector products J u or J^T u for a given vector u. This iterative method is particularly useful for systems where the Jacobian has sparse structure, since forming matrix-vector products can be done cheaply. The second option for large systems involves forming the normal equations matrix J^T J and then factoring it using a Cholesky decomposition. The normal equations matrix is p-by-p, typically much smaller than the full n-by-p Jacobian, and can usually be stored in memory even if the full Jacobian matrix cannot. This option is useful for large, dense systems, or if the iterative method has difficulty converging.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Levenberg-Marquardt, Next: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration, Up: Nonlinear Least-Squares TRS Overview 39.2.1 Levenberg-Marquardt -------------------------- There is a theorem which states that if \delta_k is a solution to the trust region subproblem given above, then there exists \mu_k \ge 0 such that ( B_k + \mu_k D_k^T D_k ) \delta_k = -g_k with \mu_k (\Delta_k - ||D_k \delta_k||) = 0. This forms the basis of the Levenberg-Marquardt algorithm, which controls the trust region size by adjusting the parameter \mu_k rather than the radius \Delta_k directly. For each radius \Delta_k, there is a unique parameter \mu_k which solves the TRS, and they have an inverse relationship, so that large values of \mu_k correspond to smaller trust regions, while small values of \mu_k correspond to larger trust regions. With the approximation B_k \approx J_k^T J_k, on each iteration, in order to calculate the step \delta_k, the following linear least squares problem is solved: [J_k; sqrt(mu_k) D_k] \delta_k = - [f_k; 0] If the step \delta_k is accepted, then \mu_k is decreased on the next iteration in order to take a larger step, otherwise it is increased to take a smaller step. The Levenberg-Marquardt algorithm provides an exact solution of the trust region subproblem, but typically has a higher computational cost per iteration than the approximate methods discussed below, since it may need to solve the least squares system above several times for different values of \mu_k.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration, Next: Nonlinear Least-Squares TRS Dogleg, Prev: Nonlinear Least-Squares TRS Levenberg-Marquardt, Up: Nonlinear Least-Squares TRS Overview 39.2.2 Levenberg-Marquardt with Geodesic Acceleration ----------------------------------------------------- This method applies a so-called geodesic acceleration correction to the standard Levenberg-Marquardt step \delta_k (Transtrum et al, 2011). By interpreting \delta_k as a first order step along a geodesic in the model parameter space (ie: a velocity \delta_k = v_k), the geodesic acceleration a_k is a second order correction along the geodesic which is determined by solving the linear least squares system [J_k; sqrt(mu_k) D_k] a_k = - [f_vv(x_k); 0] where f_{vv} is the second directional derivative of the residual vector in the velocity direction v, f_{vv}(x) = D_v^2 f = \sum_{\alpha\beta} v_{\alpha} v_{\beta} \partial_{\alpha} \partial_{\beta} f(x), where \alpha and \beta are summed over the p parameters. The new total step is then \delta_k' = v_k + {1 \over 2}a_k. The second order correction a_k can be calculated with a modest additional cost, and has been shown to dramatically reduce the number of iterations (and expensive Jacobian evaluations) required to reach convergence on a variety of different problems. In order to utilize the geodesic acceleration, the user must supply a function which provides the second directional derivative vector f_{vv}(x), or alternatively the library can use a finite difference method to estimate this vector with one additional function evaluation of f(x + h v) where h is a tunable step size (see the 'h_fvv' parameter description).  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Dogleg, Next: Nonlinear Least-Squares TRS Double Dogleg, Prev: Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration, Up: Nonlinear Least-Squares TRS Overview 39.2.3 Dogleg ------------- This is Powell's dogleg method, which finds an approximate solution to the trust region subproblem, by restricting its search to a piecewise linear "dogleg" path, composed of the origin, the Cauchy point which represents the model minimizer along the steepest descent direction, and the Gauss-Newton point, which is the overall minimizer of the unconstrained model. The Gauss-Newton step is calculated by solving J_k \delta_gn = -f_k which is the main computational task for each iteration, but only needs to be performed once per iteration. If the Gauss-Newton point is inside the trust region, it is selected as the step. If it is outside, the method then calculates the Cauchy point, which is located along the gradient direction. If the Cauchy point is also outside the trust region, the method assumes that it is still far from the minimum and so proceeds along the gradient direction, truncating the step at the trust region boundary. If the Cauchy point is inside the trust region, with the Gauss-Newton point outside, the method uses a dogleg step, which is a linear combination of the gradient direction and the Gauss-Newton direction, stopping at the trust region boundary.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Double Dogleg, Next: Nonlinear Least-Squares TRS 2D Subspace, Prev: Nonlinear Least-Squares TRS Dogleg, Up: Nonlinear Least-Squares TRS Overview 39.2.4 Double Dogleg -------------------- This method is an improvement over the classical dogleg algorithm, which attempts to include information about the Gauss-Newton step while the iteration is still far from the minimum. When the Cauchy point is inside the trust region and the Gauss-Newton point is outside, the method computes a scaled Gauss-Newton point and then takes a dogleg step between the Cauchy point and the scaled Gauss-Newton point. The scaling is calculated to ensure that the reduction in the model m_k is about the same as the reduction provided by the Cauchy point.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS 2D Subspace, Next: Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient, Prev: Nonlinear Least-Squares TRS Double Dogleg, Up: Nonlinear Least-Squares TRS Overview 39.2.5 Two Dimensional Subspace ------------------------------- The dogleg methods restrict the search for the TRS solution to a 1D curve defined by the Cauchy and Gauss-Newton points. An improvement to this is to search for a solution using the full two dimensional subspace spanned by the Cauchy and Gauss-Newton directions. The dogleg path is of course inside this subspace, and so this method solves the TRS at least as accurately as the dogleg methods. Since this method searches a larger subspace for a solution, it can converge more quickly than dogleg on some problems. Because the subspace is only two dimensional, this method is very efficient and the main computation per iteration is to determine the Gauss-Newton point.  File: gsl-ref.info, Node: Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient, Prev: Nonlinear Least-Squares TRS 2D Subspace, Up: Nonlinear Least-Squares TRS Overview 39.2.6 Steihaug-Toint Conjugate Gradient ---------------------------------------- One difficulty of the dogleg methods is calculating the Gauss-Newton step when the Jacobian matrix is singular. The Steihaug-Toint method also computes a generalized dogleg step, but avoids solving for the Gauss-Newton step directly, instead using an iterative conjugate gradient algorithm. This method performs well at points where the Jacobian is singular, and is also suitable for large-scale problems where factoring the Jacobian matrix could be prohibitively expensive.  File: gsl-ref.info, Node: Nonlinear Least-Squares Weighted Overview, Next: Nonlinear Least-Squares Tunable Parameters, Prev: Nonlinear Least-Squares TRS Overview, Up: Nonlinear Least-Squares Fitting 39.3 Weighted Nonlinear Least-Squares ===================================== Weighted nonlinear least-squares fitting minimizes the function \Phi(x) = (1/2) || f(x) ||_W^2 = (1/2) \sum_{i=1}^{n} f_i(x_1, ..., x_p)^2 where W = diag(w_1,w_2,...,w_n) is the weighting matrix, and ||f||_W^2 = f^T W f. The weights w_i are commonly defined as w_i = 1/\sigma_i^2, where \sigma_i is the error in the ith measurement. A simple change of variables \tilde{f} = W^{1 \over 2} f yields \Phi(x) = {1 \over 2} ||\tilde{f}||^2, which is in the same form as the unweighted case. The user can either perform this transform directly on their function residuals and Jacobian, or use the 'gsl_multifit_nlinear_winit' interface which automatically performs the correct scaling. To manually perform this transformation, the residuals and Jacobian should be modified according to f~_i = f_i / \sigma_i J~_ij = 1 / \sigma_i df_i/dx_j For large systems, the user must perform their own weighting.  File: gsl-ref.info, Node: Nonlinear Least-Squares Tunable Parameters, Next: Nonlinear Least-Squares Initialization, Prev: Nonlinear Least-Squares Weighted Overview, Up: Nonlinear Least-Squares Fitting 39.4 Tunable Parameters ======================= The user can tune nearly all aspects of the iteration at allocation time. For the 'gsl_multifit_nlinear' interface, the user may modify the 'gsl_multifit_nlinear_parameters' structure, which is defined as follows: typedef struct { const gsl_multifit_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multifit_nlinear_scale *scale; /* scaling method */ const gsl_multifit_nlinear_solver *solver; /* solver method */ gsl_multifit_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ } gsl_multifit_nlinear_parameters; For the 'gsl_multilarge_nlinear' interface, the user may modify the 'gsl_multilarge_nlinear_parameters' structure, which is defined as follows: typedef struct { const gsl_multilarge_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multilarge_nlinear_scale *scale; /* scaling method */ const gsl_multilarge_nlinear_solver *solver; /* solver method */ gsl_multilarge_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ size_t max_iter; /* maximum iterations for trs method */ double tol; /* tolerance for solving trs */ } gsl_multilarge_nlinear_parameters; Each of these parameters is discussed in further detail below. -- Parameter: const gsl_multifit_nlinear_trs * trs -- Parameter: const gsl_multilarge_nlinear_trs * trs This parameter determines the method used to solve the trust region subproblem, and may be selected from the following choices, -- Default: gsl_multifit_nlinear_trs_lm -- Default: gsl_multilarge_nlinear_trs_lm This selects the Levenberg-Marquardt algorithm. -- Option: gsl_multifit_nlinear_trs_lmaccel -- Option: gsl_multilarge_nlinear_trs_lmaccel This selects the Levenberg-Marquardt algorithm with geodesic acceleration. -- Option: gsl_multifit_nlinear_trs_dogleg -- Option: gsl_multilarge_nlinear_trs_dogleg This selects the dogleg algorithm. -- Option: gsl_multifit_nlinear_trs_ddogleg -- Option: gsl_multilarge_nlinear_trs_ddogleg This selects the double dogleg algorithm. -- Option: gsl_multifit_nlinear_trs_subspace2D -- Option: gsl_multilarge_nlinear_trs_subspace2D This selects the 2D subspace algorithm. -- Option: gsl_multilarge_nlinear_trs_cgst This selects the Steihaug-Toint conjugate gradient algorithm. This method is available only for large systems. -- Parameter: const gsl_multifit_nlinear_scale * scale -- Parameter: const gsl_multilarge_nlinear_scale * scale This parameter determines the diagonal scaling matrix D and may be selected from the following choices, -- Default: gsl_multifit_nlinear_scale_more -- Default: gsl_multilarge_nlinear_scale_more This damping strategy was suggested by More', and corresponds to D^T D = max(diag(J^T J)), in other words the maximum elements of diag(J^T J) encountered thus far in the iteration. This choice of D makes the problem scale-invariant, so that if the model parameters x_i are each scaled by an arbitrary constant, \tilde{x}_i = a_i x_i, then the sequence of iterates produced by the algorithm would be unchanged. This method can work very well in cases where the model parameters have widely different scales (ie: if some parameters are measured in nanometers, while others are measured in degrees Kelvin). This strategy has been proven effective on a large class of problems and so it is the library default, but it may not be the best choice for all problems. -- Option: gsl_multifit_nlinear_scale_levenberg -- Option: gsl_multilarge_nlinear_scale_levenberg This damping strategy was originally suggested by Levenberg, and corresponds to D^T D = I. This method has also proven effective on a large class of problems, but is not scale-invariant. However, some authors (e.g. Transtrum and Sethna 2012) argue that this choice is better for problems which are susceptible to parameter evaporation (ie: parameters go to infinity) -- Option: gsl_multifit_nlinear_scale_marquardt -- Option: gsl_multilarge_nlinear_scale_marquardt This damping strategy was suggested by Marquardt, and corresponds to D^T D = diag(J^T J). This method is scale-invariant, but it is generally considered inferior to both the Levenberg and More' strategies, though may work well on certain classes of problems. -- Parameter: const gsl_multifit_nlinear_solver * solver -- Parameter: const gsl_multilarge_nlinear_solver * solver Solving the trust region subproblem on each iteration almost always requires the solution of the following linear least squares system [J; sqrt(mu) D] \delta = - [f; 0] The SOLVER parameter determines how the system is solved and can be selected from the following choices: -- Default: gsl_multifit_nlinear_solver_qr This method solves the system using a rank revealing QR decomposition of the Jacobian J. This method will produce reliable solutions in cases where the Jacobian is rank deficient or near-singular but does require about twice as many operations as the Cholesky method discussed below. -- Option: gsl_multifit_nlinear_solver_cholesky -- Default: gsl_multilarge_nlinear_solver_cholesky This method solves the alternate normal equations problem ( J^T J + \mu D^T D ) \delta = -J^T f by using a Cholesky decomposition of the matrix J^T J + \mu D^T D. This method is faster than the QR approach, however it is susceptible to numerical instabilities if the Jacobian matrix is rank deficient or near-singular. In these cases, an attempt is made to reduce the condition number of the matrix using Jacobi preconditioning, but for highly ill-conditioned problems the QR approach is better. If it is known that the Jacobian matrix is well conditioned, this method is accurate and will perform faster than the QR approach. -- Option: gsl_multifit_nlinear_solver_svd This method solves the system using a singular value decomposition of the Jacobian J. This method will produce the most reliable solutions for ill-conditioned Jacobians but is also the slowest solver method. -- Parameter: gsl_multifit_nlinear_fdtype fdtype This parameter specifies whether to use forward or centered differences when approximating the Jacobian. This is only used when an analytic Jacobian is not provided to the solver. This parameter may be set to one of the following choices. -- Default: GSL_MULTIFIT_NLINEAR_FWDIFF This specifies a forward finite difference to approximate the Jacobian matrix. The Jacobian matrix will be calculated as J_ij = 1 / \Delta_j ( f_i(x + \Delta_j e_j) - f_i(x) ) where \Delta_j = h |x_j| and e_j is the standard jth Cartesian unit basis vector so that x + \Delta_j e_j represents a small (forward) perturbation of the jth parameter by an amount \Delta_j. The perturbation \Delta_j is proportional to the current value |x_j| which helps to calculate an accurate Jacobian when the various parameters have different scale sizes. The value of h is specified by the 'h_df' parameter. The accuracy of this method is O(h), and evaluating this matrix requires an additional p function evaluations. -- Option: GSL_MULTIFIT_NLINEAR_CTRDIFF This specifies a centered finite difference to approximate the Jacobian matrix. The Jacobian matrix will be calculated as J_ij = 1 / \Delta_j ( f_i(x + 1/2 \Delta_j e_j) - f_i(x - 1/2 \Delta_j e_j) ) See above for a description of \Delta_j. The accuracy of this method is O(h^2), but evaluating this matrix requires an additional 2p function evaluations. -- Parameter: double factor_up When a step is accepted, the trust region radius will be increased by this factor. The default value is 3. -- Parameter: double factor_down When a step is rejected, the trust region radius will be decreased by this factor. The default value is 2. -- Parameter: double avmax When using geodesic acceleration to solve a nonlinear least squares problem, an important parameter to monitor is the ratio of the acceleration term to the velocity term, |a| / |v| If this ratio is small, it means the acceleration correction is contributing very little to the step. This could be because the problem is not "nonlinear" enough to benefit from the acceleration. If the ratio is large (> 1) it means that the acceleration is larger than the velocity, which shouldn't happen since the step represents a truncated series and so the second order term a should be smaller than the first order term v to guarantee convergence. Therefore any steps with a ratio larger than the parameter AVMAX are rejected. AVMAX is set to 0.75 by default. For problems which experience difficulty converging, this threshold could be lowered. -- Parameter: double h_df This parameter specifies the step size for approximating the Jacobian matrix with finite differences. It is set to \sqrt{\epsilon} by default, where \epsilon is 'GSL_DBL_EPSILON'. -- Parameter: double h_fvv When using geodesic acceleration, the user must either supply a function to calculate f_{vv}(x) or the library can estimate this second directional derivative using a finite difference method. When using finite differences, the library must calculate f(x + h v) where h represents a small step in the velocity direction. The parameter H_FVV defines this step size and is set to 0.02 by default.  File: gsl-ref.info, Node: Nonlinear Least-Squares Initialization, Next: Nonlinear Least-Squares Function Definition, Prev: Nonlinear Least-Squares Tunable Parameters, Up: Nonlinear Least-Squares Fitting 39.5 Initializing the Solver ============================ -- Function: gsl_multifit_nlinear_workspace * gsl_multifit_nlinear_alloc (const gsl_multifit_nlinear_type * T, const gsl_multifit_nlinear_parameters * PARAMS, const size_t N, const size_t P) -- Function: gsl_multilarge_nlinear_workspace * gsl_multilarge_nlinear_alloc (const gsl_multilarge_nlinear_type * T, const gsl_multilarge_nlinear_parameters * PARAMS, const size_t N, const size_t P) These functions return a pointer to a newly allocated instance of a derivative solver of type T for N observations and P parameters. The PARAMS input specifies a tunable set of parameters which will affect important details in each iteration of the trust region subproblem algorithm. It is recommended to start with the suggested default parameters (see 'gsl_multifit_nlinear_default_parameters' and 'gsl_multilarge_nlinear_default_parameters') and then tune the parameters once the code is working correctly. See *note Nonlinear Least-Squares Tunable Parameters:: for descriptions of the various parameters. For example, the following code creates an instance of a Levenberg-Marquardt solver for 100 data points and 3 parameters, using suggested defaults: const gsl_multifit_nlinear_type * T = gsl_multifit_nlinear_lm; gsl_multifit_nlinear_parameters params = gsl_multifit_nlinear_default_parameters(); gsl_multifit_nlinear_workspace * w = gsl_multifit_nlinear_alloc (T, ¶ms, 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: gsl_multifit_nlinear_parameters gsl_multifit_nlinear_default_parameters (void) -- Function: gsl_multilarge_nlinear_parameters gsl_multilarge_nlinear_default_parameters (void) These functions return a set of recommended default parameters for use in solving nonlinear least squares problems. The user can tune each parameter to improve the performance on their particular problem, see *note Nonlinear Least-Squares Tunable Parameters::. -- Function: int gsl_multifit_nlinear_init (const gsl_vector * X, gsl_multifit_nlinear_fdf * FDF, gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multifit_nlinear_winit (const gsl_vector * X, const gsl_vector * WTS, gsl_multifit_nlinear_fdf * FDF, gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_init (const gsl_vector * X, gsl_multilarge_nlinear_fdf * FDF, gsl_multilarge_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_winit (const gsl_vector * X, const gsl_vector * WTS, gsl_multilarge_nlinear_fdf * FDF, gsl_multilarge_nlinear_workspace * W) These functions initialize, or reinitialize, an existing workspace W to use the system FDF and the initial guess X. See *note Nonlinear Least-Squares Function Definition:: for a description of the FDF structure. Optionally, a weight vector WTS can be given to perform a weighted nonlinear regression. Here, the weighting matrix is W = diag(w_1,w_2,...,w_n). -- Function: void gsl_multifit_nlinear_free (gsl_multifit_nlinear_workspace * W) -- Function: void gsl_multilarge_nlinear_free (gsl_multilarge_nlinear_workspace * W) These functions free all the memory associated with the workspace W. -- Function: const char * gsl_multifit_nlinear_name (const gsl_multifit_nlinear_workspace * W) -- Function: const char * gsl_multilarge_nlinear_name (const gsl_multilarge_nlinear_workspace * W) These functions return a pointer to the name of the solver. For example, printf ("w is a '%s' solver\n", gsl_multifit_nlinear_name (w)); would print something like 'w is a 'trust-region' solver'. -- Function: const char * gsl_multifit_nlinear_trs_name (const gsl_multifit_nlinear_workspace * W) -- Function: const char * gsl_multilarge_nlinear_trs_name (const gsl_multilarge_nlinear_workspace * W) These functions return a pointer to the name of the trust region subproblem method. For example, printf ("w is a '%s' solver\n", gsl_multifit_nlinear_trs_name (w)); would print something like 'w is a 'levenberg-marquardt' solver'.  File: gsl-ref.info, Node: Nonlinear Least-Squares Function Definition, Next: Nonlinear Least-Squares Iteration, Prev: Nonlinear Least-Squares Initialization, Up: Nonlinear Least-Squares Fitting 39.6 Providing the Function to be Minimized =========================================== The user must provide n functions of p variables for the minimization algorithm to operate on. In order to allow for arbitrary parameters the functions are defined by the following data types: -- Data Type: gsl_multifit_nlinear_fdf This data type defines a general system of functions with arbitrary parameters, the corresponding Jacobian matrix of derivatives, and optionally the second directional derivative of the functions for geodesic acceleration. 'int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)' This function should store the n components of the vector f(x) 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) / d x_j in J for argument X and arbitrary parameters PARAMS, returning an appropriate error code if the matrix cannot be computed. If an analytic Jacobian is unavailable, or too expensive to compute, this function pointer may be set to NULL, in which case the Jacobian will be internally computed using finite difference approximations of the function F. 'int (* fvv) (const gsl_vector * X, const gsl_vector * V, void * PARAMS, gsl_vector * FVV)' When geodesic acceleration is enabled, this function should store the n components of the vector f_{vv}(x) = \sum_{\alpha\beta} v_{\alpha} v_{\beta} {\partial \over \partial x_{\alpha}} {\partial \over \partial x_{\beta}} f(x), representing second directional derivatives of the function to be minimized, into the output FVV. The parameter vector is provided in X and the velocity vector is provided in V, both of which have p components. The arbitrary parameters are given in PARAMS. If analytic expressions for f_{vv}(x) are unavailable or too difficult to compute, this function pointer may be set to NULL, in which case f_{vv}(x) will be computed internally using a finite difference approximation. '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. 'size_t nevalf' This does not need to be set by the user. It counts the number of function evaluations and is initialized by the '_init' function. 'size_t nevaldf' This does not need to be set by the user. It counts the number of Jacobian evaluations and is initialized by the '_init' function. 'size_t nevalfvv' This does not need to be set by the user. It counts the number of f_{vv}(x) evaluations and is initialized by the '_init' function. -- Data Type: gsl_multilarge_nlinear_fdf This data type defines a general system of functions with arbitrary parameters, a function to compute J u or J^T u for a given vector u, the normal equations matrix J^T J, and optionally the second directional derivative of the functions for geodesic acceleration. 'int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)' This function should store the n components of the vector f(x) in F for argument X and arbitrary parameters PARAMS, returning an appropriate error code if the function cannot be computed. 'int (* df) (CBLAS_TRANSPOSE_t TRANSJ, const gsl_vector * X, const gsl_vector * U, void * PARAMS, gsl_vector * V, gsl_matrix * JTJ)' If TRANSJ is equal to 'CblasNoTrans', then this function should compute the matrix-vector product J u and store the result in V. If TRANSJ is equal to 'CblasTrans', then this function should compute the matrix-vector product J^T u and store the result in V. Additionally, the normal equations matrix J^T J should be stored in the lower half of JTJ. The input matrix JTJ could be set to NULL, for example by iterative methods which do not require this matrix, so the user should check for this prior to constructing the matrix. The input PARAMS contains the arbitrary parameters. 'int (* fvv) (const gsl_vector * X, const gsl_vector * V, void * PARAMS, gsl_vector * FVV)' When geodesic acceleration is enabled, this function should store the n components of the vector f_{vv}(x) = \sum_{\alpha\beta} v_{\alpha} v_{\beta} {\partial \over \partial x_{\alpha}} {\partial \over \partial x_{\beta}} f(x), representing second directional derivatives of the function to be minimized, into the output FVV. The parameter vector is provided in X and the velocity vector is provided in V, both of which have p components. The arbitrary parameters are given in PARAMS. If analytic expressions for f_{vv}(x) are unavailable or too difficult to compute, this function pointer may be set to NULL, in which case f_{vv}(x) will be computed internally using a finite difference approximation. '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. 'size_t nevalf' This does not need to be set by the user. It counts the number of function evaluations and is initialized by the '_init' function. 'size_t nevaldfu' This does not need to be set by the user. It counts the number of Jacobian matrix-vector evaluations (J u or J^T u) and is initialized by the '_init' function. 'size_t nevaldf2' This does not need to be set by the user. It counts the number of J^T J evaluations and is initialized by the '_init' function. 'size_t nevalfvv' This does not need to be set by the user. It counts the number of f_{vv}(x) evaluations and is initialized by the '_init' 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: Nonlinear Least-Squares Iteration, Next: Nonlinear Least-Squares Testing for Convergence, Prev: Nonlinear Least-Squares Function Definition, Up: Nonlinear Least-Squares Fitting 39.7 Iteration ============== The following functions drive the iteration of each algorithm. Each function performs one iteration of the trust region method and updates the state of the solver. -- Function: int gsl_multifit_nlinear_iterate (gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_iterate (gsl_multilarge_nlinear_workspace * W) These functions perform a single iteration of the solver W. If the iteration encounters an unexpected problem then an error code will be returned. The solver workspace maintains a current estimate of the best-fit parameters at all times. The solver workspace W contains the following entries, which can be used to track the progress of the solution: 'gsl_vector * x' The current position, length p. 'gsl_vector * f' The function residual vector at the current position f(x), length n. 'gsl_matrix * J' The Jacobian matrix at the current position J(x), size n-by-p (only for 'gsl_multifit_nlinear' interface). 'gsl_vector * dx' The difference between the current position and the previous position, i.e. the last step \delta, taken as a vector, length p. These quantities can be accessed with the following functions, -- Function: gsl_vector * gsl_multifit_nlinear_position (const gsl_multifit_nlinear_workspace * W) -- Function: gsl_vector * gsl_multilarge_nlinear_position (const gsl_multilarge_nlinear_workspace * W) These functions return the current position x (i.e. best-fit parameters) of the solver W. -- Function: gsl_vector * gsl_multifit_nlinear_residual (const gsl_multifit_nlinear_workspace * W) -- Function: gsl_vector * gsl_multilarge_nlinear_residual (const gsl_multilarge_nlinear_workspace * W) These functions return the current residual vector f(x) of the solver W. For weighted systems, the residual vector includes the weighting factor \sqrt{W}. -- Function: gsl_matrix * gsl_multifit_nlinear_jac (const gsl_multifit_nlinear_workspace * W) This function returns a pointer to the n-by-p Jacobian matrix for the current iteration of the solver W. This function is available only for the 'gsl_multifit_nlinear' interface. -- Function: size_t gsl_multifit_nlinear_niter (const gsl_multifit_nlinear_workspace * W) -- Function: size_t gsl_multilarge_nlinear_niter (const gsl_multilarge_nlinear_workspace * W) These functions return the number of iterations performed so far. The iteration counter is updated on each call to the '_iterate' functions above, and reset to 0 in the '_init' functions. -- Function: int gsl_multifit_nlinear_rcond (double * RCOND, const gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_rcond (double * RCOND, const gsl_multilarge_nlinear_workspace * W) This function estimates the reciprocal condition number of the Jacobian matrix at the current position x and stores it in RCOND. The computed value is only an estimate to give the user a guideline as to the conditioning of their particular problem. Its calculation is based on which factorization method is used (Cholesky, QR, or SVD). * For the Cholesky solver, the matrix J^T J is factored at each iteration. Therefore this function will estimate the 1-norm condition number rcond^2 = 1/(||J^T J||_1 \cdot ||(J^T J)^{-1}||_1) * For the QR solver, J is factored as J = Q R at each iteration. For simplicity, this function calculates the 1-norm conditioning of only the R factor, rcond = 1 / (||R||_1 \cdot ||R^{-1}||_1). This can be computed efficiently since R is upper triangular. * For the SVD solver, in order to efficiently solve the trust region subproblem, the matrix which is factored is J D^{-1}, instead of J itself. The resulting singular values are used to provide the 2-norm reciprocal condition number, as rcond = \sigma_{min} / \sigma_{max}. Note that when using More' scaling, D \ne I and the resulting RCOND estimate may be significantly different from the true RCOND of J itself.  File: gsl-ref.info, Node: Nonlinear Least-Squares Testing for Convergence, Next: Nonlinear Least-Squares High Level Driver, Prev: Nonlinear Least-Squares Iteration, Up: Nonlinear Least-Squares Fitting 39.8 Testing for Convergence ============================ 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_nlinear_test (const double XTOL, const double GTOL, const double FTOL, int * INFO, const gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_test (const double XTOL, const double GTOL, const double FTOL, int * INFO, const gsl_multilarge_nlinear_workspace * W) These functions test for convergence of the minimization method using the following criteria: * Testing for a small step size relative to the current parameter vector |\delta_i| <= xtol (|x_i| + xtol) for each 0 <= i < p. Each element of the step vector \delta is tested individually in case the different parameters have widely different scales. Adding XTOL to |x_i| helps the test avoid breaking down in situations where the true solution value x_i = 0. If this test succeeds, INFO is set to 1 and the function returns 'GSL_SUCCESS'. A general guideline for selecting the step tolerance is to choose xtol = 10^{-d} where d is the number of accurate decimal digits desired in the solution x. See Dennis and Schnabel for more information. * Testing for a small gradient (g = \nabla \Phi(x) = J^T f) indicating a local function minimum: ||g||_inf <= gtol This expression tests whether the ratio (\nabla \Phi)_i x_i / \Phi is small. Testing this scaled gradient is a better than \nabla \Phi alone since it is a dimensionless quantity and so independent of the scale of the problem. The 'max' arguments help ensure the test doesn't break down in regions where x_i or \Phi(x) are close to 0. If this test succeeds, INFO is set to 2 and the function returns 'GSL_SUCCESS'. A general guideline for choosing the gradient tolerance is to set 'gtol = GSL_DBL_EPSILON^(1/3)'. See Dennis and Schnabel for more information. If none of the tests succeed, INFO is set to 0 and the function returns 'GSL_CONTINUE', indicating further iterations are required.  File: gsl-ref.info, Node: Nonlinear Least-Squares High Level Driver, Next: Nonlinear Least-Squares Covariance Matrix, Prev: Nonlinear Least-Squares Testing for Convergence, Up: Nonlinear Least-Squares Fitting 39.9 High Level Driver ====================== These routines provide a high level wrapper that combines the iteration and convergence testing for easy use. -- Function: int gsl_multifit_nlinear_driver (const size_t MAXITER, const double XTOL, const double GTOL, const double FTOL, void (* CALLBACK)(const size_t ITER, void * PARAMS, const gsl_multifit_linear_workspace * W), void * CALLBACK_PARAMS, int * INFO, gsl_multifit_nlinear_workspace * W) -- Function: int gsl_multilarge_nlinear_driver (const size_t MAXITER, const double XTOL, const double GTOL, const double FTOL, void (* CALLBACK)(const size_t ITER, void * PARAMS, const gsl_multilarge_linear_workspace * W), void * CALLBACK_PARAMS, int * INFO, gsl_multilarge_nlinear_workspace * W) These functions iterate the nonlinear least squares solver W for a maximum of MAXITER iterations. After each iteration, the system is tested for convergence with the error tolerances XTOL, GTOL and FTOL. Additionally, the user may supply a callback function CALLBACK which is called after each iteration, so that the user may save or print relevant quantities for each iteration. The parameter CALLBACK_PARAMS is passed to the CALLBACK function. The parameters CALLBACK and CALLBACK_PARAMS may be set to NULL to disable this feature. Upon successful convergence, the function returns 'GSL_SUCCESS' and sets INFO to the reason for convergence (see 'gsl_multifit_nlinear_test'). If the function has not converged after MAXITER iterations, 'GSL_EMAXITER' is returned. In rare cases, during an iteration the algorithm may be unable to find a new acceptable step \delta to take. In this case, 'GSL_ENOPROG' is returned indicating no further progress can be made. If your problem is having difficulty converging, see *note Nonlinear Least-Squares Troubleshooting:: for further guidance.  File: gsl-ref.info, Node: Nonlinear Least-Squares Covariance Matrix, Next: Nonlinear Least-Squares Troubleshooting, Prev: Nonlinear Least-Squares High Level Driver, Up: Nonlinear Least-Squares Fitting 39.10 Covariance matrix of best fit parameters ============================================== -- Function: int gsl_multifit_nlinear_covar (const gsl_matrix * J, const double EPSREL, gsl_matrix * COVAR) -- Function: int gsl_multilarge_nlinear_covar (gsl_matrix * COVAR, gsl_multilarge_nlinear_workspace * W) This function computes the covariance matrix of best-fit parameters using the Jacobian matrix J and stores it in 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} or in the weighted case, covar = (J^T W J)^{-1} and is computed using the factored form of the Jacobian (Cholesky, QR, or SVD). 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: Nonlinear Least-Squares Troubleshooting, Next: Nonlinear Least-Squares Examples, Prev: Nonlinear Least-Squares Covariance Matrix, Up: Nonlinear Least-Squares Fitting 39.11 Troubleshooting ===================== When developing a code to solve a nonlinear least squares problem, here are a few considerations to keep in mind. 1. The most common difficulty is the accurate implementation of the Jacobian matrix. If the analytic Jacobian is not properly provided to the solver, this can hinder and many times prevent convergence of the method. When developing a new nonlinear least squares code, it often helps to compare the program output with the internally computed finite difference Jacobian and the user supplied analytic Jacobian. If there is a large difference in coefficients, it is likely the analytic Jacobian is incorrectly implemented. 2. If your code is having difficulty converging, the next thing to check is the starting point provided to the solver. The methods of this chapter are local methods, meaning if you provide a starting point far away from the true minimum, the method may converge to a local minimum or not converge at all. Sometimes it is possible to solve a linearized approximation to the nonlinear problem, and use the linear solution as the starting point to the nonlinear problem. 3. If the various parameters of the coefficient vector x vary widely in magnitude, then the problem is said to be badly scaled. The methods of this chapter do attempt to automatically rescale the elements of x to have roughly the same order of magnitude, but in extreme cases this could still cause problems for convergence. In these cases it is recommended for the user to scale their parameter vector x so that each parameter spans roughly the same range, say [-1,1]. The solution vector can be backscaled to recover the original units of the problem.  File: gsl-ref.info, Node: Nonlinear Least-Squares Examples, Next: Nonlinear Least-Squares References and Further Reading, Prev: Nonlinear Least-Squares Troubleshooting, Up: Nonlinear Least-Squares Fitting 39.12 Examples ============== The following example programs demonstrate the nonlinear least squares fitting capabilities. * Menu: * Nonlinear Least-Squares Exponential Fit Example:: * Nonlinear Least-Squares Geodesic Acceleration Example:: * Nonlinear Least-Squares Comparison Example:: * Nonlinear Least-Squares Large Example::  File: gsl-ref.info, Node: Nonlinear Least-Squares Exponential Fit Example, Next: Nonlinear Least-Squares Geodesic Acceleration Example, Up: Nonlinear Least-Squares Examples 39.12.1 Exponential Fitting Example ----------------------------------- 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 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. The ith row of the Jacobian is therefore The main part of the program sets up a Levenberg-Marquardt solver and some simulated random data. The data uses the known parameters (5.0,0.1,1.0) combined with Gaussian noise (standard deviation = 0.1) over a range of 40 timesteps. The initial guess for the parameters is chosen as (1.0, 1.0, 0.0). The iteration terminates when the relative change in x is smaller than 10^{-8}, or when the magnitude of the gradient falls below 10^{-8}. Here are the results of running the program: iter 0: A = 1.0000, lambda = 1.0000, b = 0.0000, cond(J) = inf, |f(x)| = 62.2029 iter 1: A = 1.2196, lambda = 0.3663, b = 0.0436, cond(J) = 53.6368, |f(x)| = 59.8062 iter 2: A = 1.6062, lambda = 0.1506, b = 0.1054, cond(J) = 23.8178, |f(x)| = 53.9039 iter 3: A = 2.4528, lambda = 0.0583, b = 0.2470, cond(J) = 20.0493, |f(x)| = 28.8039 iter 4: A = 2.9723, lambda = 0.0494, b = 0.3727, cond(J) = 94.5601, |f(x)| = 15.3252 iter 5: A = 3.3473, lambda = 0.0477, b = 0.4410, cond(J) = 229.3627, |f(x)| = 10.7511 iter 6: A = 3.6690, lambda = 0.0508, b = 0.4617, cond(J) = 298.3589, |f(x)| = 9.7373 iter 7: A = 3.9907, lambda = 0.0580, b = 0.5433, cond(J) = 250.0194, |f(x)| = 8.7661 iter 8: A = 4.2353, lambda = 0.0731, b = 0.7989, cond(J) = 154.8571, |f(x)| = 7.4299 iter 9: A = 4.6573, lambda = 0.0958, b = 1.0302, cond(J) = 140.2265, |f(x)| = 6.1893 iter 10: A = 5.0138, lambda = 0.1060, b = 1.0329, cond(J) = 109.4141, |f(x)| = 5.4961 iter 11: A = 5.1505, lambda = 0.1103, b = 1.0497, cond(J) = 100.8762, |f(x)| = 5.4552 iter 12: A = 5.1724, lambda = 0.1110, b = 1.0526, cond(J) = 97.3403, |f(x)| = 5.4542 iter 13: A = 5.1737, lambda = 0.1110, b = 1.0528, cond(J) = 96.7136, |f(x)| = 5.4542 iter 14: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6678, |f(x)| = 5.4542 iter 15: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6663, |f(x)| = 5.4542 iter 16: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6663, |f(x)| = 5.4542 summary from method 'trust-region/levenberg-marquardt' number of iterations: 16 function evaluations: 23 Jacobian evaluations: 17 reason for stopping: small step size initial |f(x)| = 62.202928 final |f(x)| = 5.454180 chisq/dof = 0.804002 A = 5.17379 +/- 0.27938 lambda = 0.11104 +/- 0.00817 b = 1.05283 +/- 0.05365 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 of an inappropriate model, and the scaled error estimates may then be outside the range of validity for Gaussian errors. Additionally, we see that the condition number of J(x) stays reasonably small throughout the iteration. This indicates we could safely switch to the Cholesky solver for speed improvement, although this particular system is too small to really benefit. #include #include #include #include #include #include #include #include /* number of data points to fit */ #define N 40 struct data { size_t n; double * y; }; 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 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]); } return GSL_SUCCESS; } int expb_df (const gsl_vector * x, void *data, gsl_matrix * J) { size_t n = ((struct data *)data)->n; 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 e = exp(-lambda * t); gsl_matrix_set (J, i, 0, e); gsl_matrix_set (J, i, 1, -t * A * e); gsl_matrix_set (J, i, 2, 1.0); } return GSL_SUCCESS; } void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector *f = gsl_multifit_nlinear_residual(w); gsl_vector *x = gsl_multifit_nlinear_position(w); double rcond; /* compute reciprocal condition number of J(x) */ gsl_multifit_nlinear_rcond(&rcond, w); fprintf(stderr, "iter %2zu: A = %.4f, lambda = %.4f, b = %.4f, cond(J) = %8.4f, |f(x)| = %.4f\n", iter, gsl_vector_get(x, 0), gsl_vector_get(x, 1), gsl_vector_get(x, 2), 1.0 / rcond, gsl_blas_dnrm2(f)); } int main (void) { const gsl_multifit_nlinear_type *T = gsl_multifit_nlinear_trust; gsl_multifit_nlinear_workspace *w; gsl_multifit_nlinear_fdf fdf; gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); const size_t n = N; const size_t p = 3; gsl_vector *f; gsl_matrix *J; gsl_matrix *covar = gsl_matrix_alloc (p, p); double y[N], weights[N]; struct data d = { n, y }; double x_init[3] = { 1.0, 1.0, 0.0 }; /* starting values */ gsl_vector_view x = gsl_vector_view_array (x_init, p); gsl_vector_view wts = gsl_vector_view_array(weights, n); gsl_rng * r; double chisq, chisq0; int status, info; size_t i; const double xtol = 1e-8; const double gtol = 1e-8; const double ftol = 0.0; gsl_rng_env_setup(); r = gsl_rng_alloc(gsl_rng_default); /* define the function to be minimized */ fdf.f = expb_f; fdf.df = expb_df; /* set to NULL for finite-difference Jacobian */ fdf.fvv = NULL; /* not using geodesic acceleration */ fdf.n = n; fdf.p = p; fdf.params = &d; /* this is the data to be fitted */ for (i = 0; i < n; i++) { double t = i; double yi = 1.0 + 5 * exp (-0.1 * t); double si = 0.1 * yi; double dy = gsl_ran_gaussian(r, si); weights[i] = 1.0 / (si * si); y[i] = yi + dy; printf ("data: %zu %g %g\n", i, y[i], si); }; /* allocate workspace with default parameters */ w = gsl_multifit_nlinear_alloc (T, &fdf_params, n, p); /* initialize solver with starting point and weights */ gsl_multifit_nlinear_winit (&x.vector, &wts.vector, &fdf, w); /* compute initial cost function */ f = gsl_multifit_nlinear_residual(w); gsl_blas_ddot(f, f, &chisq0); /* solve the system with a maximum of 20 iterations */ status = gsl_multifit_nlinear_driver(20, xtol, gtol, ftol, callback, NULL, &info, w); /* compute covariance of best fit parameters */ J = gsl_multifit_nlinear_jac(w); gsl_multifit_nlinear_covar (J, 0.0, covar); /* compute final cost */ gsl_blas_ddot(f, f, &chisq); #define FIT(i) gsl_vector_get(w->x, i) #define ERR(i) sqrt(gsl_matrix_get(covar,i,i)) fprintf(stderr, "summary from method '%s/%s'\n", gsl_multifit_nlinear_name(w), gsl_multifit_nlinear_trs_name(w)); fprintf(stderr, "number of iterations: %zu\n", gsl_multifit_nlinear_niter(w)); fprintf(stderr, "function evaluations: %zu\n", fdf.nevalf); fprintf(stderr, "Jacobian evaluations: %zu\n", fdf.nevaldf); fprintf(stderr, "reason for stopping: %s\n", (info == 1) ? "small step size" : "small gradient"); fprintf(stderr, "initial |f(x)| = %f\n", sqrt(chisq0)); fprintf(stderr, "final |f(x)| = %f\n", sqrt(chisq)); { double dof = n - p; double c = GSL_MAX_DBL(1, sqrt(chisq / dof)); fprintf(stderr, "chisq/dof = %g\n", chisq / dof); fprintf (stderr, "A = %.5f +/- %.5f\n", FIT(0), c*ERR(0)); fprintf (stderr, "lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1)); fprintf (stderr, "b = %.5f +/- %.5f\n", FIT(2), c*ERR(2)); } fprintf (stderr, "status = %s\n", gsl_strerror (status)); gsl_multifit_nlinear_free (w); gsl_matrix_free (covar); gsl_rng_free (r); return 0; } gsl-doc-2.3/doc/sum.texi0000664000175000017500000001670012620026734013234 0ustar eddedd@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}) @tindex gsl_sum_levin_u_workspace 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}) @tindex gsl_sum_levin_utrunc_workspace 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.txt @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 @w{} @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 @w{} @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 @w{} @item Herbert H. H. Homeier, Scalar Levin-Type Sequence Transformations, @uref{http://arxiv.org/abs/math/0005209}. @end itemize gsl-doc-2.3/doc/specfunc-bessel.texi0000664000175000017500000006613212616157443015524 0ustar eddedd@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 @cindex J(x), 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 @cindex Y(x), 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 @cindex I(x), 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 @cindex K(x), 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 @cindex j(x), 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{result_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 @cindex y(x), 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 @cindex i(x), 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 spherical 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 @cindex k(x), 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 gsl-doc-2.3/doc/sparse_poisson.eps0000644000175000017500000006105112736044021015307 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: sparse_poisson.eps %%Creator: gnuplot 4.6 patchlevel 2 %%CreationDate: Sun Jan 31 14:49:44 2016 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid true def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (sparse_poisson.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 2) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Sun Jan 31 14:49:44 2016) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 448 M 6261 0 V stroke LTb LCb setrgbcolor 686 448 M 63 0 V 6198 0 R -63 0 V stroke 602 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 827 M 6261 0 V stroke LTb LCb setrgbcolor 686 827 M 63 0 V 6198 0 R -63 0 V stroke 602 827 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 1206 M 6261 0 V stroke LTb LCb setrgbcolor 686 1206 M 63 0 V 6198 0 R -63 0 V stroke 602 1206 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 1586 M 6261 0 V stroke LTb LCb setrgbcolor 686 1586 M 63 0 V 6198 0 R -63 0 V stroke 602 1586 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.3)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 1965 M 6261 0 V stroke LTb LCb setrgbcolor 686 1965 M 63 0 V 6198 0 R -63 0 V stroke 602 1965 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 2344 M 6261 0 V stroke LTb LCb setrgbcolor 686 2344 M 63 0 V 6198 0 R -63 0 V stroke 602 2344 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 2723 M 6261 0 V stroke LTb LCb setrgbcolor 686 2723 M 63 0 V 6198 0 R -63 0 V stroke 602 2723 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 3102 M 6261 0 V stroke LTb LCb setrgbcolor 686 3102 M 63 0 V 6198 0 R -63 0 V stroke 602 3102 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.7)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 3481 M 6261 0 V stroke LTb LCb setrgbcolor 686 3481 M 63 0 V 6198 0 R -63 0 V stroke 602 3481 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 3861 M 6261 0 V stroke LTb LCb setrgbcolor 686 3861 M 63 0 V 6198 0 R -63 0 V stroke 602 3861 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.9)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 4240 M 6261 0 V stroke LTb LCb setrgbcolor 686 4240 M 63 0 V 6198 0 R -63 0 V stroke 602 4240 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 4619 M 6261 0 V stroke LTb LCb setrgbcolor 686 4619 M 63 0 V 6198 0 R -63 0 V stroke 602 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 686 448 M 0 4171 V stroke LTb LCb setrgbcolor 686 448 M 0 63 V 0 4108 R 0 -63 V stroke 686 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 1312 448 M 0 4171 V stroke LTb LCb setrgbcolor 1312 448 M 0 63 V 0 4108 R 0 -63 V stroke 1312 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 1938 448 M 0 4171 V stroke LTb LCb setrgbcolor 1938 448 M 0 63 V 0 4108 R 0 -63 V stroke 1938 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 2564 448 M 0 4171 V stroke LTb LCb setrgbcolor 2564 448 M 0 63 V 0 4108 R 0 -63 V stroke 2564 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.3)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 3190 448 M 0 4171 V stroke LTb LCb setrgbcolor 3190 448 M 0 63 V 0 4108 R 0 -63 V stroke 3190 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 3817 448 M 0 4171 V stroke LTb LCb setrgbcolor 3817 448 M 0 63 V 0 4108 R 0 -63 V stroke 3817 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 4443 448 M 0 4171 V stroke LTb LCb setrgbcolor 4443 448 M 0 63 V 0 4108 R 0 -63 V stroke 4443 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 5069 448 M 0 4171 V stroke LTb LCb setrgbcolor 5069 448 M 0 63 V 0 4108 R 0 -63 V stroke 5069 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.7)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 5695 448 M 0 3828 V 0 280 R 0 63 V stroke LTb LCb setrgbcolor 5695 448 M 0 63 V 0 4108 R 0 -63 V stroke 5695 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 6321 448 M 0 3828 V 0 280 R 0 63 V stroke LTb LCb setrgbcolor 6321 448 M 0 63 V 0 4108 R 0 -63 V stroke 6321 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.9)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTa LCa setrgbcolor 6947 448 M 0 4171 V stroke LTb LCb setrgbcolor 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 686 4619 N 686 448 L 6261 0 V 0 4171 V -6261 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (u\(x\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3816 98 M [ [(Helvetica) 140.0 0.0 true true 0 (x)] ] -46.7 MCshow LTb 3816 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (1D Poisson solution - offset deliberately added to GSL solution)] ] -46.7 MCshow 0.300 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 4.000 UL LT0 0.55 0.10 0.05 C LCb setrgbcolor 6341 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (GSL + )] [(Symbol) 140.0 0.0 true true 0 (e)] ] -46.7 MRshow LT0 0.55 0.10 0.05 C 6425 4486 M 354 0 V 749 606 M 63 120 V 64 120 V 63 120 V 63 119 V 63 119 V 64 117 V 63 117 V 63 116 V 63 115 V 64 114 V 63 112 V 63 111 V 63 110 V 64 108 V 63 106 V 63 104 V 63 102 V 64 100 V 63 98 V 63 96 V 63 93 V 64 91 V 63 89 V 63 86 V 63 83 V 64 80 V 63 77 V 63 75 V 63 71 V 64 68 V 63 65 V 63 62 V 63 59 V 63 55 V 64 51 V 63 49 V 63 44 V 63 41 V 64 38 V 63 34 V 63 30 V 63 27 V 64 22 V 63 19 V 63 16 V 63 11 V 64 8 V 63 4 V 63 0 V 63 -4 V 64 -8 V 63 -11 V 63 -16 V 63 -19 V 64 -22 V 63 -27 V 63 -30 V 63 -34 V 64 -38 V 63 -41 V 63 -44 V 63 -49 V 64 -51 V 63 -55 V 63 -59 V 63 -62 V 63 -65 V 64 -68 V 63 -71 V 63 -75 V 63 -77 V 64 -80 V 63 -83 V 63 -86 V 63 -89 V 64 -91 V 63 -93 V 63 -96 V 63 -98 V 64 -100 V 63 -102 V 63 -104 V 63 -106 V 64 -108 V 63 -110 V 63 -111 V 63 -112 V 64 -114 V 63 -115 V 63 -116 V 63 -117 V 64 -117 V 63 -119 V 63 -119 V 63 -120 V 64 -120 V 63 -120 V % End plot #1 % Begin plot #2 stroke LT2 0.00 0.38 0.68 C LCb setrgbcolor 6341 4346 M [ [(Helvetica) 140.0 0.0 true true 0 (Analytic)] ] -46.7 MRshow LT2 0.00 0.38 0.68 C 6425 4346 M 354 0 V 749 568 M 63 120 V 64 120 V 63 120 V 63 119 V 63 119 V 64 117 V 63 117 V 63 116 V 63 115 V 64 114 V 63 112 V 63 111 V 63 110 V 64 108 V 63 106 V 63 104 V 63 102 V 64 100 V 63 98 V 63 96 V 63 93 V 64 91 V 63 89 V 63 85 V 63 83 V 64 81 V 63 77 V 63 74 V 63 72 V 64 68 V 63 65 V 63 62 V 63 58 V 63 55 V 64 52 V 63 48 V 63 45 V 63 41 V 64 38 V 63 34 V 63 30 V 63 26 V 64 23 V 63 19 V 63 15 V 63 12 V 64 8 V 63 3 V 63 0 V 63 -3 V 64 -8 V 63 -12 V 63 -15 V 63 -19 V 64 -23 V 63 -26 V 63 -30 V 63 -34 V 64 -38 V 63 -41 V 63 -45 V 63 -48 V 64 -52 V 63 -55 V 63 -58 V 63 -62 V 63 -65 V 64 -68 V 63 -72 V 63 -74 V 63 -77 V 64 -81 V 63 -83 V 63 -85 V 63 -89 V 64 -91 V 63 -93 V 63 -96 V 63 -98 V 64 -100 V 63 -102 V 63 -104 V 63 -106 V 64 -108 V 63 -110 V 63 -111 V 63 -112 V 64 -114 V 63 -115 V 63 -116 V 63 -117 V 64 -117 V 63 -119 V 63 -119 V 63 -120 V 64 -120 V 63 -120 V % End plot #2 stroke 1.000 UL LTb LCb setrgbcolor 686 4619 N 686 448 L 6261 0 V 0 4171 V -6261 0 V Z stroke 0.300 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Symbol Helvetica gsl-doc-2.3/doc/interp2d.eps0000664000175000017500000140536412616157443014015 0ustar eddedd%!PS-Adobe-2.0 EPSF-2.0 %%Title: interp2d.eps %%Creator: gnuplot 4.6 patchlevel 5 %%CreationDate: Thu May 1 10:20:59 2014 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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 /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (interp2d.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 5) /Author (palken) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu May 1 10:20:59 2014) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if gsave % colour palette begin /maxcolors 0 def /HSV2RGB { exch dup 0.0 eq {pop exch pop dup dup} % achromatic gray { /HSVs exch def /HSVv exch def 6.0 mul dup floor dup 3 1 roll sub /HSVf exch def /HSVi exch cvi def /HSVp HSVv 1.0 HSVs sub mul def /HSVq HSVv 1.0 HSVs HSVf mul sub mul def /HSVt HSVv 1.0 HSVs 1.0 HSVf sub mul sub mul def /HSVi HSVi 6 mod def 0 HSVi eq {HSVv HSVt HSVp} {1 HSVi eq {HSVq HSVv HSVp}{2 HSVi eq {HSVp HSVv HSVt} {3 HSVi eq {HSVp HSVq HSVv}{4 HSVi eq {HSVt HSVp HSVv} {HSVv HSVp HSVq} ifelse} ifelse} ifelse} ifelse} ifelse } ifelse} def /Constrain { dup 0 lt {0 exch pop}{dup 1 gt {1 exch pop} if} ifelse} def /YIQ2RGB { 3 copy -1.702 mul exch -1.105 mul add add Constrain 4 1 roll 3 copy -0.647 mul exch -0.272 mul add add Constrain 5 1 roll 0.621 mul exch -0.956 mul add add Constrain 3 1 roll } def /CMY2RGB { 1 exch sub exch 1 exch sub 3 2 roll 1 exch sub 3 1 roll exch } def /XYZ2RGB { 3 copy -0.9017 mul exch -0.1187 mul add exch 0.0585 mul exch add Constrain 4 1 roll 3 copy -0.0279 mul exch 1.999 mul add exch -0.9844 mul add Constrain 5 1 roll -0.2891 mul exch -0.5338 mul add exch 1.91 mul exch add Constrain 3 1 roll} def /SelectSpace {ColorSpace (HSV) eq {HSV2RGB}{ColorSpace (XYZ) eq { XYZ2RGB}{ColorSpace (CMY) eq {CMY2RGB}{ColorSpace (YIQ) eq {YIQ2RGB} if} ifelse} ifelse} ifelse} def /InterpolatedColor true def /grayindex {/gidx 0 def {GrayA gidx get grayv ge {exit} if /gidx gidx 1 add def} loop} def /dgdx {grayv GrayA gidx get sub GrayA gidx 1 sub get GrayA gidx get sub div} def /redvalue {RedA gidx get RedA gidx 1 sub get RedA gidx get sub dgdxval mul add} def /greenvalue {GreenA gidx get GreenA gidx 1 sub get GreenA gidx get sub dgdxval mul add} def /bluevalue {BlueA gidx get BlueA gidx 1 sub get BlueA gidx get sub dgdxval mul add} def /interpolate { grayindex grayv GrayA gidx get sub abs 1e-5 le {RedA gidx get GreenA gidx get BlueA gidx get} {/dgdxval dgdx def redvalue greenvalue bluevalue} ifelse} def /GrayA [0 .125 .25 .375 .5 .625 .75 .875 1 ] def /RedA [0 0 0 .0588 .5647 1 1 .9333 .498 ] def /GreenA [0 .0588 .5647 1 1 .9333 .4392 0 0 ] def /BlueA [.5647 1 1 .9333 .4392 0 0 0 0 ] def /pm3dround {maxcolors 0 gt {dup 1 ge {pop 1} {maxcolors mul floor maxcolors 1 sub div} ifelse} if} def /pm3dGamma 1.0 1.5 Gamma mul div def /ColorSpace (RGB) def Color InterpolatedColor or { % COLOUR vs. GRAY map InterpolatedColor { %% Interpolation vs. RGB-Formula /g {stroke pm3dround /grayv exch def interpolate SelectSpace setrgbcolor} bind def }{ /g {stroke pm3dround dup cF7 Constrain exch dup cF5 Constrain exch cF15 Constrain SelectSpace setrgbcolor} bind def } ifelse }{ /g {stroke pm3dround pm3dGamma exp setgray} bind def } ifelse 1.000 UL LTb LCb setrgbcolor 1.000 UP % Begin plot #1 LCb setrgbcolor /Helvetica findfont 140 scalefont setfont /vshift -46 def 5535 3979 M ('dat' us 1:2:3) Rshow 1.000 UL LT0 LC0 setrgbcolor %pm3d_map_begin 1.000 UL LT0 LC0 setrgbcolor .0101 g 1098 928 N -51 0 0 33 51 0 h .0201 g 1098 961 N -51 0 0 34 51 0 h .0301 g 1098 995 N -51 0 0 34 51 0 h .0401 g 1098 1029 N -51 0 0 33 51 0 h .0502 g 1098 1062 N -51 0 0 34 51 0 h .0602 g 1098 1096 N -51 0 0 33 51 0 h .0702 g 1098 1129 N -51 0 0 34 51 0 h .0802 g 1098 1163 N -51 0 0 34 51 0 h .0903 g 1098 1197 N -51 0 0 33 51 0 h .1003 g 1098 1230 N -51 0 0 34 51 0 h .1103 g 1098 1264 N -51 0 0 33 51 0 h .1203 g 1098 1297 N -51 0 0 34 51 0 h .1304 g 1098 1331 N -51 0 0 33 51 0 h .1404 g 1098 1364 N -51 0 0 34 51 0 h .1504 g 1098 1398 N -51 0 0 34 51 0 h .1604 g 1098 1432 N -51 0 0 33 51 0 h .1705 g 1098 1465 N -51 0 0 34 51 0 h .1805 g 1098 1499 N -51 0 0 33 51 0 h .1905 g 1098 1532 N -51 0 0 34 51 0 h .2005 g 1098 1566 N -51 0 0 34 51 0 h .2106 g 1098 1600 N -51 0 0 33 51 0 h .2206 g 1098 1633 N -51 0 0 34 51 0 h .2306 g 1098 1667 N -51 0 0 33 51 0 h .2406 g 1098 1700 N -51 0 0 34 51 0 h .2507 g 1098 1734 N -51 0 0 34 51 0 h .2607 g 1098 1768 N -51 0 0 33 51 0 h .2707 g 1098 1801 N -51 0 0 34 51 0 h .2807 g 1098 1835 N -51 0 0 33 51 0 h .2907 g 1098 1868 N -51 0 0 34 51 0 h .3008 g 1098 1902 N -51 0 0 33 51 0 h .3108 g 1098 1935 N -51 0 0 34 51 0 h .3208 g 1098 1969 N -51 0 0 34 51 0 h .3308 g 1098 2003 N -51 0 0 33 51 0 h .3409 g 1098 2036 N -51 0 0 34 51 0 h .3509 g 1098 2070 N -51 0 0 33 51 0 h .3609 g 1098 2103 N -51 0 0 34 51 0 h .3709 g 1098 2137 N -51 0 0 34 51 0 h .381 g 1098 2171 N -51 0 0 33 51 0 h .391 g 1098 2204 N -51 0 0 34 51 0 h .401 g 1098 2238 N -51 0 0 33 51 0 h .411 g 1098 2271 N -51 0 0 34 51 0 h .4211 g 1098 2305 N -51 0 0 34 51 0 h .4311 g 1098 2339 N -51 0 0 33 51 0 h .4411 g 1098 2372 N -51 0 0 34 51 0 h .4511 g 1098 2406 N -51 0 0 33 51 0 h .4612 g 1098 2439 N -51 0 0 34 51 0 h .4712 g 1098 2473 N -51 0 0 34 51 0 h .4812 g 1098 2507 N -51 0 0 33 51 0 h .4912 g 1098 2540 N -51 0 0 34 51 0 h .5013 g 1098 2574 N -51 0 0 32 51 0 h .5113 g 1098 2606 N -51 0 0 34 51 0 h .5213 g 1098 2640 N -51 0 0 33 51 0 h .5313 g 1098 2673 N -51 0 0 34 51 0 h .5414 g 1098 2707 N -51 0 0 34 51 0 h .5514 g 1098 2741 N -51 0 0 33 51 0 h .5614 g 1098 2774 N -51 0 0 34 51 0 h .5714 g 1098 2808 N -51 0 0 33 51 0 h .5815 g 1098 2841 N -51 0 0 34 51 0 h .5915 g 1098 2875 N -51 0 0 34 51 0 h .6015 g 1098 2909 N -51 0 0 33 51 0 h .6115 g 1098 2942 N -51 0 0 34 51 0 h .6216 g 1098 2976 N -51 0 0 33 51 0 h .6316 g 1098 3009 N -51 0 0 34 51 0 h .6416 g 1098 3043 N -51 0 0 34 51 0 h .6516 g 1098 3077 N -51 0 0 33 51 0 h .6617 g 1098 3110 N -51 0 0 34 51 0 h .6717 g 1098 3144 N -51 0 0 33 51 0 h .6817 g 1098 3177 N -51 0 0 34 51 0 h .6917 g 1098 3211 N -51 0 0 34 51 0 h .7018 g 1098 3245 N -51 0 0 33 51 0 h .7118 g 1098 3278 N -51 0 0 34 51 0 h .7218 g 1098 3312 N -51 0 0 33 51 0 h .7318 g 1098 3345 N -51 0 0 34 51 0 h .7419 g 1098 3379 N -51 0 0 33 51 0 h .7519 g 1098 3412 N -51 0 0 34 51 0 h .7619 g 1098 3446 N -51 0 0 34 51 0 h .7719 g 1098 3480 N -51 0 0 33 51 0 h .7819 g 1098 3513 N -51 0 0 34 51 0 h .792 g 1098 3547 N -51 0 0 33 51 0 h .802 g 1098 3580 N -51 0 0 34 51 0 h .812 g 1098 3614 N -51 0 0 34 51 0 h .822 g 1098 3648 N -51 0 0 33 51 0 h .8321 g 1098 3681 N -51 0 0 34 51 0 h .8421 g 1098 3715 N -51 0 0 33 51 0 h .8521 g 1098 3748 N -51 0 0 34 51 0 h .8621 g 1098 3782 N -51 0 0 34 51 0 h .8722 g 1098 3816 N -51 0 0 33 51 0 h .8822 g 1098 3849 N -51 0 0 34 51 0 h .8922 g 1098 3883 N -51 0 0 33 51 0 h .9022 g 1098 3916 N -51 0 0 34 51 0 h .9123 g 1098 3950 N -51 0 0 33 51 0 h .9223 g 1098 3983 N -51 0 0 34 51 0 h .9323 g 1098 4017 N -51 0 0 34 51 0 h .9423 g 1098 4051 N -51 0 0 33 51 0 h .9524 g 1098 4084 N -51 0 0 34 51 0 h .9624 g 1098 4118 N -51 0 0 33 51 0 h .9724 g 1098 4151 N -51 0 0 34 51 0 h .9824 g 1098 4185 N -51 0 0 34 51 0 h .9925 g 1098 4219 N -51 0 0 33 51 0 h .0201 g 1149 928 N -50 0 0 33 50 0 h .03 g 1149 961 N -50 0 0 34 50 0 h .0398 g 1149 995 N -50 0 0 34 50 0 h .0497 g 1149 1029 N -50 0 0 33 50 0 h .0596 g 1149 1062 N -50 0 0 34 50 0 h .0694 g 1149 1096 N -50 0 0 33 50 0 h .0793 g 1149 1129 N -50 0 0 34 50 0 h .0892 g 1149 1163 N -50 0 0 34 50 0 h .0991 g 1149 1197 N -50 0 0 33 50 0 h .1089 g 1149 1230 N -50 0 0 34 50 0 h .1188 g 1149 1264 N -50 0 0 33 50 0 h .1287 g 1149 1297 N -50 0 0 34 50 0 h .1385 g 1149 1331 N -50 0 0 33 50 0 h .1484 g 1149 1364 N -50 0 0 34 50 0 h .1583 g 1149 1398 N -50 0 0 34 50 0 h .1682 g 1149 1432 N -50 0 0 33 50 0 h .178 g 1149 1465 N -50 0 0 34 50 0 h .1879 g 1149 1499 N -50 0 0 33 50 0 h .1978 g 1149 1532 N -50 0 0 34 50 0 h .2076 g 1149 1566 N -50 0 0 34 50 0 h .2175 g 1149 1600 N -50 0 0 33 50 0 h .2274 g 1149 1633 N -50 0 0 34 50 0 h .2373 g 1149 1667 N -50 0 0 33 50 0 h .2471 g 1149 1700 N -50 0 0 34 50 0 h .257 g 1149 1734 N -50 0 0 34 50 0 h .2669 g 1149 1768 N -50 0 0 33 50 0 h .2767 g 1149 1801 N -50 0 0 34 50 0 h .2866 g 1149 1835 N -50 0 0 33 50 0 h .2965 g 1149 1868 N -50 0 0 34 50 0 h .3064 g 1149 1902 N -50 0 0 33 50 0 h .3162 g 1149 1935 N -50 0 0 34 50 0 h .3261 g 1149 1969 N -50 0 0 34 50 0 h .336 g 1149 2003 N -50 0 0 33 50 0 h .3458 g 1149 2036 N -50 0 0 34 50 0 h .3557 g 1149 2070 N -50 0 0 33 50 0 h .3656 g 1149 2103 N -50 0 0 34 50 0 h .3755 g 1149 2137 N -50 0 0 34 50 0 h .3853 g 1149 2171 N -50 0 0 33 50 0 h .3952 g 1149 2204 N -50 0 0 34 50 0 h .4051 g 1149 2238 N -50 0 0 33 50 0 h .4149 g 1149 2271 N -50 0 0 34 50 0 h .4248 g 1149 2305 N -50 0 0 34 50 0 h .4347 g 1149 2339 N -50 0 0 33 50 0 h .4446 g 1149 2372 N -50 0 0 34 50 0 h .4544 g 1149 2406 N -50 0 0 33 50 0 h .4643 g 1149 2439 N -50 0 0 34 50 0 h .4742 g 1149 2473 N -50 0 0 34 50 0 h .484 g 1149 2507 N -50 0 0 33 50 0 h .4939 g 1149 2540 N -50 0 0 34 50 0 h .5038 g 1149 2574 N -50 0 0 32 50 0 h .5137 g 1149 2606 N -50 0 0 34 50 0 h .5235 g 1149 2640 N -50 0 0 33 50 0 h .5334 g 1149 2673 N -50 0 0 34 50 0 h .5433 g 1149 2707 N -50 0 0 34 50 0 h .5531 g 1149 2741 N -50 0 0 33 50 0 h .563 g 1149 2774 N -50 0 0 34 50 0 h .5729 g 1149 2808 N -50 0 0 33 50 0 h .5828 g 1149 2841 N -50 0 0 34 50 0 h .5926 g 1149 2875 N -50 0 0 34 50 0 h .6025 g 1149 2909 N -50 0 0 33 50 0 h .6124 g 1149 2942 N -50 0 0 34 50 0 h .6222 g 1149 2976 N -50 0 0 33 50 0 h .6321 g 1149 3009 N -50 0 0 34 50 0 h .642 g 1149 3043 N -50 0 0 34 50 0 h .6519 g 1149 3077 N -50 0 0 33 50 0 h .6617 g 1149 3110 N -50 0 0 34 50 0 h .6716 g 1149 3144 N -50 0 0 33 50 0 h .6815 g 1149 3177 N -50 0 0 34 50 0 h .6913 g 1149 3211 N -50 0 0 34 50 0 h .7012 g 1149 3245 N -50 0 0 33 50 0 h .7111 g 1149 3278 N -50 0 0 34 50 0 h .721 g 1149 3312 N -50 0 0 33 50 0 h .7308 g 1149 3345 N -50 0 0 34 50 0 h .7407 g 1149 3379 N -50 0 0 33 50 0 h .7506 g 1149 3412 N -50 0 0 34 50 0 h .7604 g 1149 3446 N -50 0 0 34 50 0 h .7703 g 1149 3480 N -50 0 0 33 50 0 h .7802 g 1149 3513 N -50 0 0 34 50 0 h .7901 g 1149 3547 N -50 0 0 33 50 0 h .7999 g 1149 3580 N -50 0 0 34 50 0 h .8098 g 1149 3614 N -50 0 0 34 50 0 h .8197 g 1149 3648 N -50 0 0 33 50 0 h .8295 g 1149 3681 N -50 0 0 34 50 0 h .8394 g 1149 3715 N -50 0 0 33 50 0 h .8493 g 1149 3748 N -50 0 0 34 50 0 h .8592 g 1149 3782 N -50 0 0 34 50 0 h .869 g 1149 3816 N -50 0 0 33 50 0 h .8789 g 1149 3849 N -50 0 0 34 50 0 h .8888 g 1149 3883 N -50 0 0 33 50 0 h .8986 g 1149 3916 N -50 0 0 34 50 0 h .9085 g 1149 3950 N -50 0 0 33 50 0 h .9184 g 1149 3983 N -50 0 0 34 50 0 h .9283 g 1149 4017 N -50 0 0 34 50 0 h .9381 g 1149 4051 N -50 0 0 33 50 0 h .948 g 1149 4084 N -50 0 0 34 50 0 h .9579 g 1149 4118 N -50 0 0 33 50 0 h .9677 g 1149 4151 N -50 0 0 34 50 0 h .9776 g 1149 4185 N -50 0 0 34 50 0 h .9875 g 1149 4219 N -50 0 0 33 50 0 h .0301 g 1199 928 N -51 0 0 33 51 0 h .0398 g 1199 961 N -51 0 0 34 51 0 h .0495 g 1199 995 N -51 0 0 34 51 0 h .0593 g 1199 1029 N -51 0 0 33 51 0 h .069 g 1199 1062 N -51 0 0 34 51 0 h .0787 g 1199 1096 N -51 0 0 33 51 0 h .0884 g 1199 1129 N -51 0 0 34 51 0 h .0981 g 1199 1163 N -51 0 0 34 51 0 h .1079 g 1199 1197 N -51 0 0 33 51 0 h .1176 g 1199 1230 N -51 0 0 34 51 0 h .1273 g 1199 1264 N -51 0 0 33 51 0 h .137 g 1199 1297 N -51 0 0 34 51 0 h .1467 g 1199 1331 N -51 0 0 33 51 0 h .1565 g 1199 1364 N -51 0 0 34 51 0 h .1662 g 1199 1398 N -51 0 0 34 51 0 h .1759 g 1199 1432 N -51 0 0 33 51 0 h .1856 g 1199 1465 N -51 0 0 34 51 0 h .1953 g 1199 1499 N -51 0 0 33 51 0 h .205 g 1199 1532 N -51 0 0 34 51 0 h .2148 g 1199 1566 N -51 0 0 34 51 0 h .2245 g 1199 1600 N -51 0 0 33 51 0 h .2342 g 1199 1633 N -51 0 0 34 51 0 h .2439 g 1199 1667 N -51 0 0 33 51 0 h .2536 g 1199 1700 N -51 0 0 34 51 0 h .2634 g 1199 1734 N -51 0 0 34 51 0 h .2731 g 1199 1768 N -51 0 0 33 51 0 h .2828 g 1199 1801 N -51 0 0 34 51 0 h .2925 g 1199 1835 N -51 0 0 33 51 0 h .3022 g 1199 1868 N -51 0 0 34 51 0 h .3119 g 1199 1902 N -51 0 0 33 51 0 h .3217 g 1199 1935 N -51 0 0 34 51 0 h .3314 g 1199 1969 N -51 0 0 34 51 0 h .3411 g 1199 2003 N -51 0 0 33 51 0 h .3508 g 1199 2036 N -51 0 0 34 51 0 h .3605 g 1199 2070 N -51 0 0 33 51 0 h .3703 g 1199 2103 N -51 0 0 34 51 0 h .38 g 1199 2137 N -51 0 0 34 51 0 h .3897 g 1199 2171 N -51 0 0 33 51 0 h .3994 g 1199 2204 N -51 0 0 34 51 0 h .4091 g 1199 2238 N -51 0 0 33 51 0 h .4188 g 1199 2271 N -51 0 0 34 51 0 h .4286 g 1199 2305 N -51 0 0 34 51 0 h .4383 g 1199 2339 N -51 0 0 33 51 0 h .448 g 1199 2372 N -51 0 0 34 51 0 h .4577 g 1199 2406 N -51 0 0 33 51 0 h .4674 g 1199 2439 N -51 0 0 34 51 0 h .4772 g 1199 2473 N -51 0 0 34 51 0 h .4869 g 1199 2507 N -51 0 0 33 51 0 h .4966 g 1199 2540 N -51 0 0 34 51 0 h .5063 g 1199 2574 N -51 0 0 32 51 0 h .516 g 1199 2606 N -51 0 0 34 51 0 h .5258 g 1199 2640 N -51 0 0 33 51 0 h .5355 g 1199 2673 N -51 0 0 34 51 0 h .5452 g 1199 2707 N -51 0 0 34 51 0 h .5549 g 1199 2741 N -51 0 0 33 51 0 h .5646 g 1199 2774 N -51 0 0 34 51 0 h .5743 g 1199 2808 N -51 0 0 33 51 0 h .5841 g 1199 2841 N -51 0 0 34 51 0 h .5938 g 1199 2875 N -51 0 0 34 51 0 h .6035 g 1199 2909 N -51 0 0 33 51 0 h .6132 g 1199 2942 N -51 0 0 34 51 0 h .6229 g 1199 2976 N -51 0 0 33 51 0 h .6327 g 1199 3009 N -51 0 0 34 51 0 h .6424 g 1199 3043 N -51 0 0 34 51 0 h .6521 g 1199 3077 N -51 0 0 33 51 0 h .6618 g 1199 3110 N -51 0 0 34 51 0 h .6715 g 1199 3144 N -51 0 0 33 51 0 h .6812 g 1199 3177 N -51 0 0 34 51 0 h .691 g 1199 3211 N -51 0 0 34 51 0 h .7007 g 1199 3245 N -51 0 0 33 51 0 h .7104 g 1199 3278 N -51 0 0 34 51 0 h .7201 g 1199 3312 N -51 0 0 33 51 0 h .7298 g 1199 3345 N -51 0 0 34 51 0 h .7396 g 1199 3379 N -51 0 0 33 51 0 h .7493 g 1199 3412 N -51 0 0 34 51 0 h .759 g 1199 3446 N -51 0 0 34 51 0 h .7687 g 1199 3480 N -51 0 0 33 51 0 h .7784 g 1199 3513 N -51 0 0 34 51 0 h .7881 g 1199 3547 N -51 0 0 33 51 0 h .7979 g 1199 3580 N -51 0 0 34 51 0 h .8076 g 1199 3614 N -51 0 0 34 51 0 h .8173 g 1199 3648 N -51 0 0 33 51 0 h .827 g 1199 3681 N -51 0 0 34 51 0 h .8367 g 1199 3715 N -51 0 0 33 51 0 h .8465 g 1199 3748 N -51 0 0 34 51 0 h .8562 g 1199 3782 N -51 0 0 34 51 0 h .8659 g 1199 3816 N -51 0 0 33 51 0 h .8756 g 1199 3849 N -51 0 0 34 51 0 h .8853 g 1199 3883 N -51 0 0 33 51 0 h .895 g 1199 3916 N -51 0 0 34 51 0 h .9048 g 1199 3950 N -51 0 0 33 51 0 h .9145 g 1199 3983 N -51 0 0 34 51 0 h .9242 g 1199 4017 N -51 0 0 34 51 0 h .9339 g 1199 4051 N -51 0 0 33 51 0 h .9436 g 1199 4084 N -51 0 0 34 51 0 h .9534 g 1199 4118 N -51 0 0 33 51 0 h .9631 g 1199 4151 N -51 0 0 34 51 0 h .9728 g 1199 4185 N -51 0 0 34 51 0 h .9825 g 1199 4219 N -51 0 0 33 51 0 h .0401 g 1250 928 N -50 0 0 33 50 0 h .0497 g 1250 961 N -50 0 0 34 50 0 h .0593 g 1250 995 N -50 0 0 34 50 0 h .0688 g 1250 1029 N -50 0 0 33 50 0 h .0784 g 1250 1062 N -50 0 0 34 50 0 h .088 g 1250 1096 N -50 0 0 33 50 0 h .0975 g 1250 1129 N -50 0 0 34 50 0 h .1071 g 1250 1163 N -50 0 0 34 50 0 h .1167 g 1250 1197 N -50 0 0 33 50 0 h .1262 g 1250 1230 N -50 0 0 34 50 0 h .1358 g 1250 1264 N -50 0 0 33 50 0 h .1454 g 1250 1297 N -50 0 0 34 50 0 h .1549 g 1250 1331 N -50 0 0 33 50 0 h .1645 g 1250 1364 N -50 0 0 34 50 0 h .1741 g 1250 1398 N -50 0 0 34 50 0 h .1836 g 1250 1432 N -50 0 0 33 50 0 h .1932 g 1250 1465 N -50 0 0 34 50 0 h .2027 g 1250 1499 N -50 0 0 33 50 0 h .2123 g 1250 1532 N -50 0 0 34 50 0 h .2219 g 1250 1566 N -50 0 0 34 50 0 h .2314 g 1250 1600 N -50 0 0 33 50 0 h .241 g 1250 1633 N -50 0 0 34 50 0 h .2506 g 1250 1667 N -50 0 0 33 50 0 h .2601 g 1250 1700 N -50 0 0 34 50 0 h .2697 g 1250 1734 N -50 0 0 34 50 0 h .2793 g 1250 1768 N -50 0 0 33 50 0 h .2888 g 1250 1801 N -50 0 0 34 50 0 h .2984 g 1250 1835 N -50 0 0 33 50 0 h .308 g 1250 1868 N -50 0 0 34 50 0 h .3175 g 1250 1902 N -50 0 0 33 50 0 h .3271 g 1250 1935 N -50 0 0 34 50 0 h .3367 g 1250 1969 N -50 0 0 34 50 0 h .3462 g 1250 2003 N -50 0 0 33 50 0 h .3558 g 1250 2036 N -50 0 0 34 50 0 h .3654 g 1250 2070 N -50 0 0 33 50 0 h .3749 g 1250 2103 N -50 0 0 34 50 0 h .3845 g 1250 2137 N -50 0 0 34 50 0 h .3941 g 1250 2171 N -50 0 0 33 50 0 h .4036 g 1250 2204 N -50 0 0 34 50 0 h .4132 g 1250 2238 N -50 0 0 33 50 0 h .4228 g 1250 2271 N -50 0 0 34 50 0 h .4323 g 1250 2305 N -50 0 0 34 50 0 h .4419 g 1250 2339 N -50 0 0 33 50 0 h .4514 g 1250 2372 N -50 0 0 34 50 0 h .461 g 1250 2406 N -50 0 0 33 50 0 h .4706 g 1250 2439 N -50 0 0 34 50 0 h .4801 g 1250 2473 N -50 0 0 34 50 0 h .4897 g 1250 2507 N -50 0 0 33 50 0 h .4993 g 1250 2540 N -50 0 0 34 50 0 h .5088 g 1250 2574 N -50 0 0 32 50 0 h .5184 g 1250 2606 N -50 0 0 34 50 0 h .528 g 1250 2640 N -50 0 0 33 50 0 h .5375 g 1250 2673 N -50 0 0 34 50 0 h .5471 g 1250 2707 N -50 0 0 34 50 0 h .5567 g 1250 2741 N -50 0 0 33 50 0 h .5662 g 1250 2774 N -50 0 0 34 50 0 h .5758 g 1250 2808 N -50 0 0 33 50 0 h .5854 g 1250 2841 N -50 0 0 34 50 0 h .5949 g 1250 2875 N -50 0 0 34 50 0 h .6045 g 1250 2909 N -50 0 0 33 50 0 h .6141 g 1250 2942 N -50 0 0 34 50 0 h .6236 g 1250 2976 N -50 0 0 33 50 0 h .6332 g 1250 3009 N -50 0 0 34 50 0 h .6428 g 1250 3043 N -50 0 0 34 50 0 h .6523 g 1250 3077 N -50 0 0 33 50 0 h .6619 g 1250 3110 N -50 0 0 34 50 0 h .6714 g 1250 3144 N -50 0 0 33 50 0 h .681 g 1250 3177 N -50 0 0 34 50 0 h .6906 g 1250 3211 N -50 0 0 34 50 0 h .7001 g 1250 3245 N -50 0 0 33 50 0 h .7097 g 1250 3278 N -50 0 0 34 50 0 h .7193 g 1250 3312 N -50 0 0 33 50 0 h .7288 g 1250 3345 N -50 0 0 34 50 0 h .7384 g 1250 3379 N -50 0 0 33 50 0 h .748 g 1250 3412 N -50 0 0 34 50 0 h .7575 g 1250 3446 N -50 0 0 34 50 0 h .7671 g 1250 3480 N -50 0 0 33 50 0 h .7767 g 1250 3513 N -50 0 0 34 50 0 h .7862 g 1250 3547 N -50 0 0 33 50 0 h .7958 g 1250 3580 N -50 0 0 34 50 0 h .8054 g 1250 3614 N -50 0 0 34 50 0 h .8149 g 1250 3648 N -50 0 0 33 50 0 h .8245 g 1250 3681 N -50 0 0 34 50 0 h .8341 g 1250 3715 N -50 0 0 33 50 0 h .8436 g 1250 3748 N -50 0 0 34 50 0 h .8532 g 1250 3782 N -50 0 0 34 50 0 h .8628 g 1250 3816 N -50 0 0 33 50 0 h .8723 g 1250 3849 N -50 0 0 34 50 0 h .8819 g 1250 3883 N -50 0 0 33 50 0 h .8915 g 1250 3916 N -50 0 0 34 50 0 h .901 g 1250 3950 N -50 0 0 33 50 0 h .9106 g 1250 3983 N -50 0 0 34 50 0 h .9201 g 1250 4017 N -50 0 0 34 50 0 h .9297 g 1250 4051 N -50 0 0 33 50 0 h .9393 g 1250 4084 N -50 0 0 34 50 0 h .9488 g 1250 4118 N -50 0 0 33 50 0 h .9584 g 1250 4151 N -50 0 0 34 50 0 h .968 g 1250 4185 N -50 0 0 34 50 0 h .9775 g 1250 4219 N -50 0 0 33 50 0 h .0502 g 1300 928 N -51 0 0 33 51 0 h .0596 g 1300 961 N -51 0 0 34 51 0 h .069 g 1300 995 N -51 0 0 34 51 0 h .0784 g 1300 1029 N -51 0 0 33 51 0 h .0878 g 1300 1062 N -51 0 0 34 51 0 h .0972 g 1300 1096 N -51 0 0 33 51 0 h .1066 g 1300 1129 N -51 0 0 34 51 0 h .116 g 1300 1163 N -51 0 0 34 51 0 h .1255 g 1300 1197 N -51 0 0 33 51 0 h .1349 g 1300 1230 N -51 0 0 34 51 0 h .1443 g 1300 1264 N -51 0 0 33 51 0 h .1537 g 1300 1297 N -51 0 0 34 51 0 h .1631 g 1300 1331 N -51 0 0 33 51 0 h .1725 g 1300 1364 N -51 0 0 34 51 0 h .1819 g 1300 1398 N -51 0 0 34 51 0 h .1913 g 1300 1432 N -51 0 0 33 51 0 h .2008 g 1300 1465 N -51 0 0 34 51 0 h .2102 g 1300 1499 N -51 0 0 33 51 0 h .2196 g 1300 1532 N -51 0 0 34 51 0 h .229 g 1300 1566 N -51 0 0 34 51 0 h .2384 g 1300 1600 N -51 0 0 33 51 0 h .2478 g 1300 1633 N -51 0 0 34 51 0 h .2572 g 1300 1667 N -51 0 0 33 51 0 h .2666 g 1300 1700 N -51 0 0 34 51 0 h .2761 g 1300 1734 N -51 0 0 34 51 0 h .2855 g 1300 1768 N -51 0 0 33 51 0 h .2949 g 1300 1801 N -51 0 0 34 51 0 h .3043 g 1300 1835 N -51 0 0 33 51 0 h .3137 g 1300 1868 N -51 0 0 34 51 0 h .3231 g 1300 1902 N -51 0 0 33 51 0 h .3325 g 1300 1935 N -51 0 0 34 51 0 h .3419 g 1300 1969 N -51 0 0 34 51 0 h .3514 g 1300 2003 N -51 0 0 33 51 0 h .3608 g 1300 2036 N -51 0 0 34 51 0 h .3702 g 1300 2070 N -51 0 0 33 51 0 h .3796 g 1300 2103 N -51 0 0 34 51 0 h .389 g 1300 2137 N -51 0 0 34 51 0 h .3984 g 1300 2171 N -51 0 0 33 51 0 h .4078 g 1300 2204 N -51 0 0 34 51 0 h .4172 g 1300 2238 N -51 0 0 33 51 0 h .4267 g 1300 2271 N -51 0 0 34 51 0 h .4361 g 1300 2305 N -51 0 0 34 51 0 h .4455 g 1300 2339 N -51 0 0 33 51 0 h .4549 g 1300 2372 N -51 0 0 34 51 0 h .4643 g 1300 2406 N -51 0 0 33 51 0 h .4737 g 1300 2439 N -51 0 0 34 51 0 h .4831 g 1300 2473 N -51 0 0 34 51 0 h .4925 g 1300 2507 N -51 0 0 33 51 0 h .502 g 1300 2540 N -51 0 0 34 51 0 h .5114 g 1300 2574 N -51 0 0 32 51 0 h .5208 g 1300 2606 N -51 0 0 34 51 0 h .5302 g 1300 2640 N -51 0 0 33 51 0 h .5396 g 1300 2673 N -51 0 0 34 51 0 h .549 g 1300 2707 N -51 0 0 34 51 0 h .5584 g 1300 2741 N -51 0 0 33 51 0 h .5678 g 1300 2774 N -51 0 0 34 51 0 h .5772 g 1300 2808 N -51 0 0 33 51 0 h .5867 g 1300 2841 N -51 0 0 34 51 0 h .5961 g 1300 2875 N -51 0 0 34 51 0 h .6055 g 1300 2909 N -51 0 0 33 51 0 h .6149 g 1300 2942 N -51 0 0 34 51 0 h .6243 g 1300 2976 N -51 0 0 33 51 0 h .6337 g 1300 3009 N -51 0 0 34 51 0 h .6431 g 1300 3043 N -51 0 0 34 51 0 h .6525 g 1300 3077 N -51 0 0 33 51 0 h .662 g 1300 3110 N -51 0 0 34 51 0 h .6714 g 1300 3144 N -51 0 0 33 51 0 h .6808 g 1300 3177 N -51 0 0 34 51 0 h .6902 g 1300 3211 N -51 0 0 34 51 0 h .6996 g 1300 3245 N -51 0 0 33 51 0 h .709 g 1300 3278 N -51 0 0 34 51 0 h .7184 g 1300 3312 N -51 0 0 33 51 0 h .7278 g 1300 3345 N -51 0 0 34 51 0 h .7373 g 1300 3379 N -51 0 0 33 51 0 h .7467 g 1300 3412 N -51 0 0 34 51 0 h .7561 g 1300 3446 N -51 0 0 34 51 0 h .7655 g 1300 3480 N -51 0 0 33 51 0 h .7749 g 1300 3513 N -51 0 0 34 51 0 h .7843 g 1300 3547 N -51 0 0 33 51 0 h .7937 g 1300 3580 N -51 0 0 34 51 0 h .8031 g 1300 3614 N -51 0 0 34 51 0 h .8126 g 1300 3648 N -51 0 0 33 51 0 h .822 g 1300 3681 N -51 0 0 34 51 0 h .8314 g 1300 3715 N -51 0 0 33 51 0 h .8408 g 1300 3748 N -51 0 0 34 51 0 h .8502 g 1300 3782 N -51 0 0 34 51 0 h .8596 g 1300 3816 N -51 0 0 33 51 0 h .869 g 1300 3849 N -51 0 0 34 51 0 h .8784 g 1300 3883 N -51 0 0 33 51 0 h .8879 g 1300 3916 N -51 0 0 34 51 0 h .8973 g 1300 3950 N -51 0 0 33 51 0 h .9067 g 1300 3983 N -51 0 0 34 51 0 h .9161 g 1300 4017 N -51 0 0 34 51 0 h .9255 g 1300 4051 N -51 0 0 33 51 0 h .9349 g 1300 4084 N -51 0 0 34 51 0 h .9443 g 1300 4118 N -51 0 0 33 51 0 h .9537 g 1300 4151 N -51 0 0 34 51 0 h .9632 g 1300 4185 N -51 0 0 34 51 0 h .9726 g 1300 4219 N -51 0 0 33 51 0 h .0602 g 1351 928 N -50 0 0 33 50 0 h .0694 g 1351 961 N -50 0 0 34 50 0 h .0787 g 1351 995 N -50 0 0 34 50 0 h .088 g 1351 1029 N -50 0 0 33 50 0 h .0972 g 1351 1062 N -50 0 0 34 50 0 h .1065 g 1351 1096 N -50 0 0 33 50 0 h .1157 g 1351 1129 N -50 0 0 34 50 0 h .125 g 1351 1163 N -50 0 0 34 50 0 h .1343 g 1351 1197 N -50 0 0 33 50 0 h .1435 g 1351 1230 N -50 0 0 34 50 0 h .1528 g 1351 1264 N -50 0 0 33 50 0 h .162 g 1351 1297 N -50 0 0 34 50 0 h .1713 g 1351 1331 N -50 0 0 33 50 0 h .1806 g 1351 1364 N -50 0 0 34 50 0 h .1898 g 1351 1398 N -50 0 0 34 50 0 h .1991 g 1351 1432 N -50 0 0 33 50 0 h .2083 g 1351 1465 N -50 0 0 34 50 0 h .2176 g 1351 1499 N -50 0 0 33 50 0 h .2269 g 1351 1532 N -50 0 0 34 50 0 h .2361 g 1351 1566 N -50 0 0 34 50 0 h .2454 g 1351 1600 N -50 0 0 33 50 0 h .2546 g 1351 1633 N -50 0 0 34 50 0 h .2639 g 1351 1667 N -50 0 0 33 50 0 h .2731 g 1351 1700 N -50 0 0 34 50 0 h .2824 g 1351 1734 N -50 0 0 34 50 0 h .2917 g 1351 1768 N -50 0 0 33 50 0 h .3009 g 1351 1801 N -50 0 0 34 50 0 h .3102 g 1351 1835 N -50 0 0 33 50 0 h .3194 g 1351 1868 N -50 0 0 34 50 0 h .3287 g 1351 1902 N -50 0 0 33 50 0 h .338 g 1351 1935 N -50 0 0 34 50 0 h .3472 g 1351 1969 N -50 0 0 34 50 0 h .3565 g 1351 2003 N -50 0 0 33 50 0 h .3657 g 1351 2036 N -50 0 0 34 50 0 h .375 g 1351 2070 N -50 0 0 33 50 0 h .3843 g 1351 2103 N -50 0 0 34 50 0 h .3935 g 1351 2137 N -50 0 0 34 50 0 h .4028 g 1351 2171 N -50 0 0 33 50 0 h .412 g 1351 2204 N -50 0 0 34 50 0 h .4213 g 1351 2238 N -50 0 0 33 50 0 h .4306 g 1351 2271 N -50 0 0 34 50 0 h .4398 g 1351 2305 N -50 0 0 34 50 0 h .4491 g 1351 2339 N -50 0 0 33 50 0 h .4583 g 1351 2372 N -50 0 0 34 50 0 h .4676 g 1351 2406 N -50 0 0 33 50 0 h .4769 g 1351 2439 N -50 0 0 34 50 0 h .4861 g 1351 2473 N -50 0 0 34 50 0 h .4954 g 1351 2507 N -50 0 0 33 50 0 h .5046 g 1351 2540 N -50 0 0 34 50 0 h .5139 g 1351 2574 N -50 0 0 32 50 0 h .5231 g 1351 2606 N -50 0 0 34 50 0 h .5324 g 1351 2640 N -50 0 0 33 50 0 h .5417 g 1351 2673 N -50 0 0 34 50 0 h .5509 g 1351 2707 N -50 0 0 34 50 0 h .5602 g 1351 2741 N -50 0 0 33 50 0 h .5694 g 1351 2774 N -50 0 0 34 50 0 h .5787 g 1351 2808 N -50 0 0 33 50 0 h .588 g 1351 2841 N -50 0 0 34 50 0 h .5972 g 1351 2875 N -50 0 0 34 50 0 h .6065 g 1351 2909 N -50 0 0 33 50 0 h .6157 g 1351 2942 N -50 0 0 34 50 0 h .625 g 1351 2976 N -50 0 0 33 50 0 h .6343 g 1351 3009 N -50 0 0 34 50 0 h .6435 g 1351 3043 N -50 0 0 34 50 0 h .6528 g 1351 3077 N -50 0 0 33 50 0 h .662 g 1351 3110 N -50 0 0 34 50 0 h .6713 g 1351 3144 N -50 0 0 33 50 0 h .6806 g 1351 3177 N -50 0 0 34 50 0 h .6898 g 1351 3211 N -50 0 0 34 50 0 h .6991 g 1351 3245 N -50 0 0 33 50 0 h .7083 g 1351 3278 N -50 0 0 34 50 0 h .7176 g 1351 3312 N -50 0 0 33 50 0 h .7269 g 1351 3345 N -50 0 0 34 50 0 h .7361 g 1351 3379 N -50 0 0 33 50 0 h .7454 g 1351 3412 N -50 0 0 34 50 0 h .7546 g 1351 3446 N -50 0 0 34 50 0 h .7639 g 1351 3480 N -50 0 0 33 50 0 h .7731 g 1351 3513 N -50 0 0 34 50 0 h .7824 g 1351 3547 N -50 0 0 33 50 0 h .7917 g 1351 3580 N -50 0 0 34 50 0 h .8009 g 1351 3614 N -50 0 0 34 50 0 h .8102 g 1351 3648 N -50 0 0 33 50 0 h .8194 g 1351 3681 N -50 0 0 34 50 0 h .8287 g 1351 3715 N -50 0 0 33 50 0 h .838 g 1351 3748 N -50 0 0 34 50 0 h .8472 g 1351 3782 N -50 0 0 34 50 0 h .8565 g 1351 3816 N -50 0 0 33 50 0 h .8657 g 1351 3849 N -50 0 0 34 50 0 h .875 g 1351 3883 N -50 0 0 33 50 0 h .8843 g 1351 3916 N -50 0 0 34 50 0 h .8935 g 1351 3950 N -50 0 0 33 50 0 h .9028 g 1351 3983 N -50 0 0 34 50 0 h .912 g 1351 4017 N -50 0 0 34 50 0 h .9213 g 1351 4051 N -50 0 0 33 50 0 h .9306 g 1351 4084 N -50 0 0 34 50 0 h .9398 g 1351 4118 N -50 0 0 33 50 0 h .9491 g 1351 4151 N -50 0 0 34 50 0 h .9583 g 1351 4185 N -50 0 0 34 50 0 h .9676 g 1351 4219 N -50 0 0 33 50 0 h .0702 g 1401 928 N -51 0 0 33 51 0 h .0793 g 1401 961 N -51 0 0 34 51 0 h .0884 g 1401 995 N -51 0 0 34 51 0 h .0975 g 1401 1029 N -51 0 0 33 51 0 h .1066 g 1401 1062 N -51 0 0 34 51 0 h .1157 g 1401 1096 N -51 0 0 33 51 0 h .1248 g 1401 1129 N -51 0 0 34 51 0 h .134 g 1401 1163 N -51 0 0 34 51 0 h .1431 g 1401 1197 N -51 0 0 33 51 0 h .1522 g 1401 1230 N -51 0 0 34 51 0 h .1613 g 1401 1264 N -51 0 0 33 51 0 h .1704 g 1401 1297 N -51 0 0 34 51 0 h .1795 g 1401 1331 N -51 0 0 33 51 0 h .1886 g 1401 1364 N -51 0 0 34 51 0 h .1977 g 1401 1398 N -51 0 0 34 51 0 h .2068 g 1401 1432 N -51 0 0 33 51 0 h .2159 g 1401 1465 N -51 0 0 34 51 0 h .225 g 1401 1499 N -51 0 0 33 51 0 h .2341 g 1401 1532 N -51 0 0 34 51 0 h .2432 g 1401 1566 N -51 0 0 34 51 0 h .2523 g 1401 1600 N -51 0 0 33 51 0 h .2614 g 1401 1633 N -51 0 0 34 51 0 h .2705 g 1401 1667 N -51 0 0 33 51 0 h .2797 g 1401 1700 N -51 0 0 34 51 0 h .2888 g 1401 1734 N -51 0 0 34 51 0 h .2979 g 1401 1768 N -51 0 0 33 51 0 h .307 g 1401 1801 N -51 0 0 34 51 0 h .3161 g 1401 1835 N -51 0 0 33 51 0 h .3252 g 1401 1868 N -51 0 0 34 51 0 h .3343 g 1401 1902 N -51 0 0 33 51 0 h .3434 g 1401 1935 N -51 0 0 34 51 0 h .3525 g 1401 1969 N -51 0 0 34 51 0 h .3616 g 1401 2003 N -51 0 0 33 51 0 h .3707 g 1401 2036 N -51 0 0 34 51 0 h .3798 g 1401 2070 N -51 0 0 33 51 0 h .3889 g 1401 2103 N -51 0 0 34 51 0 h .398 g 1401 2137 N -51 0 0 34 51 0 h .4071 g 1401 2171 N -51 0 0 33 51 0 h .4162 g 1401 2204 N -51 0 0 34 51 0 h .4254 g 1401 2238 N -51 0 0 33 51 0 h .4345 g 1401 2271 N -51 0 0 34 51 0 h .4436 g 1401 2305 N -51 0 0 34 51 0 h .4527 g 1401 2339 N -51 0 0 33 51 0 h .4618 g 1401 2372 N -51 0 0 34 51 0 h .4709 g 1401 2406 N -51 0 0 33 51 0 h .48 g 1401 2439 N -51 0 0 34 51 0 h .4891 g 1401 2473 N -51 0 0 34 51 0 h .4982 g 1401 2507 N -51 0 0 33 51 0 h .5073 g 1401 2540 N -51 0 0 34 51 0 h .5164 g 1401 2574 N -51 0 0 32 51 0 h .5255 g 1401 2606 N -51 0 0 34 51 0 h .5346 g 1401 2640 N -51 0 0 33 51 0 h .5437 g 1401 2673 N -51 0 0 34 51 0 h .5528 g 1401 2707 N -51 0 0 34 51 0 h .5619 g 1401 2741 N -51 0 0 33 51 0 h .5711 g 1401 2774 N -51 0 0 34 51 0 h .5802 g 1401 2808 N -51 0 0 33 51 0 h .5893 g 1401 2841 N -51 0 0 34 51 0 h .5984 g 1401 2875 N -51 0 0 34 51 0 h .6075 g 1401 2909 N -51 0 0 33 51 0 h .6166 g 1401 2942 N -51 0 0 34 51 0 h .6257 g 1401 2976 N -51 0 0 33 51 0 h .6348 g 1401 3009 N -51 0 0 34 51 0 h .6439 g 1401 3043 N -51 0 0 34 51 0 h .653 g 1401 3077 N -51 0 0 33 51 0 h .6621 g 1401 3110 N -51 0 0 34 51 0 h .6712 g 1401 3144 N -51 0 0 33 51 0 h .6803 g 1401 3177 N -51 0 0 34 51 0 h .6894 g 1401 3211 N -51 0 0 34 51 0 h .6985 g 1401 3245 N -51 0 0 33 51 0 h .7076 g 1401 3278 N -51 0 0 34 51 0 h .7168 g 1401 3312 N -51 0 0 33 51 0 h .7259 g 1401 3345 N -51 0 0 34 51 0 h .735 g 1401 3379 N -51 0 0 33 51 0 h .7441 g 1401 3412 N -51 0 0 34 51 0 h .7532 g 1401 3446 N -51 0 0 34 51 0 h .7623 g 1401 3480 N -51 0 0 33 51 0 h .7714 g 1401 3513 N -51 0 0 34 51 0 h .7805 g 1401 3547 N -51 0 0 33 51 0 h .7896 g 1401 3580 N -51 0 0 34 51 0 h .7987 g 1401 3614 N -51 0 0 34 51 0 h .8078 g 1401 3648 N -51 0 0 33 51 0 h .8169 g 1401 3681 N -51 0 0 34 51 0 h .826 g 1401 3715 N -51 0 0 33 51 0 h .8351 g 1401 3748 N -51 0 0 34 51 0 h .8442 g 1401 3782 N -51 0 0 34 51 0 h .8533 g 1401 3816 N -51 0 0 33 51 0 h .8625 g 1401 3849 N -51 0 0 34 51 0 h .8716 g 1401 3883 N -51 0 0 33 51 0 h .8807 g 1401 3916 N -51 0 0 34 51 0 h .8898 g 1401 3950 N -51 0 0 33 51 0 h .8989 g 1401 3983 N -51 0 0 34 51 0 h .908 g 1401 4017 N -51 0 0 34 51 0 h .9171 g 1401 4051 N -51 0 0 33 51 0 h .9262 g 1401 4084 N -51 0 0 34 51 0 h .9353 g 1401 4118 N -51 0 0 33 51 0 h .9444 g 1401 4151 N -51 0 0 34 51 0 h .9535 g 1401 4185 N -51 0 0 34 51 0 h .9626 g 1401 4219 N -51 0 0 33 51 0 h .0802 g 1452 928 N -50 0 0 33 50 0 h .0892 g 1452 961 N -50 0 0 34 50 0 h .0981 g 1452 995 N -50 0 0 34 50 0 h .1071 g 1452 1029 N -50 0 0 33 50 0 h .116 g 1452 1062 N -50 0 0 34 50 0 h .125 g 1452 1096 N -50 0 0 33 50 0 h .134 g 1452 1129 N -50 0 0 34 50 0 h .1429 g 1452 1163 N -50 0 0 34 50 0 h .1519 g 1452 1197 N -50 0 0 33 50 0 h .1608 g 1452 1230 N -50 0 0 34 50 0 h .1698 g 1452 1264 N -50 0 0 33 50 0 h .1787 g 1452 1297 N -50 0 0 34 50 0 h .1877 g 1452 1331 N -50 0 0 33 50 0 h .1966 g 1452 1364 N -50 0 0 34 50 0 h .2056 g 1452 1398 N -50 0 0 34 50 0 h .2145 g 1452 1432 N -50 0 0 33 50 0 h .2235 g 1452 1465 N -50 0 0 34 50 0 h .2324 g 1452 1499 N -50 0 0 33 50 0 h .2414 g 1452 1532 N -50 0 0 34 50 0 h .2503 g 1452 1566 N -50 0 0 34 50 0 h .2593 g 1452 1600 N -50 0 0 33 50 0 h .2683 g 1452 1633 N -50 0 0 34 50 0 h .2772 g 1452 1667 N -50 0 0 33 50 0 h .2862 g 1452 1700 N -50 0 0 34 50 0 h .2951 g 1452 1734 N -50 0 0 34 50 0 h .3041 g 1452 1768 N -50 0 0 33 50 0 h .313 g 1452 1801 N -50 0 0 34 50 0 h .322 g 1452 1835 N -50 0 0 33 50 0 h .3309 g 1452 1868 N -50 0 0 34 50 0 h .3399 g 1452 1902 N -50 0 0 33 50 0 h .3488 g 1452 1935 N -50 0 0 34 50 0 h .3578 g 1452 1969 N -50 0 0 34 50 0 h .3667 g 1452 2003 N -50 0 0 33 50 0 h .3757 g 1452 2036 N -50 0 0 34 50 0 h .3846 g 1452 2070 N -50 0 0 33 50 0 h .3936 g 1452 2103 N -50 0 0 34 50 0 h .4025 g 1452 2137 N -50 0 0 34 50 0 h .4115 g 1452 2171 N -50 0 0 33 50 0 h .4205 g 1452 2204 N -50 0 0 34 50 0 h .4294 g 1452 2238 N -50 0 0 33 50 0 h .4384 g 1452 2271 N -50 0 0 34 50 0 h .4473 g 1452 2305 N -50 0 0 34 50 0 h .4563 g 1452 2339 N -50 0 0 33 50 0 h .4652 g 1452 2372 N -50 0 0 34 50 0 h .4742 g 1452 2406 N -50 0 0 33 50 0 h .4831 g 1452 2439 N -50 0 0 34 50 0 h .4921 g 1452 2473 N -50 0 0 34 50 0 h .501 g 1452 2507 N -50 0 0 33 50 0 h .51 g 1452 2540 N -50 0 0 34 50 0 h .5189 g 1452 2574 N -50 0 0 32 50 0 h .5279 g 1452 2606 N -50 0 0 34 50 0 h .5368 g 1452 2640 N -50 0 0 33 50 0 h .5458 g 1452 2673 N -50 0 0 34 50 0 h .5548 g 1452 2707 N -50 0 0 34 50 0 h .5637 g 1452 2741 N -50 0 0 33 50 0 h .5727 g 1452 2774 N -50 0 0 34 50 0 h .5816 g 1452 2808 N -50 0 0 33 50 0 h .5906 g 1452 2841 N -50 0 0 34 50 0 h .5995 g 1452 2875 N -50 0 0 34 50 0 h .6085 g 1452 2909 N -50 0 0 33 50 0 h .6174 g 1452 2942 N -50 0 0 34 50 0 h .6264 g 1452 2976 N -50 0 0 33 50 0 h .6353 g 1452 3009 N -50 0 0 34 50 0 h .6443 g 1452 3043 N -50 0 0 34 50 0 h .6532 g 1452 3077 N -50 0 0 33 50 0 h .6622 g 1452 3110 N -50 0 0 34 50 0 h .6711 g 1452 3144 N -50 0 0 33 50 0 h .6801 g 1452 3177 N -50 0 0 34 50 0 h .689 g 1452 3211 N -50 0 0 34 50 0 h .698 g 1452 3245 N -50 0 0 33 50 0 h .707 g 1452 3278 N -50 0 0 34 50 0 h .7159 g 1452 3312 N -50 0 0 33 50 0 h .7249 g 1452 3345 N -50 0 0 34 50 0 h .7338 g 1452 3379 N -50 0 0 33 50 0 h .7428 g 1452 3412 N -50 0 0 34 50 0 h .7517 g 1452 3446 N -50 0 0 34 50 0 h .7607 g 1452 3480 N -50 0 0 33 50 0 h .7696 g 1452 3513 N -50 0 0 34 50 0 h .7786 g 1452 3547 N -50 0 0 33 50 0 h .7875 g 1452 3580 N -50 0 0 34 50 0 h .7965 g 1452 3614 N -50 0 0 34 50 0 h .8054 g 1452 3648 N -50 0 0 33 50 0 h .8144 g 1452 3681 N -50 0 0 34 50 0 h .8233 g 1452 3715 N -50 0 0 33 50 0 h .8323 g 1452 3748 N -50 0 0 34 50 0 h .8413 g 1452 3782 N -50 0 0 34 50 0 h .8502 g 1452 3816 N -50 0 0 33 50 0 h .8592 g 1452 3849 N -50 0 0 34 50 0 h .8681 g 1452 3883 N -50 0 0 33 50 0 h .8771 g 1452 3916 N -50 0 0 34 50 0 h .886 g 1452 3950 N -50 0 0 33 50 0 h .895 g 1452 3983 N -50 0 0 34 50 0 h .9039 g 1452 4017 N -50 0 0 34 50 0 h .9129 g 1452 4051 N -50 0 0 33 50 0 h .9218 g 1452 4084 N -50 0 0 34 50 0 h .9308 g 1452 4118 N -50 0 0 33 50 0 h .9397 g 1452 4151 N -50 0 0 34 50 0 h .9487 g 1452 4185 N -50 0 0 34 50 0 h .9576 g 1452 4219 N -50 0 0 33 50 0 h .0903 g 1502 928 N -51 0 0 33 51 0 h .0991 g 1502 961 N -51 0 0 34 51 0 h .1079 g 1502 995 N -51 0 0 34 51 0 h .1167 g 1502 1029 N -51 0 0 33 51 0 h .1255 g 1502 1062 N -51 0 0 34 51 0 h .1343 g 1502 1096 N -51 0 0 33 51 0 h .1431 g 1502 1129 N -51 0 0 34 51 0 h .1519 g 1502 1163 N -51 0 0 34 51 0 h .1607 g 1502 1197 N -51 0 0 33 51 0 h .1695 g 1502 1230 N -51 0 0 34 51 0 h .1783 g 1502 1264 N -51 0 0 33 51 0 h .1871 g 1502 1297 N -51 0 0 34 51 0 h .1959 g 1502 1331 N -51 0 0 33 51 0 h .2047 g 1502 1364 N -51 0 0 34 51 0 h .2135 g 1502 1398 N -51 0 0 34 51 0 h .2223 g 1502 1432 N -51 0 0 33 51 0 h .2311 g 1502 1465 N -51 0 0 34 51 0 h .2399 g 1502 1499 N -51 0 0 33 51 0 h .2487 g 1502 1532 N -51 0 0 34 51 0 h .2575 g 1502 1566 N -51 0 0 34 51 0 h .2663 g 1502 1600 N -51 0 0 33 51 0 h .2751 g 1502 1633 N -51 0 0 34 51 0 h .2839 g 1502 1667 N -51 0 0 33 51 0 h .2927 g 1502 1700 N -51 0 0 34 51 0 h .3015 g 1502 1734 N -51 0 0 34 51 0 h .3103 g 1502 1768 N -51 0 0 33 51 0 h .3191 g 1502 1801 N -51 0 0 34 51 0 h .3279 g 1502 1835 N -51 0 0 33 51 0 h .3367 g 1502 1868 N -51 0 0 34 51 0 h .3455 g 1502 1902 N -51 0 0 33 51 0 h .3543 g 1502 1935 N -51 0 0 34 51 0 h .3631 g 1502 1969 N -51 0 0 34 51 0 h .3719 g 1502 2003 N -51 0 0 33 51 0 h .3807 g 1502 2036 N -51 0 0 34 51 0 h .3895 g 1502 2070 N -51 0 0 33 51 0 h .3983 g 1502 2103 N -51 0 0 34 51 0 h .4071 g 1502 2137 N -51 0 0 34 51 0 h .4159 g 1502 2171 N -51 0 0 33 51 0 h .4247 g 1502 2204 N -51 0 0 34 51 0 h .4335 g 1502 2238 N -51 0 0 33 51 0 h .4423 g 1502 2271 N -51 0 0 34 51 0 h .4511 g 1502 2305 N -51 0 0 34 51 0 h .4599 g 1502 2339 N -51 0 0 33 51 0 h .4687 g 1502 2372 N -51 0 0 34 51 0 h .4775 g 1502 2406 N -51 0 0 33 51 0 h .4863 g 1502 2439 N -51 0 0 34 51 0 h .4951 g 1502 2473 N -51 0 0 34 51 0 h .5039 g 1502 2507 N -51 0 0 33 51 0 h .5127 g 1502 2540 N -51 0 0 34 51 0 h .5215 g 1502 2574 N -51 0 0 32 51 0 h .5303 g 1502 2606 N -51 0 0 34 51 0 h .5391 g 1502 2640 N -51 0 0 33 51 0 h .5479 g 1502 2673 N -51 0 0 34 51 0 h .5567 g 1502 2707 N -51 0 0 34 51 0 h .5655 g 1502 2741 N -51 0 0 33 51 0 h .5743 g 1502 2774 N -51 0 0 34 51 0 h .5831 g 1502 2808 N -51 0 0 33 51 0 h .5919 g 1502 2841 N -51 0 0 34 51 0 h .6007 g 1502 2875 N -51 0 0 34 51 0 h .6095 g 1502 2909 N -51 0 0 33 51 0 h .6183 g 1502 2942 N -51 0 0 34 51 0 h .6271 g 1502 2976 N -51 0 0 33 51 0 h .6359 g 1502 3009 N -51 0 0 34 51 0 h .6447 g 1502 3043 N -51 0 0 34 51 0 h .6535 g 1502 3077 N -51 0 0 33 51 0 h .6623 g 1502 3110 N -51 0 0 34 51 0 h .6711 g 1502 3144 N -51 0 0 33 51 0 h .6799 g 1502 3177 N -51 0 0 34 51 0 h .6887 g 1502 3211 N -51 0 0 34 51 0 h .6975 g 1502 3245 N -51 0 0 33 51 0 h .7063 g 1502 3278 N -51 0 0 34 51 0 h .7151 g 1502 3312 N -51 0 0 33 51 0 h .7239 g 1502 3345 N -51 0 0 34 51 0 h .7327 g 1502 3379 N -51 0 0 33 51 0 h .7415 g 1502 3412 N -51 0 0 34 51 0 h .7503 g 1502 3446 N -51 0 0 34 51 0 h .7591 g 1502 3480 N -51 0 0 33 51 0 h .7679 g 1502 3513 N -51 0 0 34 51 0 h .7767 g 1502 3547 N -51 0 0 33 51 0 h .7855 g 1502 3580 N -51 0 0 34 51 0 h .7943 g 1502 3614 N -51 0 0 34 51 0 h .8031 g 1502 3648 N -51 0 0 33 51 0 h .8119 g 1502 3681 N -51 0 0 34 51 0 h .8207 g 1502 3715 N -51 0 0 33 51 0 h .8295 g 1502 3748 N -51 0 0 34 51 0 h .8383 g 1502 3782 N -51 0 0 34 51 0 h .8471 g 1502 3816 N -51 0 0 33 51 0 h .8559 g 1502 3849 N -51 0 0 34 51 0 h .8647 g 1502 3883 N -51 0 0 33 51 0 h .8735 g 1502 3916 N -51 0 0 34 51 0 h .8823 g 1502 3950 N -51 0 0 33 51 0 h .8911 g 1502 3983 N -51 0 0 34 51 0 h .8999 g 1502 4017 N -51 0 0 34 51 0 h .9087 g 1502 4051 N -51 0 0 33 51 0 h .9175 g 1502 4084 N -51 0 0 34 51 0 h .9263 g 1502 4118 N -51 0 0 33 51 0 h .9351 g 1502 4151 N -51 0 0 34 51 0 h .9439 g 1502 4185 N -51 0 0 34 51 0 h .9527 g 1502 4219 N -51 0 0 33 51 0 h .1003 g 1553 928 N -51 0 0 33 51 0 h .1089 g 1553 961 N -51 0 0 34 51 0 h .1176 g 1553 995 N -51 0 0 34 51 0 h .1262 g 1553 1029 N -51 0 0 33 51 0 h .1349 g 1553 1062 N -51 0 0 34 51 0 h .1435 g 1553 1096 N -51 0 0 33 51 0 h .1522 g 1553 1129 N -51 0 0 34 51 0 h .1608 g 1553 1163 N -51 0 0 34 51 0 h .1695 g 1553 1197 N -51 0 0 33 51 0 h .1781 g 1553 1230 N -51 0 0 34 51 0 h .1868 g 1553 1264 N -51 0 0 33 51 0 h .1954 g 1553 1297 N -51 0 0 34 51 0 h .204 g 1553 1331 N -51 0 0 33 51 0 h .2127 g 1553 1364 N -51 0 0 34 51 0 h .2213 g 1553 1398 N -51 0 0 34 51 0 h .23 g 1553 1432 N -51 0 0 33 51 0 h .2386 g 1553 1465 N -51 0 0 34 51 0 h .2473 g 1553 1499 N -51 0 0 33 51 0 h .2559 g 1553 1532 N -51 0 0 34 51 0 h .2646 g 1553 1566 N -51 0 0 34 51 0 h .2732 g 1553 1600 N -51 0 0 33 51 0 h .2819 g 1553 1633 N -51 0 0 34 51 0 h .2905 g 1553 1667 N -51 0 0 33 51 0 h .2992 g 1553 1700 N -51 0 0 34 51 0 h .3078 g 1553 1734 N -51 0 0 34 51 0 h .3165 g 1553 1768 N -51 0 0 33 51 0 h .3251 g 1553 1801 N -51 0 0 34 51 0 h .3338 g 1553 1835 N -51 0 0 33 51 0 h .3424 g 1553 1868 N -51 0 0 34 51 0 h .351 g 1553 1902 N -51 0 0 33 51 0 h .3597 g 1553 1935 N -51 0 0 34 51 0 h .3683 g 1553 1969 N -51 0 0 34 51 0 h .377 g 1553 2003 N -51 0 0 33 51 0 h .3856 g 1553 2036 N -51 0 0 34 51 0 h .3943 g 1553 2070 N -51 0 0 33 51 0 h .4029 g 1553 2103 N -51 0 0 34 51 0 h .4116 g 1553 2137 N -51 0 0 34 51 0 h .4202 g 1553 2171 N -51 0 0 33 51 0 h .4289 g 1553 2204 N -51 0 0 34 51 0 h .4375 g 1553 2238 N -51 0 0 33 51 0 h .4462 g 1553 2271 N -51 0 0 34 51 0 h .4548 g 1553 2305 N -51 0 0 34 51 0 h .4635 g 1553 2339 N -51 0 0 33 51 0 h .4721 g 1553 2372 N -51 0 0 34 51 0 h .4808 g 1553 2406 N -51 0 0 33 51 0 h .4894 g 1553 2439 N -51 0 0 34 51 0 h .498 g 1553 2473 N -51 0 0 34 51 0 h .5067 g 1553 2507 N -51 0 0 33 51 0 h .5153 g 1553 2540 N -51 0 0 34 51 0 h .524 g 1553 2574 N -51 0 0 32 51 0 h .5326 g 1553 2606 N -51 0 0 34 51 0 h .5413 g 1553 2640 N -51 0 0 33 51 0 h .5499 g 1553 2673 N -51 0 0 34 51 0 h .5586 g 1553 2707 N -51 0 0 34 51 0 h .5672 g 1553 2741 N -51 0 0 33 51 0 h .5759 g 1553 2774 N -51 0 0 34 51 0 h .5845 g 1553 2808 N -51 0 0 33 51 0 h .5932 g 1553 2841 N -51 0 0 34 51 0 h .6018 g 1553 2875 N -51 0 0 34 51 0 h .6105 g 1553 2909 N -51 0 0 33 51 0 h .6191 g 1553 2942 N -51 0 0 34 51 0 h .6278 g 1553 2976 N -51 0 0 33 51 0 h .6364 g 1553 3009 N -51 0 0 34 51 0 h .645 g 1553 3043 N -51 0 0 34 51 0 h .6537 g 1553 3077 N -51 0 0 33 51 0 h .6623 g 1553 3110 N -51 0 0 34 51 0 h .671 g 1553 3144 N -51 0 0 33 51 0 h .6796 g 1553 3177 N -51 0 0 34 51 0 h .6883 g 1553 3211 N -51 0 0 34 51 0 h .6969 g 1553 3245 N -51 0 0 33 51 0 h .7056 g 1553 3278 N -51 0 0 34 51 0 h .7142 g 1553 3312 N -51 0 0 33 51 0 h .7229 g 1553 3345 N -51 0 0 34 51 0 h .7315 g 1553 3379 N -51 0 0 33 51 0 h .7402 g 1553 3412 N -51 0 0 34 51 0 h .7488 g 1553 3446 N -51 0 0 34 51 0 h .7575 g 1553 3480 N -51 0 0 33 51 0 h .7661 g 1553 3513 N -51 0 0 34 51 0 h .7748 g 1553 3547 N -51 0 0 33 51 0 h .7834 g 1553 3580 N -51 0 0 34 51 0 h .792 g 1553 3614 N -51 0 0 34 51 0 h .8007 g 1553 3648 N -51 0 0 33 51 0 h .8093 g 1553 3681 N -51 0 0 34 51 0 h .818 g 1553 3715 N -51 0 0 33 51 0 h .8266 g 1553 3748 N -51 0 0 34 51 0 h .8353 g 1553 3782 N -51 0 0 34 51 0 h .8439 g 1553 3816 N -51 0 0 33 51 0 h .8526 g 1553 3849 N -51 0 0 34 51 0 h .8612 g 1553 3883 N -51 0 0 33 51 0 h .8699 g 1553 3916 N -51 0 0 34 51 0 h .8785 g 1553 3950 N -51 0 0 33 51 0 h .8872 g 1553 3983 N -51 0 0 34 51 0 h .8958 g 1553 4017 N -51 0 0 34 51 0 h .9045 g 1553 4051 N -51 0 0 33 51 0 h .9131 g 1553 4084 N -51 0 0 34 51 0 h .9218 g 1553 4118 N -51 0 0 33 51 0 h .9304 g 1553 4151 N -51 0 0 34 51 0 h .939 g 1553 4185 N -51 0 0 34 51 0 h .9477 g 1553 4219 N -51 0 0 33 51 0 h .1103 g 1604 928 N -50 0 0 33 50 0 h .1188 g 1604 961 N -50 0 0 34 50 0 h .1273 g 1604 995 N -50 0 0 34 50 0 h .1358 g 1604 1029 N -50 0 0 33 50 0 h .1443 g 1604 1062 N -50 0 0 34 50 0 h .1528 g 1604 1096 N -50 0 0 33 50 0 h .1613 g 1604 1129 N -50 0 0 34 50 0 h .1698 g 1604 1163 N -50 0 0 34 50 0 h .1783 g 1604 1197 N -50 0 0 33 50 0 h .1868 g 1604 1230 N -50 0 0 34 50 0 h .1952 g 1604 1264 N -50 0 0 33 50 0 h .2037 g 1604 1297 N -50 0 0 34 50 0 h .2122 g 1604 1331 N -50 0 0 33 50 0 h .2207 g 1604 1364 N -50 0 0 34 50 0 h .2292 g 1604 1398 N -50 0 0 34 50 0 h .2377 g 1604 1432 N -50 0 0 33 50 0 h .2462 g 1604 1465 N -50 0 0 34 50 0 h .2547 g 1604 1499 N -50 0 0 33 50 0 h .2632 g 1604 1532 N -50 0 0 34 50 0 h .2717 g 1604 1566 N -50 0 0 34 50 0 h .2802 g 1604 1600 N -50 0 0 33 50 0 h .2887 g 1604 1633 N -50 0 0 34 50 0 h .2972 g 1604 1667 N -50 0 0 33 50 0 h .3057 g 1604 1700 N -50 0 0 34 50 0 h .3142 g 1604 1734 N -50 0 0 34 50 0 h .3227 g 1604 1768 N -50 0 0 33 50 0 h .3312 g 1604 1801 N -50 0 0 34 50 0 h .3396 g 1604 1835 N -50 0 0 33 50 0 h .3481 g 1604 1868 N -50 0 0 34 50 0 h .3566 g 1604 1902 N -50 0 0 33 50 0 h .3651 g 1604 1935 N -50 0 0 34 50 0 h .3736 g 1604 1969 N -50 0 0 34 50 0 h .3821 g 1604 2003 N -50 0 0 33 50 0 h .3906 g 1604 2036 N -50 0 0 34 50 0 h .3991 g 1604 2070 N -50 0 0 33 50 0 h .4076 g 1604 2103 N -50 0 0 34 50 0 h .4161 g 1604 2137 N -50 0 0 34 50 0 h .4246 g 1604 2171 N -50 0 0 33 50 0 h .4331 g 1604 2204 N -50 0 0 34 50 0 h .4416 g 1604 2238 N -50 0 0 33 50 0 h .4501 g 1604 2271 N -50 0 0 34 50 0 h .4586 g 1604 2305 N -50 0 0 34 50 0 h .4671 g 1604 2339 N -50 0 0 33 50 0 h .4756 g 1604 2372 N -50 0 0 34 50 0 h .484 g 1604 2406 N -50 0 0 33 50 0 h .4925 g 1604 2439 N -50 0 0 34 50 0 h .501 g 1604 2473 N -50 0 0 34 50 0 h .5095 g 1604 2507 N -50 0 0 33 50 0 h .518 g 1604 2540 N -50 0 0 34 50 0 h .5265 g 1604 2574 N -50 0 0 32 50 0 h .535 g 1604 2606 N -50 0 0 34 50 0 h .5435 g 1604 2640 N -50 0 0 33 50 0 h .552 g 1604 2673 N -50 0 0 34 50 0 h .5605 g 1604 2707 N -50 0 0 34 50 0 h .569 g 1604 2741 N -50 0 0 33 50 0 h .5775 g 1604 2774 N -50 0 0 34 50 0 h .586 g 1604 2808 N -50 0 0 33 50 0 h .5945 g 1604 2841 N -50 0 0 34 50 0 h .603 g 1604 2875 N -50 0 0 34 50 0 h .6115 g 1604 2909 N -50 0 0 33 50 0 h .6199 g 1604 2942 N -50 0 0 34 50 0 h .6284 g 1604 2976 N -50 0 0 33 50 0 h .6369 g 1604 3009 N -50 0 0 34 50 0 h .6454 g 1604 3043 N -50 0 0 34 50 0 h .6539 g 1604 3077 N -50 0 0 33 50 0 h .6624 g 1604 3110 N -50 0 0 34 50 0 h .6709 g 1604 3144 N -50 0 0 33 50 0 h .6794 g 1604 3177 N -50 0 0 34 50 0 h .6879 g 1604 3211 N -50 0 0 34 50 0 h .6964 g 1604 3245 N -50 0 0 33 50 0 h .7049 g 1604 3278 N -50 0 0 34 50 0 h .7134 g 1604 3312 N -50 0 0 33 50 0 h .7219 g 1604 3345 N -50 0 0 34 50 0 h .7304 g 1604 3379 N -50 0 0 33 50 0 h .7389 g 1604 3412 N -50 0 0 34 50 0 h .7474 g 1604 3446 N -50 0 0 34 50 0 h .7559 g 1604 3480 N -50 0 0 33 50 0 h .7643 g 1604 3513 N -50 0 0 34 50 0 h .7728 g 1604 3547 N -50 0 0 33 50 0 h .7813 g 1604 3580 N -50 0 0 34 50 0 h .7898 g 1604 3614 N -50 0 0 34 50 0 h .7983 g 1604 3648 N -50 0 0 33 50 0 h .8068 g 1604 3681 N -50 0 0 34 50 0 h .8153 g 1604 3715 N -50 0 0 33 50 0 h .8238 g 1604 3748 N -50 0 0 34 50 0 h .8323 g 1604 3782 N -50 0 0 34 50 0 h .8408 g 1604 3816 N -50 0 0 33 50 0 h .8493 g 1604 3849 N -50 0 0 34 50 0 h .8578 g 1604 3883 N -50 0 0 33 50 0 h .8663 g 1604 3916 N -50 0 0 34 50 0 h .8748 g 1604 3950 N -50 0 0 33 50 0 h .8833 g 1604 3983 N -50 0 0 34 50 0 h .8918 g 1604 4017 N -50 0 0 34 50 0 h .9003 g 1604 4051 N -50 0 0 33 50 0 h .9087 g 1604 4084 N -50 0 0 34 50 0 h .9172 g 1604 4118 N -50 0 0 33 50 0 h .9257 g 1604 4151 N -50 0 0 34 50 0 h .9342 g 1604 4185 N -50 0 0 34 50 0 h .9427 g 1604 4219 N -50 0 0 33 50 0 h .1203 g 1654 928 N -51 0 0 33 51 0 h .1287 g 1654 961 N -51 0 0 34 51 0 h .137 g 1654 995 N -51 0 0 34 51 0 h .1454 g 1654 1029 N -51 0 0 33 51 0 h .1537 g 1654 1062 N -51 0 0 34 51 0 h .162 g 1654 1096 N -51 0 0 33 51 0 h .1704 g 1654 1129 N -51 0 0 34 51 0 h .1787 g 1654 1163 N -51 0 0 34 51 0 h .1871 g 1654 1197 N -51 0 0 33 51 0 h .1954 g 1654 1230 N -51 0 0 34 51 0 h .2037 g 1654 1264 N -51 0 0 33 51 0 h .2121 g 1654 1297 N -51 0 0 34 51 0 h .2204 g 1654 1331 N -51 0 0 33 51 0 h .2288 g 1654 1364 N -51 0 0 34 51 0 h .2371 g 1654 1398 N -51 0 0 34 51 0 h .2454 g 1654 1432 N -51 0 0 33 51 0 h .2538 g 1654 1465 N -51 0 0 34 51 0 h .2621 g 1654 1499 N -51 0 0 33 51 0 h .2705 g 1654 1532 N -51 0 0 34 51 0 h .2788 g 1654 1566 N -51 0 0 34 51 0 h .2872 g 1654 1600 N -51 0 0 33 51 0 h .2955 g 1654 1633 N -51 0 0 34 51 0 h .3038 g 1654 1667 N -51 0 0 33 51 0 h .3122 g 1654 1700 N -51 0 0 34 51 0 h .3205 g 1654 1734 N -51 0 0 34 51 0 h .3289 g 1654 1768 N -51 0 0 33 51 0 h .3372 g 1654 1801 N -51 0 0 34 51 0 h .3455 g 1654 1835 N -51 0 0 33 51 0 h .3539 g 1654 1868 N -51 0 0 34 51 0 h .3622 g 1654 1902 N -51 0 0 33 51 0 h .3706 g 1654 1935 N -51 0 0 34 51 0 h .3789 g 1654 1969 N -51 0 0 34 51 0 h .3872 g 1654 2003 N -51 0 0 33 51 0 h .3956 g 1654 2036 N -51 0 0 34 51 0 h .4039 g 1654 2070 N -51 0 0 33 51 0 h .4123 g 1654 2103 N -51 0 0 34 51 0 h .4206 g 1654 2137 N -51 0 0 34 51 0 h .4289 g 1654 2171 N -51 0 0 33 51 0 h .4373 g 1654 2204 N -51 0 0 34 51 0 h .4456 g 1654 2238 N -51 0 0 33 51 0 h .454 g 1654 2271 N -51 0 0 34 51 0 h .4623 g 1654 2305 N -51 0 0 34 51 0 h .4707 g 1654 2339 N -51 0 0 33 51 0 h .479 g 1654 2372 N -51 0 0 34 51 0 h .4873 g 1654 2406 N -51 0 0 33 51 0 h .4957 g 1654 2439 N -51 0 0 34 51 0 h .504 g 1654 2473 N -51 0 0 34 51 0 h .5124 g 1654 2507 N -51 0 0 33 51 0 h .5207 g 1654 2540 N -51 0 0 34 51 0 h .529 g 1654 2574 N -51 0 0 32 51 0 h .5374 g 1654 2606 N -51 0 0 34 51 0 h .5457 g 1654 2640 N -51 0 0 33 51 0 h .5541 g 1654 2673 N -51 0 0 34 51 0 h .5624 g 1654 2707 N -51 0 0 34 51 0 h .5707 g 1654 2741 N -51 0 0 33 51 0 h .5791 g 1654 2774 N -51 0 0 34 51 0 h .5874 g 1654 2808 N -51 0 0 33 51 0 h .5958 g 1654 2841 N -51 0 0 34 51 0 h .6041 g 1654 2875 N -51 0 0 34 51 0 h .6125 g 1654 2909 N -51 0 0 33 51 0 h .6208 g 1654 2942 N -51 0 0 34 51 0 h .6291 g 1654 2976 N -51 0 0 33 51 0 h .6375 g 1654 3009 N -51 0 0 34 51 0 h .6458 g 1654 3043 N -51 0 0 34 51 0 h .6542 g 1654 3077 N -51 0 0 33 51 0 h .6625 g 1654 3110 N -51 0 0 34 51 0 h .6708 g 1654 3144 N -51 0 0 33 51 0 h .6792 g 1654 3177 N -51 0 0 34 51 0 h .6875 g 1654 3211 N -51 0 0 34 51 0 h .6959 g 1654 3245 N -51 0 0 33 51 0 h .7042 g 1654 3278 N -51 0 0 34 51 0 h .7125 g 1654 3312 N -51 0 0 33 51 0 h .7209 g 1654 3345 N -51 0 0 34 51 0 h .7292 g 1654 3379 N -51 0 0 33 51 0 h .7376 g 1654 3412 N -51 0 0 34 51 0 h .7459 g 1654 3446 N -51 0 0 34 51 0 h .7542 g 1654 3480 N -51 0 0 33 51 0 h .7626 g 1654 3513 N -51 0 0 34 51 0 h .7709 g 1654 3547 N -51 0 0 33 51 0 h .7793 g 1654 3580 N -51 0 0 34 51 0 h .7876 g 1654 3614 N -51 0 0 34 51 0 h .796 g 1654 3648 N -51 0 0 33 51 0 h .8043 g 1654 3681 N -51 0 0 34 51 0 h .8126 g 1654 3715 N -51 0 0 33 51 0 h .821 g 1654 3748 N -51 0 0 34 51 0 h .8293 g 1654 3782 N -51 0 0 34 51 0 h .8377 g 1654 3816 N -51 0 0 33 51 0 h .846 g 1654 3849 N -51 0 0 34 51 0 h .8543 g 1654 3883 N -51 0 0 33 51 0 h .8627 g 1654 3916 N -51 0 0 34 51 0 h .871 g 1654 3950 N -51 0 0 33 51 0 h .8794 g 1654 3983 N -51 0 0 34 51 0 h .8877 g 1654 4017 N -51 0 0 34 51 0 h .896 g 1654 4051 N -51 0 0 33 51 0 h .9044 g 1654 4084 N -51 0 0 34 51 0 h .9127 g 1654 4118 N -51 0 0 33 51 0 h .9211 g 1654 4151 N -51 0 0 34 51 0 h .9294 g 1654 4185 N -51 0 0 34 51 0 h .9377 g 1654 4219 N -51 0 0 33 51 0 h .1304 g 1705 928 N -50 0 0 33 50 0 h .1385 g 1705 961 N -50 0 0 34 50 0 h .1467 g 1705 995 N -50 0 0 34 50 0 h .1549 g 1705 1029 N -50 0 0 33 50 0 h .1631 g 1705 1062 N -50 0 0 34 50 0 h .1713 g 1705 1096 N -50 0 0 33 50 0 h .1795 g 1705 1129 N -50 0 0 34 50 0 h .1877 g 1705 1163 N -50 0 0 34 50 0 h .1959 g 1705 1197 N -50 0 0 33 50 0 h .204 g 1705 1230 N -50 0 0 34 50 0 h .2122 g 1705 1264 N -50 0 0 33 50 0 h .2204 g 1705 1297 N -50 0 0 34 50 0 h .2286 g 1705 1331 N -50 0 0 33 50 0 h .2368 g 1705 1364 N -50 0 0 34 50 0 h .245 g 1705 1398 N -50 0 0 34 50 0 h .2532 g 1705 1432 N -50 0 0 33 50 0 h .2614 g 1705 1465 N -50 0 0 34 50 0 h .2696 g 1705 1499 N -50 0 0 33 50 0 h .2777 g 1705 1532 N -50 0 0 34 50 0 h .2859 g 1705 1566 N -50 0 0 34 50 0 h .2941 g 1705 1600 N -50 0 0 33 50 0 h .3023 g 1705 1633 N -50 0 0 34 50 0 h .3105 g 1705 1667 N -50 0 0 33 50 0 h .3187 g 1705 1700 N -50 0 0 34 50 0 h .3269 g 1705 1734 N -50 0 0 34 50 0 h .3351 g 1705 1768 N -50 0 0 33 50 0 h .3432 g 1705 1801 N -50 0 0 34 50 0 h .3514 g 1705 1835 N -50 0 0 33 50 0 h .3596 g 1705 1868 N -50 0 0 34 50 0 h .3678 g 1705 1902 N -50 0 0 33 50 0 h .376 g 1705 1935 N -50 0 0 34 50 0 h .3842 g 1705 1969 N -50 0 0 34 50 0 h .3924 g 1705 2003 N -50 0 0 33 50 0 h .4006 g 1705 2036 N -50 0 0 34 50 0 h .4087 g 1705 2070 N -50 0 0 33 50 0 h .4169 g 1705 2103 N -50 0 0 34 50 0 h .4251 g 1705 2137 N -50 0 0 34 50 0 h .4333 g 1705 2171 N -50 0 0 33 50 0 h .4415 g 1705 2204 N -50 0 0 34 50 0 h .4497 g 1705 2238 N -50 0 0 33 50 0 h .4579 g 1705 2271 N -50 0 0 34 50 0 h .4661 g 1705 2305 N -50 0 0 34 50 0 h .4743 g 1705 2339 N -50 0 0 33 50 0 h .4824 g 1705 2372 N -50 0 0 34 50 0 h .4906 g 1705 2406 N -50 0 0 33 50 0 h .4988 g 1705 2439 N -50 0 0 34 50 0 h .507 g 1705 2473 N -50 0 0 34 50 0 h .5152 g 1705 2507 N -50 0 0 33 50 0 h .5234 g 1705 2540 N -50 0 0 34 50 0 h .5316 g 1705 2574 N -50 0 0 32 50 0 h .5398 g 1705 2606 N -50 0 0 34 50 0 h .5479 g 1705 2640 N -50 0 0 33 50 0 h .5561 g 1705 2673 N -50 0 0 34 50 0 h .5643 g 1705 2707 N -50 0 0 34 50 0 h .5725 g 1705 2741 N -50 0 0 33 50 0 h .5807 g 1705 2774 N -50 0 0 34 50 0 h .5889 g 1705 2808 N -50 0 0 33 50 0 h .5971 g 1705 2841 N -50 0 0 34 50 0 h .6053 g 1705 2875 N -50 0 0 34 50 0 h .6134 g 1705 2909 N -50 0 0 33 50 0 h .6216 g 1705 2942 N -50 0 0 34 50 0 h .6298 g 1705 2976 N -50 0 0 33 50 0 h .638 g 1705 3009 N -50 0 0 34 50 0 h .6462 g 1705 3043 N -50 0 0 34 50 0 h .6544 g 1705 3077 N -50 0 0 33 50 0 h .6626 g 1705 3110 N -50 0 0 34 50 0 h .6708 g 1705 3144 N -50 0 0 33 50 0 h .6789 g 1705 3177 N -50 0 0 34 50 0 h .6871 g 1705 3211 N -50 0 0 34 50 0 h .6953 g 1705 3245 N -50 0 0 33 50 0 h .7035 g 1705 3278 N -50 0 0 34 50 0 h .7117 g 1705 3312 N -50 0 0 33 50 0 h .7199 g 1705 3345 N -50 0 0 34 50 0 h .7281 g 1705 3379 N -50 0 0 33 50 0 h .7363 g 1705 3412 N -50 0 0 34 50 0 h .7445 g 1705 3446 N -50 0 0 34 50 0 h .7526 g 1705 3480 N -50 0 0 33 50 0 h .7608 g 1705 3513 N -50 0 0 34 50 0 h .769 g 1705 3547 N -50 0 0 33 50 0 h .7772 g 1705 3580 N -50 0 0 34 50 0 h .7854 g 1705 3614 N -50 0 0 34 50 0 h .7936 g 1705 3648 N -50 0 0 33 50 0 h .8018 g 1705 3681 N -50 0 0 34 50 0 h .81 g 1705 3715 N -50 0 0 33 50 0 h .8181 g 1705 3748 N -50 0 0 34 50 0 h .8263 g 1705 3782 N -50 0 0 34 50 0 h .8345 g 1705 3816 N -50 0 0 33 50 0 h .8427 g 1705 3849 N -50 0 0 34 50 0 h .8509 g 1705 3883 N -50 0 0 33 50 0 h .8591 g 1705 3916 N -50 0 0 34 50 0 h .8673 g 1705 3950 N -50 0 0 33 50 0 h .8755 g 1705 3983 N -50 0 0 34 50 0 h .8836 g 1705 4017 N -50 0 0 34 50 0 h .8918 g 1705 4051 N -50 0 0 33 50 0 h .9 g 1705 4084 N -50 0 0 34 50 0 h .9082 g 1705 4118 N -50 0 0 33 50 0 h .9164 g 1705 4151 N -50 0 0 34 50 0 h .9246 g 1705 4185 N -50 0 0 34 50 0 h .9328 g 1705 4219 N -50 0 0 33 50 0 h .1404 g 1755 928 N -51 0 0 33 51 0 h .1484 g 1755 961 N -51 0 0 34 51 0 h .1565 g 1755 995 N -51 0 0 34 51 0 h .1645 g 1755 1029 N -51 0 0 33 51 0 h .1725 g 1755 1062 N -51 0 0 34 51 0 h .1806 g 1755 1096 N -51 0 0 33 51 0 h .1886 g 1755 1129 N -51 0 0 34 51 0 h .1966 g 1755 1163 N -51 0 0 34 51 0 h .2047 g 1755 1197 N -51 0 0 33 51 0 h .2127 g 1755 1230 N -51 0 0 34 51 0 h .2207 g 1755 1264 N -51 0 0 33 51 0 h .2288 g 1755 1297 N -51 0 0 34 51 0 h .2368 g 1755 1331 N -51 0 0 33 51 0 h .2448 g 1755 1364 N -51 0 0 34 51 0 h .2529 g 1755 1398 N -51 0 0 34 51 0 h .2609 g 1755 1432 N -51 0 0 33 51 0 h .2689 g 1755 1465 N -51 0 0 34 51 0 h .277 g 1755 1499 N -51 0 0 33 51 0 h .285 g 1755 1532 N -51 0 0 34 51 0 h .293 g 1755 1566 N -51 0 0 34 51 0 h .3011 g 1755 1600 N -51 0 0 33 51 0 h .3091 g 1755 1633 N -51 0 0 34 51 0 h .3171 g 1755 1667 N -51 0 0 33 51 0 h .3252 g 1755 1700 N -51 0 0 34 51 0 h .3332 g 1755 1734 N -51 0 0 34 51 0 h .3413 g 1755 1768 N -51 0 0 33 51 0 h .3493 g 1755 1801 N -51 0 0 34 51 0 h .3573 g 1755 1835 N -51 0 0 33 51 0 h .3654 g 1755 1868 N -51 0 0 34 51 0 h .3734 g 1755 1902 N -51 0 0 33 51 0 h .3814 g 1755 1935 N -51 0 0 34 51 0 h .3895 g 1755 1969 N -51 0 0 34 51 0 h .3975 g 1755 2003 N -51 0 0 33 51 0 h .4055 g 1755 2036 N -51 0 0 34 51 0 h .4136 g 1755 2070 N -51 0 0 33 51 0 h .4216 g 1755 2103 N -51 0 0 34 51 0 h .4296 g 1755 2137 N -51 0 0 34 51 0 h .4377 g 1755 2171 N -51 0 0 33 51 0 h .4457 g 1755 2204 N -51 0 0 34 51 0 h .4537 g 1755 2238 N -51 0 0 33 51 0 h .4618 g 1755 2271 N -51 0 0 34 51 0 h .4698 g 1755 2305 N -51 0 0 34 51 0 h .4778 g 1755 2339 N -51 0 0 33 51 0 h .4859 g 1755 2372 N -51 0 0 34 51 0 h .4939 g 1755 2406 N -51 0 0 33 51 0 h .502 g 1755 2439 N -51 0 0 34 51 0 h .51 g 1755 2473 N -51 0 0 34 51 0 h .518 g 1755 2507 N -51 0 0 33 51 0 h .5261 g 1755 2540 N -51 0 0 34 51 0 h .5341 g 1755 2574 N -51 0 0 32 51 0 h .5421 g 1755 2606 N -51 0 0 34 51 0 h .5502 g 1755 2640 N -51 0 0 33 51 0 h .5582 g 1755 2673 N -51 0 0 34 51 0 h .5662 g 1755 2707 N -51 0 0 34 51 0 h .5743 g 1755 2741 N -51 0 0 33 51 0 h .5823 g 1755 2774 N -51 0 0 34 51 0 h .5903 g 1755 2808 N -51 0 0 33 51 0 h .5984 g 1755 2841 N -51 0 0 34 51 0 h .6064 g 1755 2875 N -51 0 0 34 51 0 h .6144 g 1755 2909 N -51 0 0 33 51 0 h .6225 g 1755 2942 N -51 0 0 34 51 0 h .6305 g 1755 2976 N -51 0 0 33 51 0 h .6385 g 1755 3009 N -51 0 0 34 51 0 h .6466 g 1755 3043 N -51 0 0 34 51 0 h .6546 g 1755 3077 N -51 0 0 33 51 0 h .6626 g 1755 3110 N -51 0 0 34 51 0 h .6707 g 1755 3144 N -51 0 0 33 51 0 h .6787 g 1755 3177 N -51 0 0 34 51 0 h .6868 g 1755 3211 N -51 0 0 34 51 0 h .6948 g 1755 3245 N -51 0 0 33 51 0 h .7028 g 1755 3278 N -51 0 0 34 51 0 h .7109 g 1755 3312 N -51 0 0 33 51 0 h .7189 g 1755 3345 N -51 0 0 34 51 0 h .7269 g 1755 3379 N -51 0 0 33 51 0 h .735 g 1755 3412 N -51 0 0 34 51 0 h .743 g 1755 3446 N -51 0 0 34 51 0 h .751 g 1755 3480 N -51 0 0 33 51 0 h .7591 g 1755 3513 N -51 0 0 34 51 0 h .7671 g 1755 3547 N -51 0 0 33 51 0 h .7751 g 1755 3580 N -51 0 0 34 51 0 h .7832 g 1755 3614 N -51 0 0 34 51 0 h .7912 g 1755 3648 N -51 0 0 33 51 0 h .7992 g 1755 3681 N -51 0 0 34 51 0 h .8073 g 1755 3715 N -51 0 0 33 51 0 h .8153 g 1755 3748 N -51 0 0 34 51 0 h .8233 g 1755 3782 N -51 0 0 34 51 0 h .8314 g 1755 3816 N -51 0 0 33 51 0 h .8394 g 1755 3849 N -51 0 0 34 51 0 h .8475 g 1755 3883 N -51 0 0 33 51 0 h .8555 g 1755 3916 N -51 0 0 34 51 0 h .8635 g 1755 3950 N -51 0 0 33 51 0 h .8716 g 1755 3983 N -51 0 0 34 51 0 h .8796 g 1755 4017 N -51 0 0 34 51 0 h .8876 g 1755 4051 N -51 0 0 33 51 0 h .8957 g 1755 4084 N -51 0 0 34 51 0 h .9037 g 1755 4118 N -51 0 0 33 51 0 h .9117 g 1755 4151 N -51 0 0 34 51 0 h .9198 g 1755 4185 N -51 0 0 34 51 0 h .9278 g 1755 4219 N -51 0 0 33 51 0 h .1504 g 1806 928 N -50 0 0 33 50 0 h .1583 g 1806 961 N -50 0 0 34 50 0 h .1662 g 1806 995 N -50 0 0 34 50 0 h .1741 g 1806 1029 N -50 0 0 33 50 0 h .1819 g 1806 1062 N -50 0 0 34 50 0 h .1898 g 1806 1096 N -50 0 0 33 50 0 h .1977 g 1806 1129 N -50 0 0 34 50 0 h .2056 g 1806 1163 N -50 0 0 34 50 0 h .2135 g 1806 1197 N -50 0 0 33 50 0 h .2213 g 1806 1230 N -50 0 0 34 50 0 h .2292 g 1806 1264 N -50 0 0 33 50 0 h .2371 g 1806 1297 N -50 0 0 34 50 0 h .245 g 1806 1331 N -50 0 0 33 50 0 h .2529 g 1806 1364 N -50 0 0 34 50 0 h .2608 g 1806 1398 N -50 0 0 34 50 0 h .2686 g 1806 1432 N -50 0 0 33 50 0 h .2765 g 1806 1465 N -50 0 0 34 50 0 h .2844 g 1806 1499 N -50 0 0 33 50 0 h .2923 g 1806 1532 N -50 0 0 34 50 0 h .3002 g 1806 1566 N -50 0 0 34 50 0 h .308 g 1806 1600 N -50 0 0 33 50 0 h .3159 g 1806 1633 N -50 0 0 34 50 0 h .3238 g 1806 1667 N -50 0 0 33 50 0 h .3317 g 1806 1700 N -50 0 0 34 50 0 h .3396 g 1806 1734 N -50 0 0 34 50 0 h .3475 g 1806 1768 N -50 0 0 33 50 0 h .3553 g 1806 1801 N -50 0 0 34 50 0 h .3632 g 1806 1835 N -50 0 0 33 50 0 h .3711 g 1806 1868 N -50 0 0 34 50 0 h .379 g 1806 1902 N -50 0 0 33 50 0 h .3869 g 1806 1935 N -50 0 0 34 50 0 h .3947 g 1806 1969 N -50 0 0 34 50 0 h .4026 g 1806 2003 N -50 0 0 33 50 0 h .4105 g 1806 2036 N -50 0 0 34 50 0 h .4184 g 1806 2070 N -50 0 0 33 50 0 h .4263 g 1806 2103 N -50 0 0 34 50 0 h .4342 g 1806 2137 N -50 0 0 34 50 0 h .442 g 1806 2171 N -50 0 0 33 50 0 h .4499 g 1806 2204 N -50 0 0 34 50 0 h .4578 g 1806 2238 N -50 0 0 33 50 0 h .4657 g 1806 2271 N -50 0 0 34 50 0 h .4736 g 1806 2305 N -50 0 0 34 50 0 h .4814 g 1806 2339 N -50 0 0 33 50 0 h .4893 g 1806 2372 N -50 0 0 34 50 0 h .4972 g 1806 2406 N -50 0 0 33 50 0 h .5051 g 1806 2439 N -50 0 0 34 50 0 h .513 g 1806 2473 N -50 0 0 34 50 0 h .5209 g 1806 2507 N -50 0 0 33 50 0 h .5287 g 1806 2540 N -50 0 0 34 50 0 h .5366 g 1806 2574 N -50 0 0 32 50 0 h .5445 g 1806 2606 N -50 0 0 34 50 0 h .5524 g 1806 2640 N -50 0 0 33 50 0 h .5603 g 1806 2673 N -50 0 0 34 50 0 h .5681 g 1806 2707 N -50 0 0 34 50 0 h .576 g 1806 2741 N -50 0 0 33 50 0 h .5839 g 1806 2774 N -50 0 0 34 50 0 h .5918 g 1806 2808 N -50 0 0 33 50 0 h .5997 g 1806 2841 N -50 0 0 34 50 0 h .6076 g 1806 2875 N -50 0 0 34 50 0 h .6154 g 1806 2909 N -50 0 0 33 50 0 h .6233 g 1806 2942 N -50 0 0 34 50 0 h .6312 g 1806 2976 N -50 0 0 33 50 0 h .6391 g 1806 3009 N -50 0 0 34 50 0 h .647 g 1806 3043 N -50 0 0 34 50 0 h .6548 g 1806 3077 N -50 0 0 33 50 0 h .6627 g 1806 3110 N -50 0 0 34 50 0 h .6706 g 1806 3144 N -50 0 0 33 50 0 h .6785 g 1806 3177 N -50 0 0 34 50 0 h .6864 g 1806 3211 N -50 0 0 34 50 0 h .6943 g 1806 3245 N -50 0 0 33 50 0 h .7021 g 1806 3278 N -50 0 0 34 50 0 h .71 g 1806 3312 N -50 0 0 33 50 0 h .7179 g 1806 3345 N -50 0 0 34 50 0 h .7258 g 1806 3379 N -50 0 0 33 50 0 h .7337 g 1806 3412 N -50 0 0 34 50 0 h .7415 g 1806 3446 N -50 0 0 34 50 0 h .7494 g 1806 3480 N -50 0 0 33 50 0 h .7573 g 1806 3513 N -50 0 0 34 50 0 h .7652 g 1806 3547 N -50 0 0 33 50 0 h .7731 g 1806 3580 N -50 0 0 34 50 0 h .781 g 1806 3614 N -50 0 0 34 50 0 h .7888 g 1806 3648 N -50 0 0 33 50 0 h .7967 g 1806 3681 N -50 0 0 34 50 0 h .8046 g 1806 3715 N -50 0 0 33 50 0 h .8125 g 1806 3748 N -50 0 0 34 50 0 h .8204 g 1806 3782 N -50 0 0 34 50 0 h .8282 g 1806 3816 N -50 0 0 33 50 0 h .8361 g 1806 3849 N -50 0 0 34 50 0 h .844 g 1806 3883 N -50 0 0 33 50 0 h .8519 g 1806 3916 N -50 0 0 34 50 0 h .8598 g 1806 3950 N -50 0 0 33 50 0 h .8677 g 1806 3983 N -50 0 0 34 50 0 h .8755 g 1806 4017 N -50 0 0 34 50 0 h .8834 g 1806 4051 N -50 0 0 33 50 0 h .8913 g 1806 4084 N -50 0 0 34 50 0 h .8992 g 1806 4118 N -50 0 0 33 50 0 h .9071 g 1806 4151 N -50 0 0 34 50 0 h .9149 g 1806 4185 N -50 0 0 34 50 0 h .9228 g 1806 4219 N -50 0 0 33 50 0 h .1604 g 1856 928 N -51 0 0 33 51 0 h .1682 g 1856 961 N -51 0 0 34 51 0 h .1759 g 1856 995 N -51 0 0 34 51 0 h .1836 g 1856 1029 N -51 0 0 33 51 0 h .1913 g 1856 1062 N -51 0 0 34 51 0 h .1991 g 1856 1096 N -51 0 0 33 51 0 h .2068 g 1856 1129 N -51 0 0 34 51 0 h .2145 g 1856 1163 N -51 0 0 34 51 0 h .2223 g 1856 1197 N -51 0 0 33 51 0 h .23 g 1856 1230 N -51 0 0 34 51 0 h .2377 g 1856 1264 N -51 0 0 33 51 0 h .2454 g 1856 1297 N -51 0 0 34 51 0 h .2532 g 1856 1331 N -51 0 0 33 51 0 h .2609 g 1856 1364 N -51 0 0 34 51 0 h .2686 g 1856 1398 N -51 0 0 34 51 0 h .2764 g 1856 1432 N -51 0 0 33 51 0 h .2841 g 1856 1465 N -51 0 0 34 51 0 h .2918 g 1856 1499 N -51 0 0 33 51 0 h .2995 g 1856 1532 N -51 0 0 34 51 0 h .3073 g 1856 1566 N -51 0 0 34 51 0 h .315 g 1856 1600 N -51 0 0 33 51 0 h .3227 g 1856 1633 N -51 0 0 34 51 0 h .3305 g 1856 1667 N -51 0 0 33 51 0 h .3382 g 1856 1700 N -51 0 0 34 51 0 h .3459 g 1856 1734 N -51 0 0 34 51 0 h .3537 g 1856 1768 N -51 0 0 33 51 0 h .3614 g 1856 1801 N -51 0 0 34 51 0 h .3691 g 1856 1835 N -51 0 0 33 51 0 h .3768 g 1856 1868 N -51 0 0 34 51 0 h .3846 g 1856 1902 N -51 0 0 33 51 0 h .3923 g 1856 1935 N -51 0 0 34 51 0 h .4 g 1856 1969 N -51 0 0 34 51 0 h .4078 g 1856 2003 N -51 0 0 33 51 0 h .4155 g 1856 2036 N -51 0 0 34 51 0 h .4232 g 1856 2070 N -51 0 0 33 51 0 h .4309 g 1856 2103 N -51 0 0 34 51 0 h .4387 g 1856 2137 N -51 0 0 34 51 0 h .4464 g 1856 2171 N -51 0 0 33 51 0 h .4541 g 1856 2204 N -51 0 0 34 51 0 h .4619 g 1856 2238 N -51 0 0 33 51 0 h .4696 g 1856 2271 N -51 0 0 34 51 0 h .4773 g 1856 2305 N -51 0 0 34 51 0 h .485 g 1856 2339 N -51 0 0 33 51 0 h .4928 g 1856 2372 N -51 0 0 34 51 0 h .5005 g 1856 2406 N -51 0 0 33 51 0 h .5082 g 1856 2439 N -51 0 0 34 51 0 h .516 g 1856 2473 N -51 0 0 34 51 0 h .5237 g 1856 2507 N -51 0 0 33 51 0 h .5314 g 1856 2540 N -51 0 0 34 51 0 h .5391 g 1856 2574 N -51 0 0 32 51 0 h .5469 g 1856 2606 N -51 0 0 34 51 0 h .5546 g 1856 2640 N -51 0 0 33 51 0 h .5623 g 1856 2673 N -51 0 0 34 51 0 h .5701 g 1856 2707 N -51 0 0 34 51 0 h .5778 g 1856 2741 N -51 0 0 33 51 0 h .5855 g 1856 2774 N -51 0 0 34 51 0 h .5932 g 1856 2808 N -51 0 0 33 51 0 h .601 g 1856 2841 N -51 0 0 34 51 0 h .6087 g 1856 2875 N -51 0 0 34 51 0 h .6164 g 1856 2909 N -51 0 0 33 51 0 h .6242 g 1856 2942 N -51 0 0 34 51 0 h .6319 g 1856 2976 N -51 0 0 33 51 0 h .6396 g 1856 3009 N -51 0 0 34 51 0 h .6473 g 1856 3043 N -51 0 0 34 51 0 h .6551 g 1856 3077 N -51 0 0 33 51 0 h .6628 g 1856 3110 N -51 0 0 34 51 0 h .6705 g 1856 3144 N -51 0 0 33 51 0 h .6783 g 1856 3177 N -51 0 0 34 51 0 h .686 g 1856 3211 N -51 0 0 34 51 0 h .6937 g 1856 3245 N -51 0 0 33 51 0 h .7014 g 1856 3278 N -51 0 0 34 51 0 h .7092 g 1856 3312 N -51 0 0 33 51 0 h .7169 g 1856 3345 N -51 0 0 34 51 0 h .7246 g 1856 3379 N -51 0 0 33 51 0 h .7324 g 1856 3412 N -51 0 0 34 51 0 h .7401 g 1856 3446 N -51 0 0 34 51 0 h .7478 g 1856 3480 N -51 0 0 33 51 0 h .7555 g 1856 3513 N -51 0 0 34 51 0 h .7633 g 1856 3547 N -51 0 0 33 51 0 h .771 g 1856 3580 N -51 0 0 34 51 0 h .7787 g 1856 3614 N -51 0 0 34 51 0 h .7865 g 1856 3648 N -51 0 0 33 51 0 h .7942 g 1856 3681 N -51 0 0 34 51 0 h .8019 g 1856 3715 N -51 0 0 33 51 0 h .8096 g 1856 3748 N -51 0 0 34 51 0 h .8174 g 1856 3782 N -51 0 0 34 51 0 h .8251 g 1856 3816 N -51 0 0 33 51 0 h .8328 g 1856 3849 N -51 0 0 34 51 0 h .8406 g 1856 3883 N -51 0 0 33 51 0 h .8483 g 1856 3916 N -51 0 0 34 51 0 h .856 g 1856 3950 N -51 0 0 33 51 0 h .8638 g 1856 3983 N -51 0 0 34 51 0 h .8715 g 1856 4017 N -51 0 0 34 51 0 h .8792 g 1856 4051 N -51 0 0 33 51 0 h .8869 g 1856 4084 N -51 0 0 34 51 0 h .8947 g 1856 4118 N -51 0 0 33 51 0 h .9024 g 1856 4151 N -51 0 0 34 51 0 h .9101 g 1856 4185 N -51 0 0 34 51 0 h .9179 g 1856 4219 N -51 0 0 33 51 0 h .1705 g 1907 928 N -50 0 0 33 50 0 h .178 g 1907 961 N -50 0 0 34 50 0 h .1856 g 1907 995 N -50 0 0 34 50 0 h .1932 g 1907 1029 N -50 0 0 33 50 0 h .2008 g 1907 1062 N -50 0 0 34 50 0 h .2083 g 1907 1096 N -50 0 0 33 50 0 h .2159 g 1907 1129 N -50 0 0 34 50 0 h .2235 g 1907 1163 N -50 0 0 34 50 0 h .2311 g 1907 1197 N -50 0 0 33 50 0 h .2386 g 1907 1230 N -50 0 0 34 50 0 h .2462 g 1907 1264 N -50 0 0 33 50 0 h .2538 g 1907 1297 N -50 0 0 34 50 0 h .2614 g 1907 1331 N -50 0 0 33 50 0 h .2689 g 1907 1364 N -50 0 0 34 50 0 h .2765 g 1907 1398 N -50 0 0 34 50 0 h .2841 g 1907 1432 N -50 0 0 33 50 0 h .2917 g 1907 1465 N -50 0 0 34 50 0 h .2992 g 1907 1499 N -50 0 0 33 50 0 h .3068 g 1907 1532 N -50 0 0 34 50 0 h .3144 g 1907 1566 N -50 0 0 34 50 0 h .322 g 1907 1600 N -50 0 0 33 50 0 h .3295 g 1907 1633 N -50 0 0 34 50 0 h .3371 g 1907 1667 N -50 0 0 33 50 0 h .3447 g 1907 1700 N -50 0 0 34 50 0 h .3523 g 1907 1734 N -50 0 0 34 50 0 h .3598 g 1907 1768 N -50 0 0 33 50 0 h .3674 g 1907 1801 N -50 0 0 34 50 0 h .375 g 1907 1835 N -50 0 0 33 50 0 h .3826 g 1907 1868 N -50 0 0 34 50 0 h .3902 g 1907 1902 N -50 0 0 33 50 0 h .3977 g 1907 1935 N -50 0 0 34 50 0 h .4053 g 1907 1969 N -50 0 0 34 50 0 h .4129 g 1907 2003 N -50 0 0 33 50 0 h .4205 g 1907 2036 N -50 0 0 34 50 0 h .428 g 1907 2070 N -50 0 0 33 50 0 h .4356 g 1907 2103 N -50 0 0 34 50 0 h .4432 g 1907 2137 N -50 0 0 34 50 0 h .4508 g 1907 2171 N -50 0 0 33 50 0 h .4583 g 1907 2204 N -50 0 0 34 50 0 h .4659 g 1907 2238 N -50 0 0 33 50 0 h .4735 g 1907 2271 N -50 0 0 34 50 0 h .4811 g 1907 2305 N -50 0 0 34 50 0 h .4886 g 1907 2339 N -50 0 0 33 50 0 h .4962 g 1907 2372 N -50 0 0 34 50 0 h .5038 g 1907 2406 N -50 0 0 33 50 0 h .5114 g 1907 2439 N -50 0 0 34 50 0 h .5189 g 1907 2473 N -50 0 0 34 50 0 h .5265 g 1907 2507 N -50 0 0 33 50 0 h .5341 g 1907 2540 N -50 0 0 34 50 0 h .5417 g 1907 2574 N -50 0 0 32 50 0 h .5492 g 1907 2606 N -50 0 0 34 50 0 h .5568 g 1907 2640 N -50 0 0 33 50 0 h .5644 g 1907 2673 N -50 0 0 34 50 0 h .572 g 1907 2707 N -50 0 0 34 50 0 h .5795 g 1907 2741 N -50 0 0 33 50 0 h .5871 g 1907 2774 N -50 0 0 34 50 0 h .5947 g 1907 2808 N -50 0 0 33 50 0 h .6023 g 1907 2841 N -50 0 0 34 50 0 h .6098 g 1907 2875 N -50 0 0 34 50 0 h .6174 g 1907 2909 N -50 0 0 33 50 0 h .625 g 1907 2942 N -50 0 0 34 50 0 h .6326 g 1907 2976 N -50 0 0 33 50 0 h .6402 g 1907 3009 N -50 0 0 34 50 0 h .6477 g 1907 3043 N -50 0 0 34 50 0 h .6553 g 1907 3077 N -50 0 0 33 50 0 h .6629 g 1907 3110 N -50 0 0 34 50 0 h .6705 g 1907 3144 N -50 0 0 33 50 0 h .678 g 1907 3177 N -50 0 0 34 50 0 h .6856 g 1907 3211 N -50 0 0 34 50 0 h .6932 g 1907 3245 N -50 0 0 33 50 0 h .7008 g 1907 3278 N -50 0 0 34 50 0 h .7083 g 1907 3312 N -50 0 0 33 50 0 h .7159 g 1907 3345 N -50 0 0 34 50 0 h .7235 g 1907 3379 N -50 0 0 33 50 0 h .7311 g 1907 3412 N -50 0 0 34 50 0 h .7386 g 1907 3446 N -50 0 0 34 50 0 h .7462 g 1907 3480 N -50 0 0 33 50 0 h .7538 g 1907 3513 N -50 0 0 34 50 0 h .7614 g 1907 3547 N -50 0 0 33 50 0 h .7689 g 1907 3580 N -50 0 0 34 50 0 h .7765 g 1907 3614 N -50 0 0 34 50 0 h .7841 g 1907 3648 N -50 0 0 33 50 0 h .7917 g 1907 3681 N -50 0 0 34 50 0 h .7992 g 1907 3715 N -50 0 0 33 50 0 h .8068 g 1907 3748 N -50 0 0 34 50 0 h .8144 g 1907 3782 N -50 0 0 34 50 0 h .822 g 1907 3816 N -50 0 0 33 50 0 h .8295 g 1907 3849 N -50 0 0 34 50 0 h .8371 g 1907 3883 N -50 0 0 33 50 0 h .8447 g 1907 3916 N -50 0 0 34 50 0 h .8523 g 1907 3950 N -50 0 0 33 50 0 h .8598 g 1907 3983 N -50 0 0 34 50 0 h .8674 g 1907 4017 N -50 0 0 34 50 0 h .875 g 1907 4051 N -50 0 0 33 50 0 h .8826 g 1907 4084 N -50 0 0 34 50 0 h .8902 g 1907 4118 N -50 0 0 33 50 0 h .8977 g 1907 4151 N -50 0 0 34 50 0 h .9053 g 1907 4185 N -50 0 0 34 50 0 h .9129 g 1907 4219 N -50 0 0 33 50 0 h .1805 g 1957 928 N -51 0 0 33 51 0 h .1879 g 1957 961 N -51 0 0 34 51 0 h .1953 g 1957 995 N -51 0 0 34 51 0 h .2027 g 1957 1029 N -51 0 0 33 51 0 h .2102 g 1957 1062 N -51 0 0 34 51 0 h .2176 g 1957 1096 N -51 0 0 33 51 0 h .225 g 1957 1129 N -51 0 0 34 51 0 h .2324 g 1957 1163 N -51 0 0 34 51 0 h .2399 g 1957 1197 N -51 0 0 33 51 0 h .2473 g 1957 1230 N -51 0 0 34 51 0 h .2547 g 1957 1264 N -51 0 0 33 51 0 h .2621 g 1957 1297 N -51 0 0 34 51 0 h .2696 g 1957 1331 N -51 0 0 33 51 0 h .277 g 1957 1364 N -51 0 0 34 51 0 h .2844 g 1957 1398 N -51 0 0 34 51 0 h .2918 g 1957 1432 N -51 0 0 33 51 0 h .2992 g 1957 1465 N -51 0 0 34 51 0 h .3067 g 1957 1499 N -51 0 0 33 51 0 h .3141 g 1957 1532 N -51 0 0 34 51 0 h .3215 g 1957 1566 N -51 0 0 34 51 0 h .3289 g 1957 1600 N -51 0 0 33 51 0 h .3364 g 1957 1633 N -51 0 0 34 51 0 h .3438 g 1957 1667 N -51 0 0 33 51 0 h .3512 g 1957 1700 N -51 0 0 34 51 0 h .3586 g 1957 1734 N -51 0 0 34 51 0 h .366 g 1957 1768 N -51 0 0 33 51 0 h .3735 g 1957 1801 N -51 0 0 34 51 0 h .3809 g 1957 1835 N -51 0 0 33 51 0 h .3883 g 1957 1868 N -51 0 0 34 51 0 h .3957 g 1957 1902 N -51 0 0 33 51 0 h .4032 g 1957 1935 N -51 0 0 34 51 0 h .4106 g 1957 1969 N -51 0 0 34 51 0 h .418 g 1957 2003 N -51 0 0 33 51 0 h .4254 g 1957 2036 N -51 0 0 34 51 0 h .4329 g 1957 2070 N -51 0 0 33 51 0 h .4403 g 1957 2103 N -51 0 0 34 51 0 h .4477 g 1957 2137 N -51 0 0 34 51 0 h .4551 g 1957 2171 N -51 0 0 33 51 0 h .4625 g 1957 2204 N -51 0 0 34 51 0 h .47 g 1957 2238 N -51 0 0 33 51 0 h .4774 g 1957 2271 N -51 0 0 34 51 0 h .4848 g 1957 2305 N -51 0 0 34 51 0 h .4922 g 1957 2339 N -51 0 0 33 51 0 h .4997 g 1957 2372 N -51 0 0 34 51 0 h .5071 g 1957 2406 N -51 0 0 33 51 0 h .5145 g 1957 2439 N -51 0 0 34 51 0 h .5219 g 1957 2473 N -51 0 0 34 51 0 h .5293 g 1957 2507 N -51 0 0 33 51 0 h .5368 g 1957 2540 N -51 0 0 34 51 0 h .5442 g 1957 2574 N -51 0 0 32 51 0 h .5516 g 1957 2606 N -51 0 0 34 51 0 h .559 g 1957 2640 N -51 0 0 33 51 0 h .5665 g 1957 2673 N -51 0 0 34 51 0 h .5739 g 1957 2707 N -51 0 0 34 51 0 h .5813 g 1957 2741 N -51 0 0 33 51 0 h .5887 g 1957 2774 N -51 0 0 34 51 0 h .5962 g 1957 2808 N -51 0 0 33 51 0 h .6036 g 1957 2841 N -51 0 0 34 51 0 h .611 g 1957 2875 N -51 0 0 34 51 0 h .6184 g 1957 2909 N -51 0 0 33 51 0 h .6258 g 1957 2942 N -51 0 0 34 51 0 h .6333 g 1957 2976 N -51 0 0 33 51 0 h .6407 g 1957 3009 N -51 0 0 34 51 0 h .6481 g 1957 3043 N -51 0 0 34 51 0 h .6555 g 1957 3077 N -51 0 0 33 51 0 h .663 g 1957 3110 N -51 0 0 34 51 0 h .6704 g 1957 3144 N -51 0 0 33 51 0 h .6778 g 1957 3177 N -51 0 0 34 51 0 h .6852 g 1957 3211 N -51 0 0 34 51 0 h .6926 g 1957 3245 N -51 0 0 33 51 0 h .7001 g 1957 3278 N -51 0 0 34 51 0 h .7075 g 1957 3312 N -51 0 0 33 51 0 h .7149 g 1957 3345 N -51 0 0 34 51 0 h .7223 g 1957 3379 N -51 0 0 33 51 0 h .7298 g 1957 3412 N -51 0 0 34 51 0 h .7372 g 1957 3446 N -51 0 0 34 51 0 h .7446 g 1957 3480 N -51 0 0 33 51 0 h .752 g 1957 3513 N -51 0 0 34 51 0 h .7595 g 1957 3547 N -51 0 0 33 51 0 h .7669 g 1957 3580 N -51 0 0 34 51 0 h .7743 g 1957 3614 N -51 0 0 34 51 0 h .7817 g 1957 3648 N -51 0 0 33 51 0 h .7891 g 1957 3681 N -51 0 0 34 51 0 h .7966 g 1957 3715 N -51 0 0 33 51 0 h .804 g 1957 3748 N -51 0 0 34 51 0 h .8114 g 1957 3782 N -51 0 0 34 51 0 h .8188 g 1957 3816 N -51 0 0 33 51 0 h .8263 g 1957 3849 N -51 0 0 34 51 0 h .8337 g 1957 3883 N -51 0 0 33 51 0 h .8411 g 1957 3916 N -51 0 0 34 51 0 h .8485 g 1957 3950 N -51 0 0 33 51 0 h .8559 g 1957 3983 N -51 0 0 34 51 0 h .8634 g 1957 4017 N -51 0 0 34 51 0 h .8708 g 1957 4051 N -51 0 0 33 51 0 h .8782 g 1957 4084 N -51 0 0 34 51 0 h .8856 g 1957 4118 N -51 0 0 33 51 0 h .8931 g 1957 4151 N -51 0 0 34 51 0 h .9005 g 1957 4185 N -51 0 0 34 51 0 h .9079 g 1957 4219 N -51 0 0 33 51 0 h .1905 g 2008 928 N -51 0 0 33 51 0 h .1978 g 2008 961 N -51 0 0 34 51 0 h .205 g 2008 995 N -51 0 0 34 51 0 h .2123 g 2008 1029 N -51 0 0 33 51 0 h .2196 g 2008 1062 N -51 0 0 34 51 0 h .2269 g 2008 1096 N -51 0 0 33 51 0 h .2341 g 2008 1129 N -51 0 0 34 51 0 h .2414 g 2008 1163 N -51 0 0 34 51 0 h .2487 g 2008 1197 N -51 0 0 33 51 0 h .2559 g 2008 1230 N -51 0 0 34 51 0 h .2632 g 2008 1264 N -51 0 0 33 51 0 h .2705 g 2008 1297 N -51 0 0 34 51 0 h .2777 g 2008 1331 N -51 0 0 33 51 0 h .285 g 2008 1364 N -51 0 0 34 51 0 h .2923 g 2008 1398 N -51 0 0 34 51 0 h .2995 g 2008 1432 N -51 0 0 33 51 0 h .3068 g 2008 1465 N -51 0 0 34 51 0 h .3141 g 2008 1499 N -51 0 0 33 51 0 h .3214 g 2008 1532 N -51 0 0 34 51 0 h .3286 g 2008 1566 N -51 0 0 34 51 0 h .3359 g 2008 1600 N -51 0 0 33 51 0 h .3432 g 2008 1633 N -51 0 0 34 51 0 h .3504 g 2008 1667 N -51 0 0 33 51 0 h .3577 g 2008 1700 N -51 0 0 34 51 0 h .365 g 2008 1734 N -51 0 0 34 51 0 h .3722 g 2008 1768 N -51 0 0 33 51 0 h .3795 g 2008 1801 N -51 0 0 34 51 0 h .3868 g 2008 1835 N -51 0 0 33 51 0 h .3941 g 2008 1868 N -51 0 0 34 51 0 h .4013 g 2008 1902 N -51 0 0 33 51 0 h .4086 g 2008 1935 N -51 0 0 34 51 0 h .4159 g 2008 1969 N -51 0 0 34 51 0 h .4231 g 2008 2003 N -51 0 0 33 51 0 h .4304 g 2008 2036 N -51 0 0 34 51 0 h .4377 g 2008 2070 N -51 0 0 33 51 0 h .4449 g 2008 2103 N -51 0 0 34 51 0 h .4522 g 2008 2137 N -51 0 0 34 51 0 h .4595 g 2008 2171 N -51 0 0 33 51 0 h .4668 g 2008 2204 N -51 0 0 34 51 0 h .474 g 2008 2238 N -51 0 0 33 51 0 h .4813 g 2008 2271 N -51 0 0 34 51 0 h .4886 g 2008 2305 N -51 0 0 34 51 0 h .4958 g 2008 2339 N -51 0 0 33 51 0 h .5031 g 2008 2372 N -51 0 0 34 51 0 h .5104 g 2008 2406 N -51 0 0 33 51 0 h .5176 g 2008 2439 N -51 0 0 34 51 0 h .5249 g 2008 2473 N -51 0 0 34 51 0 h .5322 g 2008 2507 N -51 0 0 33 51 0 h .5394 g 2008 2540 N -51 0 0 34 51 0 h .5467 g 2008 2574 N -51 0 0 32 51 0 h .554 g 2008 2606 N -51 0 0 34 51 0 h .5613 g 2008 2640 N -51 0 0 33 51 0 h .5685 g 2008 2673 N -51 0 0 34 51 0 h .5758 g 2008 2707 N -51 0 0 34 51 0 h .5831 g 2008 2741 N -51 0 0 33 51 0 h .5903 g 2008 2774 N -51 0 0 34 51 0 h .5976 g 2008 2808 N -51 0 0 33 51 0 h .6049 g 2008 2841 N -51 0 0 34 51 0 h .6121 g 2008 2875 N -51 0 0 34 51 0 h .6194 g 2008 2909 N -51 0 0 33 51 0 h .6267 g 2008 2942 N -51 0 0 34 51 0 h .634 g 2008 2976 N -51 0 0 33 51 0 h .6412 g 2008 3009 N -51 0 0 34 51 0 h .6485 g 2008 3043 N -51 0 0 34 51 0 h .6558 g 2008 3077 N -51 0 0 33 51 0 h .663 g 2008 3110 N -51 0 0 34 51 0 h .6703 g 2008 3144 N -51 0 0 33 51 0 h .6776 g 2008 3177 N -51 0 0 34 51 0 h .6848 g 2008 3211 N -51 0 0 34 51 0 h .6921 g 2008 3245 N -51 0 0 33 51 0 h .6994 g 2008 3278 N -51 0 0 34 51 0 h .7067 g 2008 3312 N -51 0 0 33 51 0 h .7139 g 2008 3345 N -51 0 0 34 51 0 h .7212 g 2008 3379 N -51 0 0 33 51 0 h .7285 g 2008 3412 N -51 0 0 34 51 0 h .7357 g 2008 3446 N -51 0 0 34 51 0 h .743 g 2008 3480 N -51 0 0 33 51 0 h .7503 g 2008 3513 N -51 0 0 34 51 0 h .7575 g 2008 3547 N -51 0 0 33 51 0 h .7648 g 2008 3580 N -51 0 0 34 51 0 h .7721 g 2008 3614 N -51 0 0 34 51 0 h .7793 g 2008 3648 N -51 0 0 33 51 0 h .7866 g 2008 3681 N -51 0 0 34 51 0 h .7939 g 2008 3715 N -51 0 0 33 51 0 h .8012 g 2008 3748 N -51 0 0 34 51 0 h .8084 g 2008 3782 N -51 0 0 34 51 0 h .8157 g 2008 3816 N -51 0 0 33 51 0 h .823 g 2008 3849 N -51 0 0 34 51 0 h .8302 g 2008 3883 N -51 0 0 33 51 0 h .8375 g 2008 3916 N -51 0 0 34 51 0 h .8448 g 2008 3950 N -51 0 0 33 51 0 h .852 g 2008 3983 N -51 0 0 34 51 0 h .8593 g 2008 4017 N -51 0 0 34 51 0 h .8666 g 2008 4051 N -51 0 0 33 51 0 h .8739 g 2008 4084 N -51 0 0 34 51 0 h .8811 g 2008 4118 N -51 0 0 33 51 0 h .8884 g 2008 4151 N -51 0 0 34 51 0 h .8957 g 2008 4185 N -51 0 0 34 51 0 h .9029 g 2008 4219 N -51 0 0 33 51 0 h .2005 g 2059 928 N -50 0 0 33 50 0 h .2076 g 2059 961 N -50 0 0 34 50 0 h .2148 g 2059 995 N -50 0 0 34 50 0 h .2219 g 2059 1029 N -50 0 0 33 50 0 h .229 g 2059 1062 N -50 0 0 34 50 0 h .2361 g 2059 1096 N -50 0 0 33 50 0 h .2432 g 2059 1129 N -50 0 0 34 50 0 h .2503 g 2059 1163 N -50 0 0 34 50 0 h .2575 g 2059 1197 N -50 0 0 33 50 0 h .2646 g 2059 1230 N -50 0 0 34 50 0 h .2717 g 2059 1264 N -50 0 0 33 50 0 h .2788 g 2059 1297 N -50 0 0 34 50 0 h .2859 g 2059 1331 N -50 0 0 33 50 0 h .293 g 2059 1364 N -50 0 0 34 50 0 h .3002 g 2059 1398 N -50 0 0 34 50 0 h .3073 g 2059 1432 N -50 0 0 33 50 0 h .3144 g 2059 1465 N -50 0 0 34 50 0 h .3215 g 2059 1499 N -50 0 0 33 50 0 h .3286 g 2059 1532 N -50 0 0 34 50 0 h .3357 g 2059 1566 N -50 0 0 34 50 0 h .3429 g 2059 1600 N -50 0 0 33 50 0 h .35 g 2059 1633 N -50 0 0 34 50 0 h .3571 g 2059 1667 N -50 0 0 33 50 0 h .3642 g 2059 1700 N -50 0 0 34 50 0 h .3713 g 2059 1734 N -50 0 0 34 50 0 h .3784 g 2059 1768 N -50 0 0 33 50 0 h .3856 g 2059 1801 N -50 0 0 34 50 0 h .3927 g 2059 1835 N -50 0 0 33 50 0 h .3998 g 2059 1868 N -50 0 0 34 50 0 h .4069 g 2059 1902 N -50 0 0 33 50 0 h .414 g 2059 1935 N -50 0 0 34 50 0 h .4211 g 2059 1969 N -50 0 0 34 50 0 h .4283 g 2059 2003 N -50 0 0 33 50 0 h .4354 g 2059 2036 N -50 0 0 34 50 0 h .4425 g 2059 2070 N -50 0 0 33 50 0 h .4496 g 2059 2103 N -50 0 0 34 50 0 h .4567 g 2059 2137 N -50 0 0 34 50 0 h .4638 g 2059 2171 N -50 0 0 33 50 0 h .471 g 2059 2204 N -50 0 0 34 50 0 h .4781 g 2059 2238 N -50 0 0 33 50 0 h .4852 g 2059 2271 N -50 0 0 34 50 0 h .4923 g 2059 2305 N -50 0 0 34 50 0 h .4994 g 2059 2339 N -50 0 0 33 50 0 h .5065 g 2059 2372 N -50 0 0 34 50 0 h .5137 g 2059 2406 N -50 0 0 33 50 0 h .5208 g 2059 2439 N -50 0 0 34 50 0 h .5279 g 2059 2473 N -50 0 0 34 50 0 h .535 g 2059 2507 N -50 0 0 33 50 0 h .5421 g 2059 2540 N -50 0 0 34 50 0 h .5492 g 2059 2574 N -50 0 0 32 50 0 h .5564 g 2059 2606 N -50 0 0 34 50 0 h .5635 g 2059 2640 N -50 0 0 33 50 0 h .5706 g 2059 2673 N -50 0 0 34 50 0 h .5777 g 2059 2707 N -50 0 0 34 50 0 h .5848 g 2059 2741 N -50 0 0 33 50 0 h .5919 g 2059 2774 N -50 0 0 34 50 0 h .5991 g 2059 2808 N -50 0 0 33 50 0 h .6062 g 2059 2841 N -50 0 0 34 50 0 h .6133 g 2059 2875 N -50 0 0 34 50 0 h .6204 g 2059 2909 N -50 0 0 33 50 0 h .6275 g 2059 2942 N -50 0 0 34 50 0 h .6346 g 2059 2976 N -50 0 0 33 50 0 h .6418 g 2059 3009 N -50 0 0 34 50 0 h .6489 g 2059 3043 N -50 0 0 34 50 0 h .656 g 2059 3077 N -50 0 0 33 50 0 h .6631 g 2059 3110 N -50 0 0 34 50 0 h .6702 g 2059 3144 N -50 0 0 33 50 0 h .6773 g 2059 3177 N -50 0 0 34 50 0 h .6845 g 2059 3211 N -50 0 0 34 50 0 h .6916 g 2059 3245 N -50 0 0 33 50 0 h .6987 g 2059 3278 N -50 0 0 34 50 0 h .7058 g 2059 3312 N -50 0 0 33 50 0 h .7129 g 2059 3345 N -50 0 0 34 50 0 h .72 g 2059 3379 N -50 0 0 33 50 0 h .7272 g 2059 3412 N -50 0 0 34 50 0 h .7343 g 2059 3446 N -50 0 0 34 50 0 h .7414 g 2059 3480 N -50 0 0 33 50 0 h .7485 g 2059 3513 N -50 0 0 34 50 0 h .7556 g 2059 3547 N -50 0 0 33 50 0 h .7627 g 2059 3580 N -50 0 0 34 50 0 h .7699 g 2059 3614 N -50 0 0 34 50 0 h .777 g 2059 3648 N -50 0 0 33 50 0 h .7841 g 2059 3681 N -50 0 0 34 50 0 h .7912 g 2059 3715 N -50 0 0 33 50 0 h .7983 g 2059 3748 N -50 0 0 34 50 0 h .8054 g 2059 3782 N -50 0 0 34 50 0 h .8126 g 2059 3816 N -50 0 0 33 50 0 h .8197 g 2059 3849 N -50 0 0 34 50 0 h .8268 g 2059 3883 N -50 0 0 33 50 0 h .8339 g 2059 3916 N -50 0 0 34 50 0 h .841 g 2059 3950 N -50 0 0 33 50 0 h .8481 g 2059 3983 N -50 0 0 34 50 0 h .8553 g 2059 4017 N -50 0 0 34 50 0 h .8624 g 2059 4051 N -50 0 0 33 50 0 h .8695 g 2059 4084 N -50 0 0 34 50 0 h .8766 g 2059 4118 N -50 0 0 33 50 0 h .8837 g 2059 4151 N -50 0 0 34 50 0 h .8908 g 2059 4185 N -50 0 0 34 50 0 h .898 g 2059 4219 N -50 0 0 33 50 0 h .2106 g 2109 928 N -51 0 0 33 51 0 h .2175 g 2109 961 N -51 0 0 34 51 0 h .2245 g 2109 995 N -51 0 0 34 51 0 h .2314 g 2109 1029 N -51 0 0 33 51 0 h .2384 g 2109 1062 N -51 0 0 34 51 0 h .2454 g 2109 1096 N -51 0 0 33 51 0 h .2523 g 2109 1129 N -51 0 0 34 51 0 h .2593 g 2109 1163 N -51 0 0 34 51 0 h .2663 g 2109 1197 N -51 0 0 33 51 0 h .2732 g 2109 1230 N -51 0 0 34 51 0 h .2802 g 2109 1264 N -51 0 0 33 51 0 h .2872 g 2109 1297 N -51 0 0 34 51 0 h .2941 g 2109 1331 N -51 0 0 33 51 0 h .3011 g 2109 1364 N -51 0 0 34 51 0 h .308 g 2109 1398 N -51 0 0 34 51 0 h .315 g 2109 1432 N -51 0 0 33 51 0 h .322 g 2109 1465 N -51 0 0 34 51 0 h .3289 g 2109 1499 N -51 0 0 33 51 0 h .3359 g 2109 1532 N -51 0 0 34 51 0 h .3429 g 2109 1566 N -51 0 0 34 51 0 h .3498 g 2109 1600 N -51 0 0 33 51 0 h .3568 g 2109 1633 N -51 0 0 34 51 0 h .3638 g 2109 1667 N -51 0 0 33 51 0 h .3707 g 2109 1700 N -51 0 0 34 51 0 h .3777 g 2109 1734 N -51 0 0 34 51 0 h .3846 g 2109 1768 N -51 0 0 33 51 0 h .3916 g 2109 1801 N -51 0 0 34 51 0 h .3986 g 2109 1835 N -51 0 0 33 51 0 h .4055 g 2109 1868 N -51 0 0 34 51 0 h .4125 g 2109 1902 N -51 0 0 33 51 0 h .4195 g 2109 1935 N -51 0 0 34 51 0 h .4264 g 2109 1969 N -51 0 0 34 51 0 h .4334 g 2109 2003 N -51 0 0 33 51 0 h .4404 g 2109 2036 N -51 0 0 34 51 0 h .4473 g 2109 2070 N -51 0 0 33 51 0 h .4543 g 2109 2103 N -51 0 0 34 51 0 h .4612 g 2109 2137 N -51 0 0 34 51 0 h .4682 g 2109 2171 N -51 0 0 33 51 0 h .4752 g 2109 2204 N -51 0 0 34 51 0 h .4821 g 2109 2238 N -51 0 0 33 51 0 h .4891 g 2109 2271 N -51 0 0 34 51 0 h .4961 g 2109 2305 N -51 0 0 34 51 0 h .503 g 2109 2339 N -51 0 0 33 51 0 h .51 g 2109 2372 N -51 0 0 34 51 0 h .517 g 2109 2406 N -51 0 0 33 51 0 h .5239 g 2109 2439 N -51 0 0 34 51 0 h .5309 g 2109 2473 N -51 0 0 34 51 0 h .5378 g 2109 2507 N -51 0 0 33 51 0 h .5448 g 2109 2540 N -51 0 0 34 51 0 h .5518 g 2109 2574 N -51 0 0 32 51 0 h .5587 g 2109 2606 N -51 0 0 34 51 0 h .5657 g 2109 2640 N -51 0 0 33 51 0 h .5727 g 2109 2673 N -51 0 0 34 51 0 h .5796 g 2109 2707 N -51 0 0 34 51 0 h .5866 g 2109 2741 N -51 0 0 33 51 0 h .5935 g 2109 2774 N -51 0 0 34 51 0 h .6005 g 2109 2808 N -51 0 0 33 51 0 h .6075 g 2109 2841 N -51 0 0 34 51 0 h .6144 g 2109 2875 N -51 0 0 34 51 0 h .6214 g 2109 2909 N -51 0 0 33 51 0 h .6284 g 2109 2942 N -51 0 0 34 51 0 h .6353 g 2109 2976 N -51 0 0 33 51 0 h .6423 g 2109 3009 N -51 0 0 34 51 0 h .6493 g 2109 3043 N -51 0 0 34 51 0 h .6562 g 2109 3077 N -51 0 0 33 51 0 h .6632 g 2109 3110 N -51 0 0 34 51 0 h .6701 g 2109 3144 N -51 0 0 33 51 0 h .6771 g 2109 3177 N -51 0 0 34 51 0 h .6841 g 2109 3211 N -51 0 0 34 51 0 h .691 g 2109 3245 N -51 0 0 33 51 0 h .698 g 2109 3278 N -51 0 0 34 51 0 h .705 g 2109 3312 N -51 0 0 33 51 0 h .7119 g 2109 3345 N -51 0 0 34 51 0 h .7189 g 2109 3379 N -51 0 0 33 51 0 h .7259 g 2109 3412 N -51 0 0 34 51 0 h .7328 g 2109 3446 N -51 0 0 34 51 0 h .7398 g 2109 3480 N -51 0 0 33 51 0 h .7467 g 2109 3513 N -51 0 0 34 51 0 h .7537 g 2109 3547 N -51 0 0 33 51 0 h .7607 g 2109 3580 N -51 0 0 34 51 0 h .7676 g 2109 3614 N -51 0 0 34 51 0 h .7746 g 2109 3648 N -51 0 0 33 51 0 h .7816 g 2109 3681 N -51 0 0 34 51 0 h .7885 g 2109 3715 N -51 0 0 33 51 0 h .7955 g 2109 3748 N -51 0 0 34 51 0 h .8025 g 2109 3782 N -51 0 0 34 51 0 h .8094 g 2109 3816 N -51 0 0 33 51 0 h .8164 g 2109 3849 N -51 0 0 34 51 0 h .8233 g 2109 3883 N -51 0 0 33 51 0 h .8303 g 2109 3916 N -51 0 0 34 51 0 h .8373 g 2109 3950 N -51 0 0 33 51 0 h .8442 g 2109 3983 N -51 0 0 34 51 0 h .8512 g 2109 4017 N -51 0 0 34 51 0 h .8582 g 2109 4051 N -51 0 0 33 51 0 h .8651 g 2109 4084 N -51 0 0 34 51 0 h .8721 g 2109 4118 N -51 0 0 33 51 0 h .8791 g 2109 4151 N -51 0 0 34 51 0 h .886 g 2109 4185 N -51 0 0 34 51 0 h .893 g 2109 4219 N -51 0 0 33 51 0 h .2206 g 2160 928 N -50 0 0 33 50 0 h .2274 g 2160 961 N -50 0 0 34 50 0 h .2342 g 2160 995 N -50 0 0 34 50 0 h .241 g 2160 1029 N -50 0 0 33 50 0 h .2478 g 2160 1062 N -50 0 0 34 50 0 h .2546 g 2160 1096 N -50 0 0 33 50 0 h .2614 g 2160 1129 N -50 0 0 34 50 0 h .2683 g 2160 1163 N -50 0 0 34 50 0 h .2751 g 2160 1197 N -50 0 0 33 50 0 h .2819 g 2160 1230 N -50 0 0 34 50 0 h .2887 g 2160 1264 N -50 0 0 33 50 0 h .2955 g 2160 1297 N -50 0 0 34 50 0 h .3023 g 2160 1331 N -50 0 0 33 50 0 h .3091 g 2160 1364 N -50 0 0 34 50 0 h .3159 g 2160 1398 N -50 0 0 34 50 0 h .3227 g 2160 1432 N -50 0 0 33 50 0 h .3295 g 2160 1465 N -50 0 0 34 50 0 h .3364 g 2160 1499 N -50 0 0 33 50 0 h .3432 g 2160 1532 N -50 0 0 34 50 0 h .35 g 2160 1566 N -50 0 0 34 50 0 h .3568 g 2160 1600 N -50 0 0 33 50 0 h .3636 g 2160 1633 N -50 0 0 34 50 0 h .3704 g 2160 1667 N -50 0 0 33 50 0 h .3772 g 2160 1700 N -50 0 0 34 50 0 h .384 g 2160 1734 N -50 0 0 34 50 0 h .3908 g 2160 1768 N -50 0 0 33 50 0 h .3977 g 2160 1801 N -50 0 0 34 50 0 h .4045 g 2160 1835 N -50 0 0 33 50 0 h .4113 g 2160 1868 N -50 0 0 34 50 0 h .4181 g 2160 1902 N -50 0 0 33 50 0 h .4249 g 2160 1935 N -50 0 0 34 50 0 h .4317 g 2160 1969 N -50 0 0 34 50 0 h .4385 g 2160 2003 N -50 0 0 33 50 0 h .4453 g 2160 2036 N -50 0 0 34 50 0 h .4521 g 2160 2070 N -50 0 0 33 50 0 h .4589 g 2160 2103 N -50 0 0 34 50 0 h .4658 g 2160 2137 N -50 0 0 34 50 0 h .4726 g 2160 2171 N -50 0 0 33 50 0 h .4794 g 2160 2204 N -50 0 0 34 50 0 h .4862 g 2160 2238 N -50 0 0 33 50 0 h .493 g 2160 2271 N -50 0 0 34 50 0 h .4998 g 2160 2305 N -50 0 0 34 50 0 h .5066 g 2160 2339 N -50 0 0 33 50 0 h .5134 g 2160 2372 N -50 0 0 34 50 0 h .5202 g 2160 2406 N -50 0 0 33 50 0 h .5271 g 2160 2439 N -50 0 0 34 50 0 h .5339 g 2160 2473 N -50 0 0 34 50 0 h .5407 g 2160 2507 N -50 0 0 33 50 0 h .5475 g 2160 2540 N -50 0 0 34 50 0 h .5543 g 2160 2574 N -50 0 0 32 50 0 h .5611 g 2160 2606 N -50 0 0 34 50 0 h .5679 g 2160 2640 N -50 0 0 33 50 0 h .5747 g 2160 2673 N -50 0 0 34 50 0 h .5815 g 2160 2707 N -50 0 0 34 50 0 h .5883 g 2160 2741 N -50 0 0 33 50 0 h .5952 g 2160 2774 N -50 0 0 34 50 0 h .602 g 2160 2808 N -50 0 0 33 50 0 h .6088 g 2160 2841 N -50 0 0 34 50 0 h .6156 g 2160 2875 N -50 0 0 34 50 0 h .6224 g 2160 2909 N -50 0 0 33 50 0 h .6292 g 2160 2942 N -50 0 0 34 50 0 h .636 g 2160 2976 N -50 0 0 33 50 0 h .6428 g 2160 3009 N -50 0 0 34 50 0 h .6496 g 2160 3043 N -50 0 0 34 50 0 h .6565 g 2160 3077 N -50 0 0 33 50 0 h .6633 g 2160 3110 N -50 0 0 34 50 0 h .6701 g 2160 3144 N -50 0 0 33 50 0 h .6769 g 2160 3177 N -50 0 0 34 50 0 h .6837 g 2160 3211 N -50 0 0 34 50 0 h .6905 g 2160 3245 N -50 0 0 33 50 0 h .6973 g 2160 3278 N -50 0 0 34 50 0 h .7041 g 2160 3312 N -50 0 0 33 50 0 h .7109 g 2160 3345 N -50 0 0 34 50 0 h .7177 g 2160 3379 N -50 0 0 33 50 0 h .7246 g 2160 3412 N -50 0 0 34 50 0 h .7314 g 2160 3446 N -50 0 0 34 50 0 h .7382 g 2160 3480 N -50 0 0 33 50 0 h .745 g 2160 3513 N -50 0 0 34 50 0 h .7518 g 2160 3547 N -50 0 0 33 50 0 h .7586 g 2160 3580 N -50 0 0 34 50 0 h .7654 g 2160 3614 N -50 0 0 34 50 0 h .7722 g 2160 3648 N -50 0 0 33 50 0 h .779 g 2160 3681 N -50 0 0 34 50 0 h .7859 g 2160 3715 N -50 0 0 33 50 0 h .7927 g 2160 3748 N -50 0 0 34 50 0 h .7995 g 2160 3782 N -50 0 0 34 50 0 h .8063 g 2160 3816 N -50 0 0 33 50 0 h .8131 g 2160 3849 N -50 0 0 34 50 0 h .8199 g 2160 3883 N -50 0 0 33 50 0 h .8267 g 2160 3916 N -50 0 0 34 50 0 h .8335 g 2160 3950 N -50 0 0 33 50 0 h .8403 g 2160 3983 N -50 0 0 34 50 0 h .8471 g 2160 4017 N -50 0 0 34 50 0 h .854 g 2160 4051 N -50 0 0 33 50 0 h .8608 g 2160 4084 N -50 0 0 34 50 0 h .8676 g 2160 4118 N -50 0 0 33 50 0 h .8744 g 2160 4151 N -50 0 0 34 50 0 h .8812 g 2160 4185 N -50 0 0 34 50 0 h .888 g 2160 4219 N -50 0 0 33 50 0 h .2306 g 2210 928 N -51 0 0 33 51 0 h .2373 g 2210 961 N -51 0 0 34 51 0 h .2439 g 2210 995 N -51 0 0 34 51 0 h .2506 g 2210 1029 N -51 0 0 33 51 0 h .2572 g 2210 1062 N -51 0 0 34 51 0 h .2639 g 2210 1096 N -51 0 0 33 51 0 h .2705 g 2210 1129 N -51 0 0 34 51 0 h .2772 g 2210 1163 N -51 0 0 34 51 0 h .2839 g 2210 1197 N -51 0 0 33 51 0 h .2905 g 2210 1230 N -51 0 0 34 51 0 h .2972 g 2210 1264 N -51 0 0 33 51 0 h .3038 g 2210 1297 N -51 0 0 34 51 0 h .3105 g 2210 1331 N -51 0 0 33 51 0 h .3171 g 2210 1364 N -51 0 0 34 51 0 h .3238 g 2210 1398 N -51 0 0 34 51 0 h .3305 g 2210 1432 N -51 0 0 33 51 0 h .3371 g 2210 1465 N -51 0 0 34 51 0 h .3438 g 2210 1499 N -51 0 0 33 51 0 h .3504 g 2210 1532 N -51 0 0 34 51 0 h .3571 g 2210 1566 N -51 0 0 34 51 0 h .3638 g 2210 1600 N -51 0 0 33 51 0 h .3704 g 2210 1633 N -51 0 0 34 51 0 h .3771 g 2210 1667 N -51 0 0 33 51 0 h .3837 g 2210 1700 N -51 0 0 34 51 0 h .3904 g 2210 1734 N -51 0 0 34 51 0 h .397 g 2210 1768 N -51 0 0 33 51 0 h .4037 g 2210 1801 N -51 0 0 34 51 0 h .4104 g 2210 1835 N -51 0 0 33 51 0 h .417 g 2210 1868 N -51 0 0 34 51 0 h .4237 g 2210 1902 N -51 0 0 33 51 0 h .4303 g 2210 1935 N -51 0 0 34 51 0 h .437 g 2210 1969 N -51 0 0 34 51 0 h .4436 g 2210 2003 N -51 0 0 33 51 0 h .4503 g 2210 2036 N -51 0 0 34 51 0 h .457 g 2210 2070 N -51 0 0 33 51 0 h .4636 g 2210 2103 N -51 0 0 34 51 0 h .4703 g 2210 2137 N -51 0 0 34 51 0 h .4769 g 2210 2171 N -51 0 0 33 51 0 h .4836 g 2210 2204 N -51 0 0 34 51 0 h .4902 g 2210 2238 N -51 0 0 33 51 0 h .4969 g 2210 2271 N -51 0 0 34 51 0 h .5036 g 2210 2305 N -51 0 0 34 51 0 h .5102 g 2210 2339 N -51 0 0 33 51 0 h .5169 g 2210 2372 N -51 0 0 34 51 0 h .5235 g 2210 2406 N -51 0 0 33 51 0 h .5302 g 2210 2439 N -51 0 0 34 51 0 h .5368 g 2210 2473 N -51 0 0 34 51 0 h .5435 g 2210 2507 N -51 0 0 33 51 0 h .5502 g 2210 2540 N -51 0 0 34 51 0 h .5568 g 2210 2574 N -51 0 0 32 51 0 h .5635 g 2210 2606 N -51 0 0 34 51 0 h .5701 g 2210 2640 N -51 0 0 33 51 0 h .5768 g 2210 2673 N -51 0 0 34 51 0 h .5834 g 2210 2707 N -51 0 0 34 51 0 h .5901 g 2210 2741 N -51 0 0 33 51 0 h .5968 g 2210 2774 N -51 0 0 34 51 0 h .6034 g 2210 2808 N -51 0 0 33 51 0 h .6101 g 2210 2841 N -51 0 0 34 51 0 h .6167 g 2210 2875 N -51 0 0 34 51 0 h .6234 g 2210 2909 N -51 0 0 33 51 0 h .6301 g 2210 2942 N -51 0 0 34 51 0 h .6367 g 2210 2976 N -51 0 0 33 51 0 h .6434 g 2210 3009 N -51 0 0 34 51 0 h .65 g 2210 3043 N -51 0 0 34 51 0 h .6567 g 2210 3077 N -51 0 0 33 51 0 h .6633 g 2210 3110 N -51 0 0 34 51 0 h .67 g 2210 3144 N -51 0 0 33 51 0 h .6767 g 2210 3177 N -51 0 0 34 51 0 h .6833 g 2210 3211 N -51 0 0 34 51 0 h .69 g 2210 3245 N -51 0 0 33 51 0 h .6966 g 2210 3278 N -51 0 0 34 51 0 h .7033 g 2210 3312 N -51 0 0 33 51 0 h .7099 g 2210 3345 N -51 0 0 34 51 0 h .7166 g 2210 3379 N -51 0 0 33 51 0 h .7233 g 2210 3412 N -51 0 0 34 51 0 h .7299 g 2210 3446 N -51 0 0 34 51 0 h .7366 g 2210 3480 N -51 0 0 33 51 0 h .7432 g 2210 3513 N -51 0 0 34 51 0 h .7499 g 2210 3547 N -51 0 0 33 51 0 h .7565 g 2210 3580 N -51 0 0 34 51 0 h .7632 g 2210 3614 N -51 0 0 34 51 0 h .7699 g 2210 3648 N -51 0 0 33 51 0 h .7765 g 2210 3681 N -51 0 0 34 51 0 h .7832 g 2210 3715 N -51 0 0 33 51 0 h .7898 g 2210 3748 N -51 0 0 34 51 0 h .7965 g 2210 3782 N -51 0 0 34 51 0 h .8031 g 2210 3816 N -51 0 0 33 51 0 h .8098 g 2210 3849 N -51 0 0 34 51 0 h .8165 g 2210 3883 N -51 0 0 33 51 0 h .8231 g 2210 3916 N -51 0 0 34 51 0 h .8298 g 2210 3950 N -51 0 0 33 51 0 h .8364 g 2210 3983 N -51 0 0 34 51 0 h .8431 g 2210 4017 N -51 0 0 34 51 0 h .8497 g 2210 4051 N -51 0 0 33 51 0 h .8564 g 2210 4084 N -51 0 0 34 51 0 h .8631 g 2210 4118 N -51 0 0 33 51 0 h .8697 g 2210 4151 N -51 0 0 34 51 0 h .8764 g 2210 4185 N -51 0 0 34 51 0 h .883 g 2210 4219 N -51 0 0 33 51 0 h .2406 g 2261 928 N -50 0 0 33 50 0 h .2471 g 2261 961 N -50 0 0 34 50 0 h .2536 g 2261 995 N -50 0 0 34 50 0 h .2601 g 2261 1029 N -50 0 0 33 50 0 h .2666 g 2261 1062 N -50 0 0 34 50 0 h .2731 g 2261 1096 N -50 0 0 33 50 0 h .2797 g 2261 1129 N -50 0 0 34 50 0 h .2862 g 2261 1163 N -50 0 0 34 50 0 h .2927 g 2261 1197 N -50 0 0 33 50 0 h .2992 g 2261 1230 N -50 0 0 34 50 0 h .3057 g 2261 1264 N -50 0 0 33 50 0 h .3122 g 2261 1297 N -50 0 0 34 50 0 h .3187 g 2261 1331 N -50 0 0 33 50 0 h .3252 g 2261 1364 N -50 0 0 34 50 0 h .3317 g 2261 1398 N -50 0 0 34 50 0 h .3382 g 2261 1432 N -50 0 0 33 50 0 h .3447 g 2261 1465 N -50 0 0 34 50 0 h .3512 g 2261 1499 N -50 0 0 33 50 0 h .3577 g 2261 1532 N -50 0 0 34 50 0 h .3642 g 2261 1566 N -50 0 0 34 50 0 h .3707 g 2261 1600 N -50 0 0 33 50 0 h .3772 g 2261 1633 N -50 0 0 34 50 0 h .3837 g 2261 1667 N -50 0 0 33 50 0 h .3902 g 2261 1700 N -50 0 0 34 50 0 h .3967 g 2261 1734 N -50 0 0 34 50 0 h .4032 g 2261 1768 N -50 0 0 33 50 0 h .4097 g 2261 1801 N -50 0 0 34 50 0 h .4162 g 2261 1835 N -50 0 0 33 50 0 h .4228 g 2261 1868 N -50 0 0 34 50 0 h .4293 g 2261 1902 N -50 0 0 33 50 0 h .4358 g 2261 1935 N -50 0 0 34 50 0 h .4423 g 2261 1969 N -50 0 0 34 50 0 h .4488 g 2261 2003 N -50 0 0 33 50 0 h .4553 g 2261 2036 N -50 0 0 34 50 0 h .4618 g 2261 2070 N -50 0 0 33 50 0 h .4683 g 2261 2103 N -50 0 0 34 50 0 h .4748 g 2261 2137 N -50 0 0 34 50 0 h .4813 g 2261 2171 N -50 0 0 33 50 0 h .4878 g 2261 2204 N -50 0 0 34 50 0 h .4943 g 2261 2238 N -50 0 0 33 50 0 h .5008 g 2261 2271 N -50 0 0 34 50 0 h .5073 g 2261 2305 N -50 0 0 34 50 0 h .5138 g 2261 2339 N -50 0 0 33 50 0 h .5203 g 2261 2372 N -50 0 0 34 50 0 h .5268 g 2261 2406 N -50 0 0 33 50 0 h .5333 g 2261 2439 N -50 0 0 34 50 0 h .5398 g 2261 2473 N -50 0 0 34 50 0 h .5463 g 2261 2507 N -50 0 0 33 50 0 h .5528 g 2261 2540 N -50 0 0 34 50 0 h .5593 g 2261 2574 N -50 0 0 32 50 0 h .5658 g 2261 2606 N -50 0 0 34 50 0 h .5724 g 2261 2640 N -50 0 0 33 50 0 h .5789 g 2261 2673 N -50 0 0 34 50 0 h .5854 g 2261 2707 N -50 0 0 34 50 0 h .5919 g 2261 2741 N -50 0 0 33 50 0 h .5984 g 2261 2774 N -50 0 0 34 50 0 h .6049 g 2261 2808 N -50 0 0 33 50 0 h .6114 g 2261 2841 N -50 0 0 34 50 0 h .6179 g 2261 2875 N -50 0 0 34 50 0 h .6244 g 2261 2909 N -50 0 0 33 50 0 h .6309 g 2261 2942 N -50 0 0 34 50 0 h .6374 g 2261 2976 N -50 0 0 33 50 0 h .6439 g 2261 3009 N -50 0 0 34 50 0 h .6504 g 2261 3043 N -50 0 0 34 50 0 h .6569 g 2261 3077 N -50 0 0 33 50 0 h .6634 g 2261 3110 N -50 0 0 34 50 0 h .6699 g 2261 3144 N -50 0 0 33 50 0 h .6764 g 2261 3177 N -50 0 0 34 50 0 h .6829 g 2261 3211 N -50 0 0 34 50 0 h .6894 g 2261 3245 N -50 0 0 33 50 0 h .6959 g 2261 3278 N -50 0 0 34 50 0 h .7024 g 2261 3312 N -50 0 0 33 50 0 h .7089 g 2261 3345 N -50 0 0 34 50 0 h .7154 g 2261 3379 N -50 0 0 33 50 0 h .722 g 2261 3412 N -50 0 0 34 50 0 h .7285 g 2261 3446 N -50 0 0 34 50 0 h .735 g 2261 3480 N -50 0 0 33 50 0 h .7415 g 2261 3513 N -50 0 0 34 50 0 h .748 g 2261 3547 N -50 0 0 33 50 0 h .7545 g 2261 3580 N -50 0 0 34 50 0 h .761 g 2261 3614 N -50 0 0 34 50 0 h .7675 g 2261 3648 N -50 0 0 33 50 0 h .774 g 2261 3681 N -50 0 0 34 50 0 h .7805 g 2261 3715 N -50 0 0 33 50 0 h .787 g 2261 3748 N -50 0 0 34 50 0 h .7935 g 2261 3782 N -50 0 0 34 50 0 h .8 g 2261 3816 N -50 0 0 33 50 0 h .8065 g 2261 3849 N -50 0 0 34 50 0 h .813 g 2261 3883 N -50 0 0 33 50 0 h .8195 g 2261 3916 N -50 0 0 34 50 0 h .826 g 2261 3950 N -50 0 0 33 50 0 h .8325 g 2261 3983 N -50 0 0 34 50 0 h .839 g 2261 4017 N -50 0 0 34 50 0 h .8455 g 2261 4051 N -50 0 0 33 50 0 h .852 g 2261 4084 N -50 0 0 34 50 0 h .8585 g 2261 4118 N -50 0 0 33 50 0 h .8651 g 2261 4151 N -50 0 0 34 50 0 h .8716 g 2261 4185 N -50 0 0 34 50 0 h .8781 g 2261 4219 N -50 0 0 33 50 0 h .2507 g 2311 928 N -51 0 0 33 51 0 h .257 g 2311 961 N -51 0 0 34 51 0 h .2634 g 2311 995 N -51 0 0 34 51 0 h .2697 g 2311 1029 N -51 0 0 33 51 0 h .2761 g 2311 1062 N -51 0 0 34 51 0 h .2824 g 2311 1096 N -51 0 0 33 51 0 h .2888 g 2311 1129 N -51 0 0 34 51 0 h .2951 g 2311 1163 N -51 0 0 34 51 0 h .3015 g 2311 1197 N -51 0 0 33 51 0 h .3078 g 2311 1230 N -51 0 0 34 51 0 h .3142 g 2311 1264 N -51 0 0 33 51 0 h .3205 g 2311 1297 N -51 0 0 34 51 0 h .3269 g 2311 1331 N -51 0 0 33 51 0 h .3332 g 2311 1364 N -51 0 0 34 51 0 h .3396 g 2311 1398 N -51 0 0 34 51 0 h .3459 g 2311 1432 N -51 0 0 33 51 0 h .3523 g 2311 1465 N -51 0 0 34 51 0 h .3586 g 2311 1499 N -51 0 0 33 51 0 h .365 g 2311 1532 N -51 0 0 34 51 0 h .3713 g 2311 1566 N -51 0 0 34 51 0 h .3777 g 2311 1600 N -51 0 0 33 51 0 h .384 g 2311 1633 N -51 0 0 34 51 0 h .3904 g 2311 1667 N -51 0 0 33 51 0 h .3967 g 2311 1700 N -51 0 0 34 51 0 h .4031 g 2311 1734 N -51 0 0 34 51 0 h .4094 g 2311 1768 N -51 0 0 33 51 0 h .4158 g 2311 1801 N -51 0 0 34 51 0 h .4221 g 2311 1835 N -51 0 0 33 51 0 h .4285 g 2311 1868 N -51 0 0 34 51 0 h .4348 g 2311 1902 N -51 0 0 33 51 0 h .4412 g 2311 1935 N -51 0 0 34 51 0 h .4475 g 2311 1969 N -51 0 0 34 51 0 h .4539 g 2311 2003 N -51 0 0 33 51 0 h .4602 g 2311 2036 N -51 0 0 34 51 0 h .4666 g 2311 2070 N -51 0 0 33 51 0 h .4729 g 2311 2103 N -51 0 0 34 51 0 h .4793 g 2311 2137 N -51 0 0 34 51 0 h .4857 g 2311 2171 N -51 0 0 33 51 0 h .492 g 2311 2204 N -51 0 0 34 51 0 h .4984 g 2311 2238 N -51 0 0 33 51 0 h .5047 g 2311 2271 N -51 0 0 34 51 0 h .5111 g 2311 2305 N -51 0 0 34 51 0 h .5174 g 2311 2339 N -51 0 0 33 51 0 h .5238 g 2311 2372 N -51 0 0 34 51 0 h .5301 g 2311 2406 N -51 0 0 33 51 0 h .5365 g 2311 2439 N -51 0 0 34 51 0 h .5428 g 2311 2473 N -51 0 0 34 51 0 h .5492 g 2311 2507 N -51 0 0 33 51 0 h .5555 g 2311 2540 N -51 0 0 34 51 0 h .5619 g 2311 2574 N -51 0 0 32 51 0 h .5682 g 2311 2606 N -51 0 0 34 51 0 h .5746 g 2311 2640 N -51 0 0 33 51 0 h .5809 g 2311 2673 N -51 0 0 34 51 0 h .5873 g 2311 2707 N -51 0 0 34 51 0 h .5936 g 2311 2741 N -51 0 0 33 51 0 h .6 g 2311 2774 N -51 0 0 34 51 0 h .6063 g 2311 2808 N -51 0 0 33 51 0 h .6127 g 2311 2841 N -51 0 0 34 51 0 h .619 g 2311 2875 N -51 0 0 34 51 0 h .6254 g 2311 2909 N -51 0 0 33 51 0 h .6317 g 2311 2942 N -51 0 0 34 51 0 h .6381 g 2311 2976 N -51 0 0 33 51 0 h .6444 g 2311 3009 N -51 0 0 34 51 0 h .6508 g 2311 3043 N -51 0 0 34 51 0 h .6571 g 2311 3077 N -51 0 0 33 51 0 h .6635 g 2311 3110 N -51 0 0 34 51 0 h .6698 g 2311 3144 N -51 0 0 33 51 0 h .6762 g 2311 3177 N -51 0 0 34 51 0 h .6825 g 2311 3211 N -51 0 0 34 51 0 h .6889 g 2311 3245 N -51 0 0 33 51 0 h .6952 g 2311 3278 N -51 0 0 34 51 0 h .7016 g 2311 3312 N -51 0 0 33 51 0 h .708 g 2311 3345 N -51 0 0 34 51 0 h .7143 g 2311 3379 N -51 0 0 33 51 0 h .7207 g 2311 3412 N -51 0 0 34 51 0 h .727 g 2311 3446 N -51 0 0 34 51 0 h .7334 g 2311 3480 N -51 0 0 33 51 0 h .7397 g 2311 3513 N -51 0 0 34 51 0 h .7461 g 2311 3547 N -51 0 0 33 51 0 h .7524 g 2311 3580 N -51 0 0 34 51 0 h .7588 g 2311 3614 N -51 0 0 34 51 0 h .7651 g 2311 3648 N -51 0 0 33 51 0 h .7715 g 2311 3681 N -51 0 0 34 51 0 h .7778 g 2311 3715 N -51 0 0 33 51 0 h .7842 g 2311 3748 N -51 0 0 34 51 0 h .7905 g 2311 3782 N -51 0 0 34 51 0 h .7969 g 2311 3816 N -51 0 0 33 51 0 h .8032 g 2311 3849 N -51 0 0 34 51 0 h .8096 g 2311 3883 N -51 0 0 33 51 0 h .8159 g 2311 3916 N -51 0 0 34 51 0 h .8223 g 2311 3950 N -51 0 0 33 51 0 h .8286 g 2311 3983 N -51 0 0 34 51 0 h .835 g 2311 4017 N -51 0 0 34 51 0 h .8413 g 2311 4051 N -51 0 0 33 51 0 h .8477 g 2311 4084 N -51 0 0 34 51 0 h .854 g 2311 4118 N -51 0 0 33 51 0 h .8604 g 2311 4151 N -51 0 0 34 51 0 h .8667 g 2311 4185 N -51 0 0 34 51 0 h .8731 g 2311 4219 N -51 0 0 33 51 0 h .2607 g 2362 928 N -50 0 0 33 50 0 h .2669 g 2362 961 N -50 0 0 34 50 0 h .2731 g 2362 995 N -50 0 0 34 50 0 h .2793 g 2362 1029 N -50 0 0 33 50 0 h .2855 g 2362 1062 N -50 0 0 34 50 0 h .2917 g 2362 1096 N -50 0 0 33 50 0 h .2979 g 2362 1129 N -50 0 0 34 50 0 h .3041 g 2362 1163 N -50 0 0 34 50 0 h .3103 g 2362 1197 N -50 0 0 33 50 0 h .3165 g 2362 1230 N -50 0 0 34 50 0 h .3227 g 2362 1264 N -50 0 0 33 50 0 h .3289 g 2362 1297 N -50 0 0 34 50 0 h .3351 g 2362 1331 N -50 0 0 33 50 0 h .3413 g 2362 1364 N -50 0 0 34 50 0 h .3475 g 2362 1398 N -50 0 0 34 50 0 h .3537 g 2362 1432 N -50 0 0 33 50 0 h .3598 g 2362 1465 N -50 0 0 34 50 0 h .366 g 2362 1499 N -50 0 0 33 50 0 h .3722 g 2362 1532 N -50 0 0 34 50 0 h .3784 g 2362 1566 N -50 0 0 34 50 0 h .3846 g 2362 1600 N -50 0 0 33 50 0 h .3908 g 2362 1633 N -50 0 0 34 50 0 h .397 g 2362 1667 N -50 0 0 33 50 0 h .4032 g 2362 1700 N -50 0 0 34 50 0 h .4094 g 2362 1734 N -50 0 0 34 50 0 h .4156 g 2362 1768 N -50 0 0 33 50 0 h .4218 g 2362 1801 N -50 0 0 34 50 0 h .428 g 2362 1835 N -50 0 0 33 50 0 h .4342 g 2362 1868 N -50 0 0 34 50 0 h .4404 g 2362 1902 N -50 0 0 33 50 0 h .4466 g 2362 1935 N -50 0 0 34 50 0 h .4528 g 2362 1969 N -50 0 0 34 50 0 h .459 g 2362 2003 N -50 0 0 33 50 0 h .4652 g 2362 2036 N -50 0 0 34 50 0 h .4714 g 2362 2070 N -50 0 0 33 50 0 h .4776 g 2362 2103 N -50 0 0 34 50 0 h .4838 g 2362 2137 N -50 0 0 34 50 0 h .49 g 2362 2171 N -50 0 0 33 50 0 h .4962 g 2362 2204 N -50 0 0 34 50 0 h .5024 g 2362 2238 N -50 0 0 33 50 0 h .5086 g 2362 2271 N -50 0 0 34 50 0 h .5148 g 2362 2305 N -50 0 0 34 50 0 h .521 g 2362 2339 N -50 0 0 33 50 0 h .5272 g 2362 2372 N -50 0 0 34 50 0 h .5334 g 2362 2406 N -50 0 0 33 50 0 h .5396 g 2362 2439 N -50 0 0 34 50 0 h .5458 g 2362 2473 N -50 0 0 34 50 0 h .552 g 2362 2507 N -50 0 0 33 50 0 h .5582 g 2362 2540 N -50 0 0 34 50 0 h .5644 g 2362 2574 N -50 0 0 32 50 0 h .5706 g 2362 2606 N -50 0 0 34 50 0 h .5768 g 2362 2640 N -50 0 0 33 50 0 h .583 g 2362 2673 N -50 0 0 34 50 0 h .5892 g 2362 2707 N -50 0 0 34 50 0 h .5954 g 2362 2741 N -50 0 0 33 50 0 h .6016 g 2362 2774 N -50 0 0 34 50 0 h .6078 g 2362 2808 N -50 0 0 33 50 0 h .614 g 2362 2841 N -50 0 0 34 50 0 h .6202 g 2362 2875 N -50 0 0 34 50 0 h .6264 g 2362 2909 N -50 0 0 33 50 0 h .6326 g 2362 2942 N -50 0 0 34 50 0 h .6388 g 2362 2976 N -50 0 0 33 50 0 h .645 g 2362 3009 N -50 0 0 34 50 0 h .6512 g 2362 3043 N -50 0 0 34 50 0 h .6574 g 2362 3077 N -50 0 0 33 50 0 h .6636 g 2362 3110 N -50 0 0 34 50 0 h .6698 g 2362 3144 N -50 0 0 33 50 0 h .676 g 2362 3177 N -50 0 0 34 50 0 h .6822 g 2362 3211 N -50 0 0 34 50 0 h .6884 g 2362 3245 N -50 0 0 33 50 0 h .6946 g 2362 3278 N -50 0 0 34 50 0 h .7008 g 2362 3312 N -50 0 0 33 50 0 h .707 g 2362 3345 N -50 0 0 34 50 0 h .7132 g 2362 3379 N -50 0 0 33 50 0 h .7194 g 2362 3412 N -50 0 0 34 50 0 h .7256 g 2362 3446 N -50 0 0 34 50 0 h .7317 g 2362 3480 N -50 0 0 33 50 0 h .7379 g 2362 3513 N -50 0 0 34 50 0 h .7441 g 2362 3547 N -50 0 0 33 50 0 h .7503 g 2362 3580 N -50 0 0 34 50 0 h .7565 g 2362 3614 N -50 0 0 34 50 0 h .7627 g 2362 3648 N -50 0 0 33 50 0 h .7689 g 2362 3681 N -50 0 0 34 50 0 h .7751 g 2362 3715 N -50 0 0 33 50 0 h .7813 g 2362 3748 N -50 0 0 34 50 0 h .7875 g 2362 3782 N -50 0 0 34 50 0 h .7937 g 2362 3816 N -50 0 0 33 50 0 h .7999 g 2362 3849 N -50 0 0 34 50 0 h .8061 g 2362 3883 N -50 0 0 33 50 0 h .8123 g 2362 3916 N -50 0 0 34 50 0 h .8185 g 2362 3950 N -50 0 0 33 50 0 h .8247 g 2362 3983 N -50 0 0 34 50 0 h .8309 g 2362 4017 N -50 0 0 34 50 0 h .8371 g 2362 4051 N -50 0 0 33 50 0 h .8433 g 2362 4084 N -50 0 0 34 50 0 h .8495 g 2362 4118 N -50 0 0 33 50 0 h .8557 g 2362 4151 N -50 0 0 34 50 0 h .8619 g 2362 4185 N -50 0 0 34 50 0 h .8681 g 2362 4219 N -50 0 0 33 50 0 h .2707 g 2412 928 N -51 0 0 33 51 0 h .2767 g 2412 961 N -51 0 0 34 51 0 h .2828 g 2412 995 N -51 0 0 34 51 0 h .2888 g 2412 1029 N -51 0 0 33 51 0 h .2949 g 2412 1062 N -51 0 0 34 51 0 h .3009 g 2412 1096 N -51 0 0 33 51 0 h .307 g 2412 1129 N -51 0 0 34 51 0 h .313 g 2412 1163 N -51 0 0 34 51 0 h .3191 g 2412 1197 N -51 0 0 33 51 0 h .3251 g 2412 1230 N -51 0 0 34 51 0 h .3312 g 2412 1264 N -51 0 0 33 51 0 h .3372 g 2412 1297 N -51 0 0 34 51 0 h .3432 g 2412 1331 N -51 0 0 33 51 0 h .3493 g 2412 1364 N -51 0 0 34 51 0 h .3553 g 2412 1398 N -51 0 0 34 51 0 h .3614 g 2412 1432 N -51 0 0 33 51 0 h .3674 g 2412 1465 N -51 0 0 34 51 0 h .3735 g 2412 1499 N -51 0 0 33 51 0 h .3795 g 2412 1532 N -51 0 0 34 51 0 h .3856 g 2412 1566 N -51 0 0 34 51 0 h .3916 g 2412 1600 N -51 0 0 33 51 0 h .3977 g 2412 1633 N -51 0 0 34 51 0 h .4037 g 2412 1667 N -51 0 0 33 51 0 h .4097 g 2412 1700 N -51 0 0 34 51 0 h .4158 g 2412 1734 N -51 0 0 34 51 0 h .4218 g 2412 1768 N -51 0 0 33 51 0 h .4279 g 2412 1801 N -51 0 0 34 51 0 h .4339 g 2412 1835 N -51 0 0 33 51 0 h .44 g 2412 1868 N -51 0 0 34 51 0 h .446 g 2412 1902 N -51 0 0 33 51 0 h .4521 g 2412 1935 N -51 0 0 34 51 0 h .4581 g 2412 1969 N -51 0 0 34 51 0 h .4641 g 2412 2003 N -51 0 0 33 51 0 h .4702 g 2412 2036 N -51 0 0 34 51 0 h .4762 g 2412 2070 N -51 0 0 33 51 0 h .4823 g 2412 2103 N -51 0 0 34 51 0 h .4883 g 2412 2137 N -51 0 0 34 51 0 h .4944 g 2412 2171 N -51 0 0 33 51 0 h .5004 g 2412 2204 N -51 0 0 34 51 0 h .5065 g 2412 2238 N -51 0 0 33 51 0 h .5125 g 2412 2271 N -51 0 0 34 51 0 h .5186 g 2412 2305 N -51 0 0 34 51 0 h .5246 g 2412 2339 N -51 0 0 33 51 0 h .5306 g 2412 2372 N -51 0 0 34 51 0 h .5367 g 2412 2406 N -51 0 0 33 51 0 h .5427 g 2412 2439 N -51 0 0 34 51 0 h .5488 g 2412 2473 N -51 0 0 34 51 0 h .5548 g 2412 2507 N -51 0 0 33 51 0 h .5609 g 2412 2540 N -51 0 0 34 51 0 h .5669 g 2412 2574 N -51 0 0 32 51 0 h .573 g 2412 2606 N -51 0 0 34 51 0 h .579 g 2412 2640 N -51 0 0 33 51 0 h .5851 g 2412 2673 N -51 0 0 34 51 0 h .5911 g 2412 2707 N -51 0 0 34 51 0 h .5971 g 2412 2741 N -51 0 0 33 51 0 h .6032 g 2412 2774 N -51 0 0 34 51 0 h .6092 g 2412 2808 N -51 0 0 33 51 0 h .6153 g 2412 2841 N -51 0 0 34 51 0 h .6213 g 2412 2875 N -51 0 0 34 51 0 h .6274 g 2412 2909 N -51 0 0 33 51 0 h .6334 g 2412 2942 N -51 0 0 34 51 0 h .6395 g 2412 2976 N -51 0 0 33 51 0 h .6455 g 2412 3009 N -51 0 0 34 51 0 h .6516 g 2412 3043 N -51 0 0 34 51 0 h .6576 g 2412 3077 N -51 0 0 33 51 0 h .6636 g 2412 3110 N -51 0 0 34 51 0 h .6697 g 2412 3144 N -51 0 0 33 51 0 h .6757 g 2412 3177 N -51 0 0 34 51 0 h .6818 g 2412 3211 N -51 0 0 34 51 0 h .6878 g 2412 3245 N -51 0 0 33 51 0 h .6939 g 2412 3278 N -51 0 0 34 51 0 h .6999 g 2412 3312 N -51 0 0 33 51 0 h .706 g 2412 3345 N -51 0 0 34 51 0 h .712 g 2412 3379 N -51 0 0 33 51 0 h .7181 g 2412 3412 N -51 0 0 34 51 0 h .7241 g 2412 3446 N -51 0 0 34 51 0 h .7301 g 2412 3480 N -51 0 0 33 51 0 h .7362 g 2412 3513 N -51 0 0 34 51 0 h .7422 g 2412 3547 N -51 0 0 33 51 0 h .7483 g 2412 3580 N -51 0 0 34 51 0 h .7543 g 2412 3614 N -51 0 0 34 51 0 h .7604 g 2412 3648 N -51 0 0 33 51 0 h .7664 g 2412 3681 N -51 0 0 34 51 0 h .7725 g 2412 3715 N -51 0 0 33 51 0 h .7785 g 2412 3748 N -51 0 0 34 51 0 h .7845 g 2412 3782 N -51 0 0 34 51 0 h .7906 g 2412 3816 N -51 0 0 33 51 0 h .7966 g 2412 3849 N -51 0 0 34 51 0 h .8027 g 2412 3883 N -51 0 0 33 51 0 h .8087 g 2412 3916 N -51 0 0 34 51 0 h .8148 g 2412 3950 N -51 0 0 33 51 0 h .8208 g 2412 3983 N -51 0 0 34 51 0 h .8269 g 2412 4017 N -51 0 0 34 51 0 h .8329 g 2412 4051 N -51 0 0 33 51 0 h .839 g 2412 4084 N -51 0 0 34 51 0 h .845 g 2412 4118 N -51 0 0 33 51 0 h .851 g 2412 4151 N -51 0 0 34 51 0 h .8571 g 2412 4185 N -51 0 0 34 51 0 h .8631 g 2412 4219 N -51 0 0 33 51 0 h .2807 g 2463 928 N -51 0 0 33 51 0 h .2866 g 2463 961 N -51 0 0 34 51 0 h .2925 g 2463 995 N -51 0 0 34 51 0 h .2984 g 2463 1029 N -51 0 0 33 51 0 h .3043 g 2463 1062 N -51 0 0 34 51 0 h .3102 g 2463 1096 N -51 0 0 33 51 0 h .3161 g 2463 1129 N -51 0 0 34 51 0 h .322 g 2463 1163 N -51 0 0 34 51 0 h .3279 g 2463 1197 N -51 0 0 33 51 0 h .3338 g 2463 1230 N -51 0 0 34 51 0 h .3396 g 2463 1264 N -51 0 0 33 51 0 h .3455 g 2463 1297 N -51 0 0 34 51 0 h .3514 g 2463 1331 N -51 0 0 33 51 0 h .3573 g 2463 1364 N -51 0 0 34 51 0 h .3632 g 2463 1398 N -51 0 0 34 51 0 h .3691 g 2463 1432 N -51 0 0 33 51 0 h .375 g 2463 1465 N -51 0 0 34 51 0 h .3809 g 2463 1499 N -51 0 0 33 51 0 h .3868 g 2463 1532 N -51 0 0 34 51 0 h .3927 g 2463 1566 N -51 0 0 34 51 0 h .3986 g 2463 1600 N -51 0 0 33 51 0 h .4045 g 2463 1633 N -51 0 0 34 51 0 h .4104 g 2463 1667 N -51 0 0 33 51 0 h .4162 g 2463 1700 N -51 0 0 34 51 0 h .4221 g 2463 1734 N -51 0 0 34 51 0 h .428 g 2463 1768 N -51 0 0 33 51 0 h .4339 g 2463 1801 N -51 0 0 34 51 0 h .4398 g 2463 1835 N -51 0 0 33 51 0 h .4457 g 2463 1868 N -51 0 0 34 51 0 h .4516 g 2463 1902 N -51 0 0 33 51 0 h .4575 g 2463 1935 N -51 0 0 34 51 0 h .4634 g 2463 1969 N -51 0 0 34 51 0 h .4693 g 2463 2003 N -51 0 0 33 51 0 h .4752 g 2463 2036 N -51 0 0 34 51 0 h .4811 g 2463 2070 N -51 0 0 33 51 0 h .487 g 2463 2103 N -51 0 0 34 51 0 h .4928 g 2463 2137 N -51 0 0 34 51 0 h .4987 g 2463 2171 N -51 0 0 33 51 0 h .5046 g 2463 2204 N -51 0 0 34 51 0 h .5105 g 2463 2238 N -51 0 0 33 51 0 h .5164 g 2463 2271 N -51 0 0 34 51 0 h .5223 g 2463 2305 N -51 0 0 34 51 0 h .5282 g 2463 2339 N -51 0 0 33 51 0 h .5341 g 2463 2372 N -51 0 0 34 51 0 h .54 g 2463 2406 N -51 0 0 33 51 0 h .5459 g 2463 2439 N -51 0 0 34 51 0 h .5518 g 2463 2473 N -51 0 0 34 51 0 h .5577 g 2463 2507 N -51 0 0 33 51 0 h .5636 g 2463 2540 N -51 0 0 34 51 0 h .5694 g 2463 2574 N -51 0 0 32 51 0 h .5753 g 2463 2606 N -51 0 0 34 51 0 h .5812 g 2463 2640 N -51 0 0 33 51 0 h .5871 g 2463 2673 N -51 0 0 34 51 0 h .593 g 2463 2707 N -51 0 0 34 51 0 h .5989 g 2463 2741 N -51 0 0 33 51 0 h .6048 g 2463 2774 N -51 0 0 34 51 0 h .6107 g 2463 2808 N -51 0 0 33 51 0 h .6166 g 2463 2841 N -51 0 0 34 51 0 h .6225 g 2463 2875 N -51 0 0 34 51 0 h .6284 g 2463 2909 N -51 0 0 33 51 0 h .6343 g 2463 2942 N -51 0 0 34 51 0 h .6402 g 2463 2976 N -51 0 0 33 51 0 h .646 g 2463 3009 N -51 0 0 34 51 0 h .6519 g 2463 3043 N -51 0 0 34 51 0 h .6578 g 2463 3077 N -51 0 0 33 51 0 h .6637 g 2463 3110 N -51 0 0 34 51 0 h .6696 g 2463 3144 N -51 0 0 33 51 0 h .6755 g 2463 3177 N -51 0 0 34 51 0 h .6814 g 2463 3211 N -51 0 0 34 51 0 h .6873 g 2463 3245 N -51 0 0 33 51 0 h .6932 g 2463 3278 N -51 0 0 34 51 0 h .6991 g 2463 3312 N -51 0 0 33 51 0 h .705 g 2463 3345 N -51 0 0 34 51 0 h .7109 g 2463 3379 N -51 0 0 33 51 0 h .7168 g 2463 3412 N -51 0 0 34 51 0 h .7226 g 2463 3446 N -51 0 0 34 51 0 h .7285 g 2463 3480 N -51 0 0 33 51 0 h .7344 g 2463 3513 N -51 0 0 34 51 0 h .7403 g 2463 3547 N -51 0 0 33 51 0 h .7462 g 2463 3580 N -51 0 0 34 51 0 h .7521 g 2463 3614 N -51 0 0 34 51 0 h .758 g 2463 3648 N -51 0 0 33 51 0 h .7639 g 2463 3681 N -51 0 0 34 51 0 h .7698 g 2463 3715 N -51 0 0 33 51 0 h .7757 g 2463 3748 N -51 0 0 34 51 0 h .7816 g 2463 3782 N -51 0 0 34 51 0 h .7875 g 2463 3816 N -51 0 0 33 51 0 h .7934 g 2463 3849 N -51 0 0 34 51 0 h .7992 g 2463 3883 N -51 0 0 33 51 0 h .8051 g 2463 3916 N -51 0 0 34 51 0 h .811 g 2463 3950 N -51 0 0 33 51 0 h .8169 g 2463 3983 N -51 0 0 34 51 0 h .8228 g 2463 4017 N -51 0 0 34 51 0 h .8287 g 2463 4051 N -51 0 0 33 51 0 h .8346 g 2463 4084 N -51 0 0 34 51 0 h .8405 g 2463 4118 N -51 0 0 33 51 0 h .8464 g 2463 4151 N -51 0 0 34 51 0 h .8523 g 2463 4185 N -51 0 0 34 51 0 h .8582 g 2463 4219 N -51 0 0 33 51 0 h .2907 g 2514 928 N -50 0 0 33 50 0 h .2965 g 2514 961 N -50 0 0 34 50 0 h .3022 g 2514 995 N -50 0 0 34 50 0 h .308 g 2514 1029 N -50 0 0 33 50 0 h .3137 g 2514 1062 N -50 0 0 34 50 0 h .3194 g 2514 1096 N -50 0 0 33 50 0 h .3252 g 2514 1129 N -50 0 0 34 50 0 h .3309 g 2514 1163 N -50 0 0 34 50 0 h .3367 g 2514 1197 N -50 0 0 33 50 0 h .3424 g 2514 1230 N -50 0 0 34 50 0 h .3481 g 2514 1264 N -50 0 0 33 50 0 h .3539 g 2514 1297 N -50 0 0 34 50 0 h .3596 g 2514 1331 N -50 0 0 33 50 0 h .3654 g 2514 1364 N -50 0 0 34 50 0 h .3711 g 2514 1398 N -50 0 0 34 50 0 h .3768 g 2514 1432 N -50 0 0 33 50 0 h .3826 g 2514 1465 N -50 0 0 34 50 0 h .3883 g 2514 1499 N -50 0 0 33 50 0 h .3941 g 2514 1532 N -50 0 0 34 50 0 h .3998 g 2514 1566 N -50 0 0 34 50 0 h .4055 g 2514 1600 N -50 0 0 33 50 0 h .4113 g 2514 1633 N -50 0 0 34 50 0 h .417 g 2514 1667 N -50 0 0 33 50 0 h .4228 g 2514 1700 N -50 0 0 34 50 0 h .4285 g 2514 1734 N -50 0 0 34 50 0 h .4342 g 2514 1768 N -50 0 0 33 50 0 h .44 g 2514 1801 N -50 0 0 34 50 0 h .4457 g 2514 1835 N -50 0 0 33 50 0 h .4514 g 2514 1868 N -50 0 0 34 50 0 h .4572 g 2514 1902 N -50 0 0 33 50 0 h .4629 g 2514 1935 N -50 0 0 34 50 0 h .4687 g 2514 1969 N -50 0 0 34 50 0 h .4744 g 2514 2003 N -50 0 0 33 50 0 h .4801 g 2514 2036 N -50 0 0 34 50 0 h .4859 g 2514 2070 N -50 0 0 33 50 0 h .4916 g 2514 2103 N -50 0 0 34 50 0 h .4974 g 2514 2137 N -50 0 0 34 50 0 h .5031 g 2514 2171 N -50 0 0 33 50 0 h .5088 g 2514 2204 N -50 0 0 34 50 0 h .5146 g 2514 2238 N -50 0 0 33 50 0 h .5203 g 2514 2271 N -50 0 0 34 50 0 h .5261 g 2514 2305 N -50 0 0 34 50 0 h .5318 g 2514 2339 N -50 0 0 33 50 0 h .5375 g 2514 2372 N -50 0 0 34 50 0 h .5433 g 2514 2406 N -50 0 0 33 50 0 h .549 g 2514 2439 N -50 0 0 34 50 0 h .5548 g 2514 2473 N -50 0 0 34 50 0 h .5605 g 2514 2507 N -50 0 0 33 50 0 h .5662 g 2514 2540 N -50 0 0 34 50 0 h .572 g 2514 2574 N -50 0 0 32 50 0 h .5777 g 2514 2606 N -50 0 0 34 50 0 h .5834 g 2514 2640 N -50 0 0 33 50 0 h .5892 g 2514 2673 N -50 0 0 34 50 0 h .5949 g 2514 2707 N -50 0 0 34 50 0 h .6007 g 2514 2741 N -50 0 0 33 50 0 h .6064 g 2514 2774 N -50 0 0 34 50 0 h .6121 g 2514 2808 N -50 0 0 33 50 0 h .6179 g 2514 2841 N -50 0 0 34 50 0 h .6236 g 2514 2875 N -50 0 0 34 50 0 h .6294 g 2514 2909 N -50 0 0 33 50 0 h .6351 g 2514 2942 N -50 0 0 34 50 0 h .6408 g 2514 2976 N -50 0 0 33 50 0 h .6466 g 2514 3009 N -50 0 0 34 50 0 h .6523 g 2514 3043 N -50 0 0 34 50 0 h .6581 g 2514 3077 N -50 0 0 33 50 0 h .6638 g 2514 3110 N -50 0 0 34 50 0 h .6695 g 2514 3144 N -50 0 0 33 50 0 h .6753 g 2514 3177 N -50 0 0 34 50 0 h .681 g 2514 3211 N -50 0 0 34 50 0 h .6868 g 2514 3245 N -50 0 0 33 50 0 h .6925 g 2514 3278 N -50 0 0 34 50 0 h .6982 g 2514 3312 N -50 0 0 33 50 0 h .704 g 2514 3345 N -50 0 0 34 50 0 h .7097 g 2514 3379 N -50 0 0 33 50 0 h .7155 g 2514 3412 N -50 0 0 34 50 0 h .7212 g 2514 3446 N -50 0 0 34 50 0 h .7269 g 2514 3480 N -50 0 0 33 50 0 h .7327 g 2514 3513 N -50 0 0 34 50 0 h .7384 g 2514 3547 N -50 0 0 33 50 0 h .7441 g 2514 3580 N -50 0 0 34 50 0 h .7499 g 2514 3614 N -50 0 0 34 50 0 h .7556 g 2514 3648 N -50 0 0 33 50 0 h .7614 g 2514 3681 N -50 0 0 34 50 0 h .7671 g 2514 3715 N -50 0 0 33 50 0 h .7728 g 2514 3748 N -50 0 0 34 50 0 h .7786 g 2514 3782 N -50 0 0 34 50 0 h .7843 g 2514 3816 N -50 0 0 33 50 0 h .7901 g 2514 3849 N -50 0 0 34 50 0 h .7958 g 2514 3883 N -50 0 0 33 50 0 h .8015 g 2514 3916 N -50 0 0 34 50 0 h .8073 g 2514 3950 N -50 0 0 33 50 0 h .813 g 2514 3983 N -50 0 0 34 50 0 h .8188 g 2514 4017 N -50 0 0 34 50 0 h .8245 g 2514 4051 N -50 0 0 33 50 0 h .8302 g 2514 4084 N -50 0 0 34 50 0 h .836 g 2514 4118 N -50 0 0 33 50 0 h .8417 g 2514 4151 N -50 0 0 34 50 0 h .8475 g 2514 4185 N -50 0 0 34 50 0 h .8532 g 2514 4219 N -50 0 0 33 50 0 h .3008 g 2564 928 N -51 0 0 33 51 0 h .3064 g 2564 961 N -51 0 0 34 51 0 h .3119 g 2564 995 N -51 0 0 34 51 0 h .3175 g 2564 1029 N -51 0 0 33 51 0 h .3231 g 2564 1062 N -51 0 0 34 51 0 h .3287 g 2564 1096 N -51 0 0 33 51 0 h .3343 g 2564 1129 N -51 0 0 34 51 0 h .3399 g 2564 1163 N -51 0 0 34 51 0 h .3455 g 2564 1197 N -51 0 0 33 51 0 h .351 g 2564 1230 N -51 0 0 34 51 0 h .3566 g 2564 1264 N -51 0 0 33 51 0 h .3622 g 2564 1297 N -51 0 0 34 51 0 h .3678 g 2564 1331 N -51 0 0 33 51 0 h .3734 g 2564 1364 N -51 0 0 34 51 0 h .379 g 2564 1398 N -51 0 0 34 51 0 h .3846 g 2564 1432 N -51 0 0 33 51 0 h .3902 g 2564 1465 N -51 0 0 34 51 0 h .3957 g 2564 1499 N -51 0 0 33 51 0 h .4013 g 2564 1532 N -51 0 0 34 51 0 h .4069 g 2564 1566 N -51 0 0 34 51 0 h .4125 g 2564 1600 N -51 0 0 33 51 0 h .4181 g 2564 1633 N -51 0 0 34 51 0 h .4237 g 2564 1667 N -51 0 0 33 51 0 h .4293 g 2564 1700 N -51 0 0 34 51 0 h .4348 g 2564 1734 N -51 0 0 34 51 0 h .4404 g 2564 1768 N -51 0 0 33 51 0 h .446 g 2564 1801 N -51 0 0 34 51 0 h .4516 g 2564 1835 N -51 0 0 33 51 0 h .4572 g 2564 1868 N -51 0 0 34 51 0 h .4628 g 2564 1902 N -51 0 0 33 51 0 h .4684 g 2564 1935 N -51 0 0 34 51 0 h .4739 g 2564 1969 N -51 0 0 34 51 0 h .4795 g 2564 2003 N -51 0 0 33 51 0 h .4851 g 2564 2036 N -51 0 0 34 51 0 h .4907 g 2564 2070 N -51 0 0 33 51 0 h .4963 g 2564 2103 N -51 0 0 34 51 0 h .5019 g 2564 2137 N -51 0 0 34 51 0 h .5075 g 2564 2171 N -51 0 0 33 51 0 h .513 g 2564 2204 N -51 0 0 34 51 0 h .5186 g 2564 2238 N -51 0 0 33 51 0 h .5242 g 2564 2271 N -51 0 0 34 51 0 h .5298 g 2564 2305 N -51 0 0 34 51 0 h .5354 g 2564 2339 N -51 0 0 33 51 0 h .541 g 2564 2372 N -51 0 0 34 51 0 h .5466 g 2564 2406 N -51 0 0 33 51 0 h .5522 g 2564 2439 N -51 0 0 34 51 0 h .5577 g 2564 2473 N -51 0 0 34 51 0 h .5633 g 2564 2507 N -51 0 0 33 51 0 h .5689 g 2564 2540 N -51 0 0 34 51 0 h .5745 g 2564 2574 N -51 0 0 32 51 0 h .5801 g 2564 2606 N -51 0 0 34 51 0 h .5857 g 2564 2640 N -51 0 0 33 51 0 h .5913 g 2564 2673 N -51 0 0 34 51 0 h .5968 g 2564 2707 N -51 0 0 34 51 0 h .6024 g 2564 2741 N -51 0 0 33 51 0 h .608 g 2564 2774 N -51 0 0 34 51 0 h .6136 g 2564 2808 N -51 0 0 33 51 0 h .6192 g 2564 2841 N -51 0 0 34 51 0 h .6248 g 2564 2875 N -51 0 0 34 51 0 h .6304 g 2564 2909 N -51 0 0 33 51 0 h .6359 g 2564 2942 N -51 0 0 34 51 0 h .6415 g 2564 2976 N -51 0 0 33 51 0 h .6471 g 2564 3009 N -51 0 0 34 51 0 h .6527 g 2564 3043 N -51 0 0 34 51 0 h .6583 g 2564 3077 N -51 0 0 33 51 0 h .6639 g 2564 3110 N -51 0 0 34 51 0 h .6695 g 2564 3144 N -51 0 0 33 51 0 h .675 g 2564 3177 N -51 0 0 34 51 0 h .6806 g 2564 3211 N -51 0 0 34 51 0 h .6862 g 2564 3245 N -51 0 0 33 51 0 h .6918 g 2564 3278 N -51 0 0 34 51 0 h .6974 g 2564 3312 N -51 0 0 33 51 0 h .703 g 2564 3345 N -51 0 0 34 51 0 h .7086 g 2564 3379 N -51 0 0 33 51 0 h .7141 g 2564 3412 N -51 0 0 34 51 0 h .7197 g 2564 3446 N -51 0 0 34 51 0 h .7253 g 2564 3480 N -51 0 0 33 51 0 h .7309 g 2564 3513 N -51 0 0 34 51 0 h .7365 g 2564 3547 N -51 0 0 33 51 0 h .7421 g 2564 3580 N -51 0 0 34 51 0 h .7477 g 2564 3614 N -51 0 0 34 51 0 h .7533 g 2564 3648 N -51 0 0 33 51 0 h .7588 g 2564 3681 N -51 0 0 34 51 0 h .7644 g 2564 3715 N -51 0 0 33 51 0 h .77 g 2564 3748 N -51 0 0 34 51 0 h .7756 g 2564 3782 N -51 0 0 34 51 0 h .7812 g 2564 3816 N -51 0 0 33 51 0 h .7868 g 2564 3849 N -51 0 0 34 51 0 h .7924 g 2564 3883 N -51 0 0 33 51 0 h .7979 g 2564 3916 N -51 0 0 34 51 0 h .8035 g 2564 3950 N -51 0 0 33 51 0 h .8091 g 2564 3983 N -51 0 0 34 51 0 h .8147 g 2564 4017 N -51 0 0 34 51 0 h .8203 g 2564 4051 N -51 0 0 33 51 0 h .8259 g 2564 4084 N -51 0 0 34 51 0 h .8315 g 2564 4118 N -51 0 0 33 51 0 h .837 g 2564 4151 N -51 0 0 34 51 0 h .8426 g 2564 4185 N -51 0 0 34 51 0 h .8482 g 2564 4219 N -51 0 0 33 51 0 h .3108 g 2615 928 N -50 0 0 33 50 0 h .3162 g 2615 961 N -50 0 0 34 50 0 h .3217 g 2615 995 N -50 0 0 34 50 0 h .3271 g 2615 1029 N -50 0 0 33 50 0 h .3325 g 2615 1062 N -50 0 0 34 50 0 h .338 g 2615 1096 N -50 0 0 33 50 0 h .3434 g 2615 1129 N -50 0 0 34 50 0 h .3488 g 2615 1163 N -50 0 0 34 50 0 h .3543 g 2615 1197 N -50 0 0 33 50 0 h .3597 g 2615 1230 N -50 0 0 34 50 0 h .3651 g 2615 1264 N -50 0 0 33 50 0 h .3706 g 2615 1297 N -50 0 0 34 50 0 h .376 g 2615 1331 N -50 0 0 33 50 0 h .3814 g 2615 1364 N -50 0 0 34 50 0 h .3869 g 2615 1398 N -50 0 0 34 50 0 h .3923 g 2615 1432 N -50 0 0 33 50 0 h .3977 g 2615 1465 N -50 0 0 34 50 0 h .4032 g 2615 1499 N -50 0 0 33 50 0 h .4086 g 2615 1532 N -50 0 0 34 50 0 h .414 g 2615 1566 N -50 0 0 34 50 0 h .4195 g 2615 1600 N -50 0 0 33 50 0 h .4249 g 2615 1633 N -50 0 0 34 50 0 h .4303 g 2615 1667 N -50 0 0 33 50 0 h .4358 g 2615 1700 N -50 0 0 34 50 0 h .4412 g 2615 1734 N -50 0 0 34 50 0 h .4466 g 2615 1768 N -50 0 0 33 50 0 h .4521 g 2615 1801 N -50 0 0 34 50 0 h .4575 g 2615 1835 N -50 0 0 33 50 0 h .4629 g 2615 1868 N -50 0 0 34 50 0 h .4684 g 2615 1902 N -50 0 0 33 50 0 h .4738 g 2615 1935 N -50 0 0 34 50 0 h .4792 g 2615 1969 N -50 0 0 34 50 0 h .4847 g 2615 2003 N -50 0 0 33 50 0 h .4901 g 2615 2036 N -50 0 0 34 50 0 h .4955 g 2615 2070 N -50 0 0 33 50 0 h .501 g 2615 2103 N -50 0 0 34 50 0 h .5064 g 2615 2137 N -50 0 0 34 50 0 h .5118 g 2615 2171 N -50 0 0 33 50 0 h .5173 g 2615 2204 N -50 0 0 34 50 0 h .5227 g 2615 2238 N -50 0 0 33 50 0 h .5281 g 2615 2271 N -50 0 0 34 50 0 h .5336 g 2615 2305 N -50 0 0 34 50 0 h .539 g 2615 2339 N -50 0 0 33 50 0 h .5444 g 2615 2372 N -50 0 0 34 50 0 h .5499 g 2615 2406 N -50 0 0 33 50 0 h .5553 g 2615 2439 N -50 0 0 34 50 0 h .5607 g 2615 2473 N -50 0 0 34 50 0 h .5662 g 2615 2507 N -50 0 0 33 50 0 h .5716 g 2615 2540 N -50 0 0 34 50 0 h .577 g 2615 2574 N -50 0 0 32 50 0 h .5825 g 2615 2606 N -50 0 0 34 50 0 h .5879 g 2615 2640 N -50 0 0 33 50 0 h .5933 g 2615 2673 N -50 0 0 34 50 0 h .5988 g 2615 2707 N -50 0 0 34 50 0 h .6042 g 2615 2741 N -50 0 0 33 50 0 h .6096 g 2615 2774 N -50 0 0 34 50 0 h .6151 g 2615 2808 N -50 0 0 33 50 0 h .6205 g 2615 2841 N -50 0 0 34 50 0 h .6259 g 2615 2875 N -50 0 0 34 50 0 h .6314 g 2615 2909 N -50 0 0 33 50 0 h .6368 g 2615 2942 N -50 0 0 34 50 0 h .6422 g 2615 2976 N -50 0 0 33 50 0 h .6477 g 2615 3009 N -50 0 0 34 50 0 h .6531 g 2615 3043 N -50 0 0 34 50 0 h .6585 g 2615 3077 N -50 0 0 33 50 0 h .664 g 2615 3110 N -50 0 0 34 50 0 h .6694 g 2615 3144 N -50 0 0 33 50 0 h .6748 g 2615 3177 N -50 0 0 34 50 0 h .6802 g 2615 3211 N -50 0 0 34 50 0 h .6857 g 2615 3245 N -50 0 0 33 50 0 h .6911 g 2615 3278 N -50 0 0 34 50 0 h .6965 g 2615 3312 N -50 0 0 33 50 0 h .702 g 2615 3345 N -50 0 0 34 50 0 h .7074 g 2615 3379 N -50 0 0 33 50 0 h .7128 g 2615 3412 N -50 0 0 34 50 0 h .7183 g 2615 3446 N -50 0 0 34 50 0 h .7237 g 2615 3480 N -50 0 0 33 50 0 h .7291 g 2615 3513 N -50 0 0 34 50 0 h .7346 g 2615 3547 N -50 0 0 33 50 0 h .74 g 2615 3580 N -50 0 0 34 50 0 h .7454 g 2615 3614 N -50 0 0 34 50 0 h .7509 g 2615 3648 N -50 0 0 33 50 0 h .7563 g 2615 3681 N -50 0 0 34 50 0 h .7617 g 2615 3715 N -50 0 0 33 50 0 h .7672 g 2615 3748 N -50 0 0 34 50 0 h .7726 g 2615 3782 N -50 0 0 34 50 0 h .778 g 2615 3816 N -50 0 0 33 50 0 h .7835 g 2615 3849 N -50 0 0 34 50 0 h .7889 g 2615 3883 N -50 0 0 33 50 0 h .7943 g 2615 3916 N -50 0 0 34 50 0 h .7998 g 2615 3950 N -50 0 0 33 50 0 h .8052 g 2615 3983 N -50 0 0 34 50 0 h .8106 g 2615 4017 N -50 0 0 34 50 0 h .8161 g 2615 4051 N -50 0 0 33 50 0 h .8215 g 2615 4084 N -50 0 0 34 50 0 h .8269 g 2615 4118 N -50 0 0 33 50 0 h .8324 g 2615 4151 N -50 0 0 34 50 0 h .8378 g 2615 4185 N -50 0 0 34 50 0 h .8432 g 2615 4219 N -50 0 0 33 50 0 h .3208 g 2665 928 N -51 0 0 33 51 0 h .3261 g 2665 961 N -51 0 0 34 51 0 h .3314 g 2665 995 N -51 0 0 34 51 0 h .3367 g 2665 1029 N -51 0 0 33 51 0 h .3419 g 2665 1062 N -51 0 0 34 51 0 h .3472 g 2665 1096 N -51 0 0 33 51 0 h .3525 g 2665 1129 N -51 0 0 34 51 0 h .3578 g 2665 1163 N -51 0 0 34 51 0 h .3631 g 2665 1197 N -51 0 0 33 51 0 h .3683 g 2665 1230 N -51 0 0 34 51 0 h .3736 g 2665 1264 N -51 0 0 33 51 0 h .3789 g 2665 1297 N -51 0 0 34 51 0 h .3842 g 2665 1331 N -51 0 0 33 51 0 h .3895 g 2665 1364 N -51 0 0 34 51 0 h .3947 g 2665 1398 N -51 0 0 34 51 0 h .4 g 2665 1432 N -51 0 0 33 51 0 h .4053 g 2665 1465 N -51 0 0 34 51 0 h .4106 g 2665 1499 N -51 0 0 33 51 0 h .4159 g 2665 1532 N -51 0 0 34 51 0 h .4211 g 2665 1566 N -51 0 0 34 51 0 h .4264 g 2665 1600 N -51 0 0 33 51 0 h .4317 g 2665 1633 N -51 0 0 34 51 0 h .437 g 2665 1667 N -51 0 0 33 51 0 h .4423 g 2665 1700 N -51 0 0 34 51 0 h .4475 g 2665 1734 N -51 0 0 34 51 0 h .4528 g 2665 1768 N -51 0 0 33 51 0 h .4581 g 2665 1801 N -51 0 0 34 51 0 h .4634 g 2665 1835 N -51 0 0 33 51 0 h .4687 g 2665 1868 N -51 0 0 34 51 0 h .4739 g 2665 1902 N -51 0 0 33 51 0 h .4792 g 2665 1935 N -51 0 0 34 51 0 h .4845 g 2665 1969 N -51 0 0 34 51 0 h .4898 g 2665 2003 N -51 0 0 33 51 0 h .4951 g 2665 2036 N -51 0 0 34 51 0 h .5003 g 2665 2070 N -51 0 0 33 51 0 h .5056 g 2665 2103 N -51 0 0 34 51 0 h .5109 g 2665 2137 N -51 0 0 34 51 0 h .5162 g 2665 2171 N -51 0 0 33 51 0 h .5215 g 2665 2204 N -51 0 0 34 51 0 h .5267 g 2665 2238 N -51 0 0 33 51 0 h .532 g 2665 2271 N -51 0 0 34 51 0 h .5373 g 2665 2305 N -51 0 0 34 51 0 h .5426 g 2665 2339 N -51 0 0 33 51 0 h .5479 g 2665 2372 N -51 0 0 34 51 0 h .5531 g 2665 2406 N -51 0 0 33 51 0 h .5584 g 2665 2439 N -51 0 0 34 51 0 h .5637 g 2665 2473 N -51 0 0 34 51 0 h .569 g 2665 2507 N -51 0 0 33 51 0 h .5743 g 2665 2540 N -51 0 0 34 51 0 h .5795 g 2665 2574 N -51 0 0 32 51 0 h .5848 g 2665 2606 N -51 0 0 34 51 0 h .5901 g 2665 2640 N -51 0 0 33 51 0 h .5954 g 2665 2673 N -51 0 0 34 51 0 h .6007 g 2665 2707 N -51 0 0 34 51 0 h .6059 g 2665 2741 N -51 0 0 33 51 0 h .6112 g 2665 2774 N -51 0 0 34 51 0 h .6165 g 2665 2808 N -51 0 0 33 51 0 h .6218 g 2665 2841 N -51 0 0 34 51 0 h .6271 g 2665 2875 N -51 0 0 34 51 0 h .6323 g 2665 2909 N -51 0 0 33 51 0 h .6376 g 2665 2942 N -51 0 0 34 51 0 h .6429 g 2665 2976 N -51 0 0 33 51 0 h .6482 g 2665 3009 N -51 0 0 34 51 0 h .6535 g 2665 3043 N -51 0 0 34 51 0 h .6587 g 2665 3077 N -51 0 0 33 51 0 h .664 g 2665 3110 N -51 0 0 34 51 0 h .6693 g 2665 3144 N -51 0 0 33 51 0 h .6746 g 2665 3177 N -51 0 0 34 51 0 h .6799 g 2665 3211 N -51 0 0 34 51 0 h .6851 g 2665 3245 N -51 0 0 33 51 0 h .6904 g 2665 3278 N -51 0 0 34 51 0 h .6957 g 2665 3312 N -51 0 0 33 51 0 h .701 g 2665 3345 N -51 0 0 34 51 0 h .7063 g 2665 3379 N -51 0 0 33 51 0 h .7115 g 2665 3412 N -51 0 0 34 51 0 h .7168 g 2665 3446 N -51 0 0 34 51 0 h .7221 g 2665 3480 N -51 0 0 33 51 0 h .7274 g 2665 3513 N -51 0 0 34 51 0 h .7327 g 2665 3547 N -51 0 0 33 51 0 h .7379 g 2665 3580 N -51 0 0 34 51 0 h .7432 g 2665 3614 N -51 0 0 34 51 0 h .7485 g 2665 3648 N -51 0 0 33 51 0 h .7538 g 2665 3681 N -51 0 0 34 51 0 h .7591 g 2665 3715 N -51 0 0 33 51 0 h .7643 g 2665 3748 N -51 0 0 34 51 0 h .7696 g 2665 3782 N -51 0 0 34 51 0 h .7749 g 2665 3816 N -51 0 0 33 51 0 h .7802 g 2665 3849 N -51 0 0 34 51 0 h .7855 g 2665 3883 N -51 0 0 33 51 0 h .7907 g 2665 3916 N -51 0 0 34 51 0 h .796 g 2665 3950 N -51 0 0 33 51 0 h .8013 g 2665 3983 N -51 0 0 34 51 0 h .8066 g 2665 4017 N -51 0 0 34 51 0 h .8119 g 2665 4051 N -51 0 0 33 51 0 h .8171 g 2665 4084 N -51 0 0 34 51 0 h .8224 g 2665 4118 N -51 0 0 33 51 0 h .8277 g 2665 4151 N -51 0 0 34 51 0 h .833 g 2665 4185 N -51 0 0 34 51 0 h .8383 g 2665 4219 N -51 0 0 33 51 0 h .3308 g 2716 928 N -50 0 0 33 50 0 h .336 g 2716 961 N -50 0 0 34 50 0 h .3411 g 2716 995 N -50 0 0 34 50 0 h .3462 g 2716 1029 N -50 0 0 33 50 0 h .3514 g 2716 1062 N -50 0 0 34 50 0 h .3565 g 2716 1096 N -50 0 0 33 50 0 h .3616 g 2716 1129 N -50 0 0 34 50 0 h .3667 g 2716 1163 N -50 0 0 34 50 0 h .3719 g 2716 1197 N -50 0 0 33 50 0 h .377 g 2716 1230 N -50 0 0 34 50 0 h .3821 g 2716 1264 N -50 0 0 33 50 0 h .3872 g 2716 1297 N -50 0 0 34 50 0 h .3924 g 2716 1331 N -50 0 0 33 50 0 h .3975 g 2716 1364 N -50 0 0 34 50 0 h .4026 g 2716 1398 N -50 0 0 34 50 0 h .4078 g 2716 1432 N -50 0 0 33 50 0 h .4129 g 2716 1465 N -50 0 0 34 50 0 h .418 g 2716 1499 N -50 0 0 33 50 0 h .4231 g 2716 1532 N -50 0 0 34 50 0 h .4283 g 2716 1566 N -50 0 0 34 50 0 h .4334 g 2716 1600 N -50 0 0 33 50 0 h .4385 g 2716 1633 N -50 0 0 34 50 0 h .4436 g 2716 1667 N -50 0 0 33 50 0 h .4488 g 2716 1700 N -50 0 0 34 50 0 h .4539 g 2716 1734 N -50 0 0 34 50 0 h .459 g 2716 1768 N -50 0 0 33 50 0 h .4641 g 2716 1801 N -50 0 0 34 50 0 h .4693 g 2716 1835 N -50 0 0 33 50 0 h .4744 g 2716 1868 N -50 0 0 34 50 0 h .4795 g 2716 1902 N -50 0 0 33 50 0 h .4847 g 2716 1935 N -50 0 0 34 50 0 h .4898 g 2716 1969 N -50 0 0 34 50 0 h .4949 g 2716 2003 N -50 0 0 33 50 0 h .5 g 2716 2036 N -50 0 0 34 50 0 h .5052 g 2716 2070 N -50 0 0 33 50 0 h .5103 g 2716 2103 N -50 0 0 34 50 0 h .5154 g 2716 2137 N -50 0 0 34 50 0 h .5205 g 2716 2171 N -50 0 0 33 50 0 h .5257 g 2716 2204 N -50 0 0 34 50 0 h .5308 g 2716 2238 N -50 0 0 33 50 0 h .5359 g 2716 2271 N -50 0 0 34 50 0 h .5411 g 2716 2305 N -50 0 0 34 50 0 h .5462 g 2716 2339 N -50 0 0 33 50 0 h .5513 g 2716 2372 N -50 0 0 34 50 0 h .5564 g 2716 2406 N -50 0 0 33 50 0 h .5616 g 2716 2439 N -50 0 0 34 50 0 h .5667 g 2716 2473 N -50 0 0 34 50 0 h .5718 g 2716 2507 N -50 0 0 33 50 0 h .5769 g 2716 2540 N -50 0 0 34 50 0 h .5821 g 2716 2574 N -50 0 0 32 50 0 h .5872 g 2716 2606 N -50 0 0 34 50 0 h .5923 g 2716 2640 N -50 0 0 33 50 0 h .5975 g 2716 2673 N -50 0 0 34 50 0 h .6026 g 2716 2707 N -50 0 0 34 50 0 h .6077 g 2716 2741 N -50 0 0 33 50 0 h .6128 g 2716 2774 N -50 0 0 34 50 0 h .618 g 2716 2808 N -50 0 0 33 50 0 h .6231 g 2716 2841 N -50 0 0 34 50 0 h .6282 g 2716 2875 N -50 0 0 34 50 0 h .6333 g 2716 2909 N -50 0 0 33 50 0 h .6385 g 2716 2942 N -50 0 0 34 50 0 h .6436 g 2716 2976 N -50 0 0 33 50 0 h .6487 g 2716 3009 N -50 0 0 34 50 0 h .6538 g 2716 3043 N -50 0 0 34 50 0 h .659 g 2716 3077 N -50 0 0 33 50 0 h .6641 g 2716 3110 N -50 0 0 34 50 0 h .6692 g 2716 3144 N -50 0 0 33 50 0 h .6744 g 2716 3177 N -50 0 0 34 50 0 h .6795 g 2716 3211 N -50 0 0 34 50 0 h .6846 g 2716 3245 N -50 0 0 33 50 0 h .6897 g 2716 3278 N -50 0 0 34 50 0 h .6949 g 2716 3312 N -50 0 0 33 50 0 h .7 g 2716 3345 N -50 0 0 34 50 0 h .7051 g 2716 3379 N -50 0 0 33 50 0 h .7102 g 2716 3412 N -50 0 0 34 50 0 h .7154 g 2716 3446 N -50 0 0 34 50 0 h .7205 g 2716 3480 N -50 0 0 33 50 0 h .7256 g 2716 3513 N -50 0 0 34 50 0 h .7308 g 2716 3547 N -50 0 0 33 50 0 h .7359 g 2716 3580 N -50 0 0 34 50 0 h .741 g 2716 3614 N -50 0 0 34 50 0 h .7461 g 2716 3648 N -50 0 0 33 50 0 h .7513 g 2716 3681 N -50 0 0 34 50 0 h .7564 g 2716 3715 N -50 0 0 33 50 0 h .7615 g 2716 3748 N -50 0 0 34 50 0 h .7666 g 2716 3782 N -50 0 0 34 50 0 h .7718 g 2716 3816 N -50 0 0 33 50 0 h .7769 g 2716 3849 N -50 0 0 34 50 0 h .782 g 2716 3883 N -50 0 0 33 50 0 h .7872 g 2716 3916 N -50 0 0 34 50 0 h .7923 g 2716 3950 N -50 0 0 33 50 0 h .7974 g 2716 3983 N -50 0 0 34 50 0 h .8025 g 2716 4017 N -50 0 0 34 50 0 h .8077 g 2716 4051 N -50 0 0 33 50 0 h .8128 g 2716 4084 N -50 0 0 34 50 0 h .8179 g 2716 4118 N -50 0 0 33 50 0 h .823 g 2716 4151 N -50 0 0 34 50 0 h .8282 g 2716 4185 N -50 0 0 34 50 0 h .8333 g 2716 4219 N -50 0 0 33 50 0 h .3409 g 2766 928 N -51 0 0 33 51 0 h .3458 g 2766 961 N -51 0 0 34 51 0 h .3508 g 2766 995 N -51 0 0 34 51 0 h .3558 g 2766 1029 N -51 0 0 33 51 0 h .3608 g 2766 1062 N -51 0 0 34 51 0 h .3657 g 2766 1096 N -51 0 0 33 51 0 h .3707 g 2766 1129 N -51 0 0 34 51 0 h .3757 g 2766 1163 N -51 0 0 34 51 0 h .3807 g 2766 1197 N -51 0 0 33 51 0 h .3856 g 2766 1230 N -51 0 0 34 51 0 h .3906 g 2766 1264 N -51 0 0 33 51 0 h .3956 g 2766 1297 N -51 0 0 34 51 0 h .4006 g 2766 1331 N -51 0 0 33 51 0 h .4055 g 2766 1364 N -51 0 0 34 51 0 h .4105 g 2766 1398 N -51 0 0 34 51 0 h .4155 g 2766 1432 N -51 0 0 33 51 0 h .4205 g 2766 1465 N -51 0 0 34 51 0 h .4254 g 2766 1499 N -51 0 0 33 51 0 h .4304 g 2766 1532 N -51 0 0 34 51 0 h .4354 g 2766 1566 N -51 0 0 34 51 0 h .4404 g 2766 1600 N -51 0 0 33 51 0 h .4453 g 2766 1633 N -51 0 0 34 51 0 h .4503 g 2766 1667 N -51 0 0 33 51 0 h .4553 g 2766 1700 N -51 0 0 34 51 0 h .4602 g 2766 1734 N -51 0 0 34 51 0 h .4652 g 2766 1768 N -51 0 0 33 51 0 h .4702 g 2766 1801 N -51 0 0 34 51 0 h .4752 g 2766 1835 N -51 0 0 33 51 0 h .4801 g 2766 1868 N -51 0 0 34 51 0 h .4851 g 2766 1902 N -51 0 0 33 51 0 h .4901 g 2766 1935 N -51 0 0 34 51 0 h .4951 g 2766 1969 N -51 0 0 34 51 0 h .5 g 2766 2003 N -51 0 0 33 51 0 h .505 g 2766 2036 N -51 0 0 34 51 0 h .51 g 2766 2070 N -51 0 0 33 51 0 h .515 g 2766 2103 N -51 0 0 34 51 0 h .5199 g 2766 2137 N -51 0 0 34 51 0 h .5249 g 2766 2171 N -51 0 0 33 51 0 h .5299 g 2766 2204 N -51 0 0 34 51 0 h .5349 g 2766 2238 N -51 0 0 33 51 0 h .5398 g 2766 2271 N -51 0 0 34 51 0 h .5448 g 2766 2305 N -51 0 0 34 51 0 h .5498 g 2766 2339 N -51 0 0 33 51 0 h .5548 g 2766 2372 N -51 0 0 34 51 0 h .5597 g 2766 2406 N -51 0 0 33 51 0 h .5647 g 2766 2439 N -51 0 0 34 51 0 h .5697 g 2766 2473 N -51 0 0 34 51 0 h .5746 g 2766 2507 N -51 0 0 33 51 0 h .5796 g 2766 2540 N -51 0 0 34 51 0 h .5846 g 2766 2574 N -51 0 0 32 51 0 h .5896 g 2766 2606 N -51 0 0 34 51 0 h .5945 g 2766 2640 N -51 0 0 33 51 0 h .5995 g 2766 2673 N -51 0 0 34 51 0 h .6045 g 2766 2707 N -51 0 0 34 51 0 h .6095 g 2766 2741 N -51 0 0 33 51 0 h .6144 g 2766 2774 N -51 0 0 34 51 0 h .6194 g 2766 2808 N -51 0 0 33 51 0 h .6244 g 2766 2841 N -51 0 0 34 51 0 h .6294 g 2766 2875 N -51 0 0 34 51 0 h .6343 g 2766 2909 N -51 0 0 33 51 0 h .6393 g 2766 2942 N -51 0 0 34 51 0 h .6443 g 2766 2976 N -51 0 0 33 51 0 h .6493 g 2766 3009 N -51 0 0 34 51 0 h .6542 g 2766 3043 N -51 0 0 34 51 0 h .6592 g 2766 3077 N -51 0 0 33 51 0 h .6642 g 2766 3110 N -51 0 0 34 51 0 h .6692 g 2766 3144 N -51 0 0 33 51 0 h .6741 g 2766 3177 N -51 0 0 34 51 0 h .6791 g 2766 3211 N -51 0 0 34 51 0 h .6841 g 2766 3245 N -51 0 0 33 51 0 h .689 g 2766 3278 N -51 0 0 34 51 0 h .694 g 2766 3312 N -51 0 0 33 51 0 h .699 g 2766 3345 N -51 0 0 34 51 0 h .704 g 2766 3379 N -51 0 0 33 51 0 h .7089 g 2766 3412 N -51 0 0 34 51 0 h .7139 g 2766 3446 N -51 0 0 34 51 0 h .7189 g 2766 3480 N -51 0 0 33 51 0 h .7239 g 2766 3513 N -51 0 0 34 51 0 h .7288 g 2766 3547 N -51 0 0 33 51 0 h .7338 g 2766 3580 N -51 0 0 34 51 0 h .7388 g 2766 3614 N -51 0 0 34 51 0 h .7438 g 2766 3648 N -51 0 0 33 51 0 h .7487 g 2766 3681 N -51 0 0 34 51 0 h .7537 g 2766 3715 N -51 0 0 33 51 0 h .7587 g 2766 3748 N -51 0 0 34 51 0 h .7637 g 2766 3782 N -51 0 0 34 51 0 h .7686 g 2766 3816 N -51 0 0 33 51 0 h .7736 g 2766 3849 N -51 0 0 34 51 0 h .7786 g 2766 3883 N -51 0 0 33 51 0 h .7836 g 2766 3916 N -51 0 0 34 51 0 h .7885 g 2766 3950 N -51 0 0 33 51 0 h .7935 g 2766 3983 N -51 0 0 34 51 0 h .7985 g 2766 4017 N -51 0 0 34 51 0 h .8035 g 2766 4051 N -51 0 0 33 51 0 h .8084 g 2766 4084 N -51 0 0 34 51 0 h .8134 g 2766 4118 N -51 0 0 33 51 0 h .8184 g 2766 4151 N -51 0 0 34 51 0 h .8233 g 2766 4185 N -51 0 0 34 51 0 h .8283 g 2766 4219 N -51 0 0 33 51 0 h .3509 g 2817 928 N -50 0 0 33 50 0 h .3557 g 2817 961 N -50 0 0 34 50 0 h .3605 g 2817 995 N -50 0 0 34 50 0 h .3654 g 2817 1029 N -50 0 0 33 50 0 h .3702 g 2817 1062 N -50 0 0 34 50 0 h .375 g 2817 1096 N -50 0 0 33 50 0 h .3798 g 2817 1129 N -50 0 0 34 50 0 h .3846 g 2817 1163 N -50 0 0 34 50 0 h .3895 g 2817 1197 N -50 0 0 33 50 0 h .3943 g 2817 1230 N -50 0 0 34 50 0 h .3991 g 2817 1264 N -50 0 0 33 50 0 h .4039 g 2817 1297 N -50 0 0 34 50 0 h .4087 g 2817 1331 N -50 0 0 33 50 0 h .4136 g 2817 1364 N -50 0 0 34 50 0 h .4184 g 2817 1398 N -50 0 0 34 50 0 h .4232 g 2817 1432 N -50 0 0 33 50 0 h .428 g 2817 1465 N -50 0 0 34 50 0 h .4329 g 2817 1499 N -50 0 0 33 50 0 h .4377 g 2817 1532 N -50 0 0 34 50 0 h .4425 g 2817 1566 N -50 0 0 34 50 0 h .4473 g 2817 1600 N -50 0 0 33 50 0 h .4521 g 2817 1633 N -50 0 0 34 50 0 h .457 g 2817 1667 N -50 0 0 33 50 0 h .4618 g 2817 1700 N -50 0 0 34 50 0 h .4666 g 2817 1734 N -50 0 0 34 50 0 h .4714 g 2817 1768 N -50 0 0 33 50 0 h .4762 g 2817 1801 N -50 0 0 34 50 0 h .4811 g 2817 1835 N -50 0 0 33 50 0 h .4859 g 2817 1868 N -50 0 0 34 50 0 h .4907 g 2817 1902 N -50 0 0 33 50 0 h .4955 g 2817 1935 N -50 0 0 34 50 0 h .5003 g 2817 1969 N -50 0 0 34 50 0 h .5052 g 2817 2003 N -50 0 0 33 50 0 h .51 g 2817 2036 N -50 0 0 34 50 0 h .5148 g 2817 2070 N -50 0 0 33 50 0 h .5196 g 2817 2103 N -50 0 0 34 50 0 h .5244 g 2817 2137 N -50 0 0 34 50 0 h .5293 g 2817 2171 N -50 0 0 33 50 0 h .5341 g 2817 2204 N -50 0 0 34 50 0 h .5389 g 2817 2238 N -50 0 0 33 50 0 h .5437 g 2817 2271 N -50 0 0 34 50 0 h .5486 g 2817 2305 N -50 0 0 34 50 0 h .5534 g 2817 2339 N -50 0 0 33 50 0 h .5582 g 2817 2372 N -50 0 0 34 50 0 h .563 g 2817 2406 N -50 0 0 33 50 0 h .5678 g 2817 2439 N -50 0 0 34 50 0 h .5727 g 2817 2473 N -50 0 0 34 50 0 h .5775 g 2817 2507 N -50 0 0 33 50 0 h .5823 g 2817 2540 N -50 0 0 34 50 0 h .5871 g 2817 2574 N -50 0 0 32 50 0 h .5919 g 2817 2606 N -50 0 0 34 50 0 h .5968 g 2817 2640 N -50 0 0 33 50 0 h .6016 g 2817 2673 N -50 0 0 34 50 0 h .6064 g 2817 2707 N -50 0 0 34 50 0 h .6112 g 2817 2741 N -50 0 0 33 50 0 h .616 g 2817 2774 N -50 0 0 34 50 0 h .6209 g 2817 2808 N -50 0 0 33 50 0 h .6257 g 2817 2841 N -50 0 0 34 50 0 h .6305 g 2817 2875 N -50 0 0 34 50 0 h .6353 g 2817 2909 N -50 0 0 33 50 0 h .6402 g 2817 2942 N -50 0 0 34 50 0 h .645 g 2817 2976 N -50 0 0 33 50 0 h .6498 g 2817 3009 N -50 0 0 34 50 0 h .6546 g 2817 3043 N -50 0 0 34 50 0 h .6594 g 2817 3077 N -50 0 0 33 50 0 h .6643 g 2817 3110 N -50 0 0 34 50 0 h .6691 g 2817 3144 N -50 0 0 33 50 0 h .6739 g 2817 3177 N -50 0 0 34 50 0 h .6787 g 2817 3211 N -50 0 0 34 50 0 h .6835 g 2817 3245 N -50 0 0 33 50 0 h .6884 g 2817 3278 N -50 0 0 34 50 0 h .6932 g 2817 3312 N -50 0 0 33 50 0 h .698 g 2817 3345 N -50 0 0 34 50 0 h .7028 g 2817 3379 N -50 0 0 33 50 0 h .7076 g 2817 3412 N -50 0 0 34 50 0 h .7125 g 2817 3446 N -50 0 0 34 50 0 h .7173 g 2817 3480 N -50 0 0 33 50 0 h .7221 g 2817 3513 N -50 0 0 34 50 0 h .7269 g 2817 3547 N -50 0 0 33 50 0 h .7317 g 2817 3580 N -50 0 0 34 50 0 h .7366 g 2817 3614 N -50 0 0 34 50 0 h .7414 g 2817 3648 N -50 0 0 33 50 0 h .7462 g 2817 3681 N -50 0 0 34 50 0 h .751 g 2817 3715 N -50 0 0 33 50 0 h .7559 g 2817 3748 N -50 0 0 34 50 0 h .7607 g 2817 3782 N -50 0 0 34 50 0 h .7655 g 2817 3816 N -50 0 0 33 50 0 h .7703 g 2817 3849 N -50 0 0 34 50 0 h .7751 g 2817 3883 N -50 0 0 33 50 0 h .78 g 2817 3916 N -50 0 0 34 50 0 h .7848 g 2817 3950 N -50 0 0 33 50 0 h .7896 g 2817 3983 N -50 0 0 34 50 0 h .7944 g 2817 4017 N -50 0 0 34 50 0 h .7992 g 2817 4051 N -50 0 0 33 50 0 h .8041 g 2817 4084 N -50 0 0 34 50 0 h .8089 g 2817 4118 N -50 0 0 33 50 0 h .8137 g 2817 4151 N -50 0 0 34 50 0 h .8185 g 2817 4185 N -50 0 0 34 50 0 h .8233 g 2817 4219 N -50 0 0 33 50 0 h .3609 g 2867 928 N -51 0 0 33 51 0 h .3656 g 2867 961 N -51 0 0 34 51 0 h .3703 g 2867 995 N -51 0 0 34 51 0 h .3749 g 2867 1029 N -51 0 0 33 51 0 h .3796 g 2867 1062 N -51 0 0 34 51 0 h .3843 g 2867 1096 N -51 0 0 33 51 0 h .3889 g 2867 1129 N -51 0 0 34 51 0 h .3936 g 2867 1163 N -51 0 0 34 51 0 h .3983 g 2867 1197 N -51 0 0 33 51 0 h .4029 g 2867 1230 N -51 0 0 34 51 0 h .4076 g 2867 1264 N -51 0 0 33 51 0 h .4123 g 2867 1297 N -51 0 0 34 51 0 h .4169 g 2867 1331 N -51 0 0 33 51 0 h .4216 g 2867 1364 N -51 0 0 34 51 0 h .4263 g 2867 1398 N -51 0 0 34 51 0 h .4309 g 2867 1432 N -51 0 0 33 51 0 h .4356 g 2867 1465 N -51 0 0 34 51 0 h .4403 g 2867 1499 N -51 0 0 33 51 0 h .4449 g 2867 1532 N -51 0 0 34 51 0 h .4496 g 2867 1566 N -51 0 0 34 51 0 h .4543 g 2867 1600 N -51 0 0 33 51 0 h .4589 g 2867 1633 N -51 0 0 34 51 0 h .4636 g 2867 1667 N -51 0 0 33 51 0 h .4683 g 2867 1700 N -51 0 0 34 51 0 h .4729 g 2867 1734 N -51 0 0 34 51 0 h .4776 g 2867 1768 N -51 0 0 33 51 0 h .4823 g 2867 1801 N -51 0 0 34 51 0 h .487 g 2867 1835 N -51 0 0 33 51 0 h .4916 g 2867 1868 N -51 0 0 34 51 0 h .4963 g 2867 1902 N -51 0 0 33 51 0 h .501 g 2867 1935 N -51 0 0 34 51 0 h .5056 g 2867 1969 N -51 0 0 34 51 0 h .5103 g 2867 2003 N -51 0 0 33 51 0 h .515 g 2867 2036 N -51 0 0 34 51 0 h .5196 g 2867 2070 N -51 0 0 33 51 0 h .5243 g 2867 2103 N -51 0 0 34 51 0 h .529 g 2867 2137 N -51 0 0 34 51 0 h .5336 g 2867 2171 N -51 0 0 33 51 0 h .5383 g 2867 2204 N -51 0 0 34 51 0 h .543 g 2867 2238 N -51 0 0 33 51 0 h .5476 g 2867 2271 N -51 0 0 34 51 0 h .5523 g 2867 2305 N -51 0 0 34 51 0 h .557 g 2867 2339 N -51 0 0 33 51 0 h .5616 g 2867 2372 N -51 0 0 34 51 0 h .5663 g 2867 2406 N -51 0 0 33 51 0 h .571 g 2867 2439 N -51 0 0 34 51 0 h .5756 g 2867 2473 N -51 0 0 34 51 0 h .5803 g 2867 2507 N -51 0 0 33 51 0 h .585 g 2867 2540 N -51 0 0 34 51 0 h .5896 g 2867 2574 N -51 0 0 32 51 0 h .5943 g 2867 2606 N -51 0 0 34 51 0 h .599 g 2867 2640 N -51 0 0 33 51 0 h .6037 g 2867 2673 N -51 0 0 34 51 0 h .6083 g 2867 2707 N -51 0 0 34 51 0 h .613 g 2867 2741 N -51 0 0 33 51 0 h .6177 g 2867 2774 N -51 0 0 34 51 0 h .6223 g 2867 2808 N -51 0 0 33 51 0 h .627 g 2867 2841 N -51 0 0 34 51 0 h .6317 g 2867 2875 N -51 0 0 34 51 0 h .6363 g 2867 2909 N -51 0 0 33 51 0 h .641 g 2867 2942 N -51 0 0 34 51 0 h .6457 g 2867 2976 N -51 0 0 33 51 0 h .6503 g 2867 3009 N -51 0 0 34 51 0 h .655 g 2867 3043 N -51 0 0 34 51 0 h .6597 g 2867 3077 N -51 0 0 33 51 0 h .6643 g 2867 3110 N -51 0 0 34 51 0 h .669 g 2867 3144 N -51 0 0 33 51 0 h .6737 g 2867 3177 N -51 0 0 34 51 0 h .6783 g 2867 3211 N -51 0 0 34 51 0 h .683 g 2867 3245 N -51 0 0 33 51 0 h .6877 g 2867 3278 N -51 0 0 34 51 0 h .6923 g 2867 3312 N -51 0 0 33 51 0 h .697 g 2867 3345 N -51 0 0 34 51 0 h .7017 g 2867 3379 N -51 0 0 33 51 0 h .7063 g 2867 3412 N -51 0 0 34 51 0 h .711 g 2867 3446 N -51 0 0 34 51 0 h .7157 g 2867 3480 N -51 0 0 33 51 0 h .7203 g 2867 3513 N -51 0 0 34 51 0 h .725 g 2867 3547 N -51 0 0 33 51 0 h .7297 g 2867 3580 N -51 0 0 34 51 0 h .7344 g 2867 3614 N -51 0 0 34 51 0 h .739 g 2867 3648 N -51 0 0 33 51 0 h .7437 g 2867 3681 N -51 0 0 34 51 0 h .7484 g 2867 3715 N -51 0 0 33 51 0 h .753 g 2867 3748 N -51 0 0 34 51 0 h .7577 g 2867 3782 N -51 0 0 34 51 0 h .7624 g 2867 3816 N -51 0 0 33 51 0 h .767 g 2867 3849 N -51 0 0 34 51 0 h .7717 g 2867 3883 N -51 0 0 33 51 0 h .7764 g 2867 3916 N -51 0 0 34 51 0 h .781 g 2867 3950 N -51 0 0 33 51 0 h .7857 g 2867 3983 N -51 0 0 34 51 0 h .7904 g 2867 4017 N -51 0 0 34 51 0 h .795 g 2867 4051 N -51 0 0 33 51 0 h .7997 g 2867 4084 N -51 0 0 34 51 0 h .8044 g 2867 4118 N -51 0 0 33 51 0 h .809 g 2867 4151 N -51 0 0 34 51 0 h .8137 g 2867 4185 N -51 0 0 34 51 0 h .8184 g 2867 4219 N -51 0 0 33 51 0 h .3709 g 2918 928 N -51 0 0 33 51 0 h .3755 g 2918 961 N -51 0 0 34 51 0 h .38 g 2918 995 N -51 0 0 34 51 0 h .3845 g 2918 1029 N -51 0 0 33 51 0 h .389 g 2918 1062 N -51 0 0 34 51 0 h .3935 g 2918 1096 N -51 0 0 33 51 0 h .398 g 2918 1129 N -51 0 0 34 51 0 h .4025 g 2918 1163 N -51 0 0 34 51 0 h .4071 g 2918 1197 N -51 0 0 33 51 0 h .4116 g 2918 1230 N -51 0 0 34 51 0 h .4161 g 2918 1264 N -51 0 0 33 51 0 h .4206 g 2918 1297 N -51 0 0 34 51 0 h .4251 g 2918 1331 N -51 0 0 33 51 0 h .4296 g 2918 1364 N -51 0 0 34 51 0 h .4342 g 2918 1398 N -51 0 0 34 51 0 h .4387 g 2918 1432 N -51 0 0 33 51 0 h .4432 g 2918 1465 N -51 0 0 34 51 0 h .4477 g 2918 1499 N -51 0 0 33 51 0 h .4522 g 2918 1532 N -51 0 0 34 51 0 h .4567 g 2918 1566 N -51 0 0 34 51 0 h .4612 g 2918 1600 N -51 0 0 33 51 0 h .4658 g 2918 1633 N -51 0 0 34 51 0 h .4703 g 2918 1667 N -51 0 0 33 51 0 h .4748 g 2918 1700 N -51 0 0 34 51 0 h .4793 g 2918 1734 N -51 0 0 34 51 0 h .4838 g 2918 1768 N -51 0 0 33 51 0 h .4883 g 2918 1801 N -51 0 0 34 51 0 h .4928 g 2918 1835 N -51 0 0 33 51 0 h .4974 g 2918 1868 N -51 0 0 34 51 0 h .5019 g 2918 1902 N -51 0 0 33 51 0 h .5064 g 2918 1935 N -51 0 0 34 51 0 h .5109 g 2918 1969 N -51 0 0 34 51 0 h .5154 g 2918 2003 N -51 0 0 33 51 0 h .5199 g 2918 2036 N -51 0 0 34 51 0 h .5244 g 2918 2070 N -51 0 0 33 51 0 h .529 g 2918 2103 N -51 0 0 34 51 0 h .5335 g 2918 2137 N -51 0 0 34 51 0 h .538 g 2918 2171 N -51 0 0 33 51 0 h .5425 g 2918 2204 N -51 0 0 34 51 0 h .547 g 2918 2238 N -51 0 0 33 51 0 h .5515 g 2918 2271 N -51 0 0 34 51 0 h .5561 g 2918 2305 N -51 0 0 34 51 0 h .5606 g 2918 2339 N -51 0 0 33 51 0 h .5651 g 2918 2372 N -51 0 0 34 51 0 h .5696 g 2918 2406 N -51 0 0 33 51 0 h .5741 g 2918 2439 N -51 0 0 34 51 0 h .5786 g 2918 2473 N -51 0 0 34 51 0 h .5831 g 2918 2507 N -51 0 0 33 51 0 h .5877 g 2918 2540 N -51 0 0 34 51 0 h .5922 g 2918 2574 N -51 0 0 32 51 0 h .5967 g 2918 2606 N -51 0 0 34 51 0 h .6012 g 2918 2640 N -51 0 0 33 51 0 h .6057 g 2918 2673 N -51 0 0 34 51 0 h .6102 g 2918 2707 N -51 0 0 34 51 0 h .6147 g 2918 2741 N -51 0 0 33 51 0 h .6193 g 2918 2774 N -51 0 0 34 51 0 h .6238 g 2918 2808 N -51 0 0 33 51 0 h .6283 g 2918 2841 N -51 0 0 34 51 0 h .6328 g 2918 2875 N -51 0 0 34 51 0 h .6373 g 2918 2909 N -51 0 0 33 51 0 h .6418 g 2918 2942 N -51 0 0 34 51 0 h .6463 g 2918 2976 N -51 0 0 33 51 0 h .6509 g 2918 3009 N -51 0 0 34 51 0 h .6554 g 2918 3043 N -51 0 0 34 51 0 h .6599 g 2918 3077 N -51 0 0 33 51 0 h .6644 g 2918 3110 N -51 0 0 34 51 0 h .6689 g 2918 3144 N -51 0 0 33 51 0 h .6734 g 2918 3177 N -51 0 0 34 51 0 h .678 g 2918 3211 N -51 0 0 34 51 0 h .6825 g 2918 3245 N -51 0 0 33 51 0 h .687 g 2918 3278 N -51 0 0 34 51 0 h .6915 g 2918 3312 N -51 0 0 33 51 0 h .696 g 2918 3345 N -51 0 0 34 51 0 h .7005 g 2918 3379 N -51 0 0 33 51 0 h .705 g 2918 3412 N -51 0 0 34 51 0 h .7096 g 2918 3446 N -51 0 0 34 51 0 h .7141 g 2918 3480 N -51 0 0 33 51 0 h .7186 g 2918 3513 N -51 0 0 34 51 0 h .7231 g 2918 3547 N -51 0 0 33 51 0 h .7276 g 2918 3580 N -51 0 0 34 51 0 h .7321 g 2918 3614 N -51 0 0 34 51 0 h .7366 g 2918 3648 N -51 0 0 33 51 0 h .7412 g 2918 3681 N -51 0 0 34 51 0 h .7457 g 2918 3715 N -51 0 0 33 51 0 h .7502 g 2918 3748 N -51 0 0 34 51 0 h .7547 g 2918 3782 N -51 0 0 34 51 0 h .7592 g 2918 3816 N -51 0 0 33 51 0 h .7637 g 2918 3849 N -51 0 0 34 51 0 h .7683 g 2918 3883 N -51 0 0 33 51 0 h .7728 g 2918 3916 N -51 0 0 34 51 0 h .7773 g 2918 3950 N -51 0 0 33 51 0 h .7818 g 2918 3983 N -51 0 0 34 51 0 h .7863 g 2918 4017 N -51 0 0 34 51 0 h .7908 g 2918 4051 N -51 0 0 33 51 0 h .7953 g 2918 4084 N -51 0 0 34 51 0 h .7999 g 2918 4118 N -51 0 0 33 51 0 h .8044 g 2918 4151 N -51 0 0 34 51 0 h .8089 g 2918 4185 N -51 0 0 34 51 0 h .8134 g 2918 4219 N -51 0 0 33 51 0 h .381 g 2969 928 N -50 0 0 33 50 0 h .3853 g 2969 961 N -50 0 0 34 50 0 h .3897 g 2969 995 N -50 0 0 34 50 0 h .3941 g 2969 1029 N -50 0 0 33 50 0 h .3984 g 2969 1062 N -50 0 0 34 50 0 h .4028 g 2969 1096 N -50 0 0 33 50 0 h .4071 g 2969 1129 N -50 0 0 34 50 0 h .4115 g 2969 1163 N -50 0 0 34 50 0 h .4159 g 2969 1197 N -50 0 0 33 50 0 h .4202 g 2969 1230 N -50 0 0 34 50 0 h .4246 g 2969 1264 N -50 0 0 33 50 0 h .4289 g 2969 1297 N -50 0 0 34 50 0 h .4333 g 2969 1331 N -50 0 0 33 50 0 h .4377 g 2969 1364 N -50 0 0 34 50 0 h .442 g 2969 1398 N -50 0 0 34 50 0 h .4464 g 2969 1432 N -50 0 0 33 50 0 h .4508 g 2969 1465 N -50 0 0 34 50 0 h .4551 g 2969 1499 N -50 0 0 33 50 0 h .4595 g 2969 1532 N -50 0 0 34 50 0 h .4638 g 2969 1566 N -50 0 0 34 50 0 h .4682 g 2969 1600 N -50 0 0 33 50 0 h .4726 g 2969 1633 N -50 0 0 34 50 0 h .4769 g 2969 1667 N -50 0 0 33 50 0 h .4813 g 2969 1700 N -50 0 0 34 50 0 h .4857 g 2969 1734 N -50 0 0 34 50 0 h .49 g 2969 1768 N -50 0 0 33 50 0 h .4944 g 2969 1801 N -50 0 0 34 50 0 h .4987 g 2969 1835 N -50 0 0 33 50 0 h .5031 g 2969 1868 N -50 0 0 34 50 0 h .5075 g 2969 1902 N -50 0 0 33 50 0 h .5118 g 2969 1935 N -50 0 0 34 50 0 h .5162 g 2969 1969 N -50 0 0 34 50 0 h .5205 g 2969 2003 N -50 0 0 33 50 0 h .5249 g 2969 2036 N -50 0 0 34 50 0 h .5293 g 2969 2070 N -50 0 0 33 50 0 h .5336 g 2969 2103 N -50 0 0 34 50 0 h .538 g 2969 2137 N -50 0 0 34 50 0 h .5424 g 2969 2171 N -50 0 0 33 50 0 h .5467 g 2969 2204 N -50 0 0 34 50 0 h .5511 g 2969 2238 N -50 0 0 33 50 0 h .5554 g 2969 2271 N -50 0 0 34 50 0 h .5598 g 2969 2305 N -50 0 0 34 50 0 h .5642 g 2969 2339 N -50 0 0 33 50 0 h .5685 g 2969 2372 N -50 0 0 34 50 0 h .5729 g 2969 2406 N -50 0 0 33 50 0 h .5772 g 2969 2439 N -50 0 0 34 50 0 h .5816 g 2969 2473 N -50 0 0 34 50 0 h .586 g 2969 2507 N -50 0 0 33 50 0 h .5903 g 2969 2540 N -50 0 0 34 50 0 h .5947 g 2969 2574 N -50 0 0 32 50 0 h .5991 g 2969 2606 N -50 0 0 34 50 0 h .6034 g 2969 2640 N -50 0 0 33 50 0 h .6078 g 2969 2673 N -50 0 0 34 50 0 h .6121 g 2969 2707 N -50 0 0 34 50 0 h .6165 g 2969 2741 N -50 0 0 33 50 0 h .6209 g 2969 2774 N -50 0 0 34 50 0 h .6252 g 2969 2808 N -50 0 0 33 50 0 h .6296 g 2969 2841 N -50 0 0 34 50 0 h .634 g 2969 2875 N -50 0 0 34 50 0 h .6383 g 2969 2909 N -50 0 0 33 50 0 h .6427 g 2969 2942 N -50 0 0 34 50 0 h .647 g 2969 2976 N -50 0 0 33 50 0 h .6514 g 2969 3009 N -50 0 0 34 50 0 h .6558 g 2969 3043 N -50 0 0 34 50 0 h .6601 g 2969 3077 N -50 0 0 33 50 0 h .6645 g 2969 3110 N -50 0 0 34 50 0 h .6688 g 2969 3144 N -50 0 0 33 50 0 h .6732 g 2969 3177 N -50 0 0 34 50 0 h .6776 g 2969 3211 N -50 0 0 34 50 0 h .6819 g 2969 3245 N -50 0 0 33 50 0 h .6863 g 2969 3278 N -50 0 0 34 50 0 h .6907 g 2969 3312 N -50 0 0 33 50 0 h .695 g 2969 3345 N -50 0 0 34 50 0 h .6994 g 2969 3379 N -50 0 0 33 50 0 h .7037 g 2969 3412 N -50 0 0 34 50 0 h .7081 g 2969 3446 N -50 0 0 34 50 0 h .7125 g 2969 3480 N -50 0 0 33 50 0 h .7168 g 2969 3513 N -50 0 0 34 50 0 h .7212 g 2969 3547 N -50 0 0 33 50 0 h .7256 g 2969 3580 N -50 0 0 34 50 0 h .7299 g 2969 3614 N -50 0 0 34 50 0 h .7343 g 2969 3648 N -50 0 0 33 50 0 h .7386 g 2969 3681 N -50 0 0 34 50 0 h .743 g 2969 3715 N -50 0 0 33 50 0 h .7474 g 2969 3748 N -50 0 0 34 50 0 h .7517 g 2969 3782 N -50 0 0 34 50 0 h .7561 g 2969 3816 N -50 0 0 33 50 0 h .7604 g 2969 3849 N -50 0 0 34 50 0 h .7648 g 2969 3883 N -50 0 0 33 50 0 h .7692 g 2969 3916 N -50 0 0 34 50 0 h .7735 g 2969 3950 N -50 0 0 33 50 0 h .7779 g 2969 3983 N -50 0 0 34 50 0 h .7823 g 2969 4017 N -50 0 0 34 50 0 h .7866 g 2969 4051 N -50 0 0 33 50 0 h .791 g 2969 4084 N -50 0 0 34 50 0 h .7953 g 2969 4118 N -50 0 0 33 50 0 h .7997 g 2969 4151 N -50 0 0 34 50 0 h .8041 g 2969 4185 N -50 0 0 34 50 0 h .8084 g 2969 4219 N -50 0 0 33 50 0 h .391 g 3019 928 N -51 0 0 33 51 0 h .3952 g 3019 961 N -51 0 0 34 51 0 h .3994 g 3019 995 N -51 0 0 34 51 0 h .4036 g 3019 1029 N -51 0 0 33 51 0 h .4078 g 3019 1062 N -51 0 0 34 51 0 h .412 g 3019 1096 N -51 0 0 33 51 0 h .4162 g 3019 1129 N -51 0 0 34 51 0 h .4205 g 3019 1163 N -51 0 0 34 51 0 h .4247 g 3019 1197 N -51 0 0 33 51 0 h .4289 g 3019 1230 N -51 0 0 34 51 0 h .4331 g 3019 1264 N -51 0 0 33 51 0 h .4373 g 3019 1297 N -51 0 0 34 51 0 h .4415 g 3019 1331 N -51 0 0 33 51 0 h .4457 g 3019 1364 N -51 0 0 34 51 0 h .4499 g 3019 1398 N -51 0 0 34 51 0 h .4541 g 3019 1432 N -51 0 0 33 51 0 h .4583 g 3019 1465 N -51 0 0 34 51 0 h .4625 g 3019 1499 N -51 0 0 33 51 0 h .4668 g 3019 1532 N -51 0 0 34 51 0 h .471 g 3019 1566 N -51 0 0 34 51 0 h .4752 g 3019 1600 N -51 0 0 33 51 0 h .4794 g 3019 1633 N -51 0 0 34 51 0 h .4836 g 3019 1667 N -51 0 0 33 51 0 h .4878 g 3019 1700 N -51 0 0 34 51 0 h .492 g 3019 1734 N -51 0 0 34 51 0 h .4962 g 3019 1768 N -51 0 0 33 51 0 h .5004 g 3019 1801 N -51 0 0 34 51 0 h .5046 g 3019 1835 N -51 0 0 33 51 0 h .5088 g 3019 1868 N -51 0 0 34 51 0 h .513 g 3019 1902 N -51 0 0 33 51 0 h .5173 g 3019 1935 N -51 0 0 34 51 0 h .5215 g 3019 1969 N -51 0 0 34 51 0 h .5257 g 3019 2003 N -51 0 0 33 51 0 h .5299 g 3019 2036 N -51 0 0 34 51 0 h .5341 g 3019 2070 N -51 0 0 33 51 0 h .5383 g 3019 2103 N -51 0 0 34 51 0 h .5425 g 3019 2137 N -51 0 0 34 51 0 h .5467 g 3019 2171 N -51 0 0 33 51 0 h .5509 g 3019 2204 N -51 0 0 34 51 0 h .5551 g 3019 2238 N -51 0 0 33 51 0 h .5593 g 3019 2271 N -51 0 0 34 51 0 h .5636 g 3019 2305 N -51 0 0 34 51 0 h .5678 g 3019 2339 N -51 0 0 33 51 0 h .572 g 3019 2372 N -51 0 0 34 51 0 h .5762 g 3019 2406 N -51 0 0 33 51 0 h .5804 g 3019 2439 N -51 0 0 34 51 0 h .5846 g 3019 2473 N -51 0 0 34 51 0 h .5888 g 3019 2507 N -51 0 0 33 51 0 h .593 g 3019 2540 N -51 0 0 34 51 0 h .5972 g 3019 2574 N -51 0 0 32 51 0 h .6014 g 3019 2606 N -51 0 0 34 51 0 h .6056 g 3019 2640 N -51 0 0 33 51 0 h .6098 g 3019 2673 N -51 0 0 34 51 0 h .6141 g 3019 2707 N -51 0 0 34 51 0 h .6183 g 3019 2741 N -51 0 0 33 51 0 h .6225 g 3019 2774 N -51 0 0 34 51 0 h .6267 g 3019 2808 N -51 0 0 33 51 0 h .6309 g 3019 2841 N -51 0 0 34 51 0 h .6351 g 3019 2875 N -51 0 0 34 51 0 h .6393 g 3019 2909 N -51 0 0 33 51 0 h .6435 g 3019 2942 N -51 0 0 34 51 0 h .6477 g 3019 2976 N -51 0 0 33 51 0 h .6519 g 3019 3009 N -51 0 0 34 51 0 h .6561 g 3019 3043 N -51 0 0 34 51 0 h .6604 g 3019 3077 N -51 0 0 33 51 0 h .6646 g 3019 3110 N -51 0 0 34 51 0 h .6688 g 3019 3144 N -51 0 0 33 51 0 h .673 g 3019 3177 N -51 0 0 34 51 0 h .6772 g 3019 3211 N -51 0 0 34 51 0 h .6814 g 3019 3245 N -51 0 0 33 51 0 h .6856 g 3019 3278 N -51 0 0 34 51 0 h .6898 g 3019 3312 N -51 0 0 33 51 0 h .694 g 3019 3345 N -51 0 0 34 51 0 h .6982 g 3019 3379 N -51 0 0 33 51 0 h .7024 g 3019 3412 N -51 0 0 34 51 0 h .7066 g 3019 3446 N -51 0 0 34 51 0 h .7109 g 3019 3480 N -51 0 0 33 51 0 h .7151 g 3019 3513 N -51 0 0 34 51 0 h .7193 g 3019 3547 N -51 0 0 33 51 0 h .7235 g 3019 3580 N -51 0 0 34 51 0 h .7277 g 3019 3614 N -51 0 0 34 51 0 h .7319 g 3019 3648 N -51 0 0 33 51 0 h .7361 g 3019 3681 N -51 0 0 34 51 0 h .7403 g 3019 3715 N -51 0 0 33 51 0 h .7445 g 3019 3748 N -51 0 0 34 51 0 h .7487 g 3019 3782 N -51 0 0 34 51 0 h .7529 g 3019 3816 N -51 0 0 33 51 0 h .7572 g 3019 3849 N -51 0 0 34 51 0 h .7614 g 3019 3883 N -51 0 0 33 51 0 h .7656 g 3019 3916 N -51 0 0 34 51 0 h .7698 g 3019 3950 N -51 0 0 33 51 0 h .774 g 3019 3983 N -51 0 0 34 51 0 h .7782 g 3019 4017 N -51 0 0 34 51 0 h .7824 g 3019 4051 N -51 0 0 33 51 0 h .7866 g 3019 4084 N -51 0 0 34 51 0 h .7908 g 3019 4118 N -51 0 0 33 51 0 h .795 g 3019 4151 N -51 0 0 34 51 0 h .7992 g 3019 4185 N -51 0 0 34 51 0 h .8035 g 3019 4219 N -51 0 0 33 51 0 h .401 g 3070 928 N -50 0 0 33 50 0 h .4051 g 3070 961 N -50 0 0 34 50 0 h .4091 g 3070 995 N -50 0 0 34 50 0 h .4132 g 3070 1029 N -50 0 0 33 50 0 h .4172 g 3070 1062 N -50 0 0 34 50 0 h .4213 g 3070 1096 N -50 0 0 33 50 0 h .4254 g 3070 1129 N -50 0 0 34 50 0 h .4294 g 3070 1163 N -50 0 0 34 50 0 h .4335 g 3070 1197 N -50 0 0 33 50 0 h .4375 g 3070 1230 N -50 0 0 34 50 0 h .4416 g 3070 1264 N -50 0 0 33 50 0 h .4456 g 3070 1297 N -50 0 0 34 50 0 h .4497 g 3070 1331 N -50 0 0 33 50 0 h .4537 g 3070 1364 N -50 0 0 34 50 0 h .4578 g 3070 1398 N -50 0 0 34 50 0 h .4619 g 3070 1432 N -50 0 0 33 50 0 h .4659 g 3070 1465 N -50 0 0 34 50 0 h .47 g 3070 1499 N -50 0 0 33 50 0 h .474 g 3070 1532 N -50 0 0 34 50 0 h .4781 g 3070 1566 N -50 0 0 34 50 0 h .4821 g 3070 1600 N -50 0 0 33 50 0 h .4862 g 3070 1633 N -50 0 0 34 50 0 h .4902 g 3070 1667 N -50 0 0 33 50 0 h .4943 g 3070 1700 N -50 0 0 34 50 0 h .4984 g 3070 1734 N -50 0 0 34 50 0 h .5024 g 3070 1768 N -50 0 0 33 50 0 h .5065 g 3070 1801 N -50 0 0 34 50 0 h .5105 g 3070 1835 N -50 0 0 33 50 0 h .5146 g 3070 1868 N -50 0 0 34 50 0 h .5186 g 3070 1902 N -50 0 0 33 50 0 h .5227 g 3070 1935 N -50 0 0 34 50 0 h .5267 g 3070 1969 N -50 0 0 34 50 0 h .5308 g 3070 2003 N -50 0 0 33 50 0 h .5349 g 3070 2036 N -50 0 0 34 50 0 h .5389 g 3070 2070 N -50 0 0 33 50 0 h .543 g 3070 2103 N -50 0 0 34 50 0 h .547 g 3070 2137 N -50 0 0 34 50 0 h .5511 g 3070 2171 N -50 0 0 33 50 0 h .5551 g 3070 2204 N -50 0 0 34 50 0 h .5592 g 3070 2238 N -50 0 0 33 50 0 h .5632 g 3070 2271 N -50 0 0 34 50 0 h .5673 g 3070 2305 N -50 0 0 34 50 0 h .5714 g 3070 2339 N -50 0 0 33 50 0 h .5754 g 3070 2372 N -50 0 0 34 50 0 h .5795 g 3070 2406 N -50 0 0 33 50 0 h .5835 g 3070 2439 N -50 0 0 34 50 0 h .5876 g 3070 2473 N -50 0 0 34 50 0 h .5916 g 3070 2507 N -50 0 0 33 50 0 h .5957 g 3070 2540 N -50 0 0 34 50 0 h .5997 g 3070 2574 N -50 0 0 32 50 0 h .6038 g 3070 2606 N -50 0 0 34 50 0 h .6079 g 3070 2640 N -50 0 0 33 50 0 h .6119 g 3070 2673 N -50 0 0 34 50 0 h .616 g 3070 2707 N -50 0 0 34 50 0 h .62 g 3070 2741 N -50 0 0 33 50 0 h .6241 g 3070 2774 N -50 0 0 34 50 0 h .6281 g 3070 2808 N -50 0 0 33 50 0 h .6322 g 3070 2841 N -50 0 0 34 50 0 h .6362 g 3070 2875 N -50 0 0 34 50 0 h .6403 g 3070 2909 N -50 0 0 33 50 0 h .6444 g 3070 2942 N -50 0 0 34 50 0 h .6484 g 3070 2976 N -50 0 0 33 50 0 h .6525 g 3070 3009 N -50 0 0 34 50 0 h .6565 g 3070 3043 N -50 0 0 34 50 0 h .6606 g 3070 3077 N -50 0 0 33 50 0 h .6646 g 3070 3110 N -50 0 0 34 50 0 h .6687 g 3070 3144 N -50 0 0 33 50 0 h .6728 g 3070 3177 N -50 0 0 34 50 0 h .6768 g 3070 3211 N -50 0 0 34 50 0 h .6809 g 3070 3245 N -50 0 0 33 50 0 h .6849 g 3070 3278 N -50 0 0 34 50 0 h .689 g 3070 3312 N -50 0 0 33 50 0 h .693 g 3070 3345 N -50 0 0 34 50 0 h .6971 g 3070 3379 N -50 0 0 33 50 0 h .7011 g 3070 3412 N -50 0 0 34 50 0 h .7052 g 3070 3446 N -50 0 0 34 50 0 h .7093 g 3070 3480 N -50 0 0 33 50 0 h .7133 g 3070 3513 N -50 0 0 34 50 0 h .7174 g 3070 3547 N -50 0 0 33 50 0 h .7214 g 3070 3580 N -50 0 0 34 50 0 h .7255 g 3070 3614 N -50 0 0 34 50 0 h .7295 g 3070 3648 N -50 0 0 33 50 0 h .7336 g 3070 3681 N -50 0 0 34 50 0 h .7376 g 3070 3715 N -50 0 0 33 50 0 h .7417 g 3070 3748 N -50 0 0 34 50 0 h .7458 g 3070 3782 N -50 0 0 34 50 0 h .7498 g 3070 3816 N -50 0 0 33 50 0 h .7539 g 3070 3849 N -50 0 0 34 50 0 h .7579 g 3070 3883 N -50 0 0 33 50 0 h .762 g 3070 3916 N -50 0 0 34 50 0 h .766 g 3070 3950 N -50 0 0 33 50 0 h .7701 g 3070 3983 N -50 0 0 34 50 0 h .7741 g 3070 4017 N -50 0 0 34 50 0 h .7782 g 3070 4051 N -50 0 0 33 50 0 h .7823 g 3070 4084 N -50 0 0 34 50 0 h .7863 g 3070 4118 N -50 0 0 33 50 0 h .7904 g 3070 4151 N -50 0 0 34 50 0 h .7944 g 3070 4185 N -50 0 0 34 50 0 h .7985 g 3070 4219 N -50 0 0 33 50 0 h .411 g 3120 928 N -51 0 0 33 51 0 h .4149 g 3120 961 N -51 0 0 34 51 0 h .4188 g 3120 995 N -51 0 0 34 51 0 h .4228 g 3120 1029 N -51 0 0 33 51 0 h .4267 g 3120 1062 N -51 0 0 34 51 0 h .4306 g 3120 1096 N -51 0 0 33 51 0 h .4345 g 3120 1129 N -51 0 0 34 51 0 h .4384 g 3120 1163 N -51 0 0 34 51 0 h .4423 g 3120 1197 N -51 0 0 33 51 0 h .4462 g 3120 1230 N -51 0 0 34 51 0 h .4501 g 3120 1264 N -51 0 0 33 51 0 h .454 g 3120 1297 N -51 0 0 34 51 0 h .4579 g 3120 1331 N -51 0 0 33 51 0 h .4618 g 3120 1364 N -51 0 0 34 51 0 h .4657 g 3120 1398 N -51 0 0 34 51 0 h .4696 g 3120 1432 N -51 0 0 33 51 0 h .4735 g 3120 1465 N -51 0 0 34 51 0 h .4774 g 3120 1499 N -51 0 0 33 51 0 h .4813 g 3120 1532 N -51 0 0 34 51 0 h .4852 g 3120 1566 N -51 0 0 34 51 0 h .4891 g 3120 1600 N -51 0 0 33 51 0 h .493 g 3120 1633 N -51 0 0 34 51 0 h .4969 g 3120 1667 N -51 0 0 33 51 0 h .5008 g 3120 1700 N -51 0 0 34 51 0 h .5047 g 3120 1734 N -51 0 0 34 51 0 h .5086 g 3120 1768 N -51 0 0 33 51 0 h .5125 g 3120 1801 N -51 0 0 34 51 0 h .5164 g 3120 1835 N -51 0 0 33 51 0 h .5203 g 3120 1868 N -51 0 0 34 51 0 h .5242 g 3120 1902 N -51 0 0 33 51 0 h .5281 g 3120 1935 N -51 0 0 34 51 0 h .532 g 3120 1969 N -51 0 0 34 51 0 h .5359 g 3120 2003 N -51 0 0 33 51 0 h .5398 g 3120 2036 N -51 0 0 34 51 0 h .5437 g 3120 2070 N -51 0 0 33 51 0 h .5476 g 3120 2103 N -51 0 0 34 51 0 h .5515 g 3120 2137 N -51 0 0 34 51 0 h .5554 g 3120 2171 N -51 0 0 33 51 0 h .5593 g 3120 2204 N -51 0 0 34 51 0 h .5632 g 3120 2238 N -51 0 0 33 51 0 h .5671 g 3120 2271 N -51 0 0 34 51 0 h .5711 g 3120 2305 N -51 0 0 34 51 0 h .575 g 3120 2339 N -51 0 0 33 51 0 h .5789 g 3120 2372 N -51 0 0 34 51 0 h .5828 g 3120 2406 N -51 0 0 33 51 0 h .5867 g 3120 2439 N -51 0 0 34 51 0 h .5906 g 3120 2473 N -51 0 0 34 51 0 h .5945 g 3120 2507 N -51 0 0 33 51 0 h .5984 g 3120 2540 N -51 0 0 34 51 0 h .6023 g 3120 2574 N -51 0 0 32 51 0 h .6062 g 3120 2606 N -51 0 0 34 51 0 h .6101 g 3120 2640 N -51 0 0 33 51 0 h .614 g 3120 2673 N -51 0 0 34 51 0 h .6179 g 3120 2707 N -51 0 0 34 51 0 h .6218 g 3120 2741 N -51 0 0 33 51 0 h .6257 g 3120 2774 N -51 0 0 34 51 0 h .6296 g 3120 2808 N -51 0 0 33 51 0 h .6335 g 3120 2841 N -51 0 0 34 51 0 h .6374 g 3120 2875 N -51 0 0 34 51 0 h .6413 g 3120 2909 N -51 0 0 33 51 0 h .6452 g 3120 2942 N -51 0 0 34 51 0 h .6491 g 3120 2976 N -51 0 0 33 51 0 h .653 g 3120 3009 N -51 0 0 34 51 0 h .6569 g 3120 3043 N -51 0 0 34 51 0 h .6608 g 3120 3077 N -51 0 0 33 51 0 h .6647 g 3120 3110 N -51 0 0 34 51 0 h .6686 g 3120 3144 N -51 0 0 33 51 0 h .6725 g 3120 3177 N -51 0 0 34 51 0 h .6764 g 3120 3211 N -51 0 0 34 51 0 h .6803 g 3120 3245 N -51 0 0 33 51 0 h .6842 g 3120 3278 N -51 0 0 34 51 0 h .6881 g 3120 3312 N -51 0 0 33 51 0 h .692 g 3120 3345 N -51 0 0 34 51 0 h .6959 g 3120 3379 N -51 0 0 33 51 0 h .6998 g 3120 3412 N -51 0 0 34 51 0 h .7037 g 3120 3446 N -51 0 0 34 51 0 h .7076 g 3120 3480 N -51 0 0 33 51 0 h .7115 g 3120 3513 N -51 0 0 34 51 0 h .7154 g 3120 3547 N -51 0 0 33 51 0 h .7194 g 3120 3580 N -51 0 0 34 51 0 h .7233 g 3120 3614 N -51 0 0 34 51 0 h .7272 g 3120 3648 N -51 0 0 33 51 0 h .7311 g 3120 3681 N -51 0 0 34 51 0 h .735 g 3120 3715 N -51 0 0 33 51 0 h .7389 g 3120 3748 N -51 0 0 34 51 0 h .7428 g 3120 3782 N -51 0 0 34 51 0 h .7467 g 3120 3816 N -51 0 0 33 51 0 h .7506 g 3120 3849 N -51 0 0 34 51 0 h .7545 g 3120 3883 N -51 0 0 33 51 0 h .7584 g 3120 3916 N -51 0 0 34 51 0 h .7623 g 3120 3950 N -51 0 0 33 51 0 h .7662 g 3120 3983 N -51 0 0 34 51 0 h .7701 g 3120 4017 N -51 0 0 34 51 0 h .774 g 3120 4051 N -51 0 0 33 51 0 h .7779 g 3120 4084 N -51 0 0 34 51 0 h .7818 g 3120 4118 N -51 0 0 33 51 0 h .7857 g 3120 4151 N -51 0 0 34 51 0 h .7896 g 3120 4185 N -51 0 0 34 51 0 h .7935 g 3120 4219 N -51 0 0 33 51 0 h .4211 g 3171 928 N -50 0 0 33 50 0 h .4248 g 3171 961 N -50 0 0 34 50 0 h .4286 g 3171 995 N -50 0 0 34 50 0 h .4323 g 3171 1029 N -50 0 0 33 50 0 h .4361 g 3171 1062 N -50 0 0 34 50 0 h .4398 g 3171 1096 N -50 0 0 33 50 0 h .4436 g 3171 1129 N -50 0 0 34 50 0 h .4473 g 3171 1163 N -50 0 0 34 50 0 h .4511 g 3171 1197 N -50 0 0 33 50 0 h .4548 g 3171 1230 N -50 0 0 34 50 0 h .4586 g 3171 1264 N -50 0 0 33 50 0 h .4623 g 3171 1297 N -50 0 0 34 50 0 h .4661 g 3171 1331 N -50 0 0 33 50 0 h .4698 g 3171 1364 N -50 0 0 34 50 0 h .4736 g 3171 1398 N -50 0 0 34 50 0 h .4773 g 3171 1432 N -50 0 0 33 50 0 h .4811 g 3171 1465 N -50 0 0 34 50 0 h .4848 g 3171 1499 N -50 0 0 33 50 0 h .4886 g 3171 1532 N -50 0 0 34 50 0 h .4923 g 3171 1566 N -50 0 0 34 50 0 h .4961 g 3171 1600 N -50 0 0 33 50 0 h .4998 g 3171 1633 N -50 0 0 34 50 0 h .5036 g 3171 1667 N -50 0 0 33 50 0 h .5073 g 3171 1700 N -50 0 0 34 50 0 h .5111 g 3171 1734 N -50 0 0 34 50 0 h .5148 g 3171 1768 N -50 0 0 33 50 0 h .5186 g 3171 1801 N -50 0 0 34 50 0 h .5223 g 3171 1835 N -50 0 0 33 50 0 h .5261 g 3171 1868 N -50 0 0 34 50 0 h .5298 g 3171 1902 N -50 0 0 33 50 0 h .5336 g 3171 1935 N -50 0 0 34 50 0 h .5373 g 3171 1969 N -50 0 0 34 50 0 h .5411 g 3171 2003 N -50 0 0 33 50 0 h .5448 g 3171 2036 N -50 0 0 34 50 0 h .5486 g 3171 2070 N -50 0 0 33 50 0 h .5523 g 3171 2103 N -50 0 0 34 50 0 h .5561 g 3171 2137 N -50 0 0 34 50 0 h .5598 g 3171 2171 N -50 0 0 33 50 0 h .5636 g 3171 2204 N -50 0 0 34 50 0 h .5673 g 3171 2238 N -50 0 0 33 50 0 h .5711 g 3171 2271 N -50 0 0 34 50 0 h .5748 g 3171 2305 N -50 0 0 34 50 0 h .5786 g 3171 2339 N -50 0 0 33 50 0 h .5823 g 3171 2372 N -50 0 0 34 50 0 h .5861 g 3171 2406 N -50 0 0 33 50 0 h .5898 g 3171 2439 N -50 0 0 34 50 0 h .5935 g 3171 2473 N -50 0 0 34 50 0 h .5973 g 3171 2507 N -50 0 0 33 50 0 h .601 g 3171 2540 N -50 0 0 34 50 0 h .6048 g 3171 2574 N -50 0 0 32 50 0 h .6085 g 3171 2606 N -50 0 0 34 50 0 h .6123 g 3171 2640 N -50 0 0 33 50 0 h .616 g 3171 2673 N -50 0 0 34 50 0 h .6198 g 3171 2707 N -50 0 0 34 50 0 h .6235 g 3171 2741 N -50 0 0 33 50 0 h .6273 g 3171 2774 N -50 0 0 34 50 0 h .631 g 3171 2808 N -50 0 0 33 50 0 h .6348 g 3171 2841 N -50 0 0 34 50 0 h .6385 g 3171 2875 N -50 0 0 34 50 0 h .6423 g 3171 2909 N -50 0 0 33 50 0 h .646 g 3171 2942 N -50 0 0 34 50 0 h .6498 g 3171 2976 N -50 0 0 33 50 0 h .6535 g 3171 3009 N -50 0 0 34 50 0 h .6573 g 3171 3043 N -50 0 0 34 50 0 h .661 g 3171 3077 N -50 0 0 33 50 0 h .6648 g 3171 3110 N -50 0 0 34 50 0 h .6685 g 3171 3144 N -50 0 0 33 50 0 h .6723 g 3171 3177 N -50 0 0 34 50 0 h .676 g 3171 3211 N -50 0 0 34 50 0 h .6798 g 3171 3245 N -50 0 0 33 50 0 h .6835 g 3171 3278 N -50 0 0 34 50 0 h .6873 g 3171 3312 N -50 0 0 33 50 0 h .691 g 3171 3345 N -50 0 0 34 50 0 h .6948 g 3171 3379 N -50 0 0 33 50 0 h .6985 g 3171 3412 N -50 0 0 34 50 0 h .7023 g 3171 3446 N -50 0 0 34 50 0 h .706 g 3171 3480 N -50 0 0 33 50 0 h .7098 g 3171 3513 N -50 0 0 34 50 0 h .7135 g 3171 3547 N -50 0 0 33 50 0 h .7173 g 3171 3580 N -50 0 0 34 50 0 h .721 g 3171 3614 N -50 0 0 34 50 0 h .7248 g 3171 3648 N -50 0 0 33 50 0 h .7285 g 3171 3681 N -50 0 0 34 50 0 h .7323 g 3171 3715 N -50 0 0 33 50 0 h .736 g 3171 3748 N -50 0 0 34 50 0 h .7398 g 3171 3782 N -50 0 0 34 50 0 h .7435 g 3171 3816 N -50 0 0 33 50 0 h .7473 g 3171 3849 N -50 0 0 34 50 0 h .751 g 3171 3883 N -50 0 0 33 50 0 h .7548 g 3171 3916 N -50 0 0 34 50 0 h .7585 g 3171 3950 N -50 0 0 33 50 0 h .7623 g 3171 3983 N -50 0 0 34 50 0 h .766 g 3171 4017 N -50 0 0 34 50 0 h .7698 g 3171 4051 N -50 0 0 33 50 0 h .7735 g 3171 4084 N -50 0 0 34 50 0 h .7773 g 3171 4118 N -50 0 0 33 50 0 h .781 g 3171 4151 N -50 0 0 34 50 0 h .7848 g 3171 4185 N -50 0 0 34 50 0 h .7885 g 3171 4219 N -50 0 0 33 50 0 h .4311 g 3221 928 N -51 0 0 33 51 0 h .4347 g 3221 961 N -51 0 0 34 51 0 h .4383 g 3221 995 N -51 0 0 34 51 0 h .4419 g 3221 1029 N -51 0 0 33 51 0 h .4455 g 3221 1062 N -51 0 0 34 51 0 h .4491 g 3221 1096 N -51 0 0 33 51 0 h .4527 g 3221 1129 N -51 0 0 34 51 0 h .4563 g 3221 1163 N -51 0 0 34 51 0 h .4599 g 3221 1197 N -51 0 0 33 51 0 h .4635 g 3221 1230 N -51 0 0 34 51 0 h .4671 g 3221 1264 N -51 0 0 33 51 0 h .4707 g 3221 1297 N -51 0 0 34 51 0 h .4743 g 3221 1331 N -51 0 0 33 51 0 h .4778 g 3221 1364 N -51 0 0 34 51 0 h .4814 g 3221 1398 N -51 0 0 34 51 0 h .485 g 3221 1432 N -51 0 0 33 51 0 h .4886 g 3221 1465 N -51 0 0 34 51 0 h .4922 g 3221 1499 N -51 0 0 33 51 0 h .4958 g 3221 1532 N -51 0 0 34 51 0 h .4994 g 3221 1566 N -51 0 0 34 51 0 h .503 g 3221 1600 N -51 0 0 33 51 0 h .5066 g 3221 1633 N -51 0 0 34 51 0 h .5102 g 3221 1667 N -51 0 0 33 51 0 h .5138 g 3221 1700 N -51 0 0 34 51 0 h .5174 g 3221 1734 N -51 0 0 34 51 0 h .521 g 3221 1768 N -51 0 0 33 51 0 h .5246 g 3221 1801 N -51 0 0 34 51 0 h .5282 g 3221 1835 N -51 0 0 33 51 0 h .5318 g 3221 1868 N -51 0 0 34 51 0 h .5354 g 3221 1902 N -51 0 0 33 51 0 h .539 g 3221 1935 N -51 0 0 34 51 0 h .5426 g 3221 1969 N -51 0 0 34 51 0 h .5462 g 3221 2003 N -51 0 0 33 51 0 h .5498 g 3221 2036 N -51 0 0 34 51 0 h .5534 g 3221 2070 N -51 0 0 33 51 0 h .557 g 3221 2103 N -51 0 0 34 51 0 h .5606 g 3221 2137 N -51 0 0 34 51 0 h .5642 g 3221 2171 N -51 0 0 33 51 0 h .5678 g 3221 2204 N -51 0 0 34 51 0 h .5714 g 3221 2238 N -51 0 0 33 51 0 h .575 g 3221 2271 N -51 0 0 34 51 0 h .5786 g 3221 2305 N -51 0 0 34 51 0 h .5821 g 3221 2339 N -51 0 0 33 51 0 h .5857 g 3221 2372 N -51 0 0 34 51 0 h .5893 g 3221 2406 N -51 0 0 33 51 0 h .5929 g 3221 2439 N -51 0 0 34 51 0 h .5965 g 3221 2473 N -51 0 0 34 51 0 h .6001 g 3221 2507 N -51 0 0 33 51 0 h .6037 g 3221 2540 N -51 0 0 34 51 0 h .6073 g 3221 2574 N -51 0 0 32 51 0 h .6109 g 3221 2606 N -51 0 0 34 51 0 h .6145 g 3221 2640 N -51 0 0 33 51 0 h .6181 g 3221 2673 N -51 0 0 34 51 0 h .6217 g 3221 2707 N -51 0 0 34 51 0 h .6253 g 3221 2741 N -51 0 0 33 51 0 h .6289 g 3221 2774 N -51 0 0 34 51 0 h .6325 g 3221 2808 N -51 0 0 33 51 0 h .6361 g 3221 2841 N -51 0 0 34 51 0 h .6397 g 3221 2875 N -51 0 0 34 51 0 h .6433 g 3221 2909 N -51 0 0 33 51 0 h .6469 g 3221 2942 N -51 0 0 34 51 0 h .6505 g 3221 2976 N -51 0 0 33 51 0 h .6541 g 3221 3009 N -51 0 0 34 51 0 h .6577 g 3221 3043 N -51 0 0 34 51 0 h .6613 g 3221 3077 N -51 0 0 33 51 0 h .6649 g 3221 3110 N -51 0 0 34 51 0 h .6685 g 3221 3144 N -51 0 0 33 51 0 h .6721 g 3221 3177 N -51 0 0 34 51 0 h .6757 g 3221 3211 N -51 0 0 34 51 0 h .6793 g 3221 3245 N -51 0 0 33 51 0 h .6829 g 3221 3278 N -51 0 0 34 51 0 h .6864 g 3221 3312 N -51 0 0 33 51 0 h .69 g 3221 3345 N -51 0 0 34 51 0 h .6936 g 3221 3379 N -51 0 0 33 51 0 h .6972 g 3221 3412 N -51 0 0 34 51 0 h .7008 g 3221 3446 N -51 0 0 34 51 0 h .7044 g 3221 3480 N -51 0 0 33 51 0 h .708 g 3221 3513 N -51 0 0 34 51 0 h .7116 g 3221 3547 N -51 0 0 33 51 0 h .7152 g 3221 3580 N -51 0 0 34 51 0 h .7188 g 3221 3614 N -51 0 0 34 51 0 h .7224 g 3221 3648 N -51 0 0 33 51 0 h .726 g 3221 3681 N -51 0 0 34 51 0 h .7296 g 3221 3715 N -51 0 0 33 51 0 h .7332 g 3221 3748 N -51 0 0 34 51 0 h .7368 g 3221 3782 N -51 0 0 34 51 0 h .7404 g 3221 3816 N -51 0 0 33 51 0 h .744 g 3221 3849 N -51 0 0 34 51 0 h .7476 g 3221 3883 N -51 0 0 33 51 0 h .7512 g 3221 3916 N -51 0 0 34 51 0 h .7548 g 3221 3950 N -51 0 0 33 51 0 h .7584 g 3221 3983 N -51 0 0 34 51 0 h .762 g 3221 4017 N -51 0 0 34 51 0 h .7656 g 3221 4051 N -51 0 0 33 51 0 h .7692 g 3221 4084 N -51 0 0 34 51 0 h .7728 g 3221 4118 N -51 0 0 33 51 0 h .7764 g 3221 4151 N -51 0 0 34 51 0 h .78 g 3221 4185 N -51 0 0 34 51 0 h .7836 g 3221 4219 N -51 0 0 33 51 0 h .4411 g 3272 928 N -50 0 0 33 50 0 h .4446 g 3272 961 N -50 0 0 34 50 0 h .448 g 3272 995 N -50 0 0 34 50 0 h .4514 g 3272 1029 N -50 0 0 33 50 0 h .4549 g 3272 1062 N -50 0 0 34 50 0 h .4583 g 3272 1096 N -50 0 0 33 50 0 h .4618 g 3272 1129 N -50 0 0 34 50 0 h .4652 g 3272 1163 N -50 0 0 34 50 0 h .4687 g 3272 1197 N -50 0 0 33 50 0 h .4721 g 3272 1230 N -50 0 0 34 50 0 h .4756 g 3272 1264 N -50 0 0 33 50 0 h .479 g 3272 1297 N -50 0 0 34 50 0 h .4824 g 3272 1331 N -50 0 0 33 50 0 h .4859 g 3272 1364 N -50 0 0 34 50 0 h .4893 g 3272 1398 N -50 0 0 34 50 0 h .4928 g 3272 1432 N -50 0 0 33 50 0 h .4962 g 3272 1465 N -50 0 0 34 50 0 h .4997 g 3272 1499 N -50 0 0 33 50 0 h .5031 g 3272 1532 N -50 0 0 34 50 0 h .5065 g 3272 1566 N -50 0 0 34 50 0 h .51 g 3272 1600 N -50 0 0 33 50 0 h .5134 g 3272 1633 N -50 0 0 34 50 0 h .5169 g 3272 1667 N -50 0 0 33 50 0 h .5203 g 3272 1700 N -50 0 0 34 50 0 h .5238 g 3272 1734 N -50 0 0 34 50 0 h .5272 g 3272 1768 N -50 0 0 33 50 0 h .5306 g 3272 1801 N -50 0 0 34 50 0 h .5341 g 3272 1835 N -50 0 0 33 50 0 h .5375 g 3272 1868 N -50 0 0 34 50 0 h .541 g 3272 1902 N -50 0 0 33 50 0 h .5444 g 3272 1935 N -50 0 0 34 50 0 h .5479 g 3272 1969 N -50 0 0 34 50 0 h .5513 g 3272 2003 N -50 0 0 33 50 0 h .5548 g 3272 2036 N -50 0 0 34 50 0 h .5582 g 3272 2070 N -50 0 0 33 50 0 h .5616 g 3272 2103 N -50 0 0 34 50 0 h .5651 g 3272 2137 N -50 0 0 34 50 0 h .5685 g 3272 2171 N -50 0 0 33 50 0 h .572 g 3272 2204 N -50 0 0 34 50 0 h .5754 g 3272 2238 N -50 0 0 33 50 0 h .5789 g 3272 2271 N -50 0 0 34 50 0 h .5823 g 3272 2305 N -50 0 0 34 50 0 h .5857 g 3272 2339 N -50 0 0 33 50 0 h .5892 g 3272 2372 N -50 0 0 34 50 0 h .5926 g 3272 2406 N -50 0 0 33 50 0 h .5961 g 3272 2439 N -50 0 0 34 50 0 h .5995 g 3272 2473 N -50 0 0 34 50 0 h .603 g 3272 2507 N -50 0 0 33 50 0 h .6064 g 3272 2540 N -50 0 0 34 50 0 h .6098 g 3272 2574 N -50 0 0 32 50 0 h .6133 g 3272 2606 N -50 0 0 34 50 0 h .6167 g 3272 2640 N -50 0 0 33 50 0 h .6202 g 3272 2673 N -50 0 0 34 50 0 h .6236 g 3272 2707 N -50 0 0 34 50 0 h .6271 g 3272 2741 N -50 0 0 33 50 0 h .6305 g 3272 2774 N -50 0 0 34 50 0 h .634 g 3272 2808 N -50 0 0 33 50 0 h .6374 g 3272 2841 N -50 0 0 34 50 0 h .6408 g 3272 2875 N -50 0 0 34 50 0 h .6443 g 3272 2909 N -50 0 0 33 50 0 h .6477 g 3272 2942 N -50 0 0 34 50 0 h .6512 g 3272 2976 N -50 0 0 33 50 0 h .6546 g 3272 3009 N -50 0 0 34 50 0 h .6581 g 3272 3043 N -50 0 0 34 50 0 h .6615 g 3272 3077 N -50 0 0 33 50 0 h .6649 g 3272 3110 N -50 0 0 34 50 0 h .6684 g 3272 3144 N -50 0 0 33 50 0 h .6718 g 3272 3177 N -50 0 0 34 50 0 h .6753 g 3272 3211 N -50 0 0 34 50 0 h .6787 g 3272 3245 N -50 0 0 33 50 0 h .6822 g 3272 3278 N -50 0 0 34 50 0 h .6856 g 3272 3312 N -50 0 0 33 50 0 h .689 g 3272 3345 N -50 0 0 34 50 0 h .6925 g 3272 3379 N -50 0 0 33 50 0 h .6959 g 3272 3412 N -50 0 0 34 50 0 h .6994 g 3272 3446 N -50 0 0 34 50 0 h .7028 g 3272 3480 N -50 0 0 33 50 0 h .7063 g 3272 3513 N -50 0 0 34 50 0 h .7097 g 3272 3547 N -50 0 0 33 50 0 h .7132 g 3272 3580 N -50 0 0 34 50 0 h .7166 g 3272 3614 N -50 0 0 34 50 0 h .72 g 3272 3648 N -50 0 0 33 50 0 h .7235 g 3272 3681 N -50 0 0 34 50 0 h .7269 g 3272 3715 N -50 0 0 33 50 0 h .7304 g 3272 3748 N -50 0 0 34 50 0 h .7338 g 3272 3782 N -50 0 0 34 50 0 h .7373 g 3272 3816 N -50 0 0 33 50 0 h .7407 g 3272 3849 N -50 0 0 34 50 0 h .7441 g 3272 3883 N -50 0 0 33 50 0 h .7476 g 3272 3916 N -50 0 0 34 50 0 h .751 g 3272 3950 N -50 0 0 33 50 0 h .7545 g 3272 3983 N -50 0 0 34 50 0 h .7579 g 3272 4017 N -50 0 0 34 50 0 h .7614 g 3272 4051 N -50 0 0 33 50 0 h .7648 g 3272 4084 N -50 0 0 34 50 0 h .7683 g 3272 4118 N -50 0 0 33 50 0 h .7717 g 3272 4151 N -50 0 0 34 50 0 h .7751 g 3272 4185 N -50 0 0 34 50 0 h .7786 g 3272 4219 N -50 0 0 33 50 0 h .4511 g 3322 928 N -51 0 0 33 51 0 h .4544 g 3322 961 N -51 0 0 34 51 0 h .4577 g 3322 995 N -51 0 0 34 51 0 h .461 g 3322 1029 N -51 0 0 33 51 0 h .4643 g 3322 1062 N -51 0 0 34 51 0 h .4676 g 3322 1096 N -51 0 0 33 51 0 h .4709 g 3322 1129 N -51 0 0 34 51 0 h .4742 g 3322 1163 N -51 0 0 34 51 0 h .4775 g 3322 1197 N -51 0 0 33 51 0 h .4808 g 3322 1230 N -51 0 0 34 51 0 h .484 g 3322 1264 N -51 0 0 33 51 0 h .4873 g 3322 1297 N -51 0 0 34 51 0 h .4906 g 3322 1331 N -51 0 0 33 51 0 h .4939 g 3322 1364 N -51 0 0 34 51 0 h .4972 g 3322 1398 N -51 0 0 34 51 0 h .5005 g 3322 1432 N -51 0 0 33 51 0 h .5038 g 3322 1465 N -51 0 0 34 51 0 h .5071 g 3322 1499 N -51 0 0 33 51 0 h .5104 g 3322 1532 N -51 0 0 34 51 0 h .5137 g 3322 1566 N -51 0 0 34 51 0 h .517 g 3322 1600 N -51 0 0 33 51 0 h .5202 g 3322 1633 N -51 0 0 34 51 0 h .5235 g 3322 1667 N -51 0 0 33 51 0 h .5268 g 3322 1700 N -51 0 0 34 51 0 h .5301 g 3322 1734 N -51 0 0 34 51 0 h .5334 g 3322 1768 N -51 0 0 33 51 0 h .5367 g 3322 1801 N -51 0 0 34 51 0 h .54 g 3322 1835 N -51 0 0 33 51 0 h .5433 g 3322 1868 N -51 0 0 34 51 0 h .5466 g 3322 1902 N -51 0 0 33 51 0 h .5499 g 3322 1935 N -51 0 0 34 51 0 h .5531 g 3322 1969 N -51 0 0 34 51 0 h .5564 g 3322 2003 N -51 0 0 33 51 0 h .5597 g 3322 2036 N -51 0 0 34 51 0 h .563 g 3322 2070 N -51 0 0 33 51 0 h .5663 g 3322 2103 N -51 0 0 34 51 0 h .5696 g 3322 2137 N -51 0 0 34 51 0 h .5729 g 3322 2171 N -51 0 0 33 51 0 h .5762 g 3322 2204 N -51 0 0 34 51 0 h .5795 g 3322 2238 N -51 0 0 33 51 0 h .5828 g 3322 2271 N -51 0 0 34 51 0 h .5861 g 3322 2305 N -51 0 0 34 51 0 h .5893 g 3322 2339 N -51 0 0 33 51 0 h .5926 g 3322 2372 N -51 0 0 34 51 0 h .5959 g 3322 2406 N -51 0 0 33 51 0 h .5992 g 3322 2439 N -51 0 0 34 51 0 h .6025 g 3322 2473 N -51 0 0 34 51 0 h .6058 g 3322 2507 N -51 0 0 33 51 0 h .6091 g 3322 2540 N -51 0 0 34 51 0 h .6124 g 3322 2574 N -51 0 0 32 51 0 h .6157 g 3322 2606 N -51 0 0 34 51 0 h .619 g 3322 2640 N -51 0 0 33 51 0 h .6222 g 3322 2673 N -51 0 0 34 51 0 h .6255 g 3322 2707 N -51 0 0 34 51 0 h .6288 g 3322 2741 N -51 0 0 33 51 0 h .6321 g 3322 2774 N -51 0 0 34 51 0 h .6354 g 3322 2808 N -51 0 0 33 51 0 h .6387 g 3322 2841 N -51 0 0 34 51 0 h .642 g 3322 2875 N -51 0 0 34 51 0 h .6453 g 3322 2909 N -51 0 0 33 51 0 h .6486 g 3322 2942 N -51 0 0 34 51 0 h .6519 g 3322 2976 N -51 0 0 33 51 0 h .6552 g 3322 3009 N -51 0 0 34 51 0 h .6584 g 3322 3043 N -51 0 0 34 51 0 h .6617 g 3322 3077 N -51 0 0 33 51 0 h .665 g 3322 3110 N -51 0 0 34 51 0 h .6683 g 3322 3144 N -51 0 0 33 51 0 h .6716 g 3322 3177 N -51 0 0 34 51 0 h .6749 g 3322 3211 N -51 0 0 34 51 0 h .6782 g 3322 3245 N -51 0 0 33 51 0 h .6815 g 3322 3278 N -51 0 0 34 51 0 h .6848 g 3322 3312 N -51 0 0 33 51 0 h .6881 g 3322 3345 N -51 0 0 34 51 0 h .6913 g 3322 3379 N -51 0 0 33 51 0 h .6946 g 3322 3412 N -51 0 0 34 51 0 h .6979 g 3322 3446 N -51 0 0 34 51 0 h .7012 g 3322 3480 N -51 0 0 33 51 0 h .7045 g 3322 3513 N -51 0 0 34 51 0 h .7078 g 3322 3547 N -51 0 0 33 51 0 h .7111 g 3322 3580 N -51 0 0 34 51 0 h .7144 g 3322 3614 N -51 0 0 34 51 0 h .7177 g 3322 3648 N -51 0 0 33 51 0 h .721 g 3322 3681 N -51 0 0 34 51 0 h .7243 g 3322 3715 N -51 0 0 33 51 0 h .7275 g 3322 3748 N -51 0 0 34 51 0 h .7308 g 3322 3782 N -51 0 0 34 51 0 h .7341 g 3322 3816 N -51 0 0 33 51 0 h .7374 g 3322 3849 N -51 0 0 34 51 0 h .7407 g 3322 3883 N -51 0 0 33 51 0 h .744 g 3322 3916 N -51 0 0 34 51 0 h .7473 g 3322 3950 N -51 0 0 33 51 0 h .7506 g 3322 3983 N -51 0 0 34 51 0 h .7539 g 3322 4017 N -51 0 0 34 51 0 h .7572 g 3322 4051 N -51 0 0 33 51 0 h .7604 g 3322 4084 N -51 0 0 34 51 0 h .7637 g 3322 4118 N -51 0 0 33 51 0 h .767 g 3322 4151 N -51 0 0 34 51 0 h .7703 g 3322 4185 N -51 0 0 34 51 0 h .7736 g 3322 4219 N -51 0 0 33 51 0 h .4612 g 3373 928 N -51 0 0 33 51 0 h .4643 g 3373 961 N -51 0 0 34 51 0 h .4674 g 3373 995 N -51 0 0 34 51 0 h .4706 g 3373 1029 N -51 0 0 33 51 0 h .4737 g 3373 1062 N -51 0 0 34 51 0 h .4769 g 3373 1096 N -51 0 0 33 51 0 h .48 g 3373 1129 N -51 0 0 34 51 0 h .4831 g 3373 1163 N -51 0 0 34 51 0 h .4863 g 3373 1197 N -51 0 0 33 51 0 h .4894 g 3373 1230 N -51 0 0 34 51 0 h .4925 g 3373 1264 N -51 0 0 33 51 0 h .4957 g 3373 1297 N -51 0 0 34 51 0 h .4988 g 3373 1331 N -51 0 0 33 51 0 h .502 g 3373 1364 N -51 0 0 34 51 0 h .5051 g 3373 1398 N -51 0 0 34 51 0 h .5082 g 3373 1432 N -51 0 0 33 51 0 h .5114 g 3373 1465 N -51 0 0 34 51 0 h .5145 g 3373 1499 N -51 0 0 33 51 0 h .5176 g 3373 1532 N -51 0 0 34 51 0 h .5208 g 3373 1566 N -51 0 0 34 51 0 h .5239 g 3373 1600 N -51 0 0 33 51 0 h .5271 g 3373 1633 N -51 0 0 34 51 0 h .5302 g 3373 1667 N -51 0 0 33 51 0 h .5333 g 3373 1700 N -51 0 0 34 51 0 h .5365 g 3373 1734 N -51 0 0 34 51 0 h .5396 g 3373 1768 N -51 0 0 33 51 0 h .5427 g 3373 1801 N -51 0 0 34 51 0 h .5459 g 3373 1835 N -51 0 0 33 51 0 h .549 g 3373 1868 N -51 0 0 34 51 0 h .5522 g 3373 1902 N -51 0 0 33 51 0 h .5553 g 3373 1935 N -51 0 0 34 51 0 h .5584 g 3373 1969 N -51 0 0 34 51 0 h .5616 g 3373 2003 N -51 0 0 33 51 0 h .5647 g 3373 2036 N -51 0 0 34 51 0 h .5678 g 3373 2070 N -51 0 0 33 51 0 h .571 g 3373 2103 N -51 0 0 34 51 0 h .5741 g 3373 2137 N -51 0 0 34 51 0 h .5772 g 3373 2171 N -51 0 0 33 51 0 h .5804 g 3373 2204 N -51 0 0 34 51 0 h .5835 g 3373 2238 N -51 0 0 33 51 0 h .5867 g 3373 2271 N -51 0 0 34 51 0 h .5898 g 3373 2305 N -51 0 0 34 51 0 h .5929 g 3373 2339 N -51 0 0 33 51 0 h .5961 g 3373 2372 N -51 0 0 34 51 0 h .5992 g 3373 2406 N -51 0 0 33 51 0 h .6023 g 3373 2439 N -51 0 0 34 51 0 h .6055 g 3373 2473 N -51 0 0 34 51 0 h .6086 g 3373 2507 N -51 0 0 33 51 0 h .6118 g 3373 2540 N -51 0 0 34 51 0 h .6149 g 3373 2574 N -51 0 0 32 51 0 h .618 g 3373 2606 N -51 0 0 34 51 0 h .6212 g 3373 2640 N -51 0 0 33 51 0 h .6243 g 3373 2673 N -51 0 0 34 51 0 h .6274 g 3373 2707 N -51 0 0 34 51 0 h .6306 g 3373 2741 N -51 0 0 33 51 0 h .6337 g 3373 2774 N -51 0 0 34 51 0 h .6369 g 3373 2808 N -51 0 0 33 51 0 h .64 g 3373 2841 N -51 0 0 34 51 0 h .6431 g 3373 2875 N -51 0 0 34 51 0 h .6463 g 3373 2909 N -51 0 0 33 51 0 h .6494 g 3373 2942 N -51 0 0 34 51 0 h .6525 g 3373 2976 N -51 0 0 33 51 0 h .6557 g 3373 3009 N -51 0 0 34 51 0 h .6588 g 3373 3043 N -51 0 0 34 51 0 h .662 g 3373 3077 N -51 0 0 33 51 0 h .6651 g 3373 3110 N -51 0 0 34 51 0 h .6682 g 3373 3144 N -51 0 0 33 51 0 h .6714 g 3373 3177 N -51 0 0 34 51 0 h .6745 g 3373 3211 N -51 0 0 34 51 0 h .6776 g 3373 3245 N -51 0 0 33 51 0 h .6808 g 3373 3278 N -51 0 0 34 51 0 h .6839 g 3373 3312 N -51 0 0 33 51 0 h .6871 g 3373 3345 N -51 0 0 34 51 0 h .6902 g 3373 3379 N -51 0 0 33 51 0 h .6933 g 3373 3412 N -51 0 0 34 51 0 h .6965 g 3373 3446 N -51 0 0 34 51 0 h .6996 g 3373 3480 N -51 0 0 33 51 0 h .7027 g 3373 3513 N -51 0 0 34 51 0 h .7059 g 3373 3547 N -51 0 0 33 51 0 h .709 g 3373 3580 N -51 0 0 34 51 0 h .7122 g 3373 3614 N -51 0 0 34 51 0 h .7153 g 3373 3648 N -51 0 0 33 51 0 h .7184 g 3373 3681 N -51 0 0 34 51 0 h .7216 g 3373 3715 N -51 0 0 33 51 0 h .7247 g 3373 3748 N -51 0 0 34 51 0 h .7278 g 3373 3782 N -51 0 0 34 51 0 h .731 g 3373 3816 N -51 0 0 33 51 0 h .7341 g 3373 3849 N -51 0 0 34 51 0 h .7373 g 3373 3883 N -51 0 0 33 51 0 h .7404 g 3373 3916 N -51 0 0 34 51 0 h .7435 g 3373 3950 N -51 0 0 33 51 0 h .7467 g 3373 3983 N -51 0 0 34 51 0 h .7498 g 3373 4017 N -51 0 0 34 51 0 h .7529 g 3373 4051 N -51 0 0 33 51 0 h .7561 g 3373 4084 N -51 0 0 34 51 0 h .7592 g 3373 4118 N -51 0 0 33 51 0 h .7624 g 3373 4151 N -51 0 0 34 51 0 h .7655 g 3373 4185 N -51 0 0 34 51 0 h .7686 g 3373 4219 N -51 0 0 33 51 0 h .4712 g 3424 928 N -50 0 0 33 50 0 h .4742 g 3424 961 N -50 0 0 34 50 0 h .4772 g 3424 995 N -50 0 0 34 50 0 h .4801 g 3424 1029 N -50 0 0 33 50 0 h .4831 g 3424 1062 N -50 0 0 34 50 0 h .4861 g 3424 1096 N -50 0 0 33 50 0 h .4891 g 3424 1129 N -50 0 0 34 50 0 h .4921 g 3424 1163 N -50 0 0 34 50 0 h .4951 g 3424 1197 N -50 0 0 33 50 0 h .498 g 3424 1230 N -50 0 0 34 50 0 h .501 g 3424 1264 N -50 0 0 33 50 0 h .504 g 3424 1297 N -50 0 0 34 50 0 h .507 g 3424 1331 N -50 0 0 33 50 0 h .51 g 3424 1364 N -50 0 0 34 50 0 h .513 g 3424 1398 N -50 0 0 34 50 0 h .516 g 3424 1432 N -50 0 0 33 50 0 h .5189 g 3424 1465 N -50 0 0 34 50 0 h .5219 g 3424 1499 N -50 0 0 33 50 0 h .5249 g 3424 1532 N -50 0 0 34 50 0 h .5279 g 3424 1566 N -50 0 0 34 50 0 h .5309 g 3424 1600 N -50 0 0 33 50 0 h .5339 g 3424 1633 N -50 0 0 34 50 0 h .5368 g 3424 1667 N -50 0 0 33 50 0 h .5398 g 3424 1700 N -50 0 0 34 50 0 h .5428 g 3424 1734 N -50 0 0 34 50 0 h .5458 g 3424 1768 N -50 0 0 33 50 0 h .5488 g 3424 1801 N -50 0 0 34 50 0 h .5518 g 3424 1835 N -50 0 0 33 50 0 h .5548 g 3424 1868 N -50 0 0 34 50 0 h .5577 g 3424 1902 N -50 0 0 33 50 0 h .5607 g 3424 1935 N -50 0 0 34 50 0 h .5637 g 3424 1969 N -50 0 0 34 50 0 h .5667 g 3424 2003 N -50 0 0 33 50 0 h .5697 g 3424 2036 N -50 0 0 34 50 0 h .5727 g 3424 2070 N -50 0 0 33 50 0 h .5756 g 3424 2103 N -50 0 0 34 50 0 h .5786 g 3424 2137 N -50 0 0 34 50 0 h .5816 g 3424 2171 N -50 0 0 33 50 0 h .5846 g 3424 2204 N -50 0 0 34 50 0 h .5876 g 3424 2238 N -50 0 0 33 50 0 h .5906 g 3424 2271 N -50 0 0 34 50 0 h .5935 g 3424 2305 N -50 0 0 34 50 0 h .5965 g 3424 2339 N -50 0 0 33 50 0 h .5995 g 3424 2372 N -50 0 0 34 50 0 h .6025 g 3424 2406 N -50 0 0 33 50 0 h .6055 g 3424 2439 N -50 0 0 34 50 0 h .6085 g 3424 2473 N -50 0 0 34 50 0 h .6115 g 3424 2507 N -50 0 0 33 50 0 h .6144 g 3424 2540 N -50 0 0 34 50 0 h .6174 g 3424 2574 N -50 0 0 32 50 0 h .6204 g 3424 2606 N -50 0 0 34 50 0 h .6234 g 3424 2640 N -50 0 0 33 50 0 h .6264 g 3424 2673 N -50 0 0 34 50 0 h .6294 g 3424 2707 N -50 0 0 34 50 0 h .6323 g 3424 2741 N -50 0 0 33 50 0 h .6353 g 3424 2774 N -50 0 0 34 50 0 h .6383 g 3424 2808 N -50 0 0 33 50 0 h .6413 g 3424 2841 N -50 0 0 34 50 0 h .6443 g 3424 2875 N -50 0 0 34 50 0 h .6473 g 3424 2909 N -50 0 0 33 50 0 h .6503 g 3424 2942 N -50 0 0 34 50 0 h .6532 g 3424 2976 N -50 0 0 33 50 0 h .6562 g 3424 3009 N -50 0 0 34 50 0 h .6592 g 3424 3043 N -50 0 0 34 50 0 h .6622 g 3424 3077 N -50 0 0 33 50 0 h .6652 g 3424 3110 N -50 0 0 34 50 0 h .6682 g 3424 3144 N -50 0 0 33 50 0 h .6711 g 3424 3177 N -50 0 0 34 50 0 h .6741 g 3424 3211 N -50 0 0 34 50 0 h .6771 g 3424 3245 N -50 0 0 33 50 0 h .6801 g 3424 3278 N -50 0 0 34 50 0 h .6831 g 3424 3312 N -50 0 0 33 50 0 h .6861 g 3424 3345 N -50 0 0 34 50 0 h .689 g 3424 3379 N -50 0 0 33 50 0 h .692 g 3424 3412 N -50 0 0 34 50 0 h .695 g 3424 3446 N -50 0 0 34 50 0 h .698 g 3424 3480 N -50 0 0 33 50 0 h .701 g 3424 3513 N -50 0 0 34 50 0 h .704 g 3424 3547 N -50 0 0 33 50 0 h .707 g 3424 3580 N -50 0 0 34 50 0 h .7099 g 3424 3614 N -50 0 0 34 50 0 h .7129 g 3424 3648 N -50 0 0 33 50 0 h .7159 g 3424 3681 N -50 0 0 34 50 0 h .7189 g 3424 3715 N -50 0 0 33 50 0 h .7219 g 3424 3748 N -50 0 0 34 50 0 h .7249 g 3424 3782 N -50 0 0 34 50 0 h .7278 g 3424 3816 N -50 0 0 33 50 0 h .7308 g 3424 3849 N -50 0 0 34 50 0 h .7338 g 3424 3883 N -50 0 0 33 50 0 h .7368 g 3424 3916 N -50 0 0 34 50 0 h .7398 g 3424 3950 N -50 0 0 33 50 0 h .7428 g 3424 3983 N -50 0 0 34 50 0 h .7458 g 3424 4017 N -50 0 0 34 50 0 h .7487 g 3424 4051 N -50 0 0 33 50 0 h .7517 g 3424 4084 N -50 0 0 34 50 0 h .7547 g 3424 4118 N -50 0 0 33 50 0 h .7577 g 3424 4151 N -50 0 0 34 50 0 h .7607 g 3424 4185 N -50 0 0 34 50 0 h .7637 g 3424 4219 N -50 0 0 33 50 0 h .4812 g 3474 928 N -51 0 0 33 51 0 h .484 g 3474 961 N -51 0 0 34 51 0 h .4869 g 3474 995 N -51 0 0 34 51 0 h .4897 g 3474 1029 N -51 0 0 33 51 0 h .4925 g 3474 1062 N -51 0 0 34 51 0 h .4954 g 3474 1096 N -51 0 0 33 51 0 h .4982 g 3474 1129 N -51 0 0 34 51 0 h .501 g 3474 1163 N -51 0 0 34 51 0 h .5039 g 3474 1197 N -51 0 0 33 51 0 h .5067 g 3474 1230 N -51 0 0 34 51 0 h .5095 g 3474 1264 N -51 0 0 33 51 0 h .5124 g 3474 1297 N -51 0 0 34 51 0 h .5152 g 3474 1331 N -51 0 0 33 51 0 h .518 g 3474 1364 N -51 0 0 34 51 0 h .5209 g 3474 1398 N -51 0 0 34 51 0 h .5237 g 3474 1432 N -51 0 0 33 51 0 h .5265 g 3474 1465 N -51 0 0 34 51 0 h .5293 g 3474 1499 N -51 0 0 33 51 0 h .5322 g 3474 1532 N -51 0 0 34 51 0 h .535 g 3474 1566 N -51 0 0 34 51 0 h .5378 g 3474 1600 N -51 0 0 33 51 0 h .5407 g 3474 1633 N -51 0 0 34 51 0 h .5435 g 3474 1667 N -51 0 0 33 51 0 h .5463 g 3474 1700 N -51 0 0 34 51 0 h .5492 g 3474 1734 N -51 0 0 34 51 0 h .552 g 3474 1768 N -51 0 0 33 51 0 h .5548 g 3474 1801 N -51 0 0 34 51 0 h .5577 g 3474 1835 N -51 0 0 33 51 0 h .5605 g 3474 1868 N -51 0 0 34 51 0 h .5633 g 3474 1902 N -51 0 0 33 51 0 h .5662 g 3474 1935 N -51 0 0 34 51 0 h .569 g 3474 1969 N -51 0 0 34 51 0 h .5718 g 3474 2003 N -51 0 0 33 51 0 h .5746 g 3474 2036 N -51 0 0 34 51 0 h .5775 g 3474 2070 N -51 0 0 33 51 0 h .5803 g 3474 2103 N -51 0 0 34 51 0 h .5831 g 3474 2137 N -51 0 0 34 51 0 h .586 g 3474 2171 N -51 0 0 33 51 0 h .5888 g 3474 2204 N -51 0 0 34 51 0 h .5916 g 3474 2238 N -51 0 0 33 51 0 h .5945 g 3474 2271 N -51 0 0 34 51 0 h .5973 g 3474 2305 N -51 0 0 34 51 0 h .6001 g 3474 2339 N -51 0 0 33 51 0 h .603 g 3474 2372 N -51 0 0 34 51 0 h .6058 g 3474 2406 N -51 0 0 33 51 0 h .6086 g 3474 2439 N -51 0 0 34 51 0 h .6115 g 3474 2473 N -51 0 0 34 51 0 h .6143 g 3474 2507 N -51 0 0 33 51 0 h .6171 g 3474 2540 N -51 0 0 34 51 0 h .6199 g 3474 2574 N -51 0 0 32 51 0 h .6228 g 3474 2606 N -51 0 0 34 51 0 h .6256 g 3474 2640 N -51 0 0 33 51 0 h .6284 g 3474 2673 N -51 0 0 34 51 0 h .6313 g 3474 2707 N -51 0 0 34 51 0 h .6341 g 3474 2741 N -51 0 0 33 51 0 h .6369 g 3474 2774 N -51 0 0 34 51 0 h .6398 g 3474 2808 N -51 0 0 33 51 0 h .6426 g 3474 2841 N -51 0 0 34 51 0 h .6454 g 3474 2875 N -51 0 0 34 51 0 h .6483 g 3474 2909 N -51 0 0 33 51 0 h .6511 g 3474 2942 N -51 0 0 34 51 0 h .6539 g 3474 2976 N -51 0 0 33 51 0 h .6568 g 3474 3009 N -51 0 0 34 51 0 h .6596 g 3474 3043 N -51 0 0 34 51 0 h .6624 g 3474 3077 N -51 0 0 33 51 0 h .6653 g 3474 3110 N -51 0 0 34 51 0 h .6681 g 3474 3144 N -51 0 0 33 51 0 h .6709 g 3474 3177 N -51 0 0 34 51 0 h .6737 g 3474 3211 N -51 0 0 34 51 0 h .6766 g 3474 3245 N -51 0 0 33 51 0 h .6794 g 3474 3278 N -51 0 0 34 51 0 h .6822 g 3474 3312 N -51 0 0 33 51 0 h .6851 g 3474 3345 N -51 0 0 34 51 0 h .6879 g 3474 3379 N -51 0 0 33 51 0 h .6907 g 3474 3412 N -51 0 0 34 51 0 h .6936 g 3474 3446 N -51 0 0 34 51 0 h .6964 g 3474 3480 N -51 0 0 33 51 0 h .6992 g 3474 3513 N -51 0 0 34 51 0 h .7021 g 3474 3547 N -51 0 0 33 51 0 h .7049 g 3474 3580 N -51 0 0 34 51 0 h .7077 g 3474 3614 N -51 0 0 34 51 0 h .7106 g 3474 3648 N -51 0 0 33 51 0 h .7134 g 3474 3681 N -51 0 0 34 51 0 h .7162 g 3474 3715 N -51 0 0 33 51 0 h .719 g 3474 3748 N -51 0 0 34 51 0 h .7219 g 3474 3782 N -51 0 0 34 51 0 h .7247 g 3474 3816 N -51 0 0 33 51 0 h .7275 g 3474 3849 N -51 0 0 34 51 0 h .7304 g 3474 3883 N -51 0 0 33 51 0 h .7332 g 3474 3916 N -51 0 0 34 51 0 h .736 g 3474 3950 N -51 0 0 33 51 0 h .7389 g 3474 3983 N -51 0 0 34 51 0 h .7417 g 3474 4017 N -51 0 0 34 51 0 h .7445 g 3474 4051 N -51 0 0 33 51 0 h .7474 g 3474 4084 N -51 0 0 34 51 0 h .7502 g 3474 4118 N -51 0 0 33 51 0 h .753 g 3474 4151 N -51 0 0 34 51 0 h .7559 g 3474 4185 N -51 0 0 34 51 0 h .7587 g 3474 4219 N -51 0 0 33 51 0 h .4912 g 3525 928 N -50 0 0 33 50 0 h .4939 g 3525 961 N -50 0 0 34 50 0 h .4966 g 3525 995 N -50 0 0 34 50 0 h .4993 g 3525 1029 N -50 0 0 33 50 0 h .502 g 3525 1062 N -50 0 0 34 50 0 h .5046 g 3525 1096 N -50 0 0 33 50 0 h .5073 g 3525 1129 N -50 0 0 34 50 0 h .51 g 3525 1163 N -50 0 0 34 50 0 h .5127 g 3525 1197 N -50 0 0 33 50 0 h .5153 g 3525 1230 N -50 0 0 34 50 0 h .518 g 3525 1264 N -50 0 0 33 50 0 h .5207 g 3525 1297 N -50 0 0 34 50 0 h .5234 g 3525 1331 N -50 0 0 33 50 0 h .5261 g 3525 1364 N -50 0 0 34 50 0 h .5287 g 3525 1398 N -50 0 0 34 50 0 h .5314 g 3525 1432 N -50 0 0 33 50 0 h .5341 g 3525 1465 N -50 0 0 34 50 0 h .5368 g 3525 1499 N -50 0 0 33 50 0 h .5394 g 3525 1532 N -50 0 0 34 50 0 h .5421 g 3525 1566 N -50 0 0 34 50 0 h .5448 g 3525 1600 N -50 0 0 33 50 0 h .5475 g 3525 1633 N -50 0 0 34 50 0 h .5502 g 3525 1667 N -50 0 0 33 50 0 h .5528 g 3525 1700 N -50 0 0 34 50 0 h .5555 g 3525 1734 N -50 0 0 34 50 0 h .5582 g 3525 1768 N -50 0 0 33 50 0 h .5609 g 3525 1801 N -50 0 0 34 50 0 h .5636 g 3525 1835 N -50 0 0 33 50 0 h .5662 g 3525 1868 N -50 0 0 34 50 0 h .5689 g 3525 1902 N -50 0 0 33 50 0 h .5716 g 3525 1935 N -50 0 0 34 50 0 h .5743 g 3525 1969 N -50 0 0 34 50 0 h .5769 g 3525 2003 N -50 0 0 33 50 0 h .5796 g 3525 2036 N -50 0 0 34 50 0 h .5823 g 3525 2070 N -50 0 0 33 50 0 h .585 g 3525 2103 N -50 0 0 34 50 0 h .5877 g 3525 2137 N -50 0 0 34 50 0 h .5903 g 3525 2171 N -50 0 0 33 50 0 h .593 g 3525 2204 N -50 0 0 34 50 0 h .5957 g 3525 2238 N -50 0 0 33 50 0 h .5984 g 3525 2271 N -50 0 0 34 50 0 h .601 g 3525 2305 N -50 0 0 34 50 0 h .6037 g 3525 2339 N -50 0 0 33 50 0 h .6064 g 3525 2372 N -50 0 0 34 50 0 h .6091 g 3525 2406 N -50 0 0 33 50 0 h .6118 g 3525 2439 N -50 0 0 34 50 0 h .6144 g 3525 2473 N -50 0 0 34 50 0 h .6171 g 3525 2507 N -50 0 0 33 50 0 h .6198 g 3525 2540 N -50 0 0 34 50 0 h .6225 g 3525 2574 N -50 0 0 32 50 0 h .6252 g 3525 2606 N -50 0 0 34 50 0 h .6278 g 3525 2640 N -50 0 0 33 50 0 h .6305 g 3525 2673 N -50 0 0 34 50 0 h .6332 g 3525 2707 N -50 0 0 34 50 0 h .6359 g 3525 2741 N -50 0 0 33 50 0 h .6385 g 3525 2774 N -50 0 0 34 50 0 h .6412 g 3525 2808 N -50 0 0 33 50 0 h .6439 g 3525 2841 N -50 0 0 34 50 0 h .6466 g 3525 2875 N -50 0 0 34 50 0 h .6493 g 3525 2909 N -50 0 0 33 50 0 h .6519 g 3525 2942 N -50 0 0 34 50 0 h .6546 g 3525 2976 N -50 0 0 33 50 0 h .6573 g 3525 3009 N -50 0 0 34 50 0 h .66 g 3525 3043 N -50 0 0 34 50 0 h .6626 g 3525 3077 N -50 0 0 33 50 0 h .6653 g 3525 3110 N -50 0 0 34 50 0 h .668 g 3525 3144 N -50 0 0 33 50 0 h .6707 g 3525 3177 N -50 0 0 34 50 0 h .6734 g 3525 3211 N -50 0 0 34 50 0 h .676 g 3525 3245 N -50 0 0 33 50 0 h .6787 g 3525 3278 N -50 0 0 34 50 0 h .6814 g 3525 3312 N -50 0 0 33 50 0 h .6841 g 3525 3345 N -50 0 0 34 50 0 h .6868 g 3525 3379 N -50 0 0 33 50 0 h .6894 g 3525 3412 N -50 0 0 34 50 0 h .6921 g 3525 3446 N -50 0 0 34 50 0 h .6948 g 3525 3480 N -50 0 0 33 50 0 h .6975 g 3525 3513 N -50 0 0 34 50 0 h .7001 g 3525 3547 N -50 0 0 33 50 0 h .7028 g 3525 3580 N -50 0 0 34 50 0 h .7055 g 3525 3614 N -50 0 0 34 50 0 h .7082 g 3525 3648 N -50 0 0 33 50 0 h .7109 g 3525 3681 N -50 0 0 34 50 0 h .7135 g 3525 3715 N -50 0 0 33 50 0 h .7162 g 3525 3748 N -50 0 0 34 50 0 h .7189 g 3525 3782 N -50 0 0 34 50 0 h .7216 g 3525 3816 N -50 0 0 33 50 0 h .7243 g 3525 3849 N -50 0 0 34 50 0 h .7269 g 3525 3883 N -50 0 0 33 50 0 h .7296 g 3525 3916 N -50 0 0 34 50 0 h .7323 g 3525 3950 N -50 0 0 33 50 0 h .735 g 3525 3983 N -50 0 0 34 50 0 h .7376 g 3525 4017 N -50 0 0 34 50 0 h .7403 g 3525 4051 N -50 0 0 33 50 0 h .743 g 3525 4084 N -50 0 0 34 50 0 h .7457 g 3525 4118 N -50 0 0 33 50 0 h .7484 g 3525 4151 N -50 0 0 34 50 0 h .751 g 3525 4185 N -50 0 0 34 50 0 h .7537 g 3525 4219 N -50 0 0 33 50 0 h .5013 g 3575 928 N -50 0 0 33 50 0 h .5038 g 3575 961 N -50 0 0 34 50 0 h .5063 g 3575 995 N -50 0 0 34 50 0 h .5088 g 3575 1029 N -50 0 0 33 50 0 h .5114 g 3575 1062 N -50 0 0 34 50 0 h .5139 g 3575 1096 N -50 0 0 33 50 0 h .5164 g 3575 1129 N -50 0 0 34 50 0 h .5189 g 3575 1163 N -50 0 0 34 50 0 h .5215 g 3575 1197 N -50 0 0 33 50 0 h .524 g 3575 1230 N -50 0 0 34 50 0 h .5265 g 3575 1264 N -50 0 0 33 50 0 h .529 g 3575 1297 N -50 0 0 34 50 0 h .5316 g 3575 1331 N -50 0 0 33 50 0 h .5341 g 3575 1364 N -50 0 0 34 50 0 h .5366 g 3575 1398 N -50 0 0 34 50 0 h .5391 g 3575 1432 N -50 0 0 33 50 0 h .5417 g 3575 1465 N -50 0 0 34 50 0 h .5442 g 3575 1499 N -50 0 0 33 50 0 h .5467 g 3575 1532 N -50 0 0 34 50 0 h .5492 g 3575 1566 N -50 0 0 34 50 0 h .5518 g 3575 1600 N -50 0 0 33 50 0 h .5543 g 3575 1633 N -50 0 0 34 50 0 h .5568 g 3575 1667 N -50 0 0 33 50 0 h .5593 g 3575 1700 N -50 0 0 34 50 0 h .5619 g 3575 1734 N -50 0 0 34 50 0 h .5644 g 3575 1768 N -50 0 0 33 50 0 h .5669 g 3575 1801 N -50 0 0 34 50 0 h .5694 g 3575 1835 N -50 0 0 33 50 0 h .572 g 3575 1868 N -50 0 0 34 50 0 h .5745 g 3575 1902 N -50 0 0 33 50 0 h .577 g 3575 1935 N -50 0 0 34 50 0 h .5795 g 3575 1969 N -50 0 0 34 50 0 h .5821 g 3575 2003 N -50 0 0 33 50 0 h .5846 g 3575 2036 N -50 0 0 34 50 0 h .5871 g 3575 2070 N -50 0 0 33 50 0 h .5896 g 3575 2103 N -50 0 0 34 50 0 h .5922 g 3575 2137 N -50 0 0 34 50 0 h .5947 g 3575 2171 N -50 0 0 33 50 0 h .5972 g 3575 2204 N -50 0 0 34 50 0 h .5997 g 3575 2238 N -50 0 0 33 50 0 h .6023 g 3575 2271 N -50 0 0 34 50 0 h .6048 g 3575 2305 N -50 0 0 34 50 0 h .6073 g 3575 2339 N -50 0 0 33 50 0 h .6098 g 3575 2372 N -50 0 0 34 50 0 h .6124 g 3575 2406 N -50 0 0 33 50 0 h .6149 g 3575 2439 N -50 0 0 34 50 0 h .6174 g 3575 2473 N -50 0 0 34 50 0 h .6199 g 3575 2507 N -50 0 0 33 50 0 h .6225 g 3575 2540 N -50 0 0 34 50 0 h .625 g 3575 2574 N -50 0 0 32 50 0 h .6275 g 3575 2606 N -50 0 0 34 50 0 h .6301 g 3575 2640 N -50 0 0 33 50 0 h .6326 g 3575 2673 N -50 0 0 34 50 0 h .6351 g 3575 2707 N -50 0 0 34 50 0 h .6376 g 3575 2741 N -50 0 0 33 50 0 h .6402 g 3575 2774 N -50 0 0 34 50 0 h .6427 g 3575 2808 N -50 0 0 33 50 0 h .6452 g 3575 2841 N -50 0 0 34 50 0 h .6477 g 3575 2875 N -50 0 0 34 50 0 h .6503 g 3575 2909 N -50 0 0 33 50 0 h .6528 g 3575 2942 N -50 0 0 34 50 0 h .6553 g 3575 2976 N -50 0 0 33 50 0 h .6578 g 3575 3009 N -50 0 0 34 50 0 h .6604 g 3575 3043 N -50 0 0 34 50 0 h .6629 g 3575 3077 N -50 0 0 33 50 0 h .6654 g 3575 3110 N -50 0 0 34 50 0 h .6679 g 3575 3144 N -50 0 0 33 50 0 h .6705 g 3575 3177 N -50 0 0 34 50 0 h .673 g 3575 3211 N -50 0 0 34 50 0 h .6755 g 3575 3245 N -50 0 0 33 50 0 h .678 g 3575 3278 N -50 0 0 34 50 0 h .6806 g 3575 3312 N -50 0 0 33 50 0 h .6831 g 3575 3345 N -50 0 0 34 50 0 h .6856 g 3575 3379 N -50 0 0 33 50 0 h .6881 g 3575 3412 N -50 0 0 34 50 0 h .6907 g 3575 3446 N -50 0 0 34 50 0 h .6932 g 3575 3480 N -50 0 0 33 50 0 h .6957 g 3575 3513 N -50 0 0 34 50 0 h .6982 g 3575 3547 N -50 0 0 33 50 0 h .7008 g 3575 3580 N -50 0 0 34 50 0 h .7033 g 3575 3614 N -50 0 0 34 50 0 h .7058 g 3575 3648 N -50 0 0 33 50 0 h .7083 g 3575 3681 N -50 0 0 34 50 0 h .7109 g 3575 3715 N -50 0 0 33 50 0 h .7134 g 3575 3748 N -50 0 0 34 50 0 h .7159 g 3575 3782 N -50 0 0 34 50 0 h .7184 g 3575 3816 N -50 0 0 33 50 0 h .721 g 3575 3849 N -50 0 0 34 50 0 h .7235 g 3575 3883 N -50 0 0 33 50 0 h .726 g 3575 3916 N -50 0 0 34 50 0 h .7285 g 3575 3950 N -50 0 0 33 50 0 h .7311 g 3575 3983 N -50 0 0 34 50 0 h .7336 g 3575 4017 N -50 0 0 34 50 0 h .7361 g 3575 4051 N -50 0 0 33 50 0 h .7386 g 3575 4084 N -50 0 0 34 50 0 h .7412 g 3575 4118 N -50 0 0 33 50 0 h .7437 g 3575 4151 N -50 0 0 34 50 0 h .7462 g 3575 4185 N -50 0 0 34 50 0 h .7487 g 3575 4219 N -50 0 0 33 50 0 h .5113 g 3625 928 N -50 0 0 33 50 0 h .5137 g 3625 961 N -50 0 0 34 50 0 h .516 g 3625 995 N -50 0 0 34 50 0 h .5184 g 3625 1029 N -50 0 0 33 50 0 h .5208 g 3625 1062 N -50 0 0 34 50 0 h .5231 g 3625 1096 N -50 0 0 33 50 0 h .5255 g 3625 1129 N -50 0 0 34 50 0 h .5279 g 3625 1163 N -50 0 0 34 50 0 h .5303 g 3625 1197 N -50 0 0 33 50 0 h .5326 g 3625 1230 N -50 0 0 34 50 0 h .535 g 3625 1264 N -50 0 0 33 50 0 h .5374 g 3625 1297 N -50 0 0 34 50 0 h .5398 g 3625 1331 N -50 0 0 33 50 0 h .5421 g 3625 1364 N -50 0 0 34 50 0 h .5445 g 3625 1398 N -50 0 0 34 50 0 h .5469 g 3625 1432 N -50 0 0 33 50 0 h .5492 g 3625 1465 N -50 0 0 34 50 0 h .5516 g 3625 1499 N -50 0 0 33 50 0 h .554 g 3625 1532 N -50 0 0 34 50 0 h .5564 g 3625 1566 N -50 0 0 34 50 0 h .5587 g 3625 1600 N -50 0 0 33 50 0 h .5611 g 3625 1633 N -50 0 0 34 50 0 h .5635 g 3625 1667 N -50 0 0 33 50 0 h .5658 g 3625 1700 N -50 0 0 34 50 0 h .5682 g 3625 1734 N -50 0 0 34 50 0 h .5706 g 3625 1768 N -50 0 0 33 50 0 h .573 g 3625 1801 N -50 0 0 34 50 0 h .5753 g 3625 1835 N -50 0 0 33 50 0 h .5777 g 3625 1868 N -50 0 0 34 50 0 h .5801 g 3625 1902 N -50 0 0 33 50 0 h .5825 g 3625 1935 N -50 0 0 34 50 0 h .5848 g 3625 1969 N -50 0 0 34 50 0 h .5872 g 3625 2003 N -50 0 0 33 50 0 h .5896 g 3625 2036 N -50 0 0 34 50 0 h .5919 g 3625 2070 N -50 0 0 33 50 0 h .5943 g 3625 2103 N -50 0 0 34 50 0 h .5967 g 3625 2137 N -50 0 0 34 50 0 h .5991 g 3625 2171 N -50 0 0 33 50 0 h .6014 g 3625 2204 N -50 0 0 34 50 0 h .6038 g 3625 2238 N -50 0 0 33 50 0 h .6062 g 3625 2271 N -50 0 0 34 50 0 h .6085 g 3625 2305 N -50 0 0 34 50 0 h .6109 g 3625 2339 N -50 0 0 33 50 0 h .6133 g 3625 2372 N -50 0 0 34 50 0 h .6157 g 3625 2406 N -50 0 0 33 50 0 h .618 g 3625 2439 N -50 0 0 34 50 0 h .6204 g 3625 2473 N -50 0 0 34 50 0 h .6228 g 3625 2507 N -50 0 0 33 50 0 h .6252 g 3625 2540 N -50 0 0 34 50 0 h .6275 g 3625 2574 N -50 0 0 32 50 0 h .6299 g 3625 2606 N -50 0 0 34 50 0 h .6323 g 3625 2640 N -50 0 0 33 50 0 h .6346 g 3625 2673 N -50 0 0 34 50 0 h .637 g 3625 2707 N -50 0 0 34 50 0 h .6394 g 3625 2741 N -50 0 0 33 50 0 h .6418 g 3625 2774 N -50 0 0 34 50 0 h .6441 g 3625 2808 N -50 0 0 33 50 0 h .6465 g 3625 2841 N -50 0 0 34 50 0 h .6489 g 3625 2875 N -50 0 0 34 50 0 h .6512 g 3625 2909 N -50 0 0 33 50 0 h .6536 g 3625 2942 N -50 0 0 34 50 0 h .656 g 3625 2976 N -50 0 0 33 50 0 h .6584 g 3625 3009 N -50 0 0 34 50 0 h .6607 g 3625 3043 N -50 0 0 34 50 0 h .6631 g 3625 3077 N -50 0 0 33 50 0 h .6655 g 3625 3110 N -50 0 0 34 50 0 h .6679 g 3625 3144 N -50 0 0 33 50 0 h .6702 g 3625 3177 N -50 0 0 34 50 0 h .6726 g 3625 3211 N -50 0 0 34 50 0 h .675 g 3625 3245 N -50 0 0 33 50 0 h .6773 g 3625 3278 N -50 0 0 34 50 0 h .6797 g 3625 3312 N -50 0 0 33 50 0 h .6821 g 3625 3345 N -50 0 0 34 50 0 h .6845 g 3625 3379 N -50 0 0 33 50 0 h .6868 g 3625 3412 N -50 0 0 34 50 0 h .6892 g 3625 3446 N -50 0 0 34 50 0 h .6916 g 3625 3480 N -50 0 0 33 50 0 h .6939 g 3625 3513 N -50 0 0 34 50 0 h .6963 g 3625 3547 N -50 0 0 33 50 0 h .6987 g 3625 3580 N -50 0 0 34 50 0 h .7011 g 3625 3614 N -50 0 0 34 50 0 h .7034 g 3625 3648 N -50 0 0 33 50 0 h .7058 g 3625 3681 N -50 0 0 34 50 0 h .7082 g 3625 3715 N -50 0 0 33 50 0 h .7106 g 3625 3748 N -50 0 0 34 50 0 h .7129 g 3625 3782 N -50 0 0 34 50 0 h .7153 g 3625 3816 N -50 0 0 33 50 0 h .7177 g 3625 3849 N -50 0 0 34 50 0 h .72 g 3625 3883 N -50 0 0 33 50 0 h .7224 g 3625 3916 N -50 0 0 34 50 0 h .7248 g 3625 3950 N -50 0 0 33 50 0 h .7272 g 3625 3983 N -50 0 0 34 50 0 h .7295 g 3625 4017 N -50 0 0 34 50 0 h .7319 g 3625 4051 N -50 0 0 33 50 0 h .7343 g 3625 4084 N -50 0 0 34 50 0 h .7366 g 3625 4118 N -50 0 0 33 50 0 h .739 g 3625 4151 N -50 0 0 34 50 0 h .7414 g 3625 4185 N -50 0 0 34 50 0 h .7438 g 3625 4219 N -50 0 0 33 50 0 h .5213 g 3675 928 N -51 0 0 33 51 0 h .5235 g 3675 961 N -51 0 0 34 51 0 h .5258 g 3675 995 N -51 0 0 34 51 0 h .528 g 3675 1029 N -51 0 0 33 51 0 h .5302 g 3675 1062 N -51 0 0 34 51 0 h .5324 g 3675 1096 N -51 0 0 33 51 0 h .5346 g 3675 1129 N -51 0 0 34 51 0 h .5368 g 3675 1163 N -51 0 0 34 51 0 h .5391 g 3675 1197 N -51 0 0 33 51 0 h .5413 g 3675 1230 N -51 0 0 34 51 0 h .5435 g 3675 1264 N -51 0 0 33 51 0 h .5457 g 3675 1297 N -51 0 0 34 51 0 h .5479 g 3675 1331 N -51 0 0 33 51 0 h .5502 g 3675 1364 N -51 0 0 34 51 0 h .5524 g 3675 1398 N -51 0 0 34 51 0 h .5546 g 3675 1432 N -51 0 0 33 51 0 h .5568 g 3675 1465 N -51 0 0 34 51 0 h .559 g 3675 1499 N -51 0 0 33 51 0 h .5613 g 3675 1532 N -51 0 0 34 51 0 h .5635 g 3675 1566 N -51 0 0 34 51 0 h .5657 g 3675 1600 N -51 0 0 33 51 0 h .5679 g 3675 1633 N -51 0 0 34 51 0 h .5701 g 3675 1667 N -51 0 0 33 51 0 h .5724 g 3675 1700 N -51 0 0 34 51 0 h .5746 g 3675 1734 N -51 0 0 34 51 0 h .5768 g 3675 1768 N -51 0 0 33 51 0 h .579 g 3675 1801 N -51 0 0 34 51 0 h .5812 g 3675 1835 N -51 0 0 33 51 0 h .5834 g 3675 1868 N -51 0 0 34 51 0 h .5857 g 3675 1902 N -51 0 0 33 51 0 h .5879 g 3675 1935 N -51 0 0 34 51 0 h .5901 g 3675 1969 N -51 0 0 34 51 0 h .5923 g 3675 2003 N -51 0 0 33 51 0 h .5945 g 3675 2036 N -51 0 0 34 51 0 h .5968 g 3675 2070 N -51 0 0 33 51 0 h .599 g 3675 2103 N -51 0 0 34 51 0 h .6012 g 3675 2137 N -51 0 0 34 51 0 h .6034 g 3675 2171 N -51 0 0 33 51 0 h .6056 g 3675 2204 N -51 0 0 34 51 0 h .6079 g 3675 2238 N -51 0 0 33 51 0 h .6101 g 3675 2271 N -51 0 0 34 51 0 h .6123 g 3675 2305 N -51 0 0 34 51 0 h .6145 g 3675 2339 N -51 0 0 33 51 0 h .6167 g 3675 2372 N -51 0 0 34 51 0 h .619 g 3675 2406 N -51 0 0 33 51 0 h .6212 g 3675 2439 N -51 0 0 34 51 0 h .6234 g 3675 2473 N -51 0 0 34 51 0 h .6256 g 3675 2507 N -51 0 0 33 51 0 h .6278 g 3675 2540 N -51 0 0 34 51 0 h .6301 g 3675 2574 N -51 0 0 32 51 0 h .6323 g 3675 2606 N -51 0 0 34 51 0 h .6345 g 3675 2640 N -51 0 0 33 51 0 h .6367 g 3675 2673 N -51 0 0 34 51 0 h .6389 g 3675 2707 N -51 0 0 34 51 0 h .6411 g 3675 2741 N -51 0 0 33 51 0 h .6434 g 3675 2774 N -51 0 0 34 51 0 h .6456 g 3675 2808 N -51 0 0 33 51 0 h .6478 g 3675 2841 N -51 0 0 34 51 0 h .65 g 3675 2875 N -51 0 0 34 51 0 h .6522 g 3675 2909 N -51 0 0 33 51 0 h .6545 g 3675 2942 N -51 0 0 34 51 0 h .6567 g 3675 2976 N -51 0 0 33 51 0 h .6589 g 3675 3009 N -51 0 0 34 51 0 h .6611 g 3675 3043 N -51 0 0 34 51 0 h .6633 g 3675 3077 N -51 0 0 33 51 0 h .6656 g 3675 3110 N -51 0 0 34 51 0 h .6678 g 3675 3144 N -51 0 0 33 51 0 h .67 g 3675 3177 N -51 0 0 34 51 0 h .6722 g 3675 3211 N -51 0 0 34 51 0 h .6744 g 3675 3245 N -51 0 0 33 51 0 h .6767 g 3675 3278 N -51 0 0 34 51 0 h .6789 g 3675 3312 N -51 0 0 33 51 0 h .6811 g 3675 3345 N -51 0 0 34 51 0 h .6833 g 3675 3379 N -51 0 0 33 51 0 h .6855 g 3675 3412 N -51 0 0 34 51 0 h .6877 g 3675 3446 N -51 0 0 34 51 0 h .69 g 3675 3480 N -51 0 0 33 51 0 h .6922 g 3675 3513 N -51 0 0 34 51 0 h .6944 g 3675 3547 N -51 0 0 33 51 0 h .6966 g 3675 3580 N -51 0 0 34 51 0 h .6988 g 3675 3614 N -51 0 0 34 51 0 h .7011 g 3675 3648 N -51 0 0 33 51 0 h .7033 g 3675 3681 N -51 0 0 34 51 0 h .7055 g 3675 3715 N -51 0 0 33 51 0 h .7077 g 3675 3748 N -51 0 0 34 51 0 h .7099 g 3675 3782 N -51 0 0 34 51 0 h .7122 g 3675 3816 N -51 0 0 33 51 0 h .7144 g 3675 3849 N -51 0 0 34 51 0 h .7166 g 3675 3883 N -51 0 0 33 51 0 h .7188 g 3675 3916 N -51 0 0 34 51 0 h .721 g 3675 3950 N -51 0 0 33 51 0 h .7233 g 3675 3983 N -51 0 0 34 51 0 h .7255 g 3675 4017 N -51 0 0 34 51 0 h .7277 g 3675 4051 N -51 0 0 33 51 0 h .7299 g 3675 4084 N -51 0 0 34 51 0 h .7321 g 3675 4118 N -51 0 0 33 51 0 h .7344 g 3675 4151 N -51 0 0 34 51 0 h .7366 g 3675 4185 N -51 0 0 34 51 0 h .7388 g 3675 4219 N -51 0 0 33 51 0 h .5313 g 3726 928 N -50 0 0 33 50 0 h .5334 g 3726 961 N -50 0 0 34 50 0 h .5355 g 3726 995 N -50 0 0 34 50 0 h .5375 g 3726 1029 N -50 0 0 33 50 0 h .5396 g 3726 1062 N -50 0 0 34 50 0 h .5417 g 3726 1096 N -50 0 0 33 50 0 h .5437 g 3726 1129 N -50 0 0 34 50 0 h .5458 g 3726 1163 N -50 0 0 34 50 0 h .5479 g 3726 1197 N -50 0 0 33 50 0 h .5499 g 3726 1230 N -50 0 0 34 50 0 h .552 g 3726 1264 N -50 0 0 33 50 0 h .5541 g 3726 1297 N -50 0 0 34 50 0 h .5561 g 3726 1331 N -50 0 0 33 50 0 h .5582 g 3726 1364 N -50 0 0 34 50 0 h .5603 g 3726 1398 N -50 0 0 34 50 0 h .5623 g 3726 1432 N -50 0 0 33 50 0 h .5644 g 3726 1465 N -50 0 0 34 50 0 h .5665 g 3726 1499 N -50 0 0 33 50 0 h .5685 g 3726 1532 N -50 0 0 34 50 0 h .5706 g 3726 1566 N -50 0 0 34 50 0 h .5727 g 3726 1600 N -50 0 0 33 50 0 h .5747 g 3726 1633 N -50 0 0 34 50 0 h .5768 g 3726 1667 N -50 0 0 33 50 0 h .5789 g 3726 1700 N -50 0 0 34 50 0 h .5809 g 3726 1734 N -50 0 0 34 50 0 h .583 g 3726 1768 N -50 0 0 33 50 0 h .5851 g 3726 1801 N -50 0 0 34 50 0 h .5871 g 3726 1835 N -50 0 0 33 50 0 h .5892 g 3726 1868 N -50 0 0 34 50 0 h .5913 g 3726 1902 N -50 0 0 33 50 0 h .5933 g 3726 1935 N -50 0 0 34 50 0 h .5954 g 3726 1969 N -50 0 0 34 50 0 h .5975 g 3726 2003 N -50 0 0 33 50 0 h .5995 g 3726 2036 N -50 0 0 34 50 0 h .6016 g 3726 2070 N -50 0 0 33 50 0 h .6037 g 3726 2103 N -50 0 0 34 50 0 h .6057 g 3726 2137 N -50 0 0 34 50 0 h .6078 g 3726 2171 N -50 0 0 33 50 0 h .6098 g 3726 2204 N -50 0 0 34 50 0 h .6119 g 3726 2238 N -50 0 0 33 50 0 h .614 g 3726 2271 N -50 0 0 34 50 0 h .616 g 3726 2305 N -50 0 0 34 50 0 h .6181 g 3726 2339 N -50 0 0 33 50 0 h .6202 g 3726 2372 N -50 0 0 34 50 0 h .6222 g 3726 2406 N -50 0 0 33 50 0 h .6243 g 3726 2439 N -50 0 0 34 50 0 h .6264 g 3726 2473 N -50 0 0 34 50 0 h .6284 g 3726 2507 N -50 0 0 33 50 0 h .6305 g 3726 2540 N -50 0 0 34 50 0 h .6326 g 3726 2574 N -50 0 0 32 50 0 h .6346 g 3726 2606 N -50 0 0 34 50 0 h .6367 g 3726 2640 N -50 0 0 33 50 0 h .6388 g 3726 2673 N -50 0 0 34 50 0 h .6408 g 3726 2707 N -50 0 0 34 50 0 h .6429 g 3726 2741 N -50 0 0 33 50 0 h .645 g 3726 2774 N -50 0 0 34 50 0 h .647 g 3726 2808 N -50 0 0 33 50 0 h .6491 g 3726 2841 N -50 0 0 34 50 0 h .6512 g 3726 2875 N -50 0 0 34 50 0 h .6532 g 3726 2909 N -50 0 0 33 50 0 h .6553 g 3726 2942 N -50 0 0 34 50 0 h .6574 g 3726 2976 N -50 0 0 33 50 0 h .6594 g 3726 3009 N -50 0 0 34 50 0 h .6615 g 3726 3043 N -50 0 0 34 50 0 h .6636 g 3726 3077 N -50 0 0 33 50 0 h .6656 g 3726 3110 N -50 0 0 34 50 0 h .6677 g 3726 3144 N -50 0 0 33 50 0 h .6698 g 3726 3177 N -50 0 0 34 50 0 h .6718 g 3726 3211 N -50 0 0 34 50 0 h .6739 g 3726 3245 N -50 0 0 33 50 0 h .676 g 3726 3278 N -50 0 0 34 50 0 h .678 g 3726 3312 N -50 0 0 33 50 0 h .6801 g 3726 3345 N -50 0 0 34 50 0 h .6822 g 3726 3379 N -50 0 0 33 50 0 h .6842 g 3726 3412 N -50 0 0 34 50 0 h .6863 g 3726 3446 N -50 0 0 34 50 0 h .6884 g 3726 3480 N -50 0 0 33 50 0 h .6904 g 3726 3513 N -50 0 0 34 50 0 h .6925 g 3726 3547 N -50 0 0 33 50 0 h .6946 g 3726 3580 N -50 0 0 34 50 0 h .6966 g 3726 3614 N -50 0 0 34 50 0 h .6987 g 3726 3648 N -50 0 0 33 50 0 h .7008 g 3726 3681 N -50 0 0 34 50 0 h .7028 g 3726 3715 N -50 0 0 33 50 0 h .7049 g 3726 3748 N -50 0 0 34 50 0 h .707 g 3726 3782 N -50 0 0 34 50 0 h .709 g 3726 3816 N -50 0 0 33 50 0 h .7111 g 3726 3849 N -50 0 0 34 50 0 h .7132 g 3726 3883 N -50 0 0 33 50 0 h .7152 g 3726 3916 N -50 0 0 34 50 0 h .7173 g 3726 3950 N -50 0 0 33 50 0 h .7194 g 3726 3983 N -50 0 0 34 50 0 h .7214 g 3726 4017 N -50 0 0 34 50 0 h .7235 g 3726 4051 N -50 0 0 33 50 0 h .7256 g 3726 4084 N -50 0 0 34 50 0 h .7276 g 3726 4118 N -50 0 0 33 50 0 h .7297 g 3726 4151 N -50 0 0 34 50 0 h .7317 g 3726 4185 N -50 0 0 34 50 0 h .7338 g 3726 4219 N -50 0 0 33 50 0 h .5414 g 3776 928 N -51 0 0 33 51 0 h .5433 g 3776 961 N -51 0 0 34 51 0 h .5452 g 3776 995 N -51 0 0 34 51 0 h .5471 g 3776 1029 N -51 0 0 33 51 0 h .549 g 3776 1062 N -51 0 0 34 51 0 h .5509 g 3776 1096 N -51 0 0 33 51 0 h .5528 g 3776 1129 N -51 0 0 34 51 0 h .5548 g 3776 1163 N -51 0 0 34 51 0 h .5567 g 3776 1197 N -51 0 0 33 51 0 h .5586 g 3776 1230 N -51 0 0 34 51 0 h .5605 g 3776 1264 N -51 0 0 33 51 0 h .5624 g 3776 1297 N -51 0 0 34 51 0 h .5643 g 3776 1331 N -51 0 0 33 51 0 h .5662 g 3776 1364 N -51 0 0 34 51 0 h .5681 g 3776 1398 N -51 0 0 34 51 0 h .5701 g 3776 1432 N -51 0 0 33 51 0 h .572 g 3776 1465 N -51 0 0 34 51 0 h .5739 g 3776 1499 N -51 0 0 33 51 0 h .5758 g 3776 1532 N -51 0 0 34 51 0 h .5777 g 3776 1566 N -51 0 0 34 51 0 h .5796 g 3776 1600 N -51 0 0 33 51 0 h .5815 g 3776 1633 N -51 0 0 34 51 0 h .5834 g 3776 1667 N -51 0 0 33 51 0 h .5854 g 3776 1700 N -51 0 0 34 51 0 h .5873 g 3776 1734 N -51 0 0 34 51 0 h .5892 g 3776 1768 N -51 0 0 33 51 0 h .5911 g 3776 1801 N -51 0 0 34 51 0 h .593 g 3776 1835 N -51 0 0 33 51 0 h .5949 g 3776 1868 N -51 0 0 34 51 0 h .5968 g 3776 1902 N -51 0 0 33 51 0 h .5988 g 3776 1935 N -51 0 0 34 51 0 h .6007 g 3776 1969 N -51 0 0 34 51 0 h .6026 g 3776 2003 N -51 0 0 33 51 0 h .6045 g 3776 2036 N -51 0 0 34 51 0 h .6064 g 3776 2070 N -51 0 0 33 51 0 h .6083 g 3776 2103 N -51 0 0 34 51 0 h .6102 g 3776 2137 N -51 0 0 34 51 0 h .6121 g 3776 2171 N -51 0 0 33 51 0 h .6141 g 3776 2204 N -51 0 0 34 51 0 h .616 g 3776 2238 N -51 0 0 33 51 0 h .6179 g 3776 2271 N -51 0 0 34 51 0 h .6198 g 3776 2305 N -51 0 0 34 51 0 h .6217 g 3776 2339 N -51 0 0 33 51 0 h .6236 g 3776 2372 N -51 0 0 34 51 0 h .6255 g 3776 2406 N -51 0 0 33 51 0 h .6274 g 3776 2439 N -51 0 0 34 51 0 h .6294 g 3776 2473 N -51 0 0 34 51 0 h .6313 g 3776 2507 N -51 0 0 33 51 0 h .6332 g 3776 2540 N -51 0 0 34 51 0 h .6351 g 3776 2574 N -51 0 0 32 51 0 h .637 g 3776 2606 N -51 0 0 34 51 0 h .6389 g 3776 2640 N -51 0 0 33 51 0 h .6408 g 3776 2673 N -51 0 0 34 51 0 h .6428 g 3776 2707 N -51 0 0 34 51 0 h .6447 g 3776 2741 N -51 0 0 33 51 0 h .6466 g 3776 2774 N -51 0 0 34 51 0 h .6485 g 3776 2808 N -51 0 0 33 51 0 h .6504 g 3776 2841 N -51 0 0 34 51 0 h .6523 g 3776 2875 N -51 0 0 34 51 0 h .6542 g 3776 2909 N -51 0 0 33 51 0 h .6561 g 3776 2942 N -51 0 0 34 51 0 h .6581 g 3776 2976 N -51 0 0 33 51 0 h .66 g 3776 3009 N -51 0 0 34 51 0 h .6619 g 3776 3043 N -51 0 0 34 51 0 h .6638 g 3776 3077 N -51 0 0 33 51 0 h .6657 g 3776 3110 N -51 0 0 34 51 0 h .6676 g 3776 3144 N -51 0 0 33 51 0 h .6695 g 3776 3177 N -51 0 0 34 51 0 h .6714 g 3776 3211 N -51 0 0 34 51 0 h .6734 g 3776 3245 N -51 0 0 33 51 0 h .6753 g 3776 3278 N -51 0 0 34 51 0 h .6772 g 3776 3312 N -51 0 0 33 51 0 h .6791 g 3776 3345 N -51 0 0 34 51 0 h .681 g 3776 3379 N -51 0 0 33 51 0 h .6829 g 3776 3412 N -51 0 0 34 51 0 h .6848 g 3776 3446 N -51 0 0 34 51 0 h .6868 g 3776 3480 N -51 0 0 33 51 0 h .6887 g 3776 3513 N -51 0 0 34 51 0 h .6906 g 3776 3547 N -51 0 0 33 51 0 h .6925 g 3776 3580 N -51 0 0 34 51 0 h .6944 g 3776 3614 N -51 0 0 34 51 0 h .6963 g 3776 3648 N -51 0 0 33 51 0 h .6982 g 3776 3681 N -51 0 0 34 51 0 h .7001 g 3776 3715 N -51 0 0 33 51 0 h .7021 g 3776 3748 N -51 0 0 34 51 0 h .704 g 3776 3782 N -51 0 0 34 51 0 h .7059 g 3776 3816 N -51 0 0 33 51 0 h .7078 g 3776 3849 N -51 0 0 34 51 0 h .7097 g 3776 3883 N -51 0 0 33 51 0 h .7116 g 3776 3916 N -51 0 0 34 51 0 h .7135 g 3776 3950 N -51 0 0 33 51 0 h .7154 g 3776 3983 N -51 0 0 34 51 0 h .7174 g 3776 4017 N -51 0 0 34 51 0 h .7193 g 3776 4051 N -51 0 0 33 51 0 h .7212 g 3776 4084 N -51 0 0 34 51 0 h .7231 g 3776 4118 N -51 0 0 33 51 0 h .725 g 3776 4151 N -51 0 0 34 51 0 h .7269 g 3776 4185 N -51 0 0 34 51 0 h .7288 g 3776 4219 N -51 0 0 33 51 0 h .5514 g 3827 928 N -51 0 0 33 51 0 h .5531 g 3827 961 N -51 0 0 34 51 0 h .5549 g 3827 995 N -51 0 0 34 51 0 h .5567 g 3827 1029 N -51 0 0 33 51 0 h .5584 g 3827 1062 N -51 0 0 34 51 0 h .5602 g 3827 1096 N -51 0 0 33 51 0 h .5619 g 3827 1129 N -51 0 0 34 51 0 h .5637 g 3827 1163 N -51 0 0 34 51 0 h .5655 g 3827 1197 N -51 0 0 33 51 0 h .5672 g 3827 1230 N -51 0 0 34 51 0 h .569 g 3827 1264 N -51 0 0 33 51 0 h .5707 g 3827 1297 N -51 0 0 34 51 0 h .5725 g 3827 1331 N -51 0 0 33 51 0 h .5743 g 3827 1364 N -51 0 0 34 51 0 h .576 g 3827 1398 N -51 0 0 34 51 0 h .5778 g 3827 1432 N -51 0 0 33 51 0 h .5795 g 3827 1465 N -51 0 0 34 51 0 h .5813 g 3827 1499 N -51 0 0 33 51 0 h .5831 g 3827 1532 N -51 0 0 34 51 0 h .5848 g 3827 1566 N -51 0 0 34 51 0 h .5866 g 3827 1600 N -51 0 0 33 51 0 h .5883 g 3827 1633 N -51 0 0 34 51 0 h .5901 g 3827 1667 N -51 0 0 33 51 0 h .5919 g 3827 1700 N -51 0 0 34 51 0 h .5936 g 3827 1734 N -51 0 0 34 51 0 h .5954 g 3827 1768 N -51 0 0 33 51 0 h .5971 g 3827 1801 N -51 0 0 34 51 0 h .5989 g 3827 1835 N -51 0 0 33 51 0 h .6007 g 3827 1868 N -51 0 0 34 51 0 h .6024 g 3827 1902 N -51 0 0 33 51 0 h .6042 g 3827 1935 N -51 0 0 34 51 0 h .6059 g 3827 1969 N -51 0 0 34 51 0 h .6077 g 3827 2003 N -51 0 0 33 51 0 h .6095 g 3827 2036 N -51 0 0 34 51 0 h .6112 g 3827 2070 N -51 0 0 33 51 0 h .613 g 3827 2103 N -51 0 0 34 51 0 h .6147 g 3827 2137 N -51 0 0 34 51 0 h .6165 g 3827 2171 N -51 0 0 33 51 0 h .6183 g 3827 2204 N -51 0 0 34 51 0 h .62 g 3827 2238 N -51 0 0 33 51 0 h .6218 g 3827 2271 N -51 0 0 34 51 0 h .6235 g 3827 2305 N -51 0 0 34 51 0 h .6253 g 3827 2339 N -51 0 0 33 51 0 h .6271 g 3827 2372 N -51 0 0 34 51 0 h .6288 g 3827 2406 N -51 0 0 33 51 0 h .6306 g 3827 2439 N -51 0 0 34 51 0 h .6323 g 3827 2473 N -51 0 0 34 51 0 h .6341 g 3827 2507 N -51 0 0 33 51 0 h .6359 g 3827 2540 N -51 0 0 34 51 0 h .6376 g 3827 2574 N -51 0 0 32 51 0 h .6394 g 3827 2606 N -51 0 0 34 51 0 h .6411 g 3827 2640 N -51 0 0 33 51 0 h .6429 g 3827 2673 N -51 0 0 34 51 0 h .6447 g 3827 2707 N -51 0 0 34 51 0 h .6464 g 3827 2741 N -51 0 0 33 51 0 h .6482 g 3827 2774 N -51 0 0 34 51 0 h .6499 g 3827 2808 N -51 0 0 33 51 0 h .6517 g 3827 2841 N -51 0 0 34 51 0 h .6535 g 3827 2875 N -51 0 0 34 51 0 h .6552 g 3827 2909 N -51 0 0 33 51 0 h .657 g 3827 2942 N -51 0 0 34 51 0 h .6587 g 3827 2976 N -51 0 0 33 51 0 h .6605 g 3827 3009 N -51 0 0 34 51 0 h .6623 g 3827 3043 N -51 0 0 34 51 0 h .664 g 3827 3077 N -51 0 0 33 51 0 h .6658 g 3827 3110 N -51 0 0 34 51 0 h .6675 g 3827 3144 N -51 0 0 33 51 0 h .6693 g 3827 3177 N -51 0 0 34 51 0 h .6711 g 3827 3211 N -51 0 0 34 51 0 h .6728 g 3827 3245 N -51 0 0 33 51 0 h .6746 g 3827 3278 N -51 0 0 34 51 0 h .6763 g 3827 3312 N -51 0 0 33 51 0 h .6781 g 3827 3345 N -51 0 0 34 51 0 h .6799 g 3827 3379 N -51 0 0 33 51 0 h .6816 g 3827 3412 N -51 0 0 34 51 0 h .6834 g 3827 3446 N -51 0 0 34 51 0 h .6851 g 3827 3480 N -51 0 0 33 51 0 h .6869 g 3827 3513 N -51 0 0 34 51 0 h .6887 g 3827 3547 N -51 0 0 33 51 0 h .6904 g 3827 3580 N -51 0 0 34 51 0 h .6922 g 3827 3614 N -51 0 0 34 51 0 h .6939 g 3827 3648 N -51 0 0 33 51 0 h .6957 g 3827 3681 N -51 0 0 34 51 0 h .6975 g 3827 3715 N -51 0 0 33 51 0 h .6992 g 3827 3748 N -51 0 0 34 51 0 h .701 g 3827 3782 N -51 0 0 34 51 0 h .7027 g 3827 3816 N -51 0 0 33 51 0 h .7045 g 3827 3849 N -51 0 0 34 51 0 h .7063 g 3827 3883 N -51 0 0 33 51 0 h .708 g 3827 3916 N -51 0 0 34 51 0 h .7098 g 3827 3950 N -51 0 0 33 51 0 h .7115 g 3827 3983 N -51 0 0 34 51 0 h .7133 g 3827 4017 N -51 0 0 34 51 0 h .7151 g 3827 4051 N -51 0 0 33 51 0 h .7168 g 3827 4084 N -51 0 0 34 51 0 h .7186 g 3827 4118 N -51 0 0 33 51 0 h .7203 g 3827 4151 N -51 0 0 34 51 0 h .7221 g 3827 4185 N -51 0 0 34 51 0 h .7239 g 3827 4219 N -51 0 0 33 51 0 h .5614 g 3878 928 N -50 0 0 33 50 0 h .563 g 3878 961 N -50 0 0 34 50 0 h .5646 g 3878 995 N -50 0 0 34 50 0 h .5662 g 3878 1029 N -50 0 0 33 50 0 h .5678 g 3878 1062 N -50 0 0 34 50 0 h .5694 g 3878 1096 N -50 0 0 33 50 0 h .5711 g 3878 1129 N -50 0 0 34 50 0 h .5727 g 3878 1163 N -50 0 0 34 50 0 h .5743 g 3878 1197 N -50 0 0 33 50 0 h .5759 g 3878 1230 N -50 0 0 34 50 0 h .5775 g 3878 1264 N -50 0 0 33 50 0 h .5791 g 3878 1297 N -50 0 0 34 50 0 h .5807 g 3878 1331 N -50 0 0 33 50 0 h .5823 g 3878 1364 N -50 0 0 34 50 0 h .5839 g 3878 1398 N -50 0 0 34 50 0 h .5855 g 3878 1432 N -50 0 0 33 50 0 h .5871 g 3878 1465 N -50 0 0 34 50 0 h .5887 g 3878 1499 N -50 0 0 33 50 0 h .5903 g 3878 1532 N -50 0 0 34 50 0 h .5919 g 3878 1566 N -50 0 0 34 50 0 h .5935 g 3878 1600 N -50 0 0 33 50 0 h .5952 g 3878 1633 N -50 0 0 34 50 0 h .5968 g 3878 1667 N -50 0 0 33 50 0 h .5984 g 3878 1700 N -50 0 0 34 50 0 h .6 g 3878 1734 N -50 0 0 34 50 0 h .6016 g 3878 1768 N -50 0 0 33 50 0 h .6032 g 3878 1801 N -50 0 0 34 50 0 h .6048 g 3878 1835 N -50 0 0 33 50 0 h .6064 g 3878 1868 N -50 0 0 34 50 0 h .608 g 3878 1902 N -50 0 0 33 50 0 h .6096 g 3878 1935 N -50 0 0 34 50 0 h .6112 g 3878 1969 N -50 0 0 34 50 0 h .6128 g 3878 2003 N -50 0 0 33 50 0 h .6144 g 3878 2036 N -50 0 0 34 50 0 h .616 g 3878 2070 N -50 0 0 33 50 0 h .6177 g 3878 2103 N -50 0 0 34 50 0 h .6193 g 3878 2137 N -50 0 0 34 50 0 h .6209 g 3878 2171 N -50 0 0 33 50 0 h .6225 g 3878 2204 N -50 0 0 34 50 0 h .6241 g 3878 2238 N -50 0 0 33 50 0 h .6257 g 3878 2271 N -50 0 0 34 50 0 h .6273 g 3878 2305 N -50 0 0 34 50 0 h .6289 g 3878 2339 N -50 0 0 33 50 0 h .6305 g 3878 2372 N -50 0 0 34 50 0 h .6321 g 3878 2406 N -50 0 0 33 50 0 h .6337 g 3878 2439 N -50 0 0 34 50 0 h .6353 g 3878 2473 N -50 0 0 34 50 0 h .6369 g 3878 2507 N -50 0 0 33 50 0 h .6385 g 3878 2540 N -50 0 0 34 50 0 h .6402 g 3878 2574 N -50 0 0 32 50 0 h .6418 g 3878 2606 N -50 0 0 34 50 0 h .6434 g 3878 2640 N -50 0 0 33 50 0 h .645 g 3878 2673 N -50 0 0 34 50 0 h .6466 g 3878 2707 N -50 0 0 34 50 0 h .6482 g 3878 2741 N -50 0 0 33 50 0 h .6498 g 3878 2774 N -50 0 0 34 50 0 h .6514 g 3878 2808 N -50 0 0 33 50 0 h .653 g 3878 2841 N -50 0 0 34 50 0 h .6546 g 3878 2875 N -50 0 0 34 50 0 h .6562 g 3878 2909 N -50 0 0 33 50 0 h .6578 g 3878 2942 N -50 0 0 34 50 0 h .6594 g 3878 2976 N -50 0 0 33 50 0 h .661 g 3878 3009 N -50 0 0 34 50 0 h .6626 g 3878 3043 N -50 0 0 34 50 0 h .6643 g 3878 3077 N -50 0 0 33 50 0 h .6659 g 3878 3110 N -50 0 0 34 50 0 h .6675 g 3878 3144 N -50 0 0 33 50 0 h .6691 g 3878 3177 N -50 0 0 34 50 0 h .6707 g 3878 3211 N -50 0 0 34 50 0 h .6723 g 3878 3245 N -50 0 0 33 50 0 h .6739 g 3878 3278 N -50 0 0 34 50 0 h .6755 g 3878 3312 N -50 0 0 33 50 0 h .6771 g 3878 3345 N -50 0 0 34 50 0 h .6787 g 3878 3379 N -50 0 0 33 50 0 h .6803 g 3878 3412 N -50 0 0 34 50 0 h .6819 g 3878 3446 N -50 0 0 34 50 0 h .6835 g 3878 3480 N -50 0 0 33 50 0 h .6851 g 3878 3513 N -50 0 0 34 50 0 h .6868 g 3878 3547 N -50 0 0 33 50 0 h .6884 g 3878 3580 N -50 0 0 34 50 0 h .69 g 3878 3614 N -50 0 0 34 50 0 h .6916 g 3878 3648 N -50 0 0 33 50 0 h .6932 g 3878 3681 N -50 0 0 34 50 0 h .6948 g 3878 3715 N -50 0 0 33 50 0 h .6964 g 3878 3748 N -50 0 0 34 50 0 h .698 g 3878 3782 N -50 0 0 34 50 0 h .6996 g 3878 3816 N -50 0 0 33 50 0 h .7012 g 3878 3849 N -50 0 0 34 50 0 h .7028 g 3878 3883 N -50 0 0 33 50 0 h .7044 g 3878 3916 N -50 0 0 34 50 0 h .706 g 3878 3950 N -50 0 0 33 50 0 h .7076 g 3878 3983 N -50 0 0 34 50 0 h .7093 g 3878 4017 N -50 0 0 34 50 0 h .7109 g 3878 4051 N -50 0 0 33 50 0 h .7125 g 3878 4084 N -50 0 0 34 50 0 h .7141 g 3878 4118 N -50 0 0 33 50 0 h .7157 g 3878 4151 N -50 0 0 34 50 0 h .7173 g 3878 4185 N -50 0 0 34 50 0 h .7189 g 3878 4219 N -50 0 0 33 50 0 h .5714 g 3928 928 N -51 0 0 33 51 0 h .5729 g 3928 961 N -51 0 0 34 51 0 h .5743 g 3928 995 N -51 0 0 34 51 0 h .5758 g 3928 1029 N -51 0 0 33 51 0 h .5772 g 3928 1062 N -51 0 0 34 51 0 h .5787 g 3928 1096 N -51 0 0 33 51 0 h .5802 g 3928 1129 N -51 0 0 34 51 0 h .5816 g 3928 1163 N -51 0 0 34 51 0 h .5831 g 3928 1197 N -51 0 0 33 51 0 h .5845 g 3928 1230 N -51 0 0 34 51 0 h .586 g 3928 1264 N -51 0 0 33 51 0 h .5874 g 3928 1297 N -51 0 0 34 51 0 h .5889 g 3928 1331 N -51 0 0 33 51 0 h .5903 g 3928 1364 N -51 0 0 34 51 0 h .5918 g 3928 1398 N -51 0 0 34 51 0 h .5932 g 3928 1432 N -51 0 0 33 51 0 h .5947 g 3928 1465 N -51 0 0 34 51 0 h .5962 g 3928 1499 N -51 0 0 33 51 0 h .5976 g 3928 1532 N -51 0 0 34 51 0 h .5991 g 3928 1566 N -51 0 0 34 51 0 h .6005 g 3928 1600 N -51 0 0 33 51 0 h .602 g 3928 1633 N -51 0 0 34 51 0 h .6034 g 3928 1667 N -51 0 0 33 51 0 h .6049 g 3928 1700 N -51 0 0 34 51 0 h .6063 g 3928 1734 N -51 0 0 34 51 0 h .6078 g 3928 1768 N -51 0 0 33 51 0 h .6092 g 3928 1801 N -51 0 0 34 51 0 h .6107 g 3928 1835 N -51 0 0 33 51 0 h .6121 g 3928 1868 N -51 0 0 34 51 0 h .6136 g 3928 1902 N -51 0 0 33 51 0 h .6151 g 3928 1935 N -51 0 0 34 51 0 h .6165 g 3928 1969 N -51 0 0 34 51 0 h .618 g 3928 2003 N -51 0 0 33 51 0 h .6194 g 3928 2036 N -51 0 0 34 51 0 h .6209 g 3928 2070 N -51 0 0 33 51 0 h .6223 g 3928 2103 N -51 0 0 34 51 0 h .6238 g 3928 2137 N -51 0 0 34 51 0 h .6252 g 3928 2171 N -51 0 0 33 51 0 h .6267 g 3928 2204 N -51 0 0 34 51 0 h .6281 g 3928 2238 N -51 0 0 33 51 0 h .6296 g 3928 2271 N -51 0 0 34 51 0 h .631 g 3928 2305 N -51 0 0 34 51 0 h .6325 g 3928 2339 N -51 0 0 33 51 0 h .634 g 3928 2372 N -51 0 0 34 51 0 h .6354 g 3928 2406 N -51 0 0 33 51 0 h .6369 g 3928 2439 N -51 0 0 34 51 0 h .6383 g 3928 2473 N -51 0 0 34 51 0 h .6398 g 3928 2507 N -51 0 0 33 51 0 h .6412 g 3928 2540 N -51 0 0 34 51 0 h .6427 g 3928 2574 N -51 0 0 32 51 0 h .6441 g 3928 2606 N -51 0 0 34 51 0 h .6456 g 3928 2640 N -51 0 0 33 51 0 h .647 g 3928 2673 N -51 0 0 34 51 0 h .6485 g 3928 2707 N -51 0 0 34 51 0 h .6499 g 3928 2741 N -51 0 0 33 51 0 h .6514 g 3928 2774 N -51 0 0 34 51 0 h .6529 g 3928 2808 N -51 0 0 33 51 0 h .6543 g 3928 2841 N -51 0 0 34 51 0 h .6558 g 3928 2875 N -51 0 0 34 51 0 h .6572 g 3928 2909 N -51 0 0 33 51 0 h .6587 g 3928 2942 N -51 0 0 34 51 0 h .6601 g 3928 2976 N -51 0 0 33 51 0 h .6616 g 3928 3009 N -51 0 0 34 51 0 h .663 g 3928 3043 N -51 0 0 34 51 0 h .6645 g 3928 3077 N -51 0 0 33 51 0 h .6659 g 3928 3110 N -51 0 0 34 51 0 h .6674 g 3928 3144 N -51 0 0 33 51 0 h .6688 g 3928 3177 N -51 0 0 34 51 0 h .6703 g 3928 3211 N -51 0 0 34 51 0 h .6718 g 3928 3245 N -51 0 0 33 51 0 h .6732 g 3928 3278 N -51 0 0 34 51 0 h .6747 g 3928 3312 N -51 0 0 33 51 0 h .6761 g 3928 3345 N -51 0 0 34 51 0 h .6776 g 3928 3379 N -51 0 0 33 51 0 h .679 g 3928 3412 N -51 0 0 34 51 0 h .6805 g 3928 3446 N -51 0 0 34 51 0 h .6819 g 3928 3480 N -51 0 0 33 51 0 h .6834 g 3928 3513 N -51 0 0 34 51 0 h .6848 g 3928 3547 N -51 0 0 33 51 0 h .6863 g 3928 3580 N -51 0 0 34 51 0 h .6877 g 3928 3614 N -51 0 0 34 51 0 h .6892 g 3928 3648 N -51 0 0 33 51 0 h .6907 g 3928 3681 N -51 0 0 34 51 0 h .6921 g 3928 3715 N -51 0 0 33 51 0 h .6936 g 3928 3748 N -51 0 0 34 51 0 h .695 g 3928 3782 N -51 0 0 34 51 0 h .6965 g 3928 3816 N -51 0 0 33 51 0 h .6979 g 3928 3849 N -51 0 0 34 51 0 h .6994 g 3928 3883 N -51 0 0 33 51 0 h .7008 g 3928 3916 N -51 0 0 34 51 0 h .7023 g 3928 3950 N -51 0 0 33 51 0 h .7037 g 3928 3983 N -51 0 0 34 51 0 h .7052 g 3928 4017 N -51 0 0 34 51 0 h .7066 g 3928 4051 N -51 0 0 33 51 0 h .7081 g 3928 4084 N -51 0 0 34 51 0 h .7096 g 3928 4118 N -51 0 0 33 51 0 h .711 g 3928 4151 N -51 0 0 34 51 0 h .7125 g 3928 4185 N -51 0 0 34 51 0 h .7139 g 3928 4219 N -51 0 0 33 51 0 h .5815 g 3979 928 N -50 0 0 33 50 0 h .5828 g 3979 961 N -50 0 0 34 50 0 h .5841 g 3979 995 N -50 0 0 34 50 0 h .5854 g 3979 1029 N -50 0 0 33 50 0 h .5867 g 3979 1062 N -50 0 0 34 50 0 h .588 g 3979 1096 N -50 0 0 33 50 0 h .5893 g 3979 1129 N -50 0 0 34 50 0 h .5906 g 3979 1163 N -50 0 0 34 50 0 h .5919 g 3979 1197 N -50 0 0 33 50 0 h .5932 g 3979 1230 N -50 0 0 34 50 0 h .5945 g 3979 1264 N -50 0 0 33 50 0 h .5958 g 3979 1297 N -50 0 0 34 50 0 h .5971 g 3979 1331 N -50 0 0 33 50 0 h .5984 g 3979 1364 N -50 0 0 34 50 0 h .5997 g 3979 1398 N -50 0 0 34 50 0 h .601 g 3979 1432 N -50 0 0 33 50 0 h .6023 g 3979 1465 N -50 0 0 34 50 0 h .6036 g 3979 1499 N -50 0 0 33 50 0 h .6049 g 3979 1532 N -50 0 0 34 50 0 h .6062 g 3979 1566 N -50 0 0 34 50 0 h .6075 g 3979 1600 N -50 0 0 33 50 0 h .6088 g 3979 1633 N -50 0 0 34 50 0 h .6101 g 3979 1667 N -50 0 0 33 50 0 h .6114 g 3979 1700 N -50 0 0 34 50 0 h .6127 g 3979 1734 N -50 0 0 34 50 0 h .614 g 3979 1768 N -50 0 0 33 50 0 h .6153 g 3979 1801 N -50 0 0 34 50 0 h .6166 g 3979 1835 N -50 0 0 33 50 0 h .6179 g 3979 1868 N -50 0 0 34 50 0 h .6192 g 3979 1902 N -50 0 0 33 50 0 h .6205 g 3979 1935 N -50 0 0 34 50 0 h .6218 g 3979 1969 N -50 0 0 34 50 0 h .6231 g 3979 2003 N -50 0 0 33 50 0 h .6244 g 3979 2036 N -50 0 0 34 50 0 h .6257 g 3979 2070 N -50 0 0 33 50 0 h .627 g 3979 2103 N -50 0 0 34 50 0 h .6283 g 3979 2137 N -50 0 0 34 50 0 h .6296 g 3979 2171 N -50 0 0 33 50 0 h .6309 g 3979 2204 N -50 0 0 34 50 0 h .6322 g 3979 2238 N -50 0 0 33 50 0 h .6335 g 3979 2271 N -50 0 0 34 50 0 h .6348 g 3979 2305 N -50 0 0 34 50 0 h .6361 g 3979 2339 N -50 0 0 33 50 0 h .6374 g 3979 2372 N -50 0 0 34 50 0 h .6387 g 3979 2406 N -50 0 0 33 50 0 h .64 g 3979 2439 N -50 0 0 34 50 0 h .6413 g 3979 2473 N -50 0 0 34 50 0 h .6426 g 3979 2507 N -50 0 0 33 50 0 h .6439 g 3979 2540 N -50 0 0 34 50 0 h .6452 g 3979 2574 N -50 0 0 32 50 0 h .6465 g 3979 2606 N -50 0 0 34 50 0 h .6478 g 3979 2640 N -50 0 0 33 50 0 h .6491 g 3979 2673 N -50 0 0 34 50 0 h .6504 g 3979 2707 N -50 0 0 34 50 0 h .6517 g 3979 2741 N -50 0 0 33 50 0 h .653 g 3979 2774 N -50 0 0 34 50 0 h .6543 g 3979 2808 N -50 0 0 33 50 0 h .6556 g 3979 2841 N -50 0 0 34 50 0 h .6569 g 3979 2875 N -50 0 0 34 50 0 h .6582 g 3979 2909 N -50 0 0 33 50 0 h .6595 g 3979 2942 N -50 0 0 34 50 0 h .6608 g 3979 2976 N -50 0 0 33 50 0 h .6621 g 3979 3009 N -50 0 0 34 50 0 h .6634 g 3979 3043 N -50 0 0 34 50 0 h .6647 g 3979 3077 N -50 0 0 33 50 0 h .666 g 3979 3110 N -50 0 0 34 50 0 h .6673 g 3979 3144 N -50 0 0 33 50 0 h .6686 g 3979 3177 N -50 0 0 34 50 0 h .6699 g 3979 3211 N -50 0 0 34 50 0 h .6712 g 3979 3245 N -50 0 0 33 50 0 h .6725 g 3979 3278 N -50 0 0 34 50 0 h .6738 g 3979 3312 N -50 0 0 33 50 0 h .6751 g 3979 3345 N -50 0 0 34 50 0 h .6764 g 3979 3379 N -50 0 0 33 50 0 h .6777 g 3979 3412 N -50 0 0 34 50 0 h .679 g 3979 3446 N -50 0 0 34 50 0 h .6803 g 3979 3480 N -50 0 0 33 50 0 h .6816 g 3979 3513 N -50 0 0 34 50 0 h .6829 g 3979 3547 N -50 0 0 33 50 0 h .6842 g 3979 3580 N -50 0 0 34 50 0 h .6855 g 3979 3614 N -50 0 0 34 50 0 h .6868 g 3979 3648 N -50 0 0 33 50 0 h .6881 g 3979 3681 N -50 0 0 34 50 0 h .6894 g 3979 3715 N -50 0 0 33 50 0 h .6907 g 3979 3748 N -50 0 0 34 50 0 h .692 g 3979 3782 N -50 0 0 34 50 0 h .6933 g 3979 3816 N -50 0 0 33 50 0 h .6946 g 3979 3849 N -50 0 0 34 50 0 h .6959 g 3979 3883 N -50 0 0 33 50 0 h .6972 g 3979 3916 N -50 0 0 34 50 0 h .6985 g 3979 3950 N -50 0 0 33 50 0 h .6998 g 3979 3983 N -50 0 0 34 50 0 h .7011 g 3979 4017 N -50 0 0 34 50 0 h .7024 g 3979 4051 N -50 0 0 33 50 0 h .7037 g 3979 4084 N -50 0 0 34 50 0 h .705 g 3979 4118 N -50 0 0 33 50 0 h .7063 g 3979 4151 N -50 0 0 34 50 0 h .7076 g 3979 4185 N -50 0 0 34 50 0 h .7089 g 3979 4219 N -50 0 0 33 50 0 h .5915 g 4029 928 N -51 0 0 33 51 0 h .5926 g 4029 961 N -51 0 0 34 51 0 h .5938 g 4029 995 N -51 0 0 34 51 0 h .5949 g 4029 1029 N -51 0 0 33 51 0 h .5961 g 4029 1062 N -51 0 0 34 51 0 h .5972 g 4029 1096 N -51 0 0 33 51 0 h .5984 g 4029 1129 N -51 0 0 34 51 0 h .5995 g 4029 1163 N -51 0 0 34 51 0 h .6007 g 4029 1197 N -51 0 0 33 51 0 h .6018 g 4029 1230 N -51 0 0 34 51 0 h .603 g 4029 1264 N -51 0 0 33 51 0 h .6041 g 4029 1297 N -51 0 0 34 51 0 h .6053 g 4029 1331 N -51 0 0 33 51 0 h .6064 g 4029 1364 N -51 0 0 34 51 0 h .6076 g 4029 1398 N -51 0 0 34 51 0 h .6087 g 4029 1432 N -51 0 0 33 51 0 h .6098 g 4029 1465 N -51 0 0 34 51 0 h .611 g 4029 1499 N -51 0 0 33 51 0 h .6121 g 4029 1532 N -51 0 0 34 51 0 h .6133 g 4029 1566 N -51 0 0 34 51 0 h .6144 g 4029 1600 N -51 0 0 33 51 0 h .6156 g 4029 1633 N -51 0 0 34 51 0 h .6167 g 4029 1667 N -51 0 0 33 51 0 h .6179 g 4029 1700 N -51 0 0 34 51 0 h .619 g 4029 1734 N -51 0 0 34 51 0 h .6202 g 4029 1768 N -51 0 0 33 51 0 h .6213 g 4029 1801 N -51 0 0 34 51 0 h .6225 g 4029 1835 N -51 0 0 33 51 0 h .6236 g 4029 1868 N -51 0 0 34 51 0 h .6248 g 4029 1902 N -51 0 0 33 51 0 h .6259 g 4029 1935 N -51 0 0 34 51 0 h .6271 g 4029 1969 N -51 0 0 34 51 0 h .6282 g 4029 2003 N -51 0 0 33 51 0 h .6294 g 4029 2036 N -51 0 0 34 51 0 h .6305 g 4029 2070 N -51 0 0 33 51 0 h .6317 g 4029 2103 N -51 0 0 34 51 0 h .6328 g 4029 2137 N -51 0 0 34 51 0 h .634 g 4029 2171 N -51 0 0 33 51 0 h .6351 g 4029 2204 N -51 0 0 34 51 0 h .6362 g 4029 2238 N -51 0 0 33 51 0 h .6374 g 4029 2271 N -51 0 0 34 51 0 h .6385 g 4029 2305 N -51 0 0 34 51 0 h .6397 g 4029 2339 N -51 0 0 33 51 0 h .6408 g 4029 2372 N -51 0 0 34 51 0 h .642 g 4029 2406 N -51 0 0 33 51 0 h .6431 g 4029 2439 N -51 0 0 34 51 0 h .6443 g 4029 2473 N -51 0 0 34 51 0 h .6454 g 4029 2507 N -51 0 0 33 51 0 h .6466 g 4029 2540 N -51 0 0 34 51 0 h .6477 g 4029 2574 N -51 0 0 32 51 0 h .6489 g 4029 2606 N -51 0 0 34 51 0 h .65 g 4029 2640 N -51 0 0 33 51 0 h .6512 g 4029 2673 N -51 0 0 34 51 0 h .6523 g 4029 2707 N -51 0 0 34 51 0 h .6535 g 4029 2741 N -51 0 0 33 51 0 h .6546 g 4029 2774 N -51 0 0 34 51 0 h .6558 g 4029 2808 N -51 0 0 33 51 0 h .6569 g 4029 2841 N -51 0 0 34 51 0 h .6581 g 4029 2875 N -51 0 0 34 51 0 h .6592 g 4029 2909 N -51 0 0 33 51 0 h .6604 g 4029 2942 N -51 0 0 34 51 0 h .6615 g 4029 2976 N -51 0 0 33 51 0 h .6626 g 4029 3009 N -51 0 0 34 51 0 h .6638 g 4029 3043 N -51 0 0 34 51 0 h .6649 g 4029 3077 N -51 0 0 33 51 0 h .6661 g 4029 3110 N -51 0 0 34 51 0 h .6672 g 4029 3144 N -51 0 0 33 51 0 h .6684 g 4029 3177 N -51 0 0 34 51 0 h .6695 g 4029 3211 N -51 0 0 34 51 0 h .6707 g 4029 3245 N -51 0 0 33 51 0 h .6718 g 4029 3278 N -51 0 0 34 51 0 h .673 g 4029 3312 N -51 0 0 33 51 0 h .6741 g 4029 3345 N -51 0 0 34 51 0 h .6753 g 4029 3379 N -51 0 0 33 51 0 h .6764 g 4029 3412 N -51 0 0 34 51 0 h .6776 g 4029 3446 N -51 0 0 34 51 0 h .6787 g 4029 3480 N -51 0 0 33 51 0 h .6799 g 4029 3513 N -51 0 0 34 51 0 h .681 g 4029 3547 N -51 0 0 33 51 0 h .6822 g 4029 3580 N -51 0 0 34 51 0 h .6833 g 4029 3614 N -51 0 0 34 51 0 h .6845 g 4029 3648 N -51 0 0 33 51 0 h .6856 g 4029 3681 N -51 0 0 34 51 0 h .6868 g 4029 3715 N -51 0 0 33 51 0 h .6879 g 4029 3748 N -51 0 0 34 51 0 h .689 g 4029 3782 N -51 0 0 34 51 0 h .6902 g 4029 3816 N -51 0 0 33 51 0 h .6913 g 4029 3849 N -51 0 0 34 51 0 h .6925 g 4029 3883 N -51 0 0 33 51 0 h .6936 g 4029 3916 N -51 0 0 34 51 0 h .6948 g 4029 3950 N -51 0 0 33 51 0 h .6959 g 4029 3983 N -51 0 0 34 51 0 h .6971 g 4029 4017 N -51 0 0 34 51 0 h .6982 g 4029 4051 N -51 0 0 33 51 0 h .6994 g 4029 4084 N -51 0 0 34 51 0 h .7005 g 4029 4118 N -51 0 0 33 51 0 h .7017 g 4029 4151 N -51 0 0 34 51 0 h .7028 g 4029 4185 N -51 0 0 34 51 0 h .704 g 4029 4219 N -51 0 0 33 51 0 h .6015 g 4080 928 N -50 0 0 33 50 0 h .6025 g 4080 961 N -50 0 0 34 50 0 h .6035 g 4080 995 N -50 0 0 34 50 0 h .6045 g 4080 1029 N -50 0 0 33 50 0 h .6055 g 4080 1062 N -50 0 0 34 50 0 h .6065 g 4080 1096 N -50 0 0 33 50 0 h .6075 g 4080 1129 N -50 0 0 34 50 0 h .6085 g 4080 1163 N -50 0 0 34 50 0 h .6095 g 4080 1197 N -50 0 0 33 50 0 h .6105 g 4080 1230 N -50 0 0 34 50 0 h .6115 g 4080 1264 N -50 0 0 33 50 0 h .6125 g 4080 1297 N -50 0 0 34 50 0 h .6134 g 4080 1331 N -50 0 0 33 50 0 h .6144 g 4080 1364 N -50 0 0 34 50 0 h .6154 g 4080 1398 N -50 0 0 34 50 0 h .6164 g 4080 1432 N -50 0 0 33 50 0 h .6174 g 4080 1465 N -50 0 0 34 50 0 h .6184 g 4080 1499 N -50 0 0 33 50 0 h .6194 g 4080 1532 N -50 0 0 34 50 0 h .6204 g 4080 1566 N -50 0 0 34 50 0 h .6214 g 4080 1600 N -50 0 0 33 50 0 h .6224 g 4080 1633 N -50 0 0 34 50 0 h .6234 g 4080 1667 N -50 0 0 33 50 0 h .6244 g 4080 1700 N -50 0 0 34 50 0 h .6254 g 4080 1734 N -50 0 0 34 50 0 h .6264 g 4080 1768 N -50 0 0 33 50 0 h .6274 g 4080 1801 N -50 0 0 34 50 0 h .6284 g 4080 1835 N -50 0 0 33 50 0 h .6294 g 4080 1868 N -50 0 0 34 50 0 h .6304 g 4080 1902 N -50 0 0 33 50 0 h .6314 g 4080 1935 N -50 0 0 34 50 0 h .6323 g 4080 1969 N -50 0 0 34 50 0 h .6333 g 4080 2003 N -50 0 0 33 50 0 h .6343 g 4080 2036 N -50 0 0 34 50 0 h .6353 g 4080 2070 N -50 0 0 33 50 0 h .6363 g 4080 2103 N -50 0 0 34 50 0 h .6373 g 4080 2137 N -50 0 0 34 50 0 h .6383 g 4080 2171 N -50 0 0 33 50 0 h .6393 g 4080 2204 N -50 0 0 34 50 0 h .6403 g 4080 2238 N -50 0 0 33 50 0 h .6413 g 4080 2271 N -50 0 0 34 50 0 h .6423 g 4080 2305 N -50 0 0 34 50 0 h .6433 g 4080 2339 N -50 0 0 33 50 0 h .6443 g 4080 2372 N -50 0 0 34 50 0 h .6453 g 4080 2406 N -50 0 0 33 50 0 h .6463 g 4080 2439 N -50 0 0 34 50 0 h .6473 g 4080 2473 N -50 0 0 34 50 0 h .6483 g 4080 2507 N -50 0 0 33 50 0 h .6493 g 4080 2540 N -50 0 0 34 50 0 h .6503 g 4080 2574 N -50 0 0 32 50 0 h .6512 g 4080 2606 N -50 0 0 34 50 0 h .6522 g 4080 2640 N -50 0 0 33 50 0 h .6532 g 4080 2673 N -50 0 0 34 50 0 h .6542 g 4080 2707 N -50 0 0 34 50 0 h .6552 g 4080 2741 N -50 0 0 33 50 0 h .6562 g 4080 2774 N -50 0 0 34 50 0 h .6572 g 4080 2808 N -50 0 0 33 50 0 h .6582 g 4080 2841 N -50 0 0 34 50 0 h .6592 g 4080 2875 N -50 0 0 34 50 0 h .6602 g 4080 2909 N -50 0 0 33 50 0 h .6612 g 4080 2942 N -50 0 0 34 50 0 h .6622 g 4080 2976 N -50 0 0 33 50 0 h .6632 g 4080 3009 N -50 0 0 34 50 0 h .6642 g 4080 3043 N -50 0 0 34 50 0 h .6652 g 4080 3077 N -50 0 0 33 50 0 h .6662 g 4080 3110 N -50 0 0 34 50 0 h .6672 g 4080 3144 N -50 0 0 33 50 0 h .6682 g 4080 3177 N -50 0 0 34 50 0 h .6692 g 4080 3211 N -50 0 0 34 50 0 h .6701 g 4080 3245 N -50 0 0 33 50 0 h .6711 g 4080 3278 N -50 0 0 34 50 0 h .6721 g 4080 3312 N -50 0 0 33 50 0 h .6731 g 4080 3345 N -50 0 0 34 50 0 h .6741 g 4080 3379 N -50 0 0 33 50 0 h .6751 g 4080 3412 N -50 0 0 34 50 0 h .6761 g 4080 3446 N -50 0 0 34 50 0 h .6771 g 4080 3480 N -50 0 0 33 50 0 h .6781 g 4080 3513 N -50 0 0 34 50 0 h .6791 g 4080 3547 N -50 0 0 33 50 0 h .6801 g 4080 3580 N -50 0 0 34 50 0 h .6811 g 4080 3614 N -50 0 0 34 50 0 h .6821 g 4080 3648 N -50 0 0 33 50 0 h .6831 g 4080 3681 N -50 0 0 34 50 0 h .6841 g 4080 3715 N -50 0 0 33 50 0 h .6851 g 4080 3748 N -50 0 0 34 50 0 h .6861 g 4080 3782 N -50 0 0 34 50 0 h .6871 g 4080 3816 N -50 0 0 33 50 0 h .6881 g 4080 3849 N -50 0 0 34 50 0 h .689 g 4080 3883 N -50 0 0 33 50 0 h .69 g 4080 3916 N -50 0 0 34 50 0 h .691 g 4080 3950 N -50 0 0 33 50 0 h .692 g 4080 3983 N -50 0 0 34 50 0 h .693 g 4080 4017 N -50 0 0 34 50 0 h .694 g 4080 4051 N -50 0 0 33 50 0 h .695 g 4080 4084 N -50 0 0 34 50 0 h .696 g 4080 4118 N -50 0 0 33 50 0 h .697 g 4080 4151 N -50 0 0 34 50 0 h .698 g 4080 4185 N -50 0 0 34 50 0 h .699 g 4080 4219 N -50 0 0 33 50 0 h .6115 g 4130 928 N -51 0 0 33 51 0 h .6124 g 4130 961 N -51 0 0 34 51 0 h .6132 g 4130 995 N -51 0 0 34 51 0 h .6141 g 4130 1029 N -51 0 0 33 51 0 h .6149 g 4130 1062 N -51 0 0 34 51 0 h .6157 g 4130 1096 N -51 0 0 33 51 0 h .6166 g 4130 1129 N -51 0 0 34 51 0 h .6174 g 4130 1163 N -51 0 0 34 51 0 h .6183 g 4130 1197 N -51 0 0 33 51 0 h .6191 g 4130 1230 N -51 0 0 34 51 0 h .6199 g 4130 1264 N -51 0 0 33 51 0 h .6208 g 4130 1297 N -51 0 0 34 51 0 h .6216 g 4130 1331 N -51 0 0 33 51 0 h .6225 g 4130 1364 N -51 0 0 34 51 0 h .6233 g 4130 1398 N -51 0 0 34 51 0 h .6242 g 4130 1432 N -51 0 0 33 51 0 h .625 g 4130 1465 N -51 0 0 34 51 0 h .6258 g 4130 1499 N -51 0 0 33 51 0 h .6267 g 4130 1532 N -51 0 0 34 51 0 h .6275 g 4130 1566 N -51 0 0 34 51 0 h .6284 g 4130 1600 N -51 0 0 33 51 0 h .6292 g 4130 1633 N -51 0 0 34 51 0 h .6301 g 4130 1667 N -51 0 0 33 51 0 h .6309 g 4130 1700 N -51 0 0 34 51 0 h .6317 g 4130 1734 N -51 0 0 34 51 0 h .6326 g 4130 1768 N -51 0 0 33 51 0 h .6334 g 4130 1801 N -51 0 0 34 51 0 h .6343 g 4130 1835 N -51 0 0 33 51 0 h .6351 g 4130 1868 N -51 0 0 34 51 0 h .6359 g 4130 1902 N -51 0 0 33 51 0 h .6368 g 4130 1935 N -51 0 0 34 51 0 h .6376 g 4130 1969 N -51 0 0 34 51 0 h .6385 g 4130 2003 N -51 0 0 33 51 0 h .6393 g 4130 2036 N -51 0 0 34 51 0 h .6402 g 4130 2070 N -51 0 0 33 51 0 h .641 g 4130 2103 N -51 0 0 34 51 0 h .6418 g 4130 2137 N -51 0 0 34 51 0 h .6427 g 4130 2171 N -51 0 0 33 51 0 h .6435 g 4130 2204 N -51 0 0 34 51 0 h .6444 g 4130 2238 N -51 0 0 33 51 0 h .6452 g 4130 2271 N -51 0 0 34 51 0 h .646 g 4130 2305 N -51 0 0 34 51 0 h .6469 g 4130 2339 N -51 0 0 33 51 0 h .6477 g 4130 2372 N -51 0 0 34 51 0 h .6486 g 4130 2406 N -51 0 0 33 51 0 h .6494 g 4130 2439 N -51 0 0 34 51 0 h .6503 g 4130 2473 N -51 0 0 34 51 0 h .6511 g 4130 2507 N -51 0 0 33 51 0 h .6519 g 4130 2540 N -51 0 0 34 51 0 h .6528 g 4130 2574 N -51 0 0 32 51 0 h .6536 g 4130 2606 N -51 0 0 34 51 0 h .6545 g 4130 2640 N -51 0 0 33 51 0 h .6553 g 4130 2673 N -51 0 0 34 51 0 h .6561 g 4130 2707 N -51 0 0 34 51 0 h .657 g 4130 2741 N -51 0 0 33 51 0 h .6578 g 4130 2774 N -51 0 0 34 51 0 h .6587 g 4130 2808 N -51 0 0 33 51 0 h .6595 g 4130 2841 N -51 0 0 34 51 0 h .6604 g 4130 2875 N -51 0 0 34 51 0 h .6612 g 4130 2909 N -51 0 0 33 51 0 h .662 g 4130 2942 N -51 0 0 34 51 0 h .6629 g 4130 2976 N -51 0 0 33 51 0 h .6637 g 4130 3009 N -51 0 0 34 51 0 h .6646 g 4130 3043 N -51 0 0 34 51 0 h .6654 g 4130 3077 N -51 0 0 33 51 0 h .6662 g 4130 3110 N -51 0 0 34 51 0 h .6671 g 4130 3144 N -51 0 0 33 51 0 h .6679 g 4130 3177 N -51 0 0 34 51 0 h .6688 g 4130 3211 N -51 0 0 34 51 0 h .6696 g 4130 3245 N -51 0 0 33 51 0 h .6705 g 4130 3278 N -51 0 0 34 51 0 h .6713 g 4130 3312 N -51 0 0 33 51 0 h .6721 g 4130 3345 N -51 0 0 34 51 0 h .673 g 4130 3379 N -51 0 0 33 51 0 h .6738 g 4130 3412 N -51 0 0 34 51 0 h .6747 g 4130 3446 N -51 0 0 34 51 0 h .6755 g 4130 3480 N -51 0 0 33 51 0 h .6763 g 4130 3513 N -51 0 0 34 51 0 h .6772 g 4130 3547 N -51 0 0 33 51 0 h .678 g 4130 3580 N -51 0 0 34 51 0 h .6789 g 4130 3614 N -51 0 0 34 51 0 h .6797 g 4130 3648 N -51 0 0 33 51 0 h .6806 g 4130 3681 N -51 0 0 34 51 0 h .6814 g 4130 3715 N -51 0 0 33 51 0 h .6822 g 4130 3748 N -51 0 0 34 51 0 h .6831 g 4130 3782 N -51 0 0 34 51 0 h .6839 g 4130 3816 N -51 0 0 33 51 0 h .6848 g 4130 3849 N -51 0 0 34 51 0 h .6856 g 4130 3883 N -51 0 0 33 51 0 h .6864 g 4130 3916 N -51 0 0 34 51 0 h .6873 g 4130 3950 N -51 0 0 33 51 0 h .6881 g 4130 3983 N -51 0 0 34 51 0 h .689 g 4130 4017 N -51 0 0 34 51 0 h .6898 g 4130 4051 N -51 0 0 33 51 0 h .6907 g 4130 4084 N -51 0 0 34 51 0 h .6915 g 4130 4118 N -51 0 0 33 51 0 h .6923 g 4130 4151 N -51 0 0 34 51 0 h .6932 g 4130 4185 N -51 0 0 34 51 0 h .694 g 4130 4219 N -51 0 0 33 51 0 h .6216 g 4181 928 N -50 0 0 33 50 0 h .6222 g 4181 961 N -50 0 0 34 50 0 h .6229 g 4181 995 N -50 0 0 34 50 0 h .6236 g 4181 1029 N -50 0 0 33 50 0 h .6243 g 4181 1062 N -50 0 0 34 50 0 h .625 g 4181 1096 N -50 0 0 33 50 0 h .6257 g 4181 1129 N -50 0 0 34 50 0 h .6264 g 4181 1163 N -50 0 0 34 50 0 h .6271 g 4181 1197 N -50 0 0 33 50 0 h .6278 g 4181 1230 N -50 0 0 34 50 0 h .6284 g 4181 1264 N -50 0 0 33 50 0 h .6291 g 4181 1297 N -50 0 0 34 50 0 h .6298 g 4181 1331 N -50 0 0 33 50 0 h .6305 g 4181 1364 N -50 0 0 34 50 0 h .6312 g 4181 1398 N -50 0 0 34 50 0 h .6319 g 4181 1432 N -50 0 0 33 50 0 h .6326 g 4181 1465 N -50 0 0 34 50 0 h .6333 g 4181 1499 N -50 0 0 33 50 0 h .634 g 4181 1532 N -50 0 0 34 50 0 h .6346 g 4181 1566 N -50 0 0 34 50 0 h .6353 g 4181 1600 N -50 0 0 33 50 0 h .636 g 4181 1633 N -50 0 0 34 50 0 h .6367 g 4181 1667 N -50 0 0 33 50 0 h .6374 g 4181 1700 N -50 0 0 34 50 0 h .6381 g 4181 1734 N -50 0 0 34 50 0 h .6388 g 4181 1768 N -50 0 0 33 50 0 h .6395 g 4181 1801 N -50 0 0 34 50 0 h .6402 g 4181 1835 N -50 0 0 33 50 0 h .6408 g 4181 1868 N -50 0 0 34 50 0 h .6415 g 4181 1902 N -50 0 0 33 50 0 h .6422 g 4181 1935 N -50 0 0 34 50 0 h .6429 g 4181 1969 N -50 0 0 34 50 0 h .6436 g 4181 2003 N -50 0 0 33 50 0 h .6443 g 4181 2036 N -50 0 0 34 50 0 h .645 g 4181 2070 N -50 0 0 33 50 0 h .6457 g 4181 2103 N -50 0 0 34 50 0 h .6463 g 4181 2137 N -50 0 0 34 50 0 h .647 g 4181 2171 N -50 0 0 33 50 0 h .6477 g 4181 2204 N -50 0 0 34 50 0 h .6484 g 4181 2238 N -50 0 0 33 50 0 h .6491 g 4181 2271 N -50 0 0 34 50 0 h .6498 g 4181 2305 N -50 0 0 34 50 0 h .6505 g 4181 2339 N -50 0 0 33 50 0 h .6512 g 4181 2372 N -50 0 0 34 50 0 h .6519 g 4181 2406 N -50 0 0 33 50 0 h .6525 g 4181 2439 N -50 0 0 34 50 0 h .6532 g 4181 2473 N -50 0 0 34 50 0 h .6539 g 4181 2507 N -50 0 0 33 50 0 h .6546 g 4181 2540 N -50 0 0 34 50 0 h .6553 g 4181 2574 N -50 0 0 32 50 0 h .656 g 4181 2606 N -50 0 0 34 50 0 h .6567 g 4181 2640 N -50 0 0 33 50 0 h .6574 g 4181 2673 N -50 0 0 34 50 0 h .6581 g 4181 2707 N -50 0 0 34 50 0 h .6587 g 4181 2741 N -50 0 0 33 50 0 h .6594 g 4181 2774 N -50 0 0 34 50 0 h .6601 g 4181 2808 N -50 0 0 33 50 0 h .6608 g 4181 2841 N -50 0 0 34 50 0 h .6615 g 4181 2875 N -50 0 0 34 50 0 h .6622 g 4181 2909 N -50 0 0 33 50 0 h .6629 g 4181 2942 N -50 0 0 34 50 0 h .6636 g 4181 2976 N -50 0 0 33 50 0 h .6643 g 4181 3009 N -50 0 0 34 50 0 h .6649 g 4181 3043 N -50 0 0 34 50 0 h .6656 g 4181 3077 N -50 0 0 33 50 0 h .6663 g 4181 3110 N -50 0 0 34 50 0 h .667 g 4181 3144 N -50 0 0 33 50 0 h .6677 g 4181 3177 N -50 0 0 34 50 0 h .6684 g 4181 3211 N -50 0 0 34 50 0 h .6691 g 4181 3245 N -50 0 0 33 50 0 h .6698 g 4181 3278 N -50 0 0 34 50 0 h .6705 g 4181 3312 N -50 0 0 33 50 0 h .6711 g 4181 3345 N -50 0 0 34 50 0 h .6718 g 4181 3379 N -50 0 0 33 50 0 h .6725 g 4181 3412 N -50 0 0 34 50 0 h .6732 g 4181 3446 N -50 0 0 34 50 0 h .6739 g 4181 3480 N -50 0 0 33 50 0 h .6746 g 4181 3513 N -50 0 0 34 50 0 h .6753 g 4181 3547 N -50 0 0 33 50 0 h .676 g 4181 3580 N -50 0 0 34 50 0 h .6767 g 4181 3614 N -50 0 0 34 50 0 h .6773 g 4181 3648 N -50 0 0 33 50 0 h .678 g 4181 3681 N -50 0 0 34 50 0 h .6787 g 4181 3715 N -50 0 0 33 50 0 h .6794 g 4181 3748 N -50 0 0 34 50 0 h .6801 g 4181 3782 N -50 0 0 34 50 0 h .6808 g 4181 3816 N -50 0 0 33 50 0 h .6815 g 4181 3849 N -50 0 0 34 50 0 h .6822 g 4181 3883 N -50 0 0 33 50 0 h .6829 g 4181 3916 N -50 0 0 34 50 0 h .6835 g 4181 3950 N -50 0 0 33 50 0 h .6842 g 4181 3983 N -50 0 0 34 50 0 h .6849 g 4181 4017 N -50 0 0 34 50 0 h .6856 g 4181 4051 N -50 0 0 33 50 0 h .6863 g 4181 4084 N -50 0 0 34 50 0 h .687 g 4181 4118 N -50 0 0 33 50 0 h .6877 g 4181 4151 N -50 0 0 34 50 0 h .6884 g 4181 4185 N -50 0 0 34 50 0 h .689 g 4181 4219 N -50 0 0 33 50 0 h .6316 g 4231 928 N -51 0 0 33 51 0 h .6321 g 4231 961 N -51 0 0 34 51 0 h .6327 g 4231 995 N -51 0 0 34 51 0 h .6332 g 4231 1029 N -51 0 0 33 51 0 h .6337 g 4231 1062 N -51 0 0 34 51 0 h .6343 g 4231 1096 N -51 0 0 33 51 0 h .6348 g 4231 1129 N -51 0 0 34 51 0 h .6353 g 4231 1163 N -51 0 0 34 51 0 h .6359 g 4231 1197 N -51 0 0 33 51 0 h .6364 g 4231 1230 N -51 0 0 34 51 0 h .6369 g 4231 1264 N -51 0 0 33 51 0 h .6375 g 4231 1297 N -51 0 0 34 51 0 h .638 g 4231 1331 N -51 0 0 33 51 0 h .6385 g 4231 1364 N -51 0 0 34 51 0 h .6391 g 4231 1398 N -51 0 0 34 51 0 h .6396 g 4231 1432 N -51 0 0 33 51 0 h .6402 g 4231 1465 N -51 0 0 34 51 0 h .6407 g 4231 1499 N -51 0 0 33 51 0 h .6412 g 4231 1532 N -51 0 0 34 51 0 h .6418 g 4231 1566 N -51 0 0 34 51 0 h .6423 g 4231 1600 N -51 0 0 33 51 0 h .6428 g 4231 1633 N -51 0 0 34 51 0 h .6434 g 4231 1667 N -51 0 0 33 51 0 h .6439 g 4231 1700 N -51 0 0 34 51 0 h .6444 g 4231 1734 N -51 0 0 34 51 0 h .645 g 4231 1768 N -51 0 0 33 51 0 h .6455 g 4231 1801 N -51 0 0 34 51 0 h .646 g 4231 1835 N -51 0 0 33 51 0 h .6466 g 4231 1868 N -51 0 0 34 51 0 h .6471 g 4231 1902 N -51 0 0 33 51 0 h .6477 g 4231 1935 N -51 0 0 34 51 0 h .6482 g 4231 1969 N -51 0 0 34 51 0 h .6487 g 4231 2003 N -51 0 0 33 51 0 h .6493 g 4231 2036 N -51 0 0 34 51 0 h .6498 g 4231 2070 N -51 0 0 33 51 0 h .6503 g 4231 2103 N -51 0 0 34 51 0 h .6509 g 4231 2137 N -51 0 0 34 51 0 h .6514 g 4231 2171 N -51 0 0 33 51 0 h .6519 g 4231 2204 N -51 0 0 34 51 0 h .6525 g 4231 2238 N -51 0 0 33 51 0 h .653 g 4231 2271 N -51 0 0 34 51 0 h .6535 g 4231 2305 N -51 0 0 34 51 0 h .6541 g 4231 2339 N -51 0 0 33 51 0 h .6546 g 4231 2372 N -51 0 0 34 51 0 h .6552 g 4231 2406 N -51 0 0 33 51 0 h .6557 g 4231 2439 N -51 0 0 34 51 0 h .6562 g 4231 2473 N -51 0 0 34 51 0 h .6568 g 4231 2507 N -51 0 0 33 51 0 h .6573 g 4231 2540 N -51 0 0 34 51 0 h .6578 g 4231 2574 N -51 0 0 32 51 0 h .6584 g 4231 2606 N -51 0 0 34 51 0 h .6589 g 4231 2640 N -51 0 0 33 51 0 h .6594 g 4231 2673 N -51 0 0 34 51 0 h .66 g 4231 2707 N -51 0 0 34 51 0 h .6605 g 4231 2741 N -51 0 0 33 51 0 h .661 g 4231 2774 N -51 0 0 34 51 0 h .6616 g 4231 2808 N -51 0 0 33 51 0 h .6621 g 4231 2841 N -51 0 0 34 51 0 h .6626 g 4231 2875 N -51 0 0 34 51 0 h .6632 g 4231 2909 N -51 0 0 33 51 0 h .6637 g 4231 2942 N -51 0 0 34 51 0 h .6643 g 4231 2976 N -51 0 0 33 51 0 h .6648 g 4231 3009 N -51 0 0 34 51 0 h .6653 g 4231 3043 N -51 0 0 34 51 0 h .6659 g 4231 3077 N -51 0 0 33 51 0 h .6664 g 4231 3110 N -51 0 0 34 51 0 h .6669 g 4231 3144 N -51 0 0 33 51 0 h .6675 g 4231 3177 N -51 0 0 34 51 0 h .668 g 4231 3211 N -51 0 0 34 51 0 h .6685 g 4231 3245 N -51 0 0 33 51 0 h .6691 g 4231 3278 N -51 0 0 34 51 0 h .6696 g 4231 3312 N -51 0 0 33 51 0 h .6701 g 4231 3345 N -51 0 0 34 51 0 h .6707 g 4231 3379 N -51 0 0 33 51 0 h .6712 g 4231 3412 N -51 0 0 34 51 0 h .6718 g 4231 3446 N -51 0 0 34 51 0 h .6723 g 4231 3480 N -51 0 0 33 51 0 h .6728 g 4231 3513 N -51 0 0 34 51 0 h .6734 g 4231 3547 N -51 0 0 33 51 0 h .6739 g 4231 3580 N -51 0 0 34 51 0 h .6744 g 4231 3614 N -51 0 0 34 51 0 h .675 g 4231 3648 N -51 0 0 33 51 0 h .6755 g 4231 3681 N -51 0 0 34 51 0 h .676 g 4231 3715 N -51 0 0 33 51 0 h .6766 g 4231 3748 N -51 0 0 34 51 0 h .6771 g 4231 3782 N -51 0 0 34 51 0 h .6776 g 4231 3816 N -51 0 0 33 51 0 h .6782 g 4231 3849 N -51 0 0 34 51 0 h .6787 g 4231 3883 N -51 0 0 33 51 0 h .6793 g 4231 3916 N -51 0 0 34 51 0 h .6798 g 4231 3950 N -51 0 0 33 51 0 h .6803 g 4231 3983 N -51 0 0 34 51 0 h .6809 g 4231 4017 N -51 0 0 34 51 0 h .6814 g 4231 4051 N -51 0 0 33 51 0 h .6819 g 4231 4084 N -51 0 0 34 51 0 h .6825 g 4231 4118 N -51 0 0 33 51 0 h .683 g 4231 4151 N -51 0 0 34 51 0 h .6835 g 4231 4185 N -51 0 0 34 51 0 h .6841 g 4231 4219 N -51 0 0 33 51 0 h .6416 g 4282 928 N -51 0 0 33 51 0 h .642 g 4282 961 N -51 0 0 34 51 0 h .6424 g 4282 995 N -51 0 0 34 51 0 h .6428 g 4282 1029 N -51 0 0 33 51 0 h .6431 g 4282 1062 N -51 0 0 34 51 0 h .6435 g 4282 1096 N -51 0 0 33 51 0 h .6439 g 4282 1129 N -51 0 0 34 51 0 h .6443 g 4282 1163 N -51 0 0 34 51 0 h .6447 g 4282 1197 N -51 0 0 33 51 0 h .645 g 4282 1230 N -51 0 0 34 51 0 h .6454 g 4282 1264 N -51 0 0 33 51 0 h .6458 g 4282 1297 N -51 0 0 34 51 0 h .6462 g 4282 1331 N -51 0 0 33 51 0 h .6466 g 4282 1364 N -51 0 0 34 51 0 h .647 g 4282 1398 N -51 0 0 34 51 0 h .6473 g 4282 1432 N -51 0 0 33 51 0 h .6477 g 4282 1465 N -51 0 0 34 51 0 h .6481 g 4282 1499 N -51 0 0 33 51 0 h .6485 g 4282 1532 N -51 0 0 34 51 0 h .6489 g 4282 1566 N -51 0 0 34 51 0 h .6493 g 4282 1600 N -51 0 0 33 51 0 h .6496 g 4282 1633 N -51 0 0 34 51 0 h .65 g 4282 1667 N -51 0 0 33 51 0 h .6504 g 4282 1700 N -51 0 0 34 51 0 h .6508 g 4282 1734 N -51 0 0 34 51 0 h .6512 g 4282 1768 N -51 0 0 33 51 0 h .6516 g 4282 1801 N -51 0 0 34 51 0 h .6519 g 4282 1835 N -51 0 0 33 51 0 h .6523 g 4282 1868 N -51 0 0 34 51 0 h .6527 g 4282 1902 N -51 0 0 33 51 0 h .6531 g 4282 1935 N -51 0 0 34 51 0 h .6535 g 4282 1969 N -51 0 0 34 51 0 h .6538 g 4282 2003 N -51 0 0 33 51 0 h .6542 g 4282 2036 N -51 0 0 34 51 0 h .6546 g 4282 2070 N -51 0 0 33 51 0 h .655 g 4282 2103 N -51 0 0 34 51 0 h .6554 g 4282 2137 N -51 0 0 34 51 0 h .6558 g 4282 2171 N -51 0 0 33 51 0 h .6561 g 4282 2204 N -51 0 0 34 51 0 h .6565 g 4282 2238 N -51 0 0 33 51 0 h .6569 g 4282 2271 N -51 0 0 34 51 0 h .6573 g 4282 2305 N -51 0 0 34 51 0 h .6577 g 4282 2339 N -51 0 0 33 51 0 h .6581 g 4282 2372 N -51 0 0 34 51 0 h .6584 g 4282 2406 N -51 0 0 33 51 0 h .6588 g 4282 2439 N -51 0 0 34 51 0 h .6592 g 4282 2473 N -51 0 0 34 51 0 h .6596 g 4282 2507 N -51 0 0 33 51 0 h .66 g 4282 2540 N -51 0 0 34 51 0 h .6604 g 4282 2574 N -51 0 0 32 51 0 h .6607 g 4282 2606 N -51 0 0 34 51 0 h .6611 g 4282 2640 N -51 0 0 33 51 0 h .6615 g 4282 2673 N -51 0 0 34 51 0 h .6619 g 4282 2707 N -51 0 0 34 51 0 h .6623 g 4282 2741 N -51 0 0 33 51 0 h .6626 g 4282 2774 N -51 0 0 34 51 0 h .663 g 4282 2808 N -51 0 0 33 51 0 h .6634 g 4282 2841 N -51 0 0 34 51 0 h .6638 g 4282 2875 N -51 0 0 34 51 0 h .6642 g 4282 2909 N -51 0 0 33 51 0 h .6646 g 4282 2942 N -51 0 0 34 51 0 h .6649 g 4282 2976 N -51 0 0 33 51 0 h .6653 g 4282 3009 N -51 0 0 34 51 0 h .6657 g 4282 3043 N -51 0 0 34 51 0 h .6661 g 4282 3077 N -51 0 0 33 51 0 h .6665 g 4282 3110 N -51 0 0 34 51 0 h .6669 g 4282 3144 N -51 0 0 33 51 0 h .6672 g 4282 3177 N -51 0 0 34 51 0 h .6676 g 4282 3211 N -51 0 0 34 51 0 h .668 g 4282 3245 N -51 0 0 33 51 0 h .6684 g 4282 3278 N -51 0 0 34 51 0 h .6688 g 4282 3312 N -51 0 0 33 51 0 h .6692 g 4282 3345 N -51 0 0 34 51 0 h .6695 g 4282 3379 N -51 0 0 33 51 0 h .6699 g 4282 3412 N -51 0 0 34 51 0 h .6703 g 4282 3446 N -51 0 0 34 51 0 h .6707 g 4282 3480 N -51 0 0 33 51 0 h .6711 g 4282 3513 N -51 0 0 34 51 0 h .6714 g 4282 3547 N -51 0 0 33 51 0 h .6718 g 4282 3580 N -51 0 0 34 51 0 h .6722 g 4282 3614 N -51 0 0 34 51 0 h .6726 g 4282 3648 N -51 0 0 33 51 0 h .673 g 4282 3681 N -51 0 0 34 51 0 h .6734 g 4282 3715 N -51 0 0 33 51 0 h .6737 g 4282 3748 N -51 0 0 34 51 0 h .6741 g 4282 3782 N -51 0 0 34 51 0 h .6745 g 4282 3816 N -51 0 0 33 51 0 h .6749 g 4282 3849 N -51 0 0 34 51 0 h .6753 g 4282 3883 N -51 0 0 33 51 0 h .6757 g 4282 3916 N -51 0 0 34 51 0 h .676 g 4282 3950 N -51 0 0 33 51 0 h .6764 g 4282 3983 N -51 0 0 34 51 0 h .6768 g 4282 4017 N -51 0 0 34 51 0 h .6772 g 4282 4051 N -51 0 0 33 51 0 h .6776 g 4282 4084 N -51 0 0 34 51 0 h .678 g 4282 4118 N -51 0 0 33 51 0 h .6783 g 4282 4151 N -51 0 0 34 51 0 h .6787 g 4282 4185 N -51 0 0 34 51 0 h .6791 g 4282 4219 N -51 0 0 33 51 0 h .6516 g 4333 928 N -50 0 0 33 50 0 h .6519 g 4333 961 N -50 0 0 34 50 0 h .6521 g 4333 995 N -50 0 0 34 50 0 h .6523 g 4333 1029 N -50 0 0 33 50 0 h .6525 g 4333 1062 N -50 0 0 34 50 0 h .6528 g 4333 1096 N -50 0 0 33 50 0 h .653 g 4333 1129 N -50 0 0 34 50 0 h .6532 g 4333 1163 N -50 0 0 34 50 0 h .6535 g 4333 1197 N -50 0 0 33 50 0 h .6537 g 4333 1230 N -50 0 0 34 50 0 h .6539 g 4333 1264 N -50 0 0 33 50 0 h .6542 g 4333 1297 N -50 0 0 34 50 0 h .6544 g 4333 1331 N -50 0 0 33 50 0 h .6546 g 4333 1364 N -50 0 0 34 50 0 h .6548 g 4333 1398 N -50 0 0 34 50 0 h .6551 g 4333 1432 N -50 0 0 33 50 0 h .6553 g 4333 1465 N -50 0 0 34 50 0 h .6555 g 4333 1499 N -50 0 0 33 50 0 h .6558 g 4333 1532 N -50 0 0 34 50 0 h .656 g 4333 1566 N -50 0 0 34 50 0 h .6562 g 4333 1600 N -50 0 0 33 50 0 h .6565 g 4333 1633 N -50 0 0 34 50 0 h .6567 g 4333 1667 N -50 0 0 33 50 0 h .6569 g 4333 1700 N -50 0 0 34 50 0 h .6571 g 4333 1734 N -50 0 0 34 50 0 h .6574 g 4333 1768 N -50 0 0 33 50 0 h .6576 g 4333 1801 N -50 0 0 34 50 0 h .6578 g 4333 1835 N -50 0 0 33 50 0 h .6581 g 4333 1868 N -50 0 0 34 50 0 h .6583 g 4333 1902 N -50 0 0 33 50 0 h .6585 g 4333 1935 N -50 0 0 34 50 0 h .6587 g 4333 1969 N -50 0 0 34 50 0 h .659 g 4333 2003 N -50 0 0 33 50 0 h .6592 g 4333 2036 N -50 0 0 34 50 0 h .6594 g 4333 2070 N -50 0 0 33 50 0 h .6597 g 4333 2103 N -50 0 0 34 50 0 h .6599 g 4333 2137 N -50 0 0 34 50 0 h .6601 g 4333 2171 N -50 0 0 33 50 0 h .6604 g 4333 2204 N -50 0 0 34 50 0 h .6606 g 4333 2238 N -50 0 0 33 50 0 h .6608 g 4333 2271 N -50 0 0 34 50 0 h .661 g 4333 2305 N -50 0 0 34 50 0 h .6613 g 4333 2339 N -50 0 0 33 50 0 h .6615 g 4333 2372 N -50 0 0 34 50 0 h .6617 g 4333 2406 N -50 0 0 33 50 0 h .662 g 4333 2439 N -50 0 0 34 50 0 h .6622 g 4333 2473 N -50 0 0 34 50 0 h .6624 g 4333 2507 N -50 0 0 33 50 0 h .6626 g 4333 2540 N -50 0 0 34 50 0 h .6629 g 4333 2574 N -50 0 0 32 50 0 h .6631 g 4333 2606 N -50 0 0 34 50 0 h .6633 g 4333 2640 N -50 0 0 33 50 0 h .6636 g 4333 2673 N -50 0 0 34 50 0 h .6638 g 4333 2707 N -50 0 0 34 50 0 h .664 g 4333 2741 N -50 0 0 33 50 0 h .6643 g 4333 2774 N -50 0 0 34 50 0 h .6645 g 4333 2808 N -50 0 0 33 50 0 h .6647 g 4333 2841 N -50 0 0 34 50 0 h .6649 g 4333 2875 N -50 0 0 34 50 0 h .6652 g 4333 2909 N -50 0 0 33 50 0 h .6654 g 4333 2942 N -50 0 0 34 50 0 h .6656 g 4333 2976 N -50 0 0 33 50 0 h .6659 g 4333 3009 N -50 0 0 34 50 0 h .6661 g 4333 3043 N -50 0 0 34 50 0 h .6663 g 4333 3077 N -50 0 0 33 50 0 h .6666 g 4333 3110 N -50 0 0 34 50 0 h .6668 g 4333 3144 N -50 0 0 33 50 0 h .667 g 4333 3177 N -50 0 0 34 50 0 h .6672 g 4333 3211 N -50 0 0 34 50 0 h .6675 g 4333 3245 N -50 0 0 33 50 0 h .6677 g 4333 3278 N -50 0 0 34 50 0 h .6679 g 4333 3312 N -50 0 0 33 50 0 h .6682 g 4333 3345 N -50 0 0 34 50 0 h .6684 g 4333 3379 N -50 0 0 33 50 0 h .6686 g 4333 3412 N -50 0 0 34 50 0 h .6688 g 4333 3446 N -50 0 0 34 50 0 h .6691 g 4333 3480 N -50 0 0 33 50 0 h .6693 g 4333 3513 N -50 0 0 34 50 0 h .6695 g 4333 3547 N -50 0 0 33 50 0 h .6698 g 4333 3580 N -50 0 0 34 50 0 h .67 g 4333 3614 N -50 0 0 34 50 0 h .6702 g 4333 3648 N -50 0 0 33 50 0 h .6705 g 4333 3681 N -50 0 0 34 50 0 h .6707 g 4333 3715 N -50 0 0 33 50 0 h .6709 g 4333 3748 N -50 0 0 34 50 0 h .6711 g 4333 3782 N -50 0 0 34 50 0 h .6714 g 4333 3816 N -50 0 0 33 50 0 h .6716 g 4333 3849 N -50 0 0 34 50 0 h .6718 g 4333 3883 N -50 0 0 33 50 0 h .6721 g 4333 3916 N -50 0 0 34 50 0 h .6723 g 4333 3950 N -50 0 0 33 50 0 h .6725 g 4333 3983 N -50 0 0 34 50 0 h .6728 g 4333 4017 N -50 0 0 34 50 0 h .673 g 4333 4051 N -50 0 0 33 50 0 h .6732 g 4333 4084 N -50 0 0 34 50 0 h .6734 g 4333 4118 N -50 0 0 33 50 0 h .6737 g 4333 4151 N -50 0 0 34 50 0 h .6739 g 4333 4185 N -50 0 0 34 50 0 h .6741 g 4333 4219 N -50 0 0 33 50 0 h .6617 g 4383 928 N -51 0 0 33 51 0 h .6617 g 4383 961 N -51 0 0 34 51 0 h .6618 g 4383 995 N -51 0 0 34 51 0 h .6619 g 4383 1029 N -51 0 0 33 51 0 h .662 g 4383 1062 N -51 0 0 34 51 0 h .662 g 4383 1096 N -51 0 0 33 51 0 h .6621 g 4383 1129 N -51 0 0 34 51 0 h .6622 g 4383 1163 N -51 0 0 34 51 0 h .6623 g 4383 1197 N -51 0 0 33 51 0 h .6623 g 4383 1230 N -51 0 0 34 51 0 h .6624 g 4383 1264 N -51 0 0 33 51 0 h .6625 g 4383 1297 N -51 0 0 34 51 0 h .6626 g 4383 1331 N -51 0 0 33 51 0 h .6626 g 4383 1364 N -51 0 0 34 51 0 h .6627 g 4383 1398 N -51 0 0 34 51 0 h .6628 g 4383 1432 N -51 0 0 33 51 0 h .6629 g 4383 1465 N -51 0 0 34 51 0 h .663 g 4383 1499 N -51 0 0 33 51 0 h .663 g 4383 1532 N -51 0 0 34 51 0 h .6631 g 4383 1566 N -51 0 0 34 51 0 h .6632 g 4383 1600 N -51 0 0 33 51 0 h .6633 g 4383 1633 N -51 0 0 34 51 0 h .6633 g 4383 1667 N -51 0 0 33 51 0 h .6634 g 4383 1700 N -51 0 0 34 51 0 h .6635 g 4383 1734 N -51 0 0 34 51 0 h .6636 g 4383 1768 N -51 0 0 33 51 0 h .6636 g 4383 1801 N -51 0 0 34 51 0 h .6637 g 4383 1835 N -51 0 0 33 51 0 h .6638 g 4383 1868 N -51 0 0 34 51 0 h .6639 g 4383 1902 N -51 0 0 33 51 0 h .664 g 4383 1935 N -51 0 0 34 51 0 h .664 g 4383 1969 N -51 0 0 34 51 0 h .6641 g 4383 2003 N -51 0 0 33 51 0 h .6642 g 4383 2036 N -51 0 0 34 51 0 h .6643 g 4383 2070 N -51 0 0 33 51 0 h .6643 g 4383 2103 N -51 0 0 34 51 0 h .6644 g 4383 2137 N -51 0 0 34 51 0 h .6645 g 4383 2171 N -51 0 0 33 51 0 h .6646 g 4383 2204 N -51 0 0 34 51 0 h .6646 g 4383 2238 N -51 0 0 33 51 0 h .6647 g 4383 2271 N -51 0 0 34 51 0 h .6648 g 4383 2305 N -51 0 0 34 51 0 h .6649 g 4383 2339 N -51 0 0 33 51 0 h .6649 g 4383 2372 N -51 0 0 34 51 0 h .665 g 4383 2406 N -51 0 0 33 51 0 h .6651 g 4383 2439 N -51 0 0 34 51 0 h .6652 g 4383 2473 N -51 0 0 34 51 0 h .6653 g 4383 2507 N -51 0 0 33 51 0 h .6653 g 4383 2540 N -51 0 0 34 51 0 h .6654 g 4383 2574 N -51 0 0 32 51 0 h .6655 g 4383 2606 N -51 0 0 34 51 0 h .6656 g 4383 2640 N -51 0 0 33 51 0 h .6656 g 4383 2673 N -51 0 0 34 51 0 h .6657 g 4383 2707 N -51 0 0 34 51 0 h .6658 g 4383 2741 N -51 0 0 33 51 0 h .6659 g 4383 2774 N -51 0 0 34 51 0 h .6659 g 4383 2808 N -51 0 0 33 51 0 h .666 g 4383 2841 N -51 0 0 34 51 0 h .6661 g 4383 2875 N -51 0 0 34 51 0 h .6662 g 4383 2909 N -51 0 0 33 51 0 h .6662 g 4383 2942 N -51 0 0 34 51 0 h .6663 g 4383 2976 N -51 0 0 33 51 0 h .6664 g 4383 3009 N -51 0 0 34 51 0 h .6665 g 4383 3043 N -51 0 0 34 51 0 h .6666 g 4383 3077 N -51 0 0 33 51 0 h .6666 g 4383 3110 N -51 0 0 34 51 0 h .6667 g 4383 3144 N -51 0 0 33 51 0 h .6668 g 4383 3177 N -51 0 0 34 51 0 h .6669 g 4383 3211 N -51 0 0 34 51 0 h .6669 g 4383 3245 N -51 0 0 33 51 0 h .667 g 4383 3278 N -51 0 0 34 51 0 h .6671 g 4383 3312 N -51 0 0 33 51 0 h .6672 g 4383 3345 N -51 0 0 34 51 0 h .6672 g 4383 3379 N -51 0 0 33 51 0 h .6673 g 4383 3412 N -51 0 0 34 51 0 h .6674 g 4383 3446 N -51 0 0 34 51 0 h .6675 g 4383 3480 N -51 0 0 33 51 0 h .6675 g 4383 3513 N -51 0 0 34 51 0 h .6676 g 4383 3547 N -51 0 0 33 51 0 h .6677 g 4383 3580 N -51 0 0 34 51 0 h .6678 g 4383 3614 N -51 0 0 34 51 0 h .6679 g 4383 3648 N -51 0 0 33 51 0 h .6679 g 4383 3681 N -51 0 0 34 51 0 h .668 g 4383 3715 N -51 0 0 33 51 0 h .6681 g 4383 3748 N -51 0 0 34 51 0 h .6682 g 4383 3782 N -51 0 0 34 51 0 h .6682 g 4383 3816 N -51 0 0 33 51 0 h .6683 g 4383 3849 N -51 0 0 34 51 0 h .6684 g 4383 3883 N -51 0 0 33 51 0 h .6685 g 4383 3916 N -51 0 0 34 51 0 h .6685 g 4383 3950 N -51 0 0 33 51 0 h .6686 g 4383 3983 N -51 0 0 34 51 0 h .6687 g 4383 4017 N -51 0 0 34 51 0 h .6688 g 4383 4051 N -51 0 0 33 51 0 h .6688 g 4383 4084 N -51 0 0 34 51 0 h .6689 g 4383 4118 N -51 0 0 33 51 0 h .669 g 4383 4151 N -51 0 0 34 51 0 h .6691 g 4383 4185 N -51 0 0 34 51 0 h .6692 g 4383 4219 N -51 0 0 33 51 0 h .6717 g 4434 928 N -50 0 0 33 50 0 h .6716 g 4434 961 N -50 0 0 34 50 0 h .6715 g 4434 995 N -50 0 0 34 50 0 h .6714 g 4434 1029 N -50 0 0 33 50 0 h .6714 g 4434 1062 N -50 0 0 34 50 0 h .6713 g 4434 1096 N -50 0 0 33 50 0 h .6712 g 4434 1129 N -50 0 0 34 50 0 h .6711 g 4434 1163 N -50 0 0 34 50 0 h .6711 g 4434 1197 N -50 0 0 33 50 0 h .671 g 4434 1230 N -50 0 0 34 50 0 h .6709 g 4434 1264 N -50 0 0 33 50 0 h .6708 g 4434 1297 N -50 0 0 34 50 0 h .6708 g 4434 1331 N -50 0 0 33 50 0 h .6707 g 4434 1364 N -50 0 0 34 50 0 h .6706 g 4434 1398 N -50 0 0 34 50 0 h .6705 g 4434 1432 N -50 0 0 33 50 0 h .6705 g 4434 1465 N -50 0 0 34 50 0 h .6704 g 4434 1499 N -50 0 0 33 50 0 h .6703 g 4434 1532 N -50 0 0 34 50 0 h .6702 g 4434 1566 N -50 0 0 34 50 0 h .6701 g 4434 1600 N -50 0 0 33 50 0 h .6701 g 4434 1633 N -50 0 0 34 50 0 h .67 g 4434 1667 N -50 0 0 33 50 0 h .6699 g 4434 1700 N -50 0 0 34 50 0 h .6698 g 4434 1734 N -50 0 0 34 50 0 h .6698 g 4434 1768 N -50 0 0 33 50 0 h .6697 g 4434 1801 N -50 0 0 34 50 0 h .6696 g 4434 1835 N -50 0 0 33 50 0 h .6695 g 4434 1868 N -50 0 0 34 50 0 h .6695 g 4434 1902 N -50 0 0 33 50 0 h .6694 g 4434 1935 N -50 0 0 34 50 0 h .6693 g 4434 1969 N -50 0 0 34 50 0 h .6692 g 4434 2003 N -50 0 0 33 50 0 h .6692 g 4434 2036 N -50 0 0 34 50 0 h .6691 g 4434 2070 N -50 0 0 33 50 0 h .669 g 4434 2103 N -50 0 0 34 50 0 h .6689 g 4434 2137 N -50 0 0 34 50 0 h .6688 g 4434 2171 N -50 0 0 33 50 0 h .6688 g 4434 2204 N -50 0 0 34 50 0 h .6687 g 4434 2238 N -50 0 0 33 50 0 h .6686 g 4434 2271 N -50 0 0 34 50 0 h .6685 g 4434 2305 N -50 0 0 34 50 0 h .6685 g 4434 2339 N -50 0 0 33 50 0 h .6684 g 4434 2372 N -50 0 0 34 50 0 h .6683 g 4434 2406 N -50 0 0 33 50 0 h .6682 g 4434 2439 N -50 0 0 34 50 0 h .6682 g 4434 2473 N -50 0 0 34 50 0 h .6681 g 4434 2507 N -50 0 0 33 50 0 h .668 g 4434 2540 N -50 0 0 34 50 0 h .6679 g 4434 2574 N -50 0 0 32 50 0 h .6679 g 4434 2606 N -50 0 0 34 50 0 h .6678 g 4434 2640 N -50 0 0 33 50 0 h .6677 g 4434 2673 N -50 0 0 34 50 0 h .6676 g 4434 2707 N -50 0 0 34 50 0 h .6675 g 4434 2741 N -50 0 0 33 50 0 h .6675 g 4434 2774 N -50 0 0 34 50 0 h .6674 g 4434 2808 N -50 0 0 33 50 0 h .6673 g 4434 2841 N -50 0 0 34 50 0 h .6672 g 4434 2875 N -50 0 0 34 50 0 h .6672 g 4434 2909 N -50 0 0 33 50 0 h .6671 g 4434 2942 N -50 0 0 34 50 0 h .667 g 4434 2976 N -50 0 0 33 50 0 h .6669 g 4434 3009 N -50 0 0 34 50 0 h .6669 g 4434 3043 N -50 0 0 34 50 0 h .6668 g 4434 3077 N -50 0 0 33 50 0 h .6667 g 4434 3110 N -50 0 0 34 50 0 h .6666 g 4434 3144 N -50 0 0 33 50 0 h .6666 g 4434 3177 N -50 0 0 34 50 0 h .6665 g 4434 3211 N -50 0 0 34 50 0 h .6664 g 4434 3245 N -50 0 0 33 50 0 h .6663 g 4434 3278 N -50 0 0 34 50 0 h .6662 g 4434 3312 N -50 0 0 33 50 0 h .6662 g 4434 3345 N -50 0 0 34 50 0 h .6661 g 4434 3379 N -50 0 0 33 50 0 h .666 g 4434 3412 N -50 0 0 34 50 0 h .6659 g 4434 3446 N -50 0 0 34 50 0 h .6659 g 4434 3480 N -50 0 0 33 50 0 h .6658 g 4434 3513 N -50 0 0 34 50 0 h .6657 g 4434 3547 N -50 0 0 33 50 0 h .6656 g 4434 3580 N -50 0 0 34 50 0 h .6656 g 4434 3614 N -50 0 0 34 50 0 h .6655 g 4434 3648 N -50 0 0 33 50 0 h .6654 g 4434 3681 N -50 0 0 34 50 0 h .6653 g 4434 3715 N -50 0 0 33 50 0 h .6653 g 4434 3748 N -50 0 0 34 50 0 h .6652 g 4434 3782 N -50 0 0 34 50 0 h .6651 g 4434 3816 N -50 0 0 33 50 0 h .665 g 4434 3849 N -50 0 0 34 50 0 h .6649 g 4434 3883 N -50 0 0 33 50 0 h .6649 g 4434 3916 N -50 0 0 34 50 0 h .6648 g 4434 3950 N -50 0 0 33 50 0 h .6647 g 4434 3983 N -50 0 0 34 50 0 h .6646 g 4434 4017 N -50 0 0 34 50 0 h .6646 g 4434 4051 N -50 0 0 33 50 0 h .6645 g 4434 4084 N -50 0 0 34 50 0 h .6644 g 4434 4118 N -50 0 0 33 50 0 h .6643 g 4434 4151 N -50 0 0 34 50 0 h .6643 g 4434 4185 N -50 0 0 34 50 0 h .6642 g 4434 4219 N -50 0 0 33 50 0 h .6817 g 4484 928 N -51 0 0 33 51 0 h .6815 g 4484 961 N -51 0 0 34 51 0 h .6812 g 4484 995 N -51 0 0 34 51 0 h .681 g 4484 1029 N -51 0 0 33 51 0 h .6808 g 4484 1062 N -51 0 0 34 51 0 h .6806 g 4484 1096 N -51 0 0 33 51 0 h .6803 g 4484 1129 N -51 0 0 34 51 0 h .6801 g 4484 1163 N -51 0 0 34 51 0 h .6799 g 4484 1197 N -51 0 0 33 51 0 h .6796 g 4484 1230 N -51 0 0 34 51 0 h .6794 g 4484 1264 N -51 0 0 33 51 0 h .6792 g 4484 1297 N -51 0 0 34 51 0 h .6789 g 4484 1331 N -51 0 0 33 51 0 h .6787 g 4484 1364 N -51 0 0 34 51 0 h .6785 g 4484 1398 N -51 0 0 34 51 0 h .6783 g 4484 1432 N -51 0 0 33 51 0 h .678 g 4484 1465 N -51 0 0 34 51 0 h .6778 g 4484 1499 N -51 0 0 33 51 0 h .6776 g 4484 1532 N -51 0 0 34 51 0 h .6773 g 4484 1566 N -51 0 0 34 51 0 h .6771 g 4484 1600 N -51 0 0 33 51 0 h .6769 g 4484 1633 N -51 0 0 34 51 0 h .6767 g 4484 1667 N -51 0 0 33 51 0 h .6764 g 4484 1700 N -51 0 0 34 51 0 h .6762 g 4484 1734 N -51 0 0 34 51 0 h .676 g 4484 1768 N -51 0 0 33 51 0 h .6757 g 4484 1801 N -51 0 0 34 51 0 h .6755 g 4484 1835 N -51 0 0 33 51 0 h .6753 g 4484 1868 N -51 0 0 34 51 0 h .675 g 4484 1902 N -51 0 0 33 51 0 h .6748 g 4484 1935 N -51 0 0 34 51 0 h .6746 g 4484 1969 N -51 0 0 34 51 0 h .6744 g 4484 2003 N -51 0 0 33 51 0 h .6741 g 4484 2036 N -51 0 0 34 51 0 h .6739 g 4484 2070 N -51 0 0 33 51 0 h .6737 g 4484 2103 N -51 0 0 34 51 0 h .6734 g 4484 2137 N -51 0 0 34 51 0 h .6732 g 4484 2171 N -51 0 0 33 51 0 h .673 g 4484 2204 N -51 0 0 34 51 0 h .6728 g 4484 2238 N -51 0 0 33 51 0 h .6725 g 4484 2271 N -51 0 0 34 51 0 h .6723 g 4484 2305 N -51 0 0 34 51 0 h .6721 g 4484 2339 N -51 0 0 33 51 0 h .6718 g 4484 2372 N -51 0 0 34 51 0 h .6716 g 4484 2406 N -51 0 0 33 51 0 h .6714 g 4484 2439 N -51 0 0 34 51 0 h .6711 g 4484 2473 N -51 0 0 34 51 0 h .6709 g 4484 2507 N -51 0 0 33 51 0 h .6707 g 4484 2540 N -51 0 0 34 51 0 h .6705 g 4484 2574 N -51 0 0 32 51 0 h .6702 g 4484 2606 N -51 0 0 34 51 0 h .67 g 4484 2640 N -51 0 0 33 51 0 h .6698 g 4484 2673 N -51 0 0 34 51 0 h .6695 g 4484 2707 N -51 0 0 34 51 0 h .6693 g 4484 2741 N -51 0 0 33 51 0 h .6691 g 4484 2774 N -51 0 0 34 51 0 h .6688 g 4484 2808 N -51 0 0 33 51 0 h .6686 g 4484 2841 N -51 0 0 34 51 0 h .6684 g 4484 2875 N -51 0 0 34 51 0 h .6682 g 4484 2909 N -51 0 0 33 51 0 h .6679 g 4484 2942 N -51 0 0 34 51 0 h .6677 g 4484 2976 N -51 0 0 33 51 0 h .6675 g 4484 3009 N -51 0 0 34 51 0 h .6672 g 4484 3043 N -51 0 0 34 51 0 h .667 g 4484 3077 N -51 0 0 33 51 0 h .6668 g 4484 3110 N -51 0 0 34 51 0 h .6666 g 4484 3144 N -51 0 0 33 51 0 h .6663 g 4484 3177 N -51 0 0 34 51 0 h .6661 g 4484 3211 N -51 0 0 34 51 0 h .6659 g 4484 3245 N -51 0 0 33 51 0 h .6656 g 4484 3278 N -51 0 0 34 51 0 h .6654 g 4484 3312 N -51 0 0 33 51 0 h .6652 g 4484 3345 N -51 0 0 34 51 0 h .6649 g 4484 3379 N -51 0 0 33 51 0 h .6647 g 4484 3412 N -51 0 0 34 51 0 h .6645 g 4484 3446 N -51 0 0 34 51 0 h .6643 g 4484 3480 N -51 0 0 33 51 0 h .664 g 4484 3513 N -51 0 0 34 51 0 h .6638 g 4484 3547 N -51 0 0 33 51 0 h .6636 g 4484 3580 N -51 0 0 34 51 0 h .6633 g 4484 3614 N -51 0 0 34 51 0 h .6631 g 4484 3648 N -51 0 0 33 51 0 h .6629 g 4484 3681 N -51 0 0 34 51 0 h .6626 g 4484 3715 N -51 0 0 33 51 0 h .6624 g 4484 3748 N -51 0 0 34 51 0 h .6622 g 4484 3782 N -51 0 0 34 51 0 h .662 g 4484 3816 N -51 0 0 33 51 0 h .6617 g 4484 3849 N -51 0 0 34 51 0 h .6615 g 4484 3883 N -51 0 0 33 51 0 h .6613 g 4484 3916 N -51 0 0 34 51 0 h .661 g 4484 3950 N -51 0 0 33 51 0 h .6608 g 4484 3983 N -51 0 0 34 51 0 h .6606 g 4484 4017 N -51 0 0 34 51 0 h .6604 g 4484 4051 N -51 0 0 33 51 0 h .6601 g 4484 4084 N -51 0 0 34 51 0 h .6599 g 4484 4118 N -51 0 0 33 51 0 h .6597 g 4484 4151 N -51 0 0 34 51 0 h .6594 g 4484 4185 N -51 0 0 34 51 0 h .6592 g 4484 4219 N -51 0 0 33 51 0 h .6917 g 4535 928 N -50 0 0 33 50 0 h .6913 g 4535 961 N -50 0 0 34 50 0 h .691 g 4535 995 N -50 0 0 34 50 0 h .6906 g 4535 1029 N -50 0 0 33 50 0 h .6902 g 4535 1062 N -50 0 0 34 50 0 h .6898 g 4535 1096 N -50 0 0 33 50 0 h .6894 g 4535 1129 N -50 0 0 34 50 0 h .689 g 4535 1163 N -50 0 0 34 50 0 h .6887 g 4535 1197 N -50 0 0 33 50 0 h .6883 g 4535 1230 N -50 0 0 34 50 0 h .6879 g 4535 1264 N -50 0 0 33 50 0 h .6875 g 4535 1297 N -50 0 0 34 50 0 h .6871 g 4535 1331 N -50 0 0 33 50 0 h .6868 g 4535 1364 N -50 0 0 34 50 0 h .6864 g 4535 1398 N -50 0 0 34 50 0 h .686 g 4535 1432 N -50 0 0 33 50 0 h .6856 g 4535 1465 N -50 0 0 34 50 0 h .6852 g 4535 1499 N -50 0 0 33 50 0 h .6848 g 4535 1532 N -50 0 0 34 50 0 h .6845 g 4535 1566 N -50 0 0 34 50 0 h .6841 g 4535 1600 N -50 0 0 33 50 0 h .6837 g 4535 1633 N -50 0 0 34 50 0 h .6833 g 4535 1667 N -50 0 0 33 50 0 h .6829 g 4535 1700 N -50 0 0 34 50 0 h .6825 g 4535 1734 N -50 0 0 34 50 0 h .6822 g 4535 1768 N -50 0 0 33 50 0 h .6818 g 4535 1801 N -50 0 0 34 50 0 h .6814 g 4535 1835 N -50 0 0 33 50 0 h .681 g 4535 1868 N -50 0 0 34 50 0 h .6806 g 4535 1902 N -50 0 0 33 50 0 h .6802 g 4535 1935 N -50 0 0 34 50 0 h .6799 g 4535 1969 N -50 0 0 34 50 0 h .6795 g 4535 2003 N -50 0 0 33 50 0 h .6791 g 4535 2036 N -50 0 0 34 50 0 h .6787 g 4535 2070 N -50 0 0 33 50 0 h .6783 g 4535 2103 N -50 0 0 34 50 0 h .678 g 4535 2137 N -50 0 0 34 50 0 h .6776 g 4535 2171 N -50 0 0 33 50 0 h .6772 g 4535 2204 N -50 0 0 34 50 0 h .6768 g 4535 2238 N -50 0 0 33 50 0 h .6764 g 4535 2271 N -50 0 0 34 50 0 h .676 g 4535 2305 N -50 0 0 34 50 0 h .6757 g 4535 2339 N -50 0 0 33 50 0 h .6753 g 4535 2372 N -50 0 0 34 50 0 h .6749 g 4535 2406 N -50 0 0 33 50 0 h .6745 g 4535 2439 N -50 0 0 34 50 0 h .6741 g 4535 2473 N -50 0 0 34 50 0 h .6737 g 4535 2507 N -50 0 0 33 50 0 h .6734 g 4535 2540 N -50 0 0 34 50 0 h .673 g 4535 2574 N -50 0 0 32 50 0 h .6726 g 4535 2606 N -50 0 0 34 50 0 h .6722 g 4535 2640 N -50 0 0 33 50 0 h .6718 g 4535 2673 N -50 0 0 34 50 0 h .6714 g 4535 2707 N -50 0 0 34 50 0 h .6711 g 4535 2741 N -50 0 0 33 50 0 h .6707 g 4535 2774 N -50 0 0 34 50 0 h .6703 g 4535 2808 N -50 0 0 33 50 0 h .6699 g 4535 2841 N -50 0 0 34 50 0 h .6695 g 4535 2875 N -50 0 0 34 50 0 h .6692 g 4535 2909 N -50 0 0 33 50 0 h .6688 g 4535 2942 N -50 0 0 34 50 0 h .6684 g 4535 2976 N -50 0 0 33 50 0 h .668 g 4535 3009 N -50 0 0 34 50 0 h .6676 g 4535 3043 N -50 0 0 34 50 0 h .6672 g 4535 3077 N -50 0 0 33 50 0 h .6669 g 4535 3110 N -50 0 0 34 50 0 h .6665 g 4535 3144 N -50 0 0 33 50 0 h .6661 g 4535 3177 N -50 0 0 34 50 0 h .6657 g 4535 3211 N -50 0 0 34 50 0 h .6653 g 4535 3245 N -50 0 0 33 50 0 h .6649 g 4535 3278 N -50 0 0 34 50 0 h .6646 g 4535 3312 N -50 0 0 33 50 0 h .6642 g 4535 3345 N -50 0 0 34 50 0 h .6638 g 4535 3379 N -50 0 0 33 50 0 h .6634 g 4535 3412 N -50 0 0 34 50 0 h .663 g 4535 3446 N -50 0 0 34 50 0 h .6626 g 4535 3480 N -50 0 0 33 50 0 h .6623 g 4535 3513 N -50 0 0 34 50 0 h .6619 g 4535 3547 N -50 0 0 33 50 0 h .6615 g 4535 3580 N -50 0 0 34 50 0 h .6611 g 4535 3614 N -50 0 0 34 50 0 h .6607 g 4535 3648 N -50 0 0 33 50 0 h .6604 g 4535 3681 N -50 0 0 34 50 0 h .66 g 4535 3715 N -50 0 0 33 50 0 h .6596 g 4535 3748 N -50 0 0 34 50 0 h .6592 g 4535 3782 N -50 0 0 34 50 0 h .6588 g 4535 3816 N -50 0 0 33 50 0 h .6584 g 4535 3849 N -50 0 0 34 50 0 h .6581 g 4535 3883 N -50 0 0 33 50 0 h .6577 g 4535 3916 N -50 0 0 34 50 0 h .6573 g 4535 3950 N -50 0 0 33 50 0 h .6569 g 4535 3983 N -50 0 0 34 50 0 h .6565 g 4535 4017 N -50 0 0 34 50 0 h .6561 g 4535 4051 N -50 0 0 33 50 0 h .6558 g 4535 4084 N -50 0 0 34 50 0 h .6554 g 4535 4118 N -50 0 0 33 50 0 h .655 g 4535 4151 N -50 0 0 34 50 0 h .6546 g 4535 4185 N -50 0 0 34 50 0 h .6542 g 4535 4219 N -50 0 0 33 50 0 h .7018 g 4585 928 N -51 0 0 33 51 0 h .7012 g 4585 961 N -51 0 0 34 51 0 h .7007 g 4585 995 N -51 0 0 34 51 0 h .7001 g 4585 1029 N -51 0 0 33 51 0 h .6996 g 4585 1062 N -51 0 0 34 51 0 h .6991 g 4585 1096 N -51 0 0 33 51 0 h .6985 g 4585 1129 N -51 0 0 34 51 0 h .698 g 4585 1163 N -51 0 0 34 51 0 h .6975 g 4585 1197 N -51 0 0 33 51 0 h .6969 g 4585 1230 N -51 0 0 34 51 0 h .6964 g 4585 1264 N -51 0 0 33 51 0 h .6959 g 4585 1297 N -51 0 0 34 51 0 h .6953 g 4585 1331 N -51 0 0 33 51 0 h .6948 g 4585 1364 N -51 0 0 34 51 0 h .6943 g 4585 1398 N -51 0 0 34 51 0 h .6937 g 4585 1432 N -51 0 0 33 51 0 h .6932 g 4585 1465 N -51 0 0 34 51 0 h .6926 g 4585 1499 N -51 0 0 33 51 0 h .6921 g 4585 1532 N -51 0 0 34 51 0 h .6916 g 4585 1566 N -51 0 0 34 51 0 h .691 g 4585 1600 N -51 0 0 33 51 0 h .6905 g 4585 1633 N -51 0 0 34 51 0 h .69 g 4585 1667 N -51 0 0 33 51 0 h .6894 g 4585 1700 N -51 0 0 34 51 0 h .6889 g 4585 1734 N -51 0 0 34 51 0 h .6884 g 4585 1768 N -51 0 0 33 51 0 h .6878 g 4585 1801 N -51 0 0 34 51 0 h .6873 g 4585 1835 N -51 0 0 33 51 0 h .6868 g 4585 1868 N -51 0 0 34 51 0 h .6862 g 4585 1902 N -51 0 0 33 51 0 h .6857 g 4585 1935 N -51 0 0 34 51 0 h .6851 g 4585 1969 N -51 0 0 34 51 0 h .6846 g 4585 2003 N -51 0 0 33 51 0 h .6841 g 4585 2036 N -51 0 0 34 51 0 h .6835 g 4585 2070 N -51 0 0 33 51 0 h .683 g 4585 2103 N -51 0 0 34 51 0 h .6825 g 4585 2137 N -51 0 0 34 51 0 h .6819 g 4585 2171 N -51 0 0 33 51 0 h .6814 g 4585 2204 N -51 0 0 34 51 0 h .6809 g 4585 2238 N -51 0 0 33 51 0 h .6803 g 4585 2271 N -51 0 0 34 51 0 h .6798 g 4585 2305 N -51 0 0 34 51 0 h .6793 g 4585 2339 N -51 0 0 33 51 0 h .6787 g 4585 2372 N -51 0 0 34 51 0 h .6782 g 4585 2406 N -51 0 0 33 51 0 h .6776 g 4585 2439 N -51 0 0 34 51 0 h .6771 g 4585 2473 N -51 0 0 34 51 0 h .6766 g 4585 2507 N -51 0 0 33 51 0 h .676 g 4585 2540 N -51 0 0 34 51 0 h .6755 g 4585 2574 N -51 0 0 32 51 0 h .675 g 4585 2606 N -51 0 0 34 51 0 h .6744 g 4585 2640 N -51 0 0 33 51 0 h .6739 g 4585 2673 N -51 0 0 34 51 0 h .6734 g 4585 2707 N -51 0 0 34 51 0 h .6728 g 4585 2741 N -51 0 0 33 51 0 h .6723 g 4585 2774 N -51 0 0 34 51 0 h .6718 g 4585 2808 N -51 0 0 33 51 0 h .6712 g 4585 2841 N -51 0 0 34 51 0 h .6707 g 4585 2875 N -51 0 0 34 51 0 h .6701 g 4585 2909 N -51 0 0 33 51 0 h .6696 g 4585 2942 N -51 0 0 34 51 0 h .6691 g 4585 2976 N -51 0 0 33 51 0 h .6685 g 4585 3009 N -51 0 0 34 51 0 h .668 g 4585 3043 N -51 0 0 34 51 0 h .6675 g 4585 3077 N -51 0 0 33 51 0 h .6669 g 4585 3110 N -51 0 0 34 51 0 h .6664 g 4585 3144 N -51 0 0 33 51 0 h .6659 g 4585 3177 N -51 0 0 34 51 0 h .6653 g 4585 3211 N -51 0 0 34 51 0 h .6648 g 4585 3245 N -51 0 0 33 51 0 h .6643 g 4585 3278 N -51 0 0 34 51 0 h .6637 g 4585 3312 N -51 0 0 33 51 0 h .6632 g 4585 3345 N -51 0 0 34 51 0 h .6626 g 4585 3379 N -51 0 0 33 51 0 h .6621 g 4585 3412 N -51 0 0 34 51 0 h .6616 g 4585 3446 N -51 0 0 34 51 0 h .661 g 4585 3480 N -51 0 0 33 51 0 h .6605 g 4585 3513 N -51 0 0 34 51 0 h .66 g 4585 3547 N -51 0 0 33 51 0 h .6594 g 4585 3580 N -51 0 0 34 51 0 h .6589 g 4585 3614 N -51 0 0 34 51 0 h .6584 g 4585 3648 N -51 0 0 33 51 0 h .6578 g 4585 3681 N -51 0 0 34 51 0 h .6573 g 4585 3715 N -51 0 0 33 51 0 h .6568 g 4585 3748 N -51 0 0 34 51 0 h .6562 g 4585 3782 N -51 0 0 34 51 0 h .6557 g 4585 3816 N -51 0 0 33 51 0 h .6552 g 4585 3849 N -51 0 0 34 51 0 h .6546 g 4585 3883 N -51 0 0 33 51 0 h .6541 g 4585 3916 N -51 0 0 34 51 0 h .6535 g 4585 3950 N -51 0 0 33 51 0 h .653 g 4585 3983 N -51 0 0 34 51 0 h .6525 g 4585 4017 N -51 0 0 34 51 0 h .6519 g 4585 4051 N -51 0 0 33 51 0 h .6514 g 4585 4084 N -51 0 0 34 51 0 h .6509 g 4585 4118 N -51 0 0 33 51 0 h .6503 g 4585 4151 N -51 0 0 34 51 0 h .6498 g 4585 4185 N -51 0 0 34 51 0 h .6493 g 4585 4219 N -51 0 0 33 51 0 h .7118 g 4636 928 N -50 0 0 33 50 0 h .7111 g 4636 961 N -50 0 0 34 50 0 h .7104 g 4636 995 N -50 0 0 34 50 0 h .7097 g 4636 1029 N -50 0 0 33 50 0 h .709 g 4636 1062 N -50 0 0 34 50 0 h .7083 g 4636 1096 N -50 0 0 33 50 0 h .7076 g 4636 1129 N -50 0 0 34 50 0 h .707 g 4636 1163 N -50 0 0 34 50 0 h .7063 g 4636 1197 N -50 0 0 33 50 0 h .7056 g 4636 1230 N -50 0 0 34 50 0 h .7049 g 4636 1264 N -50 0 0 33 50 0 h .7042 g 4636 1297 N -50 0 0 34 50 0 h .7035 g 4636 1331 N -50 0 0 33 50 0 h .7028 g 4636 1364 N -50 0 0 34 50 0 h .7021 g 4636 1398 N -50 0 0 34 50 0 h .7014 g 4636 1432 N -50 0 0 33 50 0 h .7008 g 4636 1465 N -50 0 0 34 50 0 h .7001 g 4636 1499 N -50 0 0 33 50 0 h .6994 g 4636 1532 N -50 0 0 34 50 0 h .6987 g 4636 1566 N -50 0 0 34 50 0 h .698 g 4636 1600 N -50 0 0 33 50 0 h .6973 g 4636 1633 N -50 0 0 34 50 0 h .6966 g 4636 1667 N -50 0 0 33 50 0 h .6959 g 4636 1700 N -50 0 0 34 50 0 h .6952 g 4636 1734 N -50 0 0 34 50 0 h .6946 g 4636 1768 N -50 0 0 33 50 0 h .6939 g 4636 1801 N -50 0 0 34 50 0 h .6932 g 4636 1835 N -50 0 0 33 50 0 h .6925 g 4636 1868 N -50 0 0 34 50 0 h .6918 g 4636 1902 N -50 0 0 33 50 0 h .6911 g 4636 1935 N -50 0 0 34 50 0 h .6904 g 4636 1969 N -50 0 0 34 50 0 h .6897 g 4636 2003 N -50 0 0 33 50 0 h .689 g 4636 2036 N -50 0 0 34 50 0 h .6884 g 4636 2070 N -50 0 0 33 50 0 h .6877 g 4636 2103 N -50 0 0 34 50 0 h .687 g 4636 2137 N -50 0 0 34 50 0 h .6863 g 4636 2171 N -50 0 0 33 50 0 h .6856 g 4636 2204 N -50 0 0 34 50 0 h .6849 g 4636 2238 N -50 0 0 33 50 0 h .6842 g 4636 2271 N -50 0 0 34 50 0 h .6835 g 4636 2305 N -50 0 0 34 50 0 h .6829 g 4636 2339 N -50 0 0 33 50 0 h .6822 g 4636 2372 N -50 0 0 34 50 0 h .6815 g 4636 2406 N -50 0 0 33 50 0 h .6808 g 4636 2439 N -50 0 0 34 50 0 h .6801 g 4636 2473 N -50 0 0 34 50 0 h .6794 g 4636 2507 N -50 0 0 33 50 0 h .6787 g 4636 2540 N -50 0 0 34 50 0 h .678 g 4636 2574 N -50 0 0 32 50 0 h .6773 g 4636 2606 N -50 0 0 34 50 0 h .6767 g 4636 2640 N -50 0 0 33 50 0 h .676 g 4636 2673 N -50 0 0 34 50 0 h .6753 g 4636 2707 N -50 0 0 34 50 0 h .6746 g 4636 2741 N -50 0 0 33 50 0 h .6739 g 4636 2774 N -50 0 0 34 50 0 h .6732 g 4636 2808 N -50 0 0 33 50 0 h .6725 g 4636 2841 N -50 0 0 34 50 0 h .6718 g 4636 2875 N -50 0 0 34 50 0 h .6711 g 4636 2909 N -50 0 0 33 50 0 h .6705 g 4636 2942 N -50 0 0 34 50 0 h .6698 g 4636 2976 N -50 0 0 33 50 0 h .6691 g 4636 3009 N -50 0 0 34 50 0 h .6684 g 4636 3043 N -50 0 0 34 50 0 h .6677 g 4636 3077 N -50 0 0 33 50 0 h .667 g 4636 3110 N -50 0 0 34 50 0 h .6663 g 4636 3144 N -50 0 0 33 50 0 h .6656 g 4636 3177 N -50 0 0 34 50 0 h .6649 g 4636 3211 N -50 0 0 34 50 0 h .6643 g 4636 3245 N -50 0 0 33 50 0 h .6636 g 4636 3278 N -50 0 0 34 50 0 h .6629 g 4636 3312 N -50 0 0 33 50 0 h .6622 g 4636 3345 N -50 0 0 34 50 0 h .6615 g 4636 3379 N -50 0 0 33 50 0 h .6608 g 4636 3412 N -50 0 0 34 50 0 h .6601 g 4636 3446 N -50 0 0 34 50 0 h .6594 g 4636 3480 N -50 0 0 33 50 0 h .6587 g 4636 3513 N -50 0 0 34 50 0 h .6581 g 4636 3547 N -50 0 0 33 50 0 h .6574 g 4636 3580 N -50 0 0 34 50 0 h .6567 g 4636 3614 N -50 0 0 34 50 0 h .656 g 4636 3648 N -50 0 0 33 50 0 h .6553 g 4636 3681 N -50 0 0 34 50 0 h .6546 g 4636 3715 N -50 0 0 33 50 0 h .6539 g 4636 3748 N -50 0 0 34 50 0 h .6532 g 4636 3782 N -50 0 0 34 50 0 h .6525 g 4636 3816 N -50 0 0 33 50 0 h .6519 g 4636 3849 N -50 0 0 34 50 0 h .6512 g 4636 3883 N -50 0 0 33 50 0 h .6505 g 4636 3916 N -50 0 0 34 50 0 h .6498 g 4636 3950 N -50 0 0 33 50 0 h .6491 g 4636 3983 N -50 0 0 34 50 0 h .6484 g 4636 4017 N -50 0 0 34 50 0 h .6477 g 4636 4051 N -50 0 0 33 50 0 h .647 g 4636 4084 N -50 0 0 34 50 0 h .6463 g 4636 4118 N -50 0 0 33 50 0 h .6457 g 4636 4151 N -50 0 0 34 50 0 h .645 g 4636 4185 N -50 0 0 34 50 0 h .6443 g 4636 4219 N -50 0 0 33 50 0 h .7218 g 4686 928 N -51 0 0 33 51 0 h .721 g 4686 961 N -51 0 0 34 51 0 h .7201 g 4686 995 N -51 0 0 34 51 0 h .7193 g 4686 1029 N -51 0 0 33 51 0 h .7184 g 4686 1062 N -51 0 0 34 51 0 h .7176 g 4686 1096 N -51 0 0 33 51 0 h .7168 g 4686 1129 N -51 0 0 34 51 0 h .7159 g 4686 1163 N -51 0 0 34 51 0 h .7151 g 4686 1197 N -51 0 0 33 51 0 h .7142 g 4686 1230 N -51 0 0 34 51 0 h .7134 g 4686 1264 N -51 0 0 33 51 0 h .7125 g 4686 1297 N -51 0 0 34 51 0 h .7117 g 4686 1331 N -51 0 0 33 51 0 h .7109 g 4686 1364 N -51 0 0 34 51 0 h .71 g 4686 1398 N -51 0 0 34 51 0 h .7092 g 4686 1432 N -51 0 0 33 51 0 h .7083 g 4686 1465 N -51 0 0 34 51 0 h .7075 g 4686 1499 N -51 0 0 33 51 0 h .7067 g 4686 1532 N -51 0 0 34 51 0 h .7058 g 4686 1566 N -51 0 0 34 51 0 h .705 g 4686 1600 N -51 0 0 33 51 0 h .7041 g 4686 1633 N -51 0 0 34 51 0 h .7033 g 4686 1667 N -51 0 0 33 51 0 h .7024 g 4686 1700 N -51 0 0 34 51 0 h .7016 g 4686 1734 N -51 0 0 34 51 0 h .7008 g 4686 1768 N -51 0 0 33 51 0 h .6999 g 4686 1801 N -51 0 0 34 51 0 h .6991 g 4686 1835 N -51 0 0 33 51 0 h .6982 g 4686 1868 N -51 0 0 34 51 0 h .6974 g 4686 1902 N -51 0 0 33 51 0 h .6965 g 4686 1935 N -51 0 0 34 51 0 h .6957 g 4686 1969 N -51 0 0 34 51 0 h .6949 g 4686 2003 N -51 0 0 33 51 0 h .694 g 4686 2036 N -51 0 0 34 51 0 h .6932 g 4686 2070 N -51 0 0 33 51 0 h .6923 g 4686 2103 N -51 0 0 34 51 0 h .6915 g 4686 2137 N -51 0 0 34 51 0 h .6907 g 4686 2171 N -51 0 0 33 51 0 h .6898 g 4686 2204 N -51 0 0 34 51 0 h .689 g 4686 2238 N -51 0 0 33 51 0 h .6881 g 4686 2271 N -51 0 0 34 51 0 h .6873 g 4686 2305 N -51 0 0 34 51 0 h .6864 g 4686 2339 N -51 0 0 33 51 0 h .6856 g 4686 2372 N -51 0 0 34 51 0 h .6848 g 4686 2406 N -51 0 0 33 51 0 h .6839 g 4686 2439 N -51 0 0 34 51 0 h .6831 g 4686 2473 N -51 0 0 34 51 0 h .6822 g 4686 2507 N -51 0 0 33 51 0 h .6814 g 4686 2540 N -51 0 0 34 51 0 h .6806 g 4686 2574 N -51 0 0 32 51 0 h .6797 g 4686 2606 N -51 0 0 34 51 0 h .6789 g 4686 2640 N -51 0 0 33 51 0 h .678 g 4686 2673 N -51 0 0 34 51 0 h .6772 g 4686 2707 N -51 0 0 34 51 0 h .6763 g 4686 2741 N -51 0 0 33 51 0 h .6755 g 4686 2774 N -51 0 0 34 51 0 h .6747 g 4686 2808 N -51 0 0 33 51 0 h .6738 g 4686 2841 N -51 0 0 34 51 0 h .673 g 4686 2875 N -51 0 0 34 51 0 h .6721 g 4686 2909 N -51 0 0 33 51 0 h .6713 g 4686 2942 N -51 0 0 34 51 0 h .6705 g 4686 2976 N -51 0 0 33 51 0 h .6696 g 4686 3009 N -51 0 0 34 51 0 h .6688 g 4686 3043 N -51 0 0 34 51 0 h .6679 g 4686 3077 N -51 0 0 33 51 0 h .6671 g 4686 3110 N -51 0 0 34 51 0 h .6662 g 4686 3144 N -51 0 0 33 51 0 h .6654 g 4686 3177 N -51 0 0 34 51 0 h .6646 g 4686 3211 N -51 0 0 34 51 0 h .6637 g 4686 3245 N -51 0 0 33 51 0 h .6629 g 4686 3278 N -51 0 0 34 51 0 h .662 g 4686 3312 N -51 0 0 33 51 0 h .6612 g 4686 3345 N -51 0 0 34 51 0 h .6604 g 4686 3379 N -51 0 0 33 51 0 h .6595 g 4686 3412 N -51 0 0 34 51 0 h .6587 g 4686 3446 N -51 0 0 34 51 0 h .6578 g 4686 3480 N -51 0 0 33 51 0 h .657 g 4686 3513 N -51 0 0 34 51 0 h .6561 g 4686 3547 N -51 0 0 33 51 0 h .6553 g 4686 3580 N -51 0 0 34 51 0 h .6545 g 4686 3614 N -51 0 0 34 51 0 h .6536 g 4686 3648 N -51 0 0 33 51 0 h .6528 g 4686 3681 N -51 0 0 34 51 0 h .6519 g 4686 3715 N -51 0 0 33 51 0 h .6511 g 4686 3748 N -51 0 0 34 51 0 h .6503 g 4686 3782 N -51 0 0 34 51 0 h .6494 g 4686 3816 N -51 0 0 33 51 0 h .6486 g 4686 3849 N -51 0 0 34 51 0 h .6477 g 4686 3883 N -51 0 0 33 51 0 h .6469 g 4686 3916 N -51 0 0 34 51 0 h .646 g 4686 3950 N -51 0 0 33 51 0 h .6452 g 4686 3983 N -51 0 0 34 51 0 h .6444 g 4686 4017 N -51 0 0 34 51 0 h .6435 g 4686 4051 N -51 0 0 33 51 0 h .6427 g 4686 4084 N -51 0 0 34 51 0 h .6418 g 4686 4118 N -51 0 0 33 51 0 h .641 g 4686 4151 N -51 0 0 34 51 0 h .6402 g 4686 4185 N -51 0 0 34 51 0 h .6393 g 4686 4219 N -51 0 0 33 51 0 h .7318 g 4737 928 N -51 0 0 33 51 0 h .7308 g 4737 961 N -51 0 0 34 51 0 h .7298 g 4737 995 N -51 0 0 34 51 0 h .7288 g 4737 1029 N -51 0 0 33 51 0 h .7278 g 4737 1062 N -51 0 0 34 51 0 h .7269 g 4737 1096 N -51 0 0 33 51 0 h .7259 g 4737 1129 N -51 0 0 34 51 0 h .7249 g 4737 1163 N -51 0 0 34 51 0 h .7239 g 4737 1197 N -51 0 0 33 51 0 h .7229 g 4737 1230 N -51 0 0 34 51 0 h .7219 g 4737 1264 N -51 0 0 33 51 0 h .7209 g 4737 1297 N -51 0 0 34 51 0 h .7199 g 4737 1331 N -51 0 0 33 51 0 h .7189 g 4737 1364 N -51 0 0 34 51 0 h .7179 g 4737 1398 N -51 0 0 34 51 0 h .7169 g 4737 1432 N -51 0 0 33 51 0 h .7159 g 4737 1465 N -51 0 0 34 51 0 h .7149 g 4737 1499 N -51 0 0 33 51 0 h .7139 g 4737 1532 N -51 0 0 34 51 0 h .7129 g 4737 1566 N -51 0 0 34 51 0 h .7119 g 4737 1600 N -51 0 0 33 51 0 h .7109 g 4737 1633 N -51 0 0 34 51 0 h .7099 g 4737 1667 N -51 0 0 33 51 0 h .7089 g 4737 1700 N -51 0 0 34 51 0 h .708 g 4737 1734 N -51 0 0 34 51 0 h .707 g 4737 1768 N -51 0 0 33 51 0 h .706 g 4737 1801 N -51 0 0 34 51 0 h .705 g 4737 1835 N -51 0 0 33 51 0 h .704 g 4737 1868 N -51 0 0 34 51 0 h .703 g 4737 1902 N -51 0 0 33 51 0 h .702 g 4737 1935 N -51 0 0 34 51 0 h .701 g 4737 1969 N -51 0 0 34 51 0 h .7 g 4737 2003 N -51 0 0 33 51 0 h .699 g 4737 2036 N -51 0 0 34 51 0 h .698 g 4737 2070 N -51 0 0 33 51 0 h .697 g 4737 2103 N -51 0 0 34 51 0 h .696 g 4737 2137 N -51 0 0 34 51 0 h .695 g 4737 2171 N -51 0 0 33 51 0 h .694 g 4737 2204 N -51 0 0 34 51 0 h .693 g 4737 2238 N -51 0 0 33 51 0 h .692 g 4737 2271 N -51 0 0 34 51 0 h .691 g 4737 2305 N -51 0 0 34 51 0 h .69 g 4737 2339 N -51 0 0 33 51 0 h .689 g 4737 2372 N -51 0 0 34 51 0 h .6881 g 4737 2406 N -51 0 0 33 51 0 h .6871 g 4737 2439 N -51 0 0 34 51 0 h .6861 g 4737 2473 N -51 0 0 34 51 0 h .6851 g 4737 2507 N -51 0 0 33 51 0 h .6841 g 4737 2540 N -51 0 0 34 51 0 h .6831 g 4737 2574 N -51 0 0 32 51 0 h .6821 g 4737 2606 N -51 0 0 34 51 0 h .6811 g 4737 2640 N -51 0 0 33 51 0 h .6801 g 4737 2673 N -51 0 0 34 51 0 h .6791 g 4737 2707 N -51 0 0 34 51 0 h .6781 g 4737 2741 N -51 0 0 33 51 0 h .6771 g 4737 2774 N -51 0 0 34 51 0 h .6761 g 4737 2808 N -51 0 0 33 51 0 h .6751 g 4737 2841 N -51 0 0 34 51 0 h .6741 g 4737 2875 N -51 0 0 34 51 0 h .6731 g 4737 2909 N -51 0 0 33 51 0 h .6721 g 4737 2942 N -51 0 0 34 51 0 h .6711 g 4737 2976 N -51 0 0 33 51 0 h .6701 g 4737 3009 N -51 0 0 34 51 0 h .6692 g 4737 3043 N -51 0 0 34 51 0 h .6682 g 4737 3077 N -51 0 0 33 51 0 h .6672 g 4737 3110 N -51 0 0 34 51 0 h .6662 g 4737 3144 N -51 0 0 33 51 0 h .6652 g 4737 3177 N -51 0 0 34 51 0 h .6642 g 4737 3211 N -51 0 0 34 51 0 h .6632 g 4737 3245 N -51 0 0 33 51 0 h .6622 g 4737 3278 N -51 0 0 34 51 0 h .6612 g 4737 3312 N -51 0 0 33 51 0 h .6602 g 4737 3345 N -51 0 0 34 51 0 h .6592 g 4737 3379 N -51 0 0 33 51 0 h .6582 g 4737 3412 N -51 0 0 34 51 0 h .6572 g 4737 3446 N -51 0 0 34 51 0 h .6562 g 4737 3480 N -51 0 0 33 51 0 h .6552 g 4737 3513 N -51 0 0 34 51 0 h .6542 g 4737 3547 N -51 0 0 33 51 0 h .6532 g 4737 3580 N -51 0 0 34 51 0 h .6522 g 4737 3614 N -51 0 0 34 51 0 h .6512 g 4737 3648 N -51 0 0 33 51 0 h .6503 g 4737 3681 N -51 0 0 34 51 0 h .6493 g 4737 3715 N -51 0 0 33 51 0 h .6483 g 4737 3748 N -51 0 0 34 51 0 h .6473 g 4737 3782 N -51 0 0 34 51 0 h .6463 g 4737 3816 N -51 0 0 33 51 0 h .6453 g 4737 3849 N -51 0 0 34 51 0 h .6443 g 4737 3883 N -51 0 0 33 51 0 h .6433 g 4737 3916 N -51 0 0 34 51 0 h .6423 g 4737 3950 N -51 0 0 33 51 0 h .6413 g 4737 3983 N -51 0 0 34 51 0 h .6403 g 4737 4017 N -51 0 0 34 51 0 h .6393 g 4737 4051 N -51 0 0 33 51 0 h .6383 g 4737 4084 N -51 0 0 34 51 0 h .6373 g 4737 4118 N -51 0 0 33 51 0 h .6363 g 4737 4151 N -51 0 0 34 51 0 h .6353 g 4737 4185 N -51 0 0 34 51 0 h .6343 g 4737 4219 N -51 0 0 33 51 0 h .7419 g 4788 928 N -50 0 0 33 50 0 h .7407 g 4788 961 N -50 0 0 34 50 0 h .7396 g 4788 995 N -50 0 0 34 50 0 h .7384 g 4788 1029 N -50 0 0 33 50 0 h .7373 g 4788 1062 N -50 0 0 34 50 0 h .7361 g 4788 1096 N -50 0 0 33 50 0 h .735 g 4788 1129 N -50 0 0 34 50 0 h .7338 g 4788 1163 N -50 0 0 34 50 0 h .7327 g 4788 1197 N -50 0 0 33 50 0 h .7315 g 4788 1230 N -50 0 0 34 50 0 h .7304 g 4788 1264 N -50 0 0 33 50 0 h .7292 g 4788 1297 N -50 0 0 34 50 0 h .7281 g 4788 1331 N -50 0 0 33 50 0 h .7269 g 4788 1364 N -50 0 0 34 50 0 h .7258 g 4788 1398 N -50 0 0 34 50 0 h .7246 g 4788 1432 N -50 0 0 33 50 0 h .7235 g 4788 1465 N -50 0 0 34 50 0 h .7223 g 4788 1499 N -50 0 0 33 50 0 h .7212 g 4788 1532 N -50 0 0 34 50 0 h .72 g 4788 1566 N -50 0 0 34 50 0 h .7189 g 4788 1600 N -50 0 0 33 50 0 h .7177 g 4788 1633 N -50 0 0 34 50 0 h .7166 g 4788 1667 N -50 0 0 33 50 0 h .7154 g 4788 1700 N -50 0 0 34 50 0 h .7143 g 4788 1734 N -50 0 0 34 50 0 h .7132 g 4788 1768 N -50 0 0 33 50 0 h .712 g 4788 1801 N -50 0 0 34 50 0 h .7109 g 4788 1835 N -50 0 0 33 50 0 h .7097 g 4788 1868 N -50 0 0 34 50 0 h .7086 g 4788 1902 N -50 0 0 33 50 0 h .7074 g 4788 1935 N -50 0 0 34 50 0 h .7063 g 4788 1969 N -50 0 0 34 50 0 h .7051 g 4788 2003 N -50 0 0 33 50 0 h .704 g 4788 2036 N -50 0 0 34 50 0 h .7028 g 4788 2070 N -50 0 0 33 50 0 h .7017 g 4788 2103 N -50 0 0 34 50 0 h .7005 g 4788 2137 N -50 0 0 34 50 0 h .6994 g 4788 2171 N -50 0 0 33 50 0 h .6982 g 4788 2204 N -50 0 0 34 50 0 h .6971 g 4788 2238 N -50 0 0 33 50 0 h .6959 g 4788 2271 N -50 0 0 34 50 0 h .6948 g 4788 2305 N -50 0 0 34 50 0 h .6936 g 4788 2339 N -50 0 0 33 50 0 h .6925 g 4788 2372 N -50 0 0 34 50 0 h .6913 g 4788 2406 N -50 0 0 33 50 0 h .6902 g 4788 2439 N -50 0 0 34 50 0 h .689 g 4788 2473 N -50 0 0 34 50 0 h .6879 g 4788 2507 N -50 0 0 33 50 0 h .6868 g 4788 2540 N -50 0 0 34 50 0 h .6856 g 4788 2574 N -50 0 0 32 50 0 h .6845 g 4788 2606 N -50 0 0 34 50 0 h .6833 g 4788 2640 N -50 0 0 33 50 0 h .6822 g 4788 2673 N -50 0 0 34 50 0 h .681 g 4788 2707 N -50 0 0 34 50 0 h .6799 g 4788 2741 N -50 0 0 33 50 0 h .6787 g 4788 2774 N -50 0 0 34 50 0 h .6776 g 4788 2808 N -50 0 0 33 50 0 h .6764 g 4788 2841 N -50 0 0 34 50 0 h .6753 g 4788 2875 N -50 0 0 34 50 0 h .6741 g 4788 2909 N -50 0 0 33 50 0 h .673 g 4788 2942 N -50 0 0 34 50 0 h .6718 g 4788 2976 N -50 0 0 33 50 0 h .6707 g 4788 3009 N -50 0 0 34 50 0 h .6695 g 4788 3043 N -50 0 0 34 50 0 h .6684 g 4788 3077 N -50 0 0 33 50 0 h .6672 g 4788 3110 N -50 0 0 34 50 0 h .6661 g 4788 3144 N -50 0 0 33 50 0 h .6649 g 4788 3177 N -50 0 0 34 50 0 h .6638 g 4788 3211 N -50 0 0 34 50 0 h .6626 g 4788 3245 N -50 0 0 33 50 0 h .6615 g 4788 3278 N -50 0 0 34 50 0 h .6604 g 4788 3312 N -50 0 0 33 50 0 h .6592 g 4788 3345 N -50 0 0 34 50 0 h .6581 g 4788 3379 N -50 0 0 33 50 0 h .6569 g 4788 3412 N -50 0 0 34 50 0 h .6558 g 4788 3446 N -50 0 0 34 50 0 h .6546 g 4788 3480 N -50 0 0 33 50 0 h .6535 g 4788 3513 N -50 0 0 34 50 0 h .6523 g 4788 3547 N -50 0 0 33 50 0 h .6512 g 4788 3580 N -50 0 0 34 50 0 h .65 g 4788 3614 N -50 0 0 34 50 0 h .6489 g 4788 3648 N -50 0 0 33 50 0 h .6477 g 4788 3681 N -50 0 0 34 50 0 h .6466 g 4788 3715 N -50 0 0 33 50 0 h .6454 g 4788 3748 N -50 0 0 34 50 0 h .6443 g 4788 3782 N -50 0 0 34 50 0 h .6431 g 4788 3816 N -50 0 0 33 50 0 h .642 g 4788 3849 N -50 0 0 34 50 0 h .6408 g 4788 3883 N -50 0 0 33 50 0 h .6397 g 4788 3916 N -50 0 0 34 50 0 h .6385 g 4788 3950 N -50 0 0 33 50 0 h .6374 g 4788 3983 N -50 0 0 34 50 0 h .6362 g 4788 4017 N -50 0 0 34 50 0 h .6351 g 4788 4051 N -50 0 0 33 50 0 h .634 g 4788 4084 N -50 0 0 34 50 0 h .6328 g 4788 4118 N -50 0 0 33 50 0 h .6317 g 4788 4151 N -50 0 0 34 50 0 h .6305 g 4788 4185 N -50 0 0 34 50 0 h .6294 g 4788 4219 N -50 0 0 33 50 0 h .7519 g 4838 928 N -51 0 0 33 51 0 h .7506 g 4838 961 N -51 0 0 34 51 0 h .7493 g 4838 995 N -51 0 0 34 51 0 h .748 g 4838 1029 N -51 0 0 33 51 0 h .7467 g 4838 1062 N -51 0 0 34 51 0 h .7454 g 4838 1096 N -51 0 0 33 51 0 h .7441 g 4838 1129 N -51 0 0 34 51 0 h .7428 g 4838 1163 N -51 0 0 34 51 0 h .7415 g 4838 1197 N -51 0 0 33 51 0 h .7402 g 4838 1230 N -51 0 0 34 51 0 h .7389 g 4838 1264 N -51 0 0 33 51 0 h .7376 g 4838 1297 N -51 0 0 34 51 0 h .7363 g 4838 1331 N -51 0 0 33 51 0 h .735 g 4838 1364 N -51 0 0 34 51 0 h .7337 g 4838 1398 N -51 0 0 34 51 0 h .7324 g 4838 1432 N -51 0 0 33 51 0 h .7311 g 4838 1465 N -51 0 0 34 51 0 h .7298 g 4838 1499 N -51 0 0 33 51 0 h .7285 g 4838 1532 N -51 0 0 34 51 0 h .7272 g 4838 1566 N -51 0 0 34 51 0 h .7259 g 4838 1600 N -51 0 0 33 51 0 h .7246 g 4838 1633 N -51 0 0 34 51 0 h .7233 g 4838 1667 N -51 0 0 33 51 0 h .722 g 4838 1700 N -51 0 0 34 51 0 h .7207 g 4838 1734 N -51 0 0 34 51 0 h .7194 g 4838 1768 N -51 0 0 33 51 0 h .7181 g 4838 1801 N -51 0 0 34 51 0 h .7168 g 4838 1835 N -51 0 0 33 51 0 h .7155 g 4838 1868 N -51 0 0 34 51 0 h .7141 g 4838 1902 N -51 0 0 33 51 0 h .7128 g 4838 1935 N -51 0 0 34 51 0 h .7115 g 4838 1969 N -51 0 0 34 51 0 h .7102 g 4838 2003 N -51 0 0 33 51 0 h .7089 g 4838 2036 N -51 0 0 34 51 0 h .7076 g 4838 2070 N -51 0 0 33 51 0 h .7063 g 4838 2103 N -51 0 0 34 51 0 h .705 g 4838 2137 N -51 0 0 34 51 0 h .7037 g 4838 2171 N -51 0 0 33 51 0 h .7024 g 4838 2204 N -51 0 0 34 51 0 h .7011 g 4838 2238 N -51 0 0 33 51 0 h .6998 g 4838 2271 N -51 0 0 34 51 0 h .6985 g 4838 2305 N -51 0 0 34 51 0 h .6972 g 4838 2339 N -51 0 0 33 51 0 h .6959 g 4838 2372 N -51 0 0 34 51 0 h .6946 g 4838 2406 N -51 0 0 33 51 0 h .6933 g 4838 2439 N -51 0 0 34 51 0 h .692 g 4838 2473 N -51 0 0 34 51 0 h .6907 g 4838 2507 N -51 0 0 33 51 0 h .6894 g 4838 2540 N -51 0 0 34 51 0 h .6881 g 4838 2574 N -51 0 0 32 51 0 h .6868 g 4838 2606 N -51 0 0 34 51 0 h .6855 g 4838 2640 N -51 0 0 33 51 0 h .6842 g 4838 2673 N -51 0 0 34 51 0 h .6829 g 4838 2707 N -51 0 0 34 51 0 h .6816 g 4838 2741 N -51 0 0 33 51 0 h .6803 g 4838 2774 N -51 0 0 34 51 0 h .679 g 4838 2808 N -51 0 0 33 51 0 h .6777 g 4838 2841 N -51 0 0 34 51 0 h .6764 g 4838 2875 N -51 0 0 34 51 0 h .6751 g 4838 2909 N -51 0 0 33 51 0 h .6738 g 4838 2942 N -51 0 0 34 51 0 h .6725 g 4838 2976 N -51 0 0 33 51 0 h .6712 g 4838 3009 N -51 0 0 34 51 0 h .6699 g 4838 3043 N -51 0 0 34 51 0 h .6686 g 4838 3077 N -51 0 0 33 51 0 h .6673 g 4838 3110 N -51 0 0 34 51 0 h .666 g 4838 3144 N -51 0 0 33 51 0 h .6647 g 4838 3177 N -51 0 0 34 51 0 h .6634 g 4838 3211 N -51 0 0 34 51 0 h .6621 g 4838 3245 N -51 0 0 33 51 0 h .6608 g 4838 3278 N -51 0 0 34 51 0 h .6595 g 4838 3312 N -51 0 0 33 51 0 h .6582 g 4838 3345 N -51 0 0 34 51 0 h .6569 g 4838 3379 N -51 0 0 33 51 0 h .6556 g 4838 3412 N -51 0 0 34 51 0 h .6543 g 4838 3446 N -51 0 0 34 51 0 h .653 g 4838 3480 N -51 0 0 33 51 0 h .6517 g 4838 3513 N -51 0 0 34 51 0 h .6504 g 4838 3547 N -51 0 0 33 51 0 h .6491 g 4838 3580 N -51 0 0 34 51 0 h .6478 g 4838 3614 N -51 0 0 34 51 0 h .6465 g 4838 3648 N -51 0 0 33 51 0 h .6452 g 4838 3681 N -51 0 0 34 51 0 h .6439 g 4838 3715 N -51 0 0 33 51 0 h .6426 g 4838 3748 N -51 0 0 34 51 0 h .6413 g 4838 3782 N -51 0 0 34 51 0 h .64 g 4838 3816 N -51 0 0 33 51 0 h .6387 g 4838 3849 N -51 0 0 34 51 0 h .6374 g 4838 3883 N -51 0 0 33 51 0 h .6361 g 4838 3916 N -51 0 0 34 51 0 h .6348 g 4838 3950 N -51 0 0 33 51 0 h .6335 g 4838 3983 N -51 0 0 34 51 0 h .6322 g 4838 4017 N -51 0 0 34 51 0 h .6309 g 4838 4051 N -51 0 0 33 51 0 h .6296 g 4838 4084 N -51 0 0 34 51 0 h .6283 g 4838 4118 N -51 0 0 33 51 0 h .627 g 4838 4151 N -51 0 0 34 51 0 h .6257 g 4838 4185 N -51 0 0 34 51 0 h .6244 g 4838 4219 N -51 0 0 33 51 0 h .7619 g 4889 928 N -50 0 0 33 50 0 h .7604 g 4889 961 N -50 0 0 34 50 0 h .759 g 4889 995 N -50 0 0 34 50 0 h .7575 g 4889 1029 N -50 0 0 33 50 0 h .7561 g 4889 1062 N -50 0 0 34 50 0 h .7546 g 4889 1096 N -50 0 0 33 50 0 h .7532 g 4889 1129 N -50 0 0 34 50 0 h .7517 g 4889 1163 N -50 0 0 34 50 0 h .7503 g 4889 1197 N -50 0 0 33 50 0 h .7488 g 4889 1230 N -50 0 0 34 50 0 h .7474 g 4889 1264 N -50 0 0 33 50 0 h .7459 g 4889 1297 N -50 0 0 34 50 0 h .7445 g 4889 1331 N -50 0 0 33 50 0 h .743 g 4889 1364 N -50 0 0 34 50 0 h .7415 g 4889 1398 N -50 0 0 34 50 0 h .7401 g 4889 1432 N -50 0 0 33 50 0 h .7386 g 4889 1465 N -50 0 0 34 50 0 h .7372 g 4889 1499 N -50 0 0 33 50 0 h .7357 g 4889 1532 N -50 0 0 34 50 0 h .7343 g 4889 1566 N -50 0 0 34 50 0 h .7328 g 4889 1600 N -50 0 0 33 50 0 h .7314 g 4889 1633 N -50 0 0 34 50 0 h .7299 g 4889 1667 N -50 0 0 33 50 0 h .7285 g 4889 1700 N -50 0 0 34 50 0 h .727 g 4889 1734 N -50 0 0 34 50 0 h .7256 g 4889 1768 N -50 0 0 33 50 0 h .7241 g 4889 1801 N -50 0 0 34 50 0 h .7226 g 4889 1835 N -50 0 0 33 50 0 h .7212 g 4889 1868 N -50 0 0 34 50 0 h .7197 g 4889 1902 N -50 0 0 33 50 0 h .7183 g 4889 1935 N -50 0 0 34 50 0 h .7168 g 4889 1969 N -50 0 0 34 50 0 h .7154 g 4889 2003 N -50 0 0 33 50 0 h .7139 g 4889 2036 N -50 0 0 34 50 0 h .7125 g 4889 2070 N -50 0 0 33 50 0 h .711 g 4889 2103 N -50 0 0 34 50 0 h .7096 g 4889 2137 N -50 0 0 34 50 0 h .7081 g 4889 2171 N -50 0 0 33 50 0 h .7066 g 4889 2204 N -50 0 0 34 50 0 h .7052 g 4889 2238 N -50 0 0 33 50 0 h .7037 g 4889 2271 N -50 0 0 34 50 0 h .7023 g 4889 2305 N -50 0 0 34 50 0 h .7008 g 4889 2339 N -50 0 0 33 50 0 h .6994 g 4889 2372 N -50 0 0 34 50 0 h .6979 g 4889 2406 N -50 0 0 33 50 0 h .6965 g 4889 2439 N -50 0 0 34 50 0 h .695 g 4889 2473 N -50 0 0 34 50 0 h .6936 g 4889 2507 N -50 0 0 33 50 0 h .6921 g 4889 2540 N -50 0 0 34 50 0 h .6907 g 4889 2574 N -50 0 0 32 50 0 h .6892 g 4889 2606 N -50 0 0 34 50 0 h .6877 g 4889 2640 N -50 0 0 33 50 0 h .6863 g 4889 2673 N -50 0 0 34 50 0 h .6848 g 4889 2707 N -50 0 0 34 50 0 h .6834 g 4889 2741 N -50 0 0 33 50 0 h .6819 g 4889 2774 N -50 0 0 34 50 0 h .6805 g 4889 2808 N -50 0 0 33 50 0 h .679 g 4889 2841 N -50 0 0 34 50 0 h .6776 g 4889 2875 N -50 0 0 34 50 0 h .6761 g 4889 2909 N -50 0 0 33 50 0 h .6747 g 4889 2942 N -50 0 0 34 50 0 h .6732 g 4889 2976 N -50 0 0 33 50 0 h .6718 g 4889 3009 N -50 0 0 34 50 0 h .6703 g 4889 3043 N -50 0 0 34 50 0 h .6688 g 4889 3077 N -50 0 0 33 50 0 h .6674 g 4889 3110 N -50 0 0 34 50 0 h .6659 g 4889 3144 N -50 0 0 33 50 0 h .6645 g 4889 3177 N -50 0 0 34 50 0 h .663 g 4889 3211 N -50 0 0 34 50 0 h .6616 g 4889 3245 N -50 0 0 33 50 0 h .6601 g 4889 3278 N -50 0 0 34 50 0 h .6587 g 4889 3312 N -50 0 0 33 50 0 h .6572 g 4889 3345 N -50 0 0 34 50 0 h .6558 g 4889 3379 N -50 0 0 33 50 0 h .6543 g 4889 3412 N -50 0 0 34 50 0 h .6529 g 4889 3446 N -50 0 0 34 50 0 h .6514 g 4889 3480 N -50 0 0 33 50 0 h .6499 g 4889 3513 N -50 0 0 34 50 0 h .6485 g 4889 3547 N -50 0 0 33 50 0 h .647 g 4889 3580 N -50 0 0 34 50 0 h .6456 g 4889 3614 N -50 0 0 34 50 0 h .6441 g 4889 3648 N -50 0 0 33 50 0 h .6427 g 4889 3681 N -50 0 0 34 50 0 h .6412 g 4889 3715 N -50 0 0 33 50 0 h .6398 g 4889 3748 N -50 0 0 34 50 0 h .6383 g 4889 3782 N -50 0 0 34 50 0 h .6369 g 4889 3816 N -50 0 0 33 50 0 h .6354 g 4889 3849 N -50 0 0 34 50 0 h .634 g 4889 3883 N -50 0 0 33 50 0 h .6325 g 4889 3916 N -50 0 0 34 50 0 h .631 g 4889 3950 N -50 0 0 33 50 0 h .6296 g 4889 3983 N -50 0 0 34 50 0 h .6281 g 4889 4017 N -50 0 0 34 50 0 h .6267 g 4889 4051 N -50 0 0 33 50 0 h .6252 g 4889 4084 N -50 0 0 34 50 0 h .6238 g 4889 4118 N -50 0 0 33 50 0 h .6223 g 4889 4151 N -50 0 0 34 50 0 h .6209 g 4889 4185 N -50 0 0 34 50 0 h .6194 g 4889 4219 N -50 0 0 33 50 0 h .7719 g 4939 928 N -51 0 0 33 51 0 h .7703 g 4939 961 N -51 0 0 34 51 0 h .7687 g 4939 995 N -51 0 0 34 51 0 h .7671 g 4939 1029 N -51 0 0 33 51 0 h .7655 g 4939 1062 N -51 0 0 34 51 0 h .7639 g 4939 1096 N -51 0 0 33 51 0 h .7623 g 4939 1129 N -51 0 0 34 51 0 h .7607 g 4939 1163 N -51 0 0 34 51 0 h .7591 g 4939 1197 N -51 0 0 33 51 0 h .7575 g 4939 1230 N -51 0 0 34 51 0 h .7559 g 4939 1264 N -51 0 0 33 51 0 h .7542 g 4939 1297 N -51 0 0 34 51 0 h .7526 g 4939 1331 N -51 0 0 33 51 0 h .751 g 4939 1364 N -51 0 0 34 51 0 h .7494 g 4939 1398 N -51 0 0 34 51 0 h .7478 g 4939 1432 N -51 0 0 33 51 0 h .7462 g 4939 1465 N -51 0 0 34 51 0 h .7446 g 4939 1499 N -51 0 0 33 51 0 h .743 g 4939 1532 N -51 0 0 34 51 0 h .7414 g 4939 1566 N -51 0 0 34 51 0 h .7398 g 4939 1600 N -51 0 0 33 51 0 h .7382 g 4939 1633 N -51 0 0 34 51 0 h .7366 g 4939 1667 N -51 0 0 33 51 0 h .735 g 4939 1700 N -51 0 0 34 51 0 h .7334 g 4939 1734 N -51 0 0 34 51 0 h .7317 g 4939 1768 N -51 0 0 33 51 0 h .7301 g 4939 1801 N -51 0 0 34 51 0 h .7285 g 4939 1835 N -51 0 0 33 51 0 h .7269 g 4939 1868 N -51 0 0 34 51 0 h .7253 g 4939 1902 N -51 0 0 33 51 0 h .7237 g 4939 1935 N -51 0 0 34 51 0 h .7221 g 4939 1969 N -51 0 0 34 51 0 h .7205 g 4939 2003 N -51 0 0 33 51 0 h .7189 g 4939 2036 N -51 0 0 34 51 0 h .7173 g 4939 2070 N -51 0 0 33 51 0 h .7157 g 4939 2103 N -51 0 0 34 51 0 h .7141 g 4939 2137 N -51 0 0 34 51 0 h .7125 g 4939 2171 N -51 0 0 33 51 0 h .7109 g 4939 2204 N -51 0 0 34 51 0 h .7093 g 4939 2238 N -51 0 0 33 51 0 h .7076 g 4939 2271 N -51 0 0 34 51 0 h .706 g 4939 2305 N -51 0 0 34 51 0 h .7044 g 4939 2339 N -51 0 0 33 51 0 h .7028 g 4939 2372 N -51 0 0 34 51 0 h .7012 g 4939 2406 N -51 0 0 33 51 0 h .6996 g 4939 2439 N -51 0 0 34 51 0 h .698 g 4939 2473 N -51 0 0 34 51 0 h .6964 g 4939 2507 N -51 0 0 33 51 0 h .6948 g 4939 2540 N -51 0 0 34 51 0 h .6932 g 4939 2574 N -51 0 0 32 51 0 h .6916 g 4939 2606 N -51 0 0 34 51 0 h .69 g 4939 2640 N -51 0 0 33 51 0 h .6884 g 4939 2673 N -51 0 0 34 51 0 h .6868 g 4939 2707 N -51 0 0 34 51 0 h .6851 g 4939 2741 N -51 0 0 33 51 0 h .6835 g 4939 2774 N -51 0 0 34 51 0 h .6819 g 4939 2808 N -51 0 0 33 51 0 h .6803 g 4939 2841 N -51 0 0 34 51 0 h .6787 g 4939 2875 N -51 0 0 34 51 0 h .6771 g 4939 2909 N -51 0 0 33 51 0 h .6755 g 4939 2942 N -51 0 0 34 51 0 h .6739 g 4939 2976 N -51 0 0 33 51 0 h .6723 g 4939 3009 N -51 0 0 34 51 0 h .6707 g 4939 3043 N -51 0 0 34 51 0 h .6691 g 4939 3077 N -51 0 0 33 51 0 h .6675 g 4939 3110 N -51 0 0 34 51 0 h .6659 g 4939 3144 N -51 0 0 33 51 0 h .6643 g 4939 3177 N -51 0 0 34 51 0 h .6626 g 4939 3211 N -51 0 0 34 51 0 h .661 g 4939 3245 N -51 0 0 33 51 0 h .6594 g 4939 3278 N -51 0 0 34 51 0 h .6578 g 4939 3312 N -51 0 0 33 51 0 h .6562 g 4939 3345 N -51 0 0 34 51 0 h .6546 g 4939 3379 N -51 0 0 33 51 0 h .653 g 4939 3412 N -51 0 0 34 51 0 h .6514 g 4939 3446 N -51 0 0 34 51 0 h .6498 g 4939 3480 N -51 0 0 33 51 0 h .6482 g 4939 3513 N -51 0 0 34 51 0 h .6466 g 4939 3547 N -51 0 0 33 51 0 h .645 g 4939 3580 N -51 0 0 34 51 0 h .6434 g 4939 3614 N -51 0 0 34 51 0 h .6418 g 4939 3648 N -51 0 0 33 51 0 h .6402 g 4939 3681 N -51 0 0 34 51 0 h .6385 g 4939 3715 N -51 0 0 33 51 0 h .6369 g 4939 3748 N -51 0 0 34 51 0 h .6353 g 4939 3782 N -51 0 0 34 51 0 h .6337 g 4939 3816 N -51 0 0 33 51 0 h .6321 g 4939 3849 N -51 0 0 34 51 0 h .6305 g 4939 3883 N -51 0 0 33 51 0 h .6289 g 4939 3916 N -51 0 0 34 51 0 h .6273 g 4939 3950 N -51 0 0 33 51 0 h .6257 g 4939 3983 N -51 0 0 34 51 0 h .6241 g 4939 4017 N -51 0 0 34 51 0 h .6225 g 4939 4051 N -51 0 0 33 51 0 h .6209 g 4939 4084 N -51 0 0 34 51 0 h .6193 g 4939 4118 N -51 0 0 33 51 0 h .6177 g 4939 4151 N -51 0 0 34 51 0 h .616 g 4939 4185 N -51 0 0 34 51 0 h .6144 g 4939 4219 N -51 0 0 33 51 0 h .7819 g 4990 928 N -50 0 0 33 50 0 h .7802 g 4990 961 N -50 0 0 34 50 0 h .7784 g 4990 995 N -50 0 0 34 50 0 h .7767 g 4990 1029 N -50 0 0 33 50 0 h .7749 g 4990 1062 N -50 0 0 34 50 0 h .7731 g 4990 1096 N -50 0 0 33 50 0 h .7714 g 4990 1129 N -50 0 0 34 50 0 h .7696 g 4990 1163 N -50 0 0 34 50 0 h .7679 g 4990 1197 N -50 0 0 33 50 0 h .7661 g 4990 1230 N -50 0 0 34 50 0 h .7643 g 4990 1264 N -50 0 0 33 50 0 h .7626 g 4990 1297 N -50 0 0 34 50 0 h .7608 g 4990 1331 N -50 0 0 33 50 0 h .7591 g 4990 1364 N -50 0 0 34 50 0 h .7573 g 4990 1398 N -50 0 0 34 50 0 h .7555 g 4990 1432 N -50 0 0 33 50 0 h .7538 g 4990 1465 N -50 0 0 34 50 0 h .752 g 4990 1499 N -50 0 0 33 50 0 h .7503 g 4990 1532 N -50 0 0 34 50 0 h .7485 g 4990 1566 N -50 0 0 34 50 0 h .7467 g 4990 1600 N -50 0 0 33 50 0 h .745 g 4990 1633 N -50 0 0 34 50 0 h .7432 g 4990 1667 N -50 0 0 33 50 0 h .7415 g 4990 1700 N -50 0 0 34 50 0 h .7397 g 4990 1734 N -50 0 0 34 50 0 h .7379 g 4990 1768 N -50 0 0 33 50 0 h .7362 g 4990 1801 N -50 0 0 34 50 0 h .7344 g 4990 1835 N -50 0 0 33 50 0 h .7327 g 4990 1868 N -50 0 0 34 50 0 h .7309 g 4990 1902 N -50 0 0 33 50 0 h .7291 g 4990 1935 N -50 0 0 34 50 0 h .7274 g 4990 1969 N -50 0 0 34 50 0 h .7256 g 4990 2003 N -50 0 0 33 50 0 h .7239 g 4990 2036 N -50 0 0 34 50 0 h .7221 g 4990 2070 N -50 0 0 33 50 0 h .7203 g 4990 2103 N -50 0 0 34 50 0 h .7186 g 4990 2137 N -50 0 0 34 50 0 h .7168 g 4990 2171 N -50 0 0 33 50 0 h .7151 g 4990 2204 N -50 0 0 34 50 0 h .7133 g 4990 2238 N -50 0 0 33 50 0 h .7115 g 4990 2271 N -50 0 0 34 50 0 h .7098 g 4990 2305 N -50 0 0 34 50 0 h .708 g 4990 2339 N -50 0 0 33 50 0 h .7063 g 4990 2372 N -50 0 0 34 50 0 h .7045 g 4990 2406 N -50 0 0 33 50 0 h .7027 g 4990 2439 N -50 0 0 34 50 0 h .701 g 4990 2473 N -50 0 0 34 50 0 h .6992 g 4990 2507 N -50 0 0 33 50 0 h .6975 g 4990 2540 N -50 0 0 34 50 0 h .6957 g 4990 2574 N -50 0 0 32 50 0 h .6939 g 4990 2606 N -50 0 0 34 50 0 h .6922 g 4990 2640 N -50 0 0 33 50 0 h .6904 g 4990 2673 N -50 0 0 34 50 0 h .6887 g 4990 2707 N -50 0 0 34 50 0 h .6869 g 4990 2741 N -50 0 0 33 50 0 h .6851 g 4990 2774 N -50 0 0 34 50 0 h .6834 g 4990 2808 N -50 0 0 33 50 0 h .6816 g 4990 2841 N -50 0 0 34 50 0 h .6799 g 4990 2875 N -50 0 0 34 50 0 h .6781 g 4990 2909 N -50 0 0 33 50 0 h .6763 g 4990 2942 N -50 0 0 34 50 0 h .6746 g 4990 2976 N -50 0 0 33 50 0 h .6728 g 4990 3009 N -50 0 0 34 50 0 h .6711 g 4990 3043 N -50 0 0 34 50 0 h .6693 g 4990 3077 N -50 0 0 33 50 0 h .6675 g 4990 3110 N -50 0 0 34 50 0 h .6658 g 4990 3144 N -50 0 0 33 50 0 h .664 g 4990 3177 N -50 0 0 34 50 0 h .6623 g 4990 3211 N -50 0 0 34 50 0 h .6605 g 4990 3245 N -50 0 0 33 50 0 h .6587 g 4990 3278 N -50 0 0 34 50 0 h .657 g 4990 3312 N -50 0 0 33 50 0 h .6552 g 4990 3345 N -50 0 0 34 50 0 h .6535 g 4990 3379 N -50 0 0 33 50 0 h .6517 g 4990 3412 N -50 0 0 34 50 0 h .6499 g 4990 3446 N -50 0 0 34 50 0 h .6482 g 4990 3480 N -50 0 0 33 50 0 h .6464 g 4990 3513 N -50 0 0 34 50 0 h .6447 g 4990 3547 N -50 0 0 33 50 0 h .6429 g 4990 3580 N -50 0 0 34 50 0 h .6411 g 4990 3614 N -50 0 0 34 50 0 h .6394 g 4990 3648 N -50 0 0 33 50 0 h .6376 g 4990 3681 N -50 0 0 34 50 0 h .6359 g 4990 3715 N -50 0 0 33 50 0 h .6341 g 4990 3748 N -50 0 0 34 50 0 h .6323 g 4990 3782 N -50 0 0 34 50 0 h .6306 g 4990 3816 N -50 0 0 33 50 0 h .6288 g 4990 3849 N -50 0 0 34 50 0 h .6271 g 4990 3883 N -50 0 0 33 50 0 h .6253 g 4990 3916 N -50 0 0 34 50 0 h .6235 g 4990 3950 N -50 0 0 33 50 0 h .6218 g 4990 3983 N -50 0 0 34 50 0 h .62 g 4990 4017 N -50 0 0 34 50 0 h .6183 g 4990 4051 N -50 0 0 33 50 0 h .6165 g 4990 4084 N -50 0 0 34 50 0 h .6147 g 4990 4118 N -50 0 0 33 50 0 h .613 g 4990 4151 N -50 0 0 34 50 0 h .6112 g 4990 4185 N -50 0 0 34 50 0 h .6095 g 4990 4219 N -50 0 0 33 50 0 h .792 g 5040 928 N -51 0 0 33 51 0 h .7901 g 5040 961 N -51 0 0 34 51 0 h .7881 g 5040 995 N -51 0 0 34 51 0 h .7862 g 5040 1029 N -51 0 0 33 51 0 h .7843 g 5040 1062 N -51 0 0 34 51 0 h .7824 g 5040 1096 N -51 0 0 33 51 0 h .7805 g 5040 1129 N -51 0 0 34 51 0 h .7786 g 5040 1163 N -51 0 0 34 51 0 h .7767 g 5040 1197 N -51 0 0 33 51 0 h .7748 g 5040 1230 N -51 0 0 34 51 0 h .7728 g 5040 1264 N -51 0 0 33 51 0 h .7709 g 5040 1297 N -51 0 0 34 51 0 h .769 g 5040 1331 N -51 0 0 33 51 0 h .7671 g 5040 1364 N -51 0 0 34 51 0 h .7652 g 5040 1398 N -51 0 0 34 51 0 h .7633 g 5040 1432 N -51 0 0 33 51 0 h .7614 g 5040 1465 N -51 0 0 34 51 0 h .7595 g 5040 1499 N -51 0 0 33 51 0 h .7575 g 5040 1532 N -51 0 0 34 51 0 h .7556 g 5040 1566 N -51 0 0 34 51 0 h .7537 g 5040 1600 N -51 0 0 33 51 0 h .7518 g 5040 1633 N -51 0 0 34 51 0 h .7499 g 5040 1667 N -51 0 0 33 51 0 h .748 g 5040 1700 N -51 0 0 34 51 0 h .7461 g 5040 1734 N -51 0 0 34 51 0 h .7441 g 5040 1768 N -51 0 0 33 51 0 h .7422 g 5040 1801 N -51 0 0 34 51 0 h .7403 g 5040 1835 N -51 0 0 33 51 0 h .7384 g 5040 1868 N -51 0 0 34 51 0 h .7365 g 5040 1902 N -51 0 0 33 51 0 h .7346 g 5040 1935 N -51 0 0 34 51 0 h .7327 g 5040 1969 N -51 0 0 34 51 0 h .7308 g 5040 2003 N -51 0 0 33 51 0 h .7288 g 5040 2036 N -51 0 0 34 51 0 h .7269 g 5040 2070 N -51 0 0 33 51 0 h .725 g 5040 2103 N -51 0 0 34 51 0 h .7231 g 5040 2137 N -51 0 0 34 51 0 h .7212 g 5040 2171 N -51 0 0 33 51 0 h .7193 g 5040 2204 N -51 0 0 34 51 0 h .7174 g 5040 2238 N -51 0 0 33 51 0 h .7154 g 5040 2271 N -51 0 0 34 51 0 h .7135 g 5040 2305 N -51 0 0 34 51 0 h .7116 g 5040 2339 N -51 0 0 33 51 0 h .7097 g 5040 2372 N -51 0 0 34 51 0 h .7078 g 5040 2406 N -51 0 0 33 51 0 h .7059 g 5040 2439 N -51 0 0 34 51 0 h .704 g 5040 2473 N -51 0 0 34 51 0 h .7021 g 5040 2507 N -51 0 0 33 51 0 h .7001 g 5040 2540 N -51 0 0 34 51 0 h .6982 g 5040 2574 N -51 0 0 32 51 0 h .6963 g 5040 2606 N -51 0 0 34 51 0 h .6944 g 5040 2640 N -51 0 0 33 51 0 h .6925 g 5040 2673 N -51 0 0 34 51 0 h .6906 g 5040 2707 N -51 0 0 34 51 0 h .6887 g 5040 2741 N -51 0 0 33 51 0 h .6868 g 5040 2774 N -51 0 0 34 51 0 h .6848 g 5040 2808 N -51 0 0 33 51 0 h .6829 g 5040 2841 N -51 0 0 34 51 0 h .681 g 5040 2875 N -51 0 0 34 51 0 h .6791 g 5040 2909 N -51 0 0 33 51 0 h .6772 g 5040 2942 N -51 0 0 34 51 0 h .6753 g 5040 2976 N -51 0 0 33 51 0 h .6734 g 5040 3009 N -51 0 0 34 51 0 h .6714 g 5040 3043 N -51 0 0 34 51 0 h .6695 g 5040 3077 N -51 0 0 33 51 0 h .6676 g 5040 3110 N -51 0 0 34 51 0 h .6657 g 5040 3144 N -51 0 0 33 51 0 h .6638 g 5040 3177 N -51 0 0 34 51 0 h .6619 g 5040 3211 N -51 0 0 34 51 0 h .66 g 5040 3245 N -51 0 0 33 51 0 h .6581 g 5040 3278 N -51 0 0 34 51 0 h .6561 g 5040 3312 N -51 0 0 33 51 0 h .6542 g 5040 3345 N -51 0 0 34 51 0 h .6523 g 5040 3379 N -51 0 0 33 51 0 h .6504 g 5040 3412 N -51 0 0 34 51 0 h .6485 g 5040 3446 N -51 0 0 34 51 0 h .6466 g 5040 3480 N -51 0 0 33 51 0 h .6447 g 5040 3513 N -51 0 0 34 51 0 h .6428 g 5040 3547 N -51 0 0 33 51 0 h .6408 g 5040 3580 N -51 0 0 34 51 0 h .6389 g 5040 3614 N -51 0 0 34 51 0 h .637 g 5040 3648 N -51 0 0 33 51 0 h .6351 g 5040 3681 N -51 0 0 34 51 0 h .6332 g 5040 3715 N -51 0 0 33 51 0 h .6313 g 5040 3748 N -51 0 0 34 51 0 h .6294 g 5040 3782 N -51 0 0 34 51 0 h .6274 g 5040 3816 N -51 0 0 33 51 0 h .6255 g 5040 3849 N -51 0 0 34 51 0 h .6236 g 5040 3883 N -51 0 0 33 51 0 h .6217 g 5040 3916 N -51 0 0 34 51 0 h .6198 g 5040 3950 N -51 0 0 33 51 0 h .6179 g 5040 3983 N -51 0 0 34 51 0 h .616 g 5040 4017 N -51 0 0 34 51 0 h .6141 g 5040 4051 N -51 0 0 33 51 0 h .6121 g 5040 4084 N -51 0 0 34 51 0 h .6102 g 5040 4118 N -51 0 0 33 51 0 h .6083 g 5040 4151 N -51 0 0 34 51 0 h .6064 g 5040 4185 N -51 0 0 34 51 0 h .6045 g 5040 4219 N -51 0 0 33 51 0 h .802 g 5091 928 N -50 0 0 33 50 0 h .7999 g 5091 961 N -50 0 0 34 50 0 h .7979 g 5091 995 N -50 0 0 34 50 0 h .7958 g 5091 1029 N -50 0 0 33 50 0 h .7937 g 5091 1062 N -50 0 0 34 50 0 h .7917 g 5091 1096 N -50 0 0 33 50 0 h .7896 g 5091 1129 N -50 0 0 34 50 0 h .7875 g 5091 1163 N -50 0 0 34 50 0 h .7855 g 5091 1197 N -50 0 0 33 50 0 h .7834 g 5091 1230 N -50 0 0 34 50 0 h .7813 g 5091 1264 N -50 0 0 33 50 0 h .7793 g 5091 1297 N -50 0 0 34 50 0 h .7772 g 5091 1331 N -50 0 0 33 50 0 h .7751 g 5091 1364 N -50 0 0 34 50 0 h .7731 g 5091 1398 N -50 0 0 34 50 0 h .771 g 5091 1432 N -50 0 0 33 50 0 h .7689 g 5091 1465 N -50 0 0 34 50 0 h .7669 g 5091 1499 N -50 0 0 33 50 0 h .7648 g 5091 1532 N -50 0 0 34 50 0 h .7627 g 5091 1566 N -50 0 0 34 50 0 h .7607 g 5091 1600 N -50 0 0 33 50 0 h .7586 g 5091 1633 N -50 0 0 34 50 0 h .7565 g 5091 1667 N -50 0 0 33 50 0 h .7545 g 5091 1700 N -50 0 0 34 50 0 h .7524 g 5091 1734 N -50 0 0 34 50 0 h .7503 g 5091 1768 N -50 0 0 33 50 0 h .7483 g 5091 1801 N -50 0 0 34 50 0 h .7462 g 5091 1835 N -50 0 0 33 50 0 h .7441 g 5091 1868 N -50 0 0 34 50 0 h .7421 g 5091 1902 N -50 0 0 33 50 0 h .74 g 5091 1935 N -50 0 0 34 50 0 h .7379 g 5091 1969 N -50 0 0 34 50 0 h .7359 g 5091 2003 N -50 0 0 33 50 0 h .7338 g 5091 2036 N -50 0 0 34 50 0 h .7317 g 5091 2070 N -50 0 0 33 50 0 h .7297 g 5091 2103 N -50 0 0 34 50 0 h .7276 g 5091 2137 N -50 0 0 34 50 0 h .7256 g 5091 2171 N -50 0 0 33 50 0 h .7235 g 5091 2204 N -50 0 0 34 50 0 h .7214 g 5091 2238 N -50 0 0 33 50 0 h .7194 g 5091 2271 N -50 0 0 34 50 0 h .7173 g 5091 2305 N -50 0 0 34 50 0 h .7152 g 5091 2339 N -50 0 0 33 50 0 h .7132 g 5091 2372 N -50 0 0 34 50 0 h .7111 g 5091 2406 N -50 0 0 33 50 0 h .709 g 5091 2439 N -50 0 0 34 50 0 h .707 g 5091 2473 N -50 0 0 34 50 0 h .7049 g 5091 2507 N -50 0 0 33 50 0 h .7028 g 5091 2540 N -50 0 0 34 50 0 h .7008 g 5091 2574 N -50 0 0 32 50 0 h .6987 g 5091 2606 N -50 0 0 34 50 0 h .6966 g 5091 2640 N -50 0 0 33 50 0 h .6946 g 5091 2673 N -50 0 0 34 50 0 h .6925 g 5091 2707 N -50 0 0 34 50 0 h .6904 g 5091 2741 N -50 0 0 33 50 0 h .6884 g 5091 2774 N -50 0 0 34 50 0 h .6863 g 5091 2808 N -50 0 0 33 50 0 h .6842 g 5091 2841 N -50 0 0 34 50 0 h .6822 g 5091 2875 N -50 0 0 34 50 0 h .6801 g 5091 2909 N -50 0 0 33 50 0 h .678 g 5091 2942 N -50 0 0 34 50 0 h .676 g 5091 2976 N -50 0 0 33 50 0 h .6739 g 5091 3009 N -50 0 0 34 50 0 h .6718 g 5091 3043 N -50 0 0 34 50 0 h .6698 g 5091 3077 N -50 0 0 33 50 0 h .6677 g 5091 3110 N -50 0 0 34 50 0 h .6656 g 5091 3144 N -50 0 0 33 50 0 h .6636 g 5091 3177 N -50 0 0 34 50 0 h .6615 g 5091 3211 N -50 0 0 34 50 0 h .6594 g 5091 3245 N -50 0 0 33 50 0 h .6574 g 5091 3278 N -50 0 0 34 50 0 h .6553 g 5091 3312 N -50 0 0 33 50 0 h .6532 g 5091 3345 N -50 0 0 34 50 0 h .6512 g 5091 3379 N -50 0 0 33 50 0 h .6491 g 5091 3412 N -50 0 0 34 50 0 h .647 g 5091 3446 N -50 0 0 34 50 0 h .645 g 5091 3480 N -50 0 0 33 50 0 h .6429 g 5091 3513 N -50 0 0 34 50 0 h .6408 g 5091 3547 N -50 0 0 33 50 0 h .6388 g 5091 3580 N -50 0 0 34 50 0 h .6367 g 5091 3614 N -50 0 0 34 50 0 h .6346 g 5091 3648 N -50 0 0 33 50 0 h .6326 g 5091 3681 N -50 0 0 34 50 0 h .6305 g 5091 3715 N -50 0 0 33 50 0 h .6284 g 5091 3748 N -50 0 0 34 50 0 h .6264 g 5091 3782 N -50 0 0 34 50 0 h .6243 g 5091 3816 N -50 0 0 33 50 0 h .6222 g 5091 3849 N -50 0 0 34 50 0 h .6202 g 5091 3883 N -50 0 0 33 50 0 h .6181 g 5091 3916 N -50 0 0 34 50 0 h .616 g 5091 3950 N -50 0 0 33 50 0 h .614 g 5091 3983 N -50 0 0 34 50 0 h .6119 g 5091 4017 N -50 0 0 34 50 0 h .6098 g 5091 4051 N -50 0 0 33 50 0 h .6078 g 5091 4084 N -50 0 0 34 50 0 h .6057 g 5091 4118 N -50 0 0 33 50 0 h .6037 g 5091 4151 N -50 0 0 34 50 0 h .6016 g 5091 4185 N -50 0 0 34 50 0 h .5995 g 5091 4219 N -50 0 0 33 50 0 h .812 g 5141 928 N -51 0 0 33 51 0 h .8098 g 5141 961 N -51 0 0 34 51 0 h .8076 g 5141 995 N -51 0 0 34 51 0 h .8054 g 5141 1029 N -51 0 0 33 51 0 h .8031 g 5141 1062 N -51 0 0 34 51 0 h .8009 g 5141 1096 N -51 0 0 33 51 0 h .7987 g 5141 1129 N -51 0 0 34 51 0 h .7965 g 5141 1163 N -51 0 0 34 51 0 h .7943 g 5141 1197 N -51 0 0 33 51 0 h .792 g 5141 1230 N -51 0 0 34 51 0 h .7898 g 5141 1264 N -51 0 0 33 51 0 h .7876 g 5141 1297 N -51 0 0 34 51 0 h .7854 g 5141 1331 N -51 0 0 33 51 0 h .7832 g 5141 1364 N -51 0 0 34 51 0 h .781 g 5141 1398 N -51 0 0 34 51 0 h .7787 g 5141 1432 N -51 0 0 33 51 0 h .7765 g 5141 1465 N -51 0 0 34 51 0 h .7743 g 5141 1499 N -51 0 0 33 51 0 h .7721 g 5141 1532 N -51 0 0 34 51 0 h .7699 g 5141 1566 N -51 0 0 34 51 0 h .7676 g 5141 1600 N -51 0 0 33 51 0 h .7654 g 5141 1633 N -51 0 0 34 51 0 h .7632 g 5141 1667 N -51 0 0 33 51 0 h .761 g 5141 1700 N -51 0 0 34 51 0 h .7588 g 5141 1734 N -51 0 0 34 51 0 h .7565 g 5141 1768 N -51 0 0 33 51 0 h .7543 g 5141 1801 N -51 0 0 34 51 0 h .7521 g 5141 1835 N -51 0 0 33 51 0 h .7499 g 5141 1868 N -51 0 0 34 51 0 h .7477 g 5141 1902 N -51 0 0 33 51 0 h .7454 g 5141 1935 N -51 0 0 34 51 0 h .7432 g 5141 1969 N -51 0 0 34 51 0 h .741 g 5141 2003 N -51 0 0 33 51 0 h .7388 g 5141 2036 N -51 0 0 34 51 0 h .7366 g 5141 2070 N -51 0 0 33 51 0 h .7344 g 5141 2103 N -51 0 0 34 51 0 h .7321 g 5141 2137 N -51 0 0 34 51 0 h .7299 g 5141 2171 N -51 0 0 33 51 0 h .7277 g 5141 2204 N -51 0 0 34 51 0 h .7255 g 5141 2238 N -51 0 0 33 51 0 h .7233 g 5141 2271 N -51 0 0 34 51 0 h .721 g 5141 2305 N -51 0 0 34 51 0 h .7188 g 5141 2339 N -51 0 0 33 51 0 h .7166 g 5141 2372 N -51 0 0 34 51 0 h .7144 g 5141 2406 N -51 0 0 33 51 0 h .7122 g 5141 2439 N -51 0 0 34 51 0 h .7099 g 5141 2473 N -51 0 0 34 51 0 h .7077 g 5141 2507 N -51 0 0 33 51 0 h .7055 g 5141 2540 N -51 0 0 34 51 0 h .7033 g 5141 2574 N -51 0 0 32 51 0 h .7011 g 5141 2606 N -51 0 0 34 51 0 h .6988 g 5141 2640 N -51 0 0 33 51 0 h .6966 g 5141 2673 N -51 0 0 34 51 0 h .6944 g 5141 2707 N -51 0 0 34 51 0 h .6922 g 5141 2741 N -51 0 0 33 51 0 h .69 g 5141 2774 N -51 0 0 34 51 0 h .6877 g 5141 2808 N -51 0 0 33 51 0 h .6855 g 5141 2841 N -51 0 0 34 51 0 h .6833 g 5141 2875 N -51 0 0 34 51 0 h .6811 g 5141 2909 N -51 0 0 33 51 0 h .6789 g 5141 2942 N -51 0 0 34 51 0 h .6767 g 5141 2976 N -51 0 0 33 51 0 h .6744 g 5141 3009 N -51 0 0 34 51 0 h .6722 g 5141 3043 N -51 0 0 34 51 0 h .67 g 5141 3077 N -51 0 0 33 51 0 h .6678 g 5141 3110 N -51 0 0 34 51 0 h .6656 g 5141 3144 N -51 0 0 33 51 0 h .6633 g 5141 3177 N -51 0 0 34 51 0 h .6611 g 5141 3211 N -51 0 0 34 51 0 h .6589 g 5141 3245 N -51 0 0 33 51 0 h .6567 g 5141 3278 N -51 0 0 34 51 0 h .6545 g 5141 3312 N -51 0 0 33 51 0 h .6522 g 5141 3345 N -51 0 0 34 51 0 h .65 g 5141 3379 N -51 0 0 33 51 0 h .6478 g 5141 3412 N -51 0 0 34 51 0 h .6456 g 5141 3446 N -51 0 0 34 51 0 h .6434 g 5141 3480 N -51 0 0 33 51 0 h .6411 g 5141 3513 N -51 0 0 34 51 0 h .6389 g 5141 3547 N -51 0 0 33 51 0 h .6367 g 5141 3580 N -51 0 0 34 51 0 h .6345 g 5141 3614 N -51 0 0 34 51 0 h .6323 g 5141 3648 N -51 0 0 33 51 0 h .6301 g 5141 3681 N -51 0 0 34 51 0 h .6278 g 5141 3715 N -51 0 0 33 51 0 h .6256 g 5141 3748 N -51 0 0 34 51 0 h .6234 g 5141 3782 N -51 0 0 34 51 0 h .6212 g 5141 3816 N -51 0 0 33 51 0 h .619 g 5141 3849 N -51 0 0 34 51 0 h .6167 g 5141 3883 N -51 0 0 33 51 0 h .6145 g 5141 3916 N -51 0 0 34 51 0 h .6123 g 5141 3950 N -51 0 0 33 51 0 h .6101 g 5141 3983 N -51 0 0 34 51 0 h .6079 g 5141 4017 N -51 0 0 34 51 0 h .6056 g 5141 4051 N -51 0 0 33 51 0 h .6034 g 5141 4084 N -51 0 0 34 51 0 h .6012 g 5141 4118 N -51 0 0 33 51 0 h .599 g 5141 4151 N -51 0 0 34 51 0 h .5968 g 5141 4185 N -51 0 0 34 51 0 h .5945 g 5141 4219 N -51 0 0 33 51 0 h .822 g 5192 928 N -51 0 0 33 51 0 h .8197 g 5192 961 N -51 0 0 34 51 0 h .8173 g 5192 995 N -51 0 0 34 51 0 h .8149 g 5192 1029 N -51 0 0 33 51 0 h .8126 g 5192 1062 N -51 0 0 34 51 0 h .8102 g 5192 1096 N -51 0 0 33 51 0 h .8078 g 5192 1129 N -51 0 0 34 51 0 h .8054 g 5192 1163 N -51 0 0 34 51 0 h .8031 g 5192 1197 N -51 0 0 33 51 0 h .8007 g 5192 1230 N -51 0 0 34 51 0 h .7983 g 5192 1264 N -51 0 0 33 51 0 h .796 g 5192 1297 N -51 0 0 34 51 0 h .7936 g 5192 1331 N -51 0 0 33 51 0 h .7912 g 5192 1364 N -51 0 0 34 51 0 h .7888 g 5192 1398 N -51 0 0 34 51 0 h .7865 g 5192 1432 N -51 0 0 33 51 0 h .7841 g 5192 1465 N -51 0 0 34 51 0 h .7817 g 5192 1499 N -51 0 0 33 51 0 h .7793 g 5192 1532 N -51 0 0 34 51 0 h .777 g 5192 1566 N -51 0 0 34 51 0 h .7746 g 5192 1600 N -51 0 0 33 51 0 h .7722 g 5192 1633 N -51 0 0 34 51 0 h .7699 g 5192 1667 N -51 0 0 33 51 0 h .7675 g 5192 1700 N -51 0 0 34 51 0 h .7651 g 5192 1734 N -51 0 0 34 51 0 h .7627 g 5192 1768 N -51 0 0 33 51 0 h .7604 g 5192 1801 N -51 0 0 34 51 0 h .758 g 5192 1835 N -51 0 0 33 51 0 h .7556 g 5192 1868 N -51 0 0 34 51 0 h .7533 g 5192 1902 N -51 0 0 33 51 0 h .7509 g 5192 1935 N -51 0 0 34 51 0 h .7485 g 5192 1969 N -51 0 0 34 51 0 h .7461 g 5192 2003 N -51 0 0 33 51 0 h .7438 g 5192 2036 N -51 0 0 34 51 0 h .7414 g 5192 2070 N -51 0 0 33 51 0 h .739 g 5192 2103 N -51 0 0 34 51 0 h .7366 g 5192 2137 N -51 0 0 34 51 0 h .7343 g 5192 2171 N -51 0 0 33 51 0 h .7319 g 5192 2204 N -51 0 0 34 51 0 h .7295 g 5192 2238 N -51 0 0 33 51 0 h .7272 g 5192 2271 N -51 0 0 34 51 0 h .7248 g 5192 2305 N -51 0 0 34 51 0 h .7224 g 5192 2339 N -51 0 0 33 51 0 h .72 g 5192 2372 N -51 0 0 34 51 0 h .7177 g 5192 2406 N -51 0 0 33 51 0 h .7153 g 5192 2439 N -51 0 0 34 51 0 h .7129 g 5192 2473 N -51 0 0 34 51 0 h .7106 g 5192 2507 N -51 0 0 33 51 0 h .7082 g 5192 2540 N -51 0 0 34 51 0 h .7058 g 5192 2574 N -51 0 0 32 51 0 h .7034 g 5192 2606 N -51 0 0 34 51 0 h .7011 g 5192 2640 N -51 0 0 33 51 0 h .6987 g 5192 2673 N -51 0 0 34 51 0 h .6963 g 5192 2707 N -51 0 0 34 51 0 h .6939 g 5192 2741 N -51 0 0 33 51 0 h .6916 g 5192 2774 N -51 0 0 34 51 0 h .6892 g 5192 2808 N -51 0 0 33 51 0 h .6868 g 5192 2841 N -51 0 0 34 51 0 h .6845 g 5192 2875 N -51 0 0 34 51 0 h .6821 g 5192 2909 N -51 0 0 33 51 0 h .6797 g 5192 2942 N -51 0 0 34 51 0 h .6773 g 5192 2976 N -51 0 0 33 51 0 h .675 g 5192 3009 N -51 0 0 34 51 0 h .6726 g 5192 3043 N -51 0 0 34 51 0 h .6702 g 5192 3077 N -51 0 0 33 51 0 h .6679 g 5192 3110 N -51 0 0 34 51 0 h .6655 g 5192 3144 N -51 0 0 33 51 0 h .6631 g 5192 3177 N -51 0 0 34 51 0 h .6607 g 5192 3211 N -51 0 0 34 51 0 h .6584 g 5192 3245 N -51 0 0 33 51 0 h .656 g 5192 3278 N -51 0 0 34 51 0 h .6536 g 5192 3312 N -51 0 0 33 51 0 h .6512 g 5192 3345 N -51 0 0 34 51 0 h .6489 g 5192 3379 N -51 0 0 33 51 0 h .6465 g 5192 3412 N -51 0 0 34 51 0 h .6441 g 5192 3446 N -51 0 0 34 51 0 h .6418 g 5192 3480 N -51 0 0 33 51 0 h .6394 g 5192 3513 N -51 0 0 34 51 0 h .637 g 5192 3547 N -51 0 0 33 51 0 h .6346 g 5192 3580 N -51 0 0 34 51 0 h .6323 g 5192 3614 N -51 0 0 34 51 0 h .6299 g 5192 3648 N -51 0 0 33 51 0 h .6275 g 5192 3681 N -51 0 0 34 51 0 h .6252 g 5192 3715 N -51 0 0 33 51 0 h .6228 g 5192 3748 N -51 0 0 34 51 0 h .6204 g 5192 3782 N -51 0 0 34 51 0 h .618 g 5192 3816 N -51 0 0 33 51 0 h .6157 g 5192 3849 N -51 0 0 34 51 0 h .6133 g 5192 3883 N -51 0 0 33 51 0 h .6109 g 5192 3916 N -51 0 0 34 51 0 h .6085 g 5192 3950 N -51 0 0 33 51 0 h .6062 g 5192 3983 N -51 0 0 34 51 0 h .6038 g 5192 4017 N -51 0 0 34 51 0 h .6014 g 5192 4051 N -51 0 0 33 51 0 h .5991 g 5192 4084 N -51 0 0 34 51 0 h .5967 g 5192 4118 N -51 0 0 33 51 0 h .5943 g 5192 4151 N -51 0 0 34 51 0 h .5919 g 5192 4185 N -51 0 0 34 51 0 h .5896 g 5192 4219 N -51 0 0 33 51 0 h .8321 g 5243 928 N -50 0 0 33 50 0 h .8295 g 5243 961 N -50 0 0 34 50 0 h .827 g 5243 995 N -50 0 0 34 50 0 h .8245 g 5243 1029 N -50 0 0 33 50 0 h .822 g 5243 1062 N -50 0 0 34 50 0 h .8194 g 5243 1096 N -50 0 0 33 50 0 h .8169 g 5243 1129 N -50 0 0 34 50 0 h .8144 g 5243 1163 N -50 0 0 34 50 0 h .8119 g 5243 1197 N -50 0 0 33 50 0 h .8093 g 5243 1230 N -50 0 0 34 50 0 h .8068 g 5243 1264 N -50 0 0 33 50 0 h .8043 g 5243 1297 N -50 0 0 34 50 0 h .8018 g 5243 1331 N -50 0 0 33 50 0 h .7992 g 5243 1364 N -50 0 0 34 50 0 h .7967 g 5243 1398 N -50 0 0 34 50 0 h .7942 g 5243 1432 N -50 0 0 33 50 0 h .7917 g 5243 1465 N -50 0 0 34 50 0 h .7891 g 5243 1499 N -50 0 0 33 50 0 h .7866 g 5243 1532 N -50 0 0 34 50 0 h .7841 g 5243 1566 N -50 0 0 34 50 0 h .7816 g 5243 1600 N -50 0 0 33 50 0 h .779 g 5243 1633 N -50 0 0 34 50 0 h .7765 g 5243 1667 N -50 0 0 33 50 0 h .774 g 5243 1700 N -50 0 0 34 50 0 h .7715 g 5243 1734 N -50 0 0 34 50 0 h .7689 g 5243 1768 N -50 0 0 33 50 0 h .7664 g 5243 1801 N -50 0 0 34 50 0 h .7639 g 5243 1835 N -50 0 0 33 50 0 h .7614 g 5243 1868 N -50 0 0 34 50 0 h .7588 g 5243 1902 N -50 0 0 33 50 0 h .7563 g 5243 1935 N -50 0 0 34 50 0 h .7538 g 5243 1969 N -50 0 0 34 50 0 h .7513 g 5243 2003 N -50 0 0 33 50 0 h .7487 g 5243 2036 N -50 0 0 34 50 0 h .7462 g 5243 2070 N -50 0 0 33 50 0 h .7437 g 5243 2103 N -50 0 0 34 50 0 h .7412 g 5243 2137 N -50 0 0 34 50 0 h .7386 g 5243 2171 N -50 0 0 33 50 0 h .7361 g 5243 2204 N -50 0 0 34 50 0 h .7336 g 5243 2238 N -50 0 0 33 50 0 h .7311 g 5243 2271 N -50 0 0 34 50 0 h .7285 g 5243 2305 N -50 0 0 34 50 0 h .726 g 5243 2339 N -50 0 0 33 50 0 h .7235 g 5243 2372 N -50 0 0 34 50 0 h .721 g 5243 2406 N -50 0 0 33 50 0 h .7184 g 5243 2439 N -50 0 0 34 50 0 h .7159 g 5243 2473 N -50 0 0 34 50 0 h .7134 g 5243 2507 N -50 0 0 33 50 0 h .7109 g 5243 2540 N -50 0 0 34 50 0 h .7083 g 5243 2574 N -50 0 0 32 50 0 h .7058 g 5243 2606 N -50 0 0 34 50 0 h .7033 g 5243 2640 N -50 0 0 33 50 0 h .7008 g 5243 2673 N -50 0 0 34 50 0 h .6982 g 5243 2707 N -50 0 0 34 50 0 h .6957 g 5243 2741 N -50 0 0 33 50 0 h .6932 g 5243 2774 N -50 0 0 34 50 0 h .6907 g 5243 2808 N -50 0 0 33 50 0 h .6881 g 5243 2841 N -50 0 0 34 50 0 h .6856 g 5243 2875 N -50 0 0 34 50 0 h .6831 g 5243 2909 N -50 0 0 33 50 0 h .6806 g 5243 2942 N -50 0 0 34 50 0 h .678 g 5243 2976 N -50 0 0 33 50 0 h .6755 g 5243 3009 N -50 0 0 34 50 0 h .673 g 5243 3043 N -50 0 0 34 50 0 h .6705 g 5243 3077 N -50 0 0 33 50 0 h .6679 g 5243 3110 N -50 0 0 34 50 0 h .6654 g 5243 3144 N -50 0 0 33 50 0 h .6629 g 5243 3177 N -50 0 0 34 50 0 h .6604 g 5243 3211 N -50 0 0 34 50 0 h .6578 g 5243 3245 N -50 0 0 33 50 0 h .6553 g 5243 3278 N -50 0 0 34 50 0 h .6528 g 5243 3312 N -50 0 0 33 50 0 h .6503 g 5243 3345 N -50 0 0 34 50 0 h .6477 g 5243 3379 N -50 0 0 33 50 0 h .6452 g 5243 3412 N -50 0 0 34 50 0 h .6427 g 5243 3446 N -50 0 0 34 50 0 h .6402 g 5243 3480 N -50 0 0 33 50 0 h .6376 g 5243 3513 N -50 0 0 34 50 0 h .6351 g 5243 3547 N -50 0 0 33 50 0 h .6326 g 5243 3580 N -50 0 0 34 50 0 h .6301 g 5243 3614 N -50 0 0 34 50 0 h .6275 g 5243 3648 N -50 0 0 33 50 0 h .625 g 5243 3681 N -50 0 0 34 50 0 h .6225 g 5243 3715 N -50 0 0 33 50 0 h .6199 g 5243 3748 N -50 0 0 34 50 0 h .6174 g 5243 3782 N -50 0 0 34 50 0 h .6149 g 5243 3816 N -50 0 0 33 50 0 h .6124 g 5243 3849 N -50 0 0 34 50 0 h .6098 g 5243 3883 N -50 0 0 33 50 0 h .6073 g 5243 3916 N -50 0 0 34 50 0 h .6048 g 5243 3950 N -50 0 0 33 50 0 h .6023 g 5243 3983 N -50 0 0 34 50 0 h .5997 g 5243 4017 N -50 0 0 34 50 0 h .5972 g 5243 4051 N -50 0 0 33 50 0 h .5947 g 5243 4084 N -50 0 0 34 50 0 h .5922 g 5243 4118 N -50 0 0 33 50 0 h .5896 g 5243 4151 N -50 0 0 34 50 0 h .5871 g 5243 4185 N -50 0 0 34 50 0 h .5846 g 5243 4219 N -50 0 0 33 50 0 h .8421 g 5293 928 N -51 0 0 33 51 0 h .8394 g 5293 961 N -51 0 0 34 51 0 h .8367 g 5293 995 N -51 0 0 34 51 0 h .8341 g 5293 1029 N -51 0 0 33 51 0 h .8314 g 5293 1062 N -51 0 0 34 51 0 h .8287 g 5293 1096 N -51 0 0 33 51 0 h .826 g 5293 1129 N -51 0 0 34 51 0 h .8233 g 5293 1163 N -51 0 0 34 51 0 h .8207 g 5293 1197 N -51 0 0 33 51 0 h .818 g 5293 1230 N -51 0 0 34 51 0 h .8153 g 5293 1264 N -51 0 0 33 51 0 h .8126 g 5293 1297 N -51 0 0 34 51 0 h .81 g 5293 1331 N -51 0 0 33 51 0 h .8073 g 5293 1364 N -51 0 0 34 51 0 h .8046 g 5293 1398 N -51 0 0 34 51 0 h .8019 g 5293 1432 N -51 0 0 33 51 0 h .7992 g 5293 1465 N -51 0 0 34 51 0 h .7966 g 5293 1499 N -51 0 0 33 51 0 h .7939 g 5293 1532 N -51 0 0 34 51 0 h .7912 g 5293 1566 N -51 0 0 34 51 0 h .7885 g 5293 1600 N -51 0 0 33 51 0 h .7859 g 5293 1633 N -51 0 0 34 51 0 h .7832 g 5293 1667 N -51 0 0 33 51 0 h .7805 g 5293 1700 N -51 0 0 34 51 0 h .7778 g 5293 1734 N -51 0 0 34 51 0 h .7751 g 5293 1768 N -51 0 0 33 51 0 h .7725 g 5293 1801 N -51 0 0 34 51 0 h .7698 g 5293 1835 N -51 0 0 33 51 0 h .7671 g 5293 1868 N -51 0 0 34 51 0 h .7644 g 5293 1902 N -51 0 0 33 51 0 h .7617 g 5293 1935 N -51 0 0 34 51 0 h .7591 g 5293 1969 N -51 0 0 34 51 0 h .7564 g 5293 2003 N -51 0 0 33 51 0 h .7537 g 5293 2036 N -51 0 0 34 51 0 h .751 g 5293 2070 N -51 0 0 33 51 0 h .7484 g 5293 2103 N -51 0 0 34 51 0 h .7457 g 5293 2137 N -51 0 0 34 51 0 h .743 g 5293 2171 N -51 0 0 33 51 0 h .7403 g 5293 2204 N -51 0 0 34 51 0 h .7376 g 5293 2238 N -51 0 0 33 51 0 h .735 g 5293 2271 N -51 0 0 34 51 0 h .7323 g 5293 2305 N -51 0 0 34 51 0 h .7296 g 5293 2339 N -51 0 0 33 51 0 h .7269 g 5293 2372 N -51 0 0 34 51 0 h .7243 g 5293 2406 N -51 0 0 33 51 0 h .7216 g 5293 2439 N -51 0 0 34 51 0 h .7189 g 5293 2473 N -51 0 0 34 51 0 h .7162 g 5293 2507 N -51 0 0 33 51 0 h .7135 g 5293 2540 N -51 0 0 34 51 0 h .7109 g 5293 2574 N -51 0 0 32 51 0 h .7082 g 5293 2606 N -51 0 0 34 51 0 h .7055 g 5293 2640 N -51 0 0 33 51 0 h .7028 g 5293 2673 N -51 0 0 34 51 0 h .7001 g 5293 2707 N -51 0 0 34 51 0 h .6975 g 5293 2741 N -51 0 0 33 51 0 h .6948 g 5293 2774 N -51 0 0 34 51 0 h .6921 g 5293 2808 N -51 0 0 33 51 0 h .6894 g 5293 2841 N -51 0 0 34 51 0 h .6868 g 5293 2875 N -51 0 0 34 51 0 h .6841 g 5293 2909 N -51 0 0 33 51 0 h .6814 g 5293 2942 N -51 0 0 34 51 0 h .6787 g 5293 2976 N -51 0 0 33 51 0 h .676 g 5293 3009 N -51 0 0 34 51 0 h .6734 g 5293 3043 N -51 0 0 34 51 0 h .6707 g 5293 3077 N -51 0 0 33 51 0 h .668 g 5293 3110 N -51 0 0 34 51 0 h .6653 g 5293 3144 N -51 0 0 33 51 0 h .6626 g 5293 3177 N -51 0 0 34 51 0 h .66 g 5293 3211 N -51 0 0 34 51 0 h .6573 g 5293 3245 N -51 0 0 33 51 0 h .6546 g 5293 3278 N -51 0 0 34 51 0 h .6519 g 5293 3312 N -51 0 0 33 51 0 h .6493 g 5293 3345 N -51 0 0 34 51 0 h .6466 g 5293 3379 N -51 0 0 33 51 0 h .6439 g 5293 3412 N -51 0 0 34 51 0 h .6412 g 5293 3446 N -51 0 0 34 51 0 h .6385 g 5293 3480 N -51 0 0 33 51 0 h .6359 g 5293 3513 N -51 0 0 34 51 0 h .6332 g 5293 3547 N -51 0 0 33 51 0 h .6305 g 5293 3580 N -51 0 0 34 51 0 h .6278 g 5293 3614 N -51 0 0 34 51 0 h .6252 g 5293 3648 N -51 0 0 33 51 0 h .6225 g 5293 3681 N -51 0 0 34 51 0 h .6198 g 5293 3715 N -51 0 0 33 51 0 h .6171 g 5293 3748 N -51 0 0 34 51 0 h .6144 g 5293 3782 N -51 0 0 34 51 0 h .6118 g 5293 3816 N -51 0 0 33 51 0 h .6091 g 5293 3849 N -51 0 0 34 51 0 h .6064 g 5293 3883 N -51 0 0 33 51 0 h .6037 g 5293 3916 N -51 0 0 34 51 0 h .601 g 5293 3950 N -51 0 0 33 51 0 h .5984 g 5293 3983 N -51 0 0 34 51 0 h .5957 g 5293 4017 N -51 0 0 34 51 0 h .593 g 5293 4051 N -51 0 0 33 51 0 h .5903 g 5293 4084 N -51 0 0 34 51 0 h .5877 g 5293 4118 N -51 0 0 33 51 0 h .585 g 5293 4151 N -51 0 0 34 51 0 h .5823 g 5293 4185 N -51 0 0 34 51 0 h .5796 g 5293 4219 N -51 0 0 33 51 0 h .8521 g 5344 928 N -50 0 0 33 50 0 h .8493 g 5344 961 N -50 0 0 34 50 0 h .8465 g 5344 995 N -50 0 0 34 50 0 h .8436 g 5344 1029 N -50 0 0 33 50 0 h .8408 g 5344 1062 N -50 0 0 34 50 0 h .838 g 5344 1096 N -50 0 0 33 50 0 h .8351 g 5344 1129 N -50 0 0 34 50 0 h .8323 g 5344 1163 N -50 0 0 34 50 0 h .8295 g 5344 1197 N -50 0 0 33 50 0 h .8266 g 5344 1230 N -50 0 0 34 50 0 h .8238 g 5344 1264 N -50 0 0 33 50 0 h .821 g 5344 1297 N -50 0 0 34 50 0 h .8181 g 5344 1331 N -50 0 0 33 50 0 h .8153 g 5344 1364 N -50 0 0 34 50 0 h .8125 g 5344 1398 N -50 0 0 34 50 0 h .8096 g 5344 1432 N -50 0 0 33 50 0 h .8068 g 5344 1465 N -50 0 0 34 50 0 h .804 g 5344 1499 N -50 0 0 33 50 0 h .8012 g 5344 1532 N -50 0 0 34 50 0 h .7983 g 5344 1566 N -50 0 0 34 50 0 h .7955 g 5344 1600 N -50 0 0 33 50 0 h .7927 g 5344 1633 N -50 0 0 34 50 0 h .7898 g 5344 1667 N -50 0 0 33 50 0 h .787 g 5344 1700 N -50 0 0 34 50 0 h .7842 g 5344 1734 N -50 0 0 34 50 0 h .7813 g 5344 1768 N -50 0 0 33 50 0 h .7785 g 5344 1801 N -50 0 0 34 50 0 h .7757 g 5344 1835 N -50 0 0 33 50 0 h .7728 g 5344 1868 N -50 0 0 34 50 0 h .77 g 5344 1902 N -50 0 0 33 50 0 h .7672 g 5344 1935 N -50 0 0 34 50 0 h .7643 g 5344 1969 N -50 0 0 34 50 0 h .7615 g 5344 2003 N -50 0 0 33 50 0 h .7587 g 5344 2036 N -50 0 0 34 50 0 h .7559 g 5344 2070 N -50 0 0 33 50 0 h .753 g 5344 2103 N -50 0 0 34 50 0 h .7502 g 5344 2137 N -50 0 0 34 50 0 h .7474 g 5344 2171 N -50 0 0 33 50 0 h .7445 g 5344 2204 N -50 0 0 34 50 0 h .7417 g 5344 2238 N -50 0 0 33 50 0 h .7389 g 5344 2271 N -50 0 0 34 50 0 h .736 g 5344 2305 N -50 0 0 34 50 0 h .7332 g 5344 2339 N -50 0 0 33 50 0 h .7304 g 5344 2372 N -50 0 0 34 50 0 h .7275 g 5344 2406 N -50 0 0 33 50 0 h .7247 g 5344 2439 N -50 0 0 34 50 0 h .7219 g 5344 2473 N -50 0 0 34 50 0 h .719 g 5344 2507 N -50 0 0 33 50 0 h .7162 g 5344 2540 N -50 0 0 34 50 0 h .7134 g 5344 2574 N -50 0 0 32 50 0 h .7106 g 5344 2606 N -50 0 0 34 50 0 h .7077 g 5344 2640 N -50 0 0 33 50 0 h .7049 g 5344 2673 N -50 0 0 34 50 0 h .7021 g 5344 2707 N -50 0 0 34 50 0 h .6992 g 5344 2741 N -50 0 0 33 50 0 h .6964 g 5344 2774 N -50 0 0 34 50 0 h .6936 g 5344 2808 N -50 0 0 33 50 0 h .6907 g 5344 2841 N -50 0 0 34 50 0 h .6879 g 5344 2875 N -50 0 0 34 50 0 h .6851 g 5344 2909 N -50 0 0 33 50 0 h .6822 g 5344 2942 N -50 0 0 34 50 0 h .6794 g 5344 2976 N -50 0 0 33 50 0 h .6766 g 5344 3009 N -50 0 0 34 50 0 h .6737 g 5344 3043 N -50 0 0 34 50 0 h .6709 g 5344 3077 N -50 0 0 33 50 0 h .6681 g 5344 3110 N -50 0 0 34 50 0 h .6653 g 5344 3144 N -50 0 0 33 50 0 h .6624 g 5344 3177 N -50 0 0 34 50 0 h .6596 g 5344 3211 N -50 0 0 34 50 0 h .6568 g 5344 3245 N -50 0 0 33 50 0 h .6539 g 5344 3278 N -50 0 0 34 50 0 h .6511 g 5344 3312 N -50 0 0 33 50 0 h .6483 g 5344 3345 N -50 0 0 34 50 0 h .6454 g 5344 3379 N -50 0 0 33 50 0 h .6426 g 5344 3412 N -50 0 0 34 50 0 h .6398 g 5344 3446 N -50 0 0 34 50 0 h .6369 g 5344 3480 N -50 0 0 33 50 0 h .6341 g 5344 3513 N -50 0 0 34 50 0 h .6313 g 5344 3547 N -50 0 0 33 50 0 h .6284 g 5344 3580 N -50 0 0 34 50 0 h .6256 g 5344 3614 N -50 0 0 34 50 0 h .6228 g 5344 3648 N -50 0 0 33 50 0 h .6199 g 5344 3681 N -50 0 0 34 50 0 h .6171 g 5344 3715 N -50 0 0 33 50 0 h .6143 g 5344 3748 N -50 0 0 34 50 0 h .6115 g 5344 3782 N -50 0 0 34 50 0 h .6086 g 5344 3816 N -50 0 0 33 50 0 h .6058 g 5344 3849 N -50 0 0 34 50 0 h .603 g 5344 3883 N -50 0 0 33 50 0 h .6001 g 5344 3916 N -50 0 0 34 50 0 h .5973 g 5344 3950 N -50 0 0 33 50 0 h .5945 g 5344 3983 N -50 0 0 34 50 0 h .5916 g 5344 4017 N -50 0 0 34 50 0 h .5888 g 5344 4051 N -50 0 0 33 50 0 h .586 g 5344 4084 N -50 0 0 34 50 0 h .5831 g 5344 4118 N -50 0 0 33 50 0 h .5803 g 5344 4151 N -50 0 0 34 50 0 h .5775 g 5344 4185 N -50 0 0 34 50 0 h .5746 g 5344 4219 N -50 0 0 33 50 0 h .8621 g 5394 928 N -51 0 0 33 51 0 h .8592 g 5394 961 N -51 0 0 34 51 0 h .8562 g 5394 995 N -51 0 0 34 51 0 h .8532 g 5394 1029 N -51 0 0 33 51 0 h .8502 g 5394 1062 N -51 0 0 34 51 0 h .8472 g 5394 1096 N -51 0 0 33 51 0 h .8442 g 5394 1129 N -51 0 0 34 51 0 h .8413 g 5394 1163 N -51 0 0 34 51 0 h .8383 g 5394 1197 N -51 0 0 33 51 0 h .8353 g 5394 1230 N -51 0 0 34 51 0 h .8323 g 5394 1264 N -51 0 0 33 51 0 h .8293 g 5394 1297 N -51 0 0 34 51 0 h .8263 g 5394 1331 N -51 0 0 33 51 0 h .8233 g 5394 1364 N -51 0 0 34 51 0 h .8204 g 5394 1398 N -51 0 0 34 51 0 h .8174 g 5394 1432 N -51 0 0 33 51 0 h .8144 g 5394 1465 N -51 0 0 34 51 0 h .8114 g 5394 1499 N -51 0 0 33 51 0 h .8084 g 5394 1532 N -51 0 0 34 51 0 h .8054 g 5394 1566 N -51 0 0 34 51 0 h .8025 g 5394 1600 N -51 0 0 33 51 0 h .7995 g 5394 1633 N -51 0 0 34 51 0 h .7965 g 5394 1667 N -51 0 0 33 51 0 h .7935 g 5394 1700 N -51 0 0 34 51 0 h .7905 g 5394 1734 N -51 0 0 34 51 0 h .7875 g 5394 1768 N -51 0 0 33 51 0 h .7845 g 5394 1801 N -51 0 0 34 51 0 h .7816 g 5394 1835 N -51 0 0 33 51 0 h .7786 g 5394 1868 N -51 0 0 34 51 0 h .7756 g 5394 1902 N -51 0 0 33 51 0 h .7726 g 5394 1935 N -51 0 0 34 51 0 h .7696 g 5394 1969 N -51 0 0 34 51 0 h .7666 g 5394 2003 N -51 0 0 33 51 0 h .7637 g 5394 2036 N -51 0 0 34 51 0 h .7607 g 5394 2070 N -51 0 0 33 51 0 h .7577 g 5394 2103 N -51 0 0 34 51 0 h .7547 g 5394 2137 N -51 0 0 34 51 0 h .7517 g 5394 2171 N -51 0 0 33 51 0 h .7487 g 5394 2204 N -51 0 0 34 51 0 h .7458 g 5394 2238 N -51 0 0 33 51 0 h .7428 g 5394 2271 N -51 0 0 34 51 0 h .7398 g 5394 2305 N -51 0 0 34 51 0 h .7368 g 5394 2339 N -51 0 0 33 51 0 h .7338 g 5394 2372 N -51 0 0 34 51 0 h .7308 g 5394 2406 N -51 0 0 33 51 0 h .7278 g 5394 2439 N -51 0 0 34 51 0 h .7249 g 5394 2473 N -51 0 0 34 51 0 h .7219 g 5394 2507 N -51 0 0 33 51 0 h .7189 g 5394 2540 N -51 0 0 34 51 0 h .7159 g 5394 2574 N -51 0 0 32 51 0 h .7129 g 5394 2606 N -51 0 0 34 51 0 h .7099 g 5394 2640 N -51 0 0 33 51 0 h .707 g 5394 2673 N -51 0 0 34 51 0 h .704 g 5394 2707 N -51 0 0 34 51 0 h .701 g 5394 2741 N -51 0 0 33 51 0 h .698 g 5394 2774 N -51 0 0 34 51 0 h .695 g 5394 2808 N -51 0 0 33 51 0 h .692 g 5394 2841 N -51 0 0 34 51 0 h .689 g 5394 2875 N -51 0 0 34 51 0 h .6861 g 5394 2909 N -51 0 0 33 51 0 h .6831 g 5394 2942 N -51 0 0 34 51 0 h .6801 g 5394 2976 N -51 0 0 33 51 0 h .6771 g 5394 3009 N -51 0 0 34 51 0 h .6741 g 5394 3043 N -51 0 0 34 51 0 h .6711 g 5394 3077 N -51 0 0 33 51 0 h .6682 g 5394 3110 N -51 0 0 34 51 0 h .6652 g 5394 3144 N -51 0 0 33 51 0 h .6622 g 5394 3177 N -51 0 0 34 51 0 h .6592 g 5394 3211 N -51 0 0 34 51 0 h .6562 g 5394 3245 N -51 0 0 33 51 0 h .6532 g 5394 3278 N -51 0 0 34 51 0 h .6503 g 5394 3312 N -51 0 0 33 51 0 h .6473 g 5394 3345 N -51 0 0 34 51 0 h .6443 g 5394 3379 N -51 0 0 33 51 0 h .6413 g 5394 3412 N -51 0 0 34 51 0 h .6383 g 5394 3446 N -51 0 0 34 51 0 h .6353 g 5394 3480 N -51 0 0 33 51 0 h .6323 g 5394 3513 N -51 0 0 34 51 0 h .6294 g 5394 3547 N -51 0 0 33 51 0 h .6264 g 5394 3580 N -51 0 0 34 51 0 h .6234 g 5394 3614 N -51 0 0 34 51 0 h .6204 g 5394 3648 N -51 0 0 33 51 0 h .6174 g 5394 3681 N -51 0 0 34 51 0 h .6144 g 5394 3715 N -51 0 0 33 51 0 h .6115 g 5394 3748 N -51 0 0 34 51 0 h .6085 g 5394 3782 N -51 0 0 34 51 0 h .6055 g 5394 3816 N -51 0 0 33 51 0 h .6025 g 5394 3849 N -51 0 0 34 51 0 h .5995 g 5394 3883 N -51 0 0 33 51 0 h .5965 g 5394 3916 N -51 0 0 34 51 0 h .5935 g 5394 3950 N -51 0 0 33 51 0 h .5906 g 5394 3983 N -51 0 0 34 51 0 h .5876 g 5394 4017 N -51 0 0 34 51 0 h .5846 g 5394 4051 N -51 0 0 33 51 0 h .5816 g 5394 4084 N -51 0 0 34 51 0 h .5786 g 5394 4118 N -51 0 0 33 51 0 h .5756 g 5394 4151 N -51 0 0 34 51 0 h .5727 g 5394 4185 N -51 0 0 34 51 0 h .5697 g 5394 4219 N -51 0 0 33 51 0 h .8722 g 5445 928 N -50 0 0 33 50 0 h .869 g 5445 961 N -50 0 0 34 50 0 h .8659 g 5445 995 N -50 0 0 34 50 0 h .8628 g 5445 1029 N -50 0 0 33 50 0 h .8596 g 5445 1062 N -50 0 0 34 50 0 h .8565 g 5445 1096 N -50 0 0 33 50 0 h .8533 g 5445 1129 N -50 0 0 34 50 0 h .8502 g 5445 1163 N -50 0 0 34 50 0 h .8471 g 5445 1197 N -50 0 0 33 50 0 h .8439 g 5445 1230 N -50 0 0 34 50 0 h .8408 g 5445 1264 N -50 0 0 33 50 0 h .8377 g 5445 1297 N -50 0 0 34 50 0 h .8345 g 5445 1331 N -50 0 0 33 50 0 h .8314 g 5445 1364 N -50 0 0 34 50 0 h .8282 g 5445 1398 N -50 0 0 34 50 0 h .8251 g 5445 1432 N -50 0 0 33 50 0 h .822 g 5445 1465 N -50 0 0 34 50 0 h .8188 g 5445 1499 N -50 0 0 33 50 0 h .8157 g 5445 1532 N -50 0 0 34 50 0 h .8126 g 5445 1566 N -50 0 0 34 50 0 h .8094 g 5445 1600 N -50 0 0 33 50 0 h .8063 g 5445 1633 N -50 0 0 34 50 0 h .8031 g 5445 1667 N -50 0 0 33 50 0 h .8 g 5445 1700 N -50 0 0 34 50 0 h .7969 g 5445 1734 N -50 0 0 34 50 0 h .7937 g 5445 1768 N -50 0 0 33 50 0 h .7906 g 5445 1801 N -50 0 0 34 50 0 h .7875 g 5445 1835 N -50 0 0 33 50 0 h .7843 g 5445 1868 N -50 0 0 34 50 0 h .7812 g 5445 1902 N -50 0 0 33 50 0 h .778 g 5445 1935 N -50 0 0 34 50 0 h .7749 g 5445 1969 N -50 0 0 34 50 0 h .7718 g 5445 2003 N -50 0 0 33 50 0 h .7686 g 5445 2036 N -50 0 0 34 50 0 h .7655 g 5445 2070 N -50 0 0 33 50 0 h .7624 g 5445 2103 N -50 0 0 34 50 0 h .7592 g 5445 2137 N -50 0 0 34 50 0 h .7561 g 5445 2171 N -50 0 0 33 50 0 h .7529 g 5445 2204 N -50 0 0 34 50 0 h .7498 g 5445 2238 N -50 0 0 33 50 0 h .7467 g 5445 2271 N -50 0 0 34 50 0 h .7435 g 5445 2305 N -50 0 0 34 50 0 h .7404 g 5445 2339 N -50 0 0 33 50 0 h .7373 g 5445 2372 N -50 0 0 34 50 0 h .7341 g 5445 2406 N -50 0 0 33 50 0 h .731 g 5445 2439 N -50 0 0 34 50 0 h .7278 g 5445 2473 N -50 0 0 34 50 0 h .7247 g 5445 2507 N -50 0 0 33 50 0 h .7216 g 5445 2540 N -50 0 0 34 50 0 h .7184 g 5445 2574 N -50 0 0 32 50 0 h .7153 g 5445 2606 N -50 0 0 34 50 0 h .7122 g 5445 2640 N -50 0 0 33 50 0 h .709 g 5445 2673 N -50 0 0 34 50 0 h .7059 g 5445 2707 N -50 0 0 34 50 0 h .7027 g 5445 2741 N -50 0 0 33 50 0 h .6996 g 5445 2774 N -50 0 0 34 50 0 h .6965 g 5445 2808 N -50 0 0 33 50 0 h .6933 g 5445 2841 N -50 0 0 34 50 0 h .6902 g 5445 2875 N -50 0 0 34 50 0 h .6871 g 5445 2909 N -50 0 0 33 50 0 h .6839 g 5445 2942 N -50 0 0 34 50 0 h .6808 g 5445 2976 N -50 0 0 33 50 0 h .6776 g 5445 3009 N -50 0 0 34 50 0 h .6745 g 5445 3043 N -50 0 0 34 50 0 h .6714 g 5445 3077 N -50 0 0 33 50 0 h .6682 g 5445 3110 N -50 0 0 34 50 0 h .6651 g 5445 3144 N -50 0 0 33 50 0 h .662 g 5445 3177 N -50 0 0 34 50 0 h .6588 g 5445 3211 N -50 0 0 34 50 0 h .6557 g 5445 3245 N -50 0 0 33 50 0 h .6525 g 5445 3278 N -50 0 0 34 50 0 h .6494 g 5445 3312 N -50 0 0 33 50 0 h .6463 g 5445 3345 N -50 0 0 34 50 0 h .6431 g 5445 3379 N -50 0 0 33 50 0 h .64 g 5445 3412 N -50 0 0 34 50 0 h .6369 g 5445 3446 N -50 0 0 34 50 0 h .6337 g 5445 3480 N -50 0 0 33 50 0 h .6306 g 5445 3513 N -50 0 0 34 50 0 h .6274 g 5445 3547 N -50 0 0 33 50 0 h .6243 g 5445 3580 N -50 0 0 34 50 0 h .6212 g 5445 3614 N -50 0 0 34 50 0 h .618 g 5445 3648 N -50 0 0 33 50 0 h .6149 g 5445 3681 N -50 0 0 34 50 0 h .6118 g 5445 3715 N -50 0 0 33 50 0 h .6086 g 5445 3748 N -50 0 0 34 50 0 h .6055 g 5445 3782 N -50 0 0 34 50 0 h .6023 g 5445 3816 N -50 0 0 33 50 0 h .5992 g 5445 3849 N -50 0 0 34 50 0 h .5961 g 5445 3883 N -50 0 0 33 50 0 h .5929 g 5445 3916 N -50 0 0 34 50 0 h .5898 g 5445 3950 N -50 0 0 33 50 0 h .5867 g 5445 3983 N -50 0 0 34 50 0 h .5835 g 5445 4017 N -50 0 0 34 50 0 h .5804 g 5445 4051 N -50 0 0 33 50 0 h .5772 g 5445 4084 N -50 0 0 34 50 0 h .5741 g 5445 4118 N -50 0 0 33 50 0 h .571 g 5445 4151 N -50 0 0 34 50 0 h .5678 g 5445 4185 N -50 0 0 34 50 0 h .5647 g 5445 4219 N -50 0 0 33 50 0 h .8822 g 5495 928 N -51 0 0 33 51 0 h .8789 g 5495 961 N -51 0 0 34 51 0 h .8756 g 5495 995 N -51 0 0 34 51 0 h .8723 g 5495 1029 N -51 0 0 33 51 0 h .869 g 5495 1062 N -51 0 0 34 51 0 h .8657 g 5495 1096 N -51 0 0 33 51 0 h .8625 g 5495 1129 N -51 0 0 34 51 0 h .8592 g 5495 1163 N -51 0 0 34 51 0 h .8559 g 5495 1197 N -51 0 0 33 51 0 h .8526 g 5495 1230 N -51 0 0 34 51 0 h .8493 g 5495 1264 N -51 0 0 33 51 0 h .846 g 5495 1297 N -51 0 0 34 51 0 h .8427 g 5495 1331 N -51 0 0 33 51 0 h .8394 g 5495 1364 N -51 0 0 34 51 0 h .8361 g 5495 1398 N -51 0 0 34 51 0 h .8328 g 5495 1432 N -51 0 0 33 51 0 h .8295 g 5495 1465 N -51 0 0 34 51 0 h .8263 g 5495 1499 N -51 0 0 33 51 0 h .823 g 5495 1532 N -51 0 0 34 51 0 h .8197 g 5495 1566 N -51 0 0 34 51 0 h .8164 g 5495 1600 N -51 0 0 33 51 0 h .8131 g 5495 1633 N -51 0 0 34 51 0 h .8098 g 5495 1667 N -51 0 0 33 51 0 h .8065 g 5495 1700 N -51 0 0 34 51 0 h .8032 g 5495 1734 N -51 0 0 34 51 0 h .7999 g 5495 1768 N -51 0 0 33 51 0 h .7966 g 5495 1801 N -51 0 0 34 51 0 h .7934 g 5495 1835 N -51 0 0 33 51 0 h .7901 g 5495 1868 N -51 0 0 34 51 0 h .7868 g 5495 1902 N -51 0 0 33 51 0 h .7835 g 5495 1935 N -51 0 0 34 51 0 h .7802 g 5495 1969 N -51 0 0 34 51 0 h .7769 g 5495 2003 N -51 0 0 33 51 0 h .7736 g 5495 2036 N -51 0 0 34 51 0 h .7703 g 5495 2070 N -51 0 0 33 51 0 h .767 g 5495 2103 N -51 0 0 34 51 0 h .7637 g 5495 2137 N -51 0 0 34 51 0 h .7604 g 5495 2171 N -51 0 0 33 51 0 h .7572 g 5495 2204 N -51 0 0 34 51 0 h .7539 g 5495 2238 N -51 0 0 33 51 0 h .7506 g 5495 2271 N -51 0 0 34 51 0 h .7473 g 5495 2305 N -51 0 0 34 51 0 h .744 g 5495 2339 N -51 0 0 33 51 0 h .7407 g 5495 2372 N -51 0 0 34 51 0 h .7374 g 5495 2406 N -51 0 0 33 51 0 h .7341 g 5495 2439 N -51 0 0 34 51 0 h .7308 g 5495 2473 N -51 0 0 34 51 0 h .7275 g 5495 2507 N -51 0 0 33 51 0 h .7243 g 5495 2540 N -51 0 0 34 51 0 h .721 g 5495 2574 N -51 0 0 32 51 0 h .7177 g 5495 2606 N -51 0 0 34 51 0 h .7144 g 5495 2640 N -51 0 0 33 51 0 h .7111 g 5495 2673 N -51 0 0 34 51 0 h .7078 g 5495 2707 N -51 0 0 34 51 0 h .7045 g 5495 2741 N -51 0 0 33 51 0 h .7012 g 5495 2774 N -51 0 0 34 51 0 h .6979 g 5495 2808 N -51 0 0 33 51 0 h .6946 g 5495 2841 N -51 0 0 34 51 0 h .6913 g 5495 2875 N -51 0 0 34 51 0 h .6881 g 5495 2909 N -51 0 0 33 51 0 h .6848 g 5495 2942 N -51 0 0 34 51 0 h .6815 g 5495 2976 N -51 0 0 33 51 0 h .6782 g 5495 3009 N -51 0 0 34 51 0 h .6749 g 5495 3043 N -51 0 0 34 51 0 h .6716 g 5495 3077 N -51 0 0 33 51 0 h .6683 g 5495 3110 N -51 0 0 34 51 0 h .665 g 5495 3144 N -51 0 0 33 51 0 h .6617 g 5495 3177 N -51 0 0 34 51 0 h .6584 g 5495 3211 N -51 0 0 34 51 0 h .6552 g 5495 3245 N -51 0 0 33 51 0 h .6519 g 5495 3278 N -51 0 0 34 51 0 h .6486 g 5495 3312 N -51 0 0 33 51 0 h .6453 g 5495 3345 N -51 0 0 34 51 0 h .642 g 5495 3379 N -51 0 0 33 51 0 h .6387 g 5495 3412 N -51 0 0 34 51 0 h .6354 g 5495 3446 N -51 0 0 34 51 0 h .6321 g 5495 3480 N -51 0 0 33 51 0 h .6288 g 5495 3513 N -51 0 0 34 51 0 h .6255 g 5495 3547 N -51 0 0 33 51 0 h .6222 g 5495 3580 N -51 0 0 34 51 0 h .619 g 5495 3614 N -51 0 0 34 51 0 h .6157 g 5495 3648 N -51 0 0 33 51 0 h .6124 g 5495 3681 N -51 0 0 34 51 0 h .6091 g 5495 3715 N -51 0 0 33 51 0 h .6058 g 5495 3748 N -51 0 0 34 51 0 h .6025 g 5495 3782 N -51 0 0 34 51 0 h .5992 g 5495 3816 N -51 0 0 33 51 0 h .5959 g 5495 3849 N -51 0 0 34 51 0 h .5926 g 5495 3883 N -51 0 0 33 51 0 h .5893 g 5495 3916 N -51 0 0 34 51 0 h .5861 g 5495 3950 N -51 0 0 33 51 0 h .5828 g 5495 3983 N -51 0 0 34 51 0 h .5795 g 5495 4017 N -51 0 0 34 51 0 h .5762 g 5495 4051 N -51 0 0 33 51 0 h .5729 g 5495 4084 N -51 0 0 34 51 0 h .5696 g 5495 4118 N -51 0 0 33 51 0 h .5663 g 5495 4151 N -51 0 0 34 51 0 h .563 g 5495 4185 N -51 0 0 34 51 0 h .5597 g 5495 4219 N -51 0 0 33 51 0 h .8922 g 5546 928 N -50 0 0 33 50 0 h .8888 g 5546 961 N -50 0 0 34 50 0 h .8853 g 5546 995 N -50 0 0 34 50 0 h .8819 g 5546 1029 N -50 0 0 33 50 0 h .8784 g 5546 1062 N -50 0 0 34 50 0 h .875 g 5546 1096 N -50 0 0 33 50 0 h .8716 g 5546 1129 N -50 0 0 34 50 0 h .8681 g 5546 1163 N -50 0 0 34 50 0 h .8647 g 5546 1197 N -50 0 0 33 50 0 h .8612 g 5546 1230 N -50 0 0 34 50 0 h .8578 g 5546 1264 N -50 0 0 33 50 0 h .8543 g 5546 1297 N -50 0 0 34 50 0 h .8509 g 5546 1331 N -50 0 0 33 50 0 h .8475 g 5546 1364 N -50 0 0 34 50 0 h .844 g 5546 1398 N -50 0 0 34 50 0 h .8406 g 5546 1432 N -50 0 0 33 50 0 h .8371 g 5546 1465 N -50 0 0 34 50 0 h .8337 g 5546 1499 N -50 0 0 33 50 0 h .8302 g 5546 1532 N -50 0 0 34 50 0 h .8268 g 5546 1566 N -50 0 0 34 50 0 h .8233 g 5546 1600 N -50 0 0 33 50 0 h .8199 g 5546 1633 N -50 0 0 34 50 0 h .8165 g 5546 1667 N -50 0 0 33 50 0 h .813 g 5546 1700 N -50 0 0 34 50 0 h .8096 g 5546 1734 N -50 0 0 34 50 0 h .8061 g 5546 1768 N -50 0 0 33 50 0 h .8027 g 5546 1801 N -50 0 0 34 50 0 h .7992 g 5546 1835 N -50 0 0 33 50 0 h .7958 g 5546 1868 N -50 0 0 34 50 0 h .7924 g 5546 1902 N -50 0 0 33 50 0 h .7889 g 5546 1935 N -50 0 0 34 50 0 h .7855 g 5546 1969 N -50 0 0 34 50 0 h .782 g 5546 2003 N -50 0 0 33 50 0 h .7786 g 5546 2036 N -50 0 0 34 50 0 h .7751 g 5546 2070 N -50 0 0 33 50 0 h .7717 g 5546 2103 N -50 0 0 34 50 0 h .7683 g 5546 2137 N -50 0 0 34 50 0 h .7648 g 5546 2171 N -50 0 0 33 50 0 h .7614 g 5546 2204 N -50 0 0 34 50 0 h .7579 g 5546 2238 N -50 0 0 33 50 0 h .7545 g 5546 2271 N -50 0 0 34 50 0 h .751 g 5546 2305 N -50 0 0 34 50 0 h .7476 g 5546 2339 N -50 0 0 33 50 0 h .7441 g 5546 2372 N -50 0 0 34 50 0 h .7407 g 5546 2406 N -50 0 0 33 50 0 h .7373 g 5546 2439 N -50 0 0 34 50 0 h .7338 g 5546 2473 N -50 0 0 34 50 0 h .7304 g 5546 2507 N -50 0 0 33 50 0 h .7269 g 5546 2540 N -50 0 0 34 50 0 h .7235 g 5546 2574 N -50 0 0 32 50 0 h .72 g 5546 2606 N -50 0 0 34 50 0 h .7166 g 5546 2640 N -50 0 0 33 50 0 h .7132 g 5546 2673 N -50 0 0 34 50 0 h .7097 g 5546 2707 N -50 0 0 34 50 0 h .7063 g 5546 2741 N -50 0 0 33 50 0 h .7028 g 5546 2774 N -50 0 0 34 50 0 h .6994 g 5546 2808 N -50 0 0 33 50 0 h .6959 g 5546 2841 N -50 0 0 34 50 0 h .6925 g 5546 2875 N -50 0 0 34 50 0 h .689 g 5546 2909 N -50 0 0 33 50 0 h .6856 g 5546 2942 N -50 0 0 34 50 0 h .6822 g 5546 2976 N -50 0 0 33 50 0 h .6787 g 5546 3009 N -50 0 0 34 50 0 h .6753 g 5546 3043 N -50 0 0 34 50 0 h .6718 g 5546 3077 N -50 0 0 33 50 0 h .6684 g 5546 3110 N -50 0 0 34 50 0 h .6649 g 5546 3144 N -50 0 0 33 50 0 h .6615 g 5546 3177 N -50 0 0 34 50 0 h .6581 g 5546 3211 N -50 0 0 34 50 0 h .6546 g 5546 3245 N -50 0 0 33 50 0 h .6512 g 5546 3278 N -50 0 0 34 50 0 h .6477 g 5546 3312 N -50 0 0 33 50 0 h .6443 g 5546 3345 N -50 0 0 34 50 0 h .6408 g 5546 3379 N -50 0 0 33 50 0 h .6374 g 5546 3412 N -50 0 0 34 50 0 h .634 g 5546 3446 N -50 0 0 34 50 0 h .6305 g 5546 3480 N -50 0 0 33 50 0 h .6271 g 5546 3513 N -50 0 0 34 50 0 h .6236 g 5546 3547 N -50 0 0 33 50 0 h .6202 g 5546 3580 N -50 0 0 34 50 0 h .6167 g 5546 3614 N -50 0 0 34 50 0 h .6133 g 5546 3648 N -50 0 0 33 50 0 h .6098 g 5546 3681 N -50 0 0 34 50 0 h .6064 g 5546 3715 N -50 0 0 33 50 0 h .603 g 5546 3748 N -50 0 0 34 50 0 h .5995 g 5546 3782 N -50 0 0 34 50 0 h .5961 g 5546 3816 N -50 0 0 33 50 0 h .5926 g 5546 3849 N -50 0 0 34 50 0 h .5892 g 5546 3883 N -50 0 0 33 50 0 h .5857 g 5546 3916 N -50 0 0 34 50 0 h .5823 g 5546 3950 N -50 0 0 33 50 0 h .5789 g 5546 3983 N -50 0 0 34 50 0 h .5754 g 5546 4017 N -50 0 0 34 50 0 h .572 g 5546 4051 N -50 0 0 33 50 0 h .5685 g 5546 4084 N -50 0 0 34 50 0 h .5651 g 5546 4118 N -50 0 0 33 50 0 h .5616 g 5546 4151 N -50 0 0 34 50 0 h .5582 g 5546 4185 N -50 0 0 34 50 0 h .5548 g 5546 4219 N -50 0 0 33 50 0 h .9022 g 5596 928 N -51 0 0 33 51 0 h .8986 g 5596 961 N -51 0 0 34 51 0 h .895 g 5596 995 N -51 0 0 34 51 0 h .8915 g 5596 1029 N -51 0 0 33 51 0 h .8879 g 5596 1062 N -51 0 0 34 51 0 h .8843 g 5596 1096 N -51 0 0 33 51 0 h .8807 g 5596 1129 N -51 0 0 34 51 0 h .8771 g 5596 1163 N -51 0 0 34 51 0 h .8735 g 5596 1197 N -51 0 0 33 51 0 h .8699 g 5596 1230 N -51 0 0 34 51 0 h .8663 g 5596 1264 N -51 0 0 33 51 0 h .8627 g 5596 1297 N -51 0 0 34 51 0 h .8591 g 5596 1331 N -51 0 0 33 51 0 h .8555 g 5596 1364 N -51 0 0 34 51 0 h .8519 g 5596 1398 N -51 0 0 34 51 0 h .8483 g 5596 1432 N -51 0 0 33 51 0 h .8447 g 5596 1465 N -51 0 0 34 51 0 h .8411 g 5596 1499 N -51 0 0 33 51 0 h .8375 g 5596 1532 N -51 0 0 34 51 0 h .8339 g 5596 1566 N -51 0 0 34 51 0 h .8303 g 5596 1600 N -51 0 0 33 51 0 h .8267 g 5596 1633 N -51 0 0 34 51 0 h .8231 g 5596 1667 N -51 0 0 33 51 0 h .8195 g 5596 1700 N -51 0 0 34 51 0 h .8159 g 5596 1734 N -51 0 0 34 51 0 h .8123 g 5596 1768 N -51 0 0 33 51 0 h .8087 g 5596 1801 N -51 0 0 34 51 0 h .8051 g 5596 1835 N -51 0 0 33 51 0 h .8015 g 5596 1868 N -51 0 0 34 51 0 h .7979 g 5596 1902 N -51 0 0 33 51 0 h .7943 g 5596 1935 N -51 0 0 34 51 0 h .7907 g 5596 1969 N -51 0 0 34 51 0 h .7872 g 5596 2003 N -51 0 0 33 51 0 h .7836 g 5596 2036 N -51 0 0 34 51 0 h .78 g 5596 2070 N -51 0 0 33 51 0 h .7764 g 5596 2103 N -51 0 0 34 51 0 h .7728 g 5596 2137 N -51 0 0 34 51 0 h .7692 g 5596 2171 N -51 0 0 33 51 0 h .7656 g 5596 2204 N -51 0 0 34 51 0 h .762 g 5596 2238 N -51 0 0 33 51 0 h .7584 g 5596 2271 N -51 0 0 34 51 0 h .7548 g 5596 2305 N -51 0 0 34 51 0 h .7512 g 5596 2339 N -51 0 0 33 51 0 h .7476 g 5596 2372 N -51 0 0 34 51 0 h .744 g 5596 2406 N -51 0 0 33 51 0 h .7404 g 5596 2439 N -51 0 0 34 51 0 h .7368 g 5596 2473 N -51 0 0 34 51 0 h .7332 g 5596 2507 N -51 0 0 33 51 0 h .7296 g 5596 2540 N -51 0 0 34 51 0 h .726 g 5596 2574 N -51 0 0 32 51 0 h .7224 g 5596 2606 N -51 0 0 34 51 0 h .7188 g 5596 2640 N -51 0 0 33 51 0 h .7152 g 5596 2673 N -51 0 0 34 51 0 h .7116 g 5596 2707 N -51 0 0 34 51 0 h .708 g 5596 2741 N -51 0 0 33 51 0 h .7044 g 5596 2774 N -51 0 0 34 51 0 h .7008 g 5596 2808 N -51 0 0 33 51 0 h .6972 g 5596 2841 N -51 0 0 34 51 0 h .6936 g 5596 2875 N -51 0 0 34 51 0 h .69 g 5596 2909 N -51 0 0 33 51 0 h .6864 g 5596 2942 N -51 0 0 34 51 0 h .6829 g 5596 2976 N -51 0 0 33 51 0 h .6793 g 5596 3009 N -51 0 0 34 51 0 h .6757 g 5596 3043 N -51 0 0 34 51 0 h .6721 g 5596 3077 N -51 0 0 33 51 0 h .6685 g 5596 3110 N -51 0 0 34 51 0 h .6649 g 5596 3144 N -51 0 0 33 51 0 h .6613 g 5596 3177 N -51 0 0 34 51 0 h .6577 g 5596 3211 N -51 0 0 34 51 0 h .6541 g 5596 3245 N -51 0 0 33 51 0 h .6505 g 5596 3278 N -51 0 0 34 51 0 h .6469 g 5596 3312 N -51 0 0 33 51 0 h .6433 g 5596 3345 N -51 0 0 34 51 0 h .6397 g 5596 3379 N -51 0 0 33 51 0 h .6361 g 5596 3412 N -51 0 0 34 51 0 h .6325 g 5596 3446 N -51 0 0 34 51 0 h .6289 g 5596 3480 N -51 0 0 33 51 0 h .6253 g 5596 3513 N -51 0 0 34 51 0 h .6217 g 5596 3547 N -51 0 0 33 51 0 h .6181 g 5596 3580 N -51 0 0 34 51 0 h .6145 g 5596 3614 N -51 0 0 34 51 0 h .6109 g 5596 3648 N -51 0 0 33 51 0 h .6073 g 5596 3681 N -51 0 0 34 51 0 h .6037 g 5596 3715 N -51 0 0 33 51 0 h .6001 g 5596 3748 N -51 0 0 34 51 0 h .5965 g 5596 3782 N -51 0 0 34 51 0 h .5929 g 5596 3816 N -51 0 0 33 51 0 h .5893 g 5596 3849 N -51 0 0 34 51 0 h .5857 g 5596 3883 N -51 0 0 33 51 0 h .5821 g 5596 3916 N -51 0 0 34 51 0 h .5786 g 5596 3950 N -51 0 0 33 51 0 h .575 g 5596 3983 N -51 0 0 34 51 0 h .5714 g 5596 4017 N -51 0 0 34 51 0 h .5678 g 5596 4051 N -51 0 0 33 51 0 h .5642 g 5596 4084 N -51 0 0 34 51 0 h .5606 g 5596 4118 N -51 0 0 33 51 0 h .557 g 5596 4151 N -51 0 0 34 51 0 h .5534 g 5596 4185 N -51 0 0 34 51 0 h .5498 g 5596 4219 N -51 0 0 33 51 0 h .9123 g 5647 928 N -51 0 0 33 51 0 h .9085 g 5647 961 N -51 0 0 34 51 0 h .9048 g 5647 995 N -51 0 0 34 51 0 h .901 g 5647 1029 N -51 0 0 33 51 0 h .8973 g 5647 1062 N -51 0 0 34 51 0 h .8935 g 5647 1096 N -51 0 0 33 51 0 h .8898 g 5647 1129 N -51 0 0 34 51 0 h .886 g 5647 1163 N -51 0 0 34 51 0 h .8823 g 5647 1197 N -51 0 0 33 51 0 h .8785 g 5647 1230 N -51 0 0 34 51 0 h .8748 g 5647 1264 N -51 0 0 33 51 0 h .871 g 5647 1297 N -51 0 0 34 51 0 h .8673 g 5647 1331 N -51 0 0 33 51 0 h .8635 g 5647 1364 N -51 0 0 34 51 0 h .8598 g 5647 1398 N -51 0 0 34 51 0 h .856 g 5647 1432 N -51 0 0 33 51 0 h .8523 g 5647 1465 N -51 0 0 34 51 0 h .8485 g 5647 1499 N -51 0 0 33 51 0 h .8448 g 5647 1532 N -51 0 0 34 51 0 h .841 g 5647 1566 N -51 0 0 34 51 0 h .8373 g 5647 1600 N -51 0 0 33 51 0 h .8335 g 5647 1633 N -51 0 0 34 51 0 h .8298 g 5647 1667 N -51 0 0 33 51 0 h .826 g 5647 1700 N -51 0 0 34 51 0 h .8223 g 5647 1734 N -51 0 0 34 51 0 h .8185 g 5647 1768 N -51 0 0 33 51 0 h .8148 g 5647 1801 N -51 0 0 34 51 0 h .811 g 5647 1835 N -51 0 0 33 51 0 h .8073 g 5647 1868 N -51 0 0 34 51 0 h .8035 g 5647 1902 N -51 0 0 33 51 0 h .7998 g 5647 1935 N -51 0 0 34 51 0 h .796 g 5647 1969 N -51 0 0 34 51 0 h .7923 g 5647 2003 N -51 0 0 33 51 0 h .7885 g 5647 2036 N -51 0 0 34 51 0 h .7848 g 5647 2070 N -51 0 0 33 51 0 h .781 g 5647 2103 N -51 0 0 34 51 0 h .7773 g 5647 2137 N -51 0 0 34 51 0 h .7735 g 5647 2171 N -51 0 0 33 51 0 h .7698 g 5647 2204 N -51 0 0 34 51 0 h .766 g 5647 2238 N -51 0 0 33 51 0 h .7623 g 5647 2271 N -51 0 0 34 51 0 h .7585 g 5647 2305 N -51 0 0 34 51 0 h .7548 g 5647 2339 N -51 0 0 33 51 0 h .751 g 5647 2372 N -51 0 0 34 51 0 h .7473 g 5647 2406 N -51 0 0 33 51 0 h .7435 g 5647 2439 N -51 0 0 34 51 0 h .7398 g 5647 2473 N -51 0 0 34 51 0 h .736 g 5647 2507 N -51 0 0 33 51 0 h .7323 g 5647 2540 N -51 0 0 34 51 0 h .7285 g 5647 2574 N -51 0 0 32 51 0 h .7248 g 5647 2606 N -51 0 0 34 51 0 h .721 g 5647 2640 N -51 0 0 33 51 0 h .7173 g 5647 2673 N -51 0 0 34 51 0 h .7135 g 5647 2707 N -51 0 0 34 51 0 h .7098 g 5647 2741 N -51 0 0 33 51 0 h .706 g 5647 2774 N -51 0 0 34 51 0 h .7023 g 5647 2808 N -51 0 0 33 51 0 h .6985 g 5647 2841 N -51 0 0 34 51 0 h .6948 g 5647 2875 N -51 0 0 34 51 0 h .691 g 5647 2909 N -51 0 0 33 51 0 h .6873 g 5647 2942 N -51 0 0 34 51 0 h .6835 g 5647 2976 N -51 0 0 33 51 0 h .6798 g 5647 3009 N -51 0 0 34 51 0 h .676 g 5647 3043 N -51 0 0 34 51 0 h .6723 g 5647 3077 N -51 0 0 33 51 0 h .6685 g 5647 3110 N -51 0 0 34 51 0 h .6648 g 5647 3144 N -51 0 0 33 51 0 h .661 g 5647 3177 N -51 0 0 34 51 0 h .6573 g 5647 3211 N -51 0 0 34 51 0 h .6535 g 5647 3245 N -51 0 0 33 51 0 h .6498 g 5647 3278 N -51 0 0 34 51 0 h .646 g 5647 3312 N -51 0 0 33 51 0 h .6423 g 5647 3345 N -51 0 0 34 51 0 h .6385 g 5647 3379 N -51 0 0 33 51 0 h .6348 g 5647 3412 N -51 0 0 34 51 0 h .631 g 5647 3446 N -51 0 0 34 51 0 h .6273 g 5647 3480 N -51 0 0 33 51 0 h .6235 g 5647 3513 N -51 0 0 34 51 0 h .6198 g 5647 3547 N -51 0 0 33 51 0 h .616 g 5647 3580 N -51 0 0 34 51 0 h .6123 g 5647 3614 N -51 0 0 34 51 0 h .6085 g 5647 3648 N -51 0 0 33 51 0 h .6048 g 5647 3681 N -51 0 0 34 51 0 h .601 g 5647 3715 N -51 0 0 33 51 0 h .5973 g 5647 3748 N -51 0 0 34 51 0 h .5935 g 5647 3782 N -51 0 0 34 51 0 h .5898 g 5647 3816 N -51 0 0 33 51 0 h .5861 g 5647 3849 N -51 0 0 34 51 0 h .5823 g 5647 3883 N -51 0 0 33 51 0 h .5786 g 5647 3916 N -51 0 0 34 51 0 h .5748 g 5647 3950 N -51 0 0 33 51 0 h .5711 g 5647 3983 N -51 0 0 34 51 0 h .5673 g 5647 4017 N -51 0 0 34 51 0 h .5636 g 5647 4051 N -51 0 0 33 51 0 h .5598 g 5647 4084 N -51 0 0 34 51 0 h .5561 g 5647 4118 N -51 0 0 33 51 0 h .5523 g 5647 4151 N -51 0 0 34 51 0 h .5486 g 5647 4185 N -51 0 0 34 51 0 h .5448 g 5647 4219 N -51 0 0 33 51 0 h .9223 g 5698 928 N -50 0 0 33 50 0 h .9184 g 5698 961 N -50 0 0 34 50 0 h .9145 g 5698 995 N -50 0 0 34 50 0 h .9106 g 5698 1029 N -50 0 0 33 50 0 h .9067 g 5698 1062 N -50 0 0 34 50 0 h .9028 g 5698 1096 N -50 0 0 33 50 0 h .8989 g 5698 1129 N -50 0 0 34 50 0 h .895 g 5698 1163 N -50 0 0 34 50 0 h .8911 g 5698 1197 N -50 0 0 33 50 0 h .8872 g 5698 1230 N -50 0 0 34 50 0 h .8833 g 5698 1264 N -50 0 0 33 50 0 h .8794 g 5698 1297 N -50 0 0 34 50 0 h .8755 g 5698 1331 N -50 0 0 33 50 0 h .8716 g 5698 1364 N -50 0 0 34 50 0 h .8677 g 5698 1398 N -50 0 0 34 50 0 h .8638 g 5698 1432 N -50 0 0 33 50 0 h .8598 g 5698 1465 N -50 0 0 34 50 0 h .8559 g 5698 1499 N -50 0 0 33 50 0 h .852 g 5698 1532 N -50 0 0 34 50 0 h .8481 g 5698 1566 N -50 0 0 34 50 0 h .8442 g 5698 1600 N -50 0 0 33 50 0 h .8403 g 5698 1633 N -50 0 0 34 50 0 h .8364 g 5698 1667 N -50 0 0 33 50 0 h .8325 g 5698 1700 N -50 0 0 34 50 0 h .8286 g 5698 1734 N -50 0 0 34 50 0 h .8247 g 5698 1768 N -50 0 0 33 50 0 h .8208 g 5698 1801 N -50 0 0 34 50 0 h .8169 g 5698 1835 N -50 0 0 33 50 0 h .813 g 5698 1868 N -50 0 0 34 50 0 h .8091 g 5698 1902 N -50 0 0 33 50 0 h .8052 g 5698 1935 N -50 0 0 34 50 0 h .8013 g 5698 1969 N -50 0 0 34 50 0 h .7974 g 5698 2003 N -50 0 0 33 50 0 h .7935 g 5698 2036 N -50 0 0 34 50 0 h .7896 g 5698 2070 N -50 0 0 33 50 0 h .7857 g 5698 2103 N -50 0 0 34 50 0 h .7818 g 5698 2137 N -50 0 0 34 50 0 h .7779 g 5698 2171 N -50 0 0 33 50 0 h .774 g 5698 2204 N -50 0 0 34 50 0 h .7701 g 5698 2238 N -50 0 0 33 50 0 h .7662 g 5698 2271 N -50 0 0 34 50 0 h .7623 g 5698 2305 N -50 0 0 34 50 0 h .7584 g 5698 2339 N -50 0 0 33 50 0 h .7545 g 5698 2372 N -50 0 0 34 50 0 h .7506 g 5698 2406 N -50 0 0 33 50 0 h .7467 g 5698 2439 N -50 0 0 34 50 0 h .7428 g 5698 2473 N -50 0 0 34 50 0 h .7389 g 5698 2507 N -50 0 0 33 50 0 h .735 g 5698 2540 N -50 0 0 34 50 0 h .7311 g 5698 2574 N -50 0 0 32 50 0 h .7272 g 5698 2606 N -50 0 0 34 50 0 h .7233 g 5698 2640 N -50 0 0 33 50 0 h .7194 g 5698 2673 N -50 0 0 34 50 0 h .7154 g 5698 2707 N -50 0 0 34 50 0 h .7115 g 5698 2741 N -50 0 0 33 50 0 h .7076 g 5698 2774 N -50 0 0 34 50 0 h .7037 g 5698 2808 N -50 0 0 33 50 0 h .6998 g 5698 2841 N -50 0 0 34 50 0 h .6959 g 5698 2875 N -50 0 0 34 50 0 h .692 g 5698 2909 N -50 0 0 33 50 0 h .6881 g 5698 2942 N -50 0 0 34 50 0 h .6842 g 5698 2976 N -50 0 0 33 50 0 h .6803 g 5698 3009 N -50 0 0 34 50 0 h .6764 g 5698 3043 N -50 0 0 34 50 0 h .6725 g 5698 3077 N -50 0 0 33 50 0 h .6686 g 5698 3110 N -50 0 0 34 50 0 h .6647 g 5698 3144 N -50 0 0 33 50 0 h .6608 g 5698 3177 N -50 0 0 34 50 0 h .6569 g 5698 3211 N -50 0 0 34 50 0 h .653 g 5698 3245 N -50 0 0 33 50 0 h .6491 g 5698 3278 N -50 0 0 34 50 0 h .6452 g 5698 3312 N -50 0 0 33 50 0 h .6413 g 5698 3345 N -50 0 0 34 50 0 h .6374 g 5698 3379 N -50 0 0 33 50 0 h .6335 g 5698 3412 N -50 0 0 34 50 0 h .6296 g 5698 3446 N -50 0 0 34 50 0 h .6257 g 5698 3480 N -50 0 0 33 50 0 h .6218 g 5698 3513 N -50 0 0 34 50 0 h .6179 g 5698 3547 N -50 0 0 33 50 0 h .614 g 5698 3580 N -50 0 0 34 50 0 h .6101 g 5698 3614 N -50 0 0 34 50 0 h .6062 g 5698 3648 N -50 0 0 33 50 0 h .6023 g 5698 3681 N -50 0 0 34 50 0 h .5984 g 5698 3715 N -50 0 0 33 50 0 h .5945 g 5698 3748 N -50 0 0 34 50 0 h .5906 g 5698 3782 N -50 0 0 34 50 0 h .5867 g 5698 3816 N -50 0 0 33 50 0 h .5828 g 5698 3849 N -50 0 0 34 50 0 h .5789 g 5698 3883 N -50 0 0 33 50 0 h .575 g 5698 3916 N -50 0 0 34 50 0 h .5711 g 5698 3950 N -50 0 0 33 50 0 h .5671 g 5698 3983 N -50 0 0 34 50 0 h .5632 g 5698 4017 N -50 0 0 34 50 0 h .5593 g 5698 4051 N -50 0 0 33 50 0 h .5554 g 5698 4084 N -50 0 0 34 50 0 h .5515 g 5698 4118 N -50 0 0 33 50 0 h .5476 g 5698 4151 N -50 0 0 34 50 0 h .5437 g 5698 4185 N -50 0 0 34 50 0 h .5398 g 5698 4219 N -50 0 0 33 50 0 h .9323 g 5748 928 N -51 0 0 33 51 0 h .9283 g 5748 961 N -51 0 0 34 51 0 h .9242 g 5748 995 N -51 0 0 34 51 0 h .9201 g 5748 1029 N -51 0 0 33 51 0 h .9161 g 5748 1062 N -51 0 0 34 51 0 h .912 g 5748 1096 N -51 0 0 33 51 0 h .908 g 5748 1129 N -51 0 0 34 51 0 h .9039 g 5748 1163 N -51 0 0 34 51 0 h .8999 g 5748 1197 N -51 0 0 33 51 0 h .8958 g 5748 1230 N -51 0 0 34 51 0 h .8918 g 5748 1264 N -51 0 0 33 51 0 h .8877 g 5748 1297 N -51 0 0 34 51 0 h .8836 g 5748 1331 N -51 0 0 33 51 0 h .8796 g 5748 1364 N -51 0 0 34 51 0 h .8755 g 5748 1398 N -51 0 0 34 51 0 h .8715 g 5748 1432 N -51 0 0 33 51 0 h .8674 g 5748 1465 N -51 0 0 34 51 0 h .8634 g 5748 1499 N -51 0 0 33 51 0 h .8593 g 5748 1532 N -51 0 0 34 51 0 h .8553 g 5748 1566 N -51 0 0 34 51 0 h .8512 g 5748 1600 N -51 0 0 33 51 0 h .8471 g 5748 1633 N -51 0 0 34 51 0 h .8431 g 5748 1667 N -51 0 0 33 51 0 h .839 g 5748 1700 N -51 0 0 34 51 0 h .835 g 5748 1734 N -51 0 0 34 51 0 h .8309 g 5748 1768 N -51 0 0 33 51 0 h .8269 g 5748 1801 N -51 0 0 34 51 0 h .8228 g 5748 1835 N -51 0 0 33 51 0 h .8188 g 5748 1868 N -51 0 0 34 51 0 h .8147 g 5748 1902 N -51 0 0 33 51 0 h .8106 g 5748 1935 N -51 0 0 34 51 0 h .8066 g 5748 1969 N -51 0 0 34 51 0 h .8025 g 5748 2003 N -51 0 0 33 51 0 h .7985 g 5748 2036 N -51 0 0 34 51 0 h .7944 g 5748 2070 N -51 0 0 33 51 0 h .7904 g 5748 2103 N -51 0 0 34 51 0 h .7863 g 5748 2137 N -51 0 0 34 51 0 h .7823 g 5748 2171 N -51 0 0 33 51 0 h .7782 g 5748 2204 N -51 0 0 34 51 0 h .7741 g 5748 2238 N -51 0 0 33 51 0 h .7701 g 5748 2271 N -51 0 0 34 51 0 h .766 g 5748 2305 N -51 0 0 34 51 0 h .762 g 5748 2339 N -51 0 0 33 51 0 h .7579 g 5748 2372 N -51 0 0 34 51 0 h .7539 g 5748 2406 N -51 0 0 33 51 0 h .7498 g 5748 2439 N -51 0 0 34 51 0 h .7458 g 5748 2473 N -51 0 0 34 51 0 h .7417 g 5748 2507 N -51 0 0 33 51 0 h .7376 g 5748 2540 N -51 0 0 34 51 0 h .7336 g 5748 2574 N -51 0 0 32 51 0 h .7295 g 5748 2606 N -51 0 0 34 51 0 h .7255 g 5748 2640 N -51 0 0 33 51 0 h .7214 g 5748 2673 N -51 0 0 34 51 0 h .7174 g 5748 2707 N -51 0 0 34 51 0 h .7133 g 5748 2741 N -51 0 0 33 51 0 h .7093 g 5748 2774 N -51 0 0 34 51 0 h .7052 g 5748 2808 N -51 0 0 33 51 0 h .7011 g 5748 2841 N -51 0 0 34 51 0 h .6971 g 5748 2875 N -51 0 0 34 51 0 h .693 g 5748 2909 N -51 0 0 33 51 0 h .689 g 5748 2942 N -51 0 0 34 51 0 h .6849 g 5748 2976 N -51 0 0 33 51 0 h .6809 g 5748 3009 N -51 0 0 34 51 0 h .6768 g 5748 3043 N -51 0 0 34 51 0 h .6728 g 5748 3077 N -51 0 0 33 51 0 h .6687 g 5748 3110 N -51 0 0 34 51 0 h .6646 g 5748 3144 N -51 0 0 33 51 0 h .6606 g 5748 3177 N -51 0 0 34 51 0 h .6565 g 5748 3211 N -51 0 0 34 51 0 h .6525 g 5748 3245 N -51 0 0 33 51 0 h .6484 g 5748 3278 N -51 0 0 34 51 0 h .6444 g 5748 3312 N -51 0 0 33 51 0 h .6403 g 5748 3345 N -51 0 0 34 51 0 h .6362 g 5748 3379 N -51 0 0 33 51 0 h .6322 g 5748 3412 N -51 0 0 34 51 0 h .6281 g 5748 3446 N -51 0 0 34 51 0 h .6241 g 5748 3480 N -51 0 0 33 51 0 h .62 g 5748 3513 N -51 0 0 34 51 0 h .616 g 5748 3547 N -51 0 0 33 51 0 h .6119 g 5748 3580 N -51 0 0 34 51 0 h .6079 g 5748 3614 N -51 0 0 34 51 0 h .6038 g 5748 3648 N -51 0 0 33 51 0 h .5997 g 5748 3681 N -51 0 0 34 51 0 h .5957 g 5748 3715 N -51 0 0 33 51 0 h .5916 g 5748 3748 N -51 0 0 34 51 0 h .5876 g 5748 3782 N -51 0 0 34 51 0 h .5835 g 5748 3816 N -51 0 0 33 51 0 h .5795 g 5748 3849 N -51 0 0 34 51 0 h .5754 g 5748 3883 N -51 0 0 33 51 0 h .5714 g 5748 3916 N -51 0 0 34 51 0 h .5673 g 5748 3950 N -51 0 0 33 51 0 h .5632 g 5748 3983 N -51 0 0 34 51 0 h .5592 g 5748 4017 N -51 0 0 34 51 0 h .5551 g 5748 4051 N -51 0 0 33 51 0 h .5511 g 5748 4084 N -51 0 0 34 51 0 h .547 g 5748 4118 N -51 0 0 33 51 0 h .543 g 5748 4151 N -51 0 0 34 51 0 h .5389 g 5748 4185 N -51 0 0 34 51 0 h .5349 g 5748 4219 N -51 0 0 33 51 0 h .9423 g 5799 928 N -50 0 0 33 50 0 h .9381 g 5799 961 N -50 0 0 34 50 0 h .9339 g 5799 995 N -50 0 0 34 50 0 h .9297 g 5799 1029 N -50 0 0 33 50 0 h .9255 g 5799 1062 N -50 0 0 34 50 0 h .9213 g 5799 1096 N -50 0 0 33 50 0 h .9171 g 5799 1129 N -50 0 0 34 50 0 h .9129 g 5799 1163 N -50 0 0 34 50 0 h .9087 g 5799 1197 N -50 0 0 33 50 0 h .9045 g 5799 1230 N -50 0 0 34 50 0 h .9003 g 5799 1264 N -50 0 0 33 50 0 h .896 g 5799 1297 N -50 0 0 34 50 0 h .8918 g 5799 1331 N -50 0 0 33 50 0 h .8876 g 5799 1364 N -50 0 0 34 50 0 h .8834 g 5799 1398 N -50 0 0 34 50 0 h .8792 g 5799 1432 N -50 0 0 33 50 0 h .875 g 5799 1465 N -50 0 0 34 50 0 h .8708 g 5799 1499 N -50 0 0 33 50 0 h .8666 g 5799 1532 N -50 0 0 34 50 0 h .8624 g 5799 1566 N -50 0 0 34 50 0 h .8582 g 5799 1600 N -50 0 0 33 50 0 h .854 g 5799 1633 N -50 0 0 34 50 0 h .8497 g 5799 1667 N -50 0 0 33 50 0 h .8455 g 5799 1700 N -50 0 0 34 50 0 h .8413 g 5799 1734 N -50 0 0 34 50 0 h .8371 g 5799 1768 N -50 0 0 33 50 0 h .8329 g 5799 1801 N -50 0 0 34 50 0 h .8287 g 5799 1835 N -50 0 0 33 50 0 h .8245 g 5799 1868 N -50 0 0 34 50 0 h .8203 g 5799 1902 N -50 0 0 33 50 0 h .8161 g 5799 1935 N -50 0 0 34 50 0 h .8119 g 5799 1969 N -50 0 0 34 50 0 h .8077 g 5799 2003 N -50 0 0 33 50 0 h .8035 g 5799 2036 N -50 0 0 34 50 0 h .7992 g 5799 2070 N -50 0 0 33 50 0 h .795 g 5799 2103 N -50 0 0 34 50 0 h .7908 g 5799 2137 N -50 0 0 34 50 0 h .7866 g 5799 2171 N -50 0 0 33 50 0 h .7824 g 5799 2204 N -50 0 0 34 50 0 h .7782 g 5799 2238 N -50 0 0 33 50 0 h .774 g 5799 2271 N -50 0 0 34 50 0 h .7698 g 5799 2305 N -50 0 0 34 50 0 h .7656 g 5799 2339 N -50 0 0 33 50 0 h .7614 g 5799 2372 N -50 0 0 34 50 0 h .7572 g 5799 2406 N -50 0 0 33 50 0 h .7529 g 5799 2439 N -50 0 0 34 50 0 h .7487 g 5799 2473 N -50 0 0 34 50 0 h .7445 g 5799 2507 N -50 0 0 33 50 0 h .7403 g 5799 2540 N -50 0 0 34 50 0 h .7361 g 5799 2574 N -50 0 0 32 50 0 h .7319 g 5799 2606 N -50 0 0 34 50 0 h .7277 g 5799 2640 N -50 0 0 33 50 0 h .7235 g 5799 2673 N -50 0 0 34 50 0 h .7193 g 5799 2707 N -50 0 0 34 50 0 h .7151 g 5799 2741 N -50 0 0 33 50 0 h .7109 g 5799 2774 N -50 0 0 34 50 0 h .7066 g 5799 2808 N -50 0 0 33 50 0 h .7024 g 5799 2841 N -50 0 0 34 50 0 h .6982 g 5799 2875 N -50 0 0 34 50 0 h .694 g 5799 2909 N -50 0 0 33 50 0 h .6898 g 5799 2942 N -50 0 0 34 50 0 h .6856 g 5799 2976 N -50 0 0 33 50 0 h .6814 g 5799 3009 N -50 0 0 34 50 0 h .6772 g 5799 3043 N -50 0 0 34 50 0 h .673 g 5799 3077 N -50 0 0 33 50 0 h .6688 g 5799 3110 N -50 0 0 34 50 0 h .6646 g 5799 3144 N -50 0 0 33 50 0 h .6604 g 5799 3177 N -50 0 0 34 50 0 h .6561 g 5799 3211 N -50 0 0 34 50 0 h .6519 g 5799 3245 N -50 0 0 33 50 0 h .6477 g 5799 3278 N -50 0 0 34 50 0 h .6435 g 5799 3312 N -50 0 0 33 50 0 h .6393 g 5799 3345 N -50 0 0 34 50 0 h .6351 g 5799 3379 N -50 0 0 33 50 0 h .6309 g 5799 3412 N -50 0 0 34 50 0 h .6267 g 5799 3446 N -50 0 0 34 50 0 h .6225 g 5799 3480 N -50 0 0 33 50 0 h .6183 g 5799 3513 N -50 0 0 34 50 0 h .6141 g 5799 3547 N -50 0 0 33 50 0 h .6098 g 5799 3580 N -50 0 0 34 50 0 h .6056 g 5799 3614 N -50 0 0 34 50 0 h .6014 g 5799 3648 N -50 0 0 33 50 0 h .5972 g 5799 3681 N -50 0 0 34 50 0 h .593 g 5799 3715 N -50 0 0 33 50 0 h .5888 g 5799 3748 N -50 0 0 34 50 0 h .5846 g 5799 3782 N -50 0 0 34 50 0 h .5804 g 5799 3816 N -50 0 0 33 50 0 h .5762 g 5799 3849 N -50 0 0 34 50 0 h .572 g 5799 3883 N -50 0 0 33 50 0 h .5678 g 5799 3916 N -50 0 0 34 50 0 h .5636 g 5799 3950 N -50 0 0 33 50 0 h .5593 g 5799 3983 N -50 0 0 34 50 0 h .5551 g 5799 4017 N -50 0 0 34 50 0 h .5509 g 5799 4051 N -50 0 0 33 50 0 h .5467 g 5799 4084 N -50 0 0 34 50 0 h .5425 g 5799 4118 N -50 0 0 33 50 0 h .5383 g 5799 4151 N -50 0 0 34 50 0 h .5341 g 5799 4185 N -50 0 0 34 50 0 h .5299 g 5799 4219 N -50 0 0 33 50 0 h .9524 g 5849 928 N -51 0 0 33 51 0 h .948 g 5849 961 N -51 0 0 34 51 0 h .9436 g 5849 995 N -51 0 0 34 51 0 h .9393 g 5849 1029 N -51 0 0 33 51 0 h .9349 g 5849 1062 N -51 0 0 34 51 0 h .9306 g 5849 1096 N -51 0 0 33 51 0 h .9262 g 5849 1129 N -51 0 0 34 51 0 h .9218 g 5849 1163 N -51 0 0 34 51 0 h .9175 g 5849 1197 N -51 0 0 33 51 0 h .9131 g 5849 1230 N -51 0 0 34 51 0 h .9087 g 5849 1264 N -51 0 0 33 51 0 h .9044 g 5849 1297 N -51 0 0 34 51 0 h .9 g 5849 1331 N -51 0 0 33 51 0 h .8957 g 5849 1364 N -51 0 0 34 51 0 h .8913 g 5849 1398 N -51 0 0 34 51 0 h .8869 g 5849 1432 N -51 0 0 33 51 0 h .8826 g 5849 1465 N -51 0 0 34 51 0 h .8782 g 5849 1499 N -51 0 0 33 51 0 h .8739 g 5849 1532 N -51 0 0 34 51 0 h .8695 g 5849 1566 N -51 0 0 34 51 0 h .8651 g 5849 1600 N -51 0 0 33 51 0 h .8608 g 5849 1633 N -51 0 0 34 51 0 h .8564 g 5849 1667 N -51 0 0 33 51 0 h .852 g 5849 1700 N -51 0 0 34 51 0 h .8477 g 5849 1734 N -51 0 0 34 51 0 h .8433 g 5849 1768 N -51 0 0 33 51 0 h .839 g 5849 1801 N -51 0 0 34 51 0 h .8346 g 5849 1835 N -51 0 0 33 51 0 h .8302 g 5849 1868 N -51 0 0 34 51 0 h .8259 g 5849 1902 N -51 0 0 33 51 0 h .8215 g 5849 1935 N -51 0 0 34 51 0 h .8171 g 5849 1969 N -51 0 0 34 51 0 h .8128 g 5849 2003 N -51 0 0 33 51 0 h .8084 g 5849 2036 N -51 0 0 34 51 0 h .8041 g 5849 2070 N -51 0 0 33 51 0 h .7997 g 5849 2103 N -51 0 0 34 51 0 h .7953 g 5849 2137 N -51 0 0 34 51 0 h .791 g 5849 2171 N -51 0 0 33 51 0 h .7866 g 5849 2204 N -51 0 0 34 51 0 h .7823 g 5849 2238 N -51 0 0 33 51 0 h .7779 g 5849 2271 N -51 0 0 34 51 0 h .7735 g 5849 2305 N -51 0 0 34 51 0 h .7692 g 5849 2339 N -51 0 0 33 51 0 h .7648 g 5849 2372 N -51 0 0 34 51 0 h .7604 g 5849 2406 N -51 0 0 33 51 0 h .7561 g 5849 2439 N -51 0 0 34 51 0 h .7517 g 5849 2473 N -51 0 0 34 51 0 h .7474 g 5849 2507 N -51 0 0 33 51 0 h .743 g 5849 2540 N -51 0 0 34 51 0 h .7386 g 5849 2574 N -51 0 0 32 51 0 h .7343 g 5849 2606 N -51 0 0 34 51 0 h .7299 g 5849 2640 N -51 0 0 33 51 0 h .7256 g 5849 2673 N -51 0 0 34 51 0 h .7212 g 5849 2707 N -51 0 0 34 51 0 h .7168 g 5849 2741 N -51 0 0 33 51 0 h .7125 g 5849 2774 N -51 0 0 34 51 0 h .7081 g 5849 2808 N -51 0 0 33 51 0 h .7037 g 5849 2841 N -51 0 0 34 51 0 h .6994 g 5849 2875 N -51 0 0 34 51 0 h .695 g 5849 2909 N -51 0 0 33 51 0 h .6907 g 5849 2942 N -51 0 0 34 51 0 h .6863 g 5849 2976 N -51 0 0 33 51 0 h .6819 g 5849 3009 N -51 0 0 34 51 0 h .6776 g 5849 3043 N -51 0 0 34 51 0 h .6732 g 5849 3077 N -51 0 0 33 51 0 h .6688 g 5849 3110 N -51 0 0 34 51 0 h .6645 g 5849 3144 N -51 0 0 33 51 0 h .6601 g 5849 3177 N -51 0 0 34 51 0 h .6558 g 5849 3211 N -51 0 0 34 51 0 h .6514 g 5849 3245 N -51 0 0 33 51 0 h .647 g 5849 3278 N -51 0 0 34 51 0 h .6427 g 5849 3312 N -51 0 0 33 51 0 h .6383 g 5849 3345 N -51 0 0 34 51 0 h .634 g 5849 3379 N -51 0 0 33 51 0 h .6296 g 5849 3412 N -51 0 0 34 51 0 h .6252 g 5849 3446 N -51 0 0 34 51 0 h .6209 g 5849 3480 N -51 0 0 33 51 0 h .6165 g 5849 3513 N -51 0 0 34 51 0 h .6121 g 5849 3547 N -51 0 0 33 51 0 h .6078 g 5849 3580 N -51 0 0 34 51 0 h .6034 g 5849 3614 N -51 0 0 34 51 0 h .5991 g 5849 3648 N -51 0 0 33 51 0 h .5947 g 5849 3681 N -51 0 0 34 51 0 h .5903 g 5849 3715 N -51 0 0 33 51 0 h .586 g 5849 3748 N -51 0 0 34 51 0 h .5816 g 5849 3782 N -51 0 0 34 51 0 h .5772 g 5849 3816 N -51 0 0 33 51 0 h .5729 g 5849 3849 N -51 0 0 34 51 0 h .5685 g 5849 3883 N -51 0 0 33 51 0 h .5642 g 5849 3916 N -51 0 0 34 51 0 h .5598 g 5849 3950 N -51 0 0 33 51 0 h .5554 g 5849 3983 N -51 0 0 34 51 0 h .5511 g 5849 4017 N -51 0 0 34 51 0 h .5467 g 5849 4051 N -51 0 0 33 51 0 h .5424 g 5849 4084 N -51 0 0 34 51 0 h .538 g 5849 4118 N -51 0 0 33 51 0 h .5336 g 5849 4151 N -51 0 0 34 51 0 h .5293 g 5849 4185 N -51 0 0 34 51 0 h .5249 g 5849 4219 N -51 0 0 33 51 0 h .9624 g 5900 928 N -50 0 0 33 50 0 h .9579 g 5900 961 N -50 0 0 34 50 0 h .9534 g 5900 995 N -50 0 0 34 50 0 h .9488 g 5900 1029 N -50 0 0 33 50 0 h .9443 g 5900 1062 N -50 0 0 34 50 0 h .9398 g 5900 1096 N -50 0 0 33 50 0 h .9353 g 5900 1129 N -50 0 0 34 50 0 h .9308 g 5900 1163 N -50 0 0 34 50 0 h .9263 g 5900 1197 N -50 0 0 33 50 0 h .9218 g 5900 1230 N -50 0 0 34 50 0 h .9172 g 5900 1264 N -50 0 0 33 50 0 h .9127 g 5900 1297 N -50 0 0 34 50 0 h .9082 g 5900 1331 N -50 0 0 33 50 0 h .9037 g 5900 1364 N -50 0 0 34 50 0 h .8992 g 5900 1398 N -50 0 0 34 50 0 h .8947 g 5900 1432 N -50 0 0 33 50 0 h .8902 g 5900 1465 N -50 0 0 34 50 0 h .8856 g 5900 1499 N -50 0 0 33 50 0 h .8811 g 5900 1532 N -50 0 0 34 50 0 h .8766 g 5900 1566 N -50 0 0 34 50 0 h .8721 g 5900 1600 N -50 0 0 33 50 0 h .8676 g 5900 1633 N -50 0 0 34 50 0 h .8631 g 5900 1667 N -50 0 0 33 50 0 h .8585 g 5900 1700 N -50 0 0 34 50 0 h .854 g 5900 1734 N -50 0 0 34 50 0 h .8495 g 5900 1768 N -50 0 0 33 50 0 h .845 g 5900 1801 N -50 0 0 34 50 0 h .8405 g 5900 1835 N -50 0 0 33 50 0 h .836 g 5900 1868 N -50 0 0 34 50 0 h .8315 g 5900 1902 N -50 0 0 33 50 0 h .8269 g 5900 1935 N -50 0 0 34 50 0 h .8224 g 5900 1969 N -50 0 0 34 50 0 h .8179 g 5900 2003 N -50 0 0 33 50 0 h .8134 g 5900 2036 N -50 0 0 34 50 0 h .8089 g 5900 2070 N -50 0 0 33 50 0 h .8044 g 5900 2103 N -50 0 0 34 50 0 h .7999 g 5900 2137 N -50 0 0 34 50 0 h .7953 g 5900 2171 N -50 0 0 33 50 0 h .7908 g 5900 2204 N -50 0 0 34 50 0 h .7863 g 5900 2238 N -50 0 0 33 50 0 h .7818 g 5900 2271 N -50 0 0 34 50 0 h .7773 g 5900 2305 N -50 0 0 34 50 0 h .7728 g 5900 2339 N -50 0 0 33 50 0 h .7683 g 5900 2372 N -50 0 0 34 50 0 h .7637 g 5900 2406 N -50 0 0 33 50 0 h .7592 g 5900 2439 N -50 0 0 34 50 0 h .7547 g 5900 2473 N -50 0 0 34 50 0 h .7502 g 5900 2507 N -50 0 0 33 50 0 h .7457 g 5900 2540 N -50 0 0 34 50 0 h .7412 g 5900 2574 N -50 0 0 32 50 0 h .7366 g 5900 2606 N -50 0 0 34 50 0 h .7321 g 5900 2640 N -50 0 0 33 50 0 h .7276 g 5900 2673 N -50 0 0 34 50 0 h .7231 g 5900 2707 N -50 0 0 34 50 0 h .7186 g 5900 2741 N -50 0 0 33 50 0 h .7141 g 5900 2774 N -50 0 0 34 50 0 h .7096 g 5900 2808 N -50 0 0 33 50 0 h .705 g 5900 2841 N -50 0 0 34 50 0 h .7005 g 5900 2875 N -50 0 0 34 50 0 h .696 g 5900 2909 N -50 0 0 33 50 0 h .6915 g 5900 2942 N -50 0 0 34 50 0 h .687 g 5900 2976 N -50 0 0 33 50 0 h .6825 g 5900 3009 N -50 0 0 34 50 0 h .678 g 5900 3043 N -50 0 0 34 50 0 h .6734 g 5900 3077 N -50 0 0 33 50 0 h .6689 g 5900 3110 N -50 0 0 34 50 0 h .6644 g 5900 3144 N -50 0 0 33 50 0 h .6599 g 5900 3177 N -50 0 0 34 50 0 h .6554 g 5900 3211 N -50 0 0 34 50 0 h .6509 g 5900 3245 N -50 0 0 33 50 0 h .6463 g 5900 3278 N -50 0 0 34 50 0 h .6418 g 5900 3312 N -50 0 0 33 50 0 h .6373 g 5900 3345 N -50 0 0 34 50 0 h .6328 g 5900 3379 N -50 0 0 33 50 0 h .6283 g 5900 3412 N -50 0 0 34 50 0 h .6238 g 5900 3446 N -50 0 0 34 50 0 h .6193 g 5900 3480 N -50 0 0 33 50 0 h .6147 g 5900 3513 N -50 0 0 34 50 0 h .6102 g 5900 3547 N -50 0 0 33 50 0 h .6057 g 5900 3580 N -50 0 0 34 50 0 h .6012 g 5900 3614 N -50 0 0 34 50 0 h .5967 g 5900 3648 N -50 0 0 33 50 0 h .5922 g 5900 3681 N -50 0 0 34 50 0 h .5877 g 5900 3715 N -50 0 0 33 50 0 h .5831 g 5900 3748 N -50 0 0 34 50 0 h .5786 g 5900 3782 N -50 0 0 34 50 0 h .5741 g 5900 3816 N -50 0 0 33 50 0 h .5696 g 5900 3849 N -50 0 0 34 50 0 h .5651 g 5900 3883 N -50 0 0 33 50 0 h .5606 g 5900 3916 N -50 0 0 34 50 0 h .5561 g 5900 3950 N -50 0 0 33 50 0 h .5515 g 5900 3983 N -50 0 0 34 50 0 h .547 g 5900 4017 N -50 0 0 34 50 0 h .5425 g 5900 4051 N -50 0 0 33 50 0 h .538 g 5900 4084 N -50 0 0 34 50 0 h .5335 g 5900 4118 N -50 0 0 33 50 0 h .529 g 5900 4151 N -50 0 0 34 50 0 h .5244 g 5900 4185 N -50 0 0 34 50 0 h .5199 g 5900 4219 N -50 0 0 33 50 0 h .9724 g 5950 928 N -51 0 0 33 51 0 h .9677 g 5950 961 N -51 0 0 34 51 0 h .9631 g 5950 995 N -51 0 0 34 51 0 h .9584 g 5950 1029 N -51 0 0 33 51 0 h .9537 g 5950 1062 N -51 0 0 34 51 0 h .9491 g 5950 1096 N -51 0 0 33 51 0 h .9444 g 5950 1129 N -51 0 0 34 51 0 h .9397 g 5950 1163 N -51 0 0 34 51 0 h .9351 g 5950 1197 N -51 0 0 33 51 0 h .9304 g 5950 1230 N -51 0 0 34 51 0 h .9257 g 5950 1264 N -51 0 0 33 51 0 h .9211 g 5950 1297 N -51 0 0 34 51 0 h .9164 g 5950 1331 N -51 0 0 33 51 0 h .9117 g 5950 1364 N -51 0 0 34 51 0 h .9071 g 5950 1398 N -51 0 0 34 51 0 h .9024 g 5950 1432 N -51 0 0 33 51 0 h .8977 g 5950 1465 N -51 0 0 34 51 0 h .8931 g 5950 1499 N -51 0 0 33 51 0 h .8884 g 5950 1532 N -51 0 0 34 51 0 h .8837 g 5950 1566 N -51 0 0 34 51 0 h .8791 g 5950 1600 N -51 0 0 33 51 0 h .8744 g 5950 1633 N -51 0 0 34 51 0 h .8697 g 5950 1667 N -51 0 0 33 51 0 h .8651 g 5950 1700 N -51 0 0 34 51 0 h .8604 g 5950 1734 N -51 0 0 34 51 0 h .8557 g 5950 1768 N -51 0 0 33 51 0 h .851 g 5950 1801 N -51 0 0 34 51 0 h .8464 g 5950 1835 N -51 0 0 33 51 0 h .8417 g 5950 1868 N -51 0 0 34 51 0 h .837 g 5950 1902 N -51 0 0 33 51 0 h .8324 g 5950 1935 N -51 0 0 34 51 0 h .8277 g 5950 1969 N -51 0 0 34 51 0 h .823 g 5950 2003 N -51 0 0 33 51 0 h .8184 g 5950 2036 N -51 0 0 34 51 0 h .8137 g 5950 2070 N -51 0 0 33 51 0 h .809 g 5950 2103 N -51 0 0 34 51 0 h .8044 g 5950 2137 N -51 0 0 34 51 0 h .7997 g 5950 2171 N -51 0 0 33 51 0 h .795 g 5950 2204 N -51 0 0 34 51 0 h .7904 g 5950 2238 N -51 0 0 33 51 0 h .7857 g 5950 2271 N -51 0 0 34 51 0 h .781 g 5950 2305 N -51 0 0 34 51 0 h .7764 g 5950 2339 N -51 0 0 33 51 0 h .7717 g 5950 2372 N -51 0 0 34 51 0 h .767 g 5950 2406 N -51 0 0 33 51 0 h .7624 g 5950 2439 N -51 0 0 34 51 0 h .7577 g 5950 2473 N -51 0 0 34 51 0 h .753 g 5950 2507 N -51 0 0 33 51 0 h .7484 g 5950 2540 N -51 0 0 34 51 0 h .7437 g 5950 2574 N -51 0 0 32 51 0 h .739 g 5950 2606 N -51 0 0 34 51 0 h .7344 g 5950 2640 N -51 0 0 33 51 0 h .7297 g 5950 2673 N -51 0 0 34 51 0 h .725 g 5950 2707 N -51 0 0 34 51 0 h .7203 g 5950 2741 N -51 0 0 33 51 0 h .7157 g 5950 2774 N -51 0 0 34 51 0 h .711 g 5950 2808 N -51 0 0 33 51 0 h .7063 g 5950 2841 N -51 0 0 34 51 0 h .7017 g 5950 2875 N -51 0 0 34 51 0 h .697 g 5950 2909 N -51 0 0 33 51 0 h .6923 g 5950 2942 N -51 0 0 34 51 0 h .6877 g 5950 2976 N -51 0 0 33 51 0 h .683 g 5950 3009 N -51 0 0 34 51 0 h .6783 g 5950 3043 N -51 0 0 34 51 0 h .6737 g 5950 3077 N -51 0 0 33 51 0 h .669 g 5950 3110 N -51 0 0 34 51 0 h .6643 g 5950 3144 N -51 0 0 33 51 0 h .6597 g 5950 3177 N -51 0 0 34 51 0 h .655 g 5950 3211 N -51 0 0 34 51 0 h .6503 g 5950 3245 N -51 0 0 33 51 0 h .6457 g 5950 3278 N -51 0 0 34 51 0 h .641 g 5950 3312 N -51 0 0 33 51 0 h .6363 g 5950 3345 N -51 0 0 34 51 0 h .6317 g 5950 3379 N -51 0 0 33 51 0 h .627 g 5950 3412 N -51 0 0 34 51 0 h .6223 g 5950 3446 N -51 0 0 34 51 0 h .6177 g 5950 3480 N -51 0 0 33 51 0 h .613 g 5950 3513 N -51 0 0 34 51 0 h .6083 g 5950 3547 N -51 0 0 33 51 0 h .6037 g 5950 3580 N -51 0 0 34 51 0 h .599 g 5950 3614 N -51 0 0 34 51 0 h .5943 g 5950 3648 N -51 0 0 33 51 0 h .5896 g 5950 3681 N -51 0 0 34 51 0 h .585 g 5950 3715 N -51 0 0 33 51 0 h .5803 g 5950 3748 N -51 0 0 34 51 0 h .5756 g 5950 3782 N -51 0 0 34 51 0 h .571 g 5950 3816 N -51 0 0 33 51 0 h .5663 g 5950 3849 N -51 0 0 34 51 0 h .5616 g 5950 3883 N -51 0 0 33 51 0 h .557 g 5950 3916 N -51 0 0 34 51 0 h .5523 g 5950 3950 N -51 0 0 33 51 0 h .5476 g 5950 3983 N -51 0 0 34 51 0 h .543 g 5950 4017 N -51 0 0 34 51 0 h .5383 g 5950 4051 N -51 0 0 33 51 0 h .5336 g 5950 4084 N -51 0 0 34 51 0 h .529 g 5950 4118 N -51 0 0 33 51 0 h .5243 g 5950 4151 N -51 0 0 34 51 0 h .5196 g 5950 4185 N -51 0 0 34 51 0 h .515 g 5950 4219 N -51 0 0 33 51 0 h .9824 g 6001 928 N -50 0 0 33 50 0 h .9776 g 6001 961 N -50 0 0 34 50 0 h .9728 g 6001 995 N -50 0 0 34 50 0 h .968 g 6001 1029 N -50 0 0 33 50 0 h .9632 g 6001 1062 N -50 0 0 34 50 0 h .9583 g 6001 1096 N -50 0 0 33 50 0 h .9535 g 6001 1129 N -50 0 0 34 50 0 h .9487 g 6001 1163 N -50 0 0 34 50 0 h .9439 g 6001 1197 N -50 0 0 33 50 0 h .939 g 6001 1230 N -50 0 0 34 50 0 h .9342 g 6001 1264 N -50 0 0 33 50 0 h .9294 g 6001 1297 N -50 0 0 34 50 0 h .9246 g 6001 1331 N -50 0 0 33 50 0 h .9198 g 6001 1364 N -50 0 0 34 50 0 h .9149 g 6001 1398 N -50 0 0 34 50 0 h .9101 g 6001 1432 N -50 0 0 33 50 0 h .9053 g 6001 1465 N -50 0 0 34 50 0 h .9005 g 6001 1499 N -50 0 0 33 50 0 h .8957 g 6001 1532 N -50 0 0 34 50 0 h .8908 g 6001 1566 N -50 0 0 34 50 0 h .886 g 6001 1600 N -50 0 0 33 50 0 h .8812 g 6001 1633 N -50 0 0 34 50 0 h .8764 g 6001 1667 N -50 0 0 33 50 0 h .8716 g 6001 1700 N -50 0 0 34 50 0 h .8667 g 6001 1734 N -50 0 0 34 50 0 h .8619 g 6001 1768 N -50 0 0 33 50 0 h .8571 g 6001 1801 N -50 0 0 34 50 0 h .8523 g 6001 1835 N -50 0 0 33 50 0 h .8475 g 6001 1868 N -50 0 0 34 50 0 h .8426 g 6001 1902 N -50 0 0 33 50 0 h .8378 g 6001 1935 N -50 0 0 34 50 0 h .833 g 6001 1969 N -50 0 0 34 50 0 h .8282 g 6001 2003 N -50 0 0 33 50 0 h .8233 g 6001 2036 N -50 0 0 34 50 0 h .8185 g 6001 2070 N -50 0 0 33 50 0 h .8137 g 6001 2103 N -50 0 0 34 50 0 h .8089 g 6001 2137 N -50 0 0 34 50 0 h .8041 g 6001 2171 N -50 0 0 33 50 0 h .7992 g 6001 2204 N -50 0 0 34 50 0 h .7944 g 6001 2238 N -50 0 0 33 50 0 h .7896 g 6001 2271 N -50 0 0 34 50 0 h .7848 g 6001 2305 N -50 0 0 34 50 0 h .78 g 6001 2339 N -50 0 0 33 50 0 h .7751 g 6001 2372 N -50 0 0 34 50 0 h .7703 g 6001 2406 N -50 0 0 33 50 0 h .7655 g 6001 2439 N -50 0 0 34 50 0 h .7607 g 6001 2473 N -50 0 0 34 50 0 h .7559 g 6001 2507 N -50 0 0 33 50 0 h .751 g 6001 2540 N -50 0 0 34 50 0 h .7462 g 6001 2574 N -50 0 0 32 50 0 h .7414 g 6001 2606 N -50 0 0 34 50 0 h .7366 g 6001 2640 N -50 0 0 33 50 0 h .7317 g 6001 2673 N -50 0 0 34 50 0 h .7269 g 6001 2707 N -50 0 0 34 50 0 h .7221 g 6001 2741 N -50 0 0 33 50 0 h .7173 g 6001 2774 N -50 0 0 34 50 0 h .7125 g 6001 2808 N -50 0 0 33 50 0 h .7076 g 6001 2841 N -50 0 0 34 50 0 h .7028 g 6001 2875 N -50 0 0 34 50 0 h .698 g 6001 2909 N -50 0 0 33 50 0 h .6932 g 6001 2942 N -50 0 0 34 50 0 h .6884 g 6001 2976 N -50 0 0 33 50 0 h .6835 g 6001 3009 N -50 0 0 34 50 0 h .6787 g 6001 3043 N -50 0 0 34 50 0 h .6739 g 6001 3077 N -50 0 0 33 50 0 h .6691 g 6001 3110 N -50 0 0 34 50 0 h .6643 g 6001 3144 N -50 0 0 33 50 0 h .6594 g 6001 3177 N -50 0 0 34 50 0 h .6546 g 6001 3211 N -50 0 0 34 50 0 h .6498 g 6001 3245 N -50 0 0 33 50 0 h .645 g 6001 3278 N -50 0 0 34 50 0 h .6402 g 6001 3312 N -50 0 0 33 50 0 h .6353 g 6001 3345 N -50 0 0 34 50 0 h .6305 g 6001 3379 N -50 0 0 33 50 0 h .6257 g 6001 3412 N -50 0 0 34 50 0 h .6209 g 6001 3446 N -50 0 0 34 50 0 h .616 g 6001 3480 N -50 0 0 33 50 0 h .6112 g 6001 3513 N -50 0 0 34 50 0 h .6064 g 6001 3547 N -50 0 0 33 50 0 h .6016 g 6001 3580 N -50 0 0 34 50 0 h .5968 g 6001 3614 N -50 0 0 34 50 0 h .5919 g 6001 3648 N -50 0 0 33 50 0 h .5871 g 6001 3681 N -50 0 0 34 50 0 h .5823 g 6001 3715 N -50 0 0 33 50 0 h .5775 g 6001 3748 N -50 0 0 34 50 0 h .5727 g 6001 3782 N -50 0 0 34 50 0 h .5678 g 6001 3816 N -50 0 0 33 50 0 h .563 g 6001 3849 N -50 0 0 34 50 0 h .5582 g 6001 3883 N -50 0 0 33 50 0 h .5534 g 6001 3916 N -50 0 0 34 50 0 h .5486 g 6001 3950 N -50 0 0 33 50 0 h .5437 g 6001 3983 N -50 0 0 34 50 0 h .5389 g 6001 4017 N -50 0 0 34 50 0 h .5341 g 6001 4051 N -50 0 0 33 50 0 h .5293 g 6001 4084 N -50 0 0 34 50 0 h .5244 g 6001 4118 N -50 0 0 33 50 0 h .5196 g 6001 4151 N -50 0 0 34 50 0 h .5148 g 6001 4185 N -50 0 0 34 50 0 h .51 g 6001 4219 N -50 0 0 33 50 0 h .9925 g 6051 928 N -51 0 0 33 51 0 h .9875 g 6051 961 N -51 0 0 34 51 0 h .9825 g 6051 995 N -51 0 0 34 51 0 h .9775 g 6051 1029 N -51 0 0 33 51 0 h .9726 g 6051 1062 N -51 0 0 34 51 0 h .9676 g 6051 1096 N -51 0 0 33 51 0 h .9626 g 6051 1129 N -51 0 0 34 51 0 h .9576 g 6051 1163 N -51 0 0 34 51 0 h .9527 g 6051 1197 N -51 0 0 33 51 0 h .9477 g 6051 1230 N -51 0 0 34 51 0 h .9427 g 6051 1264 N -51 0 0 33 51 0 h .9377 g 6051 1297 N -51 0 0 34 51 0 h .9328 g 6051 1331 N -51 0 0 33 51 0 h .9278 g 6051 1364 N -51 0 0 34 51 0 h .9228 g 6051 1398 N -51 0 0 34 51 0 h .9179 g 6051 1432 N -51 0 0 33 51 0 h .9129 g 6051 1465 N -51 0 0 34 51 0 h .9079 g 6051 1499 N -51 0 0 33 51 0 h .9029 g 6051 1532 N -51 0 0 34 51 0 h .898 g 6051 1566 N -51 0 0 34 51 0 h .893 g 6051 1600 N -51 0 0 33 51 0 h .888 g 6051 1633 N -51 0 0 34 51 0 h .883 g 6051 1667 N -51 0 0 33 51 0 h .8781 g 6051 1700 N -51 0 0 34 51 0 h .8731 g 6051 1734 N -51 0 0 34 51 0 h .8681 g 6051 1768 N -51 0 0 33 51 0 h .8631 g 6051 1801 N -51 0 0 34 51 0 h .8582 g 6051 1835 N -51 0 0 33 51 0 h .8532 g 6051 1868 N -51 0 0 34 51 0 h .8482 g 6051 1902 N -51 0 0 33 51 0 h .8432 g 6051 1935 N -51 0 0 34 51 0 h .8383 g 6051 1969 N -51 0 0 34 51 0 h .8333 g 6051 2003 N -51 0 0 33 51 0 h .8283 g 6051 2036 N -51 0 0 34 51 0 h .8233 g 6051 2070 N -51 0 0 33 51 0 h .8184 g 6051 2103 N -51 0 0 34 51 0 h .8134 g 6051 2137 N -51 0 0 34 51 0 h .8084 g 6051 2171 N -51 0 0 33 51 0 h .8035 g 6051 2204 N -51 0 0 34 51 0 h .7985 g 6051 2238 N -51 0 0 33 51 0 h .7935 g 6051 2271 N -51 0 0 34 51 0 h .7885 g 6051 2305 N -51 0 0 34 51 0 h .7836 g 6051 2339 N -51 0 0 33 51 0 h .7786 g 6051 2372 N -51 0 0 34 51 0 h .7736 g 6051 2406 N -51 0 0 33 51 0 h .7686 g 6051 2439 N -51 0 0 34 51 0 h .7637 g 6051 2473 N -51 0 0 34 51 0 h .7587 g 6051 2507 N -51 0 0 33 51 0 h .7537 g 6051 2540 N -51 0 0 34 51 0 h .7487 g 6051 2574 N -51 0 0 32 51 0 h .7438 g 6051 2606 N -51 0 0 34 51 0 h .7388 g 6051 2640 N -51 0 0 33 51 0 h .7338 g 6051 2673 N -51 0 0 34 51 0 h .7288 g 6051 2707 N -51 0 0 34 51 0 h .7239 g 6051 2741 N -51 0 0 33 51 0 h .7189 g 6051 2774 N -51 0 0 34 51 0 h .7139 g 6051 2808 N -51 0 0 33 51 0 h .7089 g 6051 2841 N -51 0 0 34 51 0 h .704 g 6051 2875 N -51 0 0 34 51 0 h .699 g 6051 2909 N -51 0 0 33 51 0 h .694 g 6051 2942 N -51 0 0 34 51 0 h .689 g 6051 2976 N -51 0 0 33 51 0 h .6841 g 6051 3009 N -51 0 0 34 51 0 h .6791 g 6051 3043 N -51 0 0 34 51 0 h .6741 g 6051 3077 N -51 0 0 33 51 0 h .6692 g 6051 3110 N -51 0 0 34 51 0 h .6642 g 6051 3144 N -51 0 0 33 51 0 h .6592 g 6051 3177 N -51 0 0 34 51 0 h .6542 g 6051 3211 N -51 0 0 34 51 0 h .6493 g 6051 3245 N -51 0 0 33 51 0 h .6443 g 6051 3278 N -51 0 0 34 51 0 h .6393 g 6051 3312 N -51 0 0 33 51 0 h .6343 g 6051 3345 N -51 0 0 34 51 0 h .6294 g 6051 3379 N -51 0 0 33 51 0 h .6244 g 6051 3412 N -51 0 0 34 51 0 h .6194 g 6051 3446 N -51 0 0 34 51 0 h .6144 g 6051 3480 N -51 0 0 33 51 0 h .6095 g 6051 3513 N -51 0 0 34 51 0 h .6045 g 6051 3547 N -51 0 0 33 51 0 h .5995 g 6051 3580 N -51 0 0 34 51 0 h .5945 g 6051 3614 N -51 0 0 34 51 0 h .5896 g 6051 3648 N -51 0 0 33 51 0 h .5846 g 6051 3681 N -51 0 0 34 51 0 h .5796 g 6051 3715 N -51 0 0 33 51 0 h .5746 g 6051 3748 N -51 0 0 34 51 0 h .5697 g 6051 3782 N -51 0 0 34 51 0 h .5647 g 6051 3816 N -51 0 0 33 51 0 h .5597 g 6051 3849 N -51 0 0 34 51 0 h .5548 g 6051 3883 N -51 0 0 33 51 0 h .5498 g 6051 3916 N -51 0 0 34 51 0 h .5448 g 6051 3950 N -51 0 0 33 51 0 h .5398 g 6051 3983 N -51 0 0 34 51 0 h .5349 g 6051 4017 N -51 0 0 34 51 0 h .5299 g 6051 4051 N -51 0 0 33 51 0 h .5249 g 6051 4084 N -51 0 0 34 51 0 h .5199 g 6051 4118 N -51 0 0 33 51 0 h .515 g 6051 4151 N -51 0 0 34 51 0 h .51 g 6051 4185 N -51 0 0 34 51 0 h .505 g 6051 4219 N -51 0 0 33 51 0 h %pm3d_map_end % End plot #1 1.000 UL LTb LCb setrgbcolor 1098 4252 N 0 -3324 V 5004 0 V 0 3324 V -5004 0 V Z stroke 1.000 UL LTb LCb setrgbcolor 1098 928 M 0 82 V stroke LTb LCb setrgbcolor 1098 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1098 4252 M 0 -82 V stroke LTb LCb setrgbcolor 2099 928 M 0 82 V stroke LTb LCb setrgbcolor 2099 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 2099 4252 M 0 -82 V stroke LTb LCb setrgbcolor 3100 928 M 0 82 V stroke LTb LCb setrgbcolor 3100 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 3100 4252 M 0 -82 V stroke LTb LCb setrgbcolor 4100 928 M 0 82 V stroke LTb LCb setrgbcolor 4100 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 4100 4252 M 0 -82 V stroke LTb LCb setrgbcolor 5101 928 M 0 82 V stroke LTb LCb setrgbcolor 5101 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5101 4252 M 0 -82 V stroke LTb LCb setrgbcolor 6102 928 M 0 82 V stroke LTb LCb setrgbcolor 6102 746 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 4252 M 0 -82 V stroke LCb setrgbcolor 3600 536 M [ [(Helvetica) 140.0 0.0 true true 0 (x)] ] -46.7 MCshow LTb 1.000 UL LTb LCb setrgbcolor 1098 928 M 82 0 V stroke 989 928 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 928 M -82 0 V stroke LTb LCb setrgbcolor 1098 1593 M 82 0 V stroke 989 1593 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 1593 M -82 0 V stroke LTb LCb setrgbcolor 1098 2258 M 82 0 V stroke 989 2258 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 2258 M -82 0 V stroke LTb LCb setrgbcolor 1098 2922 M 82 0 V stroke 989 2922 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 2922 M -82 0 V stroke LTb LCb setrgbcolor 1098 3587 M 82 0 V stroke 989 3587 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 3587 M -82 0 V stroke LTb LCb setrgbcolor 1098 4252 M 82 0 V stroke 989 4252 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6102 4252 M -82 0 V stroke LCb setrgbcolor 611 2590 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (y)] ] -46.7 MCshow grestore LTb 1.000 UL LTb LCb setrgbcolor 1098 4252 N 0 -3324 V 5004 0 V 0 3324 V -5004 0 V Z stroke stroke gsave %% draw gray scale smooth box maxcolors 0 gt {/imax maxcolors def} {/imax 1024 def} ifelse 6227 928 translate 250 3324 scale 0 setlinewidth /ystep 1 imax div def /y0 0 def /ii 0 def { y0 g 0 y0 N 1 0 V 0 ystep V -1 0 f /y0 y0 ystep add def /ii ii 1 add def ii imax ge {exit} if } loop grestore 0 setgray 1.000 UL LTb LCb setrgbcolor 6227 928 N 250 0 V 0 3324 V -250 0 V 0 -3324 V Z stroke 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6477 928 M -63 0 V stroke 6561 928 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 928 M 63 0 V 187 664 R -63 0 V stroke 6561 1592 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 1592 M 63 0 V 187 665 R -63 0 V stroke 6561 2257 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 2257 M 63 0 V 187 665 R -63 0 V stroke 6561 2922 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 2922 M 63 0 V 187 665 R -63 0 V stroke 6561 3587 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 3587 M 63 0 V 187 665 R -63 0 V stroke 6561 4252 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MLshow 1.000 UL LTb LCb setrgbcolor 6227 4252 M 63 0 V 1.000 UP stroke 1.00 1.00 1.00 C 1148 1094 M [ [(Helvetica) 140.0 0.0 true true 0 (z = 0)] ] -46.7 MLshow 1.00 1.00 1.00 C 1148 4086 M [ [(Helvetica) 140.0 0.0 true true 0 (z = 1)] ] -46.7 MLshow 1.00 1.00 1.00 C 6052 1094 M [ [(Helvetica) 140.0 0.0 true true 0 (z = 1)] ] -46.7 MRshow 1.00 1.00 1.00 C 6052 4086 M [ [(Helvetica) 140.0 0.0 true true 0 (z = 0.5)] ] -46.7 MRshow grestore % colour palette end stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica gsl-doc-2.3/doc/version.texi0000664000175000017500000000013513022372557014114 0ustar eddedd@set UPDATED 29 August 2016 @set UPDATED-MONTH August 2016 @set EDITION 2.3 @set VERSION 2.3 gsl-doc-2.3/doc/specfunc-ellint.texi0000664000175000017500000002032512616157443015530 0ustar eddedd@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}, gsl_mode_t @var{mode}) @deftypefunx int gsl_sf_ellint_D_e (double @var{phi}, double @var{k}, 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) = {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) = (1/3)(\sin(\phi))^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1). @end example @end ifinfo @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 gsl-doc-2.3/doc/rand-gaussian.tex0000664000175000017500000005435612616157443015033 0ustar eddedd% 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.0500bp \GNUPLOTpicture(7200,5544) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: rand-gaussian.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Feb 5 16:32:53 2009 %%DocumentFonts: %%BoundingBox: 0 0 360 277 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (rand-gaussian.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Feb 5 16:32:53 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 1051 631 M -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 31 862 R -31 0 V 31 863 R -31 0 V 1051 631 M 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 580 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 581 31 R 0 -31 V 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V stroke LCb setrgbcolor LTb LCb setrgbcolor LTb 1.000 UP 0.500 UL LTb 1.000 UL LT0 LTb LT0 6077 4781 M 543 0 V 1051 631 M 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 1 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 1 V 19 0 V 20 0 V 19 0 V 19 1 V 20 0 V 19 0 V 20 1 V 19 0 V 20 1 V 19 0 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 20 1 V 19 1 V 19 2 V 20 1 V 19 2 V 20 2 V 19 2 V 20 2 V 19 3 V 19 3 V 20 3 V 19 3 V 20 4 V 19 4 V 20 5 V 19 4 V 19 6 V 20 5 V 19 7 V 20 6 V 19 8 V 20 8 V 19 8 V 19 10 V 20 10 V 19 10 V 20 12 V 19 12 V 20 14 V 19 14 V 19 15 V 20 17 V 19 17 V 20 18 V 19 20 V 20 21 V 19 22 V 19 24 V 20 25 V 19 26 V 20 28 V 19 29 V 20 31 V 19 33 V 19 34 V 20 35 V 19 38 V 20 39 V 19 40 V 20 43 V 19 44 V 19 46 V 20 47 V 19 49 V 20 51 V 3052 1658 L 20 54 V 19 56 V 19 57 V 20 59 V 19 60 V 20 62 V 19 63 V 20 64 V 19 65 V 19 67 V 20 67 V 19 68 V 20 68 V 19 69 V 20 70 V 19 69 V 19 70 V 20 70 V 19 69 V 20 70 V 19 68 V 20 68 V 19 67 V 19 66 V 20 64 V 19 63 V 20 62 V 19 60 V 20 58 V 19 55 V 19 54 V 20 51 V 19 48 V 20 45 V 19 43 V 20 39 V 19 37 V 19 33 V 20 30 V 19 26 V 20 23 V 19 19 V 20 15 V 19 11 V 19 8 V 20 4 V 19 0 V 20 -4 V 19 -8 V 19 -11 V 20 -15 V 19 -19 V 20 -23 V 19 -26 V 20 -30 V 19 -33 V 19 -37 V 20 -39 V 19 -43 V 20 -45 V 19 -48 V 20 -51 V 19 -54 V 19 -55 V 20 -58 V 19 -60 V 20 -62 V 19 -63 V 20 -64 V 19 -66 V 19 -67 V 20 -68 V 19 -68 V 20 -70 V 19 -69 V 20 -70 V 19 -70 V 19 -69 V 20 -70 V 19 -69 V 20 -68 V 19 -68 V 20 -67 V 19 -67 V 19 -65 V 20 -64 V 19 -63 V 20 -62 V 19 -60 V 20 -59 V 19 -57 V 19 -56 V 20 -54 V 19 -53 V 20 -51 V 19 -49 V 20 -47 V 19 -46 V 19 -44 V 20 -43 V 19 -40 V 20 -39 V 19 -38 V 20 -35 V 5092 1139 L 19 -33 V 20 -31 V 19 -29 V 20 -28 V 19 -26 V 20 -25 V 19 -24 V 19 -22 V 20 -21 V 19 -20 V 20 -18 V 19 -17 V 20 -17 V 19 -15 V 19 -14 V 20 -14 V 19 -12 V 20 -12 V 19 -10 V 20 -10 V 19 -10 V 19 -8 V 20 -8 V 19 -8 V 20 -6 V 19 -7 V 20 -5 V 19 -6 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -3 V 20 -3 V 19 -3 V 19 -3 V 20 -2 V 19 -2 V 20 -2 V 19 -2 V 20 -1 V 19 -2 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 20 -1 V 19 -1 V 19 0 V 20 -1 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 -1 V 19 0 V 20 0 V 19 0 V 20 -1 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 -1 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V 20 0 V 19 0 V stroke LT1 LTb LT1 6077 4581 M 543 0 V 1051 707 M 19 3 V 20 3 V 19 4 V 20 3 V 19 4 V 20 4 V 19 4 V 19 4 V 20 4 V 19 4 V 20 5 V 19 4 V 20 5 V 19 5 V 19 5 V 20 5 V 19 6 V 20 5 V 19 6 V 20 6 V 19 6 V 19 6 V 20 7 V 19 6 V 20 7 V 19 7 V 20 7 V 19 7 V 19 8 V 20 8 V 19 8 V 20 8 V 19 8 V 20 8 V 19 9 V 19 9 V 20 9 V 19 10 V 20 9 V 19 10 V 20 10 V 19 10 V 19 10 V 20 11 V 19 11 V 20 11 V 19 11 V 20 11 V 19 12 V 19 12 V 20 12 V 19 12 V 20 13 V 19 13 V 20 13 V 19 13 V 19 13 V 20 14 V 19 13 V 20 14 V 19 15 V 20 14 V 19 14 V 19 15 V 20 15 V 19 15 V 20 15 V 19 16 V 20 15 V 19 16 V 19 16 V 20 16 V 19 16 V 20 16 V 19 17 V 20 16 V 19 17 V 19 17 V 20 17 V 19 17 V 20 17 V 19 17 V 20 17 V 19 17 V 19 18 V 20 17 V 19 18 V 20 17 V 19 17 V 20 18 V 19 17 V 19 18 V 20 17 V 19 18 V 20 17 V 19 17 V 20 17 V 19 18 V 19 17 V 20 17 V 19 16 V 20 17 V 3052 1903 L 20 16 V 19 16 V 19 17 V 20 16 V 19 15 V 20 16 V 19 15 V 20 16 V 19 15 V 19 14 V 20 15 V 19 14 V 20 14 V 19 13 V 20 14 V 19 13 V 19 13 V 20 12 V 19 12 V 20 12 V 19 11 V 20 11 V 19 11 V 19 10 V 20 10 V 19 9 V 20 10 V 19 8 V 20 9 V 19 7 V 19 8 V 20 7 V 19 6 V 20 6 V 19 6 V 20 5 V 19 5 V 19 4 V 20 4 V 19 4 V 20 2 V 19 3 V 20 2 V 19 1 V 19 1 V 20 1 V 19 0 V 20 -1 V 19 -1 V 19 -1 V 20 -2 V 19 -3 V 20 -2 V 19 -4 V 20 -4 V 19 -4 V 19 -5 V 20 -5 V 19 -6 V 20 -6 V 19 -6 V 20 -7 V 19 -8 V 19 -7 V 20 -9 V 19 -8 V 20 -10 V 19 -9 V 20 -10 V 19 -10 V 19 -11 V 20 -11 V 19 -11 V 20 -12 V 19 -12 V 20 -12 V 19 -13 V 19 -13 V 20 -14 V 19 -13 V 20 -14 V 19 -14 V 20 -15 V 19 -14 V 19 -15 V 20 -16 V 19 -15 V 20 -16 V 19 -15 V 20 -16 V 19 -17 V 19 -16 V 20 -16 V 19 -17 V 20 -17 V 19 -16 V 20 -17 V 19 -17 V 19 -18 V 20 -17 V 19 -17 V 20 -17 V 19 -18 V 20 -17 V 5092 1697 L 19 -17 V 20 -18 V 19 -17 V 20 -17 V 19 -18 V 20 -17 V 19 -18 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 20 -17 V 19 -17 V 19 -17 V 20 -16 V 19 -17 V 20 -16 V 19 -16 V 20 -16 V 19 -16 V 19 -16 V 20 -15 V 19 -16 V 20 -15 V 19 -15 V 20 -15 V 19 -15 V 19 -14 V 20 -14 V 19 -15 V 20 -14 V 19 -13 V 20 -14 V 19 -13 V 19 -13 V 20 -13 V 19 -13 V 20 -13 V 19 -12 V 20 -12 V 19 -12 V 19 -12 V 20 -11 V 19 -11 V 20 -11 V 19 -11 V 20 -11 V 19 -10 V 19 -10 V 20 -10 V 19 -10 V 20 -9 V 19 -10 V 20 -9 V 19 -9 V 19 -9 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 20 -8 V 19 -8 V 19 -7 V 20 -7 V 19 -7 V 20 -7 V 19 -6 V 20 -7 V 19 -6 V 19 -6 V 20 -6 V 19 -6 V 20 -5 V 19 -6 V 20 -5 V 19 -5 V 19 -5 V 20 -5 V 19 -4 V 20 -5 V 19 -4 V 20 -4 V 19 -4 V 19 -4 V 20 -4 V 19 -4 V 20 -3 V 19 -4 V 20 -3 V 19 -3 V stroke 0.500 UL LTb 1051 4944 M 0 -4313 V 5809 0 V 0 4313 V -5809 0 V 1.000 UP stroke grestore end showpage }}% \put(5957,4581){\rjust{\strut{}$\sigma=2$}}% \put(5957,4781){\rjust{\strut{}$\sigma=1$}}% \put(3955,5244){\cjust{\strut{}Gaussian Distribution}}% \put(3955,100){\cjust{\strut{}$x$}}% \put(200,2787){% \special{ps: gsave currentpoint currentpoint translate 270 rotate neg exch neg exch translate}% \cjust{\strut{}$p(x)$}% \special{ps: currentpoint grestore moveto}% }% \put(6860,400){\cjust{\strut{}5}}% \put(6279,400){\cjust{\strut{}4}}% \put(5698,400){\cjust{\strut{}3}}% \put(5117,400){\cjust{\strut{}2}}% \put(4536,400){\cjust{\strut{}1}}% \put(3955,400){\cjust{\strut{}0}}% \put(3375,400){\cjust{\strut{}-1}}% \put(2794,400){\cjust{\strut{}-2}}% \put(2213,400){\cjust{\strut{}-3}}% \put(1632,400){\cjust{\strut{}-4}}% \put(1051,400){\cjust{\strut{}-5}}% \put(900,4944){\rjust{\strut{} 0.5}}% \put(900,4081){\rjust{\strut{} 0.4}}% \put(900,3219){\rjust{\strut{} 0.3}}% \put(900,2356){\rjust{\strut{} 0.2}}% \put(900,1494){\rjust{\strut{} 0.1}}% \put(900,631){\rjust{\strut{} 0}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/random-walk.tex0000664000175000017500000004507312616157443014507 0ustar eddedd% 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.0500bp \GNUPLOTpicture(5760,5760) {\GNUPLOTspecial{" %!PS-Adobe-2.0 EPSF-2.0 %%Title: random-walk.tex %%Creator: gnuplot 4.2 patchlevel 2 %%CreationDate: Thu Jun 4 20:50:11 2009 %%DocumentFonts: %%BoundingBox: 0 0 288 288 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following 6 true/false flags may be edited by hand if required % The unit line width may also be changed % /Color false def /Blacktext true def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def % /vshift -66 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def Level1 {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (random-walk.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.2 patchlevel 2 ) /Author (Brian Gough) % /Producer (gnuplot) % /Keywords () /CreationDate (Thu Jun 4 20:50:11 2009) /DOCINFO pdfmark end } ifelse % % Gnuplot Prolog Version 4.2 (August 2006) % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} 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 Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} 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 % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 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 /Density { /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} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % 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 % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /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.050 0.050 scale 0 setgray newpath 0.500 UL LTb 682 463 M -63 0 V 63 470 R -63 0 V 63 470 R -63 0 V 63 469 R -63 0 V 63 470 R -63 0 V 63 470 R -63 0 V 63 470 R -63 0 V 63 470 R -63 0 V 63 469 R -63 0 V 63 470 R -63 0 V 63 470 R -63 0 V 682 463 M 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 234 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 234 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V 235 63 R 235 0 R 0 -63 V stroke 1.000 UL LTa 682 2812 M 4698 0 V 3031 463 M 0 4698 V stroke 0.500 UL LTb 682 5161 M 682 463 L 4698 0 V 0 4698 V -4698 0 V 1.000 UP 1.000 UP stroke 1.000 UL LT0 3031 2812 M -276 380 V 133 451 V 413 223 V 363 298 V -44 -468 V 3200 3486 L -458 104 V -321 342 V 453 122 V 437 174 V 3031 2812 M -433 183 V -458 103 V 420 210 V -315 349 V -287 371 V 177 -435 V 1749 3325 L 465 69 V 240 -404 V -351 312 V 928 -490 R 2574 2702 L -213 419 V -251 397 V -447 144 V 446 -147 V 70 465 V 1789 3718 L -39 468 V 1483 3800 L 185 432 V 3031 2812 M 2580 2679 L 278 379 V 286 373 V -108 458 V 2822 3470 L 2535 3098 L 419 -212 V 350 -313 V 428 193 V 382 274 V 3031 2812 Pls 2755 3192 Pls 2888 3643 Pls 3301 3866 Pls 3664 4164 Pls 3620 3696 Pls 3200 3486 Pls 2742 3590 Pls 2421 3932 Pls 2874 4054 Pls 3311 4228 Pls 3031 2812 Pls 2598 2995 Pls 2140 3098 Pls 2560 3308 Pls 2245 3657 Pls 1958 4028 Pls 2135 3593 Pls 1749 3325 Pls 2214 3394 Pls 2454 2990 Pls 2103 3302 Pls 3031 2812 Pls 2574 2702 Pls 2361 3121 Pls 2110 3518 Pls 1663 3662 Pls 2109 3515 Pls 2179 3980 Pls 1789 3718 Pls 1750 4186 Pls 1483 3800 Pls 1668 4232 Pls 3031 2812 Pls 2580 2679 Pls 2858 3058 Pls 3144 3431 Pls 3036 3889 Pls 2822 3470 Pls 2535 3098 Pls 2954 2886 Pls 3304 2573 Pls 3732 2766 Pls 4114 3040 Pls 0.500 UL LTb 682 5161 M 682 463 L 4698 0 V 0 4698 V -4698 0 V 1.000 UP stroke grestore end showpage }}% \put(3031,5461){\cjust{\strut{}Random walks}}% \put(5380,200){\cjust{\strut{}5}}% \put(4910,200){\cjust{\strut{}4}}% \put(4440,200){\cjust{\strut{}3}}% \put(3971,200){\cjust{\strut{}2}}% \put(3501,200){\cjust{\strut{}1}}% \put(3031,200){\cjust{\strut{}0}}% \put(2561,200){\cjust{\strut{}-1}}% \put(2091,200){\cjust{\strut{}-2}}% \put(1622,200){\cjust{\strut{}-3}}% \put(1152,200){\cjust{\strut{}-4}}% \put(682,200){\cjust{\strut{}-5}}% \put(499,5161){\rjust{\strut{} 5}}% \put(499,4691){\rjust{\strut{} 4}}% \put(499,4221){\rjust{\strut{} 3}}% \put(499,3752){\rjust{\strut{} 2}}% \put(499,3282){\rjust{\strut{} 1}}% \put(499,2812){\rjust{\strut{} 0}}% \put(499,2342){\rjust{\strut{}-1}}% \put(499,1872){\rjust{\strut{}-2}}% \put(499,1403){\rjust{\strut{}-3}}% \put(499,933){\rjust{\strut{}-4}}% \put(499,463){\rjust{\strut{}-5}}% \endGNUPLOTpicture \endgroup \endinput gsl-doc-2.3/doc/multifit-nlinear.texi0000644000175000017500000021374413014633537015723 0ustar eddedd@cindex nonlinear least squares @cindex least squares, nonlinear This chapter describes functions for multidimensional nonlinear least-squares fitting. There are generally two classes of algorithms for solving nonlinear least squares problems, which fall under line search methods and trust region methods. GSL currently implements only trust region methods and provides the user with full access to intermediate steps of the iteration. The user also has the ability to tune a number of parameters which affect low-level aspects of the algorithm which can help to accelerate convergence for the specific problem at hand. GSL provides two separate interfaces for nonlinear least squares fitting. The first is designed for small to moderate sized problems, and the second is designed for very large problems, which may or may not have significant sparse structure. The header file @file{gsl_multifit_nlinear.h} contains prototypes for the multidimensional nonlinear fitting functions and related declarations relating to the small to moderate sized systems. The header file @file{gsl_multilarge_nlinear.h} contains prototypes for the multidimensional nonlinear fitting functions and related declarations relating to large systems. @menu * Nonlinear Least-Squares Overview:: * Nonlinear Least-Squares TRS Overview:: * Nonlinear Least-Squares Weighted Overview:: * Nonlinear Least-Squares Tunable Parameters:: * Nonlinear Least-Squares Initialization:: * Nonlinear Least-Squares Function Definition:: * Nonlinear Least-Squares Iteration:: * Nonlinear Least-Squares Testing for Convergence:: * Nonlinear Least-Squares High Level Driver:: * Nonlinear Least-Squares Covariance Matrix:: * Nonlinear Least-Squares Troubleshooting:: * Nonlinear Least-Squares Examples:: * Nonlinear Least-Squares References and Further Reading:: @end menu @node Nonlinear Least-Squares Overview @section Overview @cindex nonlinear least squares, 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 In trust region methods, the objective (or cost) function @math{\Phi(x)} is approximated by a model function @math{m_k(\delta)} in the vicinity of some point @math{x_k}. The model function is often simply a second order Taylor series expansion around the point @math{x_k}, ie: @tex \beforedisplay $$ \Phi(x_k + \delta) \approx m_k(\delta) = \Phi(x_k) + g_k^T \delta + {1 \over 2} \delta^T B_k \delta $$ \afterdisplay @end tex @ifinfo @example \Phi(x_k + \delta) ~=~ m_k(\delta) = \Phi(x_k) + g_k^T \delta + 1/2 \delta^T B_k \delta @end example @end ifinfo where @math{g_k = \nabla \Phi(x_k) = J^T f} is the gradient vector at the point @math{x_k}, @math{B_k = \nabla^2 \Phi(x_k)} is the Hessian matrix at @math{x_k}, or some approximation to it, and @math{J} is the @math{n}-by-@math{p} Jacobian matrix @c{$J_{ij} = \partial f_i / \partial x_j$} @math{J_@{ij@} = d f_i / d x_j}. In order to find the next step @math{\delta}, we minimize the model function @math{m_k(\delta)}, but search for solutions only within a region where we trust that @math{m_k(\delta)} is a good approximation to the objective function @math{\Phi(x_k + \delta)}. In other words, we seek a solution of the trust region subproblem (TRS) @tex \beforedisplay $$ \min_{\delta \in R^p} m_k(\delta) = \Phi(x_k) + g_k^T \delta + {1 \over 2} \delta^T B_k \delta, \qquad\hbox{s.t.}\quad || D_k \delta || \le \Delta_k $$ \afterdisplay @end tex @ifinfo @example \min_(\delta \in R^p) m_k(\delta), s.t. || D_k \delta || <= \Delta_k @end example @end ifinfo where @math{\Delta_k > 0} is the trust region radius and @math{D_k} is a scaling matrix. If @math{D_k = I}, then the trust region is a ball of radius @math{\Delta_k} centered at @math{x_k}. In some applications, the parameter vector @math{x} may have widely different scales. For example, one parameter might be a temperature on the order of @math{10^3} K, while another might be a length on the order of @math{10^{-6}} m. In such cases, a spherical trust region may not be the best choice, since if @math{\Phi} changes rapidly along directions with one scale, and more slowly along directions with a different scale, the model function @math{m_k} may be a poor approximation to @math{\Phi} along the rapidly changing directions. In such problems, it may be best to use an elliptical trust region, by setting @math{D_k} to a diagonal matrix whose entries are designed so that the scaled step @math{D_k \delta} has entries of approximately the same order of magnitude. The trust region subproblem above normally amounts to solving a linear least squares system (or multiple systems) for the step @math{\delta}. Once @math{\delta} is computed, it is checked whether or not it reduces the objective function @math{\Phi(x)}. A useful statistic for this is to look at the ratio @tex \beforedisplay $$ \rho_k = { \Phi(x_k) - \Phi(x_k + \delta_k) \over m_k(0) - m_k(\delta_k) } $$ \afterdisplay @end tex @ifinfo @example \rho_k = ( \Phi(x_k) - \Phi(x_k + \delta_k) / ( m_k(0) - m_k(\delta_k) ) @end example @end ifinfo where the numerator is the actual reduction of the objective function due to the step @math{\delta_k}, and the denominator is the predicted reduction due to the model @math{m_k}. If @math{\rho_k} is negative, it means that the step @math{\delta_k} increased the objective function and so it is rejected. If @math{\rho_k} is positive, then we have found a step which reduced the objective function and it is accepted. Furthermore, if @math{\rho_k} is close to 1, then this indicates that the model function is a good approximation to the objective function in the trust region, and so on the next iteration the trust region is enlarged in order to take more ambitious steps. When a step is rejected, the trust region is made smaller and the TRS is solved again. An outline for the general trust region method used by GSL can now be given. @noindent @b{Trust Region Algorithm} @enumerate @item Initialize: given @math{x_0}, construct @math{m_0(\delta)}, @math{D_0} and @math{\Delta_0 > 0} @item For k = 0, 1, 2, ... @enumerate a @item If converged, then stop @item Solve TRS for trial step @math{\delta_k} @item Evaluate trial step by computing @math{\rho_k} @enumerate @item if step is accepted, set @math{x_{k+1} = x_k + \delta_k} and increase radius, @math{\Delta_{k+1} = \alpha \Delta_k} @item if step is rejected, set @math{x_{k+1} = x_k} and decrease radius, @math{\Delta_{k+1} = {\Delta_k \over \beta}}; goto 2(b) @end enumerate @item Construct @math{m_{k+1}(\delta)} and @math{D_{k+1}} @end enumerate @end enumerate @noindent GSL offers the user a number of different algorithms for solving the trust region subproblem in 2(b), as well as different choices of scaling matrices @math{D_k} and different methods of updating the trust region radius @math{\Delta_k}. Therefore, while reasonable default methods are provided, the user has a lot of control to fine-tune the various steps of the algorithm for their specific problem. @node Nonlinear Least-Squares TRS Overview @section Solving the Trust Region Subproblem (TRS) @menu * Nonlinear Least-Squares TRS Levenberg-Marquardt:: * Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration:: * Nonlinear Least-Squares TRS Dogleg:: * Nonlinear Least-Squares TRS Double Dogleg:: * Nonlinear Least-Squares TRS 2D Subspace:: * Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient:: @end menu Below we describe the methods available for solving the trust region subproblem. The methods available provide either exact or approximate solutions to the trust region subproblem. In all algorithms below, the Hessian matrix @math{B_k} is approximated as @math{B_k \approx J_k^T J_k}, where @math{J_k = J(x_k)}. In all methods, the solution of the TRS involves solving a linear least squares system involving the Jacobian matrix. For small to moderate sized problems (@code{gsl_multifit_nlinear} interface), this is accomplished by factoring the full Jacobian matrix, which is provided by the user, with the Cholesky, QR, or SVD decompositions. For large systems (@code{gsl_multilarge_nlinear} interface), the user has two choices. One is to solve the system iteratively, without needing to store the full Jacobian matrix in memory. With this method, the user must provide a routine to calculate the matrix-vector products @math{J u} or @math{J^T u} for a given vector @math{u}. This iterative method is particularly useful for systems where the Jacobian has sparse structure, since forming matrix-vector products can be done cheaply. The second option for large systems involves forming the normal equations matrix @math{J^T J} and then factoring it using a Cholesky decomposition. The normal equations matrix is @math{p}-by-@math{p}, typically much smaller than the full @math{n}-by-@math{p} Jacobian, and can usually be stored in memory even if the full Jacobian matrix cannot. This option is useful for large, dense systems, or if the iterative method has difficulty converging. @node Nonlinear Least-Squares TRS Levenberg-Marquardt @subsection Levenberg-Marquardt @cindex Levenberg-Marquardt algorithm @cindex nonlinear least squares, levenberg-marquardt There is a theorem which states that if @math{\delta_k} is a solution to the trust region subproblem given above, then there exists @math{\mu_k \ge 0} such that @tex \beforedisplay $$ \left( B_k + \mu_k D_k^T D_k \right) \delta_k = -g_k $$ \afterdisplay @end tex @ifinfo @example ( B_k + \mu_k D_k^T D_k ) \delta_k = -g_k @end example @end ifinfo with @math{\mu_k (\Delta_k - ||D_k \delta_k||) = 0}. This forms the basis of the Levenberg-Marquardt algorithm, which controls the trust region size by adjusting the parameter @math{\mu_k} rather than the radius @math{\Delta_k} directly. For each radius @math{\Delta_k}, there is a unique parameter @math{\mu_k} which solves the TRS, and they have an inverse relationship, so that large values of @math{\mu_k} correspond to smaller trust regions, while small values of @math{\mu_k} correspond to larger trust regions. @noindent With the approximation @math{B_k \approx J_k^T J_k}, on each iteration, in order to calculate the step @math{\delta_k}, the following linear least squares problem is solved: @tex \beforedisplay $$ \left[ \matrix{ J_k \cr \sqrt{\mu_k} D_k } \right] \delta_k = - \left[ \matrix{ f_k \cr 0 } \right] $$ \afterdisplay @end tex @ifinfo @example [J_k; sqrt(mu_k) D_k] \delta_k = - [f_k; 0] @end example @end ifinfo @noindent If the step @math{\delta_k} is accepted, then @math{\mu_k} is decreased on the next iteration in order to take a larger step, otherwise it is increased to take a smaller step. The Levenberg-Marquardt algorithm provides an exact solution of the trust region subproblem, but typically has a higher computational cost per iteration than the approximate methods discussed below, since it may need to solve the least squares system above several times for different values of @math{\mu_k}. @node Nonlinear Least-Squares TRS Levenberg-Marquardt with Geodesic Acceleration @subsection Levenberg-Marquardt with Geodesic Acceleration @cindex Levenberg-Marquardt algorithm, geodesic acceleration @cindex nonlinear least squares, levenberg-marquardt, geodesic acceleration This method applies a so-called geodesic acceleration correction to the standard Levenberg-Marquardt step @math{\delta_k} (Transtrum et al, 2011). By interpreting @math{\delta_k} as a first order step along a geodesic in the model parameter space (ie: a velocity @math{\delta_k = v_k}), the geodesic acceleration @math{a_k} is a second order correction along the geodesic which is determined by solving the linear least squares system @tex \beforedisplay $$ \left[ \matrix{ J_k \cr \sqrt{\mu_k} D_k } \right] a_k = - \left[ \matrix{ f_{vv}(x_k) \cr 0 } \right] $$ \afterdisplay @end tex @ifinfo @example [J_k; sqrt(mu_k) D_k] a_k = - [f_vv(x_k); 0] @end example @end ifinfo @noindent where @math{f_{vv}} is the second directional derivative of the residual vector in the velocity direction @math{v}, @math{f_{vv}(x) = D_v^2 f = \sum_{\alpha\beta} v_{\alpha} v_{\beta} \partial_{\alpha} \partial_{\beta} f(x)}, where @math{\alpha} and @math{\beta} are summed over the @math{p} parameters. The new total step is then @math{\delta_k' = v_k + {1 \over 2}a_k}. The second order correction @math{a_k} can be calculated with a modest additional cost, and has been shown to dramatically reduce the number of iterations (and expensive Jacobian evaluations) required to reach convergence on a variety of different problems. In order to utilize the geodesic acceleration, the user must supply a function which provides the second directional derivative vector @math{f_{vv}(x)}, or alternatively the library can use a finite difference method to estimate this vector with one additional function evaluation of @math{f(x + h v)} where @math{h} is a tunable step size (see the @code{h_fvv} parameter description). @node Nonlinear Least-Squares TRS Dogleg @subsection Dogleg @cindex Dogleg algorithm @cindex nonlinear least squares, dogleg This is Powell's dogleg method, which finds an approximate solution to the trust region subproblem, by restricting its search to a piecewise linear ``dogleg'' path, composed of the origin, the Cauchy point which represents the model minimizer along the steepest descent direction, and the Gauss-Newton point, which is the overall minimizer of the unconstrained model. The Gauss-Newton step is calculated by solving @tex \beforedisplay $$ J_k \delta_{gn} = -f_k $$ \afterdisplay @end tex @ifinfo @example J_k \delta_gn = -f_k @end example @end ifinfo which is the main computational task for each iteration, but only needs to be performed once per iteration. If the Gauss-Newton point is inside the trust region, it is selected as the step. If it is outside, the method then calculates the Cauchy point, which is located along the gradient direction. If the Cauchy point is also outside the trust region, the method assumes that it is still far from the minimum and so proceeds along the gradient direction, truncating the step at the trust region boundary. If the Cauchy point is inside the trust region, with the Gauss-Newton point outside, the method uses a dogleg step, which is a linear combination of the gradient direction and the Gauss-Newton direction, stopping at the trust region boundary. @node Nonlinear Least-Squares TRS Double Dogleg @subsection Double Dogleg @cindex double Dogleg algorithm @cindex Dogleg algorithm, double @cindex nonlinear least squares, double dogleg This method is an improvement over the classical dogleg algorithm, which attempts to include information about the Gauss-Newton step while the iteration is still far from the minimum. When the Cauchy point is inside the trust region and the Gauss-Newton point is outside, the method computes a scaled Gauss-Newton point and then takes a dogleg step between the Cauchy point and the scaled Gauss-Newton point. The scaling is calculated to ensure that the reduction in the model @math{m_k} is about the same as the reduction provided by the Cauchy point. @node Nonlinear Least-Squares TRS 2D Subspace @subsection Two Dimensional Subspace The dogleg methods restrict the search for the TRS solution to a 1D curve defined by the Cauchy and Gauss-Newton points. An improvement to this is to search for a solution using the full two dimensional subspace spanned by the Cauchy and Gauss-Newton directions. The dogleg path is of course inside this subspace, and so this method solves the TRS at least as accurately as the dogleg methods. Since this method searches a larger subspace for a solution, it can converge more quickly than dogleg on some problems. Because the subspace is only two dimensional, this method is very efficient and the main computation per iteration is to determine the Gauss-Newton point. @node Nonlinear Least-Squares TRS Steihaug-Toint Conjugate Gradient @subsection Steihaug-Toint Conjugate Gradient One difficulty of the dogleg methods is calculating the Gauss-Newton step when the Jacobian matrix is singular. The Steihaug-Toint method also computes a generalized dogleg step, but avoids solving for the Gauss-Newton step directly, instead using an iterative conjugate gradient algorithm. This method performs well at points where the Jacobian is singular, and is also suitable for large-scale problems where factoring the Jacobian matrix could be prohibitively expensive. @node Nonlinear Least-Squares Weighted Overview @section Weighted Nonlinear Least-Squares Weighted nonlinear least-squares fitting minimizes the function @tex \beforedisplay $$ \Phi(x) = {1 \over 2} || f ||_W^2 = {1 \over 2} \sum_{i=1}^{n} w_i f_i (x_1, \dots, x_p)^2 $$ \afterdisplay @end tex @ifinfo @example \Phi(x) = (1/2) || f(x) ||_W^2 = (1/2) \sum_@{i=1@}^@{n@} f_i(x_1, ..., x_p)^2 @end example @end ifinfo where @math{W = diag(w_1,w_2,...,w_n)} is the weighting matrix, and @math{||f||_W^2 = f^T W f}. The weights @math{w_i} are commonly defined as @math{w_i = 1/\sigma_i^2}, where @math{\sigma_i} is the error in the @math{i}th measurement. A simple change of variables @math{\tilde{f} = W^{1 \over 2} f} yields @math{\Phi(x) = {1 \over 2} ||\tilde{f}||^2}, which is in the same form as the unweighted case. The user can either perform this transform directly on their function residuals and Jacobian, or use the @code{gsl_multifit_nlinear_winit} interface which automatically performs the correct scaling. To manually perform this transformation, the residuals and Jacobian should be modified according to @tex \beforedisplay $$ \eqalign{ \tilde{f}_i & = \sqrt{w_i} f_i = {f_i \over \sigma_i} \cr \tilde{J}_{ij} & = \sqrt{w_i} { \partial f_i \over \partial x_j } = { 1 \over \sigma_i} { \partial f_i \over \partial x_j } } $$ \afterdisplay @end tex @ifinfo @example f~_i = f_i / \sigma_i J~_ij = 1 / \sigma_i df_i/dx_j @end example @end ifinfo @noindent For large systems, the user must perform their own weighting. @node Nonlinear Least-Squares Tunable Parameters @section Tunable Parameters @noindent The user can tune nearly all aspects of the iteration at allocation time. For the @code{gsl_multifit_nlinear} interface, the user may modify the @code{gsl_multifit_nlinear_parameters} structure, which is defined as follows: @example typedef struct @{ const gsl_multifit_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multifit_nlinear_scale *scale; /* scaling method */ const gsl_multifit_nlinear_solver *solver; /* solver method */ gsl_multifit_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ @} gsl_multifit_nlinear_parameters; @end example @noindent For the @code{gsl_multilarge_nlinear} interface, the user may modify the @code{gsl_multilarge_nlinear_parameters} structure, which is defined as follows: @example typedef struct @{ const gsl_multilarge_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multilarge_nlinear_scale *scale; /* scaling method */ const gsl_multilarge_nlinear_solver *solver; /* solver method */ gsl_multilarge_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ size_t max_iter; /* maximum iterations for trs method */ double tol; /* tolerance for solving trs */ @} gsl_multilarge_nlinear_parameters; @end example @noindent Each of these parameters is discussed in further detail below. @deftypevr {Parameter} {const gsl_multifit_nlinear_trs *} trs @deftypevrx {Parameter} {const gsl_multilarge_nlinear_trs *} trs This parameter determines the method used to solve the trust region subproblem, and may be selected from the following choices, @defvr {Default} gsl_multifit_nlinear_trs_lm @defvrx {Default} gsl_multilarge_nlinear_trs_lm This selects the Levenberg-Marquardt algorithm. @end defvr @defvr {Option} gsl_multifit_nlinear_trs_lmaccel @defvrx {Option} gsl_multilarge_nlinear_trs_lmaccel This selects the Levenberg-Marquardt algorithm with geodesic acceleration. @end defvr @defvr {Option} gsl_multifit_nlinear_trs_dogleg @defvrx {Option} gsl_multilarge_nlinear_trs_dogleg This selects the dogleg algorithm. @end defvr @defvr {Option} gsl_multifit_nlinear_trs_ddogleg @defvrx {Option} gsl_multilarge_nlinear_trs_ddogleg This selects the double dogleg algorithm. @end defvr @defvr {Option} gsl_multifit_nlinear_trs_subspace2D @defvrx {Option} gsl_multilarge_nlinear_trs_subspace2D This selects the 2D subspace algorithm. @end defvr @defvr {Option} gsl_multilarge_nlinear_trs_cgst This selects the Steihaug-Toint conjugate gradient algorithm. This method is available only for large systems. @end defvr @end deftypevr @deftypevr {Parameter} {const gsl_multifit_nlinear_scale *} scale @deftypevrx {Parameter} {const gsl_multilarge_nlinear_scale *} scale This parameter determines the diagonal scaling matrix @math{D} and may be selected from the following choices, @defvr {Default} gsl_multifit_nlinear_scale_more @defvrx {Default} gsl_multilarge_nlinear_scale_more This damping strategy was suggested by Mor@'e, and corresponds to @math{D^T D = } max(diag(@math{J^T J})), in other words the maximum elements of diag(@math{J^T J}) encountered thus far in the iteration. This choice of @math{D} makes the problem scale-invariant, so that if the model parameters @math{x_i} are each scaled by an arbitrary constant, @math{\tilde{x}_i = a_i x_i}, then the sequence of iterates produced by the algorithm would be unchanged. This method can work very well in cases where the model parameters have widely different scales (ie: if some parameters are measured in nanometers, while others are measured in degrees Kelvin). This strategy has been proven effective on a large class of problems and so it is the library default, but it may not be the best choice for all problems. @end defvr @defvr {Option} gsl_multifit_nlinear_scale_levenberg @defvrx {Option} gsl_multilarge_nlinear_scale_levenberg This damping strategy was originally suggested by Levenberg, and corresponds to @math{D^T D = I}. This method has also proven effective on a large class of problems, but is not scale-invariant. However, some authors (e.g. Transtrum and Sethna 2012) argue that this choice is better for problems which are susceptible to parameter evaporation (ie: parameters go to infinity) @end defvr @defvr {Option} gsl_multifit_nlinear_scale_marquardt @defvrx {Option} gsl_multilarge_nlinear_scale_marquardt This damping strategy was suggested by Marquardt, and corresponds to @math{D^T D = } diag(@math{J^T J}). This method is scale-invariant, but it is generally considered inferior to both the Levenberg and Mor@'e strategies, though may work well on certain classes of problems. @end defvr @end deftypevr @deftypevr {Parameter} {const gsl_multifit_nlinear_solver *} solver @deftypevrx {Parameter} {const gsl_multilarge_nlinear_solver *} solver @noindent Solving the trust region subproblem on each iteration almost always requires the solution of the following linear least squares system @tex \beforedisplay $$ \left[ \matrix{ J \cr \sqrt{\mu} D } \right] \delta = - \left[ \matrix{ f \cr 0 } \right] $$ \afterdisplay @end tex @ifinfo @example [J; sqrt(mu) D] \delta = - [f; 0] @end example @end ifinfo The @var{solver} parameter determines how the system is solved and can be selected from the following choices: @defvr {Default} gsl_multifit_nlinear_solver_qr This method solves the system using a rank revealing QR decomposition of the Jacobian @math{J}. This method will produce reliable solutions in cases where the Jacobian is rank deficient or near-singular but does require about twice as many operations as the Cholesky method discussed below. @end defvr @defvr {Option} gsl_multifit_nlinear_solver_cholesky @defvrx {Default} gsl_multilarge_nlinear_solver_cholesky This method solves the alternate normal equations problem @tex \beforedisplay $$ \left( J^T J + \mu D^T D \right) \delta = -J^T f $$ \afterdisplay @end tex @ifinfo @example ( J^T J + \mu D^T D ) \delta = -J^T f @end example @end ifinfo by using a Cholesky decomposition of the matrix @math{J^T J + \mu D^T D}. This method is faster than the QR approach, however it is susceptible to numerical instabilities if the Jacobian matrix is rank deficient or near-singular. In these cases, an attempt is made to reduce the condition number of the matrix using Jacobi preconditioning, but for highly ill-conditioned problems the QR approach is better. If it is known that the Jacobian matrix is well conditioned, this method is accurate and will perform faster than the QR approach. @end defvr @defvr {Option} gsl_multifit_nlinear_solver_svd This method solves the system using a singular value decomposition of the Jacobian @math{J}. This method will produce the most reliable solutions for ill-conditioned Jacobians but is also the slowest solver method. @end defvr @end deftypevr @deftypevr {Parameter} {gsl_multifit_nlinear_fdtype} fdtype This parameter specifies whether to use forward or centered differences when approximating the Jacobian. This is only used when an analytic Jacobian is not provided to the solver. This parameter may be set to one of the following choices. @defvr {Default} GSL_MULTIFIT_NLINEAR_FWDIFF This specifies a forward finite difference to approximate the Jacobian matrix. The Jacobian matrix will be calculated as @tex \beforedisplay $$ J_{ij} = {1 \over \Delta_j} \left( f_i(x + \Delta_j e_j) - f_i(x) \right) $$ \afterdisplay @end tex @ifinfo @example J_ij = 1 / \Delta_j ( f_i(x + \Delta_j e_j) - f_i(x) ) @end example @end ifinfo where @math{\Delta_j = h |x_j|} and @math{e_j} is the standard @math{j}th Cartesian unit basis vector so that @math{x + \Delta_j e_j} represents a small (forward) perturbation of the @math{j}th parameter by an amount @math{\Delta_j}. The perturbation @math{\Delta_j} is proportional to the current value @math{|x_j|} which helps to calculate an accurate Jacobian when the various parameters have different scale sizes. The value of @math{h} is specified by the @code{h_df} parameter. The accuracy of this method is @math{O(h)}, and evaluating this matrix requires an additional @math{p} function evaluations. @end defvr @defvr {Option} GSL_MULTIFIT_NLINEAR_CTRDIFF This specifies a centered finite difference to approximate the Jacobian matrix. The Jacobian matrix will be calculated as @tex \beforedisplay $$ J_{ij} = {1 \over \Delta_j} \left( f_i(x + {1 \over 2} \Delta_j e_j) - f_i(x - {1 \over 2} \Delta_j e_j) \right) $$ \afterdisplay @end tex @ifinfo @example J_ij = 1 / \Delta_j ( f_i(x + 1/2 \Delta_j e_j) - f_i(x - 1/2 \Delta_j e_j) ) @end example @end ifinfo See above for a description of @math{\Delta_j}. The accuracy of this method is @math{O(h^2)}, but evaluating this matrix requires an additional @math{2p} function evaluations. @end defvr @end deftypevr @deftypevr {Parameter} {double} factor_up When a step is accepted, the trust region radius will be increased by this factor. The default value is @math{3}. @end deftypevr @deftypevr {Parameter} {double} factor_down When a step is rejected, the trust region radius will be decreased by this factor. The default value is @math{2}. @end deftypevr @deftypevr {Parameter} {double} avmax When using geodesic acceleration to solve a nonlinear least squares problem, an important parameter to monitor is the ratio of the acceleration term to the velocity term, @tex \beforedisplay $$ { ||a|| \over ||v|| } $$ \afterdisplay @end tex @ifinfo @example |a| / |v| @end example @end ifinfo If this ratio is small, it means the acceleration correction is contributing very little to the step. This could be because the problem is not ``nonlinear'' enough to benefit from the acceleration. If the ratio is large (@math{> 1}) it means that the acceleration is larger than the velocity, which shouldn't happen since the step represents a truncated series and so the second order term @math{a} should be smaller than the first order term @math{v} to guarantee convergence. Therefore any steps with a ratio larger than the parameter @var{avmax} are rejected. @var{avmax} is set to 0.75 by default. For problems which experience difficulty converging, this threshold could be lowered. @end deftypevr @deftypevr {Parameter} {double} h_df This parameter specifies the step size for approximating the Jacobian matrix with finite differences. It is set to @math{\sqrt{\epsilon}} by default, where @math{\epsilon} is @code{GSL_DBL_EPSILON}. @end deftypevr @deftypevr {Parameter} {double} h_fvv When using geodesic acceleration, the user must either supply a function to calculate @math{f_{vv}(x)} or the library can estimate this second directional derivative using a finite difference method. When using finite differences, the library must calculate @math{f(x + h v)} where @math{h} represents a small step in the velocity direction. The parameter @var{h_fvv} defines this step size and is set to 0.02 by default. @end deftypevr @node Nonlinear Least-Squares Initialization @section Initializing the Solver @deftypefun {gsl_multifit_nlinear_workspace *} gsl_multifit_nlinear_alloc (const gsl_multifit_nlinear_type * @var{T}, const gsl_multifit_nlinear_parameters * @var{params}, const size_t @var{n}, const size_t @var{p}) @deftypefunx {gsl_multilarge_nlinear_workspace *} gsl_multilarge_nlinear_alloc (const gsl_multilarge_nlinear_type * @var{T}, const gsl_multilarge_nlinear_parameters * @var{params}, const size_t @var{n}, const size_t @var{p}) @tindex gsl_multifit_nlinear_alloc @tindex gsl_multifit_nlinear_type These functions return a pointer to a newly allocated instance of a derivative solver of type @var{T} for @var{n} observations and @var{p} parameters. The @var{params} input specifies a tunable set of parameters which will affect important details in each iteration of the trust region subproblem algorithm. It is recommended to start with the suggested default parameters (see @code{gsl_multifit_nlinear_default_parameters} and @code{gsl_multilarge_nlinear_default_parameters}) and then tune the parameters once the code is working correctly. See @ref{Nonlinear Least-Squares Tunable Parameters} for descriptions of the various parameters. For example, the following code creates an instance of a Levenberg-Marquardt solver for 100 data points and 3 parameters, using suggested defaults: @example const gsl_multifit_nlinear_type * T = gsl_multifit_nlinear_lm; gsl_multifit_nlinear_parameters params = gsl_multifit_nlinear_default_parameters(); gsl_multifit_nlinear_workspace * w = gsl_multifit_nlinear_alloc (T, ¶ms, 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 gsl_multifit_nlinear_parameters gsl_multifit_nlinear_default_parameters (void) @deftypefunx gsl_multilarge_nlinear_parameters gsl_multilarge_nlinear_default_parameters (void) These functions return a set of recommended default parameters for use in solving nonlinear least squares problems. The user can tune each parameter to improve the performance on their particular problem, see @ref{Nonlinear Least-Squares Tunable Parameters}. @end deftypefun @deftypefun int gsl_multifit_nlinear_init (const gsl_vector * @var{x}, gsl_multifit_nlinear_fdf * @var{fdf}, gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multifit_nlinear_winit (const gsl_vector * @var{x}, const gsl_vector * @var{wts}, gsl_multifit_nlinear_fdf * @var{fdf}, gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_init (const gsl_vector * @var{x}, gsl_multilarge_nlinear_fdf * @var{fdf}, gsl_multilarge_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_winit (const gsl_vector * @var{x}, const gsl_vector * @var{wts}, gsl_multilarge_nlinear_fdf * @var{fdf}, gsl_multilarge_nlinear_workspace * @var{w}) These functions initialize, or reinitialize, an existing workspace @var{w} to use the system @var{fdf} and the initial guess @var{x}. See @ref{Nonlinear Least-Squares Function Definition} for a description of the @var{fdf} structure. Optionally, a weight vector @var{wts} can be given to perform a weighted nonlinear regression. Here, the weighting matrix is @math{W = diag(w_1,w_2,...,w_n)}. @end deftypefun @deftypefun void gsl_multifit_nlinear_free (gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx void gsl_multilarge_nlinear_free (gsl_multilarge_nlinear_workspace * @var{w}) These functions free all the memory associated with the workspace @var{w}. @end deftypefun @deftypefun {const char *} gsl_multifit_nlinear_name (const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx {const char *} gsl_multilarge_nlinear_name (const gsl_multilarge_nlinear_workspace * @var{w}) These functions return a pointer to the name of the solver. For example, @example printf ("w is a '%s' solver\n", gsl_multifit_nlinear_name (w)); @end example @noindent would print something like @code{w is a 'trust-region' solver}. @end deftypefun @deftypefun {const char *} gsl_multifit_nlinear_trs_name (const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx {const char *} gsl_multilarge_nlinear_trs_name (const gsl_multilarge_nlinear_workspace * @var{w}) These functions return a pointer to the name of the trust region subproblem method. For example, @example printf ("w is a '%s' solver\n", gsl_multifit_nlinear_trs_name (w)); @end example @noindent would print something like @code{w is a 'levenberg-marquardt' solver}. @end deftypefun @node Nonlinear Least-Squares Function Definition @section Providing the Function to be Minimized The user must provide @math{n} functions of @math{p} variables for the minimization algorithm to operate on. In order to allow for arbitrary parameters the functions are defined by the following data types: @deftp {Data Type} gsl_multifit_nlinear_fdf This data type defines a general system of functions with arbitrary parameters, the corresponding Jacobian matrix of derivatives, and optionally the second directional derivative of the functions for geodesic acceleration. @table @code @item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f}) This function should store the @math{n} components of the vector @c{$f(x)$} @math{f(x)} 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) / \partial x_j$} @math{J_ij = d f_i(x) / d x_j} in @var{J} for argument @var{x} and arbitrary parameters @var{params}, returning an appropriate error code if the matrix cannot be computed. If an analytic Jacobian is unavailable, or too expensive to compute, this function pointer may be set to NULL, in which case the Jacobian will be internally computed using finite difference approximations of the function @var{f}. @item int (* fvv) (const gsl_vector * @var{x}, const gsl_vector * @var{v}, void * @var{params}, gsl_vector * @var{fvv}) When geodesic acceleration is enabled, this function should store the @math{n} components of the vector @math{f_{vv}(x) = \sum_{\alpha\beta} v_{\alpha} v_{\beta} {\partial \over \partial x_{\alpha}} {\partial \over \partial x_{\beta}} f(x)}, representing second directional derivatives of the function to be minimized, into the output @var{fvv}. The parameter vector is provided in @var{x} and the velocity vector is provided in @var{v}, both of which have @math{p} components. The arbitrary parameters are given in @var{params}. If analytic expressions for @math{f_{vv}(x)} are unavailable or too difficult to compute, this function pointer may be set to NULL, in which case @math{f_{vv}(x)} will be computed internally using a finite difference approximation. @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. @item size_t nevalf This does not need to be set by the user. It counts the number of function evaluations and is initialized by the @code{_init} function. @item size_t nevaldf This does not need to be set by the user. It counts the number of Jacobian evaluations and is initialized by the @code{_init} function. @item size_t nevalfvv This does not need to be set by the user. It counts the number of @math{f_{vv}(x)} evaluations and is initialized by the @code{_init} function. @end table @end deftp @deftp {Data Type} gsl_multilarge_nlinear_fdf This data type defines a general system of functions with arbitrary parameters, a function to compute @math{J u} or @math{J^T u} for a given vector @math{u}, the normal equations matrix @math{J^T J}, and optionally the second directional derivative of the functions for geodesic acceleration. @table @code @item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f}) This function should store the @math{n} components of the vector @c{$f(x)$} @math{f(x)} 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) (CBLAS_TRANSPOSE_t @var{TransJ}, const gsl_vector * @var{x}, const gsl_vector * @var{u}, void * @var{params}, gsl_vector * @var{v}, gsl_matrix * @var{JTJ}) If @var{TransJ} is equal to @code{CblasNoTrans}, then this function should compute the matrix-vector product @math{J u} and store the result in @var{v}. If @var{TransJ} is equal to @code{CblasTrans}, then this function should compute the matrix-vector product @math{J^T u} and store the result in @var{v}. Additionally, the normal equations matrix @math{J^T J} should be stored in the lower half of @var{JTJ}. The input matrix @var{JTJ} could be set to NULL, for example by iterative methods which do not require this matrix, so the user should check for this prior to constructing the matrix. The input @var{params} contains the arbitrary parameters. @item int (* fvv) (const gsl_vector * @var{x}, const gsl_vector * @var{v}, void * @var{params}, gsl_vector * @var{fvv}) When geodesic acceleration is enabled, this function should store the @math{n} components of the vector @math{f_{vv}(x) = \sum_{\alpha\beta} v_{\alpha} v_{\beta} {\partial \over \partial x_{\alpha}} {\partial \over \partial x_{\beta}} f(x)}, representing second directional derivatives of the function to be minimized, into the output @var{fvv}. The parameter vector is provided in @var{x} and the velocity vector is provided in @var{v}, both of which have @math{p} components. The arbitrary parameters are given in @var{params}. If analytic expressions for @math{f_{vv}(x)} are unavailable or too difficult to compute, this function pointer may be set to NULL, in which case @math{f_{vv}(x)} will be computed internally using a finite difference approximation. @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. @item size_t nevalf This does not need to be set by the user. It counts the number of function evaluations and is initialized by the @code{_init} function. @item size_t nevaldfu This does not need to be set by the user. It counts the number of Jacobian matrix-vector evaluations (@math{J u} or @math{J^T u}) and is initialized by the @code{_init} function. @item size_t nevaldf2 This does not need to be set by the user. It counts the number of @math{J^T J} evaluations and is initialized by the @code{_init} function. @item size_t nevalfvv This does not need to be set by the user. It counts the number of @math{f_{vv}(x)} evaluations and is initialized by the @code{_init} function. @end table @end deftp @noindent 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 Nonlinear Least-Squares Iteration @section Iteration The following functions drive the iteration of each algorithm. Each function performs one iteration of the trust region method and updates the state of the solver. @deftypefun int gsl_multifit_nlinear_iterate (gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_iterate (gsl_multilarge_nlinear_workspace * @var{w}) These functions perform a single iteration of the solver @var{w}. If the iteration encounters an unexpected problem then an error code will be returned. The solver workspace maintains a current estimate of the best-fit parameters at all times. @end deftypefun @noindent The solver workspace @var{w} contains the following entries, which can be used to track the progress of the solution: @table @code @item gsl_vector * x The current position, length @math{p}. @item gsl_vector * f The function residual vector at the current position @math{f(x)}, length @math{n}. @item gsl_matrix * J The Jacobian matrix at the current position @math{J(x)}, size @math{n}-by-@math{p} (only for @code{gsl_multifit_nlinear} interface). @item gsl_vector * dx The difference between the current position and the previous position, i.e. the last step @math{\delta}, taken as a vector, length @math{p}. @end table @noindent These quantities can be accessed with the following functions, @deftypefun {gsl_vector *} gsl_multifit_nlinear_position (const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx {gsl_vector *} gsl_multilarge_nlinear_position (const gsl_multilarge_nlinear_workspace * @var{w}) These functions return the current position @math{x} (i.e. best-fit parameters) of the solver @var{w}. @end deftypefun @deftypefun {gsl_vector *} gsl_multifit_nlinear_residual (const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx {gsl_vector *} gsl_multilarge_nlinear_residual (const gsl_multilarge_nlinear_workspace * @var{w}) These functions return the current residual vector @math{f(x)} of the solver @var{w}. For weighted systems, the residual vector includes the weighting factor @math{\sqrt{W}}. @end deftypefun @deftypefun {gsl_matrix *} gsl_multifit_nlinear_jac (const gsl_multifit_nlinear_workspace * @var{w}) This function returns a pointer to the @math{n}-by-@math{p} Jacobian matrix for the current iteration of the solver @var{w}. This function is available only for the @code{gsl_multifit_nlinear} interface. @end deftypefun @deftypefun size_t gsl_multifit_nlinear_niter (const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx size_t gsl_multilarge_nlinear_niter (const gsl_multilarge_nlinear_workspace * @var{w}) These functions return the number of iterations performed so far. The iteration counter is updated on each call to the @code{_iterate} functions above, and reset to 0 in the @code{_init} functions. @end deftypefun @deftypefun int gsl_multifit_nlinear_rcond (double * @var{rcond}, const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_rcond (double * @var{rcond}, const gsl_multilarge_nlinear_workspace * @var{w}) This function estimates the reciprocal condition number of the Jacobian matrix at the current position @math{x} and stores it in @var{rcond}. The computed value is only an estimate to give the user a guideline as to the conditioning of their particular problem. Its calculation is based on which factorization method is used (Cholesky, QR, or SVD). @itemize @bullet @item For the Cholesky solver, the matrix @math{J^T J} is factored at each iteration. Therefore this function will estimate the 1-norm condition number @math{rcond^2 = 1/(||J^T J||_1 \cdot ||(J^T J)^{-1}||_1)} @item For the QR solver, @math{J} is factored as @math{J = Q R} at each iteration. For simplicity, this function calculates the 1-norm conditioning of only the @math{R} factor, @math{rcond = 1 / (||R||_1 \cdot ||R^{-1}||_1)}. This can be computed efficiently since @math{R} is upper triangular. @item For the SVD solver, in order to efficiently solve the trust region subproblem, the matrix which is factored is @math{J D^{-1}}, instead of @math{J} itself. The resulting singular values are used to provide the 2-norm reciprocal condition number, as @math{rcond = \sigma_{min} / \sigma_{max}}. Note that when using Mor@'e scaling, @math{D \ne I} and the resulting @var{rcond} estimate may be significantly different from the true @var{rcond} of @math{J} itself. @end itemize @end deftypefun @node Nonlinear Least-Squares Testing for Convergence @section Testing for Convergence @cindex nonlinear fitting, stopping parameters, convergence 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_nlinear_test (const double @var{xtol}, const double @var{gtol}, const double @var{ftol}, int * @var{info}, const gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_test (const double @var{xtol}, const double @var{gtol}, const double @var{ftol}, int * @var{info}, const gsl_multilarge_nlinear_workspace * @var{w}) These functions test for convergence of the minimization method using the following criteria: @itemize @bullet @item Testing for a small step size relative to the current parameter vector @tex \beforedisplay $$ |\delta_i| \le xtol (|x_i| + xtol) $$ \afterdisplay @end tex @ifinfo @example |\delta_i| <= xtol (|x_i| + xtol) @end example @end ifinfo for each @math{0 <= i < p}. Each element of the step vector @math{\delta} is tested individually in case the different parameters have widely different scales. Adding @var{xtol} to @math{|x_i|} helps the test avoid breaking down in situations where the true solution value @math{x_i = 0}. If this test succeeds, @var{info} is set to 1 and the function returns @code{GSL_SUCCESS}. A general guideline for selecting the step tolerance is to choose @math{xtol = 10^{-d}} where @math{d} is the number of accurate decimal digits desired in the solution @math{x}. See Dennis and Schnabel for more information. @item Testing for a small gradient (@math{g = \nabla \Phi(x) = J^T f}) indicating a local function minimum: @tex \beforedisplay $$ max_i |g_i \times max(x_i, 1)| \le gtol \times max(\Phi(x), 1) $$ \afterdisplay @end tex @ifinfo @example ||g||_inf <= gtol @end example @end ifinfo This expression tests whether the ratio @math{(\nabla \Phi)_i x_i / \Phi} is small. Testing this scaled gradient is a better than @math{\nabla \Phi} alone since it is a dimensionless quantity and so independent of the scale of the problem. The @code{max} arguments help ensure the test doesn't break down in regions where @math{x_i} or @math{\Phi(x)} are close to 0. If this test succeeds, @var{info} is set to 2 and the function returns @code{GSL_SUCCESS}. A general guideline for choosing the gradient tolerance is to set @code{gtol = GSL_DBL_EPSILON^(1/3)}. See Dennis and Schnabel for more information. @end itemize If none of the tests succeed, @var{info} is set to 0 and the function returns @code{GSL_CONTINUE}, indicating further iterations are required. @end deftypefun @node Nonlinear Least-Squares High Level Driver @section High Level Driver These routines provide a high level wrapper that combines the iteration and convergence testing for easy use. @deftypefun int gsl_multifit_nlinear_driver (const size_t @var{maxiter}, const double @var{xtol}, const double @var{gtol}, const double @var{ftol}, void (* @var{callback})(const size_t @var{iter}, void * @var{params}, const gsl_multifit_linear_workspace * @var{w}), void * @var{callback_params}, int * @var{info}, gsl_multifit_nlinear_workspace * @var{w}) @deftypefunx int gsl_multilarge_nlinear_driver (const size_t @var{maxiter}, const double @var{xtol}, const double @var{gtol}, const double @var{ftol}, void (* @var{callback})(const size_t @var{iter}, void * @var{params}, const gsl_multilarge_linear_workspace * @var{w}), void * @var{callback_params}, int * @var{info}, gsl_multilarge_nlinear_workspace * @var{w}) These functions iterate the nonlinear least squares solver @var{w} for a maximum of @var{maxiter} iterations. After each iteration, the system is tested for convergence with the error tolerances @var{xtol}, @var{gtol} and @var{ftol}. Additionally, the user may supply a callback function @var{callback} which is called after each iteration, so that the user may save or print relevant quantities for each iteration. The parameter @var{callback_params} is passed to the @var{callback} function. The parameters @var{callback} and @var{callback_params} may be set to NULL to disable this feature. Upon successful convergence, the function returns @code{GSL_SUCCESS} and sets @var{info} to the reason for convergence (see @code{gsl_multifit_nlinear_test}). If the function has not converged after @var{maxiter} iterations, @code{GSL_EMAXITER} is returned. In rare cases, during an iteration the algorithm may be unable to find a new acceptable step @math{\delta} to take. In this case, @code{GSL_ENOPROG} is returned indicating no further progress can be made. If your problem is having difficulty converging, see @ref{Nonlinear Least-Squares Troubleshooting} for further guidance. @end deftypefun @node Nonlinear Least-Squares Covariance Matrix @section 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_nlinear_covar (const gsl_matrix * @var{J}, const double @var{epsrel}, gsl_matrix * @var{covar}) @deftypefunx int gsl_multilarge_nlinear_covar (gsl_matrix * @var{covar}, gsl_multilarge_nlinear_workspace * @var{w}) This function computes the covariance matrix of best-fit parameters using the Jacobian matrix @var{J} and stores it in @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 or in the weighted case, @tex \beforedisplay $$ C = (J^T W J)^{-1} $$ \afterdisplay @end tex @ifinfo @example covar = (J^T W J)^@{-1@} @end example @end ifinfo @noindent and is computed using the factored form of the Jacobian (Cholesky, QR, or SVD). 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 @node Nonlinear Least-Squares Troubleshooting @section Troubleshooting When developing a code to solve a nonlinear least squares problem, here are a few considerations to keep in mind. @enumerate @item The most common difficulty is the accurate implementation of the Jacobian matrix. If the analytic Jacobian is not properly provided to the solver, this can hinder and many times prevent convergence of the method. When developing a new nonlinear least squares code, it often helps to compare the program output with the internally computed finite difference Jacobian and the user supplied analytic Jacobian. If there is a large difference in coefficients, it is likely the analytic Jacobian is incorrectly implemented. @item If your code is having difficulty converging, the next thing to check is the starting point provided to the solver. The methods of this chapter are local methods, meaning if you provide a starting point far away from the true minimum, the method may converge to a local minimum or not converge at all. Sometimes it is possible to solve a linearized approximation to the nonlinear problem, and use the linear solution as the starting point to the nonlinear problem. @item If the various parameters of the coefficient vector @math{x} vary widely in magnitude, then the problem is said to be badly scaled. The methods of this chapter do attempt to automatically rescale the elements of @math{x} to have roughly the same order of magnitude, but in extreme cases this could still cause problems for convergence. In these cases it is recommended for the user to scale their parameter vector @math{x} so that each parameter spans roughly the same range, say @math{[-1,1]}. The solution vector can be backscaled to recover the original units of the problem. @end enumerate @node Nonlinear Least-Squares Examples @section Examples The following example programs demonstrate the nonlinear least squares fitting capabilities. @menu * Nonlinear Least-Squares Exponential Fit Example:: * Nonlinear Least-Squares Geodesic Acceleration Example:: * Nonlinear Least-Squares Comparison Example:: * Nonlinear Least-Squares Large Example:: @end menu @node Nonlinear Least-Squares Exponential Fit Example @subsection Exponential Fitting Example 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 $$ \afterdisplay @end tex @ifinfo @example f_i = (A \exp(-\lambda t_i) + b) - y_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}. The @math{i}th row of the Jacobian is therefore @tex \beforedisplay $$ J_{i\cdot} = \left( \matrix{ \exp(-\lambda t_i) & -t_i A \exp(-\lambda t_i) & 1 } \right) $$ \afterdisplay @end tex @ifinfo @example @end example @end ifinfo @noindent The main part of the program sets up a Levenberg-Marquardt solver and some simulated random data. The data uses the known parameters (5.0,0.1,1.0) combined with Gaussian noise (standard deviation = 0.1) over a range of 40 timesteps. The initial guess for the parameters is chosen as (1.0, 1.0, 0.0). The iteration terminates when the relative change in x is smaller than @math{10^{-8}}, or when the magnitude of the gradient falls below @math{10^{-8}}. Here are the results of running the program: @smallexample iter 0: A = 1.0000, lambda = 1.0000, b = 0.0000, cond(J) = inf, |f(x)| = 62.2029 iter 1: A = 1.2196, lambda = 0.3663, b = 0.0436, cond(J) = 53.6368, |f(x)| = 59.8062 iter 2: A = 1.6062, lambda = 0.1506, b = 0.1054, cond(J) = 23.8178, |f(x)| = 53.9039 iter 3: A = 2.4528, lambda = 0.0583, b = 0.2470, cond(J) = 20.0493, |f(x)| = 28.8039 iter 4: A = 2.9723, lambda = 0.0494, b = 0.3727, cond(J) = 94.5601, |f(x)| = 15.3252 iter 5: A = 3.3473, lambda = 0.0477, b = 0.4410, cond(J) = 229.3627, |f(x)| = 10.7511 iter 6: A = 3.6690, lambda = 0.0508, b = 0.4617, cond(J) = 298.3589, |f(x)| = 9.7373 iter 7: A = 3.9907, lambda = 0.0580, b = 0.5433, cond(J) = 250.0194, |f(x)| = 8.7661 iter 8: A = 4.2353, lambda = 0.0731, b = 0.7989, cond(J) = 154.8571, |f(x)| = 7.4299 iter 9: A = 4.6573, lambda = 0.0958, b = 1.0302, cond(J) = 140.2265, |f(x)| = 6.1893 iter 10: A = 5.0138, lambda = 0.1060, b = 1.0329, cond(J) = 109.4141, |f(x)| = 5.4961 iter 11: A = 5.1505, lambda = 0.1103, b = 1.0497, cond(J) = 100.8762, |f(x)| = 5.4552 iter 12: A = 5.1724, lambda = 0.1110, b = 1.0526, cond(J) = 97.3403, |f(x)| = 5.4542 iter 13: A = 5.1737, lambda = 0.1110, b = 1.0528, cond(J) = 96.7136, |f(x)| = 5.4542 iter 14: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6678, |f(x)| = 5.4542 iter 15: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6663, |f(x)| = 5.4542 iter 16: A = 5.1738, lambda = 0.1110, b = 1.0528, cond(J) = 96.6663, |f(x)| = 5.4542 summary from method 'trust-region/levenberg-marquardt' number of iterations: 16 function evaluations: 23 Jacobian evaluations: 17 reason for stopping: small step size initial |f(x)| = 62.202928 final |f(x)| = 5.454180 chisq/dof = 0.804002 A = 5.17379 +/- 0.27938 lambda = 0.11104 +/- 0.00817 b = 1.05283 +/- 0.05365 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 of an inappropriate model, and the scaled error estimates may then be outside the range of validity for Gaussian errors. @noindent Additionally, we see that the condition number of @math{J(x)} stays reasonably small throughout the iteration. This indicates we could safely switch to the Cholesky solver for speed improvement, although this particular system is too small to really benefit. @iftex @sp 1 @center @image{fit-exp,3.4in} @end iftex @example @verbatiminclude examples/nlfit.c @end example @node Nonlinear Least-Squares Geodesic Acceleration Example @subsection Geodesic Acceleration Example The following example program minimizes a modified Rosenbrock function, which is characterized by a narrow canyon with steep walls. The starting point is selected high on the canyon wall, so the solver must first find the canyon bottom and then navigate to the minimum. The problem is solved both with and without using geodesic acceleration for comparison. The cost function is given by @tex \beforedisplay $$ \eqalign{ \Phi(x) &= {1 \over 2} (f_1^2 + f_2^2) \cr f_1 &= 100 \left( x_2 - x_1^2 \right) \cr f_2 &= 1 - x_1 } $$ \afterdisplay @end tex @ifinfo @example Phi(x) = 1/2 (f1^2 + f2^2) f1 = 100 ( x2 - x1^2 ) f2 = 1 - x1 @end example @end ifinfo @noindent The Jacobian matrix is given by @tex \beforedisplay $$ J = \left( \matrix{ {\partial f_1 \over \partial x_1} & {\partial f_1 \over \partial x_2} \cr {\partial f_2 \over \partial x_1} & {\partial f_2 \over \partial x_2} } \right) = \left( \matrix{ -200 x_1 & 100 \cr -1 & 0 } \right) $$ \afterdisplay @end tex @ifinfo @example J = [ -200*x1 100 ; -1 0 ] @end example @end ifinfo @noindent In order to use geodesic acceleration, the user must provide the second directional derivative of each residual in the velocity direction, @math{D_v^2 f_i = \sum_{\alpha\beta} v_{\alpha} v_{\beta} \partial_{\alpha} \partial_{\beta} f_i}. The velocity vector @math{v} is provided by the solver. For this example, these derivatives are given by @tex \beforedisplay $$ f_{vv} = D_v^2 \left( \matrix{ f_1 \cr f_2 } \right) = \left( \matrix{ -200 v_1^2 \cr 0 } \right) $$ \afterdisplay @end tex @ifinfo @example fvv = [ -200 v1^2 ; 0 ] @end example @end ifinfo @noindent The solution of this minimization problem is given by @tex \beforedisplay $$ \eqalign{ x^{*} &= \left( \matrix{ 1 \cr 1 } \right) \cr \Phi(x^{*}) &= 0 } $$ \afterdisplay @end tex @ifinfo @example x* = [ 1 ; 1 ] Phi(x*) = 0 @end example @end ifinfo @noindent The program output is shown below. @smallexample === Solving system without acceleration === NITER = 53 NFEV = 56 NJEV = 54 NAEV = 0 initial cost = 2.250225000000e+04 final cost = 6.674986031430e-18 final x = (9.999999974165e-01, 9.999999948328e-01) final cond(J) = 6.000096055094e+02 === Solving system with acceleration === NITER = 15 NFEV = 17 NJEV = 16 NAEV = 16 initial cost = 2.250225000000e+04 final cost = 7.518932873279e-19 final x = (9.999999991329e-01, 9.999999982657e-01) final cond(J) = 6.000097233278e+02 @end smallexample @noindent We can see that enabling geodesic acceleration requires less than a third of the number of Jacobian evaluations in order to locate the minimum. The path taken by both methods is shown in the figure below. The contours show the cost function @math{\Phi(x_1,x_2)}. We see that both methods quickly find the canyon bottom, but the geodesic acceleration method navigates along the bottom to the solution with significantly fewer iterations. @iftex @sp 1 @center @image{nlfit2,6in} @end iftex @noindent The program is given below. @example @verbatiminclude examples/nlfit2.c @end example @node Nonlinear Least-Squares Comparison Example @subsection Comparing TRS Methods Example The following program compares all available nonlinear least squares trust-region subproblem (TRS) methods on the Branin function, a common optimization test problem. The cost function is given by @tex \beforedisplay $$ \eqalign{ \Phi(x) &= {1 \over 2} (f_1^2 + f_2^2) \cr f_1 &= x_2 + a_1 x_1^2 + a_2 x_1 + a_3 \cr f_2 &= \sqrt{a_4} \sqrt{1 + (1 - a_5) \cos{x_1}} } $$ \afterdisplay @end tex @ifinfo @example \Phi(x) &= 1/2 (f_1^2 + f_2^2) f_1 &= x_2 + a_1 x_1^2 + a_2 x_1 + a_3 f_2 &= sqrt(a_4) sqrt(1 + (1 - a_5) cos(x_1)) @end example @end ifinfo with @math{a_1 = -{5.1 \over 4 \pi^2}, a_2 = {5 \over \pi}, a_3 = -6, a_4 = 10, a_5 = {1 \over 8\pi}}. There are three minima of this function in the range @math{(x_1,x_2) \in [-5,15] \times [-5,15]}. The program below uses the starting point @math{(x_1,x_2) = (6,14.5)} and calculates the solution with all available nonlinear least squares TRS methods. The program output is shown below. @smallformat @verbatim Method NITER NFEV NJEV Initial Cost Final cost Final cond(J) Final x levenberg-marquardt 20 27 21 1.9874e+02 3.9789e-01 6.1399e+07 (-3.14e+00, 1.23e+01) levenberg-marquardt+accel 27 36 28 1.9874e+02 3.9789e-01 1.4465e+07 (3.14e+00, 2.27e+00) dogleg 23 64 23 1.9874e+02 3.9789e-01 5.0692e+08 (3.14e+00, 2.28e+00) double-dogleg 24 69 24 1.9874e+02 3.9789e-01 3.4879e+07 (3.14e+00, 2.27e+00) 2D-subspace 23 54 24 1.9874e+02 3.9789e-01 2.5142e+07 (3.14e+00, 2.27e+00) @end verbatim @end smallformat @noindent The first row of output above corresponds to standard Levenberg-Marquardt, while the second row includes geodesic acceleration. We see that the standard LM method converges to the minimum at @math{(-\pi,12.275)} and also uses the least number of iterations and Jacobian evaluations. All other methods converge to the minimum @math{(\pi,2.275)} and perform similarly in terms of number of Jacobian evaluations. We see that @math{J} is fairly ill-conditioned at both minima, indicating that the QR (or SVD) solver is the best choice for this problem. Since there are only two parameters in this optimization problem, we can easily visualize the paths taken by each method, which are shown in the figure below. The figure shows contours of the cost function @math{\Phi(x_1,x_2)} which exhibits three global minima in the range @math{[-5,15] \times [-5,15]}. The paths taken by each solver are shown as colored lines. @iftex @sp 1 @center @image{nlfit3,6in} @end iftex @noindent The program is given below. @example @verbatiminclude examples/nlfit3.c @end example @node Nonlinear Least-Squares Large Example @subsection Large Nonlinear Least Squares Example The following program illustrates the large nonlinear least squares solvers on a system with significant sparse structure in the Jacobian. The cost function is given by @tex \beforedisplay $$ \eqalign{ \Phi(x) &= {1 \over 2} \sum_{i=1}^{p+1} f_i^2 \cr f_i &= \sqrt{\alpha} (x_i - 1), \quad 1 \le i \le p \cr f_{p+1} &= ||x||^2 - {1 \over 4} } $$ \afterdisplay @end tex @ifinfo @example \Phi(x) &= 1/2 \sum_@{i=1@}^@{p+1@} f_i^2 f_i &= \sqrt@{\alpha@} (x_i - 1), 1 \le i \le p f_@{p+1@} &= ||x||^2 - 1/4 @end example @end ifinfo with @math{\alpha = 10^{-5}}. The residual @math{f_{p+1}} imposes a constraint on the @math{p} parameters @math{x}, to ensure that @math{||x||^2 \approx {1 \over 4}}. The @math{(p+1)}-by-@math{p} Jacobian for this system is given by @tex \beforedisplay $$ J(x) = \left( \matrix{ \sqrt{\alpha} I_p \cr 2 x^T } \right) $$ \afterdisplay @end tex @ifinfo @example J(x) = [ \sqrt@{alpha@} I_p; 2 x^T ] @end example @end ifinfo and the normal equations matrix is given by @tex \beforedisplay $$ J^T J = \alpha I_p + 4 x x^T $$ \afterdisplay @end tex @ifinfo @example J^T J = [ \alpha I_p + 4 x x^T ] @end example @end ifinfo @noindent Finally, the second directional derivative of @math{f} for the geodesic acceleration method is given by @tex \beforedisplay $$ f_{vv} = D_v^2 f = \left( \matrix{ 0 \cr 2 ||v||^2 } \right) $$ \afterdisplay @end tex @ifinfo @example fvv = [ 0; 2 ||v||^2 ] @end example @end ifinfo @noindent Since the upper @math{p}-by-@math{p} block of @math{J} is diagonal, this sparse structure should be exploited in the nonlinear solver. For comparison, the following program solves the system for @math{p = 2000} using the dense direct Cholesky solver based on the normal equations matrix @math{J^T J}, as well as the iterative Steihaug-Toint solver, based on sparse matrix-vector products @math{J u} and @math{J^T u}. The program output is shown below. @smallformat @verbatim Method NITER NFEV NJUEV NJTJEV NAEV Init Cost Final cost cond(J) Final |x|^2 Time (s) levenberg-marquardt 25 31 26 26 0 7.1218e+18 1.9555e-02 447.50 2.5044e-01 46.28 levenberg-marquardt+accel 22 23 45 23 22 7.1218e+18 1.9555e-02 447.64 2.5044e-01 33.92 dogleg 37 87 36 36 0 7.1218e+18 1.9555e-02 447.59 2.5044e-01 56.05 double-dogleg 35 88 34 34 0 7.1218e+18 1.9555e-02 447.62 2.5044e-01 52.65 2D-subspace 37 88 36 36 0 7.1218e+18 1.9555e-02 447.71 2.5044e-01 59.75 steihaug-toint 35 88 345 0 0 7.1218e+18 1.9555e-02 inf 2.5044e-01 0.09 @end verbatim @end smallformat @noindent The first five rows use methods based on factoring the dense @math{J^T J} matrix while the last row uses the iterative Steihaug-Toint method. While the number of Jacobian matrix-vector products (NJUEV) is less for the dense methods, the added time to construct and factor the @math{J^T J} matrix (NJTJEV) results in a much larger runtime than the iterative method (see last column). @noindent The program is given below. @example @verbatiminclude examples/nlfit4.c @end example @node Nonlinear Least-Squares References and Further Reading @section References and Further Reading @noindent The following publications are relevant to the algorithms described in this section, @itemize @w{} @item J.J. Mor@'e, @cite{The Levenberg-Marquardt Algorithm: Implementation and Theory}, Lecture Notes in Mathematics, v630 (1978), ed G. Watson. @item H. B. Nielsen, ``Damping Parameter in Marquardt's Method'', IMM Department of Mathematical Modeling, DTU, Tech. Report IMM-REP-1999-05 (1999). @item K. Madsen and H. B. Nielsen, ``Introduction to Optimization and Data Fitting'', IMM Department of Mathematical Modeling, DTU, 2010. @item J. E. Dennis and R. B. Schnabel, Numerical Methods for Unconstrained Optimization and Nonlinear Equations, SIAM, 1996. @item M. K. Transtrum, B. B. Machta, and J. P. Sethna, Geometry of nonlinear least squares with applications to sloppy models and optimization, Phys. Rev. E 83, 036701, 2011. @item M. K. Transtrum and J. P. Sethna, Improvements to the Levenberg-Marquardt algorithm for nonlinear least-squares minimization, arXiv:1201.5885, 2012. @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. @item H. B. Nielsen, ``UCTP Test Problems for Unconstrained Optimization'', IMM Department of Mathematical Modeling, DTU, Tech. Report IMM-REP-2000-17 (2000). @end itemize gsl-doc-2.3/doc/specfunc-airy.texi0000664000175000017500000001206212616157443015204 0ustar eddedd@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 + xt} + \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 + xt) + \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 gsl-doc-2.3/doc/ntuple.texi0000664000175000017500000001551712616157443013753 0ustar eddedd@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 @tindex gsl_ntuple 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 @tindex gsl_ntuple_select_fn 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 @tindex gsl_ntuple_value_fn 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). gsl-doc-2.3/templates_on.h0000664000175000017500000001443712616157443013647 0ustar eddedd/* 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) #if defined(_MSC_VER) && defined(complex) #undef complex #endif #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 #ifdef __CHAR_UNSIGNED__ #define UNSIGNED 1 #endif #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)) gsl-doc-2.3/rstat/0000755000175000017500000000000013022553154012115 5ustar eddeddgsl-doc-2.3/rstat/Makefile.am0000664000175000017500000000105112616157443014161 0ustar eddeddnoinst_LTLIBRARIES = libgslrstat.la pkginclude_HEADERS = gsl_rstat.h AM_CPPFLAGS = -I$(top_srcdir) libgslrstat_la_SOURCES = rstat.c rquantile.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslrstat.la ../statistics/libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../vector/libgslvector.la gsl-doc-2.3/rstat/gsl_rstat.h0000644000175000017500000000542412752715635014312 0ustar eddedd/* rstat/gsl_rstat.h * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_RSTAT_H__ #define __GSL_RSTAT_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 { double p; /* p-quantile */ double q[5]; /* heights q_i */ int npos[5]; /* positions n_i */ double np[5]; /* desired positions n_i' */ double dnp[5]; /* increments dn_i' */ size_t n; /* number of data added */ } gsl_rstat_quantile_workspace; gsl_rstat_quantile_workspace *gsl_rstat_quantile_alloc(const double p); void gsl_rstat_quantile_free(gsl_rstat_quantile_workspace *w); int gsl_rstat_quantile_reset(gsl_rstat_quantile_workspace *w); int gsl_rstat_quantile_add(const double x, gsl_rstat_quantile_workspace *w); double gsl_rstat_quantile_get(gsl_rstat_quantile_workspace *w); typedef struct { double min; /* minimum value added */ double max; /* maximum value added */ double mean; /* current mean */ double M2; /* M_k = sum_{i=1..n} [ x_i - mean_n ]^k */ double M3; double M4; size_t n; /* number of data points added */ gsl_rstat_quantile_workspace *median_workspace_p; /* median workspace */ } gsl_rstat_workspace; gsl_rstat_workspace *gsl_rstat_alloc(void); void gsl_rstat_free(gsl_rstat_workspace *w); size_t gsl_rstat_n(gsl_rstat_workspace *w); int gsl_rstat_add(const double x, gsl_rstat_workspace *w); double gsl_rstat_min(gsl_rstat_workspace *w); double gsl_rstat_max(gsl_rstat_workspace *w); double gsl_rstat_mean(gsl_rstat_workspace *w); double gsl_rstat_variance(gsl_rstat_workspace *w); double gsl_rstat_sd(gsl_rstat_workspace *w); double gsl_rstat_rms(gsl_rstat_workspace *w); double gsl_rstat_sd_mean(gsl_rstat_workspace *w); double gsl_rstat_median(gsl_rstat_workspace *w); double gsl_rstat_skew(gsl_rstat_workspace *w); double gsl_rstat_kurtosis(gsl_rstat_workspace *w); int gsl_rstat_reset(gsl_rstat_workspace *w); __END_DECLS #endif /* __GSL_RSTAT_H__ */ gsl-doc-2.3/rstat/rquantile.c0000644000175000017500000001215112752715635014302 0ustar eddedd/* rstat/rquantile.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* * Running quantile calculation based on the paper * * [1] R. Jain and I. Chlamtac, "The P^2 algorithm for dynamic * calculation of quantiles and histograms without storing * observations", Communications of the ACM, October 1985 */ static double calc_psq(const double qp1, const double q, const double qm1, const double d, const double np1, const double n, const double nm1); gsl_rstat_quantile_workspace * gsl_rstat_quantile_alloc(const double p) { gsl_rstat_quantile_workspace *w; w = calloc(1, sizeof(gsl_rstat_quantile_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->p = p; gsl_rstat_quantile_reset(w); return w; } /* gsl_rstat_quantile_alloc() */ void gsl_rstat_quantile_free(gsl_rstat_quantile_workspace *w) { free(w); } /* gsl_rstat_quantile_free() */ int gsl_rstat_quantile_reset(gsl_rstat_quantile_workspace *w) { const double p = w->p; size_t i; /* initialize positions n */ for (i = 0; i < 5; ++i) w->npos[i] = i + 1; /* initialize n' */ w->np[0] = 1.0; w->np[1] = 1.0 + 2.0 * p; w->np[2] = 1.0 + 4.0 * p; w->np[3] = 3.0 + 2.0 * p; w->np[4] = 5.0; /* initialize dn' */ w->dnp[0] = 0.0; w->dnp[1] = 0.5 * p; w->dnp[2] = p; w->dnp[3] = 0.5 * (1.0 + p); w->dnp[4] = 1.0; w->n = 0; return GSL_SUCCESS; } int gsl_rstat_quantile_add(const double x, gsl_rstat_quantile_workspace *w) { if (w->n < 5) { w->q[w->n] = x; } else { int i; int k = -1; if (w->n == 5) { /* initialization: sort the first five heights */ gsl_sort(w->q, 1, w->n); } /* step B1: find k such that q_k <= x < q_{k+1} */ if (x < w->q[0]) { w->q[0] = x; k = 0; } else if (x >= w->q[4]) { w->q[4] = x; k = 3; } else { for (i = 0; i <= 3; ++i) { if (w->q[i] <= x && x < w->q[i + 1]) { k = i; break; } } } if (k < 0) { /* we could get here if x is nan */ GSL_ERROR ("invalid input argument x", GSL_EINVAL); } /* step B2(a): update n_i */ for (i = k + 1; i <= 4; ++i) ++(w->npos[i]); /* step B2(b): update n_i' */ for (i = 0; i < 5; ++i) w->np[i] += w->dnp[i]; /* step B3: update heights */ for (i = 1; i <= 3; ++i) { double ni = (double) w->npos[i]; double d = w->np[i] - ni; if ((d >= 1.0 && (w->npos[i + 1] - w->npos[i] > 1)) || (d <= -1.0 && (w->npos[i - 1] - w->npos[i] < -1))) { int dsign = (d > 0.0) ? 1 : -1; double qp1 = w->q[i + 1]; double qi = w->q[i]; double qm1 = w->q[i - 1]; double np1 = (double) w->npos[i + 1]; double nm1 = (double) w->npos[i - 1]; double qp = calc_psq(qp1, qi, qm1, (double) dsign, np1, ni, nm1); if (qm1 < qp && qp < qp1) w->q[i] = qp; else { /* use linear formula */ w->q[i] += dsign * (w->q[i + dsign] - qi) / ((double) w->npos[i + dsign] - ni); } w->npos[i] += dsign; } } } ++(w->n); return GSL_SUCCESS; } /* gsl_rstat_quantile_add() */ double gsl_rstat_quantile_get(gsl_rstat_quantile_workspace *w) { if (w->n >= 5) { return w->q[2]; } else { /* not yet initialized */ gsl_sort(w->q, 1, w->n); return gsl_stats_quantile_from_sorted_data(w->q, 1, w->n, w->p); } } /* gsl_rstat_quantile_get() */ static double calc_psq(const double qp1, const double q, const double qm1, const double d, const double np1, const double n, const double nm1) { double outer = d / (np1 - nm1); double inner_left = (n - nm1 + d) * (qp1 - q) / (np1 - n); double inner_right = (np1 - n - d) * (q - qm1) / (n - nm1); return q + outer * (inner_left + inner_right); } /* calc_psq() */ gsl-doc-2.3/rstat/rstat.c0000644000175000017500000001076312774420036013432 0ustar eddedd/* rstat/rstat.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include gsl_rstat_workspace * gsl_rstat_alloc(void) { gsl_rstat_workspace *w; w = calloc(1, sizeof(gsl_rstat_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->median_workspace_p = gsl_rstat_quantile_alloc(0.5); if (w->median_workspace_p == 0) { GSL_ERROR_NULL ("failed to allocate space for median workspace", GSL_ENOMEM); } gsl_rstat_reset(w); return w; } /* gsl_rstat_alloc() */ void gsl_rstat_free(gsl_rstat_workspace *w) { if (w->median_workspace_p) gsl_rstat_quantile_free(w->median_workspace_p); free(w); } /* gsl_rstat_free() */ size_t gsl_rstat_n(gsl_rstat_workspace *w) { return w->n; } /* gsl_rstat_n() */ /* add a data point to the running totals */ int gsl_rstat_add(const double x, gsl_rstat_workspace *w) { double delta = x - w->mean; double delta_n, delta_nsq, term1, n; /* update min and max */ if (w->n == 0) { w->min = x; w->max = x; } else { if (x < w->min) w->min = x; if (x > w->max) w->max = x; } /* update mean and variance */ n = (double) ++(w->n); delta_n = delta / n; delta_nsq = delta_n * delta_n; term1 = delta * delta_n * (n - 1.0); w->mean += delta_n; w->M4 += term1 * delta_nsq * (n * n - 3.0 * n + 3.0) + 6.0 * delta_nsq * w->M2 - 4.0 * delta_n * w->M3; w->M3 += term1 * delta_n * (n - 2.0) - 3.0 * delta_n * w->M2; w->M2 += term1; /* update median */ gsl_rstat_quantile_add(x, w->median_workspace_p); return GSL_SUCCESS; } /* gsl_rstat_add() */ double gsl_rstat_min(gsl_rstat_workspace *w) { return w->min; } /* gsl_rstat_min() */ double gsl_rstat_max(gsl_rstat_workspace *w) { return w->max; } /* gsl_rstat_max() */ double gsl_rstat_mean(gsl_rstat_workspace *w) { return w->mean; } /* gsl_rstat_mean() */ double gsl_rstat_variance(gsl_rstat_workspace *w) { if (w->n > 1) { double n = (double) w->n; return (w->M2 / (n - 1.0)); } else return 0.0; } /* gsl_rstat_variance() */ double gsl_rstat_sd(gsl_rstat_workspace *w) { double var = gsl_rstat_variance(w); return (sqrt(var)); } /* gsl_rstat_sd() */ double gsl_rstat_rms(gsl_rstat_workspace *w) { double rms = 0.0; if (w->n > 0) { double mean = gsl_rstat_mean(w); double sigma = gsl_rstat_sd(w); double n = (double) w->n; double a = sqrt((n - 1.0) / n); rms = gsl_hypot(mean, a * sigma); } return rms; } /* standard deviation of the mean: sigma / sqrt(n) */ double gsl_rstat_sd_mean(gsl_rstat_workspace *w) { if (w->n > 0) { double sd = gsl_rstat_sd(w); return (sd / sqrt((double) w->n)); } else return 0.0; } /* gsl_rstat_sd_mean() */ double gsl_rstat_median(gsl_rstat_workspace *w) { return gsl_rstat_quantile_get(w->median_workspace_p); } double gsl_rstat_skew(gsl_rstat_workspace *w) { if (w->n > 0) { double n = (double) w->n; double fac = pow(n - 1.0, 1.5) / n; return ((fac * w->M3) / pow(w->M2, 1.5)); } else return 0.0; } /* gsl_rstat_skew() */ double gsl_rstat_kurtosis(gsl_rstat_workspace *w) { if (w->n > 0) { double n = (double) w->n; double fac = ((n - 1.0) / n) * (n - 1.0); return ((fac * w->M4) / (w->M2 * w->M2) - 3.0); } else return 0.0; } /* gsl_rstat_kurtosis() */ int gsl_rstat_reset(gsl_rstat_workspace *w) { int status; w->min = 0.0; w->max = 0.0; w->mean = 0.0; w->M2 = 0.0; w->M3 = 0.0; w->M4 = 0.0; w->n = 0; status = gsl_rstat_quantile_reset(w->median_workspace_p); return status; } /* gsl_rstat_reset() */ gsl-doc-2.3/rstat/Makefile.in0000644000175000017500000010424413022372406014166 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = rstat DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslrstat_la_LIBADD = am_libgslrstat_la_OBJECTS = rstat.lo rquantile.lo libgslrstat_la_OBJECTS = $(am_libgslrstat_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslrstat.la ../statistics/libgslstatistics.la \ ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la \ ../randist/libgslrandist.la ../rng/libgslrng.la \ ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la ../vector/libgslvector.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrstat_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrstat_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrstat.la pkginclude_HEADERS = gsl_rstat.h AM_CPPFLAGS = -I$(top_srcdir) libgslrstat_la_SOURCES = rstat.c rquantile.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslrstat.la ../statistics/libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../vector/libgslvector.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rstat/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu rstat/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrstat.la: $(libgslrstat_la_OBJECTS) $(libgslrstat_la_DEPENDENCIES) $(EXTRA_libgslrstat_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrstat_la_OBJECTS) $(libgslrstat_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rquantile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rstat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/rstat/test.c0000644000175000017500000001543512774420036013255 0ustar eddedd/* rstat/test.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include double * random_data(const size_t n, gsl_rng *r) { size_t i; double *data = malloc(n * sizeof(double)); for (i = 0; i < n; ++i) data[i] = gsl_rng_uniform(r); return data; } void test_basic(const size_t n, const double data[], const double tol) { gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_sd_mean = expected_sd / sqrt((double) n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); double expected_rms = 0.0; double mean, var, sd, sd_mean, rms, skew, kurtosis; size_t i, num; int status; /* compute expected rms */ for (i = 0; i < n; ++i) expected_rms += data[i] * data[i]; expected_rms = sqrt(expected_rms / n); /* add data to rstat workspace */ for (i = 0; i < n; ++i) gsl_rstat_add(data[i], rstat_workspace_p); mean = gsl_rstat_mean(rstat_workspace_p); var = gsl_rstat_variance(rstat_workspace_p); sd = gsl_rstat_sd(rstat_workspace_p); sd_mean = gsl_rstat_sd_mean(rstat_workspace_p); rms = gsl_rstat_rms(rstat_workspace_p); skew = gsl_rstat_skew(rstat_workspace_p); kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, n, "n n=%zu" , n); gsl_test_rel(mean, expected_mean, tol, "mean n=%zu", n); gsl_test_rel(var, expected_var, tol, "variance n=%zu", n); gsl_test_rel(sd, expected_sd, tol, "stddev n=%zu", n); gsl_test_rel(sd_mean, expected_sd_mean, tol, "stddev_mean n=%zu", n); gsl_test_rel(rms, expected_rms, tol, "rms n=%zu", n); gsl_test_rel(skew, expected_skew, tol, "skew n=%zu", n); gsl_test_rel(kurtosis, expected_kurtosis, tol, "kurtosis n=%zu", n); status = gsl_rstat_reset(rstat_workspace_p); gsl_test_int(status, GSL_SUCCESS, "rstat returned success"); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, 0, "n n=%zu" , n); gsl_rstat_free(rstat_workspace_p); } void test_quantile(const double p, const double data[], const size_t n, const double expected, const double tol, const char *desc) { gsl_rstat_quantile_workspace *w = gsl_rstat_quantile_alloc(p); double result; size_t i; for (i = 0; i < n; ++i) gsl_rstat_quantile_add(data[i], w); result = gsl_rstat_quantile_get(w); if (fabs(expected) < 1.0e-4) gsl_test_abs(result, expected, tol, "%s p=%g", desc, p); else gsl_test_rel(result, expected, tol, "%s p=%g", desc, p); gsl_rstat_quantile_free(w); } int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); const double tol1 = 1.0e-8; const double tol2 = 1.0e-3; gsl_ieee_env_setup(); { const size_t N = 2000000; double *data = random_data(N, r); double data2[] = { 4.0, 7.0, 13.0, 16.0 }; size_t i; test_basic(2, data, tol1); test_basic(100, data, tol1); test_basic(1000, data, tol1); test_basic(10000, data, tol1); test_basic(50000, data, tol1); test_basic(80000, data, tol1); test_basic(1500000, data, tol1); test_basic(2000000, data, tol1); for (i = 0; i < 4; ++i) data2[i] += 1.0e9; test_basic(4, data2, tol1); free(data); } { /* dataset from Jain and Chlamtac paper */ const size_t n_jain = 20; const double data_jain[] = { 0.02, 0.15, 0.74, 3.39, 0.83, 22.37, 10.15, 15.43, 38.62, 15.92, 34.60, 10.28, 1.47, 0.40, 0.05, 11.39, 0.27, 0.42, 0.09, 11.37 }; double expected_jain = 4.44063435326; test_quantile(0.5, data_jain, n_jain, expected_jain, tol1, "jain"); } { size_t n = 1000000; double *data = malloc(n * sizeof(double)); double *sorted_data = malloc(n * sizeof(double)); gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); double p; size_t i; for (i = 0; i < n; ++i) { data[i] = gsl_ran_gaussian_tail(r, 1.3, 1.0); gsl_rstat_add(data[i], rstat_workspace_p); } memcpy(sorted_data, data, n * sizeof(double)); gsl_sort(sorted_data, 1, n); /* test quantile calculation */ for (p = 0.1; p <= 0.9; p += 0.1) { double expected = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, p); test_quantile(p, data, n, expected, tol2, "gauss"); } /* test mean, variance */ { const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); const double expected_median = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, 0.5); const double mean = gsl_rstat_mean(rstat_workspace_p); const double var = gsl_rstat_variance(rstat_workspace_p); const double sd = gsl_rstat_sd(rstat_workspace_p); const double skew = gsl_rstat_skew(rstat_workspace_p); const double kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); const double median = gsl_rstat_median(rstat_workspace_p); gsl_test_rel(mean, expected_mean, tol1, "mean"); gsl_test_rel(var, expected_var, tol1, "variance"); gsl_test_rel(sd, expected_sd, tol1, "stddev"); gsl_test_rel(skew, expected_skew, tol1, "skew"); gsl_test_rel(kurtosis, expected_kurtosis, tol1, "kurtosis"); gsl_test_abs(median, expected_median, tol2, "median"); } free(data); free(sorted_data); gsl_rstat_free(rstat_workspace_p); } gsl_rng_free(r); exit (gsl_test_summary()); } gsl-doc-2.3/spmatrix/0000755000175000017500000000000013022553155012630 5ustar eddeddgsl-doc-2.3/spmatrix/spcompress.c0000644000175000017500000001122012736044021015164 0ustar eddedd/* spcompress.c * * Copyright (C) 2012-2014, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* gsl_spmatrix_ccs() Create a sparse matrix in compressed column format Inputs: T - sparse matrix in triplet format Return: pointer to new matrix (should be freed when finished with it) */ gsl_spmatrix * gsl_spmatrix_ccs(const gsl_spmatrix *T) { if (!GSL_SPMATRIX_ISTRIPLET(T)) { GSL_ERROR_NULL("matrix must be in triplet format", GSL_EINVAL); } else { const size_t *Tj; /* column indices of triplet matrix */ size_t *Cp; /* column pointers of compressed column matrix */ size_t *w; /* copy of column pointers */ gsl_spmatrix *m; size_t n; m = gsl_spmatrix_alloc_nzmax(T->size1, T->size2, T->nz, GSL_SPMATRIX_CCS); if (!m) return NULL; Tj = T->p; Cp = m->p; /* initialize column pointers to 0 */ for (n = 0; n < m->size2 + 1; ++n) Cp[n] = 0; /* * compute the number of elements in each column: * Cp[j] = # non-zero elements in column j */ for (n = 0; n < T->nz; ++n) Cp[Tj[n]]++; /* compute column pointers: p[j] = p[j-1] + nnz[j-1] */ gsl_spmatrix_cumsum(m->size2, Cp); /* make a copy of the column pointers */ w = (size_t *) m->work; for (n = 0; n < m->size2; ++n) w[n] = Cp[n]; /* transfer data from triplet format to CCS */ for (n = 0; n < T->nz; ++n) { size_t k = w[Tj[n]]++; m->i[k] = T->i[n]; m->data[k] = T->data[n]; } m->nz = T->nz; return m; } } gsl_spmatrix * gsl_spmatrix_compcol(const gsl_spmatrix *T) { return gsl_spmatrix_ccs(T); } /* gsl_spmatrix_crs() Create a sparse matrix in compressed row format Inputs: T - sparse matrix in triplet format Return: pointer to new matrix (should be freed when finished with it) */ gsl_spmatrix * gsl_spmatrix_crs(const gsl_spmatrix *T) { if (!GSL_SPMATRIX_ISTRIPLET(T)) { GSL_ERROR_NULL("matrix must be in triplet format", GSL_EINVAL); } else { const size_t *Ti; /* row indices of triplet matrix */ size_t *Cp; /* row pointers of compressed row matrix */ size_t *w; /* copy of column pointers */ gsl_spmatrix *m; size_t n; m = gsl_spmatrix_alloc_nzmax(T->size1, T->size2, T->nz, GSL_SPMATRIX_CRS); if (!m) return NULL; Ti = T->i; Cp = m->p; /* initialize row pointers to 0 */ for (n = 0; n < m->size1 + 1; ++n) Cp[n] = 0; /* * compute the number of elements in each row: * Cp[i] = # non-zero elements in row i */ for (n = 0; n < T->nz; ++n) Cp[Ti[n]]++; /* compute row pointers: p[i] = p[i-1] + nnz[i-1] */ gsl_spmatrix_cumsum(m->size1, Cp); /* make a copy of the row pointers */ w = (size_t *) m->work; for (n = 0; n < m->size1; ++n) w[n] = Cp[n]; /* transfer data from triplet format to CRS */ for (n = 0; n < T->nz; ++n) { size_t k = w[Ti[n]]++; m->i[k] = T->p[n]; m->data[k] = T->data[n]; } m->nz = T->nz; return m; } } /* gsl_spmatrix_cumsum() Compute the cumulative sum: p[j] = Sum_{k=0...j-1} c[k] 0 <= j < n + 1 Alternatively, p[0] = 0 p[j] = p[j - 1] + c[j - 1] Inputs: n - length of input array c - (input/output) array of size n + 1 on input, contains the n values c[k] on output, contains the n + 1 values p[j] Return: success or error */ void gsl_spmatrix_cumsum(const size_t n, size_t *c) { size_t sum = 0; size_t k; for (k = 0; k < n; ++k) { size_t ck = c[k]; c[k] = sum; sum += ck; } c[n] = sum; } /* gsl_spmatrix_cumsum() */ gsl-doc-2.3/spmatrix/Makefile.am0000644000175000017500000000112412736044021014660 0ustar eddeddnoinst_LTLIBRARIES = libgslspmatrix.la check_PROGRAMS = test pkginclude_HEADERS = gsl_spmatrix.h libgslspmatrix_la_SOURCES = spcompress.c spcopy.c spgetset.c spio.c spmatrix.c spoper.c spprop.c spswap.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = avl.c TESTS = $(check_PROGRAMS) test_LDADD = libgslspmatrix.la ../spblas/libgslspblas.la ../test/libgsltest.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la test_SOURCES = test.c gsl-doc-2.3/spmatrix/TODO0000644000175000017500000000011012736044021013306 0ustar eddedd1. extend transpose to CCS/CRS (in-place) 2. extend spblas_dgemm to CRS gsl-doc-2.3/spmatrix/spprop.c0000644000175000017500000000610212736044021014314 0ustar eddedd/* spprop.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* gsl_spmatrix_equal() Return 1 if a = b, 0 otherwise */ int gsl_spmatrix_equal(const gsl_spmatrix *a, const gsl_spmatrix *b) { const size_t M = a->size1; const size_t N = a->size2; if (b->size1 != M || b->size2 != N) { GSL_ERROR_VAL("matrices must have same dimensions", GSL_EBADLEN, 0); } else if (a->sptype != b->sptype) { GSL_ERROR_VAL("trying to compare different sparse matrix types", GSL_EINVAL, 0); } else { const size_t nz = a->nz; size_t n; if (nz != b->nz) return 0; /* different number of non-zero elements */ if (GSL_SPMATRIX_ISTRIPLET(a)) { /* * triplet formats could be out of order but identical, so use * gsl_spmatrix_get() on b for each aij */ for (n = 0; n < nz; ++n) { double bij = gsl_spmatrix_get(b, a->i[n], a->p[n]); if (a->data[n] != bij) return 0; } } else if (GSL_SPMATRIX_ISCCS(a)) { /* * for CCS, both matrices should have everything * in the same order */ /* check row indices and data */ for (n = 0; n < nz; ++n) { if ((a->i[n] != b->i[n]) || (a->data[n] != b->data[n])) return 0; } /* check column pointers */ for (n = 0; n < a->size2 + 1; ++n) { if (a->p[n] != b->p[n]) return 0; } } else if (GSL_SPMATRIX_ISCRS(a)) { /* * for CRS, both matrices should have everything * in the same order */ /* check column indices and data */ for (n = 0; n < nz; ++n) { if ((a->i[n] != b->i[n]) || (a->data[n] != b->data[n])) return 0; } /* check row pointers */ for (n = 0; n < a->size1 + 1; ++n) { if (a->p[n] != b->p[n]) return 0; } } else { GSL_ERROR_VAL("unknown sparse matrix type", GSL_EINVAL, 0); } return 1; } } /* gsl_spmatrix_equal() */ gsl-doc-2.3/spmatrix/spoper.c0000644000175000017500000001206412736044021014305 0ustar eddedd/* spoper.c * * Copyright (C) 2012 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include int gsl_spmatrix_scale(gsl_spmatrix *m, const double x) { size_t i; for (i = 0; i < m->nz; ++i) m->data[i] *= x; return GSL_SUCCESS; } /* gsl_spmatrix_scale() */ int gsl_spmatrix_minmax(const gsl_spmatrix *m, double *min_out, double *max_out) { double min, max; size_t n; if (m->nz == 0) { GSL_ERROR("matrix is empty", GSL_EINVAL); } min = m->data[0]; max = m->data[0]; for (n = 1; n < m->nz; ++n) { double x = m->data[n]; if (x < min) min = x; if (x > max) max = x; } *min_out = min; *max_out = max; return GSL_SUCCESS; } /* gsl_spmatrix_minmax() */ /* gsl_spmatrix_add() Add two sparse matrices Inputs: c - (output) a + b a - (input) sparse matrix b - (input) sparse matrix Return: success or error */ int gsl_spmatrix_add(gsl_spmatrix *c, const gsl_spmatrix *a, const gsl_spmatrix *b) { const size_t M = a->size1; const size_t N = a->size2; if (b->size1 != M || b->size2 != N || c->size1 != M || c->size2 != N) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else if (a->sptype != b->sptype || a->sptype != c->sptype) { GSL_ERROR("matrices must have same sparse storage format", GSL_EINVAL); } else if (GSL_SPMATRIX_ISTRIPLET(a)) { GSL_ERROR("triplet format not yet supported", GSL_EINVAL); } else { int status = GSL_SUCCESS; size_t *w = (size_t *) a->work; double *x = (double *) b->work; size_t *Cp, *Ci; double *Cd; size_t j, p; size_t nz = 0; /* number of non-zeros in c */ size_t inner_size, outer_size; if (GSL_SPMATRIX_ISCCS(a)) { inner_size = M; outer_size = N; } else if (GSL_SPMATRIX_ISCRS(a)) { inner_size = N; outer_size = M; } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } if (c->nzmax < a->nz + b->nz) { status = gsl_spmatrix_realloc(a->nz + b->nz, c); if (status) return status; } /* initialize w = 0 */ for (j = 0; j < inner_size; ++j) w[j] = 0; Ci = c->i; Cp = c->p; Cd = c->data; for (j = 0; j < outer_size; ++j) { Cp[j] = nz; /* CCS: x += A(:,j); CRS: x += A(j,:) */ nz = gsl_spblas_scatter(a, j, 1.0, w, x, j + 1, c, nz); /* CCS: x += B(:,j); CRS: x += B(j,:) */ nz = gsl_spblas_scatter(b, j, 1.0, w, x, j + 1, c, nz); for (p = Cp[j]; p < nz; ++p) Cd[p] = x[Ci[p]]; } /* finalize last column of c */ Cp[j] = nz; c->nz = nz; return status; } } /* gsl_spmatrix_add() */ /* gsl_spmatrix_d2sp() Convert a dense gsl_matrix to sparse (triplet) format Inputs: S - (output) sparse matrix in triplet format A - (input) dense matrix to convert */ int gsl_spmatrix_d2sp(gsl_spmatrix *S, const gsl_matrix *A) { int s = GSL_SUCCESS; size_t i, j; gsl_spmatrix_set_zero(S); S->size1 = A->size1; S->size2 = A->size2; for (i = 0; i < A->size1; ++i) { for (j = 0; j < A->size2; ++j) { double x = gsl_matrix_get(A, i, j); if (x != 0.0) gsl_spmatrix_set(S, i, j, x); } } return s; } /* gsl_spmatrix_d2sp() */ /* gsl_spmatrix_sp2d() Convert a sparse matrix to dense format */ int gsl_spmatrix_sp2d(gsl_matrix *A, const gsl_spmatrix *S) { if (A->size1 != S->size1 || A->size2 != S->size2) { GSL_ERROR("matrix sizes do not match", GSL_EBADLEN); } else { gsl_matrix_set_zero(A); if (GSL_SPMATRIX_ISTRIPLET(S)) { size_t n; for (n = 0; n < S->nz; ++n) { size_t i = S->i[n]; size_t j = S->p[n]; double x = S->data[n]; gsl_matrix_set(A, i, j, x); } } else { GSL_ERROR("non-triplet formats not yet supported", GSL_EINVAL); } return GSL_SUCCESS; } } /* gsl_spmatrix_sp2d() */ gsl-doc-2.3/spmatrix/spswap.c0000644000175000017500000001374612736044021014322 0ustar eddedd/* spswap.c * * Copyright (C) 2014 Patrick Alken * Copyright (C) 2016 Alexis Tantet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "avl.c" /* gsl_spmatrix_transpose() Replace the sparse matrix src by its transpose, keeping the matrix in the same storage format Inputs: A - (input/output) sparse matrix to transpose. */ int gsl_spmatrix_transpose(gsl_spmatrix * m) { if (GSL_SPMATRIX_ISTRIPLET(m)) { size_t n; /* swap row/column indices */ for (n = 0; n < m->nz; ++n) { size_t tmp = m->p[n]; m->p[n] = m->i[n]; m->i[n] = tmp; } /* need to rebuild AVL tree, or element searches won't * work correctly with transposed indices */ gsl_spmatrix_tree_rebuild(m); } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } /* swap dimensions */ if (m->size1 != m->size2) { size_t tmp = m->size1; m->size1 = m->size2; m->size2 = tmp; } return GSL_SUCCESS; } /* gsl_spmatrix_transpose2() Replace the sparse matrix src by its transpose either by swapping its row and column indices if it is in triplet storage, or by switching its major if it is in compressed storage. Inputs: A - (input/output) sparse matrix to transpose. */ int gsl_spmatrix_transpose2(gsl_spmatrix * m) { if (GSL_SPMATRIX_ISTRIPLET(m)) { return gsl_spmatrix_transpose(m); } else if (GSL_SPMATRIX_ISCCS(m)) { m->sptype = GSL_SPMATRIX_CRS; } else if (GSL_SPMATRIX_ISCRS(m)) { m->sptype = GSL_SPMATRIX_CCS; } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } /* swap dimensions */ if (m->size1 != m->size2) { size_t tmp = m->size1; m->size1 = m->size2; m->size2 = tmp; } return GSL_SUCCESS; } int gsl_spmatrix_transpose_memcpy(gsl_spmatrix *dest, const gsl_spmatrix *src) { const size_t M = src->size1; const size_t N = src->size2; if (M != dest->size2 || N != dest->size1) { GSL_ERROR("dimensions of dest must be transpose of src matrix", GSL_EBADLEN); } else if (dest->sptype != src->sptype) { GSL_ERROR("cannot copy matrices of different storage formats", GSL_EINVAL); } else { int s = GSL_SUCCESS; const size_t nz = src->nz; if (dest->nzmax < src->nz) { s = gsl_spmatrix_realloc(src->nz, dest); if (s) return s; } if (GSL_SPMATRIX_ISTRIPLET(src)) { size_t n; void *ptr; for (n = 0; n < nz; ++n) { dest->i[n] = src->p[n]; dest->p[n] = src->i[n]; dest->data[n] = src->data[n]; /* copy binary tree data */ ptr = avl_insert(dest->tree_data->tree, &dest->data[n]); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } } else if (GSL_SPMATRIX_ISCCS(src)) { size_t *Ai = src->i; size_t *Ap = src->p; double *Ad = src->data; size_t *ATi = dest->i; size_t *ATp = dest->p; double *ATd = dest->data; size_t *w = (size_t *) dest->work; size_t p, j; /* initialize to 0 */ for (p = 0; p < M + 1; ++p) ATp[p] = 0; /* compute row counts of A (= column counts for A^T) */ for (p = 0; p < nz; ++p) ATp[Ai[p]]++; /* compute row pointers for A (= column pointers for A^T) */ gsl_spmatrix_cumsum(M, ATp); /* make copy of row pointers */ for (j = 0; j < M; ++j) w[j] = ATp[j]; for (j = 0; j < N; ++j) { for (p = Ap[j]; p < Ap[j + 1]; ++p) { size_t k = w[Ai[p]]++; ATi[k] = j; ATd[k] = Ad[p]; } } } else if (GSL_SPMATRIX_ISCRS(src)) { size_t *Aj = src->i; size_t *Ap = src->p; double *Ad = src->data; size_t *ATj = dest->i; size_t *ATp = dest->p; double *ATd = dest->data; size_t *w = (size_t *) dest->work; size_t p, i; /* initialize to 0 */ for (p = 0; p < N + 1; ++p) ATp[p] = 0; /* compute column counts of A (= row counts for A^T) */ for (p = 0; p < nz; ++p) ATp[Aj[p]]++; /* compute column pointers for A (= row pointers for A^T) */ gsl_spmatrix_cumsum(N, ATp); /* make copy of column pointers */ for (i = 0; i < N; ++i) w[i] = ATp[i]; for (i = 0; i < M; ++i) { for (p = Ap[i]; p < Ap[i + 1]; ++p) { size_t k = w[Aj[p]]++; ATj[k] = i; ATd[k] = Ad[p]; } } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } dest->nz = nz; return s; } } /* gsl_spmatrix_transpose_memcpy() */ gsl-doc-2.3/spmatrix/avl.c0000644000175000017500000004411112736044021013555 0ustar eddedd/* avl.c * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software * Foundation, Inc. * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 code is originally from GNU libavl. The memory management * was slightly modified for use with preallocating GSL sparse matrices * * The allocator->libavl_malloc function is called only for creating * a new avl_node (tree node). This allows GSL to preallocate some number * of avl_node structs and then return pointers to them while the tree * is being assembled, avoiding multiple malloc calls */ #include #include #include #include /* Function types. */ typedef int avl_comparison_func (const void *avl_a, const void *avl_b, void *avl_param); typedef void avl_item_func (void *avl_item, void *avl_param); typedef void *avl_copy_func (void *avl_item, void *avl_param); /* Memory allocator. */ struct libavl_allocator { void *(*libavl_malloc) (size_t libavl_size, void *param); void (*libavl_free) (void *libavl_block, void *param); }; /* Default memory allocator. */ static struct libavl_allocator avl_allocator_default; static void *avl_malloc (size_t, void *param); static void avl_free (void *, void *param); /* Maximum AVL tree height. */ #ifndef AVL_MAX_HEIGHT #define AVL_MAX_HEIGHT 92 #endif /* An AVL tree node. */ struct avl_node { struct avl_node *avl_link[2]; /* Subtrees. */ void *avl_data; /* Pointer to data. */ signed char avl_balance; /* Balance factor. */ }; /* Tree data structure. */ struct avl_table { struct avl_node *avl_root; /* Tree's root. */ avl_comparison_func *avl_compare; /* Comparison function. */ void *avl_param; /* Extra argument to |avl_compare|. */ struct libavl_allocator *avl_alloc; /* Memory allocator. */ size_t avl_count; /* Number of items in tree. */ unsigned long avl_generation; /* Generation number. */ }; /* Table functions. */ static struct avl_table *avl_create (avl_comparison_func *, void *, struct libavl_allocator *); static struct avl_table *avl_copy (const struct avl_table *, avl_copy_func *, avl_item_func *, struct libavl_allocator *); static void avl_empty (struct avl_table *, avl_item_func *); static void avl_destroy (struct avl_table *, avl_item_func *); static void **avl_probe (struct avl_table *, void *); static void *avl_insert (struct avl_table *, void *); static void *avl_replace (struct avl_table *, void *); static void *avl_delete (struct avl_table *, const void *); static void *avl_find (const struct avl_table *, const void *); /* Creates and returns a new table with comparison function |compare| using parameter |param| and memory allocator |allocator|. Returns |NULL| if memory allocation failed. */ static struct avl_table * avl_create (avl_comparison_func *compare, void *param, struct libavl_allocator *allocator) { struct avl_table *tree; if (allocator == NULL) allocator = &avl_allocator_default; /*tree = allocator->libavl_malloc (allocator, sizeof *tree);*/ tree = malloc(sizeof *tree); if (tree == NULL) return NULL; tree->avl_root = NULL; tree->avl_compare = compare; tree->avl_param = param; tree->avl_alloc = allocator; tree->avl_count = 0; tree->avl_generation = 0; return tree; } /* Search |tree| for an item matching |item|, and return it if found. Otherwise return |NULL|. */ static void * avl_find (const struct avl_table *tree, const void *item) { const struct avl_node *p; for (p = tree->avl_root; p != NULL; ) { int cmp = tree->avl_compare (item, p->avl_data, tree->avl_param); if (cmp < 0) p = p->avl_link[0]; else if (cmp > 0) p = p->avl_link[1]; else /* |cmp == 0| */ return p->avl_data; } return NULL; } /* Inserts |item| into |tree| and returns a pointer to |item|'s address. If a duplicate item is found in the tree, returns a pointer to the duplicate without inserting |item|. Returns |NULL| in case of memory allocation failure. */ static void ** avl_probe (struct avl_table *tree, void *item) { struct avl_node *y, *z; /* Top node to update balance factor, and parent. */ struct avl_node *p, *q; /* Iterator, and parent. */ struct avl_node *n; /* Newly inserted node. */ struct avl_node *w; /* New root of rebalanced subtree. */ int dir; /* Direction to descend. */ unsigned char da[AVL_MAX_HEIGHT]; /* Cached comparison results. */ int k = 0; /* Number of cached results. */ z = (struct avl_node *) &tree->avl_root; y = tree->avl_root; dir = 0; for (q = z, p = y; p != NULL; q = p, p = p->avl_link[dir]) { int cmp = tree->avl_compare (item, p->avl_data, tree->avl_param); if (cmp == 0) return &p->avl_data; if (p->avl_balance != 0) z = q, y = p, k = 0; da[k++] = dir = cmp > 0; } n = q->avl_link[dir] = tree->avl_alloc->libavl_malloc (sizeof *n, tree->avl_param); if (n == NULL) return NULL; tree->avl_count++; n->avl_data = item; n->avl_link[0] = n->avl_link[1] = NULL; n->avl_balance = 0; if (y == NULL) return &n->avl_data; for (p = y, k = 0; p != n; p = p->avl_link[da[k]], k++) if (da[k] == 0) p->avl_balance--; else p->avl_balance++; if (y->avl_balance == -2) { struct avl_node *x = y->avl_link[0]; if (x->avl_balance == -1) { w = x; y->avl_link[0] = x->avl_link[1]; x->avl_link[1] = y; x->avl_balance = y->avl_balance = 0; } else { w = x->avl_link[1]; x->avl_link[1] = w->avl_link[0]; w->avl_link[0] = x; y->avl_link[0] = w->avl_link[1]; w->avl_link[1] = y; if (w->avl_balance == -1) x->avl_balance = 0, y->avl_balance = +1; else if (w->avl_balance == 0) x->avl_balance = y->avl_balance = 0; else /* |w->avl_balance == +1| */ x->avl_balance = -1, y->avl_balance = 0; w->avl_balance = 0; } } else if (y->avl_balance == +2) { struct avl_node *x = y->avl_link[1]; if (x->avl_balance == +1) { w = x; y->avl_link[1] = x->avl_link[0]; x->avl_link[0] = y; x->avl_balance = y->avl_balance = 0; } else { w = x->avl_link[0]; x->avl_link[0] = w->avl_link[1]; w->avl_link[1] = x; y->avl_link[1] = w->avl_link[0]; w->avl_link[0] = y; if (w->avl_balance == +1) x->avl_balance = 0, y->avl_balance = -1; else if (w->avl_balance == 0) x->avl_balance = y->avl_balance = 0; else /* |w->avl_balance == -1| */ x->avl_balance = +1, y->avl_balance = 0; w->avl_balance = 0; } } else return &n->avl_data; z->avl_link[y != z->avl_link[0]] = w; tree->avl_generation++; return &n->avl_data; } /* Inserts |item| into |table|. Returns |NULL| if |item| was successfully inserted or if a memory allocation error occurred. Otherwise, returns the duplicate item. */ static void * avl_insert (struct avl_table *table, void *item) { void **p = avl_probe (table, item); return p == NULL || *p == item ? NULL : *p; } /* Inserts |item| into |table|, replacing any duplicate item. Returns |NULL| if |item| was inserted without replacing a duplicate, or if a memory allocation error occurred. Otherwise, returns the item that was replaced. */ static void * avl_replace (struct avl_table *table, void *item) { void **p = avl_probe (table, item); if (p == NULL || *p == item) return NULL; else { void *r = *p; *p = item; return r; } } /* Deletes from |tree| and returns an item matching |item|. Returns a null pointer if no matching item found. */ static void * avl_delete (struct avl_table *tree, const void *item) { /* Stack of nodes. */ struct avl_node *pa[AVL_MAX_HEIGHT]; /* Nodes. */ unsigned char da[AVL_MAX_HEIGHT]; /* |avl_link[]| indexes. */ int k; /* Stack pointer. */ struct avl_node *p; /* Traverses tree to find node to delete. */ int cmp; /* Result of comparison between |item| and |p|. */ k = 0; p = (struct avl_node *) &tree->avl_root; for (cmp = -1; cmp != 0; cmp = tree->avl_compare (item, p->avl_data, tree->avl_param)) { int dir = cmp > 0; pa[k] = p; da[k++] = dir; p = p->avl_link[dir]; if (p == NULL) return NULL; } item = p->avl_data; if (p->avl_link[1] == NULL) pa[k - 1]->avl_link[da[k - 1]] = p->avl_link[0]; else { struct avl_node *r = p->avl_link[1]; if (r->avl_link[0] == NULL) { r->avl_link[0] = p->avl_link[0]; r->avl_balance = p->avl_balance; pa[k - 1]->avl_link[da[k - 1]] = r; da[k] = 1; pa[k++] = r; } else { struct avl_node *s; int j = k++; for (;;) { da[k] = 0; pa[k++] = r; s = r->avl_link[0]; if (s->avl_link[0] == NULL) break; r = s; } s->avl_link[0] = p->avl_link[0]; r->avl_link[0] = s->avl_link[1]; s->avl_link[1] = p->avl_link[1]; s->avl_balance = p->avl_balance; pa[j - 1]->avl_link[da[j - 1]] = s; da[j] = 1; pa[j] = s; } } tree->avl_alloc->libavl_free (p, tree->avl_param); while (--k > 0) { struct avl_node *y = pa[k]; if (da[k] == 0) { y->avl_balance++; if (y->avl_balance == +1) break; else if (y->avl_balance == +2) { struct avl_node *x = y->avl_link[1]; if (x->avl_balance == -1) { struct avl_node *w; w = x->avl_link[0]; x->avl_link[0] = w->avl_link[1]; w->avl_link[1] = x; y->avl_link[1] = w->avl_link[0]; w->avl_link[0] = y; if (w->avl_balance == +1) x->avl_balance = 0, y->avl_balance = -1; else if (w->avl_balance == 0) x->avl_balance = y->avl_balance = 0; else /* |w->avl_balance == -1| */ x->avl_balance = +1, y->avl_balance = 0; w->avl_balance = 0; pa[k - 1]->avl_link[da[k - 1]] = w; } else { y->avl_link[1] = x->avl_link[0]; x->avl_link[0] = y; pa[k - 1]->avl_link[da[k - 1]] = x; if (x->avl_balance == 0) { x->avl_balance = -1; y->avl_balance = +1; break; } else x->avl_balance = y->avl_balance = 0; } } } else { y->avl_balance--; if (y->avl_balance == -1) break; else if (y->avl_balance == -2) { struct avl_node *x = y->avl_link[0]; if (x->avl_balance == +1) { struct avl_node *w; w = x->avl_link[1]; x->avl_link[1] = w->avl_link[0]; w->avl_link[0] = x; y->avl_link[0] = w->avl_link[1]; w->avl_link[1] = y; if (w->avl_balance == -1) x->avl_balance = 0, y->avl_balance = +1; else if (w->avl_balance == 0) x->avl_balance = y->avl_balance = 0; else /* |w->avl_balance == +1| */ x->avl_balance = -1, y->avl_balance = 0; w->avl_balance = 0; pa[k - 1]->avl_link[da[k - 1]] = w; } else { y->avl_link[0] = x->avl_link[1]; x->avl_link[1] = y; pa[k - 1]->avl_link[da[k - 1]] = x; if (x->avl_balance == 0) { x->avl_balance = +1; y->avl_balance = -1; break; } else x->avl_balance = y->avl_balance = 0; } } } } tree->avl_count--; tree->avl_generation++; return (void *) item; } /* Destroys |new| with |avl_destroy (new, destroy)|, first setting right links of nodes in |stack| within |new| to null pointers to avoid touching uninitialized data. */ static void copy_error_recovery (struct avl_node **stack, int height, struct avl_table *new, avl_item_func *destroy) { for (; height > 2; height -= 2) stack[height - 1]->avl_link[1] = NULL; avl_destroy (new, destroy); } /* Copies |org| to a newly created tree, which is returned. If |copy != NULL|, each data item in |org| is first passed to |copy|, and the return values are inserted into the tree, with |NULL| return values taken as indications of failure. On failure, destroys the partially created new tree, applying |destroy|, if non-null, to each item in the new tree so far, and returns |NULL|. If |allocator != NULL|, it is used for allocation in the new tree. Otherwise, the same allocator used for |org| is used. */ static struct avl_table * avl_copy (const struct avl_table *org, avl_copy_func *copy, avl_item_func *destroy, struct libavl_allocator *allocator) { struct avl_node *stack[2 * (AVL_MAX_HEIGHT + 1)]; int height = 0; struct avl_table *new; const struct avl_node *x; struct avl_node *y; new = avl_create (org->avl_compare, org->avl_param, allocator != NULL ? allocator : org->avl_alloc); if (new == NULL) return NULL; new->avl_count = org->avl_count; if (new->avl_count == 0) return new; x = (const struct avl_node *) &org->avl_root; y = (struct avl_node *) &new->avl_root; for (;;) { while (x->avl_link[0] != NULL) { y->avl_link[0] = new->avl_alloc->libavl_malloc (sizeof *y->avl_link[0], new->avl_param); if (y->avl_link[0] == NULL) { if (y != (struct avl_node *) &new->avl_root) { y->avl_data = NULL; y->avl_link[1] = NULL; } copy_error_recovery (stack, height, new, destroy); return NULL; } stack[height++] = (struct avl_node *) x; stack[height++] = y; x = x->avl_link[0]; y = y->avl_link[0]; } y->avl_link[0] = NULL; for (;;) { y->avl_balance = x->avl_balance; if (copy == NULL) y->avl_data = x->avl_data; else { y->avl_data = copy (x->avl_data, org->avl_param); if (y->avl_data == NULL) { y->avl_link[1] = NULL; copy_error_recovery (stack, height, new, destroy); return NULL; } } if (x->avl_link[1] != NULL) { y->avl_link[1] = new->avl_alloc->libavl_malloc (sizeof *y->avl_link[1], new->avl_param); if (y->avl_link[1] == NULL) { copy_error_recovery (stack, height, new, destroy); return NULL; } x = x->avl_link[1]; y = y->avl_link[1]; break; } else y->avl_link[1] = NULL; if (height <= 2) return new; y = stack[--height]; x = stack[--height]; } } } /* empty tree (delete all nodes) but do not free the tree itself */ static void avl_empty (struct avl_table *tree, avl_item_func *destroy) { struct avl_node *p, *q; for (p = tree->avl_root; p != NULL; p = q) if (p->avl_link[0] == NULL) { q = p->avl_link[1]; if (destroy != NULL && p->avl_data != NULL) destroy (p->avl_data, tree->avl_param); tree->avl_alloc->libavl_free (p, tree->avl_param); } else { q = p->avl_link[0]; p->avl_link[0] = q->avl_link[1]; q->avl_link[1] = p; } tree->avl_root = NULL; tree->avl_count = 0; tree->avl_generation = 0; } /* Frees storage allocated for |tree|. If |destroy != NULL|, applies it to each data item in inorder. */ static void avl_destroy (struct avl_table *tree, avl_item_func *destroy) { avl_empty(tree, destroy); free(tree); } /* Allocates |size| bytes of space using |malloc()|. Returns a null pointer if allocation fails. */ static void * avl_malloc (size_t size, void *param) { (void)param; /* avoid unused parameter warning */ return malloc (size); } /* Frees |block|. */ static void avl_free (void *block, void *param) { (void)param; /* avoid unused parameter warning */ free (block); } /* Default memory allocator that uses |malloc()| and |free()|. */ static struct libavl_allocator avl_allocator_default = { avl_malloc, avl_free }; gsl-doc-2.3/spmatrix/spgetset.c0000644000175000017500000001434012736044021014632 0ustar eddedd/* spgetset.c * * Copyright (C) 2012 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "avl.c" static void *tree_find(const gsl_spmatrix *m, const size_t i, const size_t j); double gsl_spmatrix_get(const gsl_spmatrix *m, const size_t i, const size_t j) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0.0); } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0.0); } else { if (GSL_SPMATRIX_ISTRIPLET(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = tree_find(m, i, j); double x = ptr ? *(double *) ptr : 0.0; return x; } else if (GSL_SPMATRIX_ISCCS(m)) { const size_t *mi = m->i; const size_t *mp = m->p; size_t p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == i) return m->data[p]; } } else if (GSL_SPMATRIX_ISCRS(m)) { const size_t *mj = m->i; const size_t *mp = m->p; size_t p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == j) return m->data[p]; } } else { GSL_ERROR_VAL("unknown sparse matrix type", GSL_EINVAL, 0.0); } /* element not found; return 0 */ return 0.0; } } /* gsl_spmatrix_get() */ /* gsl_spmatrix_set() Add an element to a matrix in triplet form Inputs: m - spmatrix i - row index j - column index x - matrix value */ int gsl_spmatrix_set(gsl_spmatrix *m, const size_t i, const size_t j, const double x) { if (!GSL_SPMATRIX_ISTRIPLET(m)) { GSL_ERROR("matrix not in triplet representation", GSL_EINVAL); } else if (x == 0.0) { /* traverse binary tree to search for (i,j) element */ void *ptr = tree_find(m, i, j); /* * just set the data element to 0; it would be easy to * delete the node from the tree with avl_delete(), but * we'd also have to delete it from the data arrays which * is less simple */ if (ptr != NULL) *(double *) ptr = 0.0; return GSL_SUCCESS; } else { int s = GSL_SUCCESS; void *ptr; /* check if matrix needs to be realloced */ if (m->nz >= m->nzmax) { s = gsl_spmatrix_realloc(2 * m->nzmax, m); if (s) return s; } /* store the triplet (i, j, x) */ m->i[m->nz] = i; m->p[m->nz] = j; m->data[m->nz] = x; ptr = avl_insert(m->tree_data->tree, &m->data[m->nz]); if (ptr != NULL) { /* found duplicate entry (i,j), replace with new x */ *((double *) ptr) = x; } else { /* no duplicate (i,j) found, update indices as needed */ /* increase matrix dimensions if needed */ m->size1 = GSL_MAX(m->size1, i + 1); m->size2 = GSL_MAX(m->size2, j + 1); ++(m->nz); } return s; } } /* gsl_spmatrix_set() */ double * gsl_spmatrix_ptr(gsl_spmatrix *m, const size_t i, const size_t j) { 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); } else { if (GSL_SPMATRIX_ISTRIPLET(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = tree_find(m, i, j); return (double *) ptr; } else if (GSL_SPMATRIX_ISCCS(m)) { const size_t *mi = m->i; const size_t *mp = m->p; size_t p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == i) return &(m->data[p]); } } else if (GSL_SPMATRIX_ISCRS(m)) { const size_t *mj = m->i; const size_t *mp = m->p; size_t p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == j) return &(m->data[p]); } } else { GSL_ERROR_NULL("unknown sparse matrix type", GSL_EINVAL); } /* element not found; return 0 */ return NULL; } } /* gsl_spmatrix_ptr() */ /* tree_find() Find node in tree corresponding to matrix entry (i,j). Adapted from avl_find() Inputs: m - spmatrix i - row index j - column index Return: pointer to tree node data if found, NULL if not found */ static void * tree_find(const gsl_spmatrix *m, const size_t i, const size_t j) { const struct avl_table *tree = (struct avl_table *) m->tree_data->tree; const struct avl_node *p; for (p = tree->avl_root; p != NULL; ) { size_t n = (double *) p->avl_data - m->data; size_t pi = m->i[n]; size_t pj = m->p[n]; int cmp = gsl_spmatrix_compare_idx(i, j, pi, pj); if (cmp < 0) p = p->avl_link[0]; else if (cmp > 0) p = p->avl_link[1]; else /* |cmp == 0| */ return p->avl_data; } return NULL; } /* tree_find() */ gsl-doc-2.3/spmatrix/Makefile.in0000644000175000017500000010534613022372407014705 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = spmatrix DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslspmatrix_la_LIBADD = am_libgslspmatrix_la_OBJECTS = spcompress.lo spcopy.lo spgetset.lo \ spio.lo spmatrix.lo spoper.lo spprop.lo spswap.lo libgslspmatrix_la_OBJECTS = $(am_libgslspmatrix_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslspmatrix.la ../spblas/libgslspblas.la \ ../test/libgsltest.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la \ ../rng/libgslrng.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspmatrix_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspmatrix_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslspmatrix.la pkginclude_HEADERS = gsl_spmatrix.h libgslspmatrix_la_SOURCES = spcompress.c spcopy.c spgetset.c spio.c spmatrix.c spoper.c spprop.c spswap.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = avl.c TESTS = $(check_PROGRAMS) test_LDADD = libgslspmatrix.la ../spblas/libgslspblas.la ../test/libgsltest.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu spmatrix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu spmatrix/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspmatrix.la: $(libgslspmatrix_la_OBJECTS) $(libgslspmatrix_la_DEPENDENCIES) $(EXTRA_libgslspmatrix_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspmatrix_la_OBJECTS) $(libgslspmatrix_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spcompress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spgetset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmatrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spoper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spprop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/spmatrix/spio.c0000644000175000017500000002201413022046215013737 0ustar eddedd/* spio.c * * Copyright (C) 2016 Patrick Alken * Copyright (C) 2016 Alexis Tantet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* gsl_spmatrix_fprintf() Print sparse matrix to file in MatrixMarket format: M N NNZ I1 J1 A(I1,J1) ... Note that indices start at 1 and not 0 */ int gsl_spmatrix_fprintf(FILE *stream, const gsl_spmatrix *m, const char *format) { int status; /* print header */ status = fprintf(stream, "%%%%MatrixMarket matrix coordinate real general\n"); if (status < 0) { GSL_ERROR("fprintf failed for header", GSL_EFAILED); } /* print rows,columns,nnz */ status = fprintf(stream, "%u\t%u\t%u\n", (unsigned int) m->size1, (unsigned int) m->size2, (unsigned int) m->nz); if (status < 0) { GSL_ERROR("fprintf failed for dimension header", GSL_EFAILED); } if (GSL_SPMATRIX_ISTRIPLET(m)) { size_t n; for (n = 0; n < m->nz; ++n) { status = fprintf(stream, "%u\t%u\t", (unsigned int) m->i[n] + 1, (unsigned int) m->p[n] + 1); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[n]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = putc('\n', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } } } else if (GSL_SPMATRIX_ISCCS(m)) { size_t j, p; for (j = 0; j < m->size2; ++j) { for (p = m->p[j]; p < m->p[j + 1]; ++p) { status = fprintf(stream, "%u\t%u\t", (unsigned int) m->i[p] + 1, (unsigned int) j + 1); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[p]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = putc('\n', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } } } } else if (GSL_SPMATRIX_ISCRS(m)) { size_t i, p; for (i = 0; i < m->size1; ++i) { for (p = m->p[i]; p < m->p[i + 1]; ++p) { status = fprintf(stream, "%u\t%u\t", (unsigned int) i + 1, (unsigned int) m->i[p] + 1); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[p]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = putc('\n', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } } } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } gsl_spmatrix * gsl_spmatrix_fscanf(FILE *stream) { gsl_spmatrix *m; unsigned int size1, size2, nz; char buf[1024]; int found_header = 0; /* read file until we find rows,cols,nz header */ while (fgets(buf, 1024, stream) != NULL) { int c; /* skip comments */ if (*buf == '%') continue; c = sscanf(buf, "%u %u %u", &size1, &size2, &nz); if (c == 3) { found_header = 1; break; } } if (!found_header) { GSL_ERROR_NULL ("fscanf failed reading header", GSL_EFAILED); } m = gsl_spmatrix_alloc_nzmax((size_t) size1, (size_t) size2, (size_t) nz, GSL_SPMATRIX_TRIPLET); if (!m) { GSL_ERROR_NULL ("error allocating m", GSL_ENOMEM); } { unsigned int i, j; double val; while (fgets(buf, 1024, stream) != NULL) { int c = sscanf(buf, "%u %u %lg", &i, &j, &val); if (c < 3 || (i == 0) || (j == 0)) { GSL_ERROR_NULL ("error in input file format", GSL_EFAILED); } else if ((i > size1) || (j > size2)) { GSL_ERROR_NULL ("element exceeds matrix dimensions", GSL_EBADLEN); } else { /* subtract 1 from (i,j) since indexing starts at 1 */ gsl_spmatrix_set(m, i - 1, j - 1, val); } } } return m; } int gsl_spmatrix_fwrite(FILE *stream, const gsl_spmatrix *m) { size_t items; /* write header: size1, size2, nz */ items = fwrite(&(m->size1), sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fwrite failed on size1", GSL_EFAILED); } items = fwrite(&(m->size2), sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fwrite failed on size2", GSL_EFAILED); } items = fwrite(&(m->nz), sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fwrite failed on nz", GSL_EFAILED); } /* write m->i and m->data which are size nz in all storage formats */ items = fwrite(m->i, sizeof(size_t), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on row indices", GSL_EFAILED); } items = fwrite(m->data, sizeof(double), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on data", GSL_EFAILED); } if (GSL_SPMATRIX_ISTRIPLET(m)) { items = fwrite(m->p, sizeof(size_t), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCCS(m)) { items = fwrite(m->p, sizeof(size_t), m->size2 + 1, stream); if (items != m->size2 + 1) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCRS(m)) { items = fwrite(m->p, sizeof(size_t), m->size1 + 1, stream); if (items != m->size1 + 1) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } return GSL_SUCCESS; } int gsl_spmatrix_fread(FILE *stream, gsl_spmatrix *m) { size_t size1, size2, nz; size_t items; /* read header: size1, size2, nz */ items = fread(&size1, sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fread failed on size1", GSL_EFAILED); } items = fread(&size2, sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fread failed on size2", GSL_EFAILED); } items = fread(&nz, sizeof(size_t), 1, stream); if (items != 1) { GSL_ERROR("fread failed on nz", GSL_EFAILED); } if (m->size1 != size1) { GSL_ERROR("matrix has wrong size1", GSL_EBADLEN); } else if (m->size2 != size2) { GSL_ERROR("matrix has wrong size2", GSL_EBADLEN); } else if (nz > m->nzmax) { GSL_ERROR("matrix nzmax is too small", GSL_EBADLEN); } else { /* read m->i and m->data arrays, which are size nz for all formats */ items = fread(m->i, sizeof(size_t), nz, stream); if (items != nz) { GSL_ERROR("fread failed on row indices", GSL_EFAILED); } items = fread(m->data, sizeof(double), nz, stream); if (items != nz) { GSL_ERROR("fread failed on data", GSL_EFAILED); } m->nz = nz; if (GSL_SPMATRIX_ISTRIPLET(m)) { items = fread(m->p, sizeof(size_t), nz, stream); if (items != nz) { GSL_ERROR("fread failed on column indices", GSL_EFAILED); } /* build binary search tree for m */ gsl_spmatrix_tree_rebuild(m); } else if (GSL_SPMATRIX_ISCCS(m)) { items = fread(m->p, sizeof(size_t), size2 + 1, stream); if (items != size2 + 1) { GSL_ERROR("fread failed on row pointers", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCRS(m)) { items = fread(m->p, sizeof(size_t), size1 + 1, stream); if (items != size1 + 1) { GSL_ERROR("fread failed on column pointers", GSL_EFAILED); } } } return GSL_SUCCESS; } gsl-doc-2.3/spmatrix/spmatrix.c0000644000175000017500000003020212736044021014636 0ustar eddedd/* spmatrix.c * * Copyright (C) 2012 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "avl.c" static int compare_triplet(const void *pa, const void *pb, void *param); static void *avl_spmalloc (size_t size, void *param); static void avl_spfree (void *block, void *param); static struct libavl_allocator avl_allocator_spmatrix = { avl_spmalloc, avl_spfree }; /* gsl_spmatrix_alloc() Allocate a sparse matrix in triplet representation Inputs: n1 - number of rows n2 - number of columns Notes: if (n1,n2) are not known at allocation time, they can each be set to 1, and they will be expanded as elements are added to the matrix */ gsl_spmatrix * gsl_spmatrix_alloc(const size_t n1, const size_t n2) { const double density = 0.1; /* estimate */ size_t nzmax = (size_t) floor(n1 * n2 * density); if (nzmax == 0) nzmax = 10; return gsl_spmatrix_alloc_nzmax(n1, n2, nzmax, GSL_SPMATRIX_TRIPLET); } /* gsl_spmatrix_alloc() */ /* gsl_spmatrix_alloc_nzmax() Allocate a sparse matrix with given nzmax Inputs: n1 - number of rows n2 - number of columns nzmax - maximum number of matrix elements sptype - type of matrix (triplet, CCS, CRS) Notes: if (n1,n2) are not known at allocation time, they can each be set to 1, and they will be expanded as elements are added to the matrix */ gsl_spmatrix * gsl_spmatrix_alloc_nzmax(const size_t n1, const size_t n2, const size_t nzmax, const size_t sptype) { gsl_spmatrix *m; if (n1 == 0) { GSL_ERROR_NULL ("matrix dimension n1 must be positive integer", GSL_EINVAL); } else if (n2 == 0) { GSL_ERROR_NULL ("matrix dimension n2 must be positive integer", GSL_EINVAL); } m = calloc(1, sizeof(gsl_spmatrix)); if (!m) { GSL_ERROR_NULL("failed to allocate space for spmatrix struct", GSL_ENOMEM); } m->size1 = n1; m->size2 = n2; m->nz = 0; m->nzmax = GSL_MAX(nzmax, 1); m->sptype = sptype; m->i = malloc(m->nzmax * sizeof(size_t)); if (!m->i) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for row indices", GSL_ENOMEM); } if (sptype == GSL_SPMATRIX_TRIPLET) { m->tree_data = malloc(sizeof(gsl_spmatrix_tree)); if (!m->tree_data) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for AVL tree struct", GSL_ENOMEM); } m->tree_data->n = 0; /* allocate tree data structure */ m->tree_data->tree = avl_create(compare_triplet, (void *) m, &avl_allocator_spmatrix); if (!m->tree_data->tree) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for AVL tree", GSL_ENOMEM); } /* preallocate nzmax tree nodes */ m->tree_data->node_array = malloc(m->nzmax * sizeof(struct avl_node)); if (!m->tree_data->node_array) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for AVL tree nodes", GSL_ENOMEM); } m->p = malloc(m->nzmax * sizeof(size_t)); if (!m->p) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for column indices", GSL_ENOMEM); } } else if (sptype == GSL_SPMATRIX_CCS) { m->p = malloc((n2 + 1) * sizeof(size_t)); m->work = malloc(GSL_MAX(n1, n2) * GSL_MAX(sizeof(size_t), sizeof(double))); if (!m->p || !m->work) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for column pointers", GSL_ENOMEM); } } else if (sptype == GSL_SPMATRIX_CRS) { m->p = malloc((n1 + 1) * sizeof(size_t)); m->work = malloc(GSL_MAX(n1, n2) * GSL_MAX(sizeof(size_t), sizeof(double))); if (!m->p || !m->work) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for row pointers", GSL_ENOMEM); } } m->data = malloc(m->nzmax * sizeof(double)); if (!m->data) { gsl_spmatrix_free(m); GSL_ERROR_NULL("failed to allocate space for data", GSL_ENOMEM); } return m; } /* gsl_spmatrix_alloc_nzmax() */ /* gsl_spmatrix_free() Free sparse matrix object */ void gsl_spmatrix_free(gsl_spmatrix *m) { if (m->i) free(m->i); if (m->p) free(m->p); if (m->data) free(m->data); if (m->work) free(m->work); if (m->tree_data) { if (m->tree_data->tree) avl_destroy(m->tree_data->tree, NULL); if (m->tree_data->node_array) free(m->tree_data->node_array); free(m->tree_data); } free(m); } /* gsl_spmatrix_free() */ /* gsl_spmatrix_realloc() As elements are added to the sparse matrix, its possible that they will exceed the previously specified nzmax - reallocate the matrix with a new nzmax */ int gsl_spmatrix_realloc(const size_t nzmax, gsl_spmatrix *m) { int s = GSL_SUCCESS; void *ptr; if (nzmax < m->nz) { GSL_ERROR("new nzmax is less than current nz", GSL_EINVAL); } ptr = realloc(m->i, nzmax * sizeof(size_t)); if (!ptr) { GSL_ERROR("failed to allocate space for row indices", GSL_ENOMEM); } m->i = (size_t *) ptr; if (GSL_SPMATRIX_ISTRIPLET(m)) { ptr = realloc(m->p, nzmax * sizeof(size_t)); if (!ptr) { GSL_ERROR("failed to allocate space for column indices", GSL_ENOMEM); } m->p = (size_t *) ptr; } ptr = realloc(m->data, nzmax * sizeof(double)); if (!ptr) { GSL_ERROR("failed to allocate space for data", GSL_ENOMEM); } m->data = (double *) ptr; /* rebuild binary tree */ if (GSL_SPMATRIX_ISTRIPLET(m)) { size_t n; /* reset tree to empty state, but don't free root tree ptr */ avl_empty(m->tree_data->tree, NULL); m->tree_data->n = 0; ptr = realloc(m->tree_data->node_array, nzmax * sizeof(struct avl_node)); if (!ptr) { GSL_ERROR("failed to allocate space for AVL tree nodes", GSL_ENOMEM); } m->tree_data->node_array = ptr; /* * need to reinsert all tree elements since the m->data addresses * have changed */ for (n = 0; n < m->nz; ++n) { ptr = avl_insert(m->tree_data->tree, &m->data[n]); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } } /* update to new nzmax */ m->nzmax = nzmax; return s; } /* gsl_spmatrix_realloc() */ int gsl_spmatrix_set_zero(gsl_spmatrix *m) { m->nz = 0; if (GSL_SPMATRIX_ISTRIPLET(m)) { /* reset tree to empty state and node index pointer to 0 */ avl_empty(m->tree_data->tree, NULL); m->tree_data->n = 0; } return GSL_SUCCESS; } /* gsl_spmatrix_set_zero() */ size_t gsl_spmatrix_nnz(const gsl_spmatrix *m) { return m->nz; } /* gsl_spmatrix_nnz() */ /* gsl_spmatrix_compare_idx() Comparison function for searching binary tree in triplet representation. To detect duplicate elements in the tree, we want to determine if there already exists an entry for (i,j) in the tree. Since the actual tree node stores only the data elements data[n], we will do pointer arithmetic to get from the given data[n] to the row/column indices i[n] and j[n]. This compare function will sort the tree first by row i, and for equal rows, it will then sort by column j Inputs: ia - row index of element a ja - column index of element a ib - row index of element b jb - column index of element b Return: -1 if pa < pb: (ia,ja) < (ib,jb) +1 if pa > pb: (ia,ja) > (ib,jb) 0 if pa = pb: (ia,ja) == (ib,jb) */ int gsl_spmatrix_compare_idx(const size_t ia, const size_t ja, const size_t ib, const size_t jb) { if (ia < ib) return -1; else if (ia > ib) return 1; else { /* row indices are equal, sort by column index */ if (ja < jb) return -1; else if (ja > jb) return 1; else return 0; /* row and column indices are equal */ } } /* gsl_spmatrix_tree_rebuild() When reading a triplet matrix from disk, or when copying a triplet matrix, it is necessary to rebuild the binary tree for element searches. Inputs: m - triplet matrix */ int gsl_spmatrix_tree_rebuild(gsl_spmatrix * m) { if (!GSL_SPMATRIX_ISTRIPLET(m)) { GSL_ERROR("m must be in triplet format", GSL_EINVAL); } else { size_t n; /* reset tree to empty state, but don't free root tree ptr */ avl_empty(m->tree_data->tree, NULL); m->tree_data->n = 0; /* insert all tree elements */ for (n = 0; n < m->nz; ++n) { void *ptr = avl_insert(m->tree_data->tree, &m->data[n]); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } return GSL_SUCCESS; } } /* compare_triplet() Comparison function for searching binary tree in triplet representation. To detect duplicate elements in the tree, we want to determine if there already exists an entry for (i,j) in the tree. Since the actual tree node stores only the data elements data[n], we will do pointer arithmetic to get from the given data[n] to the row/column indices i[n] and j[n]. This compare function will sort the tree first by row i, and for equal rows, it will then sort by column j Inputs: pa - element 1 for comparison (double *) pb - element 2 for comparison (double *) param - parameter (gsl_spmatrix) Return: -1 if pa < pb: (ia,ja) < (ib,jb) +1 if pa > pb: (ia,ja) > (ib,jb) 0 if pa = pb: (ia,ja) == (ib,jb) */ static int compare_triplet(const void *pa, const void *pb, void *param) { gsl_spmatrix *m = (gsl_spmatrix *) param; /* pointer arithmetic to find indices in data array */ const size_t idxa = (const double *) pa - m->data; const size_t idxb = (const double *) pb - m->data; return gsl_spmatrix_compare_idx(m->i[idxa], m->p[idxa], m->i[idxb], m->p[idxb]); } /* compare_triplet() */ static void * avl_spmalloc (size_t size, void *param) { gsl_spmatrix *m = (gsl_spmatrix *) param; if (size != sizeof(struct avl_node)) { GSL_ERROR_NULL("attemping to allocate incorrect node size", GSL_EBADLEN); } /* * return the next available avl_node slot; index * m->tree_data->n keeps track of next open slot */ if (m->tree_data->n < m->nzmax) { /* cast to char* for pointer arithmetic */ unsigned char *node_ptr = (unsigned char *) m->tree_data->node_array; /* offset in bytes for next node slot */ size_t offset = (m->tree_data->n)++ * sizeof(struct avl_node); return node_ptr + offset; } else { /* * we should never get here - gsl_spmatrix_realloc() should * be called before exceeding nzmax nodes */ GSL_ERROR_NULL("attemping to allocate tree node past nzmax", GSL_EINVAL); } } static void avl_spfree (void *block, void *param) { (void)block; (void)param; /* * do nothing - instead of allocating/freeing individual nodes, * we malloc and free nzmax nodes at a time */ } gsl-doc-2.3/spmatrix/gsl_spmatrix.h0000644000175000017500000001273712736044021015525 0ustar eddedd/* gsl_spmatrix.h * * Copyright (C) 2012-2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_SPMATRIX_H__ #define __GSL_SPMATRIX_H__ #include #include #include #include #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 /* * Binary tree data structure for storing sparse matrix elements * in triplet format. This is used for efficiently detecting * duplicates and element retrieval via gsl_spmatrix_get */ typedef struct { void *tree; /* tree structure */ void *node_array; /* preallocated array of tree nodes */ size_t n; /* number of tree nodes in use (<= nzmax) */ } gsl_spmatrix_tree; /* * Triplet format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CCS): * * If data[n] = A_{ij}, then: * i = A->i[n] * A->p[j] <= n < A->p[j+1] * so that column j is stored in * [ data[p[j]], data[p[j] + 1], ..., data[p[j+1] - 1] ] * * Compressed row format (CRS): * * If data[n] = A_{ij}, then: * j = A->i[n] * A->p[i] <= n < A->p[i+1] * so that row i is stored in * [ data[p[i]], data[p[i] + 1], ..., data[p[i+1] - 1] ] */ typedef struct { size_t size1; /* number of rows */ size_t size2; /* number of columns */ /* i (size nzmax) contains: * * Triplet/CCS: row indices * CRS: column indices */ size_t *i; double *data; /* matrix elements of size nzmax */ /* * p contains the column indices (triplet) or column pointers (compcol) * * triplet: p[n] = column number of element data[n] * CCS: p[j] = index in data of first non-zero element in column j * CRS: p[i] = index in data of first non-zero element in row i */ size_t *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_spmatrix_tree *tree_data; /* binary tree for sorting triplet data */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(double),sizeof(size_t)) * used in various routines */ void *work; size_t sptype; /* sparse storage type */ } gsl_spmatrix; #define GSL_SPMATRIX_TRIPLET (0) #define GSL_SPMATRIX_CCS (1) #define GSL_SPMATRIX_CRS (2) #define GSL_SPMATRIX_ISTRIPLET(m) ((m)->sptype == GSL_SPMATRIX_TRIPLET) #define GSL_SPMATRIX_ISCCS(m) ((m)->sptype == GSL_SPMATRIX_CCS) #define GSL_SPMATRIX_ISCRS(m) ((m)->sptype == GSL_SPMATRIX_CRS) /* * Prototypes */ gsl_spmatrix *gsl_spmatrix_alloc(const size_t n1, const size_t n2); gsl_spmatrix *gsl_spmatrix_alloc_nzmax(const size_t n1, const size_t n2, const size_t nzmax, const size_t flags); void gsl_spmatrix_free(gsl_spmatrix *m); int gsl_spmatrix_realloc(const size_t nzmax, gsl_spmatrix *m); int gsl_spmatrix_set_zero(gsl_spmatrix *m); size_t gsl_spmatrix_nnz(const gsl_spmatrix *m); int gsl_spmatrix_compare_idx(const size_t ia, const size_t ja, const size_t ib, const size_t jb); int gsl_spmatrix_tree_rebuild(gsl_spmatrix * m); /* spcopy.c */ int gsl_spmatrix_memcpy(gsl_spmatrix *dest, const gsl_spmatrix *src); /* spgetset.c */ double gsl_spmatrix_get(const gsl_spmatrix *m, const size_t i, const size_t j); int gsl_spmatrix_set(gsl_spmatrix *m, const size_t i, const size_t j, const double x); double *gsl_spmatrix_ptr(gsl_spmatrix *m, const size_t i, const size_t j); /* spcompress.c */ gsl_spmatrix *gsl_spmatrix_compcol(const gsl_spmatrix *T); gsl_spmatrix *gsl_spmatrix_ccs(const gsl_spmatrix *T); gsl_spmatrix *gsl_spmatrix_crs(const gsl_spmatrix *T); void gsl_spmatrix_cumsum(const size_t n, size_t *c); /* spio.c */ int gsl_spmatrix_fprintf(FILE *stream, const gsl_spmatrix *m, const char *format); gsl_spmatrix * gsl_spmatrix_fscanf(FILE *stream); int gsl_spmatrix_fwrite(FILE *stream, const gsl_spmatrix *m); int gsl_spmatrix_fread(FILE *stream, gsl_spmatrix *m); /* spoper.c */ int gsl_spmatrix_scale(gsl_spmatrix *m, const double x); int gsl_spmatrix_minmax(const gsl_spmatrix *m, double *min_out, double *max_out); int gsl_spmatrix_add(gsl_spmatrix *c, const gsl_spmatrix *a, const gsl_spmatrix *b); int gsl_spmatrix_d2sp(gsl_spmatrix *S, const gsl_matrix *A); int gsl_spmatrix_sp2d(gsl_matrix *A, const gsl_spmatrix *S); /* spprop.c */ int gsl_spmatrix_equal(const gsl_spmatrix *a, const gsl_spmatrix *b); /* spswap.c */ int gsl_spmatrix_transpose(gsl_spmatrix * m); int gsl_spmatrix_transpose2(gsl_spmatrix * m); int gsl_spmatrix_transpose_memcpy(gsl_spmatrix *dest, const gsl_spmatrix *src); __END_DECLS #endif /* __GSL_SPMATRIX_H__ */ gsl-doc-2.3/spmatrix/spcopy.c0000644000175000017500000000552412736044021014315 0ustar eddedd/* spcopy.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "avl.c" int gsl_spmatrix_memcpy(gsl_spmatrix *dest, const gsl_spmatrix *src) { const size_t M = src->size1; const size_t N = src->size2; if (M != dest->size1 || N != dest->size2) { GSL_ERROR("matrix sizes are different", GSL_EBADLEN); } else if (dest->sptype != src->sptype) { GSL_ERROR("cannot copy matrices of different storage formats", GSL_EINVAL); } else { int s = GSL_SUCCESS; size_t n; if (dest->nzmax < src->nz) { s = gsl_spmatrix_realloc(src->nz, dest); if (s) return s; } /* copy indices and data to dest */ if (GSL_SPMATRIX_ISTRIPLET(src)) { void *ptr; for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; dest->p[n] = src->p[n]; dest->data[n] = src->data[n]; /* copy binary tree data */ ptr = avl_insert(dest->tree_data->tree, &dest->data[n]); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } } else if (GSL_SPMATRIX_ISCCS(src)) { for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; dest->data[n] = src->data[n]; } for (n = 0; n < src->size2 + 1; ++n) { dest->p[n] = src->p[n]; } } else if (GSL_SPMATRIX_ISCRS(src)) { for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; dest->data[n] = src->data[n]; } for (n = 0; n < src->size1 + 1; ++n) { dest->p[n] = src->p[n]; } } else { GSL_ERROR("invalid matrix type for src", GSL_EINVAL); } dest->nz = src->nz; return s; } } /* gsl_spmatrix_memcpy() */ gsl-doc-2.3/spmatrix/test.c0000644000175000017500000004565213022045510013756 0ustar eddedd/* test.c * * Copyright (C) 2012-2014, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* create_random_sparse() Create a random sparse matrix with approximately M*N*density non-zero entries Inputs: M - number of rows N - number of columns density - sparse density \in [0,1] 0 = no non-zero entries 1 = all m*n entries are filled r - random number generator Return: pointer to sparse matrix in triplet format (must be freed by caller) Notes: 1) non-zero matrix entries are uniformly distributed in [0,1] */ static gsl_spmatrix * create_random_sparse(const size_t M, const size_t N, const double density, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); gsl_spmatrix *m = gsl_spmatrix_alloc_nzmax(M, N, nnzwanted, GSL_SPMATRIX_TRIPLET); while (gsl_spmatrix_nnz(m) < nnzwanted) { /* generate a random row and column */ size_t i = gsl_rng_uniform(r) * M; size_t j = gsl_rng_uniform(r) * N; /* generate random m_{ij} and add it */ double x = gsl_rng_uniform(r); gsl_spmatrix_set(m, i, j, x); } return m; } /* create_random_sparse() */ static gsl_spmatrix * create_random_sparse_int(const size_t M, const size_t N, const double density, const gsl_rng *r) { const double lower = 1.0; const double upper = 10.0; size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); gsl_spmatrix *m = gsl_spmatrix_alloc_nzmax(M, N, nnzwanted, GSL_SPMATRIX_TRIPLET); while (gsl_spmatrix_nnz(m) < nnzwanted) { /* generate a random row and column */ size_t i = gsl_rng_uniform(r) * M; size_t j = gsl_rng_uniform(r) * N; /* generate random m_{ij} and add it */ int x = (int) (gsl_rng_uniform(r) * (upper - lower) + lower); gsl_spmatrix_set(m, i, j, (double) x); } return m; } static void test_getset(const size_t M, const size_t N, const double density, const gsl_rng *r) { int status; size_t i, j; /* test triplet versions of _get and _set */ { const double val = 0.75; size_t k = 0; gsl_spmatrix *m = gsl_spmatrix_alloc(M, N); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double x = (double) ++k; double y; gsl_spmatrix_set(m, i, j, x); y = gsl_spmatrix_get(m, i, j); if (x != y) status = 1; } } gsl_test(status, "test_getset: M=%zu N=%zu _get != _set", M, N); /* test setting an element to 0 */ gsl_spmatrix_set(m, 0, 0, 1.0); gsl_spmatrix_set(m, 0, 0, 0.0); status = gsl_spmatrix_get(m, 0, 0) != 0.0; gsl_test(status, "test_getset: M=%zu N=%zu m(0,0) = %f", M, N, gsl_spmatrix_get(m, 0, 0)); /* test gsl_spmatrix_set_zero() */ gsl_spmatrix_set(m, 0, 0, 1.0); gsl_spmatrix_set_zero(m); status = gsl_spmatrix_get(m, 0, 0) != 0.0; gsl_test(status, "test_getset: M=%zu N=%zu set_zero m(0,0) = %f", M, N, gsl_spmatrix_get(m, 0, 0)); /* resassemble matrix to ensure nz is calculated correctly */ k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double x = (double) ++k; gsl_spmatrix_set(m, i, j, x); } } status = gsl_spmatrix_nnz(m) != M * N; gsl_test(status, "test_getset: M=%zu N=%zu set_zero nz = %zu", M, N, gsl_spmatrix_nnz(m)); /* test gsl_spmatrix_ptr() */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double mij = gsl_spmatrix_get(m, i, j); double *ptr = gsl_spmatrix_ptr(m, i, j); *ptr += val; if (gsl_spmatrix_get(m, i, j) != mij + val) status = 2; } } gsl_test(status == 2, "test_getset: M=%zu N=%zu triplet ptr", M, N); gsl_spmatrix_free(m); } /* test duplicate values are handled correctly */ { size_t min = GSL_MIN(M, N); size_t expected_nnz = min; size_t nnz; size_t k = 0; gsl_spmatrix *m = gsl_spmatrix_alloc(M, N); status = 0; for (i = 0; i < min; ++i) { for (j = 0; j < 5; ++j) { double x = (double) ++k; double y; gsl_spmatrix_set(m, i, i, x); y = gsl_spmatrix_get(m, i, i); if (x != y) status = 1; } } gsl_test(status, "test_getset: duplicate test M=%zu N=%zu _get != _set", M, N); nnz = gsl_spmatrix_nnz(m); status = nnz != expected_nnz; gsl_test(status, "test_getset: duplicate test M=%zu N=%zu nnz=%zu, expected=%zu", M, N, nnz, expected_nnz); gsl_spmatrix_free(m); } /* test CCS version of gsl_spmatrix_get() */ { const double val = 0.75; gsl_spmatrix *T = create_random_sparse(M, N, density, r); gsl_spmatrix *C = gsl_spmatrix_ccs(T); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Tij = gsl_spmatrix_get(T, i, j); double Cij = gsl_spmatrix_get(C, i, j); double *ptr = gsl_spmatrix_ptr(C, i, j); if (Tij != Cij) status = 1; if (ptr) { *ptr += val; Cij = gsl_spmatrix_get(C, i, j); if (Tij + val != Cij) status = 2; } } } gsl_test(status == 1, "test_getset: M=%zu N=%zu CCS get", M, N); gsl_test(status == 2, "test_getset: M=%zu N=%zu CCS ptr", M, N); gsl_spmatrix_free(T); gsl_spmatrix_free(C); } /* test CRS version of gsl_spmatrix_get() */ { const double val = 0.75; gsl_spmatrix *T = create_random_sparse(M, N, density, r); gsl_spmatrix *C = gsl_spmatrix_crs(T); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Tij = gsl_spmatrix_get(T, i, j); double Cij = gsl_spmatrix_get(C, i, j); double *ptr = gsl_spmatrix_ptr(C, i, j); if (Tij != Cij) status = 1; if (ptr) { *ptr += val; Cij = gsl_spmatrix_get(C, i, j); if (Tij + val != Cij) status = 2; } } } gsl_test(status == 1, "test_getset: M=%zu N=%zu CRS get", M, N); gsl_test(status == 2, "test_getset: M=%zu N=%zu CRS ptr", M, N); gsl_spmatrix_free(T); gsl_spmatrix_free(C); } } /* test_getset() */ static void test_memcpy(const size_t M, const size_t N, const double density, const gsl_rng *r) { int status; { gsl_spmatrix *A = create_random_sparse(M, N, density, r); gsl_spmatrix *A_ccs = gsl_spmatrix_ccs(A); gsl_spmatrix *A_crs = gsl_spmatrix_crs(A); gsl_spmatrix *B_t, *B_ccs, *B_crs; B_t = gsl_spmatrix_alloc(M, N); gsl_spmatrix_memcpy(B_t, A); status = gsl_spmatrix_equal(A, B_t) != 1; gsl_test(status, "test_memcpy: _memcpy M=%zu N=%zu triplet format", M, N); B_ccs = gsl_spmatrix_alloc_nzmax(M, N, A_ccs->nzmax, GSL_SPMATRIX_CCS); B_crs = gsl_spmatrix_alloc_nzmax(M, N, A_ccs->nzmax, GSL_SPMATRIX_CRS); gsl_spmatrix_memcpy(B_ccs, A_ccs); gsl_spmatrix_memcpy(B_crs, A_crs); status = gsl_spmatrix_equal(A_ccs, B_ccs) != 1; gsl_test(status, "test_memcpy: _memcpy M=%zu N=%zu CCS", M, N); status = gsl_spmatrix_equal(A_crs, B_crs) != 1; gsl_test(status, "test_memcpy: _memcpy M=%zu N=%zu CRS", M, N); gsl_spmatrix_free(A); gsl_spmatrix_free(A_ccs); gsl_spmatrix_free(A_crs); gsl_spmatrix_free(B_t); gsl_spmatrix_free(B_ccs); gsl_spmatrix_free(B_crs); } /* test transpose_memcpy */ { gsl_spmatrix *A = create_random_sparse(M, N, density, r); gsl_spmatrix *AT = gsl_spmatrix_alloc(N, M); gsl_spmatrix *B = gsl_spmatrix_ccs(A); gsl_spmatrix *BT = gsl_spmatrix_alloc_nzmax(N, M, 1, GSL_SPMATRIX_CCS); gsl_spmatrix *C = gsl_spmatrix_crs(A); gsl_spmatrix *CT = gsl_spmatrix_alloc_nzmax(N, M, 1, GSL_SPMATRIX_CRS); size_t i, j; gsl_spmatrix_transpose_memcpy(AT, A); gsl_spmatrix_transpose_memcpy(BT, B); gsl_spmatrix_transpose_memcpy(CT, C); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double ATji = gsl_spmatrix_get(AT, j, i); if (Aij != ATji) status = 1; } } gsl_test(status, "test_memcpy: _transpose_memcpy M=%zu N=%zu triplet format", M, N); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double Bij = gsl_spmatrix_get(B, i, j); double BTji = gsl_spmatrix_get(BT, j, i); if ((Bij != BTji) || (Aij != Bij)) status = 1; } } gsl_test(status, "test_memcpy: _transpose_memcpy M=%zu N=%zu CCS format", M, N); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double Cij = gsl_spmatrix_get(C, i, j); double CTji = gsl_spmatrix_get(CT, j, i); if ((Cij != CTji) || (Aij != Cij)) status = 1; } } gsl_test(status, "test_memcpy: _transpose_memcpy M=%zu N=%zu CRS format", M, N); gsl_spmatrix_free(A); gsl_spmatrix_free(AT); gsl_spmatrix_free(B); gsl_spmatrix_free(BT); gsl_spmatrix_free(C); gsl_spmatrix_free(CT); } } /* test_memcpy() */ static void test_transpose(const size_t M, const size_t N, const double density, const gsl_rng *r) { int status; gsl_spmatrix *A = create_random_sparse(M, N, density, r); gsl_spmatrix *AT = gsl_spmatrix_alloc_nzmax(M, N, A->nz, A->sptype); gsl_spmatrix *AT2 = gsl_spmatrix_alloc_nzmax(M, N, A->nz, A->sptype); gsl_spmatrix *AT2_ccs, *AT2_crs; size_t i, j; /* test triplet transpose */ gsl_spmatrix_memcpy(AT, A); gsl_spmatrix_memcpy(AT2, A); gsl_spmatrix_transpose(AT); gsl_spmatrix_transpose2(AT2); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double ATji = gsl_spmatrix_get(AT, j, i); double AT2ji = gsl_spmatrix_get(AT2, j, i); if (Aij != ATji) status = 1; if (Aij != AT2ji) status = 2; } } gsl_test(status == 1, "test_transpose: transpose M=%zu N=%zu triplet format", M, N); gsl_test(status == 2, "test_transpose: transpose2 M=%zu N=%zu triplet format", M, N); /* test CCS transpose */ AT2_ccs = gsl_spmatrix_ccs(A); gsl_spmatrix_transpose2(AT2_ccs); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double AT2ji = gsl_spmatrix_get(AT2_ccs, j, i); if (Aij != AT2ji) status = 2; } } gsl_test(status == 2, "test_transpose: transpose2 M=%zu N=%zu CCS format", M, N); /* test CRS transpose */ AT2_crs = gsl_spmatrix_crs(A); gsl_spmatrix_transpose2(AT2_crs); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double Aij = gsl_spmatrix_get(A, i, j); double AT2ji = gsl_spmatrix_get(AT2_crs, j, i); if (Aij != AT2ji) status = 2; } } gsl_test(status == 2, "test_transpose: transpose2 M=%zu N=%zu CRS format", M, N); gsl_spmatrix_free(A); gsl_spmatrix_free(AT); gsl_spmatrix_free(AT2); gsl_spmatrix_free(AT2_ccs); gsl_spmatrix_free(AT2_crs); } static void test_ops(const size_t M, const size_t N, const double density, const gsl_rng *r) { size_t i, j; int status; /* test gsl_spmatrix_add */ { gsl_spmatrix *A = create_random_sparse(M, N, density, r); gsl_spmatrix *B = create_random_sparse(M, N, density, r); gsl_spmatrix *A_ccs = gsl_spmatrix_ccs(A); gsl_spmatrix *B_ccs = gsl_spmatrix_ccs(B); gsl_spmatrix *C_ccs = gsl_spmatrix_alloc_nzmax(M, N, 1, GSL_SPMATRIX_CCS); gsl_spmatrix *A_crs = gsl_spmatrix_crs(A); gsl_spmatrix *B_crs = gsl_spmatrix_crs(B); gsl_spmatrix *C_crs = gsl_spmatrix_alloc_nzmax(M, N, 1, GSL_SPMATRIX_CRS); gsl_spmatrix_add(C_ccs, A_ccs, B_ccs); gsl_spmatrix_add(C_crs, A_crs, B_crs); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double aij, bij, cij; aij = gsl_spmatrix_get(A_ccs, i, j); bij = gsl_spmatrix_get(B_ccs, i, j); cij = gsl_spmatrix_get(C_ccs, i, j); if (aij + bij != cij) status = 1; aij = gsl_spmatrix_get(A_crs, i, j); bij = gsl_spmatrix_get(B_crs, i, j); cij = gsl_spmatrix_get(C_crs, i, j); if (aij + bij != cij) status = 2; } } gsl_test(status == 1, "test_ops: add M=%zu N=%zu CCS", M, N); gsl_test(status == 2, "test_ops: add M=%zu N=%zu CRS", M, N); gsl_spmatrix_free(A); gsl_spmatrix_free(B); gsl_spmatrix_free(A_ccs); gsl_spmatrix_free(B_ccs); gsl_spmatrix_free(C_ccs); gsl_spmatrix_free(A_crs); gsl_spmatrix_free(B_crs); gsl_spmatrix_free(C_crs); } } /* test_ops() */ static void test_io_ascii(const size_t M, const size_t N, const double density, const gsl_rng *r) { int status; gsl_spmatrix *A = create_random_sparse_int(M, N, density, r); char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif /* test triplet I/O */ { FILE *f = fdopen(fd, "w"); gsl_spmatrix_fprintf(f, A, "%g"); fclose(f); } { FILE *f = fopen(filename, "r"); gsl_spmatrix *B = gsl_spmatrix_fscanf(f); status = gsl_spmatrix_equal(A, B) != 1; gsl_test(status, "test_io_ascii: fprintf/fscanf M=%zu N=%zu triplet format", M, N); fclose(f); gsl_spmatrix_free(B); } /* test CCS I/O */ { FILE *f = fopen(filename, "w"); gsl_spmatrix *A_ccs = gsl_spmatrix_ccs(A); gsl_spmatrix_fprintf(f, A_ccs, "%g"); fclose(f); gsl_spmatrix_free(A_ccs); } { FILE *f = fopen(filename, "r"); gsl_spmatrix *B = gsl_spmatrix_fscanf(f); status = gsl_spmatrix_equal(A, B) != 1; gsl_test(status, "test_io_ascii: fprintf/fscanf M=%zu N=%zu CCS format", M, N); fclose(f); gsl_spmatrix_free(B); } /* test CRS I/O */ { FILE *f = fopen(filename, "w"); gsl_spmatrix *A_crs = gsl_spmatrix_crs(A); gsl_spmatrix_fprintf(f, A_crs, "%g"); fclose(f); gsl_spmatrix_free(A_crs); } { FILE *f = fopen(filename, "r"); gsl_spmatrix *B = gsl_spmatrix_fscanf(f); status = gsl_spmatrix_equal(A, B) != 1; gsl_test(status, "test_io_ascii: fprintf/fscanf M=%zu N=%zu CRS format", M, N); fclose(f); gsl_spmatrix_free(B); } unlink(filename); gsl_spmatrix_free(A); } static void test_io_binary(const size_t M, const size_t N, const double density, const gsl_rng *r) { int status; gsl_spmatrix *A = create_random_sparse(M, N, density, r); gsl_spmatrix *A_ccs, *A_crs; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif /* test triplet I/O */ { FILE *f = fdopen(fd, "wb"); gsl_spmatrix_fwrite(f, A); fclose(f); } { FILE *f = fopen(filename, "rb"); gsl_spmatrix *B = gsl_spmatrix_alloc_nzmax(M, N, A->nz, A->sptype); gsl_spmatrix_fread(f, B); status = gsl_spmatrix_equal(A, B) != 1; gsl_test(status, "test_io_binary: fwrite/fread M=%zu N=%zu triplet format", M, N); fclose(f); gsl_spmatrix_free(B); } /* test CCS I/O */ A_ccs = gsl_spmatrix_ccs(A); { FILE *f = fopen(filename, "wb"); gsl_spmatrix_fwrite(f, A_ccs); fclose(f); } { FILE *f = fopen(filename, "rb"); gsl_spmatrix *B = gsl_spmatrix_alloc_nzmax(M, N, A->nz, GSL_SPMATRIX_CCS); gsl_spmatrix_fread(f, B); status = gsl_spmatrix_equal(A_ccs, B) != 1; gsl_test(status, "test_io_binary: fwrite/fread M=%zu N=%zu CCS format", M, N); fclose(f); gsl_spmatrix_free(B); } /* test CRS I/O */ A_crs = gsl_spmatrix_crs(A); { FILE *f = fopen(filename, "wb"); gsl_spmatrix_fwrite(f, A_crs); fclose(f); } { FILE *f = fopen(filename, "rb"); gsl_spmatrix *B = gsl_spmatrix_alloc_nzmax(M, N, A->nz, GSL_SPMATRIX_CRS); gsl_spmatrix_fread(f, B); status = gsl_spmatrix_equal(A_crs, B) != 1; gsl_test(status, "test_io_binary: fwrite/fread M=%zu N=%zu CRS format", M, N); fclose(f); gsl_spmatrix_free(B); } unlink(filename); gsl_spmatrix_free(A); gsl_spmatrix_free(A_ccs); gsl_spmatrix_free(A_crs); } int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); test_memcpy(10, 10, 0.2, r); test_memcpy(10, 15, 0.3, r); test_memcpy(53, 213, 0.4, r); test_memcpy(920, 2, 0.2, r); test_memcpy(2, 920, 0.3, r); test_getset(20, 20, 0.3, r); test_getset(30, 20, 0.3, r); test_getset(15, 210, 0.3, r); test_transpose(50, 50, 0.5, r); test_transpose(10, 40, 0.3, r); test_transpose(40, 10, 0.3, r); test_transpose(57, 13, 0.2, r); test_ops(20, 20, 0.2, r); test_ops(50, 20, 0.3, r); test_ops(20, 50, 0.3, r); test_ops(76, 43, 0.4, r); test_io_ascii(30, 30, 0.3, r); test_io_ascii(20, 10, 0.2, r); test_io_ascii(10, 20, 0.2, r); test_io_ascii(34, 78, 0.3, r); test_io_binary(50, 50, 0.3, r); test_io_binary(25, 10, 0.2, r); test_io_binary(10, 25, 0.2, r); test_io_binary(101, 253, 0.3, r); gsl_rng_free(r); exit (gsl_test_summary()); } /* main() */ gsl-doc-2.3/matrix/0000755000175000017500000000000013022553153012263 5ustar eddeddgsl-doc-2.3/matrix/oper.c0000664000175000017500000000346012616157443013413 0ustar eddedd#include #include #include #include #include #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 gsl-doc-2.3/matrix/getset_source.c0000664000175000017500000001167612616157443015331 0ustar eddedd/**********************************************************************/ /* 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; } gsl-doc-2.3/matrix/gsl_matrix_char.h0000644000175000017500000003004312737536472015623 0ustar eddedd/* matrix/gsl_matrix_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_char_view gsl_matrix_char_subrow (gsl_matrix_char * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_char_view gsl_matrix_char_subcolumn (gsl_matrix_char * m, const size_t j, const size_t offset, const size_t n); _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_vector_char_const_view gsl_matrix_char_const_subrow (const gsl_matrix_char * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_char_const_view gsl_matrix_char_const_subcolumn (const gsl_matrix_char * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_char * dest, const gsl_matrix_char * src); 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); int gsl_matrix_char_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_char * a, const gsl_matrix_char * b); 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_isnonneg (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 */ INLINE_DECL char gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_char_set(gsl_matrix_char * m, const size_t i, const size_t j, const char x); INLINE_DECL char * gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j); INLINE_DECL const char * gsl_matrix_char_const_ptr(const gsl_matrix_char * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN char gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN char * gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/file_source.c0000664000175000017500000001052612616157443014746 0ustar eddedd/* matrix/file_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 * MULTIPLICITY * 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 * MULTIPLICITY * 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 * MULTIPLICITY * 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 * MULTIPLICITY * tda, size2, 1); if (status) break; } } return status; } #endif gsl-doc-2.3/matrix/test_static.c0000664000175000017500000000015212616157443014767 0ustar eddedd #undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-doc-2.3/matrix/copy.c0000664000175000017500000000336112620204430013400 0ustar eddedd#include #include #include #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 gsl-doc-2.3/matrix/gsl_matrix_ushort.h0000644000175000017500000003121112737536472016230 0ustar eddedd/* matrix/gsl_matrix_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_ushort_view gsl_matrix_ushort_subrow (gsl_matrix_ushort * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_ushort_view gsl_matrix_ushort_subcolumn (gsl_matrix_ushort * m, const size_t j, const size_t offset, const size_t n); _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_vector_ushort_const_view gsl_matrix_ushort_const_subrow (const gsl_matrix_ushort * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_ushort_const_view gsl_matrix_ushort_const_subcolumn (const gsl_matrix_ushort * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_ushort * dest, const gsl_matrix_ushort * src); 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); int gsl_matrix_ushort_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_ushort * a, const gsl_matrix_ushort * b); 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_isnonneg (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 */ INLINE_DECL unsigned short gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_ushort_set(gsl_matrix_ushort * m, const size_t i, const size_t j, const unsigned short x); INLINE_DECL unsigned short * gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j); INLINE_DECL const unsigned short * gsl_matrix_ushort_const_ptr(const gsl_matrix_ushort * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned short gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN unsigned short * gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/matrix.c0000664000175000017500000000031112616157443013742 0ustar eddedd#include #include #include /* Compile all the inline matrix functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/matrix/gsl_matrix_ulong.h0000644000175000017500000003064612737536472016043 0ustar eddedd/* matrix/gsl_matrix_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_ulong_view gsl_matrix_ulong_subrow (gsl_matrix_ulong * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_ulong_view gsl_matrix_ulong_subcolumn (gsl_matrix_ulong * m, const size_t j, const size_t offset, const size_t n); _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_vector_ulong_const_view gsl_matrix_ulong_const_subrow (const gsl_matrix_ulong * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_ulong_const_view gsl_matrix_ulong_const_subcolumn (const gsl_matrix_ulong * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_ulong * dest, const gsl_matrix_ulong * src); 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); int gsl_matrix_ulong_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_ulong * a, const gsl_matrix_ulong * b); 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_isnonneg (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 */ INLINE_DECL unsigned long gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_ulong_set(gsl_matrix_ulong * m, const size_t i, const size_t j, const unsigned long x); INLINE_DECL unsigned long * gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j); INLINE_DECL const unsigned long * gsl_matrix_ulong_const_ptr(const gsl_matrix_ulong * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned long gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN unsigned long * gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_float.h0000644000175000017500000003040612737536472016016 0ustar eddedd/* matrix/gsl_matrix_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_float_view gsl_matrix_float_subrow (gsl_matrix_float * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_float_view gsl_matrix_float_subcolumn (gsl_matrix_float * m, const size_t j, const size_t offset, const size_t n); _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_vector_float_const_view gsl_matrix_float_const_subrow (const gsl_matrix_float * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_float_const_view gsl_matrix_float_const_subcolumn (const gsl_matrix_float * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_float * dest, const gsl_matrix_float * src); 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); int gsl_matrix_float_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_float * a, const gsl_matrix_float * b); 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_isnonneg (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 */ INLINE_DECL float gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_float_set(gsl_matrix_float * m, const size_t i, const size_t j, const float x); INLINE_DECL float * gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j); INLINE_DECL const float * gsl_matrix_float_const_ptr(const gsl_matrix_float * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN float gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN float * gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/Makefile.am0000664000175000017500000000246512616157443014342 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 = 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 gsl-doc-2.3/matrix/gsl_matrix_complex_float.h0000664000175000017500000003337412757056471017554 0ustar eddedd/* matrix/gsl_matrix_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_complex_float_view gsl_matrix_complex_float_subrow (gsl_matrix_complex_float * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_float_view gsl_matrix_complex_float_subcolumn (gsl_matrix_complex_float * m, const size_t j, const size_t offset, const size_t n); _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_vector_complex_float_const_view gsl_matrix_complex_float_const_subrow (const gsl_matrix_complex_float * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_float_const_view gsl_matrix_complex_float_const_subcolumn (const gsl_matrix_complex_float * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex_float * dest, const gsl_matrix_complex_float * src); 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_transpose_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex_float * dest, const gsl_matrix_complex_float * src); int gsl_matrix_complex_float_equal (const gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); 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_isnonneg (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); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL gsl_complex_float gsl_matrix_complex_float_get(const gsl_matrix_complex_float * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_complex_float_set(gsl_matrix_complex_float * m, const size_t i, const size_t j, const gsl_complex_float x); INLINE_DECL gsl_complex_float * gsl_matrix_complex_float_ptr(gsl_matrix_complex_float * m, const size_t i, const size_t j); INLINE_DECL const gsl_complex_float * gsl_matrix_complex_float_const_ptr(const gsl_matrix_complex_float * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN 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 if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_long.h0000644000175000017500000003004312737536472015645 0ustar eddedd/* matrix/gsl_matrix_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_long_view gsl_matrix_long_subrow (gsl_matrix_long * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_long_view gsl_matrix_long_subcolumn (gsl_matrix_long * m, const size_t j, const size_t offset, const size_t n); _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_vector_long_const_view gsl_matrix_long_const_subrow (const gsl_matrix_long * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_long_const_view gsl_matrix_long_const_subcolumn (const gsl_matrix_long * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_long * dest, const gsl_matrix_long * src); 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); int gsl_matrix_long_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_long * a, const gsl_matrix_long * b); 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_isnonneg (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 */ INLINE_DECL long gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_long_set(gsl_matrix_long * m, const size_t i, const size_t j, const long x); INLINE_DECL long * gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j); INLINE_DECL const long * gsl_matrix_long_const_ptr(const gsl_matrix_long * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN long gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN long * gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/swap_source.c0000644000175000017500000001617112737536472015010 0ustar eddedd/* matrix/swap_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } int FUNCTION (gsl_matrix, transpose_tricpy) (const char uplo_src, const int copy_diag, 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, k; if (uplo_src == 'L') { /* copy lower triangle of src to upper triangle of dest */ for (i = 0; i < src_size1 ; i++) { for (j = 0; j < i; j++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (j * dest_tda + i) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + j) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } else if (uplo_src == 'U') { /* copy upper triangle of src to lower triangle of dest */ for (i = 0; i < src_size1 ; i++) { for (j = i + 1; j < src_size2; j++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (j * dest_tda + i) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + j) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } else { GSL_ERROR ("invalid uplo_src parameter", GSL_EINVAL); } if (copy_diag) { for (i = 0; i < src_size1 ; i++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (i * dest_tda + i) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + i) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } return GSL_SUCCESS; } gsl-doc-2.3/matrix/prop_source.c0000664000175000017500000000715612616157443015014 0ustar eddedd/* matrix/prop_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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, equal) (const 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_VAL ("matrices must have same dimensions", GSL_EBADLEN, 0); } else { const size_t tda_a = a->tda; const size_t tda_b = b->tda; size_t i, j, k; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { for (k = 0; k < MULTIPLICITY; k++) { if (a->data[(i * tda_a + j) * MULTIPLICITY + k] != b->data[(i * tda_b + j) * MULTIPLICITY + k]) { return 0; } } } } } return 1; } 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; } int FUNCTION (gsl_matrix, isnonneg) (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; } gsl-doc-2.3/matrix/file.c0000664000175000017500000000341512616157443013365 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/matrix/minmax_source.c0000664000175000017500000001256512616157443015325 0ustar eddedd/* matrix/minmax_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/matrix/view_source.c0000664000175000017500000001570312616157443015003 0ustar eddedd/* matrix/view_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 */ gsl-doc-2.3/matrix/TODO0000664000175000017500000000055412616157443012773 0ustar eddedd# -*- org -*- #+CATEGORY: matrix * Tests for subrowcol * 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 gsl-doc-2.3/matrix/view.h0000664000175000017500000000024512616157443013423 0ustar eddedd#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}} gsl-doc-2.3/matrix/swap.c0000664000175000017500000000341512616157443013420 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/matrix/gsl_matrix_complex_long_double.h0000664000175000017500000003602212757056527020733 0ustar eddedd/* matrix/gsl_matrix_complex_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_complex_long_double_view gsl_matrix_complex_long_double_subrow (gsl_matrix_complex_long_double * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_long_double_view gsl_matrix_complex_long_double_subcolumn (gsl_matrix_complex_long_double * m, const size_t j, const size_t offset, const size_t n); _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_vector_complex_long_double_const_view gsl_matrix_complex_long_double_const_subrow (const gsl_matrix_complex_long_double * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_long_double_const_view gsl_matrix_complex_long_double_const_subcolumn (const gsl_matrix_complex_long_double * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex_long_double * dest, const gsl_matrix_complex_long_double * src); 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_transpose_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex_long_double * dest, const gsl_matrix_complex_long_double * src); int gsl_matrix_complex_long_double_equal (const gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); 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_isnonneg (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); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL 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); INLINE_DECL 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); INLINE_DECL gsl_complex_long_double * gsl_matrix_complex_long_double_ptr(gsl_matrix_complex_long_double * m, const size_t i, const size_t j); INLINE_DECL 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); #ifdef HAVE_INLINE INLINE_FUN 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 if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_int.h0000644000175000017500000002750012737536472015504 0ustar eddedd/* matrix/gsl_matrix_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_int_view gsl_matrix_int_subrow (gsl_matrix_int * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_int_view gsl_matrix_int_subcolumn (gsl_matrix_int * m, const size_t j, const size_t offset, const size_t n); _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_vector_int_const_view gsl_matrix_int_const_subrow (const gsl_matrix_int * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_int_const_view gsl_matrix_int_const_subcolumn (const gsl_matrix_int * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_int * dest, const gsl_matrix_int * src); 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_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_int * a, const gsl_matrix_int * b); 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_isnonneg (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 */ INLINE_DECL int gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_int_set(gsl_matrix_int * m, const size_t i, const size_t j, const int x); INLINE_DECL int * gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j); INLINE_DECL const int * gsl_matrix_int_const_ptr(const gsl_matrix_int * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN int gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN int * gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_double.h0000644000175000017500000002614312737536472016166 0ustar eddedd/* matrix/gsl_matrix_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_view gsl_matrix_subrow (gsl_matrix * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_view gsl_matrix_subcolumn (gsl_matrix * m, const size_t j, const size_t offset, const size_t n); _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_vector_const_view gsl_matrix_const_subrow (const gsl_matrix * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_const_view gsl_matrix_const_subcolumn (const gsl_matrix * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix * dest, const gsl_matrix * src); 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); int gsl_matrix_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix * a, const gsl_matrix * b); 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_isnonneg (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 */ INLINE_DECL double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x); INLINE_DECL double * gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j); INLINE_DECL const double * gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN double * gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN const double * gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_complex_double.h0000664000175000017500000003105412757056527017714 0ustar eddedd/* matrix/gsl_matrix_complex_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_complex_view gsl_matrix_complex_subrow (gsl_matrix_complex * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_view gsl_matrix_complex_subcolumn (gsl_matrix_complex * m, const size_t j, const size_t offset, const size_t n); _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_vector_complex_const_view gsl_matrix_complex_const_subrow (const gsl_matrix_complex * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_complex_const_view gsl_matrix_complex_const_subcolumn (const gsl_matrix_complex * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex * dest, const gsl_matrix_complex * src); 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_transpose_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_complex * dest, const gsl_matrix_complex * src); int gsl_matrix_complex_equal (const gsl_matrix_complex * a, const gsl_matrix_complex * b); 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_isnonneg (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); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL gsl_complex gsl_matrix_complex_get(const gsl_matrix_complex * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_complex_set(gsl_matrix_complex * m, const size_t i, const size_t j, const gsl_complex x); INLINE_DECL gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex * m, const size_t i, const size_t j); INLINE_DECL const gsl_complex * gsl_matrix_complex_const_ptr(const gsl_matrix_complex * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN gsl_complex gsl_matrix_complex_get(const gsl_matrix_complex * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/test_source.c0000664000175000017500000005470112616157443015011 0ustar eddedd/* matrix/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 M, const size_t N); void FUNCTION (test, ops) (const size_t M, const size_t N); void FUNCTION (test, trap) (const size_t M, const size_t N); void FUNCTION (test, text) (const size_t M, const size_t N); void FUNCTION (test, binary) (const size_t M, const size_t N); void FUNCTION (test, binary_noncontiguous) (const size_t M, const size_t N); #define TEST(expr,desc) gsl_test((expr), NAME(gsl_matrix) desc " M=%d, N=%d", M, N) void FUNCTION (test, func) (const size_t M, const size_t N) { 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"); status = (FUNCTION(gsl_matrix,isnonneg)(m) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 1); TEST (status, "_isnonneg" DESC " on non-negative matrix") ; } #ifndef UNSIGNED k = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { ATOMIC mij = ((++k) % 10) - (ATOMIC) 5; FUNCTION (gsl_matrix, set) (m, i, j, mij); } } { 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 0); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 0); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_matrix,isnonneg)(m) != 0); TEST (status, "_isnonneg" DESC " on negative matrix") ; } #endif FUNCTION (gsl_matrix, free) (m); FUNCTION (gsl_vector, free) (v); } void FUNCTION (test, ops) (const size_t M, const size_t N) { size_t i, j; TYPE (gsl_matrix) * a = FUNCTION (gsl_matrix, calloc) (M, N); TYPE (gsl_matrix) * b = FUNCTION (gsl_matrix, calloc) (M, N); TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (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)); } } { int status = (FUNCTION(gsl_matrix,equal) (a,b) != 0); gsl_test (status, NAME (gsl_matrix) "_equal matrix unequal"); } FUNCTION (gsl_matrix, memcpy) (m, a); { int status = (FUNCTION(gsl_matrix,equal) (a,m) != 1); gsl_test (status, NAME (gsl_matrix) "_equal matrix equal"); } 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, memcpy) (m, a); FUNCTION(gsl_matrix, scale) (m, 2.0); { 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); if (r != (ATOMIC)(2*x)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_scale"); } FUNCTION(gsl_matrix, memcpy) (m, a); FUNCTION(gsl_matrix, add_constant) (m, 3.0); { 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 = x + 3.0; if (fabs(r - y) > 2 * GSL_FLT_EPSILON * fabs(y)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_add_constant"); } FUNCTION(gsl_matrix, memcpy) (m, a); FUNCTION(gsl_matrix, add_diagonal) (m, 5.0); { 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 = (i == j) ? (x + (ATOMIC) 5.0) : x; if (fabs(r - y) > 2 * GSL_FLT_EPSILON * fabs(y)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_add_diagonal"); } FUNCTION(gsl_matrix, swap) (a, b); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE x = FUNCTION(gsl_matrix,get) (a,i,j); BASE y = FUNCTION(gsl_matrix,get) (b,i,j); if (y != (BASE)(3 + i + 5 * j) || x != (BASE)(3 + 2 * i + 4 * j)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_swap"); } FUNCTION(gsl_matrix, free) (a); FUNCTION(gsl_matrix, free) (b); FUNCTION(gsl_matrix, free) (m); } #if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE) void FUNCTION (test, text) (const size_t M, const size_t N) { TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; int k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen(fd, "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 (filename, "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); } unlink(filename); FUNCTION (gsl_matrix, free) (m); } #endif void FUNCTION (test, binary) (const size_t M, const size_t N) { TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, calloc) (M, N); size_t i, j; size_t k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen(fd, "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 (filename, "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); } unlink(filename); FUNCTION (gsl_matrix, free) (m); } void FUNCTION (test, binary_noncontiguous) (const size_t M, const size_t N) { TYPE (gsl_matrix) * l = FUNCTION (gsl_matrix, calloc) (M+1, N+1); VIEW (gsl_matrix, view) m = FUNCTION (gsl_matrix, submatrix) (l, 0, 0, M, N); size_t i, j; size_t k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen(fd, "wb"); k = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { k++; FUNCTION (gsl_matrix, set) (&m.matrix, i, j, (BASE) k); } } FUNCTION (gsl_matrix, fwrite) (f, &m.matrix); fclose (f); } { FILE *f = fopen (filename, "rb"); TYPE (gsl_matrix) * ll = FUNCTION (gsl_matrix, alloc) (M+1, N+1); VIEW (gsl_matrix, view) mm = FUNCTION (gsl_matrix, submatrix) (ll, 0, 0, M, N); status = 0; FUNCTION (gsl_matrix, fread) (f, &mm.matrix); k = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { k++; if (FUNCTION (gsl_matrix, get) (&mm.matrix, i, j) != (BASE) k) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_write and read (noncontiguous)"); fclose (f); FUNCTION (gsl_matrix, free) (ll); } unlink(filename); FUNCTION (gsl_matrix, free) (l); } void FUNCTION (test, trap) (const size_t M, const size_t N) { 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); } gsl-doc-2.3/matrix/getset.c0000664000175000017500000000345112616157443013741 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/matrix/gsl_matrix.h0000664000175000017500000000112612616157443014621 0ustar eddedd#ifndef __GSL_MATRIX_H__ #define __GSL_MATRIX_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_MATRIX_H__ */ gsl-doc-2.3/matrix/rowcol_source.c0000664000175000017500000001157412616157443015340 0ustar eddedd/* matrix/rowcol_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } QUALIFIED_VIEW(_gsl_vector,view) FUNCTION (gsl_matrix, subrow) (QUALIFIED_TYPE(gsl_matrix) * m, const size_t i, const size_t offset, const size_t n) { 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); } else if (n == 0) { GSL_ERROR_VAL ("vector length n must be positive integer", GSL_EINVAL, view); } else if (offset + n > m->size2) { GSL_ERROR_VAL ("dimension n overflows matrix", GSL_EINVAL, view); } { TYPE(gsl_vector) v = NULL_VECTOR; v.data = m->data + MULTIPLICITY * (i * m->tda + offset); v.size = n; v.stride = 1; v.block = m->block; v.owner = 0; view.vector = v; return view; } } QUALIFIED_VIEW(_gsl_vector,view) FUNCTION (gsl_matrix, subcolumn) (QUALIFIED_TYPE(gsl_matrix) * m, const size_t j, const size_t offset, const size_t n) { 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); } else if (n == 0) { GSL_ERROR_VAL ("vector length n must be positive integer", GSL_EINVAL, view); } else if (offset + n > m->size1) { GSL_ERROR_VAL ("dimension n overflows matrix", GSL_EINVAL, view); } { TYPE(gsl_vector) v = NULL_VECTOR; v.data = m->data + MULTIPLICITY * (offset * m->tda + j); v.size = n; v.stride = m->tda; v.block = m->block; v.owner = 0; view.vector = v; return view; } } gsl-doc-2.3/matrix/init_source.c0000664000175000017500000001377412616157443015002 0ustar eddedd/* matrix/init_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 */ memset(m->data, 0, MULTIPLICITY * n1 * n2 * sizeof(ATOMIC)); 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) { RETURN_IF_NULL (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; } } } gsl-doc-2.3/matrix/init.c0000664000175000017500000000340512616157443013410 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/matrix/oper_complex_source.c0000664000175000017500000001315212616157443016521 0ustar eddedd/* matrix/oper_complex_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/matrix/gsl_matrix_uchar.h0000644000175000017500000003064612737536472016021 0ustar eddedd/* matrix/gsl_matrix_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_uchar_view gsl_matrix_uchar_subrow (gsl_matrix_uchar * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_uchar_view gsl_matrix_uchar_subcolumn (gsl_matrix_uchar * m, const size_t j, const size_t offset, const size_t n); _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_vector_uchar_const_view gsl_matrix_uchar_const_subrow (const gsl_matrix_uchar * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_uchar_const_view gsl_matrix_uchar_const_subcolumn (const gsl_matrix_uchar * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_uchar * dest, const gsl_matrix_uchar * src); 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); int gsl_matrix_uchar_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_uchar * a, const gsl_matrix_uchar * b); 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_isnonneg (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 */ INLINE_DECL unsigned char gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_uchar_set(gsl_matrix_uchar * m, const size_t i, const size_t j, const unsigned char x); INLINE_DECL unsigned char * gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j); INLINE_DECL const unsigned char * gsl_matrix_uchar_const_ptr(const gsl_matrix_uchar * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned char gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN unsigned char * gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/prop.c0000664000175000017500000000336112616157443013426 0ustar eddedd#include #include #include #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 gsl-doc-2.3/matrix/gsl_matrix_short.h0000644000175000017500000003040612737536472016050 0ustar eddedd/* matrix/gsl_matrix_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_short_view gsl_matrix_short_subrow (gsl_matrix_short * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_short_view gsl_matrix_short_subcolumn (gsl_matrix_short * m, const size_t j, const size_t offset, const size_t n); _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_vector_short_const_view gsl_matrix_short_const_subrow (const gsl_matrix_short * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_short_const_view gsl_matrix_short_const_subcolumn (const gsl_matrix_short * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_short * dest, const gsl_matrix_short * src); 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); int gsl_matrix_short_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_short * a, const gsl_matrix_short * b); 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_isnonneg (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 */ INLINE_DECL short gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_short_set(gsl_matrix_short * m, const size_t i, const size_t j, const short x); INLINE_DECL short * gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j); INLINE_DECL const short * gsl_matrix_short_const_ptr(const gsl_matrix_short * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN short gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN short * gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/Makefile.in0000644000175000017500000011115513022372405014333 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) DIST_SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 = 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu matrix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmatrix.la: $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_DEPENDENCIES) $(EXTRA_libgslmatrix_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES) $(EXTRA_test_static_DEPENDENCIES) @rm -f test_static$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rowcol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submatrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_static.log: test_static$(EXEEXT) @p='test_static$(EXEEXT)'; \ b='test_static'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/matrix/ChangeLog0000664000175000017500000001707712616157443014065 0ustar eddedd2011-10-16 Rhys Ulerich * file_source.c: applied patch provided by Matthias Sitte which repairs failing binary_noncontiguous tests for complex-valued matrices 2011-10-16 Rhys Ulerich * test_source.c: added binary_noncontiguous test template * test_complex_source.c: added binary_noncontiguous test template * test.c: now running binary_noncontiguous 2010-04-07 Brian Gough * prop_source.c (FUNCTION): added a function to test if two matrices are equal 2009-07-09 Brian Gough * init_source.c (FUNCTION): handle NULL argument in free 2008-07-03 Brian Gough * matrix.c: compile all the inline matrix functions from header * gsl_matrix.h and all related files: use new inline declarations * Makefile.am (INCLUDES): use top_srcdir, remove top_builddir (noinst_HEADERS): remove matrix_source.c 2007-08-21 Brian Gough * prop_source.c (FUNCTION): added gsl_matrix_isnonneg 2007-02-17 Brian Gough * test_source.c (FUNCTION): avoid running negative value tests on char, because it can be unsigned. 2007-01-26 Brian Gough * minmax_source.c: added support for NaNs 2006-10-31 Brian Gough * prop_source.c (FUNCTION): added functions gsl_matrix_ispos, gsl_matrix_isneg 2003-01-01 Brian Gough * 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 * Makefile.am: added libgslsys.a to link, to provide gsl_hypot for complex division Mon Jun 17 22:31:33 2002 Brian Gough * test_complex_source.c (FUNCTION): fixed non-constant initializer Wed May 1 21:33:44 2002 Brian Gough * 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 * oper_complex_source.c: complex matrix operations (from Toby White) Mon Feb 18 20:33:58 2002 Brian Gough * copy_source.c (gsl_matrix_swap): fixed prototype by removing const from second arg. Sun Jan 27 22:29:37 2002 Brian Gough * test.c: ensure that range check is working when running the tests Fri Sep 14 18:56:34 2001 Brian Gough * 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 * added gsl_matrix_ptr and gsl_matrix_const_ptr functions Mon Jul 16 21:28:05 2001 Brian Gough * rowcol_source.c (FUNCTION): initialized view to NULL Fri Jul 13 21:29:27 2001 Brian Gough * changed views to be structs and used casts to initialize them Mon Jul 2 12:35:16 2001 Brian Gough * view.h: provide macros for initializing null vectors and views Sun Jul 1 22:44:51 2001 Brian Gough * introduction of new-style vector/matrix views Fri Jun 1 17:04:52 2001 Brian Gough * 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 * matrix_source.c (FUNCTION): removed unnecessary inline from static function definition Tue May 1 23:09:25 2001 Brian Gough * 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 * view_source.c: split view functions out into a separate file Sat Sep 9 16:47:16 2000 Brian Gough * 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 * swap_source.c (FUNCTION): added function gsl_matrix_transpose_memcpy for transposing rectangular matrices Sun Jul 16 10:40:15 2000 Brian Gough * 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 * changed GSL_EDOM to GSL_EINVAL for invalid matrix size arguments Sat Jun 17 15:38:30 2000 Brian Gough * fixed up missing MULTIPLICITY factors in various functions Sun May 28 12:25:02 2000 Brian Gough * 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 * oper.c: added simple arithmetic operations (+,-,*,/,scale,+const) Wed Apr 26 15:04:22 2000 Brian Gough * prop_source.c (FUNCTION): added function gsl_matrix_isnull Tue Apr 18 12:51:49 2000 Brian Gough * 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 * minmax.c: added matrix max/min functions Sat Mar 25 20:29:41 2000 Brian Gough * 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 * matrix_source.c (FUNCTION): added set_all and set_zero functions Sat Mar 11 11:19:05 2000 Brian Gough * 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 * rowcol_source.c (FUNCTION): added gsl_matrix_view_from_vector (Thanks to Fabrice Rossi) Sun Oct 31 20:01:39 1999 Brian Gough * copy.c copy_source.c: added gsl_matrix_copy function Tue Oct 19 14:13:35 1999 Brian Gough * added gsl_matrix_swap_row/col to exchange rows and columns Fri Oct 1 15:48:07 1999 Brian Gough * 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 * rowcol_source.c: fix rowcol to use strides 1998-11-09 * 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 * make range checking the default, you have to define GSL_RANGE_CHECK_OFF to turn it off gsl-doc-2.3/matrix/rowcol.c0000664000175000017500000000710712616157443013755 0ustar eddedd#include #include #include #include #include #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 gsl-doc-2.3/matrix/minmax.c0000664000175000017500000000260312616157443013735 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/matrix/submatrix.c0000664000175000017500000000723312616157443014466 0ustar eddedd#include #include #include #include #include #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 gsl-doc-2.3/matrix/gsl_matrix_long_double.h0000644000175000017500000003313012737536472017177 0ustar eddedd/* matrix/gsl_matrix_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_long_double_view gsl_matrix_long_double_subrow (gsl_matrix_long_double * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_long_double_view gsl_matrix_long_double_subcolumn (gsl_matrix_long_double * m, const size_t j, const size_t offset, const size_t n); _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_vector_long_double_const_view gsl_matrix_long_double_const_subrow (const gsl_matrix_long_double * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_long_double_const_view gsl_matrix_long_double_const_subcolumn (const gsl_matrix_long_double * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_long_double * dest, const gsl_matrix_long_double * src); 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); int gsl_matrix_long_double_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_long_double * a, const gsl_matrix_long_double * b); 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_isnonneg (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 */ INLINE_DECL long double gsl_matrix_long_double_get(const gsl_matrix_long_double * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_long_double_set(gsl_matrix_long_double * m, const size_t i, const size_t j, const long double x); INLINE_DECL long double * gsl_matrix_long_double_ptr(gsl_matrix_long_double * m, const size_t i, const size_t j); INLINE_DECL const long double * gsl_matrix_long_double_const_ptr(const gsl_matrix_long_double * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/gsl_matrix_uint.h0000644000175000017500000003030312737536472015664 0ustar eddedd/* matrix/gsl_matrix_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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_vector_uint_view gsl_matrix_uint_subrow (gsl_matrix_uint * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_uint_view gsl_matrix_uint_subcolumn (gsl_matrix_uint * m, const size_t j, const size_t offset, const size_t n); _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_vector_uint_const_view gsl_matrix_uint_const_subrow (const gsl_matrix_uint * m, const size_t i, const size_t offset, const size_t n); _gsl_vector_uint_const_view gsl_matrix_uint_const_subcolumn (const gsl_matrix_uint * m, const size_t j, const size_t offset, const size_t n); _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 */ 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_tricpy(const char uplo_src, const int copy_diag, gsl_matrix_uint * dest, const gsl_matrix_uint * src); 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); int gsl_matrix_uint_transpose_tricpy (const char uplo_src, const int copy_diag, 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_equal (const gsl_matrix_uint * a, const gsl_matrix_uint * b); 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_isnonneg (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 */ INLINE_DECL unsigned int gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_uint_set(gsl_matrix_uint * m, const size_t i, const size_t j, const unsigned int x); INLINE_DECL unsigned int * gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j); INLINE_DECL const unsigned int * gsl_matrix_uint_const_ptr(const gsl_matrix_uint * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned int gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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] ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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 ; } INLINE_FUN unsigned int * gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { 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)) ; } INLINE_FUN 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 (GSL_RANGE_COND(1)) { 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__ */ gsl-doc-2.3/matrix/view.c0000664000175000017500000000673112616157443013424 0ustar eddedd#include #include #include #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 gsl-doc-2.3/matrix/submatrix_source.c0000664000175000017500000000402412616157443016041 0ustar eddedd/* matrix/submatrix_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/matrix/copy_source.c0000644000175000017500000001067312737536472015011 0ustar eddedd/* matrix/copy_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } int FUNCTION (gsl_matrix, tricpy) (const char uplo_src, const int copy_diag, 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, k; if (uplo_src == 'L') { for (i = 0; i < src_size1 ; i++) { for (j = 0; j < i; j++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (i * dest_tda + j) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + j) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } else if (uplo_src == 'U') { for (i = 0; i < src_size1 ; i++) { for (j = i + 1; j < src_size2; j++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (i * dest_tda + j) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + j) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } else { GSL_ERROR ("invalid uplo parameters", GSL_EINVAL); } if (copy_diag) { for (i = 0; i < src_size1 ; i++) { for (k = 0; k < MULTIPLICITY; k++) { size_t e1 = (i * dest_tda + i) * MULTIPLICITY + k ; size_t e2 = (i * src_tda + i) * MULTIPLICITY + k ; dest->data[e1] = src->data[e2]; } } } } return GSL_SUCCESS; } gsl-doc-2.3/matrix/oper_source.c0000664000175000017500000001011712616157443014770 0ustar eddedd/* matrix/oper_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/matrix/test_complex_source.c0000664000175000017500000005133612616157443016541 0ustar eddedd/* matrix/test_complex_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 M, const size_t N); void FUNCTION (test, ops) (const size_t P, const size_t Q); void FUNCTION (test, trap) (const size_t M, const size_t N); void FUNCTION (test, text) (const size_t M, const size_t N); void FUNCTION (test, binary) (const size_t M, const size_t N); void FUNCTION (test, binary_noncontiguous) (const size_t M, const size_t N); #define TEST(expr,desc) gsl_test((expr), NAME(gsl_matrix) desc " M=%d, N=%d", M, N) void FUNCTION (test, func) (const size_t M, const size_t N) { 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) (const size_t M, const size_t N) { TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; int k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen (fd, "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 (filename, "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); } unlink(filename); FUNCTION (gsl_matrix, free) (m); } #endif void FUNCTION (test, binary) (const size_t M, const size_t N) { TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; int k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen (fd, "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 (filename, "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); } unlink(filename); FUNCTION (gsl_matrix, free) (m); } void FUNCTION (test, binary_noncontiguous) (const size_t M, const size_t N) { TYPE (gsl_matrix) * l = FUNCTION (gsl_matrix, calloc) (M+1, N+1); VIEW (gsl_matrix, view) m = FUNCTION (gsl_matrix, submatrix) (l, 0, 0, M, N); size_t i, j; int k = 0; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen (fd, "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.matrix, i, j, z); } } FUNCTION (gsl_matrix, fwrite) (f, &m.matrix); fclose (f); } { FILE *f = fopen (filename, "rb"); TYPE (gsl_matrix) * ll = FUNCTION (gsl_matrix, alloc) (M+1, N+1); VIEW (gsl_matrix, view) mm = FUNCTION (gsl_matrix, submatrix) (ll, 0, 0, M, N); status = 0; FUNCTION (gsl_matrix, fread) (f, &mm.matrix); k = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE z = FUNCTION (gsl_matrix, get) (&mm.matrix, i, j); k++; if (GSL_REAL (z) != k || GSL_IMAG (z) != k + 1000) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_write and read (noncontiguous)"); fclose (f); FUNCTION (gsl_matrix, free) (ll); } unlink(filename); FUNCTION (gsl_matrix, free) (l); } void FUNCTION (test, trap) (const size_t M, const size_t N) { 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, ops) (const size_t P, const size_t Q) { 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++; } } { { int status = (FUNCTION(gsl_matrix,equal) (a,b) != 0); gsl_test (status, NAME (gsl_matrix) "_equal matrix unequal"); } FUNCTION (gsl_matrix, memcpy) (m, a); { int status = (FUNCTION(gsl_matrix,equal) (a,m) != 1); gsl_test (status, NAME (gsl_matrix) "_equal matrix equal"); } 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"); } { BASE s; GSL_SET_COMPLEX(&s, 2.0, 3.0); FUNCTION (gsl_matrix, memcpy) (m, a); FUNCTION (gsl_matrix, scale) (m, s); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < Q; j++) { ATOMIC real = (ATOMIC) (-(ATOMIC)k - 30); ATOMIC imag = (ATOMIC) (5 * (ATOMIC)k + 20); BASE z = FUNCTION (gsl_matrix, get) (m, i, j); if (GSL_REAL (z) != real || GSL_IMAG (z) != imag) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_scale"); } { BASE s; GSL_SET_COMPLEX(&s, 2.0, 3.0); FUNCTION (gsl_matrix, memcpy) (m, a); FUNCTION (gsl_matrix, add_constant) (m, s); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < Q; j++) { ATOMIC real = (ATOMIC) ((ATOMIC)k + 2); ATOMIC imag = (ATOMIC) ((ATOMIC)k + 10 + 3); BASE z = FUNCTION (gsl_matrix, get) (m, i, j); if (GSL_REAL (z) != real || GSL_IMAG (z) != imag) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_add_constant"); } { BASE s; GSL_SET_COMPLEX(&s, 2.0, 3.0); FUNCTION (gsl_matrix, memcpy) (m, a); FUNCTION (gsl_matrix, add_diagonal) (m, s); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < Q; j++) { ATOMIC real = (ATOMIC) ((ATOMIC)k + ((i==j) ? 2 : 0)); ATOMIC imag = (ATOMIC) ((ATOMIC)k + 10 +((i==j) ? 3 : 0)); BASE z = FUNCTION (gsl_matrix, get) (m, i, j); if (GSL_REAL (z) != real || GSL_IMAG (z) != imag) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_add_diagonal"); } { FUNCTION (gsl_matrix, swap) (a, b); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < Q; j++) { BASE x = FUNCTION (gsl_matrix, get) (a, i, j); BASE y = FUNCTION (gsl_matrix, get) (b, i, j); if (GSL_REAL (x) != (ATOMIC) (k + 5) || GSL_IMAG (x) != (ATOMIC) (k + 20) || GSL_REAL (y) != (ATOMIC) (k) || GSL_IMAG (y) != (ATOMIC) (k + 10)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_swap"); } FUNCTION (gsl_matrix, free) (a); FUNCTION (gsl_matrix, free) (b); FUNCTION (gsl_matrix, free) (m); } gsl-doc-2.3/matrix/test.c0000664000175000017500000001420312616157443013422 0ustar eddedd/* matrix/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #if defined( _MSC_VER ) && defined( GSL_DLL ) #undef inline #define inline __forceinline #endif #if (!GSL_RANGE_CHECK) && defined(HAVE_INLINE) #undef GSL_RANGE_CHECK #define GSL_RANGE_CHECK 1 #endif #include #include #include #include #include #include #include #include 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 M = 53; size_t N = 107; gsl_ieee_env_setup (); test_func (M, N); test_float_func (M, N); test_long_double_func (M, N); test_ulong_func (M, N); test_long_func (M, N); test_uint_func (M, N); test_int_func (M, N); test_ushort_func (M, N); test_short_func (M, N); test_uchar_func (M, N); test_char_func (M, N); test_complex_func (M, N); test_complex_float_func (M, N); test_complex_long_double_func (M, N); test_ops (M, N); test_float_ops (M, N); test_long_double_ops (M, N); test_ulong_ops (M, N); test_long_ops (M, N); test_uint_ops (M, N); test_int_ops (M, N); test_ushort_ops (M, N); test_short_ops (M, N); test_uchar_ops (M, N); test_char_ops (M, N); /* Must use smaller dimensions to prevent approximation of floats in float_mul_elements test*/ { const size_t P = 8; const size_t Q = 12; test_complex_ops (P, Q); test_complex_float_ops (P, Q); test_complex_long_double_ops (P, Q); } test_text (M, N); test_float_text (M, N); #if HAVE_PRINTF_LONGDOUBLE test_long_double_text (M, N); #endif test_ulong_text (M, N); test_long_text (M, N); test_uint_text (M, N); test_int_text (M, N); test_ushort_text (M, N); test_short_text (M, N); test_uchar_text (M, N); test_char_text (M, N); test_complex_text (M, N); test_complex_float_text (M, N); #if HAVE_PRINTF_LONGDOUBLE test_complex_long_double_text (M, N); #endif test_binary (M, N); test_float_binary (M, N); test_long_double_binary (M, N); test_ulong_binary (M, N); test_long_binary (M, N); test_uint_binary (M, N); test_int_binary (M, N); test_ushort_binary (M, N); test_short_binary (M, N); test_uchar_binary (M, N); test_char_binary (M, N); test_complex_binary (M, N); test_complex_float_binary (M, N); test_complex_long_double_binary (M, N); test_binary_noncontiguous (M, N); test_float_binary_noncontiguous (M, N); test_long_double_binary_noncontiguous (M, N); test_ulong_binary_noncontiguous (M, N); test_long_binary_noncontiguous (M, N); test_uint_binary_noncontiguous (M, N); test_int_binary_noncontiguous (M, N); test_ushort_binary_noncontiguous (M, N); test_short_binary_noncontiguous (M, N); test_uchar_binary_noncontiguous (M, N); test_char_binary_noncontiguous (M, N); test_complex_binary_noncontiguous (M, N); test_complex_float_binary_noncontiguous (M, N); test_complex_long_double_binary_noncontiguous (M, N); #if GSL_RANGE_CHECK gsl_set_error_handler (&my_error_handler); test_trap (M, N); test_float_trap (M, N); test_long_double_trap (M, N); test_ulong_trap (M, N); test_long_trap (M, N); test_uint_trap (M, N); test_int_trap (M, N); test_ushort_trap (M, N); test_short_trap (M, N); test_uchar_trap (M, N); test_char_trap (M, N); test_complex_trap (M, N); test_complex_float_trap (M, N); test_complex_long_double_trap (M, 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; } gsl-doc-2.3/Makefile.in0000644000175000017500000015565313022372404013041 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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 VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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) subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/gsl_version.h.in \ $(srcdir)/gsl.spec.in depcomp $(noinst_HEADERS) \ $(pkginclude_HEADERS) test-driver COPYING THANKS TODO \ config.guess config.sub install-sh mdate-sh missing ltmain.sh 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 config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gsl_version.h gsl.spec CONFIG_CLEAN_VPATH_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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libgsl_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(SUBLIBS) am_libgsl_la_OBJECTS = version.lo libgsl_la_OBJECTS = $(am_libgsl_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgsl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgsl_la_LDFLAGS) $(LDFLAGS) -o $@ 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 SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = 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 cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(m4data_DATA) $(pkgconfig_DATA) HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gsl utils sys test err const complex cheb block vector matrix permutation combination multiset sort ieee-utils cblas blas linalg eigen specfunc dht qrng rng randist fft poly fit multifit multifit_nlinear multilarge multilarge_nlinear rstat statistics siman sum integration interpolation histogram ode-initval ode-initval2 roots multiroots min multimin monte ntuple diff deriv cdf wavelet bspline spblas spmatrix splinalg 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 \ multifit_nlinear/libgslmultifit_nlinear.la \ multilarge/libgslmultilarge.la \ multilarge_nlinear/libgslmultilarge_nlinear.la \ multimin/libgslmultimin.la multiroots/libgslmultiroots.la \ ntuple/libgslntuple.la ode-initval/libgslodeiv.la \ ode-initval2/libgslodeiv2.la permutation/libgslpermutation.la \ combination/libgslcombination.la multiset/libgslmultiset.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 \ rstat/libgslrstat.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 spmatrix/libgslspmatrix.la \ spblas/libgslspblas.la splinalg/libgslsplinalg.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 gsl_minmax.h gsl_inline.h bin_SCRIPTS = gsl-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gsl.pc CLEANFILES = gsl.pc gsl-config EXTRA_DIST = autogen.sh gsl-config.in gsl.pc.in configure.ac THANKS BUGS gsl.spec.in gsl.m4 test_gsl_histogram.sh pkgconfig.test lib_LTLIBRARIES = libgsl.la libgsl_la_SOURCES = version.c libgsl_la_LIBADD = $(GSL_LIBADD) $(SUBLIBS) libgsl_la_LDFLAGS = $(GSL_LDFLAGS) -version-info $(GSL_LT_VERSION) noinst_HEADERS = templates_on.h templates_off.h build.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 pkgconfig.test TESTS = test_gsl_histogram.sh pkgconfig.test #bin_PROGRAMS = main dummy #dummy_SOURCES = version.c #dummy_LDADD = $(SUBLIBS) #main_SOURCES = version.c env.c #main_LDADD = libgsl.la edit = $(SED) \ -e 's|@prefix[@]|$(prefix)|g' \ -e 's|@exec_prefix[@]|$(exec_prefix)|g' \ -e 's|@libdir[@]|$(libdir)|g' \ -e 's|@includedir[@]|$(includedir)|g' \ -e 's|@GSL_CFLAGS[@]|$(GSL_CFLAGS)|g' \ -e 's|@GSL_LIBM[@]|$(GSL_LIBM)|g' \ -e 's|@GSL_LIBS[@]|$(GSL_LIBS)|g' \ -e 's|@LIBS[@]|$(LIBS)|g' \ -e 's|@VERSION[@]|$(VERSION)|g' all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(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'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) 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) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 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) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsl.la: $(libgsl_la_OBJECTS) $(libgsl_la_DEPENDENCIES) $(EXTRA_libgsl_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsl_la_LINK) -rpath $(libdir) $(libgsl_la_OBJECTS) $(libgsl_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list gsl-histogram$(EXEEXT): $(gsl_histogram_OBJECTS) $(gsl_histogram_DEPENDENCIES) $(EXTRA_gsl_histogram_DEPENDENCIES) @rm -f gsl-histogram$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gsl_histogram_OBJECTS) $(gsl_histogram_LDADD) $(LIBS) gsl-randist$(EXEEXT): $(gsl_randist_OBJECTS) $(gsl_randist_DEPENDENCIES) $(EXTRA_gsl_randist_DEPENDENCIES) @rm -f gsl-randist$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gsl_randist_OBJECTS) $(gsl_randist_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl-histogram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl-randist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-m4dataDATA: $(m4data_DATA) @$(NORMAL_INSTALL) @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ done uninstall-m4dataDATA: @$(NORMAL_UNINSTALL) @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) # 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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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; \ ($(am__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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ 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 || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_SCRIPTS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test_gsl_histogram.sh.log: test_gsl_histogram.sh @p='test_gsl_histogram.sh'; \ b='test_gsl_histogram.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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 \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -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 $(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__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(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 \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -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 html-am: info: info-recursive info-am: install-data-am: install-m4dataDATA install-pkgconfigDATA \ install-pkgincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS \ install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -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-libLTLIBRARIES uninstall-m4dataDATA \ uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS .MAKE: $(am__recursive_targets) all check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am clean clean-binPROGRAMS \ clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-m4dataDATA install-man \ install-pdf install-pdf-am install-pkgconfigDATA \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ uninstall-m4dataDATA uninstall-pkgconfigDATA \ uninstall-pkgincludeHEADERS gsl-config gsl.pc: Makefile @rm -f $@ $@.tmp @$(edit) '$(srcdir)/$@.in' >>$@.tmp @chmod a-w $@.tmp @mv $@.tmp $@ @echo creating $@ gsl-config: $(srcdir)/gsl-config.in gsl.pc: $(srcdir)/gsl.pc.in # 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: gsl-doc-2.3/histogram/0000755000175000017500000000000013022553154012755 5ustar eddeddgsl-doc-2.3/histogram/params.c0000664000175000017500000000217412616157443014423 0ustar eddedd/* histogram/params.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } gsl-doc-2.3/histogram/oper.c0000664000175000017500000000750512616157443014110 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include /* * 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; } gsl-doc-2.3/histogram/add.c0000664000175000017500000000265012616157443013667 0ustar eddedd/* histogram/add.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #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; } gsl-doc-2.3/histogram/test1d_trap.c0000664000175000017500000001017012616157443015365 0ustar eddedd/* histogram/test_trap.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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; } gsl-doc-2.3/histogram/stat.c0000664000175000017500000000621312616157443014111 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include #include /* 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; /* Use a two-pass algorithm for stability. Could also use a single pass formula, 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; } gsl-doc-2.3/histogram/copy.c0000664000175000017500000000414512616157443014112 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*************************************************************** * * File gsl_histogram_copy.c: * Routine to copy an histogram. * Need GSL library and headers. * * Author: S. Piccardi * Jan. 2000 * ***************************************************************/ #include #include #include #include /* * 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; } gsl-doc-2.3/histogram/pdf2d.c0000664000175000017500000001055012616157443014134 0ustar eddedd/* histogram/pdf2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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) { RETURN_IF_NULL (p); free (p->xrange); free (p->yrange); free (p->sum); free (p); } gsl-doc-2.3/histogram/find.c0000664000175000017500000000361612616157443014062 0ustar eddedd/* histogram/find.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/histogram/calloc_range.c0000664000175000017500000000533312616157443015551 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include 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; } gsl-doc-2.3/histogram/Makefile.am0000664000175000017500000000144712616157443015032 0ustar eddeddnoinst_LTLIBRARIES = libgslhistogram.la pkginclude_HEADERS = gsl_histogram.h gsl_histogram2d.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/histogram/reset2d.c0000664000175000017500000000207612616157443014511 0ustar eddedd/* histogram/reset2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } } gsl-doc-2.3/histogram/test2d.c0000664000175000017500000004355712616157443014357 0ustar eddedd/* histogram/test2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #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); } gsl-doc-2.3/histogram/test1d_resample.c0000664000175000017500000000506612616157443016237 0ustar eddedd/* histogram/test1d_resample.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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); } gsl-doc-2.3/histogram/file.c0000664000175000017500000000565412616157443014065 0ustar eddedd/* histogram/file.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; } gsl-doc-2.3/histogram/get.c0000664000175000017500000000331412616157443013714 0ustar eddedd/* histogram/get.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #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; } gsl-doc-2.3/histogram/params2d.c0000664000175000017500000000263512616157443014653 0ustar eddedd/* histogram/params2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } gsl-doc-2.3/histogram/maxval2d.c0000664000175000017500000000640112616157443014653 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include /* * 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; } gsl-doc-2.3/histogram/TODO0000664000175000017500000000020712616157443013457 0ustar eddedd# -*- org -*- #+CATEGORY: histogram * Implement N-d histograms (Simone Piccardi is working on something here). gsl-doc-2.3/histogram/gsl_histogram2d.h0000664000175000017500000001301212616157443016226 0ustar eddedd/* histogram/gsl_histogram2d.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/histogram/gsl_histogram.h0000664000175000017500000001005412616157443016003 0ustar eddedd/* histogram/gsl_histogram.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/histogram/init.c0000664000175000017500000000753512616157443014111 0ustar eddedd/* histogram/init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/histogram/file2d.c0000664000175000017500000001064412616157443014306 0ustar eddedd/* histogram/file2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; } gsl-doc-2.3/histogram/get2d.c0000664000175000017500000000472312616157443014147 0ustar eddedd/* histogram/get2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #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; } gsl-doc-2.3/histogram/find2d.c0000664000175000017500000000255512616157443014311 0ustar eddedd/* histogram/find2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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; } gsl-doc-2.3/histogram/urand.c0000664000175000017500000000173612616157443014254 0ustar eddedd/* histogram/urand.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/histogram/stat2d.c0000664000175000017500000001327212616157443014342 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include /* 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; } gsl-doc-2.3/histogram/Makefile.in0000644000175000017500000011130313022372405015017 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslhistogram.la pkginclude_HEADERS = gsl_histogram.h gsl_histogram2d.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu histogram/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslhistogram.la: $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_DEPENDENCIES) $(EXTRA_libgslhistogram_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_resample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_trap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_resample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_trap.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/histogram/init2d.c0000664000175000017500000001523012616157443014326 0ustar eddedd/* histogram/init2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/histogram/ChangeLog0000664000175000017500000001172612616157443014551 0ustar eddedd2009-07-09 Brian Gough * pdf2d.c (gsl_histogram2d_pdf_free): handle NULL argument in free * pdf.c (gsl_histogram_pdf_free): handle NULL argument in free * init2d.c (gsl_histogram2d_free): handle NULL argument in free * init.c (gsl_histogram_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2004-11-28 Brian Gough * 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 * 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 * 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 * stat2d.c: added include for sqrt Fri Jan 18 21:45:35 2002 Brian Gough * stat2d.c: functions to compute statistics of 2d histograms (Achim Gaedke) Mon Jan 14 19:34:31 2002 Brian Gough * 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 * 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 * 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 * test_gsl_histogram.sh: moved to top-level directory Sat Aug 18 22:21:26 2001 Brian Gough * gsl-histogram.c: moved to top-level directory Mon Jun 25 17:41:42 2001 Brian Gough * 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 * get2d.c: include "find.c" Mon Apr 16 20:13:45 2001 Brian Gough * get2d.c (gsl_histogram2d_get): removed unnecessary reference to find2d Mon Jan 22 13:55:13 2001 Brian Gough * 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 * 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 * 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 * added numerous extensions from Simone Piccardi 2000-04-01 Mark Galassi * *.c: changed 0 -> GSL_SUCCESS where appropriate; THANKS to Dave Morrison. Fri Nov 19 15:31:51 1999 Brian Gough * 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 * file.c file2d.c: converted to use new block i/o functions Wed Aug 18 11:41:40 1999 Brian Gough * 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 * removed dependence on rand() and RAND_MAX 1999-08-05 Mark Galassi * gsl-histogram.c (main): fixed a simple logic bug. Thanks to Barak Pearlmutter (bap@cs.unm.edu) for the patch. 1998-11-06 * used a cast of (int) when attempting to print size_t variables with %d Wed Sep 16 15:08:59 1998 Brian Gough * gsl-histogram.c (main): made the number of bins optional. If you don't specify it then it uses bins of width 1. gsl-doc-2.3/histogram/oper2d.c0000664000175000017500000001025612616157443014333 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include /* * 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; } gsl-doc-2.3/histogram/copy2d.c0000664000175000017500000000447612616157443014347 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*************************************************************** * * File gsl_histogram2d_copy.c: * Routine to copy a 2D histogram. * Need GSL library and header. * * Author: S. Piccardi * Jan. 2000 * ***************************************************************/ #include #include #include #include /* * 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; } gsl-doc-2.3/histogram/test2d_trap.c0000664000175000017500000001606712616157443015401 0ustar eddedd/* histogram/test2d_trap.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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; } gsl-doc-2.3/histogram/test1d.c0000664000175000017500000002430512616157443014344 0ustar eddedd/* histogram/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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); } gsl-doc-2.3/histogram/calloc_range2d.c0000664000175000017500000000734012616157443015777 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include /* * 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; } gsl-doc-2.3/histogram/reset.c0000664000175000017500000000202312616157443014253 0ustar eddedd/* histogram/reset.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } } gsl-doc-2.3/histogram/maxval.c0000664000175000017500000000457612616157443014440 0ustar eddedd/* 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 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include 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; } gsl-doc-2.3/histogram/pdf.c0000664000175000017500000000671312616157443013714 0ustar eddedd/* histogram/pdf.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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) { RETURN_IF_NULL (p); free (p->range); free (p->sum); free (p); } gsl-doc-2.3/histogram/test2d_resample.c0000664000175000017500000000631312616157443016234 0ustar eddedd/* histogram/test2d_resample.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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) ; } gsl-doc-2.3/histogram/add2d.c0000664000175000017500000000333012616157443014111 0ustar eddedd/* histogram/add2d.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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; } gsl-doc-2.3/histogram/test.c0000664000175000017500000000236412616157443014120 0ustar eddedd/* histogram/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 ()); } gsl-doc-2.3/ChangeLog0000664000175000017500000007432612616157443012561 0ustar eddedd2012-10-25 Rhys Ulerich * templates_on.h: undef complex for MSVC Thank you to Victor Zverovich for reporting the problem and providing the patch 2012-06-04 Rhys Ulerich * cdf/beta.c: Update FSF address * cdf/betainv.c: Update FSF address * cdf/chisq.c: Update FSF address * cdf/chisqinv.c: Update FSF address * cdf/fdist.c: Update FSF address * cdf/fdistinv.c: Update FSF address * cdf/gamma.c: Update FSF address * cdf/gammainv.c: Update FSF address * cdf/gauss.c: Update FSF address * cdf/gaussinv.c: Update FSF address * cdf/geometric.c: Update FSF address * cdf/gsl_cdf.h: Update FSF address * cdf/hypergeometric.c: Update FSF address * cdf/nbinomial.c: Update FSF address * cdf/poisson.c: Update FSF address * cdf/tdist.c: Update FSF address * cdf/tdistinv.c: Update FSF address * cdf/test.c: Update FSF address * contrib/wigner.c: Update FSF address * contrib/wigner.h: Update FSF address * histogram/calloc_range.c: Update FSF address * histogram/calloc_range2d.c: Update FSF address * histogram/copy.c: Update FSF address * histogram/copy2d.c: Update FSF address * histogram/maxval.c: Update FSF address * histogram/maxval2d.c: Update FSF address * histogram/oper.c: Update FSF address * histogram/oper2d.c: Update FSF address * histogram/stat.c: Update FSF address * histogram/stat2d.c: Update FSF address * mdate-sh: Update FSF address * randist/discrete.c: Update FSF address * randist/gausszig.c: Update FSF address * rng/gfsr4.c: Update FSF address * rng/mt.c: Update FSF address * utils/getopt.c: Update FSF address * utils/getopt.h: Update FSF address * utils/getopt1.c: Update FSF address * utils/strerror.c: Update FSF address * utils/system.h: Update FSF address * utils/xmalloc.c: Update FSF address * utils/xstrdup.c: Update FSF address 2011-12-01 Rhys Ulerich * doc/integration.texi: Clarify that integration workspaces may be reused multiple times following discussion on gsl-help mailing list. Documentation ambiguity raised by Denes Molnar. 2011-04-13 Brian Gough * gsl_nan.h (GSL_NEGZERO): define negative zero as explicitly floating point, same for positive zero. 2011-04-01 Rhys Ulerich * doc/bspline.texi: Correct valid index range for Greville abscissae 2011-01-31 Peter Johansson * gsl.pc.in (GSL_CBLAS_LIB): allow user to choose cblas via pkg-config 2010-08-06 Brian Gough * ode-initval2: added Tuomo Keskitalo's new ode branch with a gsl_odeiv2 prefix which is intended to be the new default. Will retain gsl_odeiv for binary compatibility but old interface will be deprecated. 2010-05-25 Peter Johansson * configure.ac: added variable GSL_LIBM from macro AC_CHECK_LIBM * Makefile.am: added GSL_LIBM in edit substitution * gsl-config.in: using variable $GSL_LIBM rather than hard-coded -libm * gsl.pc.in: using variable $GSL_LIBM rather than hard-coded -libm 2010-04-24 Brian Gough * configure.ac: added macro for substituting isfinite by gsl_finite when needed. 2010-04-10 Giuseppe Scrivano * utils/memcpy.c (memcpy): Use the standand method signature. * utils/memmove.c (memmove): Likewise. 2010-01-18 Brian Gough * gsl_version.h.in, configure.ac: added GSL_MAJOR_VERSION and GSL_MINOR_VERSION macros 2009-07-09 Brian Gough * configure.ac: added RETURN_IF_NULL macro to handle null argument in free() type functions. 2009-05-09 Brian Gough * configure.ac: improve tests for C99 inline, and don't test when inline is not available * gsl_inline.h: added test for HAVE_C99_INLINE 2009-04-10 Brian Gough * Makefile.am: generate gsl-config gsl.pc from Makefile instead of configure, to allow make install prefix=... 2008-09-26 Brian Gough * configure.ac: handle test for SSE in cross-compilation (fall back to checking if the ldmxcsr instruction compiles) 2008-07-03 Brian Gough * Makefile.am: added gsl_inline.h and build.h * gsl_mode.h gsl_pow_int.h: use new inline declarations * gsl_minmax.h: new header file for minmax functions, use new inline declarations * gsl_math.h: moved minmax functions to separate header file * configure.ac: test for C99 inline as well * build.h gsl_inline.h: added new header to handle GNU-style and C99 inlines 2008-03-17 Brian Gough * configure.ac: remove hack to disable search for Fortran, Java, C++ required with earlier versions of autoconf 2007-09-01 Brian Gough * gsl.m4: changed default name to AX_PATH_GSL 2007-08-22 Brian Gough * configure.ac: started moving definitions out of acconfig.h (deprecated) 2007-07-30 Brian Gough * configure.ac: check ieeefp.h for isfinite 2007-04-23 Brian Gough * acconfig.h (finite): don't redefine finite in terms of isfinite, which causes problems with system headers, use gsl_finite instead. 2007-04-17 Brian Gough * configure.ac: use an actual floating point number instead of an integer for testing long double I/O. 2007-01-09 Brian Gough * gsl_math.h (M_PI_4): corrected typo in higher digits of M_PI_4 (at ~1e-20) 2006-11-02 Brian Gough * templates_on.h templates_off.h: added UNSIGNED definition for detecting types without negative values 2006-02-15 Brian Gough * 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 * templates_on.h: added an FP=1 definition for the floating point types, FP is undefined for integer types. 2005-08-05 Brian Gough * gsl/Makefile.am: need to remove makefile with later versions of automake 2005-04-05 Brian Gough * configure.ac: added ieeefp.h test for solaris 2005-01-13 Brian Gough * configure.ac: added case for 86_64 in IEEE arithmetic interface detection 2004-10-26 Brian Gough * test_gsl_histogram.sh: trim \r from test output for compatibility with Cygwin. 2004-07-29 Brian Gough * modified all makefiles to use TESTS=$(check_programs) to get correct EXEEXT behavior 2004-07-23 Brian Gough * added wavelet/ directory 2004-05-28 Brian Gough * configure.ac: ran configure script through Autoconf's autoupdate to use latest macro names 2004-05-17 Brian Gough * gsl.m4: fix m4 quoting of first argument to AC_DEFUN 2004-03-17 Brian Gough * 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 * configure.ac: define _GNU_SOURCE when looking for fenv.h 2003-06-17 Brian Gough * 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 * 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 * 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 * gsl_types.h: changed from internal macro _DLL to GSL_DLL 2003-02-09 Brian Gough * configure.in: added [] quotes in AC_TRY_COMPILE to protect nested macros 2002-11-24 Brian Gough * 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 * 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 * config.h.in: fixed RANGE_CHECK_ON to GSL_RANGE_CHECK_ON Sun Jul 14 12:48:50 2002 Brian Gough * INSTALL: merged the MACHINES file into the installation notes. Fri Jun 14 22:09:52 2002 Brian Gough * 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 * 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 * 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 * Makefile.am (EXTRA_DIST): removed KNOWN-PROBLEMS Sun Feb 10 21:28:29 2002 Brian Gough * BUGS: added a list of known but unfixed bugs. 2002-02-07 Mark Galassi * THANKS: added Karsten Howes . Wed Jan 16 16:55:25 2002 Brian Gough * 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 * 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 * standardised all files to #include for exported header files rather than having some as #include "...", to simplify build procedure Fri Oct 19 15:19:45 2001 Brian Gough * gsl-histogram.c (main): use gsl_histogram_alloc instead of calloc Wed Oct 3 11:06:51 2001 Brian Gough * 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 * gsl.m4: cleaned up arguments to GSL_CONFIG Wed Sep 19 17:41:13 2001 Brian Gough * 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 * 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 * gsl-histogram.c (main): print out the mean and standard deviation as comments Sun Sep 9 22:57:11 2001 Brian Gough * 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 * 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 * configure.in: added an option to specify an alternative math library Tue Sep 4 09:41:37 2001 Brian Gough * gsl.spec.in: autogenerate gsl.spec from gsl.spec.in Sun Aug 26 17:19:24 2001 Brian Gough * acconfig.h: fixed incorrect #ifdef for HAVE_FINITE (Henry Sobotka) Sat Aug 25 10:25:41 2001 Brian Gough * 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 * 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 * 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 * 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 * gsl_nan.h: use C99X macro INFINITY where available Fri Jul 13 21:31:01 2001 Brian Gough * templates_on.h: added macros for unqualified views, needed for initialization of views Mon Jul 9 11:22:16 2001 Brian Gough * 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 * templates_on.h templates_off.h: modified to support views Wed Jun 27 12:15:19 2001 Brian Gough * configure.in: work around case of broken log1p in OpenBSD Mon Jun 25 10:21:17 2001 Brian Gough * configure.in: catch case of openbsd, which is not supported yet in ieee directory Mon Jun 18 22:31:26 2001 Brian Gough * configure.in (GSL_CFLAGS): now just uses includedir for gsl-config.in Wed Jun 6 18:10:18 2001 Brian Gough * removed explicit dependencies from Makefile.am's since automake now handles these automatically Tue May 29 12:40:08 2001 Brian Gough * 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 * 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 * 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 * autogen.sh: upgraded to latest libtool and automake Tue May 1 12:19:01 2001 Brian Gough * gsl_nan.h (GSL_NAN): added definitions for Microsoft Visual C++ Mon Apr 30 13:46:39 2001 Brian Gough * gsl_math.h: split out gsl_pow_int.h and gsl_nan.h Wed Mar 21 14:16:29 2001 Brian Gough * gsl-config.in (Usage): allow user to specify an external blas library through an environment variable 2000-12-14 Mark Galassi * gsl.spec, configure.in: upped the version to 0.7+ since the release has been made. 2000-10-26 Mark Galassi * ltconfig, ltmain.sh: removed these auto-generated files. 2000-10-26 Mark Galassi * 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 * 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 * gsl.m4: changed \? to \{0,1\} in the sed commands to allow for SGI sed (from Steve ROBBINS ) Sun Jul 9 19:34:03 2000 Brian Gough * 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 * Makefile.am (SUBLIBS): added missing complex lib to top-level SUBLIBS Sun Jun 11 17:39:18 2000 Brian Gough * 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 * acconfig.h, configure.in: use HAVE_X86LINUX_IEEE_INTEFACE for x86 instead of generic HAVE_LINUX_IEEE_INTEFACE 2000-06-02 Mark Galassi * 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 * 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 * 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 * acconfig.h: * configure.in: look in both 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 * 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 * 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 * split out gsl_test code from err/ directory into test/ directory Thu May 4 12:14:42 2000 Brian Gough * added GPL headers throughout Mon May 1 22:11:32 2000 Brian Gough * modified all the makefiles to compile test programs as "test", for simpler automated builds Tue Apr 11 14:51:59 2000 Brian Gough * 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 * 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 * applied patch from C M Murphy to fix up missing consts in header files. Sat Apr 1 20:12:34 2000 Brian Gough * gsl_math.h: added some missing extra constants from BSD (e.g. M_PI_2) Wed Mar 15 11:16:14 2000 Brian Gough * added a directory for complex number support, complex/ Tue Mar 14 10:28:43 2000 Brian Gough * added support for including headers in C++ programs using __BEGIN_DECLS and __END_DECLS macros Sat Mar 11 11:18:33 2000 Brian Gough * 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 * 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 * 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 * 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 * added directory for permutation objects, permutation/ Sun Dec 5 14:20:43 1999 Brian Gough * added multidimensional minimisation directory, multimin/ 1999-12-03 Mark Galassi * 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 * added the eigen value directory, eigen/ 1999-08-30 Mark Galassi * gsl-config.in: started adding this script, for now cannibalized from gnome-config. Fri Aug 20 11:10:54 1999 Brian Gough * support for IEEE on Tru64 from Tim Mooney Mon Aug 16 21:10:23 1999 Brian Gough * added the minimization directory, min/ Fri Aug 6 11:15:58 1999 Brian Gough * 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 * 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 * 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 * 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 * 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 * gsl_mode.h: added prototype for GSL_MODE_PREC(mt) Tue Feb 23 14:18:39 1999 Brian Gough * gsl_math.h (GSL_FDF_EVAL_F): improved names of macros Sat Feb 20 12:14:07 1999 Brian Gough * split out polynomial root finding algorithms into a new poly/ directory 1999-02-25 Mark Galassi * configure.in: upped the version to 0.4.1; this is ready for tagging. 1999-02-06 Mark Galassi * NEWS: udpated in occasion of the imminent 0.4.1 release. Sun Feb 14 20:47:07 1999 Brian Gough * Makefile.am: added gsl_mode.h to include_HEADERS Mon Feb 8 18:39:35 1999 Brian Gough * 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 * 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 * 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 * configure.in: introduced a test for hypot(), in case a system does not have it. 1999-01-03 Mark Galassi * 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 * AUTHORS: corrected the spelling of Gerard Jungman's name (it's either Gerard or Jerry, but not Gerry) 1998-12-05 Mark Galassi * 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 * 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 * 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 * 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 * config.h.in: removed MAX and MIN Wed Nov 18 10:40:18 1998 Brian Gough * gsl_math.h: added prototypes for inline functions GSL_MAX_INT etc Tue Nov 10 20:05:27 1998 Brian Gough * 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 * 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 * configure.in: add -mieee on alpha platforms, also check for both scanf and printf working with long double 1998-08-31 James Theiler * 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 * configure.in: upped release number to 0.4; about to tag and make the release. 1998-08-20 Mark Galassi * 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 * 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 * 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 * Makefile.am: new style single build of libgsl.a Fri Jul 10 19:57:49 1998 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * added matrix and vector subdirectories Wed Mar 18 10:27:27 1998 Brian Gough * 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 * configure.in: 0.3b is now released, so I upped the version number to 0.3c-interim. 1998-02-09 Mark Galassi * configure.in: upped version number to 0.3b 1998-01-30 Mark Galassi * AUTHORS: added Gerry Jungman to the authors list. gsl-doc-2.3/ieee-utils/0000755000175000017500000000000013022553153013024 5ustar eddeddgsl-doc-2.3/ieee-utils/endian.c0000664000175000017500000000216612616157443014447 0ustar eddedd/* ieee-utils/endian.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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); } gsl-doc-2.3/ieee-utils/fp-irix.c0000664000175000017500000000542012616157443014563 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/standardize.c0000664000175000017500000000257612616157443015526 0ustar eddedd/* ieee-utils/standardize.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/ieee-utils/Makefile.am0000664000175000017500000000121412616157443015072 0ustar eddeddnoinst_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 AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/ieee-utils/fp-tru64.c0000664000175000017500000001317712616157443014604 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 */ #include #ifndef FP_RND_RN # undef _FLOAT_H_ # include "/usr/include/float.h" # undef _FLOAT_H_ # include #endif #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-aix.c0000664000175000017500000000772012616157443014376 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* GCC uses a common float.h for all platforms, and ignores all vendor specific code in float.h. That causes problems with fprnd_t, FP_RND_RZ, FP_RND_RN and FP_RND_RP on AIX. Personally I consider that a bug, and was advised by a GCC developer to report this as a bug, which I did. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46155 However, there is not universal agreement whether this is a gcc bug, so the issue needs to be worked around on AIX. David Kirkby, 26th October 2010. */ #if !HAVE_DECL_FPRND_T typedef unsigned short fprnd_t; #endif #ifndef FP_RND_RZ #define FP_RND_RZ 0 #endif #ifndef FP_RND_RN #define FP_RND_RN 1 #endif #ifndef FP_RND_RP #define FP_RND_RP 2 #endif #ifndef FP_RND_RM #define FP_RND_RM 3 #endif 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 ; } gsl-doc-2.3/ieee-utils/fp-os2emx.c0000664000175000017500000000452712616157443015034 0ustar eddedd/* ieee-utils/fp-os2.c * * Copyright (C) 2001 Henry Sobotka * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/env.c0000664000175000017500000000607312616157443014002 0ustar eddedd/* ieee-utils/env.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 defined( _MSC_VER ) extern const char *fp_env_string; p = fp_env_string; #else if (p == 0) /* GSL_IEEE_MODE environment variable is not set */ return ; if (*p == '\0') /* GSL_IEEE_MODE environment variable is empty */ return ; #endif 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") ; } gsl-doc-2.3/ieee-utils/fp-gnum68k.c0000664000175000017500000000527312616157443015115 0ustar eddedd/* ieee-utils/fp-gnum68k.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-gnux86.c0000664000175000017500000000545612616157443014760 0ustar eddedd/* ieee-utils/fp-gnux86.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* Handle libc5, where _FPU_SETCW is not available, suggested by OKUJI Yoshinori and Evgeny Stambulchik */ #ifndef _FPU_SETCW #include #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) ; #if HAVE_FPU_X86_SSE #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) { unsigned int mode_sse = 0; mode_sse |= (mode & 0x3f)<<7; /* exception masks */ mode_sse |= (mode & 0xc00)<<3; /* rounding control */ _FPU_SETMXCSR(mode_sse); } #endif return GSL_SUCCESS ; } gsl-doc-2.3/ieee-utils/TODO0000664000175000017500000000016412616157443013531 0ustar eddedd# -*- org -*- #+CATEGORY: ieee-utils * Fix up ieee-utils/fp-m68klinux.c for correct behavior and actually test it. gsl-doc-2.3/ieee-utils/print.c0000664000175000017500000000523412616157443014344 0ustar eddedd/* ieee-utils/print.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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); } gsl-doc-2.3/ieee-utils/fp-unknown.c0000664000175000017500000000213112616157443015303 0ustar eddedd/* ieee-utils/fp-unknown.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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) ; } gsl-doc-2.3/ieee-utils/fp-gnuppc.c0000664000175000017500000000533612616157443015112 0ustar eddedd/* ieee-utils/fp-gnuppc.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* * 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 ; } gsl-doc-2.3/ieee-utils/gsl_ieee_utils.h0000664000175000017500000000523312616157443016210 0ustar eddedd/* ieee-utils/gsl_ieee_utils.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/ieee-utils/fp-gnuc99.c0000664000175000017500000001046012616157443014726 0ustar eddedd/* ieee-utils/fp-gnuc99.c * * Copyright (C) 2003, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include 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 ", GSL_EUNSUP) ; break ; case GSL_IEEE_DOUBLE_PRECISION: GSL_ERROR ("double precision rounding is not supported by ", GSL_EUNSUP) ; break ; case GSL_IEEE_EXTENDED_PRECISION: GSL_ERROR ("extended precision rounding is not supported by ", 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 ", GSL_EUNSUP) ; #endif break ; case GSL_IEEE_ROUND_DOWN: #ifdef FE_DOWNWARD fesetround (FE_DOWNWARD) ; #else GSL_ERROR ("round-down is not supported by ", GSL_EUNSUP) ; #endif break ; case GSL_IEEE_ROUND_UP: #ifdef FE_UPWARD fesetround (FE_UPWARD) ; #else GSL_ERROR ("round-up is not supported by ", 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 ", GSL_EUNSUP) ; #endif break ; default: #ifdef FE_TONEAREST fesetround (FE_TONEAREST) ; #else GSL_ERROR ("default round-to-nearest mode is not supported by ", 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 ", GSL_EUNSUP); #endif } if (exception_mask & GSL_IEEE_MASK_DENORMALIZED) { /* do nothing */ } else { GSL_ERROR ("denormalized operand exception not supported by . " "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 ", GSL_EUNSUP); #endif } if (exception_mask & GSL_IEEE_MASK_OVERFLOW) { #ifdef FE_OVERFLOW mode &= ~ FE_OVERFLOW ; #else GSL_ERROR ("overflow exception not supported by ", GSL_EUNSUP); #endif } if (exception_mask & GSL_IEEE_MASK_UNDERFLOW) { #ifdef FE_UNDERFLOW mode &= ~ FE_UNDERFLOW ; #else GSL_ERROR ("underflow exception not supported by ", GSL_EUNSUP); #endif } if (exception_mask & GSL_IEEE_TRAP_INEXACT) { #ifdef FE_INEXACT mode |= FE_INEXACT ; #else GSL_ERROR ("inexact exception not supported by ", 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 ; } gsl-doc-2.3/ieee-utils/fp-hpux11.c0000664000175000017500000000536512616157443014746 0ustar eddedd/* ieee-utils/fp-hpux11.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/make_rep.c0000664000175000017500000001064712616157443014777 0ustar eddedd/* ieee-utils/make_rep.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #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 ; } } gsl-doc-2.3/ieee-utils/fp-netbsd.c0000664000175000017500000000561012616157443015070 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } gsl-doc-2.3/ieee-utils/Makefile.in0000644000175000017500000010457213022372405015101 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ieee-utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslieeeutils.la: $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_DEPENDENCIES) $(EXTRA_libgslieeeutils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_rep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/ieee-utils/fp-openbsd.c0000664000175000017500000000575112616157443015251 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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; } gsl-doc-2.3/ieee-utils/ChangeLog0000664000175000017500000001661212616157443014620 0ustar eddedd2010-11-06 Brian Gough * fp-aix.c: added workaround for AIX problems (D. Kirby) 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-06-21 Brian Gough * fp.c: allow universal binaries by checking __ppc__ and __i386__ preprocessor definitions on Darwin 2007-04-23 Brian Gough * fp-gnux86.c (gsl_ieee_set_mode): added support for MXCSR register 2005-02-11 Brian Gough * fp-gnuc99.c (gsl_ieee_set_mode): added an #ifdef for the default round to nearest mode 2003-12-20 Brian Gough * fp-gnuc99.c (_GNU_SOURCE): define _GNU_SOURCE when including fenv.h 2003-07-21 Brian Gough * read.c (gsl_ieee_read_mode_string): added missing mask-division-by-zero to error message 2003-06-14 Brian Gough * 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 * test.c: use system values for FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX Sat May 11 22:30:43 2002 Brian Gough * test.c (TEST_DENORMAL): test denormals only when available, as tested in configure script Mon Sep 10 14:23:52 2001 Brian Gough * 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 * env.c (gsl_ieee_env_setup): send GSL_IEEE_MODE output to stderr Tue Jun 26 10:44:13 2001 Brian Gough * 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 * fp-openbsd.c (gsl_ieee_set_mode): added support for openbsd Tue May 8 10:49:58 2001 Brian Gough * fp-aix.c: changed macros from TRAP_ to TRP_.. Fri Apr 13 15:07:10 2001 Brian Gough * fp-darwin.c: added darwin support from Rodney Sparapani Wed Mar 28 13:12:20 2001 Brian Gough * fp-netbsd.c: added netbsd support from Jason Beegan Thu Mar 15 14:11:29 2001 Brian Gough * fp-hpux11.c: added support for HPUX11 Fri Mar 2 16:58:36 2001 Brian Gough * fp-os2emx.c: add ieee support for OS/2 from Henry Sobotka Thu Jul 20 19:41:56 2000 Brian Gough * fp-freebsd.c (gsl_ieee_set_mode): added fp-freebsd.c from Vladimir Kushnir Mon Jun 12 19:23:53 2000 Brian Gough * 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 Wed Jun 7 19:18:15 2000 Brian Gough * fp-ppclinux.c: added support for ppc linux Tue Jun 6 19:59:50 2000 Brian Gough * fp-x86linux.c: renamed from fp-linux.c Thu May 18 11:53:13 2000 Brian Gough * 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 * 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 * 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 * read.c (gsl_ieee_read_mode_string): changed token separator to , instead of ; Thu Feb 24 19:20:50 2000 Brian Gough * 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 * made internal functions static and removed redundant functions Fri Nov 5 15:01:55 1999 Brian Gough * fp-sparclinux.c: added support for sparclinux Thu Oct 7 13:03:00 1999 Brian Gough * 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 * fp-aix.c: added, based on fp-solaris. Fri Aug 20 12:17:53 1999 Brian Gough * 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 * 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 * 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 * print.c: added fprintf versions of the printf functions Sat May 8 20:39:28 1999 Brian Gough * fp-linux.c (gsl_ieee_set_mode): changed from using the function __fput_setcw() to the macro _FPU_SETCW() since Khimenko Victor reports that __setfpucw() is not in the shared lib version of glibc-2.1.1 Fri Apr 2 20:52:59 1999 Brian Gough * endian.c (setup_dynamic_endianness): removed useless test, u.c[i]<0 for unsigned Fri Aug 21 15:36:22 1998 Brian Gough * fp-unknown.c (gsl_ieee_set_mode): made return type int, as it should be Mon Jun 15 22:02:00 1998 Brian Gough * renamed read-mode-string.c to read.c and print-ieee.c to print.c Tue Jun 2 19:29:34 1998 Brian Gough * 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 * 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 * 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 * This directory contains some routines for examining IEEE format numbers at the bit level gsl-doc-2.3/ieee-utils/fp-freebsd.c0000664000175000017500000000466012616157443015227 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-gnusparc.c0000664000175000017500000000466212616157443015441 0ustar eddedd/* ieee-utils/fp-gnusparc.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-darwin.c0000664000175000017500000000555312616157443015103 0ustar eddedd/* ieee-utils/fp-darwin.c * * Copyright (C) 2001 Rodney Sparapani * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-solaris.c0000664000175000017500000000544612616157443015274 0ustar eddedd/* ieee-utils/fp-solaris.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp-darwin86.c0000664000175000017500000001237512616157443015261 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* 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 ; } gsl-doc-2.3/ieee-utils/fp-sunos4.c0000664000175000017500000000632212616157443015045 0ustar eddedd/* ieee-utils/fp-sunos4.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/fp.c0000664000175000017500000000235412616157443013615 0ustar eddedd#include #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" /* Try to handle universal binaries */ #elif HAVE_DARWIN_IEEE_INTERFACE # if defined(__i386__) # include "fp-darwin86.c" #else # include "fp-darwin.c" # endif #elif HAVE_DARWIN86_IEEE_INTERFACE # if defined(__ppc__) # include "fp-darwin.c" # else # include "fp-darwin86.c" #endif #elif HAVE_DECL_FEENABLEEXCEPT || HAVE_DECL_FESETTRAPENABLE #include "fp-gnuc99.c" #else #include "fp-unknown.c" #endif gsl-doc-2.3/ieee-utils/fp-hpux.c0000664000175000017500000000545712616157443014606 0ustar eddedd/* ieee-utils/fp-hpux.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/ieee-utils/test.c0000664000175000017500000003510512616157443014167 0ustar eddedd/* ieee-utils/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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 ()); } gsl-doc-2.3/ieee-utils/read.c0000644000175000017500000001210012755623667014121 0ustar eddedd/* ieee-utils/read.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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) { free(start); 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) { free(start); GSL_ERROR ("attempted to set IEEE precision twice", GSL_EINVAL) ; } } if (new_rounding) { *rounding = new_rounding ; rounding_count ++ ; if (rounding_count > 1) { free(start); 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 ; } gsl-doc-2.3/NEWS0000644000175000017500000020203413017374704011466 0ustar eddedd* What is new in gsl-2.3: ** bug fix in documentation for gsl_linalg_LU_refine (bug #49728, Joey De Pauw) ** added gsl_multifit_linear_tsvd and gsl_multifit_wlinear_tsvd to give user more control over cutoff for truncated SVD ** added routines for Generalized Cross Validation for regularized linear least squares ** improved rstat example program and added documentation for gsl_rstat_sd_mean (Jonathan Leto) ** added function gsl_multifit_linear_rank ** bug fix in nonlinear least squares when using data weights with finite-difference Jacobian ** add 2D subspace method for large systems (multilarge_nlinear) ** bug fix in gsl_ran_beta for small parameters (bug #47646, Yu Liu) ** bug fix in gsl_complex_tan for negative imaginary arguments (bug #47347, Yu Liu) ** doc bug fix: value of golden ratio ** fixed scaling issue in 2D subspace nonlinear least squares method ** optimize dogleg methods to calculate Gauss-Newton point only when needed * What was new in gsl-2.2.1: ** reverted gsl_linalg_cholesky_decomp to its previous behavior so it is backward compatible; new cholesky routine is gsl_linalg_cholesky_decomp1 * What was new in gsl-2.2: ** updated gsl_linalg_cholesky_invert to use Level-2 BLAS and added function gsl_linalg_pcholesky_invert ** added functions gsl_linalg_tri_*_invert for inverting triangular matrices ** fix GSL_EIGEN_SORT_VAL_{ASC,DESC} for nonsymmetric eigensystems (Victor Zverovich) ** added complete orthogonal decomposition routines (gsl_linalg_COD) ** bug fix where median calculation wasn't reset in gsl_rstat_reset(); added gsl_rstat_quantile_reset() function (reported by Pedro Donato) ** added multivariate Gaussian random distribution gsl_ran_multivariate_gaussian (Timothée Flutre) ** added functions to estimate the 1-norm reciprocal condition number for various matrix factorizations: * gsl_linalg_cholesky_rcond * gsl_linalg_QRPT_rcond ** added functions gsl_linalg_QRPT_{lssolve,lssolve2} to compute least squares solutions with the QRPT decomposition ** added function gsl_permute_matrix() ** added modified Cholesky factorization (gsl_linalg_mcholesky) to handle symmetric indefinite matrices ** added pivoted Cholesky factorization (gsl_linalg_pcholesky) for ill-conditioned matrices ** rewrote (real) Cholesky decomposition to use a Level-2 blas algorithm instead of Level-1. Flop count is about the same but the code is much simpler and easier to follow ** completely rewritten nonlinear least squares module, including support for large problems; the user may now control the linear solver used, the trust region updating strategy, and the scaling method. In addition, support has been added for the geodesic acceleration step (Transtrum 2011) which can speed up convergence on a wide class of problems. ** added gsl_rstat_rms() for root mean square ** optimized lmniel nonlinear least squares solver (bug #46369) ** improved precision in Bessel K0/K1 near x = 2 (Pavel Holoborodko, bug #47401) ** added support for compressed row storage sparse matrices (Alexis Tantet) ** bug fix in convergence check of hypergeometric 2F1 function (bug #45926) ** added gsl_multilarge_linear_lcurve() to compute the L-curve for large linear systems ** updated multilarge normal equations method to use new Cholesky scaling for better numerical stability ** added scaling to Cholesky routines to reduce the condition number prior to factorization * What was new in gsl-2.1: ** added test suite for example programs ** bug fix when compiling with #undef GSL_DISABLE_DEPRECATED ** bug fix in setting libtool age versioning ** bug fix in gsl_multifit_wlinear() ** added gsl_multifit_linear_rcond() to compute reciprocal condition number of least squares matrix ** added gsl_multilarge module for large linear least squares systems * What was new in gsl-2.0: ** fixed bug #43258 for hypergeometric functions (Raymond Rogers) ** added L-curve analysis routines for linear Tikhonov regression ** add running statistics module ** added bilinear and bicubic interpolation (David Zaslavsky) ** added function gsl_multifit_robust_residuals to compute robust fit residuals ** added Steffen monotonic interpolation method (Jean-François Caron) ** added new nonlinear least squares solver 'lmniel' suitable for systems with large numbers of data ** nonlinear least squares solver now tracks the number of function and Jacobian evaluations, see example program for details ** the 'fdf' field of gsl_multifit_function_fdf is now deprecated and does not need to be specified for nonlinear least squares problems ** added extensive test suite to nonlinear least squares module, resulting in a few minor bug fixes; the routine gsl_multifit_fdfsolver_driver has been rewritten (with API change) to handle the various error codes of the lmsder iterate routine, resulting in a high level caller which is highly robust for a wide class of problems ** added support for sparse matrices, including a GMRES iterative linear solver ** added routines gsl_linalg_givens and gsl_linalg_givens_gv for Givens rotations ** added Tikhonov (ridge) regularization to least squares module (linear and nonlinear) ** removed unused argument 'n' from gsl_sf_ellint_D ** merged bspline_deriv_workspace into bspline_workspace to simplify bspline API; the functions gsl_bspline_deriv_alloc gsl_bspline_deriv_free are now deprecated and will be removed in a future release. ** merged ALF extension into GSL for associated Legendre functions; api has changed; consequently the functions: gsl_sf_legendre_Plm_array gsl_sf_legendre_Plm_deriv_array gsl_sf_legendre_sphPlm_array gsl_sf_legendre_sphPlm_deriv_array gsl_sf_legendre_array_size are now deprecated and will be removed in a future release. ** added function gsl_multifit_robust_weights to allow user to access the various weighting functions * What was new in gsl-1.16: ** fixed error in gsl_rng_fwrite where uninitialized padding bytes were being written (bug #39104) ** fixed error in gsl_block_alloc where padding bytes were not properly initialized (bugs #39101,#39102,#39103) ** fixed error in ntuple/test.c where padding bytes were not properly initialized (bug #39105) ** fixed triangle selection bug in gsl_sf_coupling_6j_e and gsl_sf_coupling_9j_e (bugs #39466 and #29606) (Håkan Johansson and Alexey Illarionov) ** added higher level wrapper routine gsl_multifit_fdfsolver_driver ** converted gsl_multifit_linear_residuals to use dgemv to improve efficiency (bug #39153) ** added functions gsl_stats_spearman and gsl_sort_vector2 to compute Spearman rank correlation ** added function gsl_poly_dd_hermite_init for Hermite interpolation ** Added support for robust linear least squares ** Added function gsl_linalg_SV_leverage for computing statistical leverages from SVD decomposition ** Added support for approximating the Jacobian of nonlinear least squares fits using forward finite differences ** Extended gsl_sf_coupling_3j to allow larger range and to handle the special case (ja jb jc; 0 0 0)=0 when ja+jb+jc is odd ** Fixed gsl_sf_mathieu_se_array to return zero when the order is zero [bug #33679]. ** Fixed overflow in gsl_sf_lncosh for large negative x (x<-354). ** Improved gsl_ran_negative_binomial_pdf to avoid underflow/overflow for large arguments. ** Multisets now allow k strictly greater than n. ** Fixed gsl_matrix_complex_fwrite/fread failure for noncontiguous matrices (Matthias Sitte). * What was new in gsl-1.15: ** Added Tuomo Keskitalo's new ode branch ode-initval2 with a gsl_odeiv2 prefix. This provides proper support for implicit solvers. It is intended to be the new default for differential equations. The existing gsl_odeiv routines will be retained for binary compatibility but their interface will be deprecated. ** Added new gsl_integrate_cquad routines for robust integration of difficult functions using the doubly-adaptive CQUAD algorithm (Pedro Gonnet). ** Added error checking to CBLAS functions (José Luis García Pallero) ** Added a new function gsl_integration_glfixed_point to return ordered Gauss-Legendre points and weights contained within a gsl_integration_glfixed_table [bug #32237]. ** Added a new function gsl_interp_type_min_size to return the size of an interpolation type. ** Added a function gsl_pow_uint(x,n) to compute x^n for unsigned exponents (needed when n exceeds the range of signed integers). ** Added new routine gsl_linalg_complex_cholesky_invert to handle the matrix inversion for complex Cholesky decompositions (Huan Wu). ** Added the functions gsl_vector_equal(x,y) and gsl_matrix_equal(x,y) for testing equality of two vectors or matrices. ** Added function gsl_eigen_nonsymmv_params to control the balancing transformation for eigenvector calculations. Balancing is now turned off by default for gsl_eigen_nonsymmv. ** It is now possible to choose an alternative cblas library via pkg-config using the GSL_CBLAS_LIB environment variable or the pkg-config --define-variable option. ** The jacobi method gsl_eigen_jacobi now uses the norm of the off-diagonal elements for its convergence criterion, as in algorithm 8.4.3 of Golub and van Loan. ** The newton multiroot solvers now return an error when a singular jacobian is detected. ** The interpolation functions now return NaN and when x is out of range, instead of extrapolating. ** The gsl_multimin_fdfsolver multidimensional minimisers now return GSL_ENOPROG immediately if the generated trial point does not differ from the initial point (to machine precision), avoiding unnecessary further iterations. ** Extended the range of gsl_sf_bessel_lnKnu_e by rescaling intermediate results to avoid internal overflows [bug #31528]. ** Improved the result of gsl_sf_atanint_e for large arguments by adding the first order 1/x correction term. [bug #29562] ** Fixed the gsl_rng_ranlxs generators to enforce a maximum seed value of 2^31-1. Larger seed values corrupted the random number state and caused out of range values to be returned. ** Fixed gsl_ran_chisq_pdf(x,nu) to return correct result of 1/2 instead of 0 when x=0 and nu=2, and +inf when x=0 and nu<2. ** Fixed gsl_pow_int(x,n) to avoid an infinite loop when n=INT_MIN due to wrapping of signed integers. ** Fixed gsl_sf_hyperg_2F1(a,b,c,x) to avoid returning NaN for arguments |a|>10. [bug #24812] ** Avoid spurious underflow return code in gsl_sf_beta_inc_e when intermediate underflow does not affect the result. [bug #30933] ** Avoid segfault in Chebyshev series derivatives gsl_cheb_calc_deriv for n=1. [bug #29139] * What was new in gsl-1.14: ** Upgraded to latest libtool, autoconf and automake (libtool-2.2.6b, autoconf-2.65, automake-1.11.1). Fixes security hole in 'make dist' (see Automake CVE-2009-4029). ** Added support for "multisets", which are similar to permutations and combinations. A multiset is an array of k integers in the range 0 to n-1 where each value may occur more than once. Multisets can be used to iterate over the indices of a k-th order symmetric tensor in n-space. (Rhys Ulerich) ** Added gsl_integrate_glfixed routines for performing fixed order Gauss-Legendre integration (Pavel Holoborodko, Konstantin Holoborodko, Rhys Ulerich) ** In the LMDER multi-dimensional fitting routines, the return code GSL_ENOPROG is now used instead of GSL_CONTINUE for the case where 10 or more attempts to find a suitable trial step have been made without success. [bug #25383] ** The confluent hypergeometric function gsl_sf_hyperg_U (a,b,x) has been extended to support x < 0 for cases not involving singularities in 1F1(a,b,x). [bug #27859] ** The F-distribution gsl_ran_fdist_pdf now avoids unnecessary underflow and overflow and handles cases where n > 248. [bug #28500] ** The SVD routines now use a scaled version of the implicit QR method and compute the shift more reliably for values at the limit of double precision, avoiding potential NaNs. [bug #28767] ** A compile time error is emitted if the configuration stage prevents the functions gsl_isnan and gsl_finite from being defined. ** Added missing dereference in GSL_VECTOR_COMPLEX when not using GSL_RANGE_CHECK [bug #28017] ** Improved the range of gsl_sf_hyperg1F1(a,b,x) when a<0,b>0. [bug #28718] ** Added macros GSL_MAJOR_VERSION and GSL_MINOR_VERSION in ** Improved gsl_eigen_symmv and gsl_eigen_symm to avoid a potential infinite loop when the tridiagonalised matrix contains very small values. [bug #28096] ** Added functions gsl_multifit_linear_usvd and gsl_multifit_wlinear_usvd for multilinear fitting without column-scaling of the fit matrix. * What was new in gsl-1.13: ** Upgraded to latest autoconf and automake (autoconf-2.64, automake-1.11) ** Fixed the rk4 and bspline allocators to avoid invalid free() calls under out of memory conditions. [bug #27194, #27236] ** Fixed a bug in gsl_multimin_fminimizer_nmsimplex2 where the center and size of the simplex were not updated on contract-by-best steps, causing failures in convergence. [bug #27180] ** Added new functions to set MISER and VEGAS Monte Carlo integration parameters, and to examine VEGAS chi-squared value and intermediate results. ** Added the function gsl_bspline_greville_abscissa to compute Greville abscissae for B-splines. ** The cumulative distribution functions gsl_cdf_gumbel1_{P,Q} should now handle a larger range of parameters without underflow and overflow. ** The header file gsl_const_cgs.h no longer defines values for electromagnetic units. Applications should use gsl_const_cgsm.h instead to obtain the values in the CGS-Magnetic system. The previous values for these units given in gsl_const_cgs.h were ill-defined as the type of CGS electromagnetic system was unspecified (the values were a mixture of CGS units with the Ampere of the MSKA system). The affected constants are GSL_CONST_CGS_BOHR_MAGNETON, GSL_CONST_CGS_ELECTRON_CHARGE, GSL_CONST_CGS_ELECTRON_MAGNETIC_MOMENT, GSL_CONST_CGS_FARADAY, GSL_CONST_CGS_GAUSS, GSL_CONST_CGS_NUCLEAR_MAGNETON, GSL_CONST_CGS_PROTON_MAGNETIC_MOMENT, and GSL_CONST_CGS_ROENTGEN. ** The Pochhammer functions gsl_sf_poch(a,x) and gsl_sf_lnpoch(a,x) now handle the special cases where a and a+x are zero or negative integers. ** The confluent hypergeometric function gsl_sf_hyperg_U (a,b,x) now handles some cases where x=0. The case where 1+a-b is a negative integer no longer returns an error [bug #22859] and the incorrect termination of the series in certain cases is fixed [bug #26706]. ** Added a new function gsl_poly_eval_derivs to evaluate a polynomial and its derivatives simultaneously. ** Added a new univariate minimisation algorithm gsl_min_fminimizer_quad_golden which is a variant of Brent's algorithm with safeguarded step-length adjustment. ** Added a new Nelder-Mead minimiser gsl_multimin_fminimizer_nmsimplex2rand which uses a randomly oriented simplex rather than one fixed on the coordinate axes [bug #25077] ** The texinfo file now uses the dircategory "Software libraries" from the Free Software Directory, as recommended in the Texinfo manual. ** The function gsl_ran_exponential now includes zero in its output range. [bug #25039] ** All functions for freeing allocated memory now accept a NULL pointer, following the standard C convention for free(). [bug #25319] ** The function gsl_sum_levin_u_accel now handles the special case c_0 + 0 + 0 + 0 + .... that occurs when summing power series c_n*x^n with x=0. [bug #26807] ** The functions gsl_linalg_LU_solve, gsl_linalg_LU_svx, gsl_linalg_LU_refine, gsl_linalg_LU_invert and their complex equivalents now return an error for singular matrices. ** The multifit LMDER hybrid solvers now check the return code of the user-supplied function in the gsl_multifit_fdfsolver_set method. [bug #26871] ** Improved the implementation of gsl_ran_discrete_preproc to avoid internal errors due to inconsistencies from excess precision on some platforms. [bug #26502] ** Corrected gsl_sf_hyperg_2F1(a,b,c,x) to not give a domain error in the case where c is a negative integer and the series terminates with a finite result. ** The C99 inline keyword is now supported, in addition to the previously supported GNU-style inline. ** Modified gsl_poly_complex_solve_cubic and gsl_poly_solve_cubic to avoid returning NaNs in cases where excess precision causes a change in the number of roots. ** Fixed incorrect length check in gsl_blas_drotm. [bug #26503] ** Fixed gsl_odeiv_step_gear2 to restore y on step failure ** gsl_odeiv_evolve_apply now restores the correct value of t on step failures [bug #26255]. ** Using make install prefix=DIR now puts correct paths in package config files gsl-config and gsl.pc ** Modified gsl_monte_vegas to work around pow() function inaccuracies on MinGW [bug #25413]. ** Increased the number of terms in gsl_sf_mathieu_a and gsl_sf_mathieu_b to improve convergence in difficult regions [bug #25075] * What was new in gsl-1.12: ** Upgraded to latest libtool, autoconf and automake (libtool-2.2.6, autoconf-2.63, automake-1.10.2) ** Improved the convergence of gsl_sf_gamma_inc_P for x/a ~=~ 1 and large x,a. Fixes problems with large arguments in cdf functions such as gsl_cdf_chisq_Pinv(x,nu) [bug 24704]. ** Fixed gsl_ran_gamma_knuth to handle the case of a >= UINT_MAX [bug #24897] ** Added gsl_bspline_eval_deriv to compute bspline derivatives (Rhys Ulerich) ** Added a faster simplex mininimser gsl_multimin_fminimizer_nmsimplex2 which is O(N) instead of O(N^2) [bug #24418] ** Improved the original chi-squared formula in gsl_monte_vegas to avoid catastrophic cancellation [bug #24510]. The previous formula could return incorrect or negative values for relative errors < 1e-8, which could occur when integrating very smooth functions. ** Added new auxiliary functions gsl_cheb_order, gsl_cheb_size, gsl_cheb_coeffs for Chebyshev series [bug #21830] ** Updated license of the reference manual to GNU FDL version 1.3. ** Fixed a bug where the gsl_isinf function would return +1 for -Inf on systems where isinf(-Inf) returns the non-standard value +1. [bug #24489] ** Added missing functions gsl_vector_complex_{isnonneg,add,sub,mul, div,scale,add_constant} and gsl_matrix_complex_float_isnonneg [bug #22478] ** Cross compilation should now work for x86 hosts. ** Fixed a bug in gsl_interp_accel_find() where values lying on the upper boundary between interpolation points could return the index from the lower side. [bug #24211] ** Fixed gsl_linalg_solve_cyc_tridiag so that its output respects the solution vector's stride. Previously the x_stride value was ignored causing the output to be incorrect for non-unit stride. [bug #24162] ** Corrected a bug in the series calculation of gsl_sf_ellint_Kcomp for k close to 1. [bug #24146] ** Extended gsl_linalg_QRPT_update to handle rectangular matrices. Corrected definition of the update formula in the manual for both gsl_linalg_QR_update and gsl_linalg_QRPT_update. ** Added routine gsl_linalg_cholesky_invert ** Fixed a bug the simplex algorithm which caused the second highest point to be incorrectly equal to the first when the first value was the highest, which could cause suboptimal convergence. [bug #23192] ** Fixed a problem with convergence for inverse gamma and chisq distribitions, gsl_cdf_gamma_{P,Q}inv and gsl_cdf_chisq_{P,Q}inv. [bug #23101] ** Improved the handling of constant regions in Vegas by eliminating spurious excess precision when computing box variances. ** Fixed a potential division by zero in gsl_monte_miser when the left/right weight factors decrease below 1. ** Fixed incorrect dimensions check in gsl_matrix_sub{row,column} * What was new in gsl-1.11: ** The GSL repository and bug database are now hosted at Savannah http://savannah.gnu.org/projects/gsl/ ** Upgraded to latest libtool, autoconf and automake (libtool-2.2, autoconf-2.61, automake-1.10.1) ** Fixed underflow in ODE adaptive step size controller that could cause step size to decrease to zero (bug #21933). ** Improved the handling of the asymptotic regime in gsl_sf_bessel_jl. ** Improved the handling of large arguments in cumulative distribution functions using the incomplete beta function, such as gsl_cdf_fdist_P. ** Fixed overflow bug in gsl_cdf_hypergeometric_{P,Q} for large arguments (bug #22293). ** gsl_ran_gaussian_ziggurat now handles generators with different ranges explicitly, to minimise the number of function calls required (bug #21820). Also fixes bug #22446 (rng limit in gsl_ran_chisq()). ** Added missing error terms in gsl_sf_exp_mult_e10_e to prevent the error being underestimated (bug #22041). ** Updated some constants to the CODATA 2006 values. ** The hypergeometric function gsl_sf_hyperg_2F1 now handles the case where x==1. ** Fixed a bug in the brent minimiser which prevented optimal convergence. ** Added functions for evaluating complex polynomials ** The convergence condition for gsl_multiroots_test_delta now accepts dxi == 0. ** Improved functions gsl_ldexp and gsl_frexp to handle the full range of double precision numbers in all cases. ** Added new quasi random generators gsl_qrng_halton and gsl_qrng_reversehalton which support dimensions up to 1229. ** Added function gsl_multifit_linear_residuals for computing the residuals of the fit * What was new in gsl-1.10: ** License updated to GNU GPL version 3. ** Added support for generalized eigensystems ** Added function gsl_stats_correlation to compute Pearson correlation of two datasets ** Added the new function gsl_sf_expint(n,x) for computing the n-th order exponential integral. ** Added functions gsl_vector_isnonneg and gsl_matrix_isnonneg. ** Added functions gsl_matrix_subrow and gsl_matrix_subcolumn ** Extended Cholesky routines to complex matrices ** Added support in gsl_ieee_set_mode for controlling SSE exceptions and rounding through the MXCSR control word on x86 processors. ** The autoconf macro AM_PATH_GSL has been renamed to AX_PATH_GSL, to avoid conflicts with the autoconf namespace. ** Improved handling of underflow in gsl_eigen_symm. ** The function gsl_multiroot_fdjacobian now returns the error code GSL_ESING if any of the columns of the computed jacobian matrix are zero. This may occur if the step size of the derivative is too small. ** Extended the function gsl_sf_beta_inc(a,b,x) to handle cases where a<0 or b<0. ** Fixed the round-off error estimate in gsl_deriv_{central,backwards, forward} to correctly account for numerical error in the step-size h. ** Fixed gsl_cdf_beta_Pinv, gsl_cdf_gamma_Pinv, gsl_cdf_beta_Pinv to avoid returning spurious values for large parameters when the iteration did not converge. If the iteration cannot converge, GSL_NAN is returned. ** gsl_ran_dirichlet now handles smaller values of alpha[] without underflow, avoiding a NaN in the returned value. ** The SVD routines now avoid underflow in the Schur decomposition for matrices with extremely small values 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

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) 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 to include declarations for error codes in inline versions of gsl_sf_log functions ** Fixed header file 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 -110. ** 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 . ** 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: gsl-doc-2.3/gsl-randist.c0000664000175000017500000002330712616157443013373 0ustar eddedd/* randist/gsl-randist.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include 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"); printf( " 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) ; } gsl-doc-2.3/build.h0000664000175000017500000000175712616157443012255 0ustar eddedd/* Compile subsequent inline functions as static functions */ #ifdef __GSL_BUILD_H__ #error build.h must not be included multiple times #endif #define __GSL_BUILD_H__ #ifdef COMPILE_INLINE_STATIC #ifndef HIDE_INLINE_STATIC /* skip if inline functions are hidden */ #undef __GSL_INLINE_H__ #define __GSL_INLINE_H__ /* first, ignore the gsl_inline.h header file */ #undef INLINE_DECL #define INLINE_DECL /* disable inline in declarations */ #undef INLINE_FUN #define INLINE_FUN /* disable inline in definitions */ #ifndef HAVE_INLINE /* enable compilation of definitions in .h files */ #define HAVE_INLINE #endif /* Compile range checking code for inline functions used in the library */ #undef GSL_RANGE_CHECK #define GSL_RANGE_CHECK 1 /* Use the global variable gsl_check_range to enable/disable range checking at runtime */ #undef GSL_RANGE_COND #define GSL_RANGE_COND(x) (gsl_check_range && (x)) #endif #else #error must be called with COMPILE_INLINE_STATIC #endif gsl-doc-2.3/README0000664000175000017500000000501412616157443011653 0ustar eddeddGSL - 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 webpage at http://www.gnu.org/software/gsl/ gsl-doc-2.3/fft/0000755000175000017500000000000013022553154011537 5ustar eddeddgsl-doc-2.3/fft/hc_pass_4.c0000664000175000017500000001466212616157443013572 0ustar eddedd/* fft/hc_pass_4.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/gsl_dft_complex_float.h0000664000175000017500000000347612616157443016273 0ustar eddedd/* fft/gsl_dft_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/gsl_fft_complex.h0000664000175000017500000001133612616157443015102 0ustar eddedd/* fft/gsl_fft_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/hc_pass.h0000664000175000017500000000636512616157443013355 0ustar eddedd/* fft/hc_pass.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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[]); gsl-doc-2.3/fft/gsl_dft_complex.h0000664000175000017500000000342612616157443015101 0ustar eddedd/* fft/gsl_dft_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/real_init.c0000664000175000017500000001047412616157443013672 0ustar eddedd/* fft/real_init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) { RETURN_IF_NULL (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) { RETURN_IF_NULL (workspace); /* release scratch space */ free (workspace->scratch); workspace->scratch = NULL; free (workspace) ; } gsl-doc-2.3/fft/gsl_fft_halfcomplex_float.h0000664000175000017500000000624212616157443017122 0ustar eddedd/* fft/gsl_fft_halfcomplex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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__ */ gsl-doc-2.3/fft/real_pass_2.c0000664000175000017500000000720612616157443014115 0ustar eddedd/* fft/real_pass_2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/compare_source.c0000664000175000017500000000626312616157443014733 0ustar eddedd/* fft/compare_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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; } gsl-doc-2.3/fft/dft_source.c0000664000175000017500000000616412616157443014062 0ustar eddedd/* fft/dft_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/Makefile.am0000664000175000017500000000242512616157443013611 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 gsl-doc-2.3/fft/real_pass_5.c0000664000175000017500000002437212616157443014123 0ustar eddedd/* fft/real_pass_5.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/gsl_fft_real_float.h0000664000175000017500000000451612616157443015545 0ustar eddedd/* fft/gsl_fft_real_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/c_pass_5.c0000664000175000017500000001703512616157443013420 0ustar eddedd/* fft/c_pass_5.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/c_main.c0000664000175000017500000001573112616157443013153 0ustar eddedd/* fft/c_main.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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; } gsl-doc-2.3/fft/real_pass_3.c0000664000175000017500000001332312616157443014113 0ustar eddedd/* fft/real_pass_3.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/hc_pass_5.c0000664000175000017500000002275512616157443013575 0ustar eddedd/* fft/hc_pass_5.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/real_pass_n.c0000664000175000017500000002052212616157443014205 0ustar eddedd/* fft/real_pass_n.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/TODO0000664000175000017500000000126312616157443012244 0ustar eddedd# -*- org -*- #+CATEGORY: fft * 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. gsl-doc-2.3/fft/hc_unpack.c0000664000175000017500000000547612616157443013665 0ustar eddedd/* fft/hc_unpack.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/gsl_fft_real.h0000664000175000017500000000427012616157443014355 0ustar eddedd/* fft/gsl_fft_real.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/hc_pass_3.c0000664000175000017500000001235712616157443013570 0ustar eddedd/* fft/hc_pass_3.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/real_unpack.c0000664000175000017500000000245412616157443014207 0ustar eddedd/* fft/real_unpack.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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; } gsl-doc-2.3/fft/fft.c0000664000175000017500000000465012616157443012502 0ustar eddedd#include #include #include #include #include #include #include #include #include #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 #include #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 #include #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 gsl-doc-2.3/fft/hc_pass_n.c0000664000175000017500000002006512616157443013656 0ustar eddedd/* fft/hc_pass_n.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/dft.c0000664000175000017500000000073212616157443012475 0ustar eddedd#include #include #include #include #include #include #include #include #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 gsl-doc-2.3/fft/c_pass_4.c0000664000175000017500000001221512616157443013412 0ustar eddedd/* fft/c_pass_4.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/bitreverse.c0000664000175000017500000000473512616157443014101 0ustar eddedd/* fft/bitreverse.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #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; } gsl-doc-2.3/fft/gsl_fft.h0000664000175000017500000000257212616157443013355 0ustar eddedd/* fft/gsl_fft.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_fft_forward = -1, gsl_fft_backward = +1 } gsl_fft_direction; /* 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__ */ gsl-doc-2.3/fft/c_pass_6.c0000664000175000017500000002023112616157443013411 0ustar eddedd/* fft/c_pass_6.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/signals.c0000664000175000017500000000077312616157443013365 0ustar eddedd#include #include #include #include #include #include #include #include #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 gsl-doc-2.3/fft/gsl_fft_halfcomplex.h0000664000175000017500000000572412616157443015741 0ustar eddedd/* fft/gsl_fft_halfcomplex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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__ */ gsl-doc-2.3/fft/urand.c0000664000175000017500000000171212616157443013030 0ustar eddedd/* fft/urand.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ; } gsl-doc-2.3/fft/complex_internal.h0000664000175000017500000000055612616157443015274 0ustar eddedd/* 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_ */ gsl-doc-2.3/fft/compare.h0000664000175000017500000000251212616157443013351 0ustar eddedd/* fft/compare.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); gsl-doc-2.3/fft/Makefile.in0000644000175000017500000010544713022372405013615 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslfft_la_LIBADD = am_libgslfft_la_OBJECTS = dft.lo fft.lo libgslfft_la_OBJECTS = $(am_libgslfft_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fft/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslfft.la: $(libgslfft_la_OBJECTS) $(libgslfft_la_DEPENDENCIES) $(EXTRA_libgslfft_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfft_la_OBJECTS) $(libgslfft_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/fft/ChangeLog0000664000175000017500000001027012616157443013324 0ustar eddedd2009-07-09 Brian Gough * real_init.c (FUNCTION): handle NULL argument in free * hc_init.c (FUNCTION): handle NULL argument in free * c_init.c (FUNCTION): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2006-03-16 Brian Gough * changed to gsl_fft_forward and gsl_fft_backward enums throughout internally instead of forward and backward. 2005-05-19 Brian Gough * Makefile.am (noinst_HEADERS): removed unused real.c Tue Jul 24 15:16:50 2001 Brian Gough * single precision fft now uses float throughout, rather than mixing float and double. Mon Jul 16 12:38:29 2001 Brian Gough * reorganized function names and split work Tue May 1 14:35:52 2001 Brian Gough * Makefile.am (libgslfft_la_SOURCES): removed spurious headers from SOURCES line 2000-10-19 Brian Gough * 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 * Makefile.am (pkginclude_HEADERS): added missing pkginclude_HEADERS for float functions. Mon Feb 14 15:11:55 2000 Brian Gough * made all internal functions static (required a slight reorganization) Fri Aug 6 11:20:25 1999 Brian Gough * removed dependence on rand() and RAND_MAX Sun Feb 14 17:31:21 1999 Brian Gough * started converting header files to use gsl_complex_packed_array more consistently Mon Dec 14 22:55:00 1998 Brian Gough * real_init.c: fixed a possible malloc(0) bug found by Electric Fence. Mon Nov 23 15:47:13 1998 Brian Gough * 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 * compare_source.c: fix up int/unsigned format types to prevent warnings Wed Oct 28 15:07:22 1998 Brian Gough * c.c: added #include for memcpy * c_float.c: added #include for memcpy Thu Sep 10 12:05:07 1998 Brian Gough * 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 * 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 * c_main.c: renamed c.c to c_main.c Tue Jul 28 11:30:43 1998 Brian Gough * 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 * bitreverse.c: removed gsl_ftt_ prefix from non-exported functions Wed Jun 10 17:36:01 1998 Brian Gough * 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 * 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 * 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 * To be compatible with other architectures use size_t everywhere instead of unsigned int Sat Mar 21 17:28:26 1998 Brian Gough * 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 * Makefile.am: fixed a typo: removed trailing \ at the end of this file. gsl-doc-2.3/fft/c_radix2.c0000664000175000017500000002045112616157443013413 0ustar eddedd/* fft/c_radix2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/c_pass_n.c0000664000175000017500000001374012616157443013510 0ustar eddedd/* fft/c_pass_n.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; } gsl-doc-2.3/fft/c_pass_7.c0000664000175000017500000003075312616157443013424 0ustar eddedd/* fft/c_pass_7.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/test_real_source.c0000664000175000017500000001660212616157443015265 0ustar eddedd/* fft/test_real.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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 <>= 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) ; } gsl-doc-2.3/fft/gsl_fft_complex_float.h0000664000175000017500000001234512616157443016270 0ustar eddedd/* fft/gsl_fft_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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__ */ gsl-doc-2.3/fft/real_main.c0000664000175000017500000000765212616157443013657 0ustar eddedd/* fft/real_main.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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; } gsl-doc-2.3/fft/c_pass.h0000664000175000017500000001137112616157443013176 0ustar eddedd/* fft/c_pass.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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[]); gsl-doc-2.3/fft/c_pass_2.c0000664000175000017500000000577612616157443013426 0ustar eddedd/* fft/c_pass_2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/real_pass_4.c0000664000175000017500000001604512616157443014120 0ustar eddedd/* fft/real_pass_4.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/real_pass.h0000664000175000017500000000655312616157443013705 0ustar eddedd/* fft/real_pass.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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[]); gsl-doc-2.3/fft/signals.h0000664000175000017500000000565012616157443013371 0ustar eddedd/* fft/signals.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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[]); gsl-doc-2.3/fft/c_pass_3.c0000664000175000017500000001050712616157443013413 0ustar eddedd/* fft/c_pass_3.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/hc_pass_2.c0000664000175000017500000000637112616157443013566 0ustar eddedd/* fft/hc_pass_2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/c_init.c0000664000175000017500000001131012616157443013157 0ustar eddedd/* fft/c_init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) { RETURN_IF_NULL (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) { RETURN_IF_NULL (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 ; } gsl-doc-2.3/fft/test_trap_source.c0000664000175000017500000001226012616157443015304 0ustar eddedd/* fft/test_trap.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) ; } gsl-doc-2.3/fft/test_complex_source.c0000664000175000017500000003560712616157443016017 0ustar eddedd/* fft/test_complex.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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<>= 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); } gsl-doc-2.3/fft/real_radix2.c0000664000175000017500000000753712616157443014126 0ustar eddedd/* fft/real_radix2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/factorize.h0000664000175000017500000000232112616157443013707 0ustar eddedd/* fft/factorize.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) ; gsl-doc-2.3/fft/hc_radix2.c0000664000175000017500000001133512616157443013564 0ustar eddedd/* fft/hc_radix2.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/fft/hc_main.c0000664000175000017500000001222012616157443013311 0ustar eddedd/* fft/hc_main.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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; } gsl-doc-2.3/fft/hc_init.c0000664000175000017500000000640612616157443013341 0ustar eddedd/* fft/hc_init.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) { RETURN_IF_NULL (wavetable); /* release trigonometric lookup tables */ free (wavetable->trig); wavetable->trig = NULL; free (wavetable); } gsl-doc-2.3/fft/test.c0000664000175000017500000000630612616157443012702 0ustar eddedd/* fft/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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) ; } gsl-doc-2.3/fft/bitreverse.h0000664000175000017500000000250712616157443014101 0ustar eddedd/* fft/bitreverse.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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) ; gsl-doc-2.3/multifit/0000755000175000017500000000000013022553154012615 5ustar eddeddgsl-doc-2.3/multifit/test_kowalik.c0000664000175000017500000000630013017642205015462 0ustar eddedd#define kowalik_N 11 #define kowalik_P 4 #define kowalik_NTRIES 4 static double kowalik_x0[kowalik_P] = { 0.25, 0.39, 0.415, 0.39 }; static double kowalik_epsrel = 1.0e-7; static double kowalik_Y[kowalik_N] = { 0.1957, 0.1947, 0.1735, 0.1600, 0.0844, 0.0627, 0.0456, 0.0342, 0.0323, 0.0235, 0.0246 }; static double kowalik_U[kowalik_N] = { 4.0000, 2.0000, 1.0000, 0.5000, 0.2500, 0.1670, 0.1250, 0.1000, 0.0833, 0.0714, 0.0625 }; static void kowalik_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; gsl_vector_const_view v = gsl_vector_const_view_array(x, kowalik_P); const double norm = gsl_blas_dnrm2(&v.vector); const double sumsq_exact1 = 3.075056038492370e-04; const double kowalik_x1[kowalik_P] = { 1.928069345723978e-01, 1.912823290344599e-01, 1.230565070690708e-01, 1.360623308065148e-01 }; const double sumsq_exact2 = 0.00102734304869549252; const double kowalik_x2[kowalik_P] = { -99999.9, /* inf */ -14.0758834005984603, -99999.9, /* -inf */ -99999.9 }; /* -inf */ const double *kowalik_x; double sumsq_exact; if (norm < 10.0) { kowalik_x = kowalik_x1; sumsq_exact = sumsq_exact1; } else { kowalik_x = kowalik_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kowalik_P; ++i) { if (kowalik_x[i] < -90000.0) continue; gsl_test_rel(x[i], kowalik_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kowalik_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double yi = kowalik_Y[i]; double ui = kowalik_U[i]; double fi = yi - (x1*ui*(ui+x2)) / (x4 + ui*(ui + x3)); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int kowalik_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double ui = kowalik_U[i]; double term1 = ui*(ui + x2); double term2 = ui*(ui + x3) + x4; gsl_matrix_set(J, i, 0, -term1 / term2); gsl_matrix_set(J, i, 1, -ui*x1/term2); gsl_matrix_set(J, i, 2, ui*term1*x1 / (term2*term2)); gsl_matrix_set(J, i, 3, term1*x1 / (term2*term2)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf kowalik_func = { &kowalik_f, &kowalik_df, NULL, kowalik_N, kowalik_P, NULL, 0, 0 }; static test_fdf_problem kowalik_problem = { "kowalik", kowalik_x0, NULL, &kowalik_epsrel, kowalik_NTRIES, &kowalik_checksol, &kowalik_func }; gsl-doc-2.3/multifit/test_brown2.c0000664000175000017500000000466012616157443015252 0ustar eddedd#define brown2_N 5 #define brown2_P 5 #define brown2_NTRIES 3 static double brown2_x0[brown2_P] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; static double brown2_epsrel = 1.0e-12; static void brown2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; double sumsq_exact; double alpha; const double p = (double) brown2_P; double alpha1mp, lhs, lastel; if (sumsq < 0.5) { /* sumsq = 0 case */ sumsq_exact = 0.0; alpha = x[0]; alpha1mp = pow(alpha, 1.0 - p); lhs = p*pow(alpha, p) - (p + 1)/alpha1mp; lastel = alpha1mp; gsl_test_rel(lhs, -1.0, epsrel, "%s/%s alpha lhs", sname, pname); } else { /* sumsq = 1 case */ sumsq_exact = 1.0; alpha = 0.0; lastel = p + 1.0; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < brown2_P - 1; ++i) { gsl_test_rel(x[i], alpha, epsrel, "%s/%s i=%zu", sname, pname, i); } gsl_test_rel(x[brown2_P - 1], lastel, epsrel, "%s/%s last element", sname, pname); } static int brown2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = -(brown2_N + 1.0); double prod = 1.0; for (i = 0; i < brown2_N; ++i) { double xi = gsl_vector_get(x, i); sum += xi; prod *= xi; } for (i = 0; i < brown2_N - 1; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi + sum); } gsl_vector_set(f, brown2_N - 1, prod - 1.0); return GSL_SUCCESS; } static int brown2_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (j = 0; j < brown2_P; ++j) { double prod = 1.0; for (i = 0; i < brown2_N - 1; i++) { double Jij = (i == j) ? 2.0 : 1.0; gsl_matrix_set(J, i, j, Jij); } for (i = 0; i < brown2_N; i++) { if (i != j) prod *= gsl_vector_get(x, i); } gsl_matrix_set(J, brown2_N - 1, j, prod); } return GSL_SUCCESS; } static gsl_multifit_function_fdf brown2_func = { &brown2_f, &brown2_df, NULL, brown2_N, brown2_P, NULL, 0, 0 }; static test_fdf_problem brown2_problem = { "brown_almost_linear", brown2_x0, NULL, &brown2_epsrel, brown2_NTRIES, &brown2_checksol, &brown2_func }; gsl-doc-2.3/multifit/test_powell1.c0000664000175000017500000000430712616157443015422 0ustar eddedd#define powell1_N 4 #define powell1_P 4 #define powell1_NTRIES 4 static double powell1_x0[powell1_P] = { 3.0, -1.0, 0.0, 1.0 }; static double powell1_epsrel = 1.0e-5; static void powell1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell1_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); gsl_vector_set(f, 0, x1 + 10.0*x2); gsl_vector_set(f, 1, sqrt(5.0) * (x3 - x4)); gsl_vector_set(f, 2, pow(x2 - 2.0*x3, 2.0)); gsl_vector_set(f, 3, sqrt(10.0) * pow((x1 - x4), 2.0)); return GSL_SUCCESS; } static int powell1_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); double term1 = x2 - 2.0*x3; double term2 = x1 - x4; gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 0, 2, 0.0); gsl_matrix_set(J, 0, 3, 0.0); gsl_matrix_set(J, 1, 0, 0.0); gsl_matrix_set(J, 1, 1, 0.0); gsl_matrix_set(J, 1, 2, sqrt(5.0)); gsl_matrix_set(J, 1, 3, -sqrt(5.0)); gsl_matrix_set(J, 2, 0, 0.0); gsl_matrix_set(J, 2, 1, 2.0*term1); gsl_matrix_set(J, 2, 2, -4.0*term1); gsl_matrix_set(J, 2, 3, 0.0); gsl_matrix_set(J, 3, 0, 2.0*sqrt(10.0)*term2); gsl_matrix_set(J, 3, 1, 0.0); gsl_matrix_set(J, 3, 2, 0.0); gsl_matrix_set(J, 3, 3, -2.0*sqrt(10.0)*term2); return GSL_SUCCESS; } static gsl_multifit_function_fdf powell1_func = { &powell1_f, &powell1_df, NULL, powell1_N, powell1_P, NULL, 0, 0 }; static test_fdf_problem powell1_problem = { "powell_singular", powell1_x0, NULL, &powell1_epsrel, powell1_NTRIES, &powell1_checksol, &powell1_func }; gsl-doc-2.3/multifit/test_kirby2.c0000664000175000017500000001520512616157443015240 0ustar eddedd#define kirby2_N 151 #define kirby2_P 5 #define kirby2_NTRIES 1 /* double kirby2_x0[kirby2_P] = { 2, -0.1, 0.003, -0.001, 0.00001 }; */ static double kirby2_x0[kirby2_P] = { 1.5, -0.15, 0.0025, -0.0015, 0.00002 }; static double kirby2_epsrel = 1.0e-5; static double kirby2_sigma[kirby2_P] = { 8.7989634338E-02, 4.1182041386E-03, 4.1856520458E-05, 5.8931897355E-05, 2.0129761919E-07 }; static double kirby2_F1[kirby2_N] = { 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 }; static double kirby2_F0[kirby2_N] = { 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 }; static void kirby2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 3.9050739624E+00; const double kirby2_x[kirby2_P] = { 1.6745063063E+00, -1.3927397867E-01, 2.5961181191E-03, -1.7241811870E-03, 2.1664802578E-05 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kirby2_P; ++i) { gsl_test_rel(x[i], kirby2_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kirby2_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; 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; } static int kirby2_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; 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; } static gsl_multifit_function_fdf kirby2_func = { &kirby2_f, &kirby2_df, NULL, kirby2_N, kirby2_P, NULL, 0, 0 }; static test_fdf_problem kirby2_problem = { "nist-kirby2", kirby2_x0, kirby2_sigma, &kirby2_epsrel, kirby2_NTRIES, &kirby2_checksol, &kirby2_func }; gsl-doc-2.3/multifit/test_rosenbrocke.c0000664000175000017500000000374512616157443016360 0ustar eddedd#define rosenbrocke_N 8 /* = p */ #define rosenbrocke_P 8 /* must be even */ #define rosenbrocke_NTRIES 4 static double rosenbrocke_x0[rosenbrocke_P] = { -1.2, 1.0, -1.2, 1.0, -1.2, 1.0, -1.2, 1.0 }; static double rosenbrocke_epsrel = 1.0e-12; static void rosenbrocke_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double rosenbrocke_x[rosenbrocke_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrocke_P; ++i) { gsl_test_rel(x[i], rosenbrocke_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrocke_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2i = gsl_vector_get(x, 2*i + 1); double x2im1 = gsl_vector_get(x, 2*i); gsl_vector_set(f, 2*i, 10.0 * (x2i - x2im1*x2im1)); gsl_vector_set(f, 2*i + 1, 1.0 - x2im1); } return GSL_SUCCESS; } static int rosenbrocke_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i; gsl_matrix_set_zero(J); for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2im1 = gsl_vector_get(x, 2*i); gsl_matrix_set(J, 2*i, 2*i, -20.0*x2im1); gsl_matrix_set(J, 2*i, 2*i + 1, 10.0); gsl_matrix_set(J, 2*i + 1, 2*i, -1.0); } return GSL_SUCCESS; } static gsl_multifit_function_fdf rosenbrocke_func = { &rosenbrocke_f, &rosenbrocke_df, NULL, rosenbrocke_N, rosenbrocke_P, NULL, 0, 0 }; static test_fdf_problem rosenbrocke_problem = { "rosenbrock_extended", rosenbrocke_x0, NULL, &rosenbrocke_epsrel, rosenbrocke_NTRIES, &rosenbrocke_checksol, &rosenbrocke_func }; gsl-doc-2.3/multifit/test_boxbod.c0000664000175000017500000000412512616157443015312 0ustar eddedd#define boxbod_N 6 #define boxbod_P 2 #define boxbod_NTRIES 1 static double boxbod_x0[boxbod_P] = { 100.0, 0.75 }; static double boxbod_epsrel = 1.0e-7; static double boxbod_sigma[boxbod_P] = { 1.2354515176E+01, 1.0455993237E-01 }; static double boxbod_X[boxbod_N] = { 1.0, 2.0, 3.0, 5.0, 7.0, 10.0 }; static double boxbod_F[boxbod_N] = { 109.0, 149.0, 149.0, 191.0, 213.0, 224.0 }; static void boxbod_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.1680088766E+03; const double boxbod_x[boxbod_P] = { 2.1380940889E+02, 5.4723748542E-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < boxbod_P; ++i) { gsl_test_rel(x[i], boxbod_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int boxbod_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double yi; yi = b[0] * (1.0 - exp(-b[1] * xi)); gsl_vector_set (f, i, yi - boxbod_F[i]); } return GSL_SUCCESS; } static int boxbod_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double term = exp(-b[1] * xi); gsl_matrix_set (df, i, 0, 1.0 - term); gsl_matrix_set (df, i, 1, b[0] * term * xi); } return GSL_SUCCESS; } static gsl_multifit_function_fdf boxbod_func = { &boxbod_f, &boxbod_df, NULL, boxbod_N, boxbod_P, NULL, 0, 0 }; static test_fdf_problem boxbod_problem = { "nist-boxbod", boxbod_x0, boxbod_sigma, &boxbod_epsrel, boxbod_NTRIES, &boxbod_checksol, &boxbod_func }; gsl-doc-2.3/multifit/robust_wfun.c0000664000175000017500000001321112616157443015347 0ustar eddedd/* robust_wfun.c * * Copyright (C) 2013 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* default tuning constants */ #define TUNING_BISQUARE (4.685) #define TUNING_CAUCHY (2.385) #define TUNING_FAIR (1.4) #define TUNING_HUBER (1.345) #define TUNING_OLS (1.0) #define TUNING_WELSCH (2.985) /* * Note: for each of the weighting functions below, it * is safe to call them with in-place parameters, so that * input/output vectors are the same */ static int bisquare(const gsl_vector *r, gsl_vector *w) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); if (fabs(ri) < 1.0) gsl_vector_set(w, i, (1.0 - ri*ri)*(1.0 - ri*ri)); else gsl_vector_set(w, i, 0.0); } return GSL_SUCCESS; } /* bisquare() */ static int bisquare_dpsi(const gsl_vector *r, gsl_vector *dpsi) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); if (fabs(ri) < 1.0) gsl_vector_set(dpsi, i, (1.0 - ri*ri)*(1.0 - 5.0*ri*ri)); else gsl_vector_set(dpsi, i, 0.0); } return GSL_SUCCESS; } /* bisquare_dpsi() */ static const gsl_multifit_robust_type bisquare_type = { "bisquare", &bisquare, &bisquare_dpsi, TUNING_BISQUARE }; static int cauchy(const gsl_vector *r, gsl_vector *w) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); gsl_vector_set(w, i, 1.0 / (1.0 + ri*ri)); } return GSL_SUCCESS; } /* cauchy() */ static int cauchy_dpsi(const gsl_vector *r, gsl_vector *dpsi) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); double rsq = ri * ri; gsl_vector_set(dpsi, i, (1 - rsq) / (1.0 + rsq) / (1.0 + rsq)); } return GSL_SUCCESS; } /* cauchy_dpsi() */ static const gsl_multifit_robust_type cauchy_type = { "cauchy", &cauchy, &cauchy_dpsi, TUNING_CAUCHY }; static int fair(const gsl_vector *r, gsl_vector *w) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); gsl_vector_set(w, i, 1.0 / (1.0 + fabs(ri))); } return GSL_SUCCESS; } /* fair() */ static int fair_dpsi(const gsl_vector *r, gsl_vector *dpsi) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); gsl_vector_set(dpsi, i, 1.0 / (1.0 + fabs(ri)) / (1.0 + fabs(ri))); } return GSL_SUCCESS; } /* fair_dpsi() */ static const gsl_multifit_robust_type fair_type = { "fair", &fair, &fair_dpsi, TUNING_FAIR }; static int huber(const gsl_vector *r, gsl_vector *w) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double absri = fabs(gsl_vector_get(r, i)); if (absri <= 1.0) gsl_vector_set(w, i, 1.0); else gsl_vector_set(w, i, 1.0 / absri); } return GSL_SUCCESS; } /* huber() */ static int huber_dpsi(const gsl_vector *r, gsl_vector *dpsi) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); if (fabs(ri) <= 1.0) gsl_vector_set(dpsi, i, 1.0); else gsl_vector_set(dpsi, i, 0.0); } return GSL_SUCCESS; } /* huber_dpsi() */ static const gsl_multifit_robust_type huber_type = { "huber", &huber, &huber_dpsi, TUNING_HUBER }; static int ols(const gsl_vector *r, gsl_vector *w) { gsl_vector_set_all(w, 1.0); return GSL_SUCCESS; } static int ols_dpsi(const gsl_vector *r, gsl_vector *dpsi) { gsl_vector_set_all(dpsi, 1.0); return GSL_SUCCESS; } static const gsl_multifit_robust_type ols_type = { "ols", &ols, &ols_dpsi, TUNING_OLS }; static int welsch(const gsl_vector *r, gsl_vector *w) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); gsl_vector_set(w, i, exp(-ri*ri)); } return GSL_SUCCESS; } /* welsch() */ static int welsch_dpsi(const gsl_vector *r, gsl_vector *dpsi) { size_t i; size_t n = r->size; for (i = 0; i < n; ++i) { double ri = gsl_vector_get(r, i); gsl_vector_set(dpsi, i, (1.0 - 2.0*ri*ri) * exp(-ri*ri)); } return GSL_SUCCESS; } /* welsch_dpsi() */ static const gsl_multifit_robust_type welsch_type = { "welsch", &welsch, &welsch_dpsi, TUNING_WELSCH }; const gsl_multifit_robust_type *gsl_multifit_robust_default = &bisquare_type; const gsl_multifit_robust_type *gsl_multifit_robust_bisquare = &bisquare_type; const gsl_multifit_robust_type *gsl_multifit_robust_cauchy = &cauchy_type; const gsl_multifit_robust_type *gsl_multifit_robust_fair = &fair_type; const gsl_multifit_robust_type *gsl_multifit_robust_huber = &huber_type; const gsl_multifit_robust_type *gsl_multifit_robust_ols = &ols_type; const gsl_multifit_robust_type *gsl_multifit_robust_welsch = &welsch_type; gsl-doc-2.3/multifit/multilinear.c0000644000175000017500000002326713013650614015317 0ustar eddedd/* multifit/multilinear.c * * Copyright (C) 2000, 2007, 2010 Brian Gough * Copyright (C) 2013, 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "linear_common.c" static int multifit_linear_svd (const gsl_matrix * X, const int balance, 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) { size_t rank; int status = gsl_multifit_linear_tsvd(X, y, GSL_DBL_EPSILON, c, cov, chisq, &rank, work); return status; } /* gsl_multifit_linear_tsvd() Solve linear least squares system with truncated SVD Inputs: X - least squares matrix, n-by-p y - right hand side vector, n-by-1 tol - tolerance for singular value truncation; if s_j <= tol * s_0 then it is discarded from series expansion c - (output) solution vector, p-by-1 cov - (output) covariance matrix, p-by-p chisq - (output) cost function chi^2 rank - (output) effective rank (number of singular values used in solution) work - workspace */ int gsl_multifit_linear_tsvd (const gsl_matrix * X, const gsl_vector * y, const double tol, gsl_vector * c, gsl_matrix * cov, double * chisq, size_t * rank, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (y->size != n) { GSL_ERROR("number of observations in y does not match matrix", GSL_EBADLEN); } else if (p != c->size) { GSL_ERROR ("number of parameters c does not match matrix", GSL_EBADLEN); } else if (tol <= 0) { GSL_ERROR ("tolerance must be positive", GSL_EINVAL); } else { int status; double rnorm = 0.0, snorm; /* compute balanced SVD */ status = gsl_multifit_linear_bsvd (X, work); if (status) return status; status = multifit_linear_solve (X, y, tol, -1.0, rank, c, &rnorm, &snorm, work); *chisq = rnorm * rnorm; /* variance-covariance matrix cov = s2 * (Q S^-1) (Q S^-1)^T */ { double r2 = rnorm * rnorm; double s2 = r2 / (double)(n - *rank); size_t i, j; gsl_matrix_view QSI = gsl_matrix_submatrix(work->QSI, 0, 0, p, p); gsl_vector_view D = gsl_vector_subvector(work->D, 0, p); for (i = 0; i < p; i++) { gsl_vector_view row_i = gsl_matrix_row (&QSI.matrix, i); double d_i = gsl_vector_get (&D.vector, i); for (j = i; j < p; j++) { gsl_vector_view row_j = gsl_matrix_row (&QSI.matrix, j); double d_j = gsl_vector_get (&D.vector, 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 status; } } /* gsl_multifit_linear_svd() Perform SVD decomposition of the matrix X and store in work without balancing */ int gsl_multifit_linear_svd (const gsl_matrix * X, gsl_multifit_linear_workspace * work) { /* do not balance by default */ int status = multifit_linear_svd(X, 0, work); return status; } /* gsl_multifit_linear_bsvd() Perform SVD decomposition of the matrix X and store in work with balancing */ int gsl_multifit_linear_bsvd (const gsl_matrix * X, gsl_multifit_linear_workspace * work) { int status = multifit_linear_svd(X, 1, work); return status; } size_t gsl_multifit_linear_rank(const double tol, const gsl_multifit_linear_workspace * work) { double s0 = gsl_vector_get (work->S, 0); size_t rank = 0; size_t j; for (j = 0; j < work->p; j++) { double sj = gsl_vector_get (work->S, j); if (sj > tol * s0) ++rank; } return rank; } /* Estimation of values for given x */ 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; } } /* gsl_multifit_linear_rcond() Return reciprocal condition number of LS matrix; gsl_multifit_linear_svd() must first be called to compute the SVD of X and its reciprocal condition number */ double gsl_multifit_linear_rcond (const gsl_multifit_linear_workspace * w) { return w->rcond; } /* gsl_multifit_linear_residuals() Compute vector of residuals from fit Inputs: X - design matrix y - rhs vector c - fit coefficients r - (output) where to store residuals */ int gsl_multifit_linear_residuals (const gsl_matrix *X, const gsl_vector *y, const gsl_vector *c, gsl_vector *r) { 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 (y->size != r->size) { GSL_ERROR ("number of observations in y does not match number of residuals", GSL_EBADLEN); } else { /* r = y - X c */ gsl_vector_memcpy(r, y); gsl_blas_dgemv(CblasNoTrans, -1.0, X, c, 1.0, r); return GSL_SUCCESS; } } /* gsl_multifit_linear_residuals() */ /* Perform a SVD decomposition on the least squares matrix X = U S Q^T * * Inputs: X - least squares matrix * balance - 1 to perform column balancing * work - workspace * * Notes: * 1) On output, * work->A contains the matrix U * work->Q contains the matrix Q * work->S contains the vector of singular values * 2) The matrix X may have smaller dimensions than the workspace * in the case of stdform2() - but the dimensions cannot be larger * 3) On output, work->n and work->p are set to the dimensions of X * 4) On output, work->rcond is set to the reciprocal condition number of X */ static int multifit_linear_svd (const gsl_matrix * X, const int balance, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (n > work->nmax || p > work->pmax) { GSL_ERROR("observation matrix larger than workspace", GSL_EBADLEN); } else { gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_matrix_view Q = gsl_matrix_submatrix(work->Q, 0, 0, p, p); gsl_matrix_view QSI = gsl_matrix_submatrix(work->QSI, 0, 0, p, p); gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); gsl_vector_view xt = gsl_vector_subvector(work->xt, 0, p); gsl_vector_view D = gsl_vector_subvector(work->D, 0, p); /* Copy X to workspace, A <= X */ gsl_matrix_memcpy (&A.matrix, X); /* Balance the columns of the matrix A if requested */ if (balance) { gsl_linalg_balance_columns (&A.matrix, &D.vector); } else { gsl_vector_set_all (&D.vector, 1.0); } /* decompose A into U S Q^T */ gsl_linalg_SV_decomp_mod (&A.matrix, &QSI.matrix, &Q.matrix, &S.vector, &xt.vector); /* compute reciprocal condition number rcond = smin / smax */ { double smin, smax; gsl_vector_minmax(&S.vector, &smin, &smax); work->rcond = smin / smax; } work->n = n; work->p = p; return GSL_SUCCESS; } } gsl-doc-2.3/multifit/fdjac.c0000664000175000017500000000761612620415757014055 0ustar eddedd/* multifit/fdjac.c * * Copyright (C) 2013 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module contains routines for approximating the Jacobian with finite * differences for nonlinear least-squares fitting. */ #include #include #include #include #include static int fdjac(const gsl_vector *x, const gsl_vector *wts, gsl_multifit_function_fdf *fdf, const gsl_vector *f, gsl_matrix *J); /* fdjac() Compute approximate Jacobian using forward differences Inputs: x - parameter vector wts - data weights fdf - fdf struct f - (input) vector of function values f_i(x) J - (output) Jacobian matrix Return: success or error */ static int fdjac(const gsl_vector *x, const gsl_vector *wts, gsl_multifit_function_fdf *fdf, const gsl_vector *f, gsl_matrix *J) { int status = 0; size_t i, j; double h; const double epsfcn = 0.0; double eps = sqrt(GSL_MAX(epsfcn, GSL_DBL_EPSILON)); for (j = 0; j < fdf->p; ++j) { double xj = gsl_vector_get(x, j); /* use column j of J as temporary storage for f(x + dx) */ gsl_vector_view v = gsl_matrix_column(J, j); h = eps * fabs(xj); if (h == 0.0) h = eps; /* perturb x_j to compute forward difference */ gsl_vector_set((gsl_vector *) x, j, xj + h); status += gsl_multifit_eval_wf (fdf, x, wts, &v.vector); if (status) return status; /* restore x_j */ gsl_vector_set((gsl_vector *) x, j, xj); h = 1.0 / h; for (i = 0; i < fdf->n; ++i) { double fnext = gsl_vector_get(&v.vector, i); double fi = gsl_vector_get(f, i); gsl_matrix_set(J, i, j, (fnext - fi) * h); } } return status; } /* fdjac() */ /* gsl_multifit_fdfsolver_dif_df() Compute approximate Jacobian using finite differences Inputs: x - parameter vector wts - data weights (set to NULL if not needed) fdf - fdf f - (input) function values f_i(x) J - (output) approximate Jacobian matrix Return: success or error */ int gsl_multifit_fdfsolver_dif_df(const gsl_vector *x, const gsl_vector *wts, gsl_multifit_function_fdf *fdf, const gsl_vector *f, gsl_matrix *J) { return fdjac(x, wts, fdf, f, J); } /* gsl_multifit_fdfsolver_dif_df() */ #ifndef GSL_DISABLE_DEPRECATED /* gsl_multifit_fdfsolver_dif_fdf() Compute function values (analytic) and approximate Jacobian using finite differences Inputs: x - parameter vector fdf - fdf f - (output) function values f_i(x) J - (output) approximate Jacobian matrix Return: success or error */ int gsl_multifit_fdfsolver_dif_fdf(const gsl_vector *x, gsl_multifit_function_fdf *fdf, gsl_vector *f, gsl_matrix *J) { int status = 0; status = gsl_multifit_eval_wf(fdf, x, NULL, f); if (status) return status; status = fdjac(x, NULL, fdf, f, J); if (status) return status; return status; } /* gsl_multifit_fdfsolver_dif_fdf() */ #endif /* !GSL_DISABLE_DEPRECATED */ gsl-doc-2.3/multifit/test_wood.c0000664000175000017500000000374312616157443015012 0ustar eddedd#define wood_N 6 #define wood_P 4 #define wood_NTRIES 3 static double wood_x0[wood_P] = { -3.0, -1.0, -3.0, -1.0 }; static double wood_epsrel = 1.0e-12; static void wood_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double wood_x[wood_P] = { 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wood_P; ++i) { gsl_test_rel(x[i], wood_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wood_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); gsl_vector_set(f, 0, 10.0*(x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); gsl_vector_set(f, 2, sqrt(90.0)*(x4 - x3*x3)); gsl_vector_set(f, 3, 1.0 - x3); gsl_vector_set(f, 4, sqrt(10.0)*(x2 + x4 - 2.0)); gsl_vector_set(f, 5, (x2 - x4) / sqrt(10.0)); return GSL_SUCCESS; } static int wood_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x3 = gsl_vector_get(x, 2); double s90 = sqrt(90.0); double s10 = sqrt(10.0); gsl_matrix_set_zero(J); gsl_matrix_set(J, 0, 0, -20.0*x1); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 2, 2, -2.0*s90*x3); gsl_matrix_set(J, 2, 3, s90); gsl_matrix_set(J, 3, 2, -1.0); gsl_matrix_set(J, 4, 1, s10); gsl_matrix_set(J, 4, 3, s10); gsl_matrix_set(J, 5, 1, 1.0/s10); gsl_matrix_set(J, 5, 3, -1.0/s10); return GSL_SUCCESS; } static gsl_multifit_function_fdf wood_func = { &wood_f, &wood_df, NULL, wood_N, wood_P, NULL, 0, 0 }; static test_fdf_problem wood_problem = { "wood", wood_x0, NULL, &wood_epsrel, wood_NTRIES, &wood_checksol, &wood_func }; gsl-doc-2.3/multifit/Makefile.am0000644000175000017500000000527013004361416014653 0ustar eddeddnoinst_LTLIBRARIES = libgslmultifit.la pkginclude_HEADERS = gsl_multifit.h gsl_multifit_nlin.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_la_SOURCES = gcv.c multilinear.c multiwlinear.c work.c lmniel.c lmder.c fsolver.c fdfsolver.c fdfridge.c fdjac.c convergence.c gradient.c covar.c multirobust.c robust_wfun.c multireg.c noinst_HEADERS = \ linear_common.c \ lmutil.c \ lmpar.c \ lmset.c \ lmiterate.c \ lmmisc.c \ qrsolv.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_estimator.c \ test_exp1.c \ test_filip.c \ test_gaussian.c \ test_hahn1.c \ test_helical.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_linear.c \ test_longley.c \ test_meyer.c \ test_meyerscal.c \ test_nelson.c \ test_nonlinear.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_pontius.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_reg.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_shaw.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wnlin.c \ test_wood.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 ../sort/libgslsort.la ../statistics/libgslstatistics.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 ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../min/libgslmin.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 gsl-doc-2.3/multifit/test_filip.c0000664000175000017500000002603712616157443015146 0ustar eddeddsize_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 } ; static int test_filip_results(const char *str, const gsl_vector *c, const gsl_vector *expected_c, const gsl_vector *cov_diag, const gsl_vector *expected_sd, const double chisq, const double chisq_res, const double expected_chisq) { size_t i; /* test coefficient vector */ for (i = 0; i < filip_p; ++i) { gsl_test_rel (gsl_vector_get(c,i), gsl_vector_get(expected_c, i), 1.0e-7, "%s c[%zu]", str, i) ; if (cov_diag && expected_sd) { gsl_test_rel (sqrt(gsl_vector_get(cov_diag, i)), gsl_vector_get(expected_sd, i), 1e-7, "%s cov[%zu,%zu]", str, i, i); } } gsl_test_rel (chisq, expected_chisq, 1.0e-7, "%s chisq", str); gsl_test_rel (chisq_res, expected_chisq, 1.0e-7, "%s chisq residuals", str); return GSL_SUCCESS; } void test_filip () { size_t i, j; gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (filip_n, filip_p); gsl_multifit_robust_workspace * work_rob = gsl_multifit_robust_alloc (gsl_multifit_robust_ols, 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 * r = gsl_vector_alloc(filip_n); double chisq, chisq_res; 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; gsl_vector_view diag = gsl_matrix_diagonal (cov); gsl_vector_view exp_c = gsl_vector_view_array(expected_c, filip_p); gsl_vector_view exp_sd = gsl_vector_view_array(expected_sd, filip_p); 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)); } } /* test unweighted least squares */ gsl_multifit_linear (X, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(X, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_filip_results("filip gsl_multifit_linear", c, &exp_c.vector, &diag.vector, &exp_sd.vector, chisq, chisq_res, expected_chisq); /* test robust least squares */ gsl_multifit_robust (X, &y.vector, c, cov, work_rob); test_filip_results("filip gsl_multifit_robust", c, &exp_c.vector, &diag.vector, &exp_sd.vector, 1.0, 1.0, 1.0); /* test weighted least squares */ { gsl_vector * w = gsl_vector_alloc (filip_n); /* 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 } }; gsl_vector_set_all (w, 1.0); gsl_multifit_wlinear (X, w, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(X, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_filip_results("filip gsl_multifit_wlinear", c, &exp_c.vector, NULL, NULL, chisq, chisq_res, expected_chisq); 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_multifit_wlinear cov(%d,%d)", i, j) ; } } gsl_vector_free(w); } gsl_vector_free(c); gsl_matrix_free(cov); gsl_matrix_free(X); gsl_vector_free(r); gsl_multifit_linear_free (work); gsl_multifit_robust_free (work_rob); } gsl-doc-2.3/multifit/test_gaussian.c0000664000175000017500000000436012616157443015650 0ustar eddedd#define gaussian_N 15 #define gaussian_P 3 #define gaussian_NTRIES 2 static double gaussian_x0[gaussian_P] = { 0.4, 1.0, 0.0 }; static double gaussian_epsrel = 1.0e-10; static double gaussian_Y[gaussian_N] = { 0.0009, 0.0044, 0.0175, 0.0540, 0.1295, 0.2420, 0.3521, 0.3989, 0.3521, 0.2420, 0.1295, 0.0540, 0.0175, 0.0044, 0.0009 }; static void gaussian_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.12793276961871985e-08; const double gaussian_x[gaussian_P] = { 0.398956137838762825, 1.00001908448786647, 0.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < gaussian_P; ++i) { gsl_test_rel(x[i], gaussian_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int gaussian_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double yi = gaussian_Y[i]; double term = ti - x3; double fi = x1 * exp(-x2*term*term/2.0) - yi; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int gaussian_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double term1 = ti - x3; double term2 = exp(-x2*term1*term1/2.0); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, -0.5*x1*term2*term1*term1); gsl_matrix_set(J, i, 2, x1*x2*term1*term2); } return GSL_SUCCESS; } static gsl_multifit_function_fdf gaussian_func = { &gaussian_f, &gaussian_df, NULL, gaussian_N, gaussian_P, NULL, 0, 0 }; static test_fdf_problem gaussian_problem = { "gaussian", gaussian_x0, NULL, &gaussian_epsrel, gaussian_NTRIES, &gaussian_checksol, &gaussian_func }; gsl-doc-2.3/multifit/lmutil.c0000664000175000017500000000504012616157443014301 0ustar eddeddstatic 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 j, p = J->size2; for (j = 0; j < p; j++) { gsl_vector_const_view v = gsl_matrix_const_column(J, j); double norm = gsl_blas_dnrm2(&v.vector); if (norm == 0) norm = 1.0; gsl_vector_set (diag, j, norm); } } static void update_diag (const gsl_matrix * J, gsl_vector * diag) { size_t j, p = J->size2; for (j = 0; j < p; j++) { gsl_vector_const_view v = gsl_matrix_const_column(J, j); double norm = gsl_blas_dnrm2(&v.vector); double *diagj = gsl_vector_ptr(diag, j); if (norm == 0) norm = 1.0; *diagj = GSL_MAX(*diagj, norm); } } 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); } } gsl-doc-2.3/multifit/test_meyerscal.c0000664000175000017500000000446112616157443016024 0ustar eddedd#define meyerscal_N 16 #define meyerscal_P 3 #define meyerscal_NTRIES 1 static double meyerscal_x0[meyerscal_P] = { 8.85, 4.0, 2.5 }; static double meyerscal_epsrel = 1.0e-8; static double meyerscal_Y[meyerscal_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyerscal_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517003888e-05; const double meyerscal_x[meyerscal_P] = { 2.481778312286695e+00, 6.181346341853554e+00, 3.452236344749865e+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyerscal_P; ++i) { gsl_test_rel(x[i], meyerscal_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyerscal_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double yi = meyerscal_Y[i]; double fi = x1 * exp(10.0*x2 / (ti + x3) - 13.0) - 1.0e-3*yi; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int meyerscal_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double term1 = ti + x3; double term2 = exp(10.0*x2/term1 - 13.0); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, 10.0*x1*term2/term1); gsl_matrix_set(J, i, 2, -10.0*x1*x2*term2/(term1*term1)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf meyerscal_func = { &meyerscal_f, &meyerscal_df, NULL, meyerscal_N, meyerscal_P, NULL, 0, 0 }; static test_fdf_problem meyerscal_problem = { "meyerscal", meyerscal_x0, NULL, &meyerscal_epsrel, meyerscal_NTRIES, &meyerscal_checksol, &meyerscal_func }; gsl-doc-2.3/multifit/fdfsolver.c0000664000175000017500000002235412616157443014774 0ustar eddedd/* multifit/fdfsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 *) calloc (1, 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) { gsl_multifit_fdfsolver_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_multifit_fdfsolver_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_multifit_fdfsolver_free (s); GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0); } s->g = gsl_vector_alloc (p); if (s->g == 0) { gsl_multifit_fdfsolver_free (s); GSL_ERROR_VAL ("failed to allocate space for g", GSL_ENOMEM, 0); } s->sqrt_wts = gsl_vector_calloc (n); if (s->sqrt_wts == 0) { gsl_multifit_fdfsolver_free (s); GSL_ERROR_VAL ("failed to allocate space for sqrt_wts", GSL_ENOMEM, 0); } s->state = calloc (1, T->size); if (s->state == 0) { gsl_multifit_fdfsolver_free (s); 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) { gsl_multifit_fdfsolver_free (s); GSL_ERROR_VAL ("failed to set solver", status, 0); } s->fdf = NULL; s->niter = 0; return s; } int gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver * s, gsl_multifit_function_fdf * f, const gsl_vector * x) { return gsl_multifit_fdfsolver_wset(s, f, x, NULL); } int gsl_multifit_fdfsolver_wset (gsl_multifit_fdfsolver * s, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * wts) { const size_t n = s->f->size; if (n != f->n) { GSL_ERROR ("function size does not match solver", GSL_EBADLEN); } else if (s->x->size != x->size) { GSL_ERROR ("vector length does not match solver", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match solver", GSL_EBADLEN); } else { size_t i; s->fdf = f; gsl_vector_memcpy(s->x, x); s->niter = 0; if (wts) { for (i = 0; i < n; ++i) { double wi = gsl_vector_get(wts, i); gsl_vector_set(s->sqrt_wts, i, sqrt(wi)); } } else gsl_vector_set_all(s->sqrt_wts, 1.0); return (s->type->set) (s->state, s->sqrt_wts, s->fdf, s->x, s->f, s->dx); } } int gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver * s) { int status = (s->type->iterate) (s->state, s->sqrt_wts, s->fdf, s->x, s->f, s->dx); s->niter++; return status; } /* gsl_multifit_fdfsolver_driver() Iterate the nonlinear least squares solver until completion Inputs: s - fdfsolver maxiter - maximum iterations to allow xtol - tolerance in step x gtol - tolerance in gradient ftol - tolerance in ||f|| info - (output) info flag on why iteration terminated 1 = stopped due to small step size ||dx| 2 = stopped due to small gradient 3 = stopped due to small change in f GSL_ETOLX = ||dx|| has converged to within machine precision (and xtol is too small) GSL_ETOLG = ||g||_inf is smaller than machine precision (gtol is too small) GSL_ETOLF = change in ||f|| is smaller than machine precision (ftol is too small) Return: GSL_SUCCESS if converged, GSL_MAXITER if maxiter exceeded without converging */ int gsl_multifit_fdfsolver_driver (gsl_multifit_fdfsolver * s, const size_t maxiter, const double xtol, const double gtol, const double ftol, int *info) { int status; size_t iter = 0; do { status = gsl_multifit_fdfsolver_iterate (s); /* * if status is GSL_ENOPROG or GSL_SUCCESS, continue iterating, * otherwise the method has converged with a GSL_ETOLx flag */ if (status != GSL_SUCCESS && status != GSL_ENOPROG) break; /* test for convergence */ status = gsl_multifit_fdfsolver_test(s, xtol, gtol, ftol, info); } while (status == GSL_CONTINUE && ++iter < maxiter); /* * the following error codes mean that the solution has converged * to within machine precision, so record the error code in info * and return success */ if (status == GSL_ETOLF || status == GSL_ETOLX || status == GSL_ETOLG) { *info = status; status = GSL_SUCCESS; } /* check if max iterations reached */ if (iter >= maxiter && status != GSL_SUCCESS) status = GSL_EMAXITER; return status; } /* gsl_multifit_fdfsolver_driver() */ int gsl_multifit_fdfsolver_jac (gsl_multifit_fdfsolver * s, gsl_matrix * J) { const size_t n = s->f->size; const size_t p = s->x->size; if (n != J->size1 || p != J->size2) { GSL_ERROR ("Jacobian dimensions do not match solver", GSL_EBADLEN); } else { return (s->type->jac) (s->state, J); } } /* gsl_multifit_fdfsolver_jac() */ void gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver * s) { RETURN_IF_NULL (s); if (s->state) { (s->type->free) (s->state); free (s->state); } if (s->dx) gsl_vector_free (s->dx); if (s->x) gsl_vector_free (s->x); if (s->f) gsl_vector_free (s->f); if (s->sqrt_wts) gsl_vector_free (s->sqrt_wts); if (s->g) gsl_vector_free (s->g); 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; } gsl_vector * gsl_multifit_fdfsolver_residual (const gsl_multifit_fdfsolver * s) { return s->f; } size_t gsl_multifit_fdfsolver_niter (const gsl_multifit_fdfsolver * s) { return s->niter; } /* gsl_multifit_eval_wf() Compute residual vector y with user callback function, and apply weighting transform if given: y~ = sqrt(W) y Inputs: fdf - callback function x - model parameters swts - weight matrix sqrt(W) = sqrt(diag(w1,w2,...,wn)) set to NULL for unweighted fit y - (output) (weighted) residual vector y_i = sqrt(w_i) f_i where f_i is unweighted residual */ int gsl_multifit_eval_wf(gsl_multifit_function_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_vector *y) { int s = ((*((fdf)->f)) (x, fdf->params, y)); ++(fdf->nevalf); /* y <- sqrt(W) y */ if (swts) gsl_vector_mul(y, swts); return s; } /* gsl_multifit_eval_wdf() Compute Jacobian matrix J with user callback function, and apply weighting transform if given: J~ = sqrt(W) J Inputs: fdf - callback function x - model parameters swts - weight matrix W = diag(w1,w2,...,wn) set to NULL for unweighted fit dy - (output) (weighted) Jacobian matrix dy = sqrt(W) dy where dy is unweighted Jacobian */ int gsl_multifit_eval_wdf(gsl_multifit_function_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_matrix *dy) { int status = ((*((fdf)->df)) (x, fdf->params, dy)); ++(fdf->nevaldf); /* J <- sqrt(W) J */ if (swts) { const size_t n = swts->size; size_t i; for (i = 0; i < n; ++i) { double swi = gsl_vector_get(swts, i); gsl_vector_view v = gsl_matrix_row(dy, i); gsl_vector_scale(&v.vector, swi); } } return status; } gsl-doc-2.3/multifit/test_penalty2.c0000664000175000017500000000557612616157443015606 0ustar eddedd#define penalty2_N 8 /* 2*p */ #define penalty2_P 4 #define penalty2_NTRIES 3 static double penalty2_x0[penalty2_P] = { 0.5, 0.5, 0.5, 0.5 }; static double penalty2_epsrel = 1.0e-12; static void penalty2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 9.37629300735544219e-06; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); } static int penalty2_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); double x1 = gsl_vector_get(x, 0); size_t i; double sum = penalty2_P * x1 * x1; gsl_vector_set(f, 0, x1 - 0.2); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double yi = exp(0.1*(i + 1.0)) + exp(0.1*i); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) + exp(0.1*xim1) - yi)); sum += (penalty2_P - i) * xi * xi; } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) - exp(-0.1))); } /* row 2p */ gsl_vector_set(f, penalty2_N - 1, sum - 1.0); return GSL_SUCCESS; } static int penalty2_df (const gsl_vector * x, void *params, gsl_matrix * J) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i, j; for (j = 0; j < penalty2_P; ++j) { double xj = gsl_vector_get(x, j); double delta1j = (j == 0) ? 1.0 : 0.0; /* first and last rows */ gsl_matrix_set(J, 0, j, delta1j); gsl_matrix_set(J, penalty2_N - 1, j, 2.0 * (penalty2_P - j) * xj); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double Jij; if (i == j) Jij = exp(0.1 * xi); else if (i - 1 == j) Jij = exp(0.1 * xim1); else Jij = 0.0; Jij *= 0.1 * sqrt_alpha; gsl_matrix_set(J, i, j, Jij); } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); if (i - penalty2_P + 1 == j) gsl_matrix_set(J, i, j, 0.1 * sqrt_alpha * exp(0.1*xi)); else gsl_matrix_set(J, i, j, 0.0); } } return GSL_SUCCESS; } static gsl_multifit_function_fdf penalty2_func = { &penalty2_f, &penalty2_df, NULL, penalty2_N, penalty2_P, NULL, 0, 0 }; static test_fdf_problem penalty2_problem = { "penalty2", penalty2_x0, NULL, &penalty2_epsrel, penalty2_NTRIES, &penalty2_checksol, &penalty2_func }; gsl-doc-2.3/multifit/work.c0000644000175000017500000000573213014632462013753 0ustar eddedd/* multifit/work.c * * Copyright (C) 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include gsl_multifit_linear_workspace * gsl_multifit_linear_alloc (const size_t nmax, const size_t pmax) { gsl_multifit_linear_workspace *w; w = calloc (1, sizeof (gsl_multifit_linear_workspace)); if (w == 0) { GSL_ERROR_VAL ("failed to allocate space for multifit_linear struct", GSL_ENOMEM, 0); } w->nmax = nmax; /* max number of observations */ w->pmax = pmax; /* max number of parameters */ w->n = 0; w->p = 0; w->rcond = 0.0; w->A = gsl_matrix_alloc (nmax, pmax); if (w->A == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for A", GSL_ENOMEM, 0); } w->Q = gsl_matrix_alloc (pmax, pmax); if (w->Q == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for Q", GSL_ENOMEM, 0); } w->QSI = gsl_matrix_alloc (pmax, pmax); if (w->QSI == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for QSI", GSL_ENOMEM, 0); } w->S = gsl_vector_alloc (pmax); if (w->S == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for S", GSL_ENOMEM, 0); } w->t = gsl_vector_alloc (nmax); if (w->t == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for t", GSL_ENOMEM, 0); } w->xt = gsl_vector_calloc (pmax); if (w->xt == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for xt", GSL_ENOMEM, 0); } w->D = gsl_vector_calloc (pmax); if (w->D == 0) { gsl_multifit_linear_free(w); GSL_ERROR_VAL ("failed to allocate space for D", GSL_ENOMEM, 0); } return w; } void gsl_multifit_linear_free (gsl_multifit_linear_workspace * w) { RETURN_IF_NULL (w); if (w->A) gsl_matrix_free (w->A); if (w->Q) gsl_matrix_free (w->Q); if (w->QSI) gsl_matrix_free (w->QSI); if (w->S) gsl_vector_free (w->S); if (w->t) gsl_vector_free (w->t); if (w->xt) gsl_vector_free (w->xt); if (w->D) gsl_vector_free (w->D); free (w); } gsl-doc-2.3/multifit/lmniel.c0000644000175000017500000002503512737536472014266 0ustar eddedd/* multifit/lmniel.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #define SCALE 0 /* * This module contains an implementation of the Levenberg-Marquardt * algorithm for nonlinear optimization problems. This implementation * closely follows the following works: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. */ typedef struct { gsl_matrix *A; /* J^T J */ gsl_matrix *A_copy; /* copy of J^T J */ gsl_matrix *J; /* Jacobian J(x) */ gsl_vector *diag; /* D = diag(J^T J) */ gsl_vector *rhs; /* rhs vector = -g = -J^T f */ gsl_vector *x_trial; /* trial parameter vector */ gsl_vector *f_trial; /* trial function vector */ gsl_vector *work; /* workspace length p */ long nu; /* nu */ double mu; /* LM damping parameter mu */ double tau; /* initial scale factor for mu */ } lmniel_state_t; #include "lmmisc.c" #define LM_ONE_THIRD (0.333333333333333) static int lmniel_alloc (void *vstate, const size_t n, const size_t p); static void lmniel_free(void *vstate); static int lmniel_set(void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *dx); static int lmniel_iterate(void *vstate, const gsl_vector *swts, gsl_multifit_function_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *dx); static int lmniel_alloc (void *vstate, const size_t n, const size_t p) { lmniel_state_t *state = (lmniel_state_t *) vstate; state->A = gsl_matrix_alloc(p, p); if (state->A == NULL) { GSL_ERROR ("failed to allocate space for A", GSL_ENOMEM); } state->J = gsl_matrix_alloc(n, p); if (state->J == NULL) { GSL_ERROR ("failed to allocate space for J", GSL_ENOMEM); } state->diag = gsl_vector_alloc(p); if (state->diag == NULL) { GSL_ERROR ("failed to allocate space for diag", GSL_ENOMEM); } state->rhs = gsl_vector_alloc(p); if (state->rhs == NULL) { GSL_ERROR ("failed to allocate space for rhs", GSL_ENOMEM); } state->work = gsl_vector_alloc(p); if (state->work == NULL) { GSL_ERROR ("failed to allocate space for work", GSL_ENOMEM); } state->A_copy = gsl_matrix_alloc(p, p); if (state->A_copy == NULL) { GSL_ERROR ("failed to allocate space for A_copy", GSL_ENOMEM); } state->x_trial = gsl_vector_alloc(p); if (state->x_trial == NULL) { GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM); } state->f_trial = gsl_vector_alloc(n); if (state->f_trial == NULL) { GSL_ERROR ("failed to allocate space for f_trial", GSL_ENOMEM); } state->tau = 1.0e-3; return GSL_SUCCESS; } /* lmniel_alloc() */ static void lmniel_free(void *vstate) { lmniel_state_t *state = (lmniel_state_t *) vstate; if (state->A) gsl_matrix_free(state->A); if (state->J) gsl_matrix_free(state->J); if (state->diag) gsl_vector_free(state->diag); if (state->rhs) gsl_vector_free(state->rhs); if (state->work) gsl_vector_free(state->work); if (state->A_copy) gsl_matrix_free(state->A_copy); if (state->x_trial) gsl_vector_free(state->x_trial); if (state->f_trial) gsl_vector_free(state->f_trial); } /* lmniel_free() */ static int lmniel_set(void *vstate, const gsl_vector *swts, gsl_multifit_function_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *dx) { int status; lmniel_state_t *state = (lmniel_state_t *) vstate; const size_t p = x->size; size_t i; /* initialize counters for function and Jacobian evaluations */ fdf->nevalf = 0; fdf->nevaldf = 0; /* evaluate function and Jacobian at x and apply weight transform */ status = gsl_multifit_eval_wf(fdf, x, swts, f); if (status) return status; if (fdf->df) status = gsl_multifit_eval_wdf(fdf, x, swts, state->J); else status = gsl_multifit_fdfsolver_dif_df(x, swts, fdf, f, state->J); if (status) return status; /* compute rhs = -J^T f */ gsl_blas_dgemv(CblasTrans, -1.0, state->J, f, 0.0, state->rhs); #if SCALE gsl_vector_set_zero(state->diag); #else gsl_vector_set_all(state->diag, 1.0); #endif /* set default parameters */ state->nu = 2; #if SCALE state->mu = state->tau; #else /* compute mu_0 = tau * max(diag(J^T J)) */ state->mu = -1.0; for (i = 0; i < p; ++i) { gsl_vector_view c = gsl_matrix_column(state->J, i); double result; /* (J^T J)_{ii} */ gsl_blas_ddot(&c.vector, &c.vector, &result); state->mu = GSL_MAX(state->mu, result); } state->mu *= state->tau; #endif return GSL_SUCCESS; } /* lmniel_set() */ /* lmniel_iterate() This function performs 1 iteration of the LM algorithm 6.18 from [1]. The algorithm is slightly modified to loop until we find an acceptable step dx, in order to guarantee that each function call contains a new input vector x. Args: vstate - lm workspace swts - data weights (NULL if unweighted) fdf - function and Jacobian pointers x - on input, current parameter vector on output, new parameter vector x + dx f - on input, f(x) on output, f(x + dx) dx - (output only) parameter step vector Notes: 1) On input, the following must be initialized in state: nu, mu, rhs, J 2) On output, the following are updated with the current iterates: nu, mu, rhs, J rhs needs to be set on each output, so that lmniel_gradient supplies the correct g = J^T f */ static int lmniel_iterate(void *vstate, const gsl_vector *swts, gsl_multifit_function_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_vector *dx) { int status; lmniel_state_t *state = (lmniel_state_t *) vstate; gsl_matrix *J = state->J; /* Jacobian J(x) */ gsl_matrix *A = state->A; /* J^T J */ gsl_vector *rhs = state->rhs; /* -g = -J^T f */ gsl_vector *x_trial = state->x_trial; /* trial x + dx */ gsl_vector *f_trial = state->f_trial; /* trial f(x + dx) */ gsl_vector *diag = state->diag; /* diag(D) */ double dF; /* F(x) - F(x + dx) */ double dL; /* L(0) - L(dx) */ int foundstep = 0; /* found step dx */ /* compute A = J^T J */ status = gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, J, 0.0, A); if (status) return status; /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy('L', 0, A, A); #if SCALE lmniel_update_diag(J, diag); #endif /* loop until we find an acceptable step dx */ while (!foundstep) { /* solve (A + mu*I) dx = g */ status = lmniel_calc_dx(state->mu, A, rhs, dx, state); if (status) return status; /* compute x_trial = x + dx */ lmniel_trial_step(x, dx, x_trial); /* compute f(x + dx) */ status = gsl_multifit_eval_wf(fdf, x_trial, swts, f_trial); if (status) return status; /* compute dF = F(x) - F(x + dx) */ dF = lmniel_calc_dF(f, f_trial); /* compute dL = L(0) - L(dx) = dx^T (mu*dx - g) */ dL = lmniel_calc_dL(state->mu, diag, dx, rhs); /* check that rho = dF/dL > 0 */ if ((dL > 0.0) && (dF >= 0.0)) { /* reduction in error, step acceptable */ double tmp; /* update LM parameter mu */ tmp = 2.0 * (dF / dL) - 1.0; tmp = 1.0 - tmp*tmp*tmp; state->mu *= GSL_MAX(LM_ONE_THIRD, tmp); state->nu = 2; /* compute J <- J(x + dx) */ if (fdf->df) status = gsl_multifit_eval_wdf(fdf, x_trial, swts, J); else status = gsl_multifit_fdfsolver_dif_df(x_trial, swts, fdf, f_trial, J); if (status) return status; /* update x <- x + dx */ gsl_vector_memcpy(x, x_trial); /* update f <- f(x + dx) */ gsl_vector_memcpy(f, f_trial); /* compute new rhs = -J^T f */ gsl_blas_dgemv(CblasTrans, -1.0, J, f, 0.0, rhs); foundstep = 1; } else { long nu2; /* step did not reduce error, reject step */ state->mu *= (double) state->nu; nu2 = state->nu << 1; /* 2*nu */ if (nu2 <= state->nu) { gsl_vector_view d = gsl_matrix_diagonal(A); /* * nu has wrapped around / overflown, reset mu and nu * to original values and break to force another iteration */ /*GSL_ERROR("nu parameter has overflown", GSL_EOVRFLW);*/ state->nu = 2; state->mu = state->tau * gsl_vector_max(&d.vector); break; } state->nu = nu2; } } /* while (!foundstep) */ return GSL_SUCCESS; } /* lmniel_iterate() */ static int lmniel_gradient(void *vstate, gsl_vector * g) { lmniel_state_t *state = (lmniel_state_t *) vstate; gsl_vector_memcpy(g, state->rhs); gsl_vector_scale(g, -1.0); return GSL_SUCCESS; } static int lmniel_jac(void *vstate, gsl_matrix * J) { lmniel_state_t *state = (lmniel_state_t *) vstate; int s = gsl_matrix_memcpy(J, state->J); return s; } static const gsl_multifit_fdfsolver_type lmniel_type = { "lmniel", sizeof(lmniel_state_t), &lmniel_alloc, &lmniel_set, &lmniel_iterate, &lmniel_gradient, &lmniel_jac, &lmniel_free }; const gsl_multifit_fdfsolver_type *gsl_multifit_fdfsolver_lmniel = &lmniel_type; gsl-doc-2.3/multifit/multiwlinear.c0000664000175000017500000002305713013650753015511 0ustar eddedd/* multifit/multiwlinear.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "linear_common.c" /* General weighted case */ static int multifit_wlinear_svd (const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, double tol, int balance, 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 if requested */ if (balance) { gsl_linalg_balance_columns (A, D); } else { gsl_vector_set_all (D, 1.0); } /* 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 s0 = gsl_vector_get (S, 0); p_eff = 0; for (j = 0; j < p; j++) { gsl_vector_view column = gsl_matrix_column (QSI, j); double sj = gsl_vector_get (S, j); double alpha; if (sj <= tol * s0) { alpha = 0.0; } else { alpha = 1.0 / sj; 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); /* 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; /* Form covariance matrix cov = (X^T W X)^-1 = (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)); } } } 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_tsvd(X, w, y, GSL_DBL_EPSILON, c, cov, chisq, &rank, work); return status; } int gsl_multifit_wlinear_tsvd (const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, const double tol, gsl_vector * c, gsl_matrix * cov, double * chisq, size_t * rank, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (y->size != n) { GSL_ERROR("number of observations in y does not match matrix", GSL_EBADLEN); } else if (w->size != n) { GSL_ERROR("number of weights in w does not match matrix", GSL_EBADLEN); } else if (p != c->size) { GSL_ERROR ("number of parameters c does not match matrix", GSL_EBADLEN); } else if (tol <= 0) { GSL_ERROR ("tolerance must be positive", GSL_EINVAL); } else { int status; double rnorm, snorm; gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_vector_view b = gsl_vector_subvector(work->t, 0, n); /* compute A = sqrt(W) X, b = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, &A.matrix, &b.vector); if (status) return status; /* compute SVD of A */ status = gsl_multifit_linear_bsvd(&A.matrix, work); if (status) return status; status = multifit_linear_solve(X, &b.vector, tol, 0.0, rank, c, &rnorm, &snorm, work); if (status) return status; *chisq = rnorm * rnorm; /* variance-covariance matrix cov = s2 * (Q S^-1) (Q S^-1)^T */ { const size_t p = X->size2; size_t i, j; gsl_matrix_view QSI = gsl_matrix_submatrix(work->QSI, 0, 0, p, p); gsl_vector_view D = gsl_vector_subvector(work->D, 0, p); for (i = 0; i < p; i++) { gsl_vector_view row_i = gsl_matrix_row (&QSI.matrix, i); double d_i = gsl_vector_get (&D.vector, i); for (j = i; j < p; j++) { gsl_vector_view row_j = gsl_matrix_row (&QSI.matrix, j); double d_j = gsl_vector_get (&D.vector, 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)); } } } } return GSL_SUCCESS; } 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 status = multifit_wlinear_svd (X, w, y, tol, 1, rank, c, cov, chisq, work); return status; } int gsl_multifit_wlinear_usvd (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 status = multifit_wlinear_svd (X, w, y, tol, 0, rank, c, cov, chisq, work); return status; } gsl-doc-2.3/multifit/test_biggs.c0000664000175000017500000000463112616157443015132 0ustar eddedd#define biggs_N 6 /* >= p */ #define biggs_P 6 #define biggs_NTRIES 2 static double biggs_x0[biggs_P] = { 1.0, 2.0, 1.0, 1.0, 1.0, 1.0 }; static double biggs_epsrel = 1.0e-9; static void biggs_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 0.0; const double biggs_x[biggs_P] = { 1.0, 10.0, 1.0, 5.0, 4.0, 3.0 }; const double norm_exact = 12.3288280059380; gsl_vector_const_view v = gsl_vector_const_view_array(biggs_x, biggs_P); double norm = gsl_blas_dnrm2(&v.vector); gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* * the solution vector is not unique due to permutations, so test * the norm instead of individual elements */ gsl_test_rel(norm, norm_exact, epsrel, "%s/%s norm", sname, pname); } static int biggs_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); double yi = exp(-ti) - 5*exp(-10*ti) + 3*exp(-4*ti); double fi = x3*exp(-ti*x1) - x4*exp(-ti*x2) + x6*exp(-ti*x5) - yi; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int biggs_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); gsl_matrix_set(J, i, 0, -ti*x3*exp(-ti*x1)); gsl_matrix_set(J, i, 1, ti*x4*exp(-ti*x2)); gsl_matrix_set(J, i, 2, exp(-ti*x1)); gsl_matrix_set(J, i, 3, -exp(-ti*x2)); gsl_matrix_set(J, i, 4, -ti*x6*exp(-ti*x5)); gsl_matrix_set(J, i, 5, exp(-ti*x5)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf biggs_func = { &biggs_f, &biggs_df, NULL, biggs_N, biggs_P, NULL, 0, 0 }; static test_fdf_problem biggs_problem = { "biggs", biggs_x0, NULL, &biggs_epsrel, biggs_NTRIES, &biggs_checksol, &biggs_func }; gsl-doc-2.3/multifit/test_powell2.c0000664000175000017500000000276112616157443015425 0ustar eddedd#define powell2_N 2 #define powell2_P 2 #define powell2_NTRIES 3 static double powell2_x0[powell2_P] = { 3.0, 1.0 }; static double powell2_epsrel = 1.0e-7; static void powell2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell2_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell2_f (const gsl_vector * x, void *params, gsl_vector * f) { double x0 = gsl_vector_get (x, 0); double x1 = gsl_vector_get (x, 1); gsl_vector_set(f, 0, x0); gsl_vector_set(f, 1, 10.0*x0/(x0 + 0.1) + 2.0*x1*x1); return GSL_SUCCESS; } static int powell2_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 term = x0 + 0.1; gsl_matrix_set(df, 0, 0, 1.0); gsl_matrix_set(df, 0, 1, 0.0); gsl_matrix_set(df, 1, 0, 1.0 / (term * term)); gsl_matrix_set(df, 1, 1, 4.0 * x1); return GSL_SUCCESS; } static gsl_multifit_function_fdf powell2_func = { &powell2_f, &powell2_df, NULL, powell2_N, powell2_P, NULL, 0, 0 }; static test_fdf_problem powell2_problem = { "powell2", powell2_x0, NULL, &powell2_epsrel, powell2_NTRIES, &powell2_checksol, &powell2_func }; gsl-doc-2.3/multifit/test_bard.c0000644000175000017500000000515613017642356014746 0ustar eddedd#define bard_N 15 #define bard_P 3 #define bard_NTRIES 3 static double bard_x0[bard_P] = { 1.0, 1.0, 1.0 }; static double bard_epsrel = 1.0e-8; static double bard_Y[bard_N] = { 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, 0.96, 1.34, 2.10, 4.39 }; static void bard_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 8.214877306578963e-03; const double bard_x1[bard_P] = { 8.241055975623580e-02, 1.133036092245175, 2.343695178435405 }; const double sumsq_exact2 = 17.42869333333333; const double bard_x2[bard_P] = { 8.406666666666666e-01, -99999.9, /* -inf */ -99999.9 }; /* -inf */ const double *bard_x; double sumsq_exact; if (fabs(x[1]) < 10.0 && fabs(x[2]) < 10.0) { bard_x = bard_x1; sumsq_exact = sumsq_exact1; } else { bard_x = bard_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < bard_P; ++i) { if (bard_x[i] < -90000.0) continue; gsl_test_rel(x[i], bard_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int bard_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double yi = bard_Y[i]; double fi = yi - (x1 + (ui / (x2*vi + x3*wi))); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int bard_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double term = x2 * vi + x3 * wi; gsl_matrix_set(J, i, 0, -1.0); gsl_matrix_set(J, i, 1, ui * vi / (term * term)); gsl_matrix_set(J, i, 2, ui * wi / (term * term)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf bard_func = { &bard_f, &bard_df, NULL, bard_N, bard_P, NULL, 0, 0 }; static test_fdf_problem bard_problem = { "bard", bard_x0, NULL, &bard_epsrel, bard_NTRIES, &bard_checksol, &bard_func }; gsl-doc-2.3/multifit/test_vardim.c0000664000175000017500000000342212616157443015316 0ustar eddedd#define vardim_N 7 /* p + 2 */ #define vardim_P 5 #define vardim_NTRIES 4 static double vardim_x0[vardim_P] = { 0.8, 0.6, 0.4, 0.2, 0.0 }; static double vardim_epsrel = 1.0e-12; static void vardim_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < vardim_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int vardim_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = 0.0; for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi - 1.0); sum += (i + 1.0) * (xi - 1.0); } gsl_vector_set(f, vardim_P, sum); gsl_vector_set(f, vardim_P + 1, sum*sum); return GSL_SUCCESS; } static int vardim_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i; double sum = 0.0; gsl_matrix_view m = gsl_matrix_submatrix(J, 0, 0, vardim_P, vardim_P); gsl_matrix_set_identity(&m.matrix); for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); sum += (i + 1.0) * (xi - 1.0); } for (i = 0; i < vardim_P; ++i) { gsl_matrix_set(J, vardim_P, i, i + 1.0); gsl_matrix_set(J, vardim_P + 1, i, 2*(i + 1.0)*sum); } return GSL_SUCCESS; } static gsl_multifit_function_fdf vardim_func = { &vardim_f, &vardim_df, NULL, vardim_N, vardim_P, NULL, 0, 0 }; static test_fdf_problem vardim_problem = { "vardim", vardim_x0, NULL, &vardim_epsrel, vardim_NTRIES, &vardim_checksol, &vardim_func }; gsl-doc-2.3/multifit/TODO0000664000175000017500000000116213014632621013305 0ustar eddedd# -*- org -*- #+CATEGORY: multifit 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. The following features should be added to the nonlinear least squares routines: 1. Support for constraints 2. robust nonlinear least squares and robust ridge regression 3. covariance matrices for ridge regression 4. min_workspace_p is dynamically allocated in gsl_multifit_linear_gcv_min - fix gsl-doc-2.3/multifit/test_jennrich.c0000664000175000017500000000342112616157443015633 0ustar eddedd#define jennrich_N 10 #define jennrich_P 2 #define jennrich_NTRIES 1 static double jennrich_x0[jennrich_P] = { 0.3, 0.4 }; static double jennrich_epsrel = 1.0e-8; static void jennrich_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.243621823556148e+02; const double jennrich_x[jennrich_P] = { 2.578252139935855e-01, 2.578252133471426e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < jennrich_P; ++i) { gsl_test_rel(x[i], jennrich_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int jennrich_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; double fi = 2.0*(i + 2.0) - (exp(x1*ip1) + exp(x2*ip1)); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int jennrich_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; gsl_matrix_set(J, i, 0, -ip1*exp(ip1*x1)); gsl_matrix_set(J, i, 1, -ip1*exp(ip1*x2)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf jennrich_func = { &jennrich_f, &jennrich_df, NULL, jennrich_N, jennrich_P, NULL, 0, 0 }; static test_fdf_problem jennrich_problem = { "jennrich", jennrich_x0, NULL, &jennrich_epsrel, jennrich_NTRIES, &jennrich_checksol, &jennrich_func }; gsl-doc-2.3/multifit/lmiterate.c0000664000175000017500000001257612616157443014775 0ustar eddeddstatic int iterate (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, 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 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_eval_wf (fdf, x_trial, swts, 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); printf("r = "); gsl_matrix_fprintf(stdout, r, "%g"); printf("perm = "); gsl_permutation_fprintf(stdout, perm, "%d"); printf("dx = "); gsl_vector_fprintf(stdout, dx, "%g"); #endif /* Compute rptdx = R P^T dx, noting that |J dx| = |R P^T dx| */ compute_rptdx (r, perm, dx, rptdx); #ifdef DEBUG printf("rptdx = "); gsl_vector_fprintf(stdout, rptdx, "%g"); #endif 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; /* compute Jacobian at new x and store in state->r */ if (fdf->df) status = gsl_multifit_eval_wdf (fdf, x_trial, swts, r); else status = gsl_multifit_fdfsolver_dif_df(x_trial, swts, fdf, f_trial, r); 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 (r, diag); } /* compute J = Q R P^T and qtf = Q^T f */ { int signum; gsl_matrix_memcpy(state->J, r); gsl_linalg_QRPT_decomp (r, tau, perm, &signum, work1); gsl_vector_memcpy (qtf, f); gsl_linalg_QR_QTvec (r, tau, qtf); } 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_ENOPROG; } gsl-doc-2.3/multifit/test_nonlinear.c0000644000175000017500000004441412737536472016034 0ustar eddedd/* multifit/test_nonlinear.c * * Copyright (C) 2007, 2013, 2014 Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 struct { const char *name; double *x0; /* initial parameters (size p) */ double *sigma; double *epsrel; /* relative tolerance for solution checking */ size_t ntries; void (*checksol) (const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname); gsl_multifit_function_fdf *fdf; } test_fdf_problem; #include "test_bard.c" #include "test_beale.c" #include "test_biggs.c" #include "test_box.c" #include "test_boxbod.c" #include "test_brown1.c" #include "test_brown2.c" #include "test_brown3.c" #include "test_eckerle.c" #include "test_enso.c" #include "test_exp1.c" #include "test_gaussian.c" #include "test_hahn1.c" #include "test_helical.c" #include "test_jennrich.c" #include "test_kirby2.c" #include "test_kowalik.c" #include "test_lin1.c" #include "test_lin2.c" #include "test_lin3.c" #include "test_meyer.c" #include "test_meyerscal.c" #include "test_osborne.c" #include "test_penalty1.c" #include "test_penalty2.c" #include "test_powell1.c" #include "test_powell2.c" #include "test_powell3.c" #include "test_rat42.c" #include "test_rat43.c" #include "test_rosenbrock.c" #include "test_rosenbrocke.c" #include "test_roth.c" #include "test_thurber.c" #include "test_vardim.c" #include "test_watson.c" #include "test_wood.c" #include "test_wnlin.c" static void test_fdf(const gsl_multifit_fdfsolver_type * T, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts); static void test_fdfridge(const gsl_multifit_fdfsolver_type * T, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts); static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multifit_fdfsolver *s, test_fdf_problem *problem); static void test_scale_x0(gsl_vector *x0, const double scale); /* * These test problems are taken from * * H. B. Nielsen, UCTP test problems for unconstrained optimization, * IMM Department of Mathematical Modeling, Tech. Report IMM-REP-2000-17, * 2000. */ static test_fdf_problem *test_fdf_nielsen[] = { &lin1_problem, /* 1 */ &lin2_problem, /* 2 */ &lin3_problem, /* 3 */ &rosenbrock_problem, /* 4 */ &helical_problem, /* 5 */ &powell1_problem, /* 6 */ &roth_problem, /* 7 */ &bard_problem, /* 8 */ &kowalik_problem, /* 9 */ &meyer_problem, /* 10 */ &watson_problem, /* 11 */ &box_problem, /* 12 */ &jennrich_problem, /* 13 */ &brown1_problem, /* 14 */ &brown2_problem, /* 16 */ &osborne_problem, /* 17 */ &exp1_problem, /* 18 */ &meyerscal_problem, /* 20 */ &powell2_problem, NULL }; /* * These tests are from * * J. J. More, B. S. Garbow and K. E. Hillstrom, Testing * Unconstrained Optimization Software, ACM Trans. Math. Soft. * Vol 7, No 1, 1981. * * Many of these overlap with the Nielsen tests */ static test_fdf_problem *test_fdf_more[] = { &rosenbrock_problem, /* 1 */ &roth_problem, /* 2 */ &powell3_problem, /* 3 */ &brown3_problem, /* 4 */ &beale_problem, /* 5 */ &jennrich_problem, /* 6 */ &helical_problem, /* 7 */ &bard_problem, /* 8 */ &gaussian_problem, /* 9 */ &meyer_problem, /* 10 */ &box_problem, /* 12 */ &powell1_problem, /* 13 */ &wood_problem, /* 14 */ &kowalik_problem, /* 15 */ &brown1_problem, /* 16 */ &osborne_problem, /* 17 */ &biggs_problem, /* 18 */ &watson_problem, /* 20 */ &rosenbrocke_problem, /* 21 */ &penalty1_problem, /* 23 */ &penalty2_problem, /* 24 */ &vardim_problem, /* 25 */ &brown2_problem, /* 27 */ &lin1_problem, /* 32 */ &lin2_problem, /* 33 */ &lin3_problem, /* 34 */ NULL }; /* NIST test cases */ static test_fdf_problem *test_fdf_nist[] = { &kirby2_problem, &hahn1_problem, &enso_problem, &thurber_problem, &boxbod_problem, &rat42_problem, &eckerle_problem, &rat43_problem, NULL }; static void test_nonlinear(void) { const double xtol = pow(GSL_DBL_EPSILON, 0.9); const double gtol = pow(GSL_DBL_EPSILON, 0.9); const double ftol = 0.0; size_t i, j; /* Nielsen tests */ for (i = 0; test_fdf_nielsen[i] != NULL; ++i) { test_fdf_problem *problem = test_fdf_nielsen[i]; double epsrel = *(problem->epsrel); double scale = 1.0; for (j = 0; j < problem->ntries; ++j) { double eps_scale = epsrel * scale; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); /* test finite difference Jacobian */ { gsl_multifit_function_fdf fdf; fdf.df = problem->fdf->df; problem->fdf->df = NULL; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, 1.0e5 * eps_scale, 1.0, problem, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, 1.0e5 * eps_scale, 1.0, problem, NULL); problem->fdf->df = fdf.df; } scale *= 10.0; } test_fdf(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, 10.0 * epsrel, 1.0, problem, NULL); } /* More tests */ for (i = 0; test_fdf_more[i] != NULL; ++i) { test_fdf_problem *problem = test_fdf_more[i]; double epsrel = *(problem->epsrel); double scale = 1.0; for (j = 0; j < problem->ntries; ++j) { double eps_scale = epsrel * scale; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); /* test finite difference Jacobian */ { gsl_multifit_function_fdf fdf; fdf.df = problem->fdf->df; problem->fdf->df = NULL; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, 1.0e5 * eps_scale, 1.0, problem, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, 1.0e5 * eps_scale, 1.0, problem, NULL); problem->fdf->df = fdf.df; } scale *= 10.0; } test_fdf(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, 10.0 * epsrel, 1.0, problem, NULL); } /* NIST tests */ for (i = 0; test_fdf_nist[i] != NULL; ++i) { test_fdf_problem *problem = test_fdf_nist[i]; double epsrel = *(problem->epsrel); double scale = 1.0; for (j = 0; j < problem->ntries; ++j) { double eps_scale = epsrel * scale; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); test_fdf(gsl_multifit_fdfsolver_lmder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); /* test finite difference Jacobian */ { gsl_multifit_function_fdf fdf; fdf.df = problem->fdf->df; problem->fdf->df = NULL; test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, eps_scale, 1.0, problem, NULL); test_fdf(gsl_multifit_fdfsolver_lmder, xtol, gtol, ftol, eps_scale, scale, problem, NULL); problem->fdf->df = fdf.df; } scale *= 10.0; } test_fdf(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, epsrel, 1.0, problem, NULL); } /* test weighted nonlinear least squares */ /* internal weighting in _f and _df functions */ test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem1, NULL); test_fdf(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem1, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem1, NULL); test_fdfridge(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem1, NULL); /* weighting through fdfsolver_wset */ test_fdf(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem2, wnlin_W); test_fdf(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem2, wnlin_W); test_fdfridge(gsl_multifit_fdfsolver_lmsder, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem2, wnlin_W); test_fdfridge(gsl_multifit_fdfsolver_lmniel, xtol, gtol, ftol, wnlin_epsrel, 1.0, &wnlin_problem2, wnlin_W); } /* test_fdf() Test a weighted nonlinear least squares problem Inputs: T - solver to use xtol - tolerance in x gtol - tolerance in gradient ftol - tolerance in residual vector epsrel - relative error tolerance in solution x0_scale - to test robustness against starting points, the standard starting point in 'problem' is multiplied by this scale factor: x0 <- x0 * x0_scale If x0 = 0, then all components of x0 are set to x0_scale problem - contains the nonlinear problem and solution point wts - weight vector (NULL for unweighted) */ static void test_fdf(const gsl_multifit_fdfsolver_type * T, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts) { gsl_multifit_function_fdf *fdf = problem->fdf; const size_t n = fdf->n; const size_t p = fdf->p; const size_t max_iter = 1500; gsl_vector *x0 = gsl_vector_alloc(p); gsl_vector_view x0v = gsl_vector_view_array(problem->x0, p); gsl_multifit_fdfsolver *s = gsl_multifit_fdfsolver_alloc (T, n, p); const char *pname = problem->name; char sname[2048]; int status, info; sprintf(sname, "%s/scale=%g%s", gsl_multifit_fdfsolver_name(s), x0_scale, problem->fdf->df ? "" : "/fdiff"); /* scale starting point x0 */ gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); if (wts) { gsl_vector_const_view wv = gsl_vector_const_view_array(wts, n); gsl_multifit_fdfsolver_wset(s, fdf, x0, &wv.vector); } else gsl_multifit_fdfsolver_set(s, fdf, x0); status = gsl_multifit_fdfsolver_driver(s, max_iter, xtol, gtol, ftol, &info); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* check solution */ test_fdf_checksol(sname, pname, epsrel, s, problem); if (wts == NULL) { /* test again with weighting matrix W = I */ gsl_vector *wv = gsl_vector_alloc(n); sprintf(sname, "%s/scale=%g%s/weights", gsl_multifit_fdfsolver_name(s), x0_scale, problem->fdf->df ? "" : "/fdiff"); gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); gsl_vector_set_all(wv, 1.0); gsl_multifit_fdfsolver_wset(s, fdf, x0, wv); status = gsl_multifit_fdfsolver_driver(s, max_iter, xtol, gtol, ftol, &info); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); test_fdf_checksol(sname, pname, epsrel, s, problem); gsl_vector_free(wv); } gsl_multifit_fdfsolver_free(s); gsl_vector_free(x0); } /* test_fdfridge() Test a nonlinear least squares problem Inputs: T - solver to use xtol - tolerance in x gtol - tolerance in gradient ftol - tolerance in residual vector epsrel - relative error tolerance in solution x0_scale - to test robustness against starting points, the standard starting point in 'problem' is multiplied by this scale factor: x0 <- x0 * x0_scale If x0 = 0, then all components of x0 are set to x0_scale problem - contains the nonlinear problem and solution point wts - weight vector */ static void test_fdfridge(const gsl_multifit_fdfsolver_type * T, const double xtol, const double gtol, const double ftol, const double epsrel, const double x0_scale, test_fdf_problem *problem, const double *wts) { gsl_multifit_function_fdf *fdf = problem->fdf; const size_t n = fdf->n; const size_t p = fdf->p; const size_t max_iter = 1500; gsl_vector *x0 = gsl_vector_alloc(p); gsl_vector_view x0v = gsl_vector_view_array(problem->x0, p); gsl_multifit_fdfridge *w = gsl_multifit_fdfridge_alloc (T, n, p); const char *pname = problem->name; char sname[2048]; int status, info; double lambda = 0.0; sprintf(sname, "ridge/%s", gsl_multifit_fdfridge_name(w)); /* scale starting point x0 */ gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); /* test undamped case with lambda = 0 */ if (wts) { gsl_vector_const_view wv = gsl_vector_const_view_array(wts, n); gsl_multifit_fdfridge_wset(w, fdf, x0, lambda, &wv.vector); } else gsl_multifit_fdfridge_set(w, fdf, x0, lambda); status = gsl_multifit_fdfridge_driver(w, max_iter, xtol, gtol, ftol, &info); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* check solution */ test_fdf_checksol(sname, pname, epsrel, w->s, problem); /* test for self consisent solution with L = \lambda I */ { const double eps = 1.0e-10; gsl_matrix *L = gsl_matrix_calloc(p, p); gsl_vector_view diag = gsl_matrix_diagonal(L); gsl_multifit_fdfridge *w2 = gsl_multifit_fdfridge_alloc (T, n, p); gsl_vector *y0 = gsl_vector_alloc(p); size_t i; /* pick some value for lambda and set L = \lambda I */ lambda = 5.0; gsl_vector_set_all(&diag.vector, lambda); /* scale initial vector */ gsl_vector_memcpy(x0, &x0v.vector); test_scale_x0(x0, x0_scale); gsl_vector_memcpy(y0, x0); if (wts) { gsl_vector_const_view wv = gsl_vector_const_view_array(wts, n); gsl_multifit_fdfridge_wset(w, fdf, x0, lambda, &wv.vector); gsl_multifit_fdfridge_wset3(w2, fdf, y0, L, &wv.vector); } else { gsl_multifit_fdfridge_set(w, fdf, x0, lambda); gsl_multifit_fdfridge_set3(w2, fdf, y0, L); } /* solve with scalar lambda routine */ status = gsl_multifit_fdfridge_driver(w, max_iter, xtol, gtol, ftol, &info); gsl_test(status, "%s/lambda/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* solve with general matrix routine */ status = gsl_multifit_fdfridge_driver(w2, max_iter, xtol, gtol, ftol, &info); gsl_test(status, "%s/L/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* test x = y */ for (i = 0; i < p; ++i) { double xi = gsl_vector_get(w->s->x, i); double yi = gsl_vector_get(w2->s->x, i); if (fabs(xi) < eps) { gsl_test_abs(yi, xi, eps, "%s/%s ridge lambda=%g i=%zu", sname, pname, lambda, i); } else { gsl_test_rel(yi, xi, eps, "%s/%s ridge lambda=%g i=%zu", sname, pname, lambda, i); } } gsl_matrix_free(L); gsl_vector_free(y0); gsl_multifit_fdfridge_free(w2); } gsl_multifit_fdfridge_free(w); gsl_vector_free(x0); } static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multifit_fdfsolver *s, test_fdf_problem *problem) { gsl_multifit_function_fdf *fdf = problem->fdf; const double *sigma = problem->sigma; gsl_vector *f = gsl_multifit_fdfsolver_residual(s); gsl_vector *x = gsl_multifit_fdfsolver_position(s); double sumsq; /* check solution vector x and sumsq = ||f||^2 */ gsl_blas_ddot(f, f, &sumsq); (problem->checksol)(x->data, sumsq, epsrel, sname, pname); #if 1 /* check variances */ if (sigma) { const size_t n = fdf->n; const size_t p = fdf->p; size_t i; gsl_matrix * J = gsl_matrix_alloc(n, p); gsl_matrix * covar = gsl_matrix_alloc (p, p); gsl_multifit_fdfsolver_jac (s, J); gsl_multifit_covar(J, 0.0, covar); for (i = 0; i < p; i++) { double ei = sqrt(sumsq/(n-p))*sqrt(gsl_matrix_get(covar,i,i)); gsl_test_rel (ei, sigma[i], epsrel, "%s/%s, sigma(%d)", sname, pname, i) ; } gsl_matrix_free (J); gsl_matrix_free (covar); } #endif } static void test_scale_x0(gsl_vector *x0, const double scale) { double nx = gsl_blas_dnrm2(x0); if (nx == 0.0) gsl_vector_set_all(x0, scale); else gsl_vector_scale(x0, scale); } /* test_scale_x0() */ gsl-doc-2.3/multifit/test_rat43.c0000664000175000017500000000501712616157443014773 0ustar eddedd#define rat43_N 15 #define rat43_P 4 #define rat43_NTRIES 1 static double rat43_x0[rat43_P] = { 100.0, 10.0, 1.0, 1.0 }; static double rat43_epsrel = 1.0e-6; static double rat43_sigma[rat43_P] = { 1.6302297817E+01, 2.0828735829E+00, 1.9566123451E-01, 6.8761936385E-01 }; static double rat43_F[rat43_N] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 }; static void rat43_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.7864049080E+03; const double rat43_x[rat43_P] = { 6.9964151270E+02, 5.2771253025E+00, 7.5962938329E-01, 1.2792483859E+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat43_P; ++i) { gsl_test_rel(x[i], rat43_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat43_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double yi = b[0] / pow(1.0 + e, 1.0 / b[3]); gsl_vector_set (f, i, yi - rat43_F[i]); } return GSL_SUCCESS; } static int rat43_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double term1 = 1.0 + e; double term2 = pow(term1, -1.0 / b[3]); gsl_matrix_set (df, i, 0, term2); gsl_matrix_set (df, i, 1, -b[0] / b[3] * e * term2 / term1); gsl_matrix_set (df, i, 2, b[0] / b[3] * xi * e * term2 / term1); gsl_matrix_set (df, i, 3, b[0] / b[3] / b[3] * log(term1) * term2); } return GSL_SUCCESS; } static gsl_multifit_function_fdf rat43_func = { &rat43_f, &rat43_df, NULL, rat43_N, rat43_P, NULL, 0, 0 }; static test_fdf_problem rat43_problem = { "nist-rat43", rat43_x0, rat43_sigma, &rat43_epsrel, rat43_NTRIES, &rat43_checksol, &rat43_func }; gsl-doc-2.3/multifit/test_roth.c0000664000175000017500000000347712616157443015022 0ustar eddedd#define roth_N 2 #define roth_P 2 #define roth_NTRIES 3 static double roth_x0[roth_P] = { 0.5, -2.0 }; static double roth_epsrel = 1.0e-8; static void roth_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 0.0; const double roth_x1[roth_P] = { 5.0, 4.0 }; const double sumsq_exact2 = 48.9842536792400; const double roth_x2[roth_P] = { 11.4127789869021, -0.896805253274477 }; const double *roth_x; double sumsq_exact; if (fabs(sumsq) < 0.1) { sumsq_exact = sumsq_exact1; roth_x = roth_x1; } else { sumsq_exact = sumsq_exact2; roth_x = roth_x2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < roth_P; ++i) { gsl_test_rel(x[i], roth_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int roth_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - x2*(2.0 - x2*(5.0 - x2)) - 13.0); gsl_vector_set(f, 1, x1 - x2*(14.0 - x2*(1.0 + x2)) - 29.0); return GSL_SUCCESS; } static int roth_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 0, 1, -2.0 + x2*(10.0 - 3.0*x2)); gsl_matrix_set(J, 1, 0, 1.0); gsl_matrix_set(J, 1, 1, -14.0 + x2*(2.0 + 3.0*x2)); return GSL_SUCCESS; } static gsl_multifit_function_fdf roth_func = { &roth_f, &roth_df, NULL, roth_N, roth_P, NULL, 0, 0 }; static test_fdf_problem roth_problem = { "roth_freudenstein", roth_x0, NULL, &roth_epsrel, roth_NTRIES, &roth_checksol, &roth_func }; gsl-doc-2.3/multifit/test_penalty1.c0000664000175000017500000000347712616157443015603 0ustar eddedd#define penalty1_N 11 /* p + 1 */ #define penalty1_P 10 #define penalty1_NTRIES 4 static double penalty1_x0[penalty1_P] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 }; static double penalty1_epsrel = 1.0e-12; static void penalty1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 7.08765146709037993e-05; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); } static int penalty1_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; double sum = 0.0; for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, sqrt_alpha*(xi - 1.0)); sum += xi * xi; } gsl_vector_set(f, penalty1_P, sum - 0.25); return GSL_SUCCESS; } static int penalty1_df (const gsl_vector * x, void *params, gsl_matrix * J) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; gsl_matrix_view m = gsl_matrix_submatrix(J, 0, 0, penalty1_P, penalty1_P); gsl_vector_view diag = gsl_matrix_diagonal(&m.matrix); gsl_matrix_set_zero(&m.matrix); gsl_vector_set_all(&diag.vector, sqrt_alpha); for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_matrix_set(J, penalty1_P, i, 2.0 * xi); } return GSL_SUCCESS; } static gsl_multifit_function_fdf penalty1_func = { &penalty1_f, &penalty1_df, NULL, penalty1_N, penalty1_P, NULL, 0, 0 }; static test_fdf_problem penalty1_problem = { "penalty1", penalty1_x0, NULL, &penalty1_epsrel, penalty1_NTRIES, &penalty1_checksol, &penalty1_func }; gsl-doc-2.3/multifit/test_rosenbrock.c0000664000175000017500000000274412616157443016211 0ustar eddedd#define rosenbrock_N 2 #define rosenbrock_P 2 #define rosenbrock_NTRIES 4 static double rosenbrock_x0[rosenbrock_P] = { -1.2, 1.0 }; static double rosenbrock_epsrel = 1.0e-12; static void rosenbrock_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrock_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 10.0 * (x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); return GSL_SUCCESS; } static int rosenbrock_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); gsl_matrix_set(J, 0, 0, -20.0*x1); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 1, 1, 0.0); return GSL_SUCCESS; } static gsl_multifit_function_fdf rosenbrock_func = { &rosenbrock_f, &rosenbrock_df, NULL, rosenbrock_N, rosenbrock_P, NULL, 0, 0 }; static test_fdf_problem rosenbrock_problem = { "rosenbrock", rosenbrock_x0, NULL, &rosenbrock_epsrel, rosenbrock_NTRIES, &rosenbrock_checksol, &rosenbrock_func }; gsl-doc-2.3/multifit/test_reg.c0000644000175000017500000004320412752713256014612 0ustar eddedd/* generate random square orthogonal matrix via QR decomposition */ static void test_random_matrix_orth(gsl_matrix *m, const gsl_rng *r) { const size_t M = m->size1; gsl_matrix *A = gsl_matrix_alloc(M, M); gsl_vector *tau = gsl_vector_alloc(M); gsl_matrix *R = gsl_matrix_alloc(M, M); test_random_matrix(A, r, -1.0, 1.0); gsl_linalg_QR_decomp(A, tau); gsl_linalg_QR_unpack(A, tau, m, R); gsl_matrix_free(A); gsl_matrix_free(R); gsl_vector_free(tau); } /* construct ill-conditioned matrix via SVD */ static void test_random_matrix_ill(gsl_matrix *m, const gsl_rng *r) { const size_t M = m->size1; const size_t N = m->size2; gsl_matrix *U = gsl_matrix_alloc(M, M); gsl_matrix *V = gsl_matrix_alloc(N, N); gsl_vector *S = gsl_vector_alloc(N); gsl_matrix_view Uv = gsl_matrix_submatrix(U, 0, 0, M, N); const double smin = 16.0 * GSL_DBL_EPSILON; const double smax = 10.0; const double ratio = pow(smin / smax, 1.0 / (N - 1.0)); double s; size_t j; test_random_matrix_orth(U, r); test_random_matrix_orth(V, r); /* compute U * S */ s = smax; for (j = 0; j < N; ++j) { gsl_vector_view uj = gsl_matrix_column(U, j); gsl_vector_scale(&uj.vector, s); s *= ratio; } /* compute m = (U * S) * V' */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, &Uv.matrix, V, 0.0, m); gsl_matrix_free(U); gsl_matrix_free(V); gsl_vector_free(S); } /* solve system with lambda = 0 and test against OLS solution */ static void test_reg1(const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const double tol, gsl_multifit_linear_workspace * w, const char * desc) { const size_t n = X->size1; const size_t p = X->size2; double rnorm, snorm, chisq; gsl_vector *c0 = gsl_vector_alloc(p); gsl_vector *c1 = gsl_vector_alloc(p); gsl_matrix *cov = gsl_matrix_alloc(p, p); size_t j; if (wts) { gsl_matrix *Xs = gsl_matrix_alloc(n, p); gsl_vector *ys = gsl_vector_alloc(n); gsl_multifit_wlinear(X, wts, y, c0, cov, &chisq, w); gsl_multifit_linear_wstdform1(NULL, X, wts, y, Xs, ys, w); gsl_multifit_linear_svd(Xs, w); gsl_multifit_linear_solve(0.0, Xs, ys, c1, &rnorm, &snorm, w); gsl_matrix_free(Xs); gsl_vector_free(ys); } else { gsl_multifit_linear(X, y, c0, cov, &chisq, w); gsl_multifit_linear_svd(X, w); gsl_multifit_linear_solve(0.0, X, y, c1, &rnorm, &snorm, w); } gsl_test_rel(rnorm*rnorm, chisq, tol, "test_reg1: %s, lambda = 0, n=%zu p=%zu chisq", desc, n, p); /* test c0 = c1 */ for (j = 0; j < p; ++j) { double c0j = gsl_vector_get(c0, j); double c1j = gsl_vector_get(c1, j); gsl_test_rel(c1j, c0j, tol, "test_reg1: %s, lambda = 0, n=%zu p=%zu c0/c1", desc, n, p); } gsl_vector_free(c0); gsl_vector_free(c1); gsl_matrix_free(cov); } /* solve standard form system with given lambda and test against * normal equations solution, L = I */ static void test_reg2(const double lambda, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const double tol, gsl_multifit_linear_workspace * w, const char * desc) { const size_t n = X->size1; const size_t p = X->size2; double rnorm0, snorm0; double rnorm1, snorm1; gsl_vector *c0 = gsl_vector_alloc(p); gsl_vector *c1 = gsl_vector_alloc(p); gsl_matrix *XTX = gsl_matrix_alloc(p, p); /* X^T W X + lambda^2 I */ gsl_vector *XTy = gsl_vector_alloc(p); /* X^T W y */ gsl_matrix *Xs = gsl_matrix_alloc(n, p); gsl_vector *ys = gsl_vector_alloc(n); gsl_vector_view xtx_diag = gsl_matrix_diagonal(XTX); gsl_permutation *perm = gsl_permutation_alloc(p); gsl_vector *r = gsl_vector_alloc(n); int signum; size_t j; /* compute Xs = sqrt(W) X and ys = sqrt(W) y */ gsl_multifit_linear_wstdform1(NULL, X, wts, y, Xs, ys, w); /* construct XTy = X^T W y */ gsl_blas_dgemv(CblasTrans, 1.0, Xs, ys, 0.0, XTy); /* construct XTX = X^T W X + lambda^2 I */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, Xs, Xs, 0.0, XTX); gsl_vector_add_constant(&xtx_diag.vector, lambda*lambda); /* solve XTX c = XTy with LU decomp */ gsl_linalg_LU_decomp(XTX, perm, &signum); gsl_linalg_LU_solve(XTX, perm, XTy, c0); /* compute SVD of X */ gsl_multifit_linear_svd(Xs, w); /* solve regularized standard form system with lambda */ gsl_multifit_linear_solve(lambda, Xs, ys, c1, &rnorm0, &snorm0, w); /* test snorm = ||c1|| */ snorm1 = gsl_blas_dnrm2(c1); gsl_test_rel(snorm0, snorm1, tol, "test_reg2: %s, snorm lambda=%g n=%zu p=%zu", desc, lambda, n, p); /* test rnorm = ||y - X c1|| */ gsl_vector_memcpy(r, ys); gsl_blas_dgemv(CblasNoTrans, -1.0, Xs, c1, 1.0, r); rnorm1 = gsl_blas_dnrm2(r); gsl_test_rel(rnorm0, rnorm1, tol, "test_reg2: %s, rnorm lambda=%g n=%zu p=%zu", desc, lambda, n, p); /* test c0 = c1 */ for (j = 0; j < p; ++j) { double c0j = gsl_vector_get(c0, j); double c1j = gsl_vector_get(c1, j); gsl_test_rel(c1j, c0j, tol, "test_reg2: %s, c0/c1 lambda=%g n=%zu p=%zu", desc, lambda, n, p); } gsl_matrix_free(XTX); gsl_vector_free(XTy); gsl_matrix_free(Xs); gsl_vector_free(ys); gsl_vector_free(c0); gsl_vector_free(c1); gsl_vector_free(r); gsl_permutation_free(perm); } /* solve system with given lambda and L = diag(L) and test against * normal equations solution */ static void test_reg3(const double lambda, const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const double tol, gsl_multifit_linear_workspace * w, const char * desc) { const size_t n = X->size1; const size_t p = X->size2; double rnorm0, snorm0; double rnorm1, snorm1; gsl_vector *c0 = gsl_vector_alloc(p); gsl_vector *c1 = gsl_vector_alloc(p); gsl_matrix *XTX = gsl_matrix_alloc(p, p); /* X^T W X + lambda^2 L^T L */ gsl_vector *XTy = gsl_vector_alloc(p); /* X^T W y */ gsl_matrix *Xs = gsl_matrix_alloc(n, p); /* standard form X~ */ gsl_vector *ys = gsl_vector_alloc(n); /* standard form y~ */ gsl_vector *Lc = gsl_vector_alloc(p); gsl_vector *r = gsl_vector_alloc(n); gsl_permutation *perm = gsl_permutation_alloc(p); int signum; size_t j; /* compute Xs = sqrt(W) X, ys = sqrt(W) y */ gsl_multifit_linear_wstdform1(NULL, X, wts, y, Xs, ys, w); /* construct XTy = X^T W y */ gsl_blas_dgemv(CblasTrans, 1.0, Xs, ys, 0.0, XTy); /* construct XTX = X^T W X + lambda^2 L^T L */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, Xs, Xs, 0.0, XTX); for (j = 0; j < p; ++j) { double lj = gsl_vector_get(L, j); *gsl_matrix_ptr(XTX, j, j) += pow(lambda * lj, 2.0); } /* solve XTX c = XTy with LU decomp */ gsl_linalg_LU_decomp(XTX, perm, &signum); gsl_linalg_LU_solve(XTX, perm, XTy, c0); /* solve with reg routine */ gsl_multifit_linear_wstdform1(L, X, wts, y, Xs, ys, w); gsl_multifit_linear_svd(Xs, w); gsl_multifit_linear_solve(lambda, Xs, ys, c1, &rnorm0, &snorm0, w); gsl_multifit_linear_genform1(L, c1, c1, w); /* test snorm = ||L c1|| */ gsl_vector_memcpy(Lc, c1); gsl_vector_mul(Lc, L); snorm1 = gsl_blas_dnrm2(Lc); gsl_test_rel(snorm0, snorm1, tol, "test_reg3: %s, snorm lambda=%g n=%zu p=%zu", desc, lambda, n, p); /* test rnorm = ||y - X c1||, compute again Xs = sqrt(W) X and ys = sqrt(W) y */ gsl_multifit_linear_wstdform1(NULL, X, wts, y, Xs, ys, w); gsl_vector_memcpy(r, ys); gsl_blas_dgemv(CblasNoTrans, -1.0, Xs, c1, 1.0, r); rnorm1 = gsl_blas_dnrm2(r); gsl_test_rel(rnorm0, rnorm1, tol, "test_reg3: %s, rnorm lambda=%g n=%zu p=%zu", desc, lambda, n, p); /* test c0 = c1 */ for (j = 0; j < p; ++j) { double c0j = gsl_vector_get(c0, j); double c1j = gsl_vector_get(c1, j); gsl_test_rel(c1j, c0j, tol, "test_reg3: %s, c0/c1 j=%zu lambda=%g n=%zu p=%zu", desc, j, lambda, n, p); } gsl_matrix_free(Xs); gsl_matrix_free(XTX); gsl_vector_free(XTy); gsl_vector_free(c0); gsl_vector_free(c1); gsl_vector_free(Lc); gsl_vector_free(ys); gsl_vector_free(r); gsl_permutation_free(perm); } /* solve system with given lambda and L and test against * normal equations solution */ static void test_reg4(const double lambda, const gsl_matrix * L, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const double tol, gsl_multifit_linear_workspace * w, const char *desc) { const size_t m = L->size1; const size_t n = X->size1; const size_t p = X->size2; double rnorm0, snorm0; double rnorm1, snorm1; gsl_vector *c0 = gsl_vector_alloc(p); gsl_vector *c1 = gsl_vector_alloc(p); gsl_matrix *LTL = gsl_matrix_alloc(p, p); /* L^T L */ gsl_matrix *XTX = gsl_matrix_alloc(p, p); /* X^T W X + lambda^2 L^T L */ gsl_vector *XTy = gsl_vector_alloc(p); /* X^T W y */ gsl_permutation *perm = gsl_permutation_alloc(p); gsl_matrix *Xs = (m < p) ? gsl_matrix_alloc(n - (p - m), m) : gsl_matrix_alloc(n, p); gsl_vector *ys = (m < p) ? gsl_vector_alloc(n - (p - m)) : gsl_vector_alloc(n); gsl_matrix *M = (m < p) ? gsl_matrix_alloc(n, p) : gsl_matrix_alloc(m, p); gsl_vector *cs = (m < p) ? gsl_vector_alloc(m) : gsl_vector_alloc(p); gsl_matrix *WX = gsl_matrix_alloc(n, p); gsl_vector *Wy = gsl_vector_alloc(n); gsl_vector *Lc = gsl_vector_alloc(m); gsl_vector *r = gsl_vector_alloc(n); gsl_matrix *LQR = gsl_matrix_alloc(m, p); gsl_vector *Ltau = gsl_vector_alloc(GSL_MIN(m, p)); int signum; size_t j; /* compute WX = sqrt(W) X, Wy = sqrt(W) y */ gsl_multifit_linear_wstdform1(NULL, X, wts, y, WX, Wy, w); /* construct XTy = X^T W y */ gsl_blas_dgemv(CblasTrans, 1.0, WX, Wy, 0.0, XTy); /* construct XTX = X^T W X + lambda^2 L^T L */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, L, L, 0.0, LTL); gsl_matrix_scale(LTL, lambda * lambda); gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, WX, WX, 0.0, XTX); gsl_matrix_add(XTX, LTL); /* solve XTX c = XTy with LU decomp */ gsl_linalg_LU_decomp(XTX, perm, &signum); gsl_linalg_LU_solve(XTX, perm, XTy, c0); /* solve with reg routine */ gsl_matrix_memcpy(LQR, L); gsl_multifit_linear_L_decomp(LQR, Ltau); gsl_multifit_linear_wstdform2(LQR, Ltau, X, wts, y, Xs, ys, M, w); gsl_multifit_linear_svd(Xs, w); gsl_multifit_linear_solve(lambda, Xs, ys, cs, &rnorm0, &snorm0, w); gsl_multifit_linear_wgenform2(LQR, Ltau, X, wts, y, cs, M, c1, w); /* test snorm = ||L c1|| */ gsl_blas_dgemv(CblasNoTrans, 1.0, L, c1, 0.0, Lc); snorm1 = gsl_blas_dnrm2(Lc); gsl_test_rel(snorm0, snorm1, tol, "test_reg4: %s snorm lambda=%g", desc, lambda); /* test rnorm = ||y - X c1||_W */ gsl_vector_memcpy(r, Wy); gsl_blas_dgemv(CblasNoTrans, -1.0, WX, c1, 1.0, r); rnorm1 = gsl_blas_dnrm2(r); gsl_test_rel(rnorm0, rnorm1, tol, "test_reg4: %s rnorm lambda=%g", desc, lambda); /* test c0 = c1 */ for (j = 0; j < p; ++j) { double c0j = gsl_vector_get(c0, j); double c1j = gsl_vector_get(c1, j); gsl_test_rel(c1j, c0j, tol, "test_reg4: %s lambda=%g n=%zu p=%zu j=%zu", desc, lambda, n, p, j); } gsl_matrix_free(LTL); gsl_matrix_free(XTX); gsl_vector_free(XTy); gsl_vector_free(c0); gsl_vector_free(c1); gsl_permutation_free(perm); gsl_matrix_free(Xs); gsl_vector_free(ys); gsl_vector_free(cs); gsl_matrix_free(M); gsl_vector_free(Lc); gsl_matrix_free(WX); gsl_vector_free(Wy); gsl_vector_free(r); gsl_matrix_free(LQR); gsl_vector_free(Ltau); } static void test_reg_system(const size_t n, const size_t p, const gsl_rng *r) { gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *c = gsl_vector_alloc(p); gsl_vector *wts = gsl_vector_alloc(n); gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_multifit_linear_workspace *wbig = gsl_multifit_linear_alloc(n + 10, p + 5); gsl_vector *diagL = gsl_vector_alloc(p); gsl_matrix *Lsqr = gsl_matrix_alloc(p, p); gsl_matrix *Ltall = gsl_matrix_alloc(5*p, p); gsl_matrix *L1 = gsl_matrix_alloc(p - 1, p); gsl_matrix *L2 = gsl_matrix_alloc(p - 2, p); gsl_matrix *L3 = gsl_matrix_alloc(p - 3, p); gsl_matrix *L5 = gsl_matrix_alloc(p - 5, p); size_t i; /* generate random weights */ test_random_vector(wts, r, 0.0, 1.0); /* generate well-conditioned system and test against OLS solution */ test_random_matrix(X, r, -1.0, 1.0); test_random_vector(y, r, -1.0, 1.0); test_reg1(X, y, NULL, 1.0e-10, w, "unweighted"); test_reg1(X, y, wts, 1.0e-10, w, "weighted"); /* generate ill-conditioned system */ test_random_matrix_ill(X, r); test_random_vector(c, r, -1.0, 1.0); /* compute y = X c + noise */ gsl_blas_dgemv(CblasNoTrans, 1.0, X, c, 0.0, y); test_random_vector_noise(r, y); /* random diag(L) vector */ test_random_vector(diagL, r, -2.0, 2.0); /* random square and tall L matrices */ test_random_matrix(Lsqr, r, -2.0, 2.0); test_random_matrix(Ltall, r, -2.0, 2.0); gsl_multifit_linear_Lk(p, 1, L1); gsl_multifit_linear_Lk(p, 2, L2); gsl_multifit_linear_Lk(p, 3, L3); gsl_multifit_linear_Lk(p, 5, L5); for (i = 0; i < 3; ++i) { /* * can't make lambda too small or normal equations * approach won't work well */ double lambda = pow(10.0, -(double) i); /* test unweighted */ test_reg2(lambda, X, y, NULL, 1.0e-6, w, "unweighted"); test_reg3(lambda, diagL, X, y, NULL, 1.0e-6, w, "unweighted"); test_reg4(lambda, Lsqr, X, y, NULL, 1.0e-8, w, "Lsqr unweighted"); test_reg4(lambda, Ltall, X, y, NULL, 1.0e-8, w, "Ltall unweighted"); test_reg4(lambda, L1, X, y, NULL, 1.0e-6, w, "L1 unweighted"); test_reg4(lambda, L2, X, y, NULL, 1.0e-6, w, "L2 unweighted"); test_reg4(lambda, L3, X, y, NULL, 1.0e-5, w, "L3 unweighted"); test_reg4(lambda, L5, X, y, NULL, 1.0e-4, w, "L5 unweighted"); /* test weighted */ test_reg2(lambda, X, y, wts, 1.0e-6, w, "weighted"); test_reg3(lambda, diagL, X, y, wts, 1.0e-6, w, "weighted"); test_reg4(lambda, Lsqr, X, y, wts, 1.0e-8, w, "Lsqr weighted"); test_reg4(lambda, L1, X, y, wts, 1.0e-6, w, "L1 weighted"); test_reg4(lambda, L2, X, y, wts, 1.0e-6, w, "L2 weighted"); test_reg4(lambda, L3, X, y, wts, 1.0e-5, w, "L3 weighted"); test_reg4(lambda, L5, X, y, wts, 1.0e-4, w, "L5 weighted"); /* test again with larger workspace */ test_reg2(lambda, X, y, NULL, 1.0e-6, wbig, "unweighted big"); test_reg3(lambda, diagL, X, y, NULL, 1.0e-6, wbig, "unweighted big"); test_reg4(lambda, Lsqr, X, y, NULL, 1.0e-8, wbig, "Lsqr unweighted big"); test_reg4(lambda, L1, X, y, NULL, 1.0e-6, wbig, "L1 unweighted big"); test_reg4(lambda, L2, X, y, NULL, 1.0e-6, wbig, "L2 unweighted big"); test_reg4(lambda, L3, X, y, NULL, 1.0e-5, wbig, "L3 unweighted big"); test_reg4(lambda, L5, X, y, NULL, 1.0e-4, wbig, "L5 unweighted big"); test_reg2(lambda, X, y, wts, 1.0e-6, wbig, "weighted big"); test_reg3(lambda, diagL, X, y, wts, 1.0e-6, wbig, "weighted big"); test_reg4(lambda, Lsqr, X, y, wts, 1.0e-8, wbig, "Lsqr weighted big"); test_reg4(lambda, L1, X, y, wts, 1.0e-6, wbig, "L1 weighted big"); test_reg4(lambda, L2, X, y, wts, 1.0e-6, wbig, "L2 weighted big"); test_reg4(lambda, L3, X, y, wts, 1.0e-5, wbig, "L3 weighted big"); test_reg4(lambda, L5, X, y, wts, 1.0e-4, wbig, "L5 weighted big"); } gsl_matrix_free(X); gsl_vector_free(y); gsl_vector_free(c); gsl_vector_free(wts); gsl_vector_free(diagL); gsl_matrix_free(Lsqr); gsl_matrix_free(Ltall); gsl_matrix_free(L1); gsl_matrix_free(L2); gsl_matrix_free(L3); gsl_matrix_free(L5); gsl_multifit_linear_free(w); gsl_multifit_linear_free(wbig); } static void test_reg_sobolev(const size_t p, const size_t kmax, const gsl_rng *r) { const double tol = 1.0e-12; size_t i, j, k; gsl_matrix *L = gsl_matrix_calloc(p, p); gsl_matrix *LTL = gsl_matrix_alloc(p, p); /* Sobolov L^T L */ gsl_matrix *LTL2 = gsl_matrix_alloc(p, p); /* alternate L^T L */ gsl_matrix *Li = gsl_matrix_alloc(p, p); gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(p, p); for (k = 0; k <= kmax; ++k) { gsl_vector *alpha = gsl_vector_alloc(k + 1); /* random weights */ test_random_vector(alpha, r, 0.0, 1.0); /* compute Sobolev matrix */ gsl_multifit_linear_Lsobolev(p, k, alpha, L, w); /* compute LTL = L^T L */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, L, L, 0.0, LTL); /* now compute LTL2 = L^T L using individual L_i factors */ { gsl_matrix_set_zero(LTL2); for (i = 0; i <= k; ++i) { gsl_matrix_view Liv = gsl_matrix_submatrix(Li, 0, 0, p - i, p); double ai = gsl_vector_get(alpha, i); /* compute a_i L_i */ gsl_multifit_linear_Lk(p, i, &Liv.matrix); gsl_matrix_scale(&Liv.matrix, ai); /* LTL += L_i^T L_i */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &Liv.matrix, &Liv.matrix, 1.0, LTL2); } } /* test LTL = LTL2 */ for (i = 0; i < p; ++i) { for (j = 0; j < p; ++j) { double aij = gsl_matrix_get(LTL, i, j); double bij = gsl_matrix_get(LTL2, i, j); gsl_test_rel(aij, bij, tol, "sobolov k=%zu LTL(%zu,%zu)", k, i, j); } } gsl_vector_free(alpha); } gsl_matrix_free(L); gsl_matrix_free(Li); gsl_matrix_free(LTL); gsl_matrix_free(LTL2); gsl_multifit_linear_free(w); } /* test linear regularized regression */ static void test_reg(void) { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); test_reg_system(100, 15, r); test_reg_system(100, 50, r); test_reg_system(100, 99, r); test_reg_sobolev(20, 10, r); gsl_rng_free(r); } gsl-doc-2.3/multifit/test_box.c0000664000175000017500000000342012616157443014622 0ustar eddedd#define box_N 10 /* can be >= p */ #define box_P 3 #define box_NTRIES 1 static double box_x0[box_P] = { 0.0, 10.0, 20.0 }; static double box_epsrel = 1.0e-12; static void box_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double box_x[box_P] = { 1.0, 10.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < box_P; ++i) { gsl_test_rel(x[i], box_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int box_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double fi = exp(-x1*ti) - exp(-x2*ti) - x3*(exp(-ti) - exp(-10.0*ti)); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int box_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double term1 = exp(-x1*ti); double term2 = exp(-x2*ti); double term3 = exp(-10.0*ti) - exp(-ti); gsl_matrix_set(J, i, 0, -ti*term1); gsl_matrix_set(J, i, 1, ti*term2); gsl_matrix_set(J, i, 2, term3); } return GSL_SUCCESS; } static gsl_multifit_function_fdf box_func = { &box_f, &box_df, NULL, box_N, box_P, NULL, 0, 0 }; static test_fdf_problem box_problem = { "box3d", box_x0, NULL, &box_epsrel, box_NTRIES, &box_checksol, &box_func }; gsl-doc-2.3/multifit/test_linear.c0000664000175000017500000000373312616157443015313 0ustar eddedd/* multifit/test_linear.c * * Copyright (C) 2007, 2013 Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 test_random_vector(gsl_vector *v, const gsl_rng *r, const double lower, const double upper) { size_t i; size_t N = v->size; for (i = 0; i < N; ++i) { gsl_vector_set(v, i, gsl_rng_uniform(r) * (upper - lower) + lower); } } static void test_random_matrix(gsl_matrix *m, const gsl_rng *r, const double lower, const double upper) { size_t i, j; size_t M = m->size1; size_t N = m->size2; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { gsl_matrix_set(m, i, j, gsl_rng_uniform(r) * (upper - lower) + lower); } } } static void test_random_vector_noise(const gsl_rng *r, gsl_vector *y) { size_t i; for (i = 0; i < y->size; ++i) { double *ptr = gsl_vector_ptr(y, i); *ptr += 1.0e-3 * gsl_rng_uniform(r); } } #include "test_longley.c" #include "test_filip.c" #include "test_pontius.c" #include "test_estimator.c" #include "test_reg.c" #include "test_shaw.c" /* test linear regression */ void test_linear(void) { test_longley(); test_filip(); test_pontius(); test_estimator(); test_reg(); test_shaw(); } gsl-doc-2.3/multifit/test_lin2.c0000664000175000017500000000323312616157443014700 0ustar eddedd#define lin2_N 20 /* can be anything >= p */ #define lin2_P 5 #define lin2_NTRIES 3 static double lin2_x0[lin2_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin2_epsrel = 1.0e-11; static void lin2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin2_N; const double sumsq_exact = 0.5 * (n*(n - 1.0)) / (2.0*n + 1.0); const double sum_exact = 3.0 / (2.0*n + 1.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin2_P; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); } static int lin2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin2_N; ++i) { double fi = 0.0; for (j = 0; j < lin2_P; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = (i + 1) * fi - 1.0; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int lin2_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (i = 0; i < lin2_N; ++i) { for (j = 0; j < lin2_P; ++j) { gsl_matrix_set(J, i, j, (i + 1.0) * (j + 1.0)); } } return GSL_SUCCESS; } static gsl_multifit_function_fdf lin2_func = { &lin2_f, &lin2_df, NULL, lin2_N, lin2_P, NULL, 0, 0 }; static test_fdf_problem lin2_problem = { "linear_rank1", lin2_x0, NULL, &lin2_epsrel, lin2_NTRIES, &lin2_checksol, &lin2_func }; gsl-doc-2.3/multifit/gsl_multifit.h0000644000175000017500000003432513014632444015500 0ustar eddedd/* multifit/gsl_multifit.h * * Copyright (C) 2000, 2007, 2010 Brian Gough * Copyright (C) 2013, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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 nmax; /* maximum number of observations */ size_t pmax; /* maximum number of parameters */ size_t n; /* number of observations in current SVD decomposition */ size_t p; /* number of parameters in current SVD decomposition */ gsl_matrix * A; /* least squares matrix for SVD, n-by-p */ gsl_matrix * Q; gsl_matrix * QSI; gsl_vector * S; gsl_vector * t; gsl_vector * xt; gsl_vector * D; double rcond; /* reciprocal condition number */ } gsl_multifit_linear_workspace; gsl_multifit_linear_workspace * gsl_multifit_linear_alloc (const size_t n, const size_t p); void gsl_multifit_linear_free (gsl_multifit_linear_workspace * w); 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_tsvd (const gsl_matrix * X, const gsl_vector * y, const double tol, gsl_vector * c, gsl_matrix * cov, double * chisq, size_t * rank, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_svd (const gsl_matrix * X, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_bsvd (const gsl_matrix * X, gsl_multifit_linear_workspace * work); size_t gsl_multifit_linear_rank(const double tol, const gsl_multifit_linear_workspace * work); int gsl_multifit_linear_solve (const double lambda, const gsl_matrix * X, const gsl_vector * y, gsl_vector * c, double *rnorm, double *snorm, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_applyW(const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * WX, gsl_vector * Wy); int gsl_multifit_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_L_decomp (gsl_matrix * L, gsl_vector * tau); int gsl_multifit_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_matrix * M, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_matrix * M, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_genform1 (const gsl_vector * L, const gsl_vector * cs, gsl_vector * c, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * cs, const gsl_matrix * M, gsl_vector * c, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_wgenform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, const gsl_vector * cs, const gsl_matrix * M, gsl_vector * c, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_lreg (const double smin, const double smax, gsl_vector * reg_param); int gsl_multifit_linear_lcurve (const gsl_vector * y, gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_lcorner(const gsl_vector *rho, const gsl_vector *eta, size_t *idx); int gsl_multifit_linear_lcorner2(const gsl_vector *reg_param, const gsl_vector *eta, size_t *idx); int gsl_multifit_linear_Lk(const size_t p, const size_t k, gsl_matrix *L); int gsl_multifit_linear_Lsobolev(const size_t p, const size_t kmax, const gsl_vector *alpha, gsl_matrix *L, 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_tsvd (const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, const double tol, gsl_vector * c, gsl_matrix * cov, double * chisq, size_t * rank, 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_wlinear_usvd (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); double gsl_multifit_linear_rcond (const gsl_multifit_linear_workspace * w); int gsl_multifit_linear_residuals (const gsl_matrix *X, const gsl_vector *y, const gsl_vector *c, gsl_vector *r); /* gcv.c */ int gsl_multifit_linear_gcv_init(const gsl_vector * y, gsl_vector * reg_param, gsl_vector * UTy, double * delta0, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_gcv_curve(const gsl_vector * reg_param, const gsl_vector * UTy, const double delta0, gsl_vector * G, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_gcv_min(const gsl_vector * reg_param, const gsl_vector * UTy, const gsl_vector * G, const double delta0, double * lambda, gsl_multifit_linear_workspace * work); double gsl_multifit_linear_gcv_calc(const double lambda, const gsl_vector * UTy, const double delta0, gsl_multifit_linear_workspace * work); int gsl_multifit_linear_gcv(const gsl_vector * y, gsl_vector * reg_param, gsl_vector * G, double * lambda, double * G_lambda, gsl_multifit_linear_workspace * work); typedef struct { const char * name; /* method name */ int (*wfun)(const gsl_vector *r, gsl_vector *w); int (*psi_deriv)(const gsl_vector *r, gsl_vector *dpsi); double tuning_default; /* default tuning constant */ } gsl_multifit_robust_type; typedef struct { double sigma_ols; /* OLS estimate of sigma */ double sigma_mad; /* MAD estimate of sigma */ double sigma_rob; /* robust estimate of sigma */ double sigma; /* final estimate of sigma */ double Rsq; /* R^2 coefficient of determination */ double adj_Rsq; /* degree of freedom adjusted R^2 */ double rmse; /* root mean squared error */ double sse; /* residual sum of squares */ size_t dof; /* degrees of freedom */ size_t numit; /* number of iterations */ gsl_vector *weights; /* final weights */ gsl_vector *r; /* final residuals y - X c */ } gsl_multifit_robust_stats; typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ size_t numit; /* number of iterations */ size_t maxiter; /* maximum iterations */ const gsl_multifit_robust_type *type; double tune; /* tuning parameter */ gsl_vector *r; /* residuals at current iteration */ gsl_vector *weights; /* weights at current iteration */ gsl_vector *c_prev; /* coefficients from previous iteration */ gsl_vector *resfac; /* multiplicative factors for residuals */ gsl_vector *psi; /* psi(r) */ gsl_vector *dpsi; /* psi'(r) */ gsl_matrix *QSI; /* Q S^{-1} of original matrix X */ gsl_vector *D; /* balancing parameters of original matrix X */ gsl_vector *workn; /* workspace of length n */ gsl_multifit_robust_stats stats; /* various statistics */ gsl_multifit_linear_workspace *multifit_p; } gsl_multifit_robust_workspace; /* available types */ GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_default; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_bisquare; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_cauchy; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_fair; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_huber; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_ols; GSL_VAR const gsl_multifit_robust_type * gsl_multifit_robust_welsch; gsl_multifit_robust_workspace *gsl_multifit_robust_alloc(const gsl_multifit_robust_type *T, const size_t n, const size_t p); void gsl_multifit_robust_free(gsl_multifit_robust_workspace *w); int gsl_multifit_robust_tune(const double tune, gsl_multifit_robust_workspace *w); int gsl_multifit_robust_maxiter(const size_t maxiter, gsl_multifit_robust_workspace *w); const char *gsl_multifit_robust_name(const gsl_multifit_robust_workspace *w); gsl_multifit_robust_stats gsl_multifit_robust_statistics(const gsl_multifit_robust_workspace *w); int gsl_multifit_robust_weights(const gsl_vector *r, gsl_vector *wts, gsl_multifit_robust_workspace *w); int gsl_multifit_robust(const gsl_matrix * X, const gsl_vector * y, gsl_vector * c, gsl_matrix *cov, gsl_multifit_robust_workspace *w); int gsl_multifit_robust_est(const gsl_vector * x, const gsl_vector * c, const gsl_matrix * cov, double *y, double *y_err); int gsl_multifit_robust_residuals(const gsl_matrix * X, const gsl_vector * y, const gsl_vector * c, gsl_vector * r, gsl_multifit_robust_workspace * w); __END_DECLS #endif /* __GSL_MULTIFIT_H__ */ gsl-doc-2.3/multifit/test_beale.c0000664000175000017500000000326212616157443015106 0ustar eddedd#define beale_N 3 #define beale_P 2 #define beale_NTRIES 1 static double beale_x0[beale_P] = { 1.0, 1.0 }; static double beale_epsrel = 1.0e-12; static double beale_Y[beale_N] = { 1.5, 2.25, 2.625 }; static void beale_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double beale_x[beale_P] = { 3.0, 0.5 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < beale_P; ++i) { gsl_test_rel(x[i], beale_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int beale_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double yi = beale_Y[i]; double term = pow(x2, i + 1.0); double fi = yi - x1*(1.0 - term); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int beale_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double term = pow(x2, (double) i); gsl_matrix_set(J, i, 0, term*x2 - 1.0); gsl_matrix_set(J, i, 1, (i + 1.0) * x1 * term); } return GSL_SUCCESS; } static gsl_multifit_function_fdf beale_func = { &beale_f, &beale_df, NULL, beale_N, beale_P, NULL, 0, 0 }; static test_fdf_problem beale_problem = { "beale", beale_x0, NULL, &beale_epsrel, beale_NTRIES, &beale_checksol, &beale_func }; gsl-doc-2.3/multifit/lmmisc.c0000664000175000017500000000553012616177143014262 0ustar eddedd/* multifit/lmmisc.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* compute step dx by solving (J^T J + mu*I) dx = -J^T f */ static int lmniel_calc_dx(const double mu, const gsl_matrix *A, const gsl_vector *rhs, gsl_vector *dx, lmniel_state_t *state) { int status; gsl_matrix *A_copy = state->A_copy; gsl_vector_view diag = gsl_matrix_diagonal(A_copy); /* make a copy of J^T J matrix */ gsl_matrix_memcpy(A_copy, A); /* augment normal equations with LM parameter: A -> A + mu*I */ gsl_vector_add_constant(&diag.vector, mu); status = gsl_linalg_QR_decomp(A_copy, state->work); if (status) return status; status = gsl_linalg_QR_solve(A_copy, state->work, rhs, dx); if (status) return status; return GSL_SUCCESS; } /* lmniel_calc_dx() */ /* compute x_trial = x + dx */ static void lmniel_trial_step(const gsl_vector * x, const gsl_vector * dx, gsl_vector * x_trial) { size_t i, N = x->size; for (i = 0; i < N; i++) { double dxi = gsl_vector_get (dx, i); double xi = gsl_vector_get (x, i); gsl_vector_set (x_trial, i, xi + dxi); } } /* lmniel_trial_step() */ /* lmniel_calc_dF() Compute dF = F(x) - F(x + dx) = 1/2 (f - f_new)^T (f + f_new) */ static double lmniel_calc_dF(const gsl_vector *f, const gsl_vector *f_new) { const size_t N = f->size; size_t i; double dF = 0.0; for (i = 0; i < N; ++i) { double fi = gsl_vector_get(f, i); double fnewi = gsl_vector_get(f_new, i); dF += (fi - fnewi) * (fi + fnewi); } dF *= 0.5; return dF; } /* lmniel_calc_dF() */ /* lmniel_calc_dL() Compute dL = L(0) - L(dx) = 1/2 dx^T (mu * D^T D dx - g) Here, the mg input is -g */ static double lmniel_calc_dL(const double mu, const gsl_vector *diag, const gsl_vector *dx, const gsl_vector *mg) { const size_t p = dx->size; size_t i; double dL = 0.0; for (i = 0; i < p; ++i) { double dxi = gsl_vector_get(dx, i); double di = gsl_vector_get(diag, i); double mgi = gsl_vector_get(mg, i); /* -g_i */ dL += dxi * (mu * di * di * dxi + mgi); } dL *= 0.5; return dL; } /* lmniel_calc_dL() */ gsl-doc-2.3/multifit/test_lin3.c0000664000175000017500000000345712616157443014711 0ustar eddedd#define lin3_N 50 /* can be anything >= p */ #define lin3_P 10 /* >= 3 */ #define lin3_NTRIES 3 static double lin3_x0[lin3_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin3_epsrel = 1.0e-10; static void lin3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin3_N; const double sumsq_exact = 0.5 * (n*n + 3*n - 6.0) / (2*n - 3.0); const double sum_exact = 3.0 / (2.0*n - 3.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < lin3_P - 1; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); } static int lin3_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; gsl_vector_set(f, 0, -1.0); gsl_vector_set(f, lin3_N - 1, -1.0); for (i = 1; i < lin3_N - 1; ++i) { double fi = 0.0; for (j = 1; j < lin3_P - 1; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = i * fi - 1.0; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int lin3_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; gsl_matrix_set_zero(J); for (i = 1; i < lin3_N - 1; ++i) { for (j = 1; j < lin3_P - 1; ++j) { gsl_matrix_set(J, i, j, i * (j + 1.0)); } } return GSL_SUCCESS; } static gsl_multifit_function_fdf lin3_func = { &lin3_f, &lin3_df, NULL, lin3_N, lin3_P, NULL, 0, 0 }; static test_fdf_problem lin3_problem = { "linear_rank1zeros", lin3_x0, NULL, &lin3_epsrel, lin3_NTRIES, &lin3_checksol, &lin3_func }; gsl-doc-2.3/multifit/gsl_multifit_nlin.h0000664000175000017500000002613512616157443016532 0ustar eddedd/* multifit_nlin/gsl_multifit_nlin.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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, const double epsrel, gsl_matrix * covar); int gsl_multifit_covar_QRPT (gsl_matrix * r, gsl_permutation * perm, const 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); int gsl_multifit_fsolver_driver (gsl_multifit_fsolver * s, const size_t maxiter, const double epsabs, const double epsrel); 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; /* user parameters */ size_t nevalf; /* number of function evaluations */ size_t nevaldf; /* number of Jacobian evaluations */ }; typedef struct gsl_multifit_function_fdf_struct gsl_multifit_function_fdf ; typedef struct { const char *name; size_t size; int (*alloc) (void *state, size_t n, size_t p); int (*set) (void *state, const gsl_vector * wts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx); int (*iterate) (void *state, const gsl_vector * wts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx); int (*gradient) (void *state, gsl_vector * g); int (*jac) (void *state, gsl_matrix * J); void (*free) (void *state); } gsl_multifit_fdfsolver_type; typedef struct { const gsl_multifit_fdfsolver_type * type; gsl_multifit_function_fdf * fdf ; gsl_vector * x; /* parameter values x */ gsl_vector * f; /* residual vector f(x) */ gsl_vector * dx; /* step dx */ gsl_vector * g; /* gradient J^T f */ gsl_vector * sqrt_wts; /* sqrt(wts) */ size_t niter; /* number of iterations performed */ 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_wset (gsl_multifit_fdfsolver * s, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * wts); int gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver * s); int gsl_multifit_fdfsolver_driver (gsl_multifit_fdfsolver * s, const size_t maxiter, const double xtol, const double gtol, const double ftol, int *info); int gsl_multifit_fdfsolver_jac (gsl_multifit_fdfsolver * s, gsl_matrix * J); 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); gsl_vector * gsl_multifit_fdfsolver_residual (const gsl_multifit_fdfsolver * s); size_t gsl_multifit_fdfsolver_niter (const gsl_multifit_fdfsolver * s); int gsl_multifit_eval_wf(gsl_multifit_function_fdf *fdf, const gsl_vector *x, const gsl_vector *wts, gsl_vector *y); int gsl_multifit_eval_wdf(gsl_multifit_function_fdf *fdf, const gsl_vector *x, const gsl_vector *wts, gsl_matrix *dy); int gsl_multifit_fdfsolver_test (const gsl_multifit_fdfsolver * s, const double xtol, const double gtol, const double ftol, int *info); 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); int gsl_multifit_fdfsolver_dif_df(const gsl_vector *x, const gsl_vector *wts, gsl_multifit_function_fdf *fdf, const gsl_vector *f, gsl_matrix *J); int gsl_multifit_fdfsolver_dif_fdf(const gsl_vector *x, gsl_multifit_function_fdf *fdf, gsl_vector *f, gsl_matrix *J); typedef struct { size_t n; /* number of (original) residuals */ size_t p; /* number of model parameters */ double lambda; /* damping parameter */ const gsl_vector *L_diag; /* diagonal damping matrix or NULL */ const gsl_matrix *L; /* general damping matrix or NULL */ gsl_vector *f; /* function values for finite diff J */ gsl_vector *wts; /* weight vector for augmented system */ gsl_multifit_fdfsolver * s; gsl_multifit_function_fdf *fdf; /* user defined fdf */ gsl_multifit_function_fdf fdftik; /* Tikhonov modified fdf */ } gsl_multifit_fdfridge; gsl_multifit_fdfridge * gsl_multifit_fdfridge_alloc (const gsl_multifit_fdfsolver_type * T, const size_t n, const size_t p); void gsl_multifit_fdfridge_free(gsl_multifit_fdfridge *work); const char *gsl_multifit_fdfridge_name(const gsl_multifit_fdfridge * w); gsl_vector *gsl_multifit_fdfridge_position (const gsl_multifit_fdfridge * w); gsl_vector *gsl_multifit_fdfridge_residual (const gsl_multifit_fdfridge * w); size_t gsl_multifit_fdfridge_niter (const gsl_multifit_fdfridge * w); int gsl_multifit_fdfridge_set (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const double lambda); int gsl_multifit_fdfridge_wset (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const double lambda, const gsl_vector * wts); int gsl_multifit_fdfridge_set2 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * lambda); int gsl_multifit_fdfridge_wset2 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * lambda, const gsl_vector * wts); int gsl_multifit_fdfridge_set3 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_matrix * L); int gsl_multifit_fdfridge_wset3 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_matrix * L, const gsl_vector * wts); int gsl_multifit_fdfridge_iterate (gsl_multifit_fdfridge * w); int gsl_multifit_fdfridge_driver (gsl_multifit_fdfridge * w, const size_t maxiter, const double xtol, const double gtol, const double ftol, int *info); /* extern const gsl_multifit_fsolver_type * gsl_multifit_fsolver_gradient; */ GSL_VAR const gsl_multifit_fdfsolver_type * gsl_multifit_fdfsolver_lmsder; GSL_VAR const gsl_multifit_fdfsolver_type * gsl_multifit_fdfsolver_lmder; GSL_VAR const gsl_multifit_fdfsolver_type * gsl_multifit_fdfsolver_lmniel; __END_DECLS #endif /* __GSL_MULTIFIT_NLIN_H__ */ gsl-doc-2.3/multifit/linear_common.c0000664000175000017500000001362013013642650015607 0ustar eddedd#include #include #include #include #include #include #include #include /* Fit * * y = X c * * where X is an n x p matrix of n observations for p variables. * * The solution includes a possible standard form Tikhonov regularization: * * c = (X^T X + lambda^2 I)^{-1} X^T y * * where lambda^2 is the Tikhonov regularization parameter. * * The function multifit_linear_svd() must first be called to * compute the SVD decomposition of X * * Inputs: X - least squares matrix * y - right hand side vector * tol - singular value tolerance * lambda - Tikhonov regularization parameter lambda; * ignored if <= 0 * rank - (output) effective rank * c - (output) model coefficient vector * rnorm - (output) residual norm ||y - X c|| * snorm - (output) solution norm ||c|| * work - workspace * * Notes: * 1) The dimensions of X must match work->n and work->p which are set * by multifit_linear_svd() * 2) On input: * work->A contains U * work->Q contains Q * work->S contains singular values * 3) If this function is called from gsl_multifit_wlinear(), then * the input y points to work->t, which contains sqrt(W) y. Since * work->t is also used as scratch workspace by this function, we * do the necessary computations with y first to avoid problems. * 4) When lambda <= 0, singular values are truncated when: * s_j <= tol * s_0 */ static int multifit_linear_solve (const gsl_matrix * X, const gsl_vector * y, const double tol, const double lambda, size_t * rank, gsl_vector * c, double *rnorm, double *snorm, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (n != work->n || p != work->p) { GSL_ERROR("observation matrix does not match workspace", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("number of observations in y does not match matrix", GSL_EBADLEN); } else if (p != c->size) { GSL_ERROR ("number of parameters c does not match matrix", GSL_EBADLEN); } else if (tol <= 0) { GSL_ERROR ("tolerance must be positive", GSL_EINVAL); } else { const double lambda_sq = lambda * lambda; double rho_ls = 0.0; /* contribution to rnorm from OLS */ size_t j, p_eff; /* these inputs are previously computed by multifit_linear_svd() */ gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_matrix_view Q = gsl_matrix_submatrix(work->Q, 0, 0, p, p); gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); /* workspace */ gsl_matrix_view QSI = gsl_matrix_submatrix(work->QSI, 0, 0, p, p); gsl_vector_view xt = gsl_vector_subvector(work->xt, 0, p); gsl_vector_view D = gsl_vector_subvector(work->D, 0, p); gsl_vector_view t = gsl_vector_subvector(work->t, 0, n); /* * Solve y = A c for c * c = Q diag(s_i / (s_i^2 + lambda_i^2)) U^T y */ /* compute xt = U^T y */ gsl_blas_dgemv (CblasTrans, 1.0, &A.matrix, y, 0.0, &xt.vector); if (n > p) { /* * compute OLS residual norm = || y - U U^T y ||; * for n = p, U U^T = I, so no need to calculate norm */ gsl_vector_memcpy(&t.vector, y); gsl_blas_dgemv(CblasNoTrans, -1.0, &A.matrix, &xt.vector, 1.0, &t.vector); rho_ls = gsl_blas_dnrm2(&t.vector); } if (lambda > 0.0) { /* xt <-- [ s(i) / (s(i)^2 + lambda^2) ] .* U^T y */ for (j = 0; j < p; ++j) { double sj = gsl_vector_get(&S.vector, j); double f = (sj * sj) / (sj * sj + lambda_sq); double *ptr = gsl_vector_ptr(&xt.vector, j); /* use D as workspace for residual norm */ gsl_vector_set(&D.vector, j, (1.0 - f) * (*ptr)); *ptr *= sj / (sj*sj + lambda_sq); } /* compute regularized solution vector */ gsl_blas_dgemv (CblasNoTrans, 1.0, &Q.matrix, &xt.vector, 0.0, c); /* compute solution norm */ *snorm = gsl_blas_dnrm2(c); /* compute residual norm */ *rnorm = gsl_blas_dnrm2(&D.vector); if (n > p) { /* add correction to residual norm (see eqs 6-7 of [1]) */ *rnorm = sqrt((*rnorm) * (*rnorm) + rho_ls * rho_ls); } /* reset D vector */ gsl_vector_set_all(&D.vector, 1.0); } else { /* Scale the matrix Q, QSI = Q S^{-1} */ gsl_matrix_memcpy (&QSI.matrix, &Q.matrix); { double s0 = gsl_vector_get (&S.vector, 0); p_eff = 0; for (j = 0; j < p; j++) { gsl_vector_view column = gsl_matrix_column (&QSI.matrix, j); double sj = gsl_vector_get (&S.vector, j); double alpha; if (sj <= tol * s0) { alpha = 0.0; } else { alpha = 1.0 / sj; p_eff++; } gsl_vector_scale (&column.vector, alpha); } *rank = p_eff; } gsl_blas_dgemv (CblasNoTrans, 1.0, &QSI.matrix, &xt.vector, 0.0, c); /* Unscale the balancing factors */ gsl_vector_div (c, &D.vector); *snorm = gsl_blas_dnrm2(c); *rnorm = rho_ls; } return GSL_SUCCESS; } } gsl-doc-2.3/multifit/test_helical.c0000664000175000017500000000374212616157443015442 0ustar eddedd#define helical_N 3 #define helical_P 3 #define helical_NTRIES 4 static double helical_x0[helical_P] = { -1.0, 0.0, 0.0 }; static double helical_x[helical_P] = { 1.0, 0.0, 0.0 }; static double helical_epsrel = 1.0e-12; static void helical_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < helical_P; ++i) { gsl_test_rel(x[i], helical_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int helical_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double theta = (x1 >= 0.0) ? 0.0 : 5.0; double nx = gsl_hypot(x1, x2); gsl_vector_set(f, 0, 10.0 * (x3 - 5.0/M_PI*atan(x2 / x1) - theta)); gsl_vector_set(f, 1, 10.0*(nx - 1.0)); gsl_vector_set(f, 2, x3); return GSL_SUCCESS; } static int helical_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double nx = gsl_hypot(x1, x2); double nx_sq = nx * nx; double term1 = 50.0 / (M_PI * nx_sq); double term2 = 10.0 / nx; gsl_matrix_set(J, 0, 0, term1*x2); gsl_matrix_set(J, 0, 1, -term1*x1); gsl_matrix_set(J, 0, 2, 10.0); gsl_matrix_set(J, 1, 0, term2*x1); gsl_matrix_set(J, 1, 1, term2*x2); gsl_matrix_set(J, 1, 2, 0.0); gsl_matrix_set(J, 2, 0, 0.0); gsl_matrix_set(J, 2, 1, 0.0); gsl_matrix_set(J, 2, 2, 1.0); return GSL_SUCCESS; } static gsl_multifit_function_fdf helical_func = { &helical_f, &helical_df, NULL, helical_N, helical_P, NULL, 0, 0 }; static test_fdf_problem helical_problem = { "helical", helical_x0, NULL, &helical_epsrel, helical_NTRIES, &helical_checksol, &helical_func }; gsl-doc-2.3/multifit/test_eckerle.c0000664000175000017500000000624312616157443015452 0ustar eddedd#define eckerle_N 35 #define eckerle_P 3 #define eckerle_NTRIES 1 static double eckerle_x0[eckerle_P] = { 1.0, 10.0, 500.0 }; static double eckerle_epsrel = 1.0e-7; static double eckerle_sigma[eckerle_P] = { 1.5408051163E-02, 4.6803020753E-02, 4.6800518816E-02 }; static double eckerle_X[eckerle_N] = { 400.000000, 405.000000, 410.000000, 415.000000, 420.000000, 425.000000, 430.000000, 435.000000, 436.500000, 438.000000, 439.500000, 441.000000, 442.500000, 444.000000, 445.500000, 447.000000, 448.500000, 450.000000, 451.500000, 453.000000, 454.500000, 456.000000, 457.500000, 459.000000, 460.500000, 462.000000, 463.500000, 465.000000, 470.000000, 475.000000, 480.000000, 485.000000, 490.000000, 495.000000, 500.000000 }; static double eckerle_F[eckerle_N] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 }; static void eckerle_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.4635887487E-03; const double eckerle_x[eckerle_P] = { 1.5543827178E+00, 4.0888321754E+00, 4.5154121844E+02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < eckerle_P; ++i) { gsl_test_rel(x[i], eckerle_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int eckerle_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term = xi - b[2]; double yi; yi = b[0] / b[1] * exp(-0.5 * term * term / b[1] / b[1]); gsl_vector_set (f, i, yi - eckerle_F[i]); } return GSL_SUCCESS; } static int eckerle_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term1 = xi - b[2]; double term2 = exp(-0.5 * term1 * term1 / (b[1] * b[1])); gsl_matrix_set (df, i, 0, term2 / b[1]); gsl_matrix_set (df, i, 1, -b[0] * term2 / (b[1] * b[1]) + b[0] / pow(b[1], 4.0) * term2 * term1 * term1); gsl_matrix_set (df, i, 2, b[0] / pow(b[1], 3.0) * term1 * term2); } return GSL_SUCCESS; } static gsl_multifit_function_fdf eckerle_func = { &eckerle_f, &eckerle_df, NULL, eckerle_N, eckerle_P, NULL, 0, 0 }; static test_fdf_problem eckerle_problem = { "nist-eckerle", eckerle_x0, eckerle_sigma, &eckerle_epsrel, eckerle_NTRIES, &eckerle_checksol, &eckerle_func }; gsl-doc-2.3/multifit/covar.c0000664000175000017500000001140712616157443014111 0ustar eddedd/* multifit/covar.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* Compute the covariance matrix cov = inv (J^T J) by QRP^T decomposition of J */ int gsl_multifit_covar (const gsl_matrix * J, const double epsrel, gsl_matrix * covar) { int status; gsl_matrix * r; gsl_vector * tau; gsl_vector * norm; gsl_permutation * perm; const size_t m = J->size1; const size_t 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); } status = gsl_multifit_covar_QRPT(r, perm, epsrel, covar); gsl_matrix_free (r); gsl_permutation_free (perm); gsl_vector_free (tau); gsl_vector_free (norm); return status; } int gsl_multifit_covar_QRPT (gsl_matrix * r, gsl_permutation * perm, const double epsrel, gsl_matrix * covar) { /* Form the inverse of R in the full upper triangle of R */ double tolr = epsrel * fabs(gsl_matrix_get(r, 0, 0)); const size_t n = r->size2; size_t i, j, k; size_t kmax = 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); } } return GSL_SUCCESS; } /* gsl_multifit_covar_QRPT() */ gsl-doc-2.3/multifit/multirobust.c0000644000175000017500000004773012755623667015410 0ustar eddedd/* multirobust.c * * Copyright (C) 2013 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module contains routines related to robust linear least squares. The * algorithm used closely follows the publications: * * [1] DuMouchel, W. and F. O'Brien (1989), "Integrating a robust * option into a multiple regression computing environment," * Computer Science and Statistics: Proceedings of the 21st * Symposium on the Interface, American Statistical Association * * [2] Street, J.O., R.J. Carroll, and D. Ruppert (1988), "A note on * computing robust regression estimates via iteratively * reweighted least squares," The American Statistician, v. 42, * pp. 152-154. */ #include #include #include #include #include #include #include #include #include #include static int robust_test_convergence(const gsl_vector *c_prev, const gsl_vector *c, const double tol); static double robust_madsigma(const gsl_vector *r, const size_t p, gsl_vector *workn); static double robust_robsigma(const gsl_vector *r, const double s, const double tune, gsl_multifit_robust_workspace *w); static double robust_sigma(const double s_ols, const double s_rob, gsl_multifit_robust_workspace *w); static int robust_covariance(const double sigma, gsl_matrix *cov, gsl_multifit_robust_workspace *w); /* gsl_multifit_robust_alloc Allocate a robust workspace Inputs: T - robust weighting algorithm n - number of observations p - number of model parameters Return: pointer to workspace */ gsl_multifit_robust_workspace * gsl_multifit_robust_alloc(const gsl_multifit_robust_type *T, const size_t n, const size_t p) { gsl_multifit_robust_workspace *w; if (n < p) { GSL_ERROR_VAL("observations n must be >= p", GSL_EINVAL, 0); } w = calloc(1, sizeof(gsl_multifit_robust_workspace)); if (w == 0) { GSL_ERROR_VAL("failed to allocate space for multifit_robust struct", GSL_ENOMEM, 0); } w->n = n; w->p = p; w->type = T; w->maxiter = 100; /* maximum iterations */ w->tune = w->type->tuning_default; w->multifit_p = gsl_multifit_linear_alloc(n, p); if (w->multifit_p == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for multifit_linear struct", GSL_ENOMEM, 0); } w->r = gsl_vector_alloc(n); if (w->r == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for residuals", GSL_ENOMEM, 0); } w->weights = gsl_vector_alloc(n); if (w->weights == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for weights", GSL_ENOMEM, 0); } w->c_prev = gsl_vector_alloc(p); if (w->c_prev == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for c_prev", GSL_ENOMEM, 0); } w->resfac = gsl_vector_alloc(n); if (w->resfac == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for residual factors", GSL_ENOMEM, 0); } w->psi = gsl_vector_alloc(n); if (w->psi == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for psi", GSL_ENOMEM, 0); } w->dpsi = gsl_vector_alloc(n); if (w->dpsi == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for dpsi", GSL_ENOMEM, 0); } w->QSI = gsl_matrix_alloc(p, p); if (w->QSI == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for QSI", GSL_ENOMEM, 0); } w->D = gsl_vector_alloc(p); if (w->D == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for D", GSL_ENOMEM, 0); } w->workn = gsl_vector_alloc(n); if (w->workn == 0) { gsl_multifit_robust_free(w); GSL_ERROR_VAL("failed to allocate space for workn", GSL_ENOMEM, 0); } w->stats.sigma_ols = 0.0; w->stats.sigma_mad = 0.0; w->stats.sigma_rob = 0.0; w->stats.sigma = 0.0; w->stats.Rsq = 0.0; w->stats.adj_Rsq = 0.0; w->stats.rmse = 0.0; w->stats.sse = 0.0; w->stats.dof = n - p; w->stats.weights = w->weights; w->stats.r = w->r; return w; } /* gsl_multifit_robust_alloc() */ /* gsl_multifit_robust_free() Free memory associated with robust workspace */ void gsl_multifit_robust_free(gsl_multifit_robust_workspace *w) { if (w->multifit_p) gsl_multifit_linear_free(w->multifit_p); if (w->r) gsl_vector_free(w->r); if (w->weights) gsl_vector_free(w->weights); if (w->c_prev) gsl_vector_free(w->c_prev); if (w->resfac) gsl_vector_free(w->resfac); if (w->psi) gsl_vector_free(w->psi); if (w->dpsi) gsl_vector_free(w->dpsi); if (w->QSI) gsl_matrix_free(w->QSI); if (w->D) gsl_vector_free(w->D); if (w->workn) gsl_vector_free(w->workn); free(w); } /* gsl_multifit_robust_free() */ int gsl_multifit_robust_tune(const double tune, gsl_multifit_robust_workspace *w) { w->tune = tune; return GSL_SUCCESS; } int gsl_multifit_robust_maxiter(const size_t maxiter, gsl_multifit_robust_workspace *w) { if (w->maxiter == 0) { GSL_ERROR("maxiter must be greater than 0", GSL_EINVAL); } else { w->maxiter = maxiter; return GSL_SUCCESS; } } const char * gsl_multifit_robust_name(const gsl_multifit_robust_workspace *w) { return w->type->name; } gsl_multifit_robust_stats gsl_multifit_robust_statistics(const gsl_multifit_robust_workspace *w) { return w->stats; } /* gsl_multifit_robust_weights() Compute iterative weights for given residuals Inputs: r - residuals wts - (output) where to store weights w_i = r_i / (sigma_mad * tune) w - workspace Return: success/error Notes: 1) Sizes of r and wts must be equal 2) Size of r/wts may be less than or equal to w->n, to allow for computing weights of a subset of data */ int gsl_multifit_robust_weights(const gsl_vector *r, gsl_vector *wts, gsl_multifit_robust_workspace *w) { if (r->size != wts->size) { GSL_ERROR("residual vector does not match weight vector size", GSL_EBADLEN); } else { int s; double sigma; sigma = robust_madsigma(r, w->p, wts); /* scale residuals by sigma and tuning factor */ gsl_vector_memcpy(wts, r); gsl_vector_scale(wts, 1.0 / (sigma * w->tune)); /* compute weights in-place */ s = w->type->wfun(wts, wts); return s; } } /* gsl_multifit_robust_weights() */ /* gsl_multifit_robust() Perform robust iteratively reweighted linear least squares fit Inputs: X - design matrix of basis functions y - right hand side vector c - (output) model coefficients cov - (output) covariance matrix w - workspace */ int gsl_multifit_robust(const gsl_matrix * X, const gsl_vector * y, gsl_vector * c, gsl_matrix * cov, gsl_multifit_robust_workspace *w) { /* check matrix and vector sizes */ 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 != w->n || X->size2 != w->p) { GSL_ERROR ("size of workspace does not match size of observation matrix", GSL_EBADLEN); } else { int s; double chisq; const double tol = GSL_SQRT_DBL_EPSILON; int converged = 0; size_t numit = 0; const size_t n = y->size; double sigy = gsl_stats_sd(y->data, y->stride, n); double sig_lower; size_t i; /* * if the initial fit is very good, then finding outliers by comparing * them to the residual standard deviation is difficult. Therefore we * set a lower bound on the standard deviation estimate that is a small * fraction of the standard deviation of the data values */ sig_lower = 1.0e-6 * sigy; if (sig_lower == 0.0) sig_lower = 1.0; /* compute initial estimates using ordinary least squares */ s = gsl_multifit_linear(X, y, c, cov, &chisq, w->multifit_p); if (s) return s; /* save Q S^{-1} of original matrix */ gsl_matrix_memcpy(w->QSI, w->multifit_p->QSI); gsl_vector_memcpy(w->D, w->multifit_p->D); /* compute statistical leverage of each data point */ s = gsl_linalg_SV_leverage(w->multifit_p->A, w->resfac); if (s) return s; /* correct residuals with factor 1 / sqrt(1 - h) */ for (i = 0; i < n; ++i) { double h = gsl_vector_get(w->resfac, i); if (h > 0.9999) h = 0.9999; gsl_vector_set(w->resfac, i, 1.0 / sqrt(1.0 - h)); } /* compute residuals from OLS fit r = y - X c */ s = gsl_multifit_linear_residuals(X, y, c, w->r); if (s) return s; /* compute estimate of sigma from ordinary least squares */ w->stats.sigma_ols = gsl_blas_dnrm2(w->r) / sqrt((double) w->stats.dof); while (!converged && ++numit <= w->maxiter) { double sig; /* adjust residuals by statistical leverage (see DuMouchel and O'Brien) */ s = gsl_vector_mul(w->r, w->resfac); if (s) return s; /* compute estimate of standard deviation using MAD */ sig = robust_madsigma(w->r, w->p, w->workn); /* scale residuals by standard deviation and tuning parameter */ gsl_vector_scale(w->r, 1.0 / (GSL_MAX(sig, sig_lower) * w->tune)); /* compute weights using these residuals */ s = w->type->wfun(w->r, w->weights); if (s) return s; gsl_vector_memcpy(w->c_prev, c); /* solve weighted least squares with new weights */ s = gsl_multifit_wlinear(X, w->weights, y, c, cov, &chisq, w->multifit_p); if (s) return s; /* compute new residuals r = y - X c */ s = gsl_multifit_linear_residuals(X, y, c, w->r); if (s) return s; converged = robust_test_convergence(w->c_prev, c, tol); } /* compute final MAD sigma */ w->stats.sigma_mad = robust_madsigma(w->r, w->p, w->workn); /* compute robust estimate of sigma */ w->stats.sigma_rob = robust_robsigma(w->r, w->stats.sigma_mad, w->tune, w); /* compute final estimate of sigma */ w->stats.sigma = robust_sigma(w->stats.sigma_ols, w->stats.sigma_rob, w); /* store number of iterations */ w->stats.numit = numit; { double dof = (double) w->stats.dof; double rnorm = w->stats.sigma * sqrt(dof); /* see DuMouchel, sec 4.2 */ double ss_err = rnorm * rnorm; double ss_tot = gsl_stats_tss(y->data, y->stride, n); /* compute R^2 */ w->stats.Rsq = 1.0 - ss_err / ss_tot; /* compute adjusted R^2 */ w->stats.adj_Rsq = 1.0 - (1.0 - w->stats.Rsq) * ((double)n - 1.0) / dof; /* compute rmse */ w->stats.rmse = sqrt(ss_err / dof); /* store SSE */ w->stats.sse = ss_err; } /* calculate covariance matrix = sigma^2 (X^T X)^{-1} */ s = robust_covariance(w->stats.sigma, cov, w); if (s) return s; /* raise an error if not converged */ if (numit > w->maxiter) { GSL_ERROR("maximum iterations exceeded", GSL_EMAXITER); } return s; } } /* gsl_multifit_robust() */ /* Estimation of values for given x */ int gsl_multifit_robust_est(const gsl_vector * x, const gsl_vector * c, const gsl_matrix * cov, double *y, double *y_err) { int s = gsl_multifit_linear_est(x, c, cov, y, y_err); return s; } /* gsl_multifit_robust_residuals() Compute robust / studentized residuals from fit r_i = (y_i - Y_i) / (sigma * sqrt(1 - h_i)) Inputs: X - design matrix y - rhs vector c - fit coefficients r - (output) studentized residuals w - workspace Notes: 1) gsl_multifit_robust() must first be called to compute the coefficients c, the leverage factors in w->resfac, and sigma in w->stats.sigma */ int gsl_multifit_robust_residuals(const gsl_matrix * X, const gsl_vector * y, const gsl_vector * c, gsl_vector * r, gsl_multifit_robust_workspace * w) { 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 (y->size != r->size) { GSL_ERROR ("number of observations in y does not match number of residuals", GSL_EBADLEN); } else { const double sigma = w->stats.sigma; /* previously calculated sigma */ int s; size_t i; /* compute r = y - X c */ s = gsl_multifit_linear_residuals(X, y, c, r); if (s) return s; for (i = 0; i < r->size; ++i) { double hfac = gsl_vector_get(w->resfac, i); /* 1/sqrt(1 - h_i) */ double *ri = gsl_vector_ptr(r, i); /* multiply residual by 1 / (sigma * sqrt(1 - h_i)) */ *ri *= hfac / sigma; } return s; } } /* gsl_multifit_robust_residuals() */ /*********************************** * INTERNAL ROUTINES * ***********************************/ /* robust_test_convergence() Test for convergence in robust least squares Convergence criteria: |c_i^(k) - c_i^(k-1)| <= tol * max(|c_i^(k)|, |c_i^(k-1)|) for all i. k refers to iteration number. Inputs: c_prev - coefficients from previous iteration c - coefficients from current iteration tol - tolerance Return: 1 if converged, 0 if not */ static int robust_test_convergence(const gsl_vector *c_prev, const gsl_vector *c, const double tol) { size_t p = c->size; size_t i; for (i = 0; i < p; ++i) { double ai = gsl_vector_get(c_prev, i); double bi = gsl_vector_get(c, i); if (fabs(bi - ai) > tol * GSL_MAX(fabs(ai), fabs(bi))) return 0; /* not yet converged */ } /* converged */ return 1; } /* robust_test_convergence() */ /* robust_madsigma() Estimate the standard deviation of the residuals using the Median-Absolute-Deviation (MAD) of the residuals, throwing away the smallest p residuals. See: Street et al, 1988 Inputs: r - vector of residuals p - number of model coefficients (smallest p residuals are ignored) workn - workspace of size n = length(r) */ static double robust_madsigma(const gsl_vector *r, const size_t p, gsl_vector *workn) { size_t n = r->size; double sigma; size_t i; /* allow for the possibility that r->size < w->n */ gsl_vector_view v1 = gsl_vector_subvector(workn, 0, n); gsl_vector_view v2; /* copy |r| into workn */ for (i = 0; i < n; ++i) { gsl_vector_set(&v1.vector, i, fabs(gsl_vector_get(r, i))); } gsl_sort_vector(&v1.vector); /* * ignore the smallest p residuals when computing the median * (see Street et al 1988) */ v2 = gsl_vector_subvector(&v1.vector, p - 1, n - p + 1); sigma = gsl_stats_median_from_sorted_data(v2.vector.data, v2.vector.stride, v2.vector.size) / 0.6745; return sigma; } /* robust_madsigma() */ /* robust_robsigma() Compute robust estimate of sigma so that sigma^2 * inv(X' * X) is a reasonable estimate of the covariance for robust regression. Based heavily on the equations of Street et al, 1988. Inputs: r - vector of residuals y - X c s - sigma estimate using MAD tune - tuning constant w - workspace */ static double robust_robsigma(const gsl_vector *r, const double s, const double tune, gsl_multifit_robust_workspace *w) { double sigma; size_t i; const size_t n = w->n; const size_t p = w->p; const double st = s * tune; double a, b, lambda; /* compute u = r / sqrt(1 - h) / st */ gsl_vector_memcpy(w->workn, r); gsl_vector_mul(w->workn, w->resfac); gsl_vector_scale(w->workn, 1.0 / st); /* compute w(u) and psi'(u) */ w->type->wfun(w->workn, w->psi); w->type->psi_deriv(w->workn, w->dpsi); /* compute psi(u) = u*w(u) */ gsl_vector_mul(w->psi, w->workn); /* Street et al, Eq (3) */ a = gsl_stats_mean(w->dpsi->data, w->dpsi->stride, n); /* Street et al, Eq (5) */ b = 0.0; for (i = 0; i < n; ++i) { double psi_i = gsl_vector_get(w->psi, i); double resfac = gsl_vector_get(w->resfac, i); double fac = 1.0 / (resfac*resfac); /* 1 - h */ b += fac * psi_i * psi_i; } b /= (double) (n - p); /* Street et al, Eq (5) */ lambda = 1.0 + ((double)p)/((double)n) * (1.0 - a) / a; sigma = lambda * sqrt(b) * st / a; return sigma; } /* robust_robsigma() */ /* robust_sigma() Compute final estimate of residual standard deviation, using the OLS and robust sigma estimates. This equation is taken from DuMouchel and O'Brien, sec 4.1: \hat{\sigma_R} Inputs: s_ols - OLS sigma s_rob - robust sigma w - workspace Return: final estimate of sigma */ static double robust_sigma(const double s_ols, const double s_rob, gsl_multifit_robust_workspace *w) { double sigma; const double p = (double) w->p; const double n = (double) w->n; /* see DuMouchel and O'Brien, sec 4.1 */ sigma = GSL_MAX(s_rob, sqrt((s_ols*s_ols*p*p + s_rob*s_rob*n) / (p*p + n))); return sigma; } /* robust_sigma() */ /* robust_covariance() Calculate final covariance matrix, defined as: sigma * (X^T X)^{-1} Inputs: sigma - residual standard deviation cov - (output) covariance matrix w - workspace */ static int robust_covariance(const double sigma, gsl_matrix *cov, gsl_multifit_robust_workspace *w) { int status = 0; const size_t p = w->p; const double s2 = sigma * sigma; size_t i, j; gsl_matrix *QSI = w->QSI; gsl_vector *D = w->D; /* 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 status; } /* robust_covariance() */ gsl-doc-2.3/multifit/test_watson.c0000664000175000017500000000525312616157443015353 0ustar eddedd#define watson_N 31 #define watson_P 6 #define watson_NTRIES 4 static double watson_x0[watson_P] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; static double watson_epsrel = 1.0e-6; static void watson_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 2.287670053552372e-03; const double watson_x[watson_P] = { -1.572508640629858e-02, 1.012434869366059e+00, -2.329916259263380e-01, 1.260430087686035e+00, -1.513728922580576e+00, 9.929964323646112e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < watson_P; ++i) { gsl_test_rel(x[i], watson_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int watson_f (const gsl_vector * x, void *params, gsl_vector * f) { const double x1 = gsl_vector_get(x, 0); const double x2 = gsl_vector_get(x, 1); size_t i, j; for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0, sum2 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; if (j > 0) { sum2 += j * xj * tjm2; tjm2 *= ti; } } gsl_vector_set (f, i, sum2 - sum1*sum1 - 1.0); } gsl_vector_set(f, watson_N - 2, x1); gsl_vector_set(f, watson_N - 1, x2 - x1*x1 - 1.0); return GSL_SUCCESS; } static int watson_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get (x, 0); size_t i, j; gsl_matrix_set_zero(J); for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; } tjm1 = 1.0; tjm2 = 1.0; for (j = 0; j < watson_P; ++j) { gsl_matrix_set(J, i, j, j * tjm2 - 2.0*sum1*tjm1); tjm1 *= ti; if (j > 0) tjm2 *= ti; } } gsl_matrix_set(J, watson_N - 2, 0, 1.0); gsl_matrix_set(J, watson_N - 1, 0, -2.0*x1); gsl_matrix_set(J, watson_N - 1, 1, 1.0); return GSL_SUCCESS; } static gsl_multifit_function_fdf watson_func = { &watson_f, &watson_df, NULL, watson_N, watson_P, NULL, 0, 0 }; static test_fdf_problem watson_problem = { "watson", watson_x0, NULL, &watson_epsrel, watson_NTRIES, &watson_checksol, &watson_func }; gsl-doc-2.3/multifit/test_pontius.c0000664000175000017500000001157412616157443015544 0ustar eddeddsize_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 }; static int test_pontius_results(const char *str, const gsl_vector *c, const gsl_vector *expected_c, const gsl_vector *cov_diag, const gsl_vector *expected_sd, const double chisq, const double chisq_res, const double expected_chisq) { size_t i; /* test coefficient vector */ for (i = 0; i < pontius_p; ++i) { gsl_test_rel (gsl_vector_get(c,i), gsl_vector_get(expected_c, i), 1.0e-10, "%s c[%zu]", str, i) ; if (cov_diag && expected_sd) { gsl_test_rel (sqrt(gsl_vector_get(cov_diag, i)), gsl_vector_get(expected_sd, i), 1e-10, "%s cov[%zu,%zu]", str, i, i); } } gsl_test_rel (chisq, expected_chisq, 1.0e-10, "%s chisq", str); gsl_test_rel (chisq_res, expected_chisq, 1.0e-10, "%s chisq residuals", str); return GSL_SUCCESS; } void test_pontius () { size_t i, j; gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (pontius_n, pontius_p); gsl_multifit_robust_workspace * work_rob = gsl_multifit_robust_alloc (gsl_multifit_robust_ols, 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_vector * r = gsl_vector_alloc (pontius_n); gsl_matrix * cov = gsl_matrix_alloc (pontius_p, pontius_p); double chisq, chisq_res; 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; gsl_vector_view diag = gsl_matrix_diagonal (cov); gsl_vector_view exp_c = gsl_vector_view_array(expected_c, pontius_p); gsl_vector_view exp_sd = gsl_vector_view_array(expected_sd, pontius_p); 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)); } } /* test unweighted least squares */ gsl_multifit_linear (X, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(X, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_pontius_results("pontius gsl_multifit_linear", c, &exp_c.vector, &diag.vector, &exp_sd.vector, chisq, chisq_res, expected_chisq); /* test robust least squares */ gsl_multifit_robust (X, &y.vector, c, cov, work_rob); test_pontius_results("pontius gsl_multifit_robust", c, &exp_c.vector, &diag.vector, &exp_sd.vector, 1.0, 1.0, 1.0); /* test weighted least squares */ { gsl_vector * w = gsl_vector_alloc (pontius_n); 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} }; gsl_vector_set_all (w, 1.0); gsl_multifit_wlinear (X, w, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(X, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_pontius_results("pontius gsl_multifit_wlinear", c, &exp_c.vector, NULL, NULL, chisq, chisq_res, expected_chisq); 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_multifit_wlinear cov(%d,%d)", i, j) ; } } gsl_vector_free(w); } gsl_vector_free(c); gsl_vector_free(r); gsl_matrix_free(cov); gsl_matrix_free(X); gsl_multifit_linear_free (work); gsl_multifit_robust_free (work_rob); } gsl-doc-2.3/multifit/test_nelson.c0000664000175000017500000001364612616157443015343 0ustar eddeddconst 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; } gsl-doc-2.3/multifit/test_shaw.c0000644000175000017500000002301013017642473014765 0ustar eddedd/* * test_shaw.c * * Test L-curve (Tikhonov) regression routines using Shaw * problem. See example 1.10 of * * [1] R.C. Aster, B. Borchers and C. H. Thurber, * Parameter Estimation and Inverse Problems (2nd ed), 2012. */ #include /* alternate (and inefficient) method of computing G(lambda) */ static double shaw_gcv_G(const double lambda, const gsl_matrix * X, const gsl_vector * y, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; gsl_matrix * XTX = gsl_matrix_alloc(p, p); gsl_matrix * XI = gsl_matrix_alloc(p, n); gsl_matrix * XXI = gsl_matrix_alloc(n, n); gsl_vector * c = gsl_vector_alloc(p); gsl_vector_view d; double rnorm, snorm; double term1, term2, G; size_t i; /* compute regularized solution with this lambda */ gsl_multifit_linear_solve(lambda, X, y, c, &rnorm, &snorm, work); /* compute X^T X */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, X, 0.0, XTX); /* add lambda*I */ d = gsl_matrix_diagonal(XTX); gsl_vector_add_constant(&d.vector, lambda * lambda); /* invert (X^T X + lambda*I) */ gsl_linalg_cholesky_decomp1(XTX); gsl_linalg_cholesky_invert(XTX); gsl_matrix_transpose_tricpy('L', 0, XTX, XTX); /* XI = (X^T X + lambda*I)^{-1} X^T */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, XTX, X, 0.0, XI); /* XXI = X (X^T X + lambda*I)^{-1} X^T */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, X, XI, 0.0, XXI); /* compute: term1 = Tr(I - X XI) */ term1 = 0.0; for (i = 0; i < n; ++i) { double *Ai = gsl_matrix_ptr(XXI, i, i); term1 += 1.0 - (*Ai); } gsl_matrix_free(XTX); gsl_matrix_free(XI); gsl_matrix_free(XXI); gsl_vector_free(c); term2 = rnorm / term1; return term2 * term2;; } /* construct design matrix and rhs vector for Shaw problem */ static int shaw_system(gsl_matrix * X, gsl_vector * y) { int s = GSL_SUCCESS; const size_t n = X->size1; const size_t p = X->size2; const double dtheta = M_PI / (double) p; size_t i, j; gsl_vector *m = gsl_vector_alloc(p); /* build the design matrix */ for (i = 0; i < n; ++i) { double si = (i + 0.5) * M_PI / n - M_PI / 2.0; double csi = cos(si); double sni = sin(si); for (j = 0; j < p; ++j) { double thetaj = (j + 0.5) * M_PI / p - M_PI / 2.0; double term1 = csi + cos(thetaj); double term2 = gsl_sf_sinc(sni + sin(thetaj)); double Xij = term1 * term1 * term2 * term2 * dtheta; gsl_matrix_set(X, i, j, Xij); } } /* construct coefficient vector */ { const double a1 = 2.0; const double a2 = 1.0; const double c1 = 6.0; const double c2 = 2.0; const double t1 = 0.8; const double t2 = -0.5; for (j = 0; j < p; ++j) { double tj = -M_PI / 2.0 + (j + 0.5) * dtheta; double mj = a1 * exp(-c1 * (tj - t1) * (tj - t1)) + a2 * exp(-c2 * (tj - t2) * (tj - t2)); gsl_vector_set(m, j, mj); } } /* construct rhs vector */ gsl_blas_dgemv(CblasNoTrans, 1.0, X, m, 0.0, y); gsl_vector_free(m); return s; } static int test_shaw_system_l(gsl_rng *rng_p, const size_t n, const size_t p, const double lambda_expected, gsl_vector *rhs) { const size_t npoints = 1000; /* number of points on L-curve */ const double tol1 = 1.0e-12; const double tol2 = 1.0e-10; const double tol3 = 1.0e-5; gsl_vector * reg_param = gsl_vector_alloc(npoints); gsl_vector * rho = gsl_vector_alloc(npoints); gsl_vector * eta = gsl_vector_alloc(npoints); gsl_matrix * X = gsl_matrix_alloc(n, p); gsl_matrix * cov = gsl_matrix_alloc(p, p); gsl_vector * c = gsl_vector_alloc(p); gsl_vector * ytmp = gsl_vector_alloc(n); gsl_vector * y; gsl_vector * r = gsl_vector_alloc(n); gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (n, p); size_t reg_idx, i; double lambda, rnorm, snorm; /* build design matrix */ shaw_system(X, ytmp); if (rhs) y = rhs; else { y = ytmp; /* add random noise to exact rhs vector */ test_random_vector_noise(rng_p, y); } /* SVD decomposition */ gsl_multifit_linear_svd(X, work); /* calculate L-curve */ gsl_multifit_linear_lcurve(y, reg_param, rho, eta, work); /* test rho and eta vectors */ for (i = 0; i < npoints; ++i) { double rhoi = gsl_vector_get(rho, i); double etai = gsl_vector_get(eta, i); double lami = gsl_vector_get(reg_param, i); /* solve regularized system and check for consistent rho/eta values */ gsl_multifit_linear_solve(lami, X, y, c, &rnorm, &snorm, work); gsl_test_rel(rhoi, rnorm, tol3, "shaw rho n=%zu p=%zu lambda=%e", n, p, lami); gsl_test_rel(etai, snorm, tol1, "shaw eta n=%zu p=%zu lambda=%e", n, p, lami); } /* calculate corner of L-curve */ gsl_multifit_linear_lcorner(rho, eta, ®_idx); lambda = gsl_vector_get(reg_param, reg_idx); /* test against known lambda value if given */ if (lambda_expected > 0.0) { gsl_test_rel(lambda, lambda_expected, tol1, "shaw: n=%zu p=%zu L-curve corner lambda", n, p); } /* compute regularized solution with optimal lambda */ gsl_multifit_linear_solve(lambda, X, y, c, &rnorm, &snorm, work); /* compute residual norm ||y - X c|| */ gsl_vector_memcpy(r, y); gsl_blas_dgemv(CblasNoTrans, 1.0, X, c, -1.0, r); /* test rnorm value */ gsl_test_rel(rnorm, gsl_blas_dnrm2(r), tol2, "shaw: n=%zu p=%zu rnorm", n, p); /* test snorm value */ gsl_test_rel(snorm, gsl_blas_dnrm2(c), tol2, "shaw: n=%zu p=%zu snorm", n, p); gsl_matrix_free(X); gsl_matrix_free(cov); gsl_vector_free(reg_param); gsl_vector_free(rho); gsl_vector_free(eta); gsl_vector_free(r); gsl_vector_free(c); gsl_vector_free(ytmp); gsl_multifit_linear_free(work); return 0; } /* test_shaw_system_l() */ static int test_shaw_system_gcv(gsl_rng *rng_p, const size_t n, const size_t p, const double lambda_expected, gsl_vector *rhs) { const size_t npoints = 200; /* number of points on L-curve */ const double tol1 = 1.0e-12; const double tol2 = 1.0e-10; const double tol3 = 1.0e-5; gsl_vector * reg_param = gsl_vector_alloc(npoints); gsl_vector * G = gsl_vector_alloc(npoints); gsl_matrix * X = gsl_matrix_alloc(n, p); gsl_matrix * cov = gsl_matrix_alloc(p, p); gsl_vector * c = gsl_vector_alloc(p); gsl_vector * ytmp = gsl_vector_alloc(n); gsl_vector * y; gsl_vector * r = gsl_vector_alloc(n); gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (n, p); size_t reg_idx, i; double lambda, rnorm, snorm, G_lambda; /* build design matrix */ shaw_system(X, ytmp); if (rhs) y = rhs; else { y = ytmp; /* add random noise to exact rhs vector */ test_random_vector_noise(rng_p, y); } /* SVD decomposition */ gsl_multifit_linear_svd(X, work); /* calculate GCV curve */ gsl_multifit_linear_gcv(y, reg_param, G, &lambda, &G_lambda, work); /* test G vector */ for (i = 0; i < npoints; ++i) { double lami = gsl_vector_get(reg_param, i); if (lami > 1.0e-5) { /* test unreliable for small lambda */ double Gi = gsl_vector_get(G, i); double Gi_expected = shaw_gcv_G(lami, X, y, work); gsl_test_rel(Gi, Gi_expected, tol3, "shaw[%zu,%zu] gcv G i=%zu lambda=%e", n, p, i, lami); } } /* test against known lambda value if given */ if (lambda_expected > 0.0) { gsl_test_rel(lambda, lambda_expected, tol2, "shaw gcv: n=%zu p=%zu lambda", n, p); } /* compute regularized solution with optimal lambda */ gsl_multifit_linear_solve(lambda, X, y, c, &rnorm, &snorm, work); /* compute residual norm ||y - X c|| */ gsl_vector_memcpy(r, y); gsl_blas_dgemv(CblasNoTrans, 1.0, X, c, -1.0, r); /* test rnorm value */ gsl_test_rel(rnorm, gsl_blas_dnrm2(r), tol2, "shaw gcv: n=%zu p=%zu rnorm", n, p); /* test snorm value */ gsl_test_rel(snorm, gsl_blas_dnrm2(c), tol2, "shaw gcv: n=%zu p=%zu snorm", n, p); gsl_matrix_free(X); gsl_matrix_free(cov); gsl_vector_free(reg_param); gsl_vector_free(G); gsl_vector_free(r); gsl_vector_free(c); gsl_vector_free(ytmp); gsl_multifit_linear_free(work); return 0; } /* test_shaw_system_gcv() */ void test_shaw(void) { gsl_rng * r = gsl_rng_alloc(gsl_rng_default); { double shaw20_y[] = { 8.7547455124379323e-04, 5.4996835885761936e-04, 1.7527999407005367e-06, 1.9552372913117047e-03, 1.4411645433785081e-02, 5.2800013336393704e-02, 1.3609152023257112e-01, 2.7203484587635818e-01, 4.3752225136193390e-01, 5.7547667319875240e-01, 6.2445052213539942e-01, 5.6252658286441348e-01, 4.2322239923561566e-01, 2.6768469219560631e-01, 1.4337901162734543e-01, 6.5614569346074361e-02, 2.6013851831752945e-02, 9.2336933089481269e-03, 3.2269066658993694e-03, 1.3999201459261811e-03 }; gsl_vector_view rhs = gsl_vector_view_array(shaw20_y, 20); /* lambda and rhs values from [1] */ test_shaw_system_l(r, 20, 20, 5.793190958069266e-06, &rhs.vector); test_shaw_system_gcv(r, 20, 20, 1.24921780949051038e-05, &rhs.vector); } { size_t n, p; for (n = 10; n <= 50; n += 2) { for (p = n - 6; p <= n; p += 2) test_shaw_system_l(r, n, p, -1.0, NULL); } } gsl_rng_free(r); } /* test_shaw() */ gsl-doc-2.3/multifit/test_longley.c0000664000175000017500000001453112616157443015510 0ustar eddeddsize_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}; static int test_longley_results(const char *str, const gsl_vector *c, const gsl_vector *expected_c, const gsl_vector *cov_diag, const gsl_vector *expected_sd, const double chisq, const double chisq_res, const double expected_chisq) { size_t i; /* test coefficient vector */ for (i = 0; i < longley_p; ++i) { gsl_test_rel (gsl_vector_get(c,i), gsl_vector_get(expected_c, i), 1.0e-10, "%s c[%zu]", str, i) ; if (cov_diag && expected_sd) { gsl_test_rel (sqrt(gsl_vector_get(cov_diag, i)), gsl_vector_get(expected_sd, i), 1e-10, "%s cov[%zu,%zu]", str, i, i); } } gsl_test_rel (chisq, expected_chisq, 1.0e-10, "%s chisq", str); gsl_test_rel (chisq_res, expected_chisq, 1.0e-10, "%s chisq residuals", str); return GSL_SUCCESS; } void test_longley () { gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (longley_n, longley_p); gsl_multifit_robust_workspace * work_rob = gsl_multifit_robust_alloc (gsl_multifit_robust_ols, 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_vector * r = gsl_vector_alloc (longley_n); gsl_matrix * cov = gsl_matrix_alloc (longley_p, longley_p); double chisq, chisq_res; 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_vector_view diag = gsl_matrix_diagonal (cov); gsl_vector_view exp_c = gsl_vector_view_array(expected_c, longley_p); gsl_vector_view exp_sd = gsl_vector_view_array(expected_sd, longley_p); /* test unweighted least squares */ gsl_multifit_linear (&X.matrix, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(&X.matrix, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_longley_results("longley gsl_multifit_linear", c, &exp_c.vector, &diag.vector, &exp_sd.vector, chisq, chisq_res, expected_chisq); /* test robust least squares */ gsl_multifit_robust (&X.matrix, &y.vector, c, cov, work_rob); test_longley_results("longley gsl_multifit_robust", c, &exp_c.vector, &diag.vector, &exp_sd.vector, 1.0, 1.0, 1.0); /* test weighted least squares */ { size_t i, j; gsl_vector * w = gsl_vector_alloc (longley_n); 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 }} ; gsl_vector_set_all (w, 1.0); gsl_multifit_wlinear (&X.matrix, w, &y.vector, c, cov, &chisq, work); gsl_multifit_linear_residuals(&X.matrix, &y.vector, c, r); gsl_blas_ddot(r, r, &chisq_res); test_longley_results("longley gsl_multifit_wlinear", c, &exp_c.vector, NULL, NULL, chisq, chisq_res, expected_chisq); 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_multifit_wlinear cov(%d,%d)", i, j) ; } } gsl_vector_free(w); } gsl_vector_free(c); gsl_vector_free(r); gsl_matrix_free(cov); gsl_multifit_linear_free (work); gsl_multifit_robust_free (work_rob); } /* test_longley() */ gsl-doc-2.3/multifit/lmpar.c0000664000175000017500000002612012616157443014110 0ustar eddedd/* multifit/lmpar.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #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); } } } /* compute scaled gradient g = D^{-1} J^T f (see More' eq 7.2) */ 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); } } } /* compute gradient g = J^T f */ static void compute_gradient (const gsl_matrix * r, const gsl_vector * qtf, 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); } gsl_vector_set (g, j, sum); } } 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; } #ifdef DEBUG printf ("r = "); gsl_matrix_fprintf (stdout, r, "%g"); printf ("\n"); printf ("newton = "); gsl_vector_fprintf (stdout, newton, "%g"); printf ("\n"); printf ("dxnorm = %g\n", dxnorm); #endif compute_newton_bound (r, newton, dxnorm, perm, diag, w); #ifdef DEBUG printf("perm = "); gsl_permutation_fprintf(stdout, perm, "%d"); printf ("diag = "); gsl_vector_fprintf (stdout, diag, "%g"); printf ("\n"); printf ("w = "); gsl_vector_fprintf (stdout, w, "%g"); printf ("\n"); #endif { 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; } gsl-doc-2.3/multifit/Makefile.in0000644000175000017500000011332613022372406014667 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultifit_la_LIBADD = am_libgslmultifit_la_OBJECTS = gcv.lo multilinear.lo multiwlinear.lo \ work.lo lmniel.lo lmder.lo fsolver.lo fdfsolver.lo fdfridge.lo \ fdjac.lo convergence.lo gradient.lo covar.lo multirobust.lo \ robust_wfun.lo multireg.lo libgslmultifit_la_OBJECTS = $(am_libgslmultifit_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 \ ../sort/libgslsort.la ../statistics/libgslstatistics.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 ../rng/libgslrng.la \ ../specfunc/libgslspecfunc.la ../min/libgslmin.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultifit.la pkginclude_HEADERS = gsl_multifit.h gsl_multifit_nlin.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_la_SOURCES = gcv.c multilinear.c multiwlinear.c work.c lmniel.c lmder.c fsolver.c fdfsolver.c fdfridge.c fdjac.c convergence.c gradient.c covar.c multirobust.c robust_wfun.c multireg.c noinst_HEADERS = \ linear_common.c \ lmutil.c \ lmpar.c \ lmset.c \ lmiterate.c \ lmmisc.c \ qrsolv.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_estimator.c \ test_exp1.c \ test_filip.c \ test_gaussian.c \ test_hahn1.c \ test_helical.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_linear.c \ test_longley.c \ test_meyer.c \ test_meyerscal.c \ test_nelson.c \ test_nonlinear.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_pontius.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_reg.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_shaw.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wnlin.c \ test_wood.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 ../sort/libgslsort.la ../statistics/libgslstatistics.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 ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../min/libgslmin.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multifit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultifit.la: $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_DEPENDENCIES) $(EXTRA_libgslmultifit_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfridge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gradient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmniel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multireg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multirobust.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiwlinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/robust_wfun.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multifit/test_powell3.c0000664000175000017500000000316612616157443015426 0ustar eddedd#define powell3_N 2 #define powell3_P 2 #define powell3_NTRIES 1 static double powell3_x0[powell3_P] = { 0.0, 1.0 }; static double powell3_epsrel = 1.0e-12; static void powell3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double powell3_x[powell3_P] = { 1.09815932969975976e-05, 9.10614673986700218 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell3_P; ++i) { gsl_test_rel(x[i], powell3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 1.0e4*x1*x2 - 1.0); gsl_vector_set(f, 1, exp(-x1) + exp(-x2) - 1.0001); return GSL_SUCCESS; } static int powell3_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set(J, 0, 0, 1.0e4*x2); gsl_matrix_set(J, 0, 1, 1.0e4*x1); gsl_matrix_set(J, 1, 0, -exp(-x1)); gsl_matrix_set(J, 1, 1, -exp(-x2)); return GSL_SUCCESS; } static gsl_multifit_function_fdf powell3_func = { &powell3_f, &powell3_df, NULL, powell3_N, powell3_P, NULL, 0, 0 }; static test_fdf_problem powell3_problem = { "powell_badly_scaled", powell3_x0, NULL, &powell3_epsrel, powell3_NTRIES, &powell3_checksol, &powell3_func }; gsl-doc-2.3/multifit/ChangeLog0000664000175000017500000001301312616157443014400 0ustar eddedd2013-06-10 Patrick Alken * fdfsolver.c (gsl_multifit_fdfsolver_driver): added higher level wrapper routine 2010-02-25 Brian Gough * lmiterate.c (iterate): changed GSL_CONTINUE to GSL_ENOPROG for the case where the routine has made 10 or more attempts to find a suitable trial step without success. 2009-11-25 Brian Gough * multilinear.c (gsl_multifit_linear_usvd) (gsl_multifit_wlinear_usvd): provide an unscaled version of the fits 2009-07-09 Brian Gough * work.c (gsl_multifit_linear_free): handle NULL argument in free * fsolver.c (gsl_multifit_fsolver_free): handle NULL argument in free * fdfsolver.c (gsl_multifit_fdfsolver_free): handle NULL argument in free 2009-06-24 Brian Gough * lmset.c (set): check the return code of fdf 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-07-29 Brian Gough * lmset.c (set): ensure internal state is zeroed after a set 2007-01-26 Brian Gough * fsolver.c (gsl_multifit_fsolver_set): made vector argument x const 2006-03-30 Brian Gough * 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 * 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 * 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 * gsl_multifit_nlin.h: removed unused declaration of gsl_multifit_fdjacobian 2004-06-14 Brian Gough * 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 * 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 * 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 * 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 * 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 * test_filip.c (test_filip): reduce tolerance on covariance test slightly for MSVC with /O2 Sun Jul 1 22:42:34 2001 Brian Gough * 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 * test_filip.c (test_filip): reduce tolerance on covariance test slightly Wed Jun 20 13:11:26 2001 Brian Gough * removed unused variable work2 Tue Jun 19 23:18:01 2001 Brian Gough * 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 * 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 * qrsolv.c (qrsolv): removed local declaration of j to avoid shadowing global j Mon Apr 23 13:40:04 2001 Brian Gough * qrsolv.c (qrsolv): made function static so it is not exported Wed Apr 18 13:39:33 2001 Brian Gough * 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 * lmpar.c (compute_newton_direction): corrected bug that produced negative index Sun Feb 18 16:39:46 2001 Brian Gough * 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 * Makefile.am multifit/demo.c: removed demo from Makefile since it is was just a temporary test. gsl-doc-2.3/multifit/test_hahn1.c0000664000175000017500000002236012616157443015035 0ustar eddedd#define hahn1_N 236 #define hahn1_P 7 #define hahn1_NTRIES 1 /* double hahn1_x0[7] = { 10, -1, 0.05, -0.00001, -0.05, 0.001, -0.000001 }; */ static double hahn1_x0[hahn1_P] = { 1, -0.1, 0.005, -0.000001, -0.005, 0.0001, -0.0000001}; static double hahn1_epsrel = 1.0e-5; static double hahn1_sigma[hahn1_P] = { 1.7070154742E-01, 1.2000289189E-02, 2.2508314937E-04, 2.7578037666E-07, 2.4712888219E-04, 1.0449373768E-05, 1.3027335327E-08 }; static double hahn1_F1[hahn1_N] = { .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 }; static double hahn1_F0[hahn1_N] = { 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 }; static void hahn1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.5324382854E+00; const double hahn1_x[hahn1_P] = { 1.0776351733E+00, -1.2269296921E-01, 4.0863750610E-03, -1.4262662514E-06, -5.7609940901E-03, 2.4053735503E-04, -1.2314450199E-07 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < hahn1_P; ++i) { gsl_test_rel(x[i], hahn1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int hahn1_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; 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; } static int hahn1_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; 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; } static gsl_multifit_function_fdf hahn1_func = { &hahn1_f, &hahn1_df, NULL, hahn1_N, hahn1_P, NULL, 0, 0 }; static test_fdf_problem hahn1_problem = { "nist-hahn1", hahn1_x0, hahn1_sigma, &hahn1_epsrel, hahn1_NTRIES, &hahn1_checksol, &hahn1_func }; gsl-doc-2.3/multifit/gradient.c0000664000175000017500000000220012616157443014563 0ustar eddedd/* multifit/gradient.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; } gsl-doc-2.3/multifit/lmder.c0000664000175000017500000002545612616157443014113 0ustar eddedd/* multfit/lmder.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { size_t iter; double xnorm; double fnorm; double delta; double par; gsl_matrix *J; /* Jacobian matrix */ gsl_matrix *r; /* R matrix in J = Q R P^T */ gsl_vector *tau; gsl_vector *diag; /* scaling matrix D = diag(d1,...,dp) */ gsl_vector *qtf; /* Q^T f */ gsl_vector *newton; gsl_vector *gradient; /* gradient g = J^T f */ gsl_vector *x_trial; /* trial step x + dx */ gsl_vector *f_trial; /* trial function f(x + dx) */ gsl_vector *df; gsl_vector *sdiag; gsl_vector *rptdx; const gsl_vector *weights; /* data weights */ 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, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx); static int lmsder_set (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx); static int set (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx, int scale); static int lmder_iterate (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx); static void lmder_free (void *vstate); static int iterate (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, 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, *J; gsl_vector *tau, *diag, *qtf, *newton, *gradient, *x_trial, *f_trial, *df, *sdiag, *rptdx, *w, *work1; gsl_permutation *perm; J = gsl_matrix_alloc (n, p); if (J == 0) { GSL_ERROR ("failed to allocate space for J", GSL_ENOMEM); } state->J = J; r = gsl_matrix_alloc (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, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx) { int status = set (vstate, swts, fdf, x, f, dx, 0); return status ; } static int lmsder_set (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx) { int status = set (vstate, swts, fdf, x, f, dx, 1); return status ; } static int lmder_iterate (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx) { int status = iterate (vstate, swts, fdf, x, f, dx, 0); return status; } static int lmsder_iterate (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_vector * dx) { int status = iterate (vstate, swts, fdf, x, f, dx, 1); return status; } static int lmder_gradient (void *vstate, gsl_vector * g) { lmder_state_t *state = (lmder_state_t *) vstate; compute_gradient(state->r, state->qtf, g); return GSL_SUCCESS; } static int lmder_jac (void *vstate, gsl_matrix * J) { lmder_state_t *state = (lmder_state_t *) vstate; int s = gsl_matrix_memcpy(J, state->J); return s; } static void lmder_free (void *vstate) { lmder_state_t *state = (lmder_state_t *) vstate; if (state->perm) gsl_permutation_free (state->perm); if (state->work1) gsl_vector_free (state->work1); if (state->w) gsl_vector_free (state->w); if (state->rptdx) gsl_vector_free (state->rptdx); if (state->sdiag) gsl_vector_free (state->sdiag); if (state->df) gsl_vector_free (state->df); if (state->f_trial) gsl_vector_free (state->f_trial); if (state->x_trial) gsl_vector_free (state->x_trial); if (state->gradient) gsl_vector_free (state->gradient); if (state->newton) gsl_vector_free (state->newton); if (state->qtf) gsl_vector_free (state->qtf); if (state->diag) gsl_vector_free (state->diag); if (state->tau) gsl_vector_free (state->tau); if (state->r) gsl_matrix_free (state->r); if (state->J) gsl_matrix_free (state->J); } static const gsl_multifit_fdfsolver_type lmder_type = { "lmder", /* name */ sizeof (lmder_state_t), &lmder_alloc, &lmder_set, &lmder_iterate, &lmder_gradient, &lmder_jac, &lmder_free }; static const gsl_multifit_fdfsolver_type lmsder_type = { "lmsder", /* name */ sizeof (lmder_state_t), &lmder_alloc, &lmsder_set, &lmsder_iterate, &lmder_gradient, &lmder_jac, &lmder_free }; const gsl_multifit_fdfsolver_type *gsl_multifit_fdfsolver_lmder = &lmder_type; const gsl_multifit_fdfsolver_type *gsl_multifit_fdfsolver_lmsder = &lmsder_type; gsl-doc-2.3/multifit/test_lin1.c0000664000175000017500000000321612616157443014700 0ustar eddedd#define lin1_N 11 /* can be anything >= p */ #define lin1_P 5 #define lin1_NTRIES 3 static double lin1_x0[lin1_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin1_epsrel = 1.0e-10; static void lin1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = (double) (lin1_N - lin1_P); gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin1_P; ++i) { gsl_test_rel(x[i], -1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int lin1_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin1_N; ++i) { double fi = 0.0; for (j = 0; j < lin1_P; ++j) { double xj = gsl_vector_get(x, j); double Aij = (i == j) ? 1.0 : 0.0; Aij -= 2.0 / lin1_N; fi += Aij * xj; } fi -= 1.0; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int lin1_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (i = 0; i < lin1_N; ++i) { for (j = 0; j < lin1_P; ++j) { double Jij = (i == j) ? 1.0 : 0.0; Jij -= 2.0 / lin1_N; gsl_matrix_set(J, i, j, Jij); } } return GSL_SUCCESS; } static gsl_multifit_function_fdf lin1_func = { &lin1_f, &lin1_df, NULL, lin1_N, lin1_P, NULL, 0, 0 }; static test_fdf_problem lin1_problem = { "linear_full", lin1_x0, NULL, &lin1_epsrel, lin1_NTRIES, &lin1_checksol, &lin1_func }; gsl-doc-2.3/multifit/qrsolv.c0000664000175000017500000001324712616157443014331 0ustar eddedd/* 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; } gsl-doc-2.3/multifit/fsolver.c0000664000175000017500000001046512616157443014462 0ustar eddedd/* multifit/fsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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); } int gsl_multifit_fsolver_driver (gsl_multifit_fsolver * s, const size_t maxiter, const double epsabs, const double epsrel) { int status; size_t iter = 0; do { status = gsl_multifit_fsolver_iterate (s); if (status) break; /* test for convergence */ status = gsl_multifit_test_delta (s->dx, s->x, epsabs, epsrel); } while (status == GSL_CONTINUE && ++iter < maxiter); return status; } /* gsl_multifit_fdfsolver_driver() */ void gsl_multifit_fsolver_free (gsl_multifit_fsolver * s) { RETURN_IF_NULL (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; } gsl-doc-2.3/multifit/test_brown3.c0000664000175000017500000000304312616157443015245 0ustar eddedd#define brown3_N 3 #define brown3_P 2 #define brown3_NTRIES 3 static double brown3_x0[brown3_P] = { 1.0, 1.0 }; static double brown3_epsrel = 1.0e-12; static void brown3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double brown3_x[brown3_P] = { 1.0e6, 2.0e-6 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown3_P; ++i) { gsl_test_rel(x[i], brown3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - 1.0e6); gsl_vector_set(f, 1, x2 - 2.0e-6); gsl_vector_set(f, 2, x1*x2 - 2.0); return GSL_SUCCESS; } static int brown3_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set_zero(J); gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 1, 1, 1.0); gsl_matrix_set(J, 2, 0, x2); gsl_matrix_set(J, 2, 1, x1); return GSL_SUCCESS; } static gsl_multifit_function_fdf brown3_func = { &brown3_f, &brown3_df, NULL, brown3_N, brown3_P, NULL, 0, 0 }; static test_fdf_problem brown3_problem = { "brown_badly_scaled", brown3_x0, NULL, &brown3_epsrel, brown3_NTRIES, &brown3_checksol, &brown3_func }; gsl-doc-2.3/multifit/convergence.c0000664000175000017500000000756512616157443015307 0ustar eddedd/* multifit/convergence.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g); /* gsl_multifit_fdfsolver_test() Convergence tests for nonlinear minimization (1) |dx_i| <= xtol * (1 + |x_i|) for all i (2) || g .* x ||_inf <= gtol ||f||^2 (3) ||f(x+dx) - f(x)|| <= ftol * max(||f(x)||, 1) Inputs: s - fdfsolver xtol - tolerance for step size gtol - tolerance for gradient vector ftol - tolerance for residual vector info - (output) 1 - stopped by small x step 2 - stopped by small gradient 3 - stopped by small residual vector change */ int gsl_multifit_fdfsolver_test (const gsl_multifit_fdfsolver * s, const double xtol, const double gtol, const double ftol, int *info) { int status; double gnorm, fnorm, phi; *info = 0; status = gsl_multifit_test_delta(s->dx, s->x, xtol*xtol, xtol); if (status == GSL_SUCCESS) { *info = 1; return GSL_SUCCESS; } /* compute gradient g = J^T f */ (s->type->gradient) (s->state, s->g); /* compute gnorm = max_i( g_i * max(x_i, 1) ) */ gnorm = scaled_infnorm(s->x, s->g); /* compute fnorm = ||f|| */ fnorm = gsl_blas_dnrm2(s->f); phi = 0.5 * fnorm * fnorm; if (gnorm <= gtol * GSL_MAX(phi, 1.0)) { *info = 2; return GSL_SUCCESS; } #if 0 if (dfnorm <= ftol * GSL_MAX(fnorm, 1.0)) { *info = 3; return GSL_SUCCESS; } #endif return GSL_CONTINUE; } /* gsl_multifit_fdfsolver_test() */ 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 ; } static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g) { const size_t n = x->size; size_t i; double norm = 0.0; for (i = 0; i < n; ++i) { double xi = GSL_MAX(gsl_vector_get(x, i), 1.0); double gi = gsl_vector_get(g, i); double tmp = fabs(xi * gi); if (tmp > norm) norm = tmp; } return norm; } gsl-doc-2.3/multifit/test_exp1.c0000664000175000017500000000461212616157443014713 0ustar eddedd#define exp1_N 45 #define exp1_P 4 #define exp1_NTRIES 3 static double exp1_x0[exp1_P] = { -1.0, -2.0, 1.0, -1.0 }; static double exp1_epsrel = 1.0e-4; static double exp1_Y[exp1_N] = { 0.090542, 0.124569, 0.179367, 0.195654, 0.269707, 0.286027, 0.289892, 0.317475, 0.308191, 0.336995, 0.348371, 0.321337, 0.299423, 0.338972, 0.304763, 0.288903, 0.300820, 0.303974, 0.283987, 0.262078, 0.281593, 0.267531, 0.218926, 0.225572, 0.200594, 0.197375, 0.182440, 0.183892, 0.152285, 0.174028, 0.150874, 0.126220, 0.126266, 0.106384, 0.118923, 0.091868, 0.128926, 0.119273, 0.115997, 0.105831, 0.075261, 0.068387, 0.090823, 0.085205, 0.067203 }; static void exp1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.0e-2; const double exp1_x[exp1_P] = { -4.0, -5.0, 4.0, -4.0 }; /* approx */ gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < exp1_P; ++i) { gsl_test_rel(x[i], exp1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int exp1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double yi = exp1_Y[i]; double fi = yi - (x3*exp(x1*ti) + x4*exp(x2*ti)); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int exp1_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double term1 = exp(x1*ti); double term2 = exp(x2*ti); gsl_matrix_set(J, i, 0, -x3*ti*term1); gsl_matrix_set(J, i, 1, -x4*ti*term2); gsl_matrix_set(J, i, 2, -term1); gsl_matrix_set(J, i, 3, -term2); } return GSL_SUCCESS; } static gsl_multifit_function_fdf exp1_func = { &exp1_f, &exp1_df, NULL, exp1_N, exp1_P, NULL, 0, 0 }; static test_fdf_problem exp1_problem = { "expfit1", exp1_x0, NULL, &exp1_epsrel, exp1_NTRIES, &exp1_checksol, &exp1_func }; gsl-doc-2.3/multifit/test_brown1.c0000664000175000017500000000415712616157443015252 0ustar eddedd#define brown1_N 20 #define brown1_P 4 #define brown1_NTRIES 3 static double brown1_x0[brown1_P] = { 25, 5, -5, -1 }; static double brown1_epsrel = 1.0e-6; static void brown1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.582220162635628e+04; const double brown1_x[brown1_P] = { -1.159443990239263e+01, 1.320363005221244e+01, -4.034395456782477e-01, 2.367789088597534e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown1_P; ++i) { gsl_test_rel(x[i], brown1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown1_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 < brown1_N; 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; } static int brown1_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 < brown1_N; 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; } static gsl_multifit_function_fdf brown1_func = { &brown1_f, &brown1_df, NULL, brown1_N, brown1_P, NULL, 0, 0 }; static test_fdf_problem brown1_problem = { "brown_dennis", brown1_x0, NULL, &brown1_epsrel, brown1_NTRIES, &brown1_checksol, &brown1_func }; gsl-doc-2.3/multifit/test_osborne.c0000664000175000017500000000460313017642303015473 0ustar eddedd#define osborne_N 33 #define osborne_P 5 #define osborne_NTRIES 3 static double osborne_x0[osborne_P] = { 0.5, 1.5, -1.0, 0.01, 0.02 }; static double osborne_epsrel = 1.0e-8; static double osborne_Y[osborne_N] = { 0.844, 0.908, 0.932, 0.936, 0.925, 0.908, 0.881, 0.850, 0.818, 0.784, 0.751, 0.718, 0.685, 0.658, 0.628, 0.603, 0.580, 0.558, 0.538, 0.522, 0.506, 0.490, 0.478, 0.467, 0.457, 0.448, 0.438, 0.431, 0.424, 0.420, 0.414, 0.411, 0.406 }; static void osborne_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 5.464894697482687e-05; const double osborne_x[osborne_P] = { 3.754100521058740e-01, -99999.0, -99999.0, -99999.0, -99999.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* only the first model parameter is uniquely constrained */ gsl_test_rel(x[0], osborne_x[0], epsrel, "%s/%s i=0", sname, pname); } static int osborne_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double yi = osborne_Y[i]; double fi = yi - (x1 + x2*exp(-x4*ti) + x3*exp(-x5*ti)); gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int osborne_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double term1 = exp(-x4*ti); double term2 = exp(-x5*ti); gsl_matrix_set(J, i, 0, -1.0); gsl_matrix_set(J, i, 1, -term1); gsl_matrix_set(J, i, 2, -term2); gsl_matrix_set(J, i, 3, ti*x2*term1); gsl_matrix_set(J, i, 4, ti*x3*term2); } return GSL_SUCCESS; } static gsl_multifit_function_fdf osborne_func = { &osborne_f, &osborne_df, NULL, osborne_N, osborne_P, NULL, 0, 0 }; static test_fdf_problem osborne_problem = { "osborne", osborne_x0, NULL, &osborne_epsrel, osborne_NTRIES, &osborne_checksol, &osborne_func }; gsl-doc-2.3/multifit/test_thurber.c0000664000175000017500000000646712616157443015523 0ustar eddedd#define thurber_N 37 #define thurber_P 7 #define thurber_NTRIES 1 static double thurber_x0[thurber_P] = { 1000.0, 1000.0, 400.0, 40.0, 0.7, 0.3, 0.03 }; static double thurber_epsrel = 1.0e-6; static double thurber_sigma[thurber_P] = { 4.6647963344E+00, 3.9571156086E+01, 2.8698696102E+01, 5.5675370270E+00, 3.1333340687E-02, 1.4984928198E-02, 6.5842344623E-03 }; static double thurber_X[thurber_N] = { -3.067, -2.981, -2.921, -2.912, -2.840, -2.797, -2.702, -2.699, -2.633, -2.481, -2.363, -2.322, -1.501, -1.460, -1.274, -1.212, -1.100, -1.046, -0.915, -0.714, -0.566, -0.545, -0.400, -0.309, -0.109, -0.103, 0.010, 0.119, 0.377, 0.790, 0.963, 1.006, 1.115, 1.572, 1.841, 2.047, 2.200 }; static double thurber_F[thurber_N] = { 80.574, 84.248, 87.264, 87.195, 89.076, 89.608, 89.868, 90.101, 92.405, 95.854, 100.696, 101.060, 401.672, 390.724, 567.534, 635.316, 733.054, 759.087, 894.206, 990.785, 1090.109, 1080.914, 1122.643, 1178.351, 1260.531, 1273.514, 1288.339, 1327.543, 1353.863, 1414.509, 1425.208, 1421.384, 1442.962, 1464.350, 1468.705, 1447.894, 1457.628 }; static void thurber_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 5.6427082397E+03; const double thurber_x[thurber_P] = { 1.2881396800E+03, 1.4910792535E+03, 5.8323836877E+02, 7.5416644291E+01, 9.6629502864E-01, 3.9797285797E-01, 4.9727297349E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < thurber_P; ++i) { gsl_test_rel(x[i], thurber_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int thurber_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double yi; yi = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; yi /= 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; gsl_vector_set (f, i, yi - thurber_F[i]); } return GSL_SUCCESS; } static int thurber_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double d, n, d_sq; n = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; d = 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; d_sq = d * d; gsl_matrix_set (df, i, 0, 1.0 / d); gsl_matrix_set (df, i, 1, xi / d); gsl_matrix_set (df, i, 2, (xi * xi) / d); gsl_matrix_set (df, i, 3, (xi * xi * xi) / d); gsl_matrix_set (df, i, 4, -xi * n / d_sq); gsl_matrix_set (df, i, 5, -xi * xi * n / d_sq); gsl_matrix_set (df, i, 6, -xi * xi * xi * n / d_sq); } return GSL_SUCCESS; } static gsl_multifit_function_fdf thurber_func = { &thurber_f, &thurber_df, NULL, thurber_N, thurber_P, NULL, 0, 0 }; static test_fdf_problem thurber_problem = { "nist-thurber", thurber_x0, thurber_sigma, &thurber_epsrel, thurber_NTRIES, &thurber_checksol, &thurber_func }; gsl-doc-2.3/multifit/fdfridge.c0000664000175000017500000003116712616157443014556 0ustar eddedd/* multifit/fdfridge.c * * Copyright (C) 2014 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include static int fdfridge_f(const gsl_vector * x, void * params, gsl_vector * f); static int fdfridge_df(const gsl_vector * x, void * params, gsl_matrix * J); gsl_multifit_fdfridge * gsl_multifit_fdfridge_alloc (const gsl_multifit_fdfsolver_type * T, const size_t n, const size_t p) { gsl_multifit_fdfridge * work; work = calloc(1, sizeof(gsl_multifit_fdfridge)); if (work == NULL) { GSL_ERROR_VAL("failed to allocate workspace", GSL_ENOMEM, 0); } work->s = gsl_multifit_fdfsolver_alloc (T, n + p, p); if (work->s == NULL) { gsl_multifit_fdfridge_free(work); GSL_ERROR_VAL("failed to allocate space for fdfsolver", GSL_ENOMEM, 0); } work->wts = gsl_vector_alloc(n + p); if (work->wts == NULL) { gsl_multifit_fdfridge_free(work); GSL_ERROR_VAL("failed to allocate space for weight vector", GSL_ENOMEM, 0); } work->f = gsl_vector_alloc(n); if (work->f == NULL) { gsl_multifit_fdfridge_free(work); GSL_ERROR_VAL("failed to allocate space for f vector", GSL_ENOMEM, 0); } work->n = n; work->p = p; work->lambda = 0.0; /* initialize weights to 1 (for augmented portion of vector) */ gsl_vector_set_all(work->wts, 1.0); return work; } /* gsl_multifit_fdfridge_alloc() */ void gsl_multifit_fdfridge_free(gsl_multifit_fdfridge *work) { if (work->s) gsl_multifit_fdfsolver_free(work->s); if (work->wts) gsl_vector_free(work->wts); if (work->f) gsl_vector_free(work->f); free(work); } const char * gsl_multifit_fdfridge_name(const gsl_multifit_fdfridge * w) { return gsl_multifit_fdfsolver_name(w->s); } gsl_vector * gsl_multifit_fdfridge_position (const gsl_multifit_fdfridge * w) { return gsl_multifit_fdfsolver_position(w->s); } gsl_vector * gsl_multifit_fdfridge_residual (const gsl_multifit_fdfridge * w) { return gsl_multifit_fdfsolver_residual(w->s); } size_t gsl_multifit_fdfridge_niter (const gsl_multifit_fdfridge * w) { return w->s->niter; } int gsl_multifit_fdfridge_set (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const double lambda) { return gsl_multifit_fdfridge_wset(w, f, x, lambda, NULL); } /* gsl_multifit_fdfridge_set() */ int gsl_multifit_fdfridge_wset (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const double lambda, const gsl_vector * wts) { const size_t n = w->n; const size_t p = w->p; if (n != f->n || p != f->p) { GSL_ERROR ("function size does not match solver", GSL_EBADLEN); } else if (p != x->size) { GSL_ERROR ("vector length does not match solver", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match solver", GSL_EBADLEN); } else { int status; gsl_vector_view wv = gsl_vector_subvector(w->wts, 0, n); /* save user defined fdf */ w->fdf = f; /* build modified fdf for Tikhonov terms */ w->fdftik.f = &fdfridge_f; w->fdftik.df = &fdfridge_df; w->fdftik.n = n + p; /* add p for Tikhonov terms */ w->fdftik.p = p; w->fdftik.params = (void *) w; /* store damping parameter */ w->lambda = lambda; w->L = NULL; if (wts) { /* copy weight vector into user portion of w->wts */ gsl_vector_memcpy(&wv.vector, wts); status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, w->wts); } else { status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, NULL); } /* update function/Jacobian evaluations */ f->nevalf = w->fdftik.nevalf; f->nevaldf = w->fdftik.nevaldf; return status; } } /* gsl_multifit_fdfridge_wset() */ int gsl_multifit_fdfridge_set2 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * lambda) { return gsl_multifit_fdfridge_wset2(w, f, x, lambda, NULL); } /* gsl_multifit_fdfridge_set2() */ int gsl_multifit_fdfridge_wset2 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_vector * lambda, const gsl_vector * wts) { const size_t n = w->n; const size_t p = w->p; if (n != f->n || p != f->p) { GSL_ERROR ("function size does not match solver", GSL_EBADLEN); } else if (p != x->size) { GSL_ERROR ("vector length does not match solver", GSL_EBADLEN); } else if (lambda->size != p) { GSL_ERROR ("lambda vector size does not match solver", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match solver", GSL_EBADLEN); } else { int status; gsl_vector_view wv = gsl_vector_subvector(w->wts, 0, n); /* save user defined fdf */ w->fdf = f; w->fdf->nevalf = 0; w->fdf->nevaldf = 0; /* build modified fdf for Tikhonov terms */ w->fdftik.f = &fdfridge_f; w->fdftik.df = &fdfridge_df; w->fdftik.n = n + p; /* add p for Tikhonov terms */ w->fdftik.p = p; w->fdftik.params = (void *) w; /* store damping matrix */ w->lambda = 0.0; w->L_diag = lambda; w->L = NULL; if (wts) { /* copy weight vector into user portion */ gsl_vector_memcpy(&wv.vector, wts); status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, w->wts); } else { status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, NULL); } /* update function/Jacobian evaluations */ f->nevalf = w->fdftik.nevalf; f->nevaldf = w->fdftik.nevaldf; return status; } } /* gsl_multifit_fdfridge_wset2() */ int gsl_multifit_fdfridge_set3 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_matrix * L) { return gsl_multifit_fdfridge_wset3(w, f, x, L, NULL); } /* gsl_multifit_fdfridge_set3() */ int gsl_multifit_fdfridge_wset3 (gsl_multifit_fdfridge * w, gsl_multifit_function_fdf * f, const gsl_vector * x, const gsl_matrix * L, const gsl_vector * wts) { const size_t n = w->n; const size_t p = w->p; if (n != f->n || p != f->p) { GSL_ERROR ("function size does not match solver", GSL_EBADLEN); } else if (p != x->size) { GSL_ERROR ("vector length does not match solver", GSL_EBADLEN); } else if (L->size2 != p) { GSL_ERROR ("L matrix size2 does not match solver", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match solver", GSL_EBADLEN); } else { int status; gsl_vector_view wv = gsl_vector_subvector(w->wts, 0, n); /* save user defined fdf */ w->fdf = f; w->fdf->nevalf = 0; w->fdf->nevaldf = 0; /* build modified fdf for Tikhonov terms */ w->fdftik.f = &fdfridge_f; w->fdftik.df = &fdfridge_df; w->fdftik.n = n + p; /* add p for Tikhonov terms */ w->fdftik.p = p; w->fdftik.params = (void *) w; /* store damping matrix */ w->lambda = 0.0; w->L_diag = NULL; w->L = L; if (wts) { /* copy weight vector into user portion */ gsl_vector_memcpy(&wv.vector, wts); status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, w->wts); } else { status = gsl_multifit_fdfsolver_wset(w->s, &(w->fdftik), x, NULL); } /* update function/Jacobian evaluations */ f->nevalf = w->fdftik.nevalf; f->nevaldf = w->fdftik.nevaldf; return status; } } /* gsl_multifit_fdfridge_wset3() */ int gsl_multifit_fdfridge_iterate (gsl_multifit_fdfridge * w) { int status = gsl_multifit_fdfsolver_iterate(w->s); /* update function/Jacobian evaluations */ w->fdf->nevalf = w->fdftik.nevalf; w->fdf->nevaldf = w->fdftik.nevaldf; return status; } int gsl_multifit_fdfridge_driver (gsl_multifit_fdfridge * w, const size_t maxiter, const double xtol, const double gtol, const double ftol, int *info) { int status = gsl_multifit_fdfsolver_driver(w->s, maxiter, xtol, gtol, ftol, info); return status; } /* gsl_multifit_fdfridge_driver() */ /* fdfridge_f() Callback function to provide residuals, including extra p Tikhonov terms. The residual vector will have the form: f~ = [ f ] [ \lambda x ] where f is the user supplied residuals, x are the model parameters, and \lambda is the Tikhonov damping parameter Inputs: x - model parameters (size p) params - pointer to fdfridge workspace f - (output) (n+p) vector to store f~ */ static int fdfridge_f(const gsl_vector * x, void * params, gsl_vector * f) { int status; gsl_multifit_fdfridge *w = (gsl_multifit_fdfridge *) params; const size_t n = w->n; const size_t p = w->p; gsl_vector_view f_user = gsl_vector_subvector(f, 0, n); gsl_vector_view f_tik = gsl_vector_subvector(f, n, p); /* call user callback function to get residual vector f */ status = gsl_multifit_eval_wf(w->fdf, x, NULL, &f_user.vector); if (status) return status; if (w->L_diag) { /* store diag(L_diag) x in Tikhonov portion of f~ */ gsl_vector_memcpy(&f_tik.vector, x); gsl_vector_mul(&f_tik.vector, w->L_diag); } else if (w->L) { /* store Lx in Tikhonov portion of f~ */ gsl_blas_dgemv(CblasNoTrans, 1.0, w->L, x, 0.0, &f_tik.vector); } else { /* store \lambda x in Tikhonov portion of f~ */ gsl_vector_memcpy(&f_tik.vector, x); gsl_vector_scale(&f_tik.vector, w->lambda); } return GSL_SUCCESS; } /* fdfridge_f() */ static int fdfridge_df(const gsl_vector * x, void * params, gsl_matrix * J) { int status; gsl_multifit_fdfridge *w = (gsl_multifit_fdfridge *) params; const size_t n = w->n; const size_t p = w->p; gsl_matrix_view J_user = gsl_matrix_submatrix(J, 0, 0, n, p); gsl_matrix_view J_tik = gsl_matrix_submatrix(J, n, 0, p, p); gsl_vector_view diag = gsl_matrix_diagonal(&J_tik.matrix); /* compute Jacobian */ if (w->fdf->df) status = gsl_multifit_eval_wdf(w->fdf, x, NULL, &J_user.matrix); else { /* compute f(x) and then finite difference Jacobian */ status = gsl_multifit_eval_wf(w->fdf, x, NULL, w->f); status += gsl_multifit_fdfsolver_dif_df(x, NULL, w->fdf, w->f, &J_user.matrix); } if (status) return status; if (w->L_diag) { /* store diag(L_diag) in Tikhonov portion of J */ gsl_matrix_set_zero(&J_tik.matrix); gsl_vector_memcpy(&diag.vector, w->L_diag); } else if (w->L) { /* store L in Tikhonov portion of J */ gsl_matrix_memcpy(&J_tik.matrix, w->L); } else { /* store \lambda I_p in Tikhonov portion of J */ gsl_matrix_set_zero(&J_tik.matrix); gsl_vector_set_all(&diag.vector, w->lambda); } return GSL_SUCCESS; } /* fdfridge_df() */ gsl-doc-2.3/multifit/test_enso.c0000664000175000017500000001253312616157443015003 0ustar eddedd#define enso_N 168 #define enso_P 9 #define enso_NTRIES 1 static double enso_x0[enso_P] = { 10.0, 3.0, 0.5, 44.0, -1.5, 0.5, 26.0, 0.1, 1.5 }; static double enso_epsrel = 1.0e-3; static double enso_sigma[enso_P] = { 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 }; static double enso_F[enso_N] = { 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 }; static void enso_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 7.8853978668E+02; const double enso_x[enso_P] = { 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 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < enso_P; ++i) { gsl_test_rel(x[i], enso_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int enso_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; 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; } static int enso_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; 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; } static gsl_multifit_function_fdf enso_func = { &enso_f, &enso_df, NULL, enso_N, enso_P, NULL, 0, 0 }; static test_fdf_problem enso_problem = { "nist-ENSO", enso_x0, enso_sigma, &enso_epsrel, enso_NTRIES, &enso_checksol, &enso_func }; gsl-doc-2.3/multifit/test_meyer.c0000664000175000017500000000417512616157443015163 0ustar eddedd#define meyer_N 16 #define meyer_P 3 #define meyer_NTRIES 1 static double meyer_x0[meyer_P] = { 0.02, 4000.0, 250.0 }; static double meyer_epsrel = 1.0e-8; static double meyer_Y[meyer_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyer_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517053883e+01; const double meyer_x[meyer_P] = { 5.609636471049458e-03, 6.181346346283188e+03, 3.452236346240292e+02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyer_P; ++i) { gsl_test_rel(x[i], meyer_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyer_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double yi = meyer_Y[i]; double fi = x1 * exp(x2 / (ti + x3)) - yi; gsl_vector_set(f, i, fi); } return GSL_SUCCESS; } static int meyer_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double term1 = ti + x3; double term2 = exp(x2 / term1); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, x1*term2/term1); gsl_matrix_set(J, i, 2, -x1*x2*term2/(term1*term1)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf meyer_func = { &meyer_f, &meyer_df, NULL, meyer_N, meyer_P, NULL, 0, 0 }; static test_fdf_problem meyer_problem = { "meyer", meyer_x0, NULL, &meyer_epsrel, meyer_NTRIES, &meyer_checksol, &meyer_func }; gsl-doc-2.3/multifit/lmset.c0000664000175000017500000000373412616157443014127 0ustar eddeddstatic int set (void *vstate, const gsl_vector * swts, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, 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 *qtf = state->qtf; gsl_vector *diag = state->diag; gsl_vector *work1 = state->work1; gsl_permutation *perm = state->perm; int signum; /* start counting function and Jacobian evaluations */ fdf->nevalf = 0; fdf->nevaldf = 0; /* return immediately if evaluation raised error */ { int status; /* Evaluate function at x */ status = gsl_multifit_eval_wf (fdf, x, swts, f); if (status) return status; /* Evaluate Jacobian at x and store in state->r */ if (fdf->df) status = gsl_multifit_eval_wdf (fdf, x, swts, r); else /* finite difference approximation */ status = gsl_multifit_fdfsolver_dif_df(x, swts, fdf, f, r); gsl_matrix_memcpy(state->J, r); if (status) return status; } 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 (r, 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 = Q R P^T */ gsl_linalg_QRPT_decomp (r, tau, perm, &signum, work1); /* compute qtf = Q^T f */ gsl_vector_memcpy (qtf, f); gsl_linalg_QR_QTvec (r, tau, qtf); gsl_vector_set_zero (state->rptdx); gsl_vector_set_zero (state->w); /* Zero the trial vector, as in the alloc function */ gsl_vector_set_zero (state->f_trial); #ifdef DEBUG printf("r = "); gsl_matrix_fprintf(stdout, r, "%g"); printf("perm = "); gsl_permutation_fprintf(stdout, perm, "%d"); printf("tau = "); gsl_vector_fprintf(stdout, tau, "%g"); #endif return GSL_SUCCESS; } gsl-doc-2.3/multifit/test_rat42.c0000664000175000017500000000454312616157443014775 0ustar eddedd#define rat42_N 9 #define rat42_P 3 #define rat42_NTRIES 1 static double rat42_x0[rat42_P] = { 100.0, 1.0, 0.1 }; static double rat42_epsrel = 1.0e-7; static double rat42_sigma[rat42_P] = { 1.7340283401E+00, 8.8295217536E-02, 3.4465663377E-03 }; static double rat42_X[rat42_N] = { 9.0, 14.0, 21.0, 28.0, 42.0, 57.0, 63.0, 70.0, 79.0 }; static double rat42_F[rat42_N] = { 8.930, 10.800, 18.590, 22.330, 39.350, 56.110, 61.730, 64.620, 67.080 }; static void rat42_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.0565229338E+00; const double rat42_x[rat42_P] = { 7.2462237576E+01, 2.6180768402E+00, 6.7359200066E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat42_P; ++i) { gsl_test_rel(x[i], rat42_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat42_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double yi = b[0] / (1.0 + exp(b[1] - b[2]*xi)); gsl_vector_set (f, i, yi - rat42_F[i]); } return GSL_SUCCESS; } static int rat42_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double term1 = exp(b[1] - b[2]*xi); double term2 = 1.0 + term1; gsl_matrix_set (df, i, 0, 1.0 / term2); gsl_matrix_set (df, i, 1, -b[0] * term1 / (term2 * term2)); gsl_matrix_set (df, i, 2, b[0] * term1 * xi / (term2 * term2)); } return GSL_SUCCESS; } static gsl_multifit_function_fdf rat42_func = { &rat42_f, &rat42_df, NULL, rat42_N, rat42_P, NULL, 0, 0 }; static test_fdf_problem rat42_problem = { "nist-rat42", rat42_x0, rat42_sigma, &rat42_epsrel, rat42_NTRIES, &rat42_checksol, &rat42_func }; gsl-doc-2.3/multifit/test_estimator.c0000664000175000017500000000206412616157443016044 0ustar eddeddvoid 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"); } gsl-doc-2.3/multifit/gcv.c0000644000175000017500000002516213014632401013540 0ustar eddedd/* multifit/gcv.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * References: * * [1] P. C. Hansen, "Discrete Inverse Problems: Insight and Algorithms," * SIAM Press, 2010. */ #include #include #include #include #include #include #include #include typedef struct { const gsl_vector * S; const gsl_vector * UTy; double delta0; size_t np; gsl_vector * workp; } gcv_params; static double gcv_func(double lambda, void * params); /* gsl_multifit_linear_gcv_init() Initialize Generalized Cross Validation parameters Inputs: y - right hand side vector reg_param - (output) regularization parameters UTy - (output) U^T y delta0 - (output) delta0 work - workspace */ int gsl_multifit_linear_gcv_init(const gsl_vector * y, gsl_vector * reg_param, gsl_vector * UTy, double * delta0, gsl_multifit_linear_workspace * work) { const size_t n = y->size; if (n != work->n) { GSL_ERROR("y vector does not match workspace", GSL_EBADLEN); } else if (UTy->size != work->p) { GSL_ERROR ("UTy vector does not match workspace", GSL_EBADLEN); } else { const size_t p = work->p; gsl_matrix_view U = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); const double smax = gsl_vector_get(&S.vector, 0); const double smin = gsl_vector_get(&S.vector, p - 1); double dr; /* residual error from projection */ double normy = gsl_blas_dnrm2(y); double normUTy; /* compute projection UTy = U^T y */ gsl_blas_dgemv (CblasTrans, 1.0, &U.matrix, y, 0.0, UTy); normUTy = gsl_blas_dnrm2(UTy); /* dr = ||y||^2 - ||U^T y||^2 */ dr = (normy + normUTy) * (normy - normUTy); /* calculate regularization parameters */ gsl_multifit_linear_lreg(smin, smax, reg_param); if (n > p && dr > 0.0) *delta0 = dr; else *delta0 = 0.0; return GSL_SUCCESS; } } /* gsl_multifit_linear_gcv_curve() Calculate Generalized Cross Validation curve for a set of regularization parameters Inputs: reg_param - regularization parameters UTy - U^T y vector, size p delta0 - delta0 G - (output) GCV curve values work - workspace */ int gsl_multifit_linear_gcv_curve(const gsl_vector * reg_param, const gsl_vector * UTy, const double delta0, gsl_vector * G, gsl_multifit_linear_workspace * work) { const size_t n = work->n; const size_t p = work->p; const size_t N = reg_param->size; /* number of points on GCV curve */ if (UTy->size != p) { GSL_ERROR("UTy vector does not match workspace", GSL_EBADLEN); } else if (G->size != N) { GSL_ERROR ("size of reg_param and G vectors do not match", GSL_EBADLEN); } else { size_t i; gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); gsl_vector_view workp = gsl_matrix_subcolumn(work->QSI, 0, 0, p); gcv_params params; params.S = &S.vector; params.UTy = UTy; params.delta0 = delta0; params.np = n - p; params.workp = &workp.vector; for (i = 0; i < N; ++i) { double lambdai = gsl_vector_get(reg_param, i); double Gi = gcv_func(lambdai, ¶ms); gsl_vector_set(G, i, Gi); } return GSL_SUCCESS; } } /* gsl_multifit_linear_gcv_min() Find regularization parameter which minimizes GCV curve Inputs: reg_param - regularization parameters UTy - U^T y vector, size p G - GCV curve values delta0 - delta0 lambda - (output) optimal regularization parameter work - workspace */ int gsl_multifit_linear_gcv_min(const gsl_vector * reg_param, const gsl_vector * UTy, const gsl_vector * G, const double delta0, double * lambda, gsl_multifit_linear_workspace * work) { const size_t n = work->n; const size_t p = work->p; const size_t npts = reg_param->size; /* number of points on GCV curve */ if (UTy->size != p) { GSL_ERROR("UTy vector does not match workspace", GSL_EBADLEN); } else if (G->size != npts) { GSL_ERROR ("size of reg_param and G vectors do not match", GSL_EBADLEN); } else { int status; const size_t max_iter = 500; const double tol = 1.0e-4; gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); gsl_vector_view workp = gsl_matrix_subcolumn(work->QSI, 0, 0, p); gcv_params params; int idxG = (int) gsl_vector_min_index(G); double a = gsl_vector_get(reg_param, GSL_MIN(idxG + 1, (int) npts - 1)); double b = gsl_vector_get(reg_param, GSL_MAX(idxG - 1, 0)); double m = gsl_vector_get(reg_param, idxG); size_t iter = 0; gsl_function F; /* XXX FIXME */ gsl_min_fminimizer *min_workspace_p; if (idxG == 0 || idxG == ((int)npts - 1)) { /* the minimum is an endpoint of the curve, no need to search */ *lambda = m; return GSL_SUCCESS; } /* XXX FIXME */ min_workspace_p = gsl_min_fminimizer_alloc(gsl_min_fminimizer_brent); params.S = &S.vector; params.UTy = UTy; params.delta0 = delta0; params.np = n - p; params.workp = &workp.vector; F.function = gcv_func; F.params = ¶ms; gsl_min_fminimizer_set(min_workspace_p, &F, m, a, b); do { iter++; status = gsl_min_fminimizer_iterate(min_workspace_p); a = gsl_min_fminimizer_x_lower(min_workspace_p); b = gsl_min_fminimizer_x_upper(min_workspace_p); status = gsl_min_test_interval(a, b, 0.0, tol); } while (status == GSL_CONTINUE && iter < max_iter); if (status == GSL_SUCCESS) *lambda = gsl_min_fminimizer_minimum(min_workspace_p); else status = GSL_EMAXITER; gsl_min_fminimizer_free(min_workspace_p); return status; } } /* gsl_multifit_linear_gcv_calc() Calculate GCV function G(lambda) for given lambda Inputs: reg_param - regularization parameters UTy - U^T y vector, size p delta0 - delta0 G - (output) GCV curve values work - workspace */ double gsl_multifit_linear_gcv_calc(const double lambda, const gsl_vector * UTy, const double delta0, gsl_multifit_linear_workspace * work) { const size_t n = work->n; const size_t p = work->p; if (UTy->size != p) { GSL_ERROR_VAL("UTy vector does not match workspace", GSL_EBADLEN, 0.0); } else { gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); gsl_vector_view workp = gsl_matrix_subcolumn(work->QSI, 0, 0, p); gcv_params params; double G; params.S = &S.vector; params.UTy = UTy; params.delta0 = delta0; params.np = n - p; params.workp = &workp.vector; G = gcv_func(lambda, ¶ms); return G; } } /* gsl_multifit_linear_gcv() Calculate Generalized Cross Validation curve for a set of regularization parameters Inputs: y - right hand side vector reg_param - (output) regularization parameters G - (output) GCV curve values lambda - (output) optimal regularization parameter which minimizes GCV curve G_lambda - (output) G(lambda) value at optimal parameter work - workspace */ int gsl_multifit_linear_gcv(const gsl_vector * y, gsl_vector * reg_param, gsl_vector * G, double * lambda, double * G_lambda, gsl_multifit_linear_workspace * work) { const size_t n = y->size; const size_t N = G->size; /* number of points on GCV curve */ if (n != work->n) { GSL_ERROR("y vector does not match workspace", GSL_EBADLEN); } else if (reg_param->size != N) { GSL_ERROR ("size of reg_param and G vectors do not match", GSL_EBADLEN); } else { int status; const size_t p = work->p; gsl_vector_view UTy = gsl_vector_subvector(work->xt, 0, p); double delta0; status = gsl_multifit_linear_gcv_init(y, reg_param, &UTy.vector, &delta0, work); if (status) return status; status = gsl_multifit_linear_gcv_curve(reg_param, &UTy.vector, delta0, G, work); if (status) return status; status = gsl_multifit_linear_gcv_min(reg_param, &UTy.vector, G, delta0, lambda, work); if (status) return status; *G_lambda = gsl_multifit_linear_gcv_calc(*lambda, &UTy.vector, delta0, work); return GSL_SUCCESS; } } static double gcv_func(double lambda, void * params) { gcv_params * par = (gcv_params *) params; const gsl_vector *S = par->S; const gsl_vector *UTy = par->UTy; double delta0 = par->delta0; size_t np = par->np; gsl_vector *workp = par->workp; const size_t p = S->size; size_t i; double lambda_sq = lambda * lambda; double G, d, norm; double sumf = 0.0; /* compute workp = 1 - filter_factors */ for (i = 0; i < p; ++i) { double si = gsl_vector_get(S, i); double fi = lambda_sq / (si * si + lambda_sq); gsl_vector_set(workp, i, fi); sumf += fi; } d = (double)np + sumf; gsl_vector_mul(workp, UTy); norm = gsl_blas_dnrm2(workp); G = (norm*norm + delta0) / (d * d); return G; } gsl-doc-2.3/multifit/multireg.c0000644000175000017500000010724413016104346014617 0ustar eddedd/* multifit/multireg.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * References: * * [1] P. C. Hansen & D. P. O'Leary, "The use of the L-curve in * the regularization of discrete ill-posed problems", SIAM J. Sci. * Comput. 14 (1993), pp. 1487-1503. * * [2] P. C. Hansen, "Discrete Inverse Problems: Insight and Algorithms," * SIAM Press, 2010. */ #include #include #include #include #include #include #include #include "linear_common.c" int gsl_multifit_linear_solve (const double lambda, const gsl_matrix * X, const gsl_vector * y, gsl_vector * c, double *rnorm, double *snorm, gsl_multifit_linear_workspace * work) { size_t rank; int status; status = multifit_linear_solve(X, y, GSL_DBL_EPSILON, lambda, &rank, c, rnorm, snorm, work); return status; } /* gsl_multifit_linear_solve() */ /* gsl_multifit_linear_applyW() Apply weight matrix to (X,y) LS system Inputs: X - least squares matrix n-by-p w - weight vector n-by-1 or NULL for W = I y - right hand side n-by-1 WX - (output) sqrt(W) X, n-by-p Wy - (output) sqrt(W) y, n-by-1 Notes: 1) If w = NULL, on output WX = X and Wy = y 2) It is allowed for WX = X and Wy = y for in-place transform */ int gsl_multifit_linear_applyW(const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * WX, gsl_vector * Wy) { const size_t n = X->size1; const size_t p = X->size2; if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("weight vector does not match X", GSL_EBADLEN); } else if (n != WX->size1 || p != WX->size2) { GSL_ERROR("WX matrix dimensions do not match X", GSL_EBADLEN); } else if (n != Wy->size) { GSL_ERROR("Wy vector must be length n", GSL_EBADLEN); } else { size_t i; /* copy WX = X; Wy = y if distinct pointers */ if (WX != X) gsl_matrix_memcpy(WX, X); if (Wy != y) gsl_vector_memcpy(Wy, y); if (w != NULL) { /* construct WX = sqrt(W) X and Wy = sqrt(W) y */ for (i = 0; i < n; ++i) { double wi = gsl_vector_get(w, i); double swi; gsl_vector_view row = gsl_matrix_row(WX, i); double *yi = gsl_vector_ptr(Wy, i); if (wi < 0.0) wi = 0.0; swi = sqrt(wi); gsl_vector_scale(&row.vector, swi); *yi *= swi; } } return GSL_SUCCESS; } } /* gsl_multifit_linear_wstdform1() Using regularization matrix L = diag(l_1,l_2,...,l_p), transform to Tikhonov standard form: X~ = sqrt(W) X L^{-1} y~ = sqrt(W) y c~ = L c Inputs: L - Tikhonov matrix as a vector of diagonal elements p-by-1; or NULL for L = I X - least squares matrix n-by-p y - right hand side vector n-by-1 w - weight vector n-by-1; or NULL for W = I Xs - least squares matrix in standard form X~ n-by-p ys - right hand side vector in standard form y~ n-by-1 work - workspace Return: success/error Notes: 1) It is allowed for X = Xs and y = ys */ int gsl_multifit_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multifit_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (n > work->nmax || p > work->pmax) { GSL_ERROR("observation matrix larger than workspace", GSL_EBADLEN); } else if (L != NULL && p != L->size) { GSL_ERROR("L vector does not match X", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("weight vector does not match X", GSL_EBADLEN); } else if (n != Xs->size1 || p != Xs->size2) { GSL_ERROR("Xs matrix dimensions do not match X", GSL_EBADLEN); } else if (n != ys->size) { GSL_ERROR("ys vector must be length n", GSL_EBADLEN); } else { int status = GSL_SUCCESS; /* compute Xs = sqrt(W) X and ys = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, Xs, ys); if (status) return status; if (L != NULL) { size_t j; /* construct X~ = sqrt(W) X * L^{-1} matrix */ for (j = 0; j < p; ++j) { gsl_vector_view Xj = gsl_matrix_column(Xs, j); double lj = gsl_vector_get(L, j); if (lj == 0.0) { GSL_ERROR("L matrix is singular", GSL_EDOM); } gsl_vector_scale(&Xj.vector, 1.0 / lj); } } return status; } } /* gsl_multifit_linear_stdform1() Using regularization matrix L = diag(l_1,l_2,...,l_p), and W = I, transform to Tikhonov standard form: X~ = X L^{-1} y~ = y c~ = L c Inputs: L - Tikhonov matrix as a vector of diagonal elements p-by-1 X - least squares matrix n-by-p y - right hand side vector n-by-1 Xs - least squares matrix in standard form X~ n-by-p ys - right hand side vector in standard form y~ n-by-1 work - workspace Return: success/error Notes: 1) It is allowed for X = Xs */ int gsl_multifit_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multifit_linear_workspace * work) { int status; status = gsl_multifit_linear_wstdform1(L, X, NULL, y, Xs, ys, work); return status; } int gsl_multifit_linear_L_decomp (gsl_matrix * L, gsl_vector * tau) { const size_t m = L->size1; const size_t p = L->size2; int status; if (tau->size != GSL_MIN(m, p)) { GSL_ERROR("tau vector must be min(m,p)", GSL_EBADLEN); } else if (m >= p) { /* square or tall L matrix */ status = gsl_linalg_QR_decomp(L, tau); return status; } else { /* more columns than rows, compute qr(L^T) */ gsl_matrix_view LTQR = gsl_matrix_view_array(L->data, p, m); gsl_matrix *LT = gsl_matrix_alloc(p, m); /* XXX: use temporary storage due to difficulties in transforming * a rectangular matrix in-place */ gsl_matrix_transpose_memcpy(LT, L); gsl_matrix_memcpy(<QR.matrix, LT); gsl_matrix_free(LT); status = gsl_linalg_QR_decomp(<QR.matrix, tau); return status; } } /* gsl_multifit_linear_wstdform2() Using regularization matrix L which is m-by-p, transform to Tikhonov standard form. This routine is separated into two cases: Case 1: m >= p, here we can use the QR decomposition of L = QR, and note that ||L c|| = ||R c|| where R is p-by-p. Therefore, X~ = X R^{-1} is n-by-p y~ = y is n-by-1 c~ is p-by-1 M is not used Case 2: m < p X~ is (n - p + m)-by-m y~ is (n - p + m)-by-1 c~ is m-by-1 M is n-by-p (workspace) Inputs: LQR - output from gsl_multifit_linear_L_decomp() Ltau - output from gsl_multifit_linear_L_decomp() X - least squares matrix n-by-p w - weight vector n-by-1; or NULL for W = I y - right hand side vector n-by-1 Xs - (output) least squares matrix in standard form case 1: n-by-p case 2: (n - p + m)-by-m ys - (output) right hand side vector in standard form case 1: n-by-1 case 2: (n - p + m)-by-1 M - (output) workspace matrix needed to reconstruct solution vector case 1: not used case 2: n-by-p work - workspace Return: success/error Notes: 1) If m >= p, on output: Xs = X R^{-1} ys = y 2) If m < p, on output: M(:,1:pm) contains QR decomposition of A * K_o, needed to reconstruct solution vector, where pm = p - m; M(:,p) contains Householder scalars */ int gsl_multifit_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_matrix * M, gsl_multifit_linear_workspace * work) { const size_t m = LQR->size1; const size_t n = X->size1; const size_t p = X->size2; if (n > work->nmax || p > work->pmax) { GSL_ERROR("observation matrix larger than workspace", GSL_EBADLEN); } else if (p != LQR->size2) { GSL_ERROR("LQR and X matrices have different numbers of columns", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("weights vector must be length n", GSL_EBADLEN); } else if (m >= p) /* square or tall L matrix */ { /* the sizes of Xs and ys depend on whether m >= p or m < p */ if (n != Xs->size1 || p != Xs->size2) { GSL_ERROR("Xs matrix must be n-by-p", GSL_EBADLEN); } else if (n != ys->size) { GSL_ERROR("ys vector must have length n", GSL_EBADLEN); } else { int status; size_t i; gsl_matrix_const_view R = gsl_matrix_const_submatrix(LQR, 0, 0, p, p); /* compute Xs = sqrt(W) X and ys = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, Xs, ys); if (status) return status; /* compute X~ = X R^{-1} using QR decomposition of L */ for (i = 0; i < n; ++i) { gsl_vector_view v = gsl_matrix_row(Xs, i); /* solve: R^T y = X_i */ gsl_blas_dtrsv(CblasUpper, CblasTrans, CblasNonUnit, &R.matrix, &v.vector); } return GSL_SUCCESS; } } else /* L matrix with m < p */ { const size_t pm = p - m; const size_t npm = n - pm; /* * This code closely follows section 2.6.1 of Hansen's * "Regularization Tools" manual */ if (npm != Xs->size1 || m != Xs->size2) { GSL_ERROR("Xs matrix must be (n-p+m)-by-m", GSL_EBADLEN); } else if (npm != ys->size) { GSL_ERROR("ys vector must be of length (n-p+m)", GSL_EBADLEN); } else if (n != M->size1 || p != M->size2) { GSL_ERROR("M matrix must be n-by-p", GSL_EBADLEN); } else { int status; gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_vector_view b = gsl_vector_subvector(work->t, 0, n); gsl_matrix_view LTQR = gsl_matrix_view_array(LQR->data, p, m); /* qr(L^T) */ gsl_matrix_view Rp = gsl_matrix_view_array(LQR->data, m, m); /* R factor of L^T */ gsl_vector_const_view LTtau = gsl_vector_const_subvector(Ltau, 0, m); /* * M(:,1:p-m) will hold QR decomposition of A K_o; M(:,p) will hold * Householder scalars */ gsl_matrix_view MQR = gsl_matrix_submatrix(M, 0, 0, n, pm); gsl_vector_view Mtau = gsl_matrix_subcolumn(M, p - 1, 0, GSL_MIN(n, pm)); gsl_matrix_view AKo, AKp, HqTAKp; gsl_vector_view v; size_t i; /* compute A = sqrt(W) X and b = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, &A.matrix, &b.vector); if (status) return status; /* compute: A <- A K = [ A K_p ; A K_o ] */ gsl_linalg_QR_matQ(<QR.matrix, <tau.vector, &A.matrix); AKp = gsl_matrix_submatrix(&A.matrix, 0, 0, n, m); AKo = gsl_matrix_submatrix(&A.matrix, 0, m, n, pm); /* compute QR decomposition [H,T] = qr(A * K_o) and store in M */ gsl_matrix_memcpy(&MQR.matrix, &AKo.matrix); gsl_linalg_QR_decomp(&MQR.matrix, &Mtau.vector); /* AKp currently contains A K_p; apply H^T from the left to get H^T A K_p */ gsl_linalg_QR_QTmat(&MQR.matrix, &Mtau.vector, &AKp.matrix); /* the last npm rows correspond to H_q^T A K_p */ HqTAKp = gsl_matrix_submatrix(&AKp.matrix, pm, 0, npm, m); /* solve: Xs R_p^T = H_q^T A K_p for Xs */ gsl_matrix_memcpy(Xs, &HqTAKp.matrix); for (i = 0; i < npm; ++i) { gsl_vector_view x = gsl_matrix_row(Xs, i); gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &Rp.matrix, &x.vector); } /* * compute: ys = H_q^T b; this is equivalent to computing * the last q elements of H^T b (q = npm) */ v = gsl_vector_subvector(&b.vector, pm, npm); gsl_linalg_QR_QTvec(&MQR.matrix, &Mtau.vector, &b.vector); gsl_vector_memcpy(ys, &v.vector); return GSL_SUCCESS; } } } int gsl_multifit_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_matrix * M, gsl_multifit_linear_workspace * work) { int status; status = gsl_multifit_linear_wstdform2(LQR, Ltau, X, NULL, y, Xs, ys, M, work); return status; } /* gsl_multifit_linear_genform1() Backtransform regularized solution vector using matrix L = diag(L) */ int gsl_multifit_linear_genform1 (const gsl_vector * L, const gsl_vector * cs, gsl_vector * c, gsl_multifit_linear_workspace * work) { if (L->size > work->pmax) { GSL_ERROR("L vector does not match workspace", GSL_EBADLEN); } else if (L->size != cs->size) { GSL_ERROR("cs vector does not match L", GSL_EBADLEN); } else if (L->size != c->size) { GSL_ERROR("c vector does not match L", GSL_EBADLEN); } else { /* compute true solution vector c = L^{-1} c~ */ gsl_vector_memcpy(c, cs); gsl_vector_div(c, L); return GSL_SUCCESS; } } /* gsl_multifit_linear_wgenform2() Backtransform regularized solution vector in standard form to recover original vector Inputs: LQR - output from gsl_multifit_linear_L_decomp() Ltau - output from gsl_multifit_linear_L_decomp() X - original least squares matrix n-by-p w - original weight vector n-by-1 or NULL for W = I y - original rhs vector n-by-1 cs - standard form solution vector c - (output) original solution vector p-by-1 M - matrix computed by gsl_multifit_linear_wstdform2() work - workspace */ int gsl_multifit_linear_wgenform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, const gsl_vector * cs, const gsl_matrix * M, gsl_vector * c, gsl_multifit_linear_workspace * work) { const size_t m = LQR->size1; const size_t n = X->size1; const size_t p = X->size2; if (n > work->nmax || p > work->pmax) { GSL_ERROR("X matrix does not match workspace", GSL_EBADLEN); } else if (p != LQR->size2) { GSL_ERROR("LQR matrix does not match X", GSL_EBADLEN); } else if (p != c->size) { GSL_ERROR("c vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("w vector does not match X", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (m >= p) /* square or tall L matrix */ { if (p != cs->size) { GSL_ERROR("cs vector must be length p", GSL_EBADLEN); } else { int s; gsl_matrix_const_view R = gsl_matrix_const_submatrix(LQR, 0, 0, p, p); /* R factor of L */ /* solve R c = cs for true solution c, using QR decomposition of L */ gsl_vector_memcpy(c, cs); s = gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &R.matrix, c); return s; } } else /* rectangular L matrix with m < p */ { if (m != cs->size) { GSL_ERROR("cs vector must be length m", GSL_EBADLEN); } else if (n != M->size1 || p != M->size2) { GSL_ERROR("M matrix must be size n-by-p", GSL_EBADLEN); } else { int status; const size_t pm = p - m; gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_vector_view b = gsl_vector_subvector(work->t, 0, n); gsl_matrix_view Rp = gsl_matrix_view_array(LQR->data, m, m); /* R_p */ gsl_matrix_view LTQR = gsl_matrix_view_array(LQR->data, p, m); gsl_vector_const_view LTtau = gsl_vector_const_subvector(Ltau, 0, m); gsl_matrix_const_view MQR = gsl_matrix_const_submatrix(M, 0, 0, n, pm); gsl_vector_const_view Mtau = gsl_matrix_const_subcolumn(M, p - 1, 0, GSL_MIN(n, pm)); gsl_matrix_const_view To = gsl_matrix_const_submatrix(&MQR.matrix, 0, 0, pm, pm); gsl_vector_view workp = gsl_vector_subvector(work->xt, 0, p); gsl_vector_view v1, v2; /* compute A = sqrt(W) X and b = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, &A.matrix, &b.vector); if (status) return status; /* initialize c to zero */ gsl_vector_set_zero(c); /* compute c = L_inv cs = K_p R_p^{-T} cs */ /* set c(1:m) = R_p^{-T} cs */ v1 = gsl_vector_subvector(c, 0, m); gsl_vector_memcpy(&v1.vector, cs); gsl_blas_dtrsv(CblasUpper, CblasTrans, CblasNonUnit, &Rp.matrix, &v1.vector); /* c <- K R_p^{-T} cs = [ K_p R_p^{_T} cs ; 0 ] */ gsl_linalg_QR_Qvec(<QR.matrix, <tau.vector, c); /* compute: b1 = b - A L_inv cs */ gsl_blas_dgemv(CblasNoTrans, -1.0, &A.matrix, c, 1.0, &b.vector); /* compute: b2 = H^T b1 */ gsl_linalg_QR_QTvec(&MQR.matrix, &Mtau.vector, &b.vector); /* compute: b3 = T_o^{-1} b2 */ v1 = gsl_vector_subvector(&b.vector, 0, pm); gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &To.matrix, &v1.vector); /* compute: b4 = K_o b3 */ gsl_vector_set_zero(&workp.vector); v2 = gsl_vector_subvector(&workp.vector, m, pm); gsl_vector_memcpy(&v2.vector, &v1.vector); gsl_linalg_QR_Qvec(<QR.matrix, <tau.vector, &workp.vector); /* final solution vector */ gsl_vector_add(c, &workp.vector); return GSL_SUCCESS; } } } int gsl_multifit_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * cs, const gsl_matrix * M, gsl_vector * c, gsl_multifit_linear_workspace * work) { int status; status = gsl_multifit_linear_wgenform2(LQR, Ltau, X, NULL, y, cs, M, c, work); return status; } /* gsl_multifit_linear_lreg() Calculate regularization parameters to use in L-curve analysis Inputs: smin - smallest singular value of LS system smax - largest singular value of LS system > 0 reg_param - (output) vector of regularization parameters derived from singular values Return: success/error */ int gsl_multifit_linear_lreg (const double smin, const double smax, gsl_vector * reg_param) { if (smax <= 0.0) { GSL_ERROR("smax must be positive", GSL_EINVAL); } else { const size_t N = reg_param->size; /* smallest regularization parameter */ const double smin_ratio = 16.0 * GSL_DBL_EPSILON; const double new_smin = GSL_MAX(smin, smax*smin_ratio); double ratio; size_t i; gsl_vector_set(reg_param, N - 1, new_smin); /* ratio so that reg_param(1) = s(1) */ ratio = pow(smax / new_smin, 1.0 / ((double)N - 1.0)); /* calculate the regularization parameters */ for (i = N - 1; i > 0 && i--; ) { double rp1 = gsl_vector_get(reg_param, i + 1); gsl_vector_set(reg_param, i, ratio * rp1); } return GSL_SUCCESS; } } /* gsl_multifit_linear_lcurve() Calculate L-curve using regularization parameters estimated from singular values of least squares matrix Inputs: y - right hand side vector reg_param - (output) vector of regularization parameters derived from singular values rho - (output) vector of residual norms ||y - X c|| eta - (output) vector of solution norms ||lambda c|| work - workspace Return: success/error Notes: 1) SVD of X must be computed first by calling multifit_linear_svd(); work->n and work->p are initialized by this function */ int gsl_multifit_linear_lcurve (const gsl_vector * y, gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, gsl_multifit_linear_workspace * work) { const size_t n = y->size; const size_t N = rho->size; /* number of points on L-curve */ if (n != work->n) { GSL_ERROR("y vector does not match workspace", GSL_EBADLEN); } else if (N < 3) { GSL_ERROR ("at least 3 points are needed for L-curve analysis", GSL_EBADLEN); } else if (N != eta->size) { GSL_ERROR ("size of rho and eta vectors do not match", GSL_EBADLEN); } else if (reg_param->size != eta->size) { GSL_ERROR ("size of reg_param and eta vectors do not match", GSL_EBADLEN); } else { int status = GSL_SUCCESS; const size_t p = work->p; size_t i, j; gsl_matrix_view A = gsl_matrix_submatrix(work->A, 0, 0, n, p); gsl_vector_view S = gsl_vector_subvector(work->S, 0, p); gsl_vector_view xt = gsl_vector_subvector(work->xt, 0, p); gsl_vector_view workp = gsl_matrix_subcolumn(work->QSI, 0, 0, p); gsl_vector_view workp2 = gsl_vector_subvector(work->D, 0, p); /* D isn't used for regularized problems */ const double smax = gsl_vector_get(&S.vector, 0); const double smin = gsl_vector_get(&S.vector, p - 1); double dr; /* residual error from projection */ double normy = gsl_blas_dnrm2(y); double normUTy; /* compute projection xt = U^T y */ gsl_blas_dgemv (CblasTrans, 1.0, &A.matrix, y, 0.0, &xt.vector); normUTy = gsl_blas_dnrm2(&xt.vector); dr = normy*normy - normUTy*normUTy; /* calculate regularization parameters */ gsl_multifit_linear_lreg(smin, smax, reg_param); for (i = 0; i < N; ++i) { double lambda = gsl_vector_get(reg_param, i); double lambda_sq = lambda * lambda; for (j = 0; j < p; ++j) { double sj = gsl_vector_get(&S.vector, j); double xtj = gsl_vector_get(&xt.vector, j); double f = sj / (sj*sj + lambda_sq); gsl_vector_set(&workp.vector, j, f * xtj); gsl_vector_set(&workp2.vector, j, (1.0 - sj*f) * xtj); } gsl_vector_set(eta, i, gsl_blas_dnrm2(&workp.vector)); gsl_vector_set(rho, i, gsl_blas_dnrm2(&workp2.vector)); } if (n > p && dr > 0.0) { /* add correction to residual norm (see eqs 6-7 of [1]) */ for (i = 0; i < N; ++i) { double rhoi = gsl_vector_get(rho, i); double *ptr = gsl_vector_ptr(rho, i); *ptr = sqrt(rhoi*rhoi + dr); } } /* restore D to identity matrix */ gsl_vector_set_all(work->D, 1.0); return status; } } /* gsl_multifit_linear_lcurve() */ /* gsl_multifit_linear_lcorner() Determine point on L-curve of maximum curvature. For each set of 3 points on the L-curve, the circle which passes through the 3 points is computed. The radius of the circle is then used as an estimate of the curvature at the middle point. The point with maximum curvature is then selected. Inputs: rho - vector of residual norms ||A x - b|| eta - vector of solution norms ||L x|| idx - (output) index i such that (log(rho(i)),log(eta(i))) is the point of maximum curvature Return: success/error */ int gsl_multifit_linear_lcorner(const gsl_vector *rho, const gsl_vector *eta, size_t *idx) { const size_t n = rho->size; if (n < 3) { GSL_ERROR ("at least 3 points are needed for L-curve analysis", GSL_EBADLEN); } else if (n != eta->size) { GSL_ERROR ("size of rho and eta vectors do not match", GSL_EBADLEN); } else { int s = GSL_SUCCESS; size_t i; double x1, y1; /* first point of triangle on L-curve */ double x2, y2; /* second point of triangle on L-curve */ double rmin = -1.0; /* minimum radius of curvature */ /* initial values */ x1 = log(gsl_vector_get(rho, 0)); y1 = log(gsl_vector_get(eta, 0)); x2 = log(gsl_vector_get(rho, 1)); y2 = log(gsl_vector_get(eta, 1)); for (i = 1; i < n - 1; ++i) { /* * The points (x1,y1), (x2,y2), (x3,y3) are the previous, * current, and next point on the L-curve. We will find * the circle which fits these 3 points and take its radius * as an estimate of the curvature at this point. */ double x3 = log(gsl_vector_get(rho, i + 1)); double y3 = log(gsl_vector_get(eta, i + 1)); double x21 = x2 - x1; double y21 = y2 - y1; double x31 = x3 - x1; double y31 = y3 - y1; double h21 = x21*x21 + y21*y21; double h31 = x31*x31 + y31*y31; double d = fabs(2.0 * (x21*y31 - x31*y21)); double r = sqrt(h21*h31*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))) / d; /* if d =~ 0 then there are nearly colinear points */ if (gsl_finite(r)) { /* check for smallest radius of curvature */ if (r < rmin || rmin < 0.0) { rmin = r; *idx = i; } } /* update previous/current L-curve values */ x1 = x2; y1 = y2; x2 = x3; y2 = y3; } /* check if a minimum radius was found */ if (rmin < 0.0) { /* possibly co-linear points */ GSL_ERROR("failed to find minimum radius", GSL_EINVAL); } return s; } } /* gsl_multifit_linear_lcorner() */ /* gsl_multifit_linear_lcorner2() Determine point on L-curve (lambda^2, ||c||^2) of maximum curvature. For each set of 3 points on the L-curve, the circle which passes through the 3 points is computed. The radius of the circle is then used as an estimate of the curvature at the middle point. The point with maximum curvature is then selected. This routine is based on the paper M. Rezghi and S. M. Hosseini, "A new variant of L-curve for Tikhonov regularization", J. Comp. App. Math., 231 (2009). Inputs: reg_param - vector of regularization parameters eta - vector of solution norms ||L x|| idx - (output) index i such that (lambda(i)^2,eta(i)^2) is the point of maximum curvature Return: success/error */ int gsl_multifit_linear_lcorner2(const gsl_vector *reg_param, const gsl_vector *eta, size_t *idx) { const size_t n = reg_param->size; if (n < 3) { GSL_ERROR ("at least 3 points are needed for L-curve analysis", GSL_EBADLEN); } else if (n != eta->size) { GSL_ERROR ("size of reg_param and eta vectors do not match", GSL_EBADLEN); } else { int s = GSL_SUCCESS; size_t i; double x1, y1; /* first point of triangle on L-curve */ double x2, y2; /* second point of triangle on L-curve */ double rmin = -1.0; /* minimum radius of curvature */ /* initial values */ x1 = gsl_vector_get(reg_param, 0); x1 *= x1; y1 = gsl_vector_get(eta, 0); y1 *= y1; x2 = gsl_vector_get(reg_param, 1); x2 *= x2; y2 = gsl_vector_get(eta, 1); y2 *= y2; for (i = 1; i < n - 1; ++i) { /* * The points (x1,y1), (x2,y2), (x3,y3) are the previous, * current, and next point on the L-curve. We will find * the circle which fits these 3 points and take its radius * as an estimate of the curvature at this point. */ double lamip1 = gsl_vector_get(reg_param, i + 1); double etaip1 = gsl_vector_get(eta, i + 1); double x3 = lamip1 * lamip1; double y3 = etaip1 * etaip1; double x21 = x2 - x1; double y21 = y2 - y1; double x31 = x3 - x1; double y31 = y3 - y1; double h21 = x21*x21 + y21*y21; double h31 = x31*x31 + y31*y31; double d = fabs(2.0 * (x21*y31 - x31*y21)); double r = sqrt(h21*h31*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))) / d; /* if d =~ 0 then there are nearly colinear points */ if (gsl_finite(r)) { /* check for smallest radius of curvature */ if (r < rmin || rmin < 0.0) { rmin = r; *idx = i; } } /* update previous/current L-curve values */ x1 = x2; y1 = y2; x2 = x3; y2 = y3; } /* check if a minimum radius was found */ if (rmin < 0.0) { /* possibly co-linear points */ GSL_ERROR("failed to find minimum radius", GSL_EINVAL); } return s; } } /* gsl_multifit_linear_lcorner2() */ #define GSL_MULTIFIT_MAXK 100 /* gsl_multifit_linear_L() Compute discrete approximation to derivative operator of order k on a regular grid of p points, ie: L is (p-k)-by-p */ int gsl_multifit_linear_Lk(const size_t p, const size_t k, gsl_matrix *L) { if (p <= k) { GSL_ERROR("p must be larger than derivative order", GSL_EBADLEN); } else if (k >= GSL_MULTIFIT_MAXK - 1) { GSL_ERROR("derivative order k too large", GSL_EBADLEN); } else if (p - k != L->size1 || p != L->size2) { GSL_ERROR("L matrix must be (p-k)-by-p", GSL_EBADLEN); } else { double c_data[GSL_MULTIFIT_MAXK]; gsl_vector_view cv = gsl_vector_view_array(c_data, k + 1); size_t i, j; /* zeroth derivative */ if (k == 0) { gsl_matrix_set_identity(L); return GSL_SUCCESS; } gsl_matrix_set_zero(L); gsl_vector_set_zero(&cv.vector); gsl_vector_set(&cv.vector, 0, -1.0); gsl_vector_set(&cv.vector, 1, 1.0); for (i = 1; i < k; ++i) { double cjm1 = 0.0; for (j = 0; j < k + 1; ++j) { double cj = gsl_vector_get(&cv.vector, j); gsl_vector_set(&cv.vector, j, cjm1 - cj); cjm1 = cj; } } /* build L, the c_i are the entries on the diagonals */ for (i = 0; i < k + 1; ++i) { gsl_vector_view v = gsl_matrix_superdiagonal(L, i); double ci = gsl_vector_get(&cv.vector, i); gsl_vector_set_all(&v.vector, ci); } return GSL_SUCCESS; } } /* gsl_multifit_linear_Lk() */ /* gsl_multifit_linear_Lsobolev() Construct Sobolev smoothing norm operator L = [ a_0 I; a_1 L_1; a_2 L_2; ...; a_k L_k ] by computing the Cholesky factor of L^T L Inputs: p - number of columns of L kmax - maximum derivative order (< p) alpha - vector of weights; alpha_k multiplies L_k, size kmax + 1 L - (output) upper triangular Sobolev matrix p-by-p, stored in upper triangle work - workspace Notes: 1) work->Q is used to store intermediate L_k matrices */ int gsl_multifit_linear_Lsobolev(const size_t p, const size_t kmax, const gsl_vector *alpha, gsl_matrix *L, gsl_multifit_linear_workspace *work) { if (p > work->pmax) { GSL_ERROR("p is larger than workspace", GSL_EBADLEN); } else if (p <= kmax) { GSL_ERROR("p must be larger than derivative order", GSL_EBADLEN); } else if (kmax + 1 != alpha->size) { GSL_ERROR("alpha must be size kmax + 1", GSL_EBADLEN); } else if (p != L->size1) { GSL_ERROR("L matrix is wrong size", GSL_EBADLEN); } else if (L->size1 != L->size2) { GSL_ERROR("L matrix is not square", GSL_ENOTSQR); } else { int s; size_t j, k; gsl_vector_view d = gsl_matrix_diagonal(L); const double alpha0 = gsl_vector_get(alpha, 0); /* initialize L to alpha0^2 I */ gsl_matrix_set_zero(L); gsl_vector_add_constant(&d.vector, alpha0 * alpha0); for (k = 1; k <= kmax; ++k) { gsl_matrix_view Lk = gsl_matrix_submatrix(work->Q, 0, 0, p - k, p); double ak = gsl_vector_get(alpha, k); /* compute a_k L_k */ s = gsl_multifit_linear_Lk(p, k, &Lk.matrix); if (s) return s; gsl_matrix_scale(&Lk.matrix, ak); /* LTL += L_k^T L_k */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &Lk.matrix, 1.0, L); } s = gsl_linalg_cholesky_decomp(L); if (s) return s; /* copy Cholesky factor to upper triangle and zero out bottom */ gsl_matrix_transpose_tricpy('L', 1, L, L); for (j = 0; j < p; ++j) { for (k = 0; k < j; ++k) gsl_matrix_set(L, j, k, 0.0); } return GSL_SUCCESS; } } gsl-doc-2.3/multifit/test.c0000664000175000017500000000301413022046402013731 0ustar eddedd/* multifit/test.c * * Copyright (C) 2007, 2013 Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include "test_linear.c" #include "test_nonlinear.c" int main (void) { gsl_ieee_env_setup(); /* test linear regression */ test_linear(); #if 0 /* fdfsolver interface now deprecated */ /* test nonlinear regression */ test_nonlinear(); #endif exit (gsl_test_summary ()); } gsl-doc-2.3/multifit/test_wnlin.c0000664000175000017500000000744412757130754015175 0ustar eddedd#define wnlin_N 40 #define wnlin_P 3 #define wnlin_NTRIES 1 static double wnlin_x0[wnlin_P] = { 1.0, 0.0, 0.0 }; static double wnlin_epsrel = 1.0e-8; static int wnlin_internal_weight = 1; /* data */ static double wnlin_Y[wnlin_N] = { 6.08035e+00, 5.47552e+00, 5.94654e+00, 5.04920e+00, 4.78568e+00, 3.51748e+00, 2.84671e+00, 3.24634e+00, 3.23395e+00, 3.30385e+00, 2.83439e+00, 2.31891e+00, 2.33858e+00, 2.40559e+00, 2.41856e+00, 1.99966e+00, 1.88127e+00, 1.91477e+00, 1.70415e+00, 1.60316e+00, 1.77937e+00, 1.55302e+00, 1.50903e+00, 1.36364e+00, 1.36873e+00, 1.41954e+00, 1.37778e+00, 1.23573e+00, 1.28524e+00, 1.46327e+00, 1.22315e+00, 1.19330e+00, 1.18717e+00, 8.83172e-01, 1.23424e+00, 1.14683e+00, 1.11091e+00, 1.20396e+00, 1.28722e+00, 1.05801e+00 }; /* weights */ static double wnlin_W[wnlin_N] = { 2.77778e+00, 3.27690e+00, 3.85426e+00, 4.51906e+00, 5.28083e+00, 6.14919e+00, 7.13370e+00, 8.24349e+00, 9.48703e+00, 1.08717e+01, 1.24036e+01, 1.40869e+01, 1.59238e+01, 1.79142e+01, 2.00553e+01, 2.23415e+01, 2.47646e+01, 2.73137e+01, 2.99753e+01, 3.27337e+01, 3.55714e+01, 3.84696e+01, 4.14085e+01, 4.43678e+01, 4.73278e+01, 5.02690e+01, 5.31731e+01, 5.60234e+01, 5.88046e+01, 6.15036e+01, 6.41092e+01, 6.66121e+01, 6.90054e+01, 7.12839e+01, 7.34442e+01, 7.54848e+01, 7.74053e+01, 7.92069e+01, 8.08918e+01, 8.24632e+01 }; static void wnlin_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 29.7481259665713758; const double wnlin_x[wnlin_P] = { 5.17378551196259195, 0.111041758006851149, 1.05282724070446099 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wnlin_P; ++i) { gsl_test_rel(x[i], wnlin_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wnlin_f (const gsl_vector *x, void *params, gsl_vector *f) { int *iptr = (int *) params; int doweight = iptr ? *iptr : 0; double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); double b = gsl_vector_get (x, 2); size_t i; /* model Yi = A * exp(-lambda * i) + b */ for (i = 0; i < wnlin_N; i++) { double ti = i; double yi = wnlin_Y[i]; double swi = sqrt(wnlin_W[i]); double Mi = A * exp (-lambda * ti) + b; if (doweight) gsl_vector_set (f, i, swi * (Mi - yi)); else gsl_vector_set (f, i, Mi - yi); } return GSL_SUCCESS; } static int wnlin_df (const gsl_vector *x, void *params, gsl_matrix *df) { int *iptr = (int *) params; int doweight = iptr ? *iptr : 0; double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); size_t i; for (i = 0; i < wnlin_N; i++) { gsl_vector_view v = gsl_matrix_row(df, i); double ti = i; double swi = sqrt(wnlin_W[i]); double e = exp(-lambda * ti); gsl_vector_set(&v.vector, 0, e); gsl_vector_set(&v.vector, 1, -ti * A * e); gsl_vector_set(&v.vector, 2, 1.0); if (doweight) gsl_vector_scale(&v.vector, swi); } return GSL_SUCCESS; } static gsl_multifit_function_fdf wnlin_func1 = { &wnlin_f, &wnlin_df, NULL, wnlin_N, wnlin_P, (void *) &wnlin_internal_weight, 0, 0 }; static gsl_multifit_function_fdf wnlin_func2 = { &wnlin_f, &wnlin_df, NULL, wnlin_N, wnlin_P, NULL, 0, 0 }; static test_fdf_problem wnlin_problem1 = { "wnlin_internal_weights", wnlin_x0, NULL, &wnlin_epsrel, wnlin_NTRIES, &wnlin_checksol, &wnlin_func1 }; static test_fdf_problem wnlin_problem2 = { "wnlin_external_weights", wnlin_x0, NULL, &wnlin_epsrel, wnlin_NTRIES, &wnlin_checksol, &wnlin_func2 }; gsl-doc-2.3/gsl_mode.h0000664000175000017500000000454512616157443012745 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ #include #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 INLINE_FUN unsigned int GSL_MODE_PREC(gsl_mode_t mt); INLINE_FUN 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__ */ gsl-doc-2.3/deriv/0000755000175000017500000000000013022553155012072 5ustar eddeddgsl-doc-2.3/deriv/Makefile.am0000664000175000017500000000105512616157443014141 0ustar eddeddnoinst_LTLIBRARIES = libgslderiv.la AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/deriv/Makefile.in0000644000175000017500000010365613022372405014147 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslderiv_la_LIBADD = am_libgslderiv_la_OBJECTS = deriv.lo libgslderiv_la_OBJECTS = $(am_libgslderiv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslderiv.la AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu deriv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslderiv.la: $(libgslderiv_la_OBJECTS) $(libgslderiv_la_DEPENDENCIES) $(EXTRA_libgslderiv_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslderiv_la_OBJECTS) $(libgslderiv_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/deriv/ChangeLog0000664000175000017500000000056512616157443013664 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-08-22 Brian Gough * deriv.c (central_deriv): corrected dy term for error in h (forward_deriv): corrected dy term for error in h 2004-03-06 Brian Gough * reworking API of gsl_diff gsl-doc-2.3/deriv/deriv.c0000664000175000017500000001343012616157443013362 0ustar eddedd/* deriv/deriv.c * * Copyright (C) 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include 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; /* The next term is due to finite precision in x+h = O (eps * x) */ double dy = GSL_MAX (fabs (r3 / h), fabs (r5 / h)) *(fabs (x) / h) * 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; /* The next term is due to finite precision in x+h = O (eps * x) */ double dy = GSL_MAX (fabs (r2 / h), fabs (r4 / h)) * fabs (x / h) * 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); } gsl-doc-2.3/deriv/gsl_deriv.h0000664000175000017500000000303412616157443014233 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/deriv/test.c0000664000175000017500000001105612616157443013232 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include 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 ()); } gsl-doc-2.3/gsl_minmax.h0000664000175000017500000000511012616157443013277 0ustar eddedd/* gsl_minmax.h * * Copyright (C) 2008 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MINMAX_H__ #define __GSL_MINMAX_H__ #include #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 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 INLINE_FUN int GSL_MAX_INT (int a, int b); INLINE_FUN int GSL_MIN_INT (int a, int b); INLINE_FUN double GSL_MAX_DBL (double a, double b); INLINE_FUN double GSL_MIN_DBL (double a, double b); INLINE_FUN long double GSL_MAX_LDBL (long double a, long double b); INLINE_FUN long double GSL_MIN_LDBL (long double a, long double b); INLINE_FUN int GSL_MAX_INT (int a, int b) { return GSL_MAX (a, b); } INLINE_FUN int GSL_MIN_INT (int a, int b) { return GSL_MIN (a, b); } INLINE_FUN double GSL_MAX_DBL (double a, double b) { return GSL_MAX (a, b); } INLINE_FUN double GSL_MIN_DBL (double a, double b) { return GSL_MIN (a, b); } INLINE_FUN long double GSL_MAX_LDBL (long double a, long double b) { return GSL_MAX (a, b); } INLINE_FUN 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 */ __END_DECLS #endif /* __GSL_POW_INT_H__ */ gsl-doc-2.3/multimin/0000755000175000017500000000000013022553155012617 5ustar eddeddgsl-doc-2.3/multimin/linear_minimize.c0000664000175000017500000001415012616157443016151 0ustar eddedd#include #include #include /* 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; } gsl-doc-2.3/multimin/linear_wrapper.c0000664000175000017500000000773412616157443016022 0ustar eddeddtypedef 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; } gsl-doc-2.3/multimin/Makefile.am0000664000175000017500000000232612616157443014670 0ustar eddeddnoinst_LTLIBRARIES = libgslmultimin.la pkginclude_HEADERS = gsl_multimin.h AM_CPPFLAGS = -I$(top_srcdir) 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 simplex2.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 gsl-doc-2.3/multimin/TODO0000664000175000017500000000033612616157443013323 0ustar eddedd# -*- org -*- #+CATEGORY: multimin * Check behavior of conjugate_fr in multimin -- the demo results look odd. * Should have made f and df return int instead of void. * Handle errors via GSL_NAN similar to min.h in min/ gsl-doc-2.3/multimin/conjugate_fr.c0000664000175000017500000001474012616157443015451 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/multimin/vector_bfgs.c0000664000175000017500000002074112616157443015304 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/multimin/Makefile.in0000644000175000017500000010762713022372406014677 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 \ simplex2.lo libgslmultimin_la_OBJECTS = $(am_libgslmultimin_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultimin.la pkginclude_HEADERS = gsl_multimin.h AM_CPPFLAGS = -I$(top_srcdir) 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 simplex2.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multimin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultimin.la: $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_DEPENDENCIES) $(EXTRA_libgslmultimin_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conjugate_fr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conjugate_pr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfminimizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fminimizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steepest_descent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs2.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multimin/ChangeLog0000664000175000017500000001330312616157443014403 0ustar eddedd2010-04-07 Brian Gough * test.c (test_fdf): handle case of GSL_ENOPROG from early returns * test_funcs.c (simpleabs_f): new test function with non-zero first derivatives around minimum * steepest_descent.c (steepest_descent_iterate): return early if trial point does not move within machine precision * directional_minimize.c (intermediate_point): return early with step=0 if trial point does not move from initial point within machine precision 2009-08-05 Brian Gough * simplex2.c (contract_by_best): update the size and center to avoid old values being used * test.c (main): added a testcase for the spring function 2009-07-11 Brian Gough * simplex2.c (nmsimplex_set_rand): provide alternative initialisation which randomizes the initial simplex 2009-07-09 Brian Gough * fminimizer.c (gsl_multimin_fminimizer_free): handle NULL argument in free * fdfminimizer.c (gsl_multimin_fdfminimizer_free): handle NULL argument in free 2008-11-29 Brian Gough * test.c (test_f): extended fminimizer test to allow type to be passed in as a parameter * simplex2.c: use BLAS, keep track of center in state to avoid unnecessary computation, compute size as RMS value to allow linear update. 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-05-06 Brian Gough * simplex.c (nmsimplex_iterate): fix search for second highest point 2007-07-30 Brian Gough * history.c: removed (unused file) 2007-02-20 Brian Gough * vector_bfgs2.c (vector_bfgs2_iterate): use positive step size 2007-02-17 Brian Gough * linear_minimize.c (minimize): return GSL_ENOPROG for roundoff 2007-02-14 Brian Gough * linear_minimize.c: made all functions static * linear_wrapper.c: made all functions static 2007-02-08 Brian Gough * 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 * vector_bfgs.c (vector_bfgs_iterate): avoid division by zero if dxdg == 0 2003-07-24 Brian Gough * simplex.c (nmsimplex_set): changed index variable i from int to size_t 2003-04-17 Brian Gough * 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 * Added Nelder-Mead Simplex optimization algorithm and fminimizer structure. Sun Feb 10 21:57:36 2002 Brian Gough * 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 * added a tolerance parameter for the line minimizations Wed Oct 24 23:18:46 2001 Brian Gough * 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 * 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 * diff.c (gsl_multimin_diff): pass params argument using GSL_MULTIMIN_FN_EVAL (3 occurrences) Sun Jul 15 17:54:15 2001 Brian Gough * fdfminimizer.c (gsl_multimin_fdf_minimizer_alloc): eliminated use of interval type Sat Apr 28 11:29:08 2001 Brian Gough * diff.c (gsl_multimin_diff): made indices unsigned Mon Apr 23 13:22:31 2001 Brian Gough * 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 * gsl_multimin.h: added missing prototype for gsl_multimin_compute_ep Sun Feb 18 16:35:21 2001 Brian Gough * 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 * 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 * 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 * made all internal functions static gsl-doc-2.3/multimin/directional_minimize.c0000664000175000017500000001325312616157443017177 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); if (gsl_vector_equal (x, x1)) { /* Take fast exit if trial point does not move from initial point */ #ifdef DEBUG printf ("fast exit x == x1 for stepb = %g\n", stepb); #endif *step = 0; *f = fa; GSL_MULTIMIN_FN_EVAL_DF(fdf, x1, gradient); return ; } 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; } } gsl-doc-2.3/multimin/simplex.c0000664000175000017500000002605712616157443014470 0ustar eddedd/* multimin/simplex.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 - Corrections to nmsimplex_iterate and other functions by Ivo Alxneit - Additional help by Brian Gough */ /* 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 #include #include #include 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; 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; int status = GSL_SUCCESS; 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); /* notify caller that we found at least one bad function value. we finish the contraction (and do not abort) to allow the user to handle the situation */ if(!gsl_finite(newval)) { status = GSL_EBADFUNC; } } } return status; } 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; if (n == 0) { GSL_ERROR("invalid number of parameters specified", GSL_EINVAL); } 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_matrix_free(state->x1); GSL_ERROR ("failed to allocate space for y", GSL_ENOMEM); } state->ws1 = gsl_vector_alloc (n); if (state->ws1 == NULL) { gsl_matrix_free(state->x1); gsl_vector_free(state->y1); GSL_ERROR ("failed to allocate space for ws1", GSL_ENOMEM); } state->ws2 = gsl_vector_alloc (n); if (state->ws2 == NULL) { gsl_matrix_free(state->x1); gsl_vector_free(state->y1); gsl_vector_free(state->ws1); 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; if (xtemp->size != x->size) { GSL_ERROR("incompatible size of x", GSL_EINVAL); } if (xtemp->size != step_size->size) { GSL_ERROR("incompatible size of step_size", GSL_EINVAL); } /* first point is the original x0 */ val = GSL_MULTIMIN_FN_EVAL (f, x); if (!gsl_finite(val)) { GSL_ERROR("non-finite function value encountered", GSL_EBADFUNC); } 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); if (!gsl_finite(val)) { GSL_ERROR("non-finite function value encountered", GSL_EBADFUNC); } 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 */ 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, s_hi, lo; double dhi, ds_hi, dlo; int status; double val, val2; if (xc->size != x->size) { GSL_ERROR("incompatible size of x", GSL_EINVAL); } /* get index of highest, second highest and lowest point */ dhi = dlo = gsl_vector_get (y1, 0); hi = 0; lo = 0; ds_hi = gsl_vector_get(y1, 1); s_hi = 1; 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 (gsl_finite(val) && val < gsl_vector_get (y1, lo)) { /* reflected point becomes lowest point, try expansion */ val2 = nmsimplex_move_corner (-2.0, state, hi, xc2, f); if (gsl_finite(val2) && 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 or we got a non-finite (illegal) function value */ else if (!gsl_finite(val) || val > gsl_vector_get (y1, s_hi)) { if (gsl_finite(val) && 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 (gsl_finite(val2) && 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 != GSL_SUCCESS) { 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; gsl-doc-2.3/multimin/conjugate_pr.c0000664000175000017500000001523012616157443015456 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; gsl-doc-2.3/multimin/steepest_descent.c0000664000175000017500000001015512616157443016340 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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); if (gsl_vector_equal (x, x1)) { return GSL_ENOPROG; } /* 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; gsl-doc-2.3/multimin/fdfminimizer.c0000664000175000017500000001014212616157443015456 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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) { RETURN_IF_NULL (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 (const gsl_multimin_fdfminimizer * s) { return s->x; } gsl_vector * gsl_multimin_fdfminimizer_dx (const gsl_multimin_fdfminimizer * s) { return s->dx; } gsl_vector * gsl_multimin_fdfminimizer_gradient (const gsl_multimin_fdfminimizer * s) { return s->gradient; } double gsl_multimin_fdfminimizer_minimum (const gsl_multimin_fdfminimizer * s) { return s->f; } gsl-doc-2.3/multimin/convergence.c0000664000175000017500000000264612616157443015303 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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; } gsl-doc-2.3/multimin/vector_bfgs2.c0000664000175000017500000002033612616157443015366 0ustar eddedd/* multimin/vector_bfgs2.c * * Copyright (C) 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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, using the line minimisation algorithm from from R.Fletcher, "Practical Methods 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 #include #include #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; gsl-doc-2.3/multimin/test_funcs.h0000664000175000017500000000574512616157443015172 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 simpleabs; extern gsl_multimin_function simpleabs_fmin; void simpleabs_initpt (gsl_vector * x); void simpleabs_initpt1 (gsl_vector * x); double simpleabs_f (const gsl_vector * x, void *params); void simpleabs_df (const gsl_vector * x, void *params, gsl_vector * df); void simpleabs_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df); extern gsl_multimin_function_fdf rosenbrock; extern gsl_multimin_function rosenbrock_fmin; void rosenbrock_initpt (gsl_vector * x); void rosenbrock_initpt1 (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); extern gsl_multimin_function spring_fmin; void spring_initpt (gsl_vector * x); double spring_f (const gsl_vector *x, void *params); gsl-doc-2.3/multimin/gsl_multimin.h0000664000175000017500000001521312616157443015507 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 (const gsl_multimin_fdfminimizer * s); gsl_vector * gsl_multimin_fdfminimizer_dx (const gsl_multimin_fdfminimizer * s); gsl_vector * gsl_multimin_fdfminimizer_gradient (const gsl_multimin_fdfminimizer * s); double gsl_multimin_fdfminimizer_minimum (const 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; GSL_VAR const gsl_multimin_fminimizer_type *gsl_multimin_fminimizer_nmsimplex2; GSL_VAR const gsl_multimin_fminimizer_type *gsl_multimin_fminimizer_nmsimplex2rand; __END_DECLS #endif /* __GSL_MULTIMIN_H__ */ gsl-doc-2.3/multimin/test_funcs.c0000664000175000017500000001713412616157443015160 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "test_funcs.h" gsl_multimin_function_fdf simpleabs = {&simpleabs_f, &simpleabs_df, &simpleabs_fdf, 2, 0}; gsl_multimin_function simpleabs_fmin = {&simpleabs_f, 2, 0}; void simpleabs_initpt (gsl_vector * x) { gsl_vector_set (x, 0, 1.0); gsl_vector_set (x, 1, 2.0); } void simpleabs_initpt1 (gsl_vector * x) { gsl_vector_set (x, 0, 1.0); gsl_vector_set (x, 1, 1.0); } double simpleabs_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 = v - 2; fcount++; return fabs(a) + fabs(b); } void simpleabs_df (const gsl_vector * x, void *params, gsl_vector * df) { double u = gsl_vector_get(x,0); double v = gsl_vector_get(x,1); gcount++; gsl_vector_set(df,0, GSL_SIGN(u-1)); gsl_vector_set(df,1, GSL_SIGN(v-2)); } void simpleabs_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 = v - 2; gcount++; *f = fabs(a) + fabs(b); gsl_vector_set(df,0, GSL_SIGN(u-1)); gsl_vector_set(df,1, GSL_SIGN(v-2)); } 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); } void rosenbrock_initpt1 (gsl_vector * x) { gsl_vector_set (x, 0, 1.0); 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); } gsl_multimin_function spring_fmin = { &spring_f, 3, 0 }; void spring_initpt (gsl_vector * x) { gsl_vector_set (x, 0, 1.0); gsl_vector_set (x, 1, 0.0); gsl_vector_set (x, 2, 7.0 * M_PI); } double spring_f (const gsl_vector * x, void *params) { double x0 = gsl_vector_get (x, 0); double x1 = gsl_vector_get (x, 1); double x2 = gsl_vector_get (x, 2); double theta = atan2 (x1, x0); double r = sqrt (x0 * x0 + x1 * x1); double z = x2; while (z > M_PI) z -= 2.0 * M_PI; while (z < -M_PI) z += 2.0 * M_PI; { double tmz = theta - z; double rm1 = r - 1.0; double ret = 0.1 * (expm1 (tmz * tmz + rm1 * rm1) + fabs (x2 / 10.0)); return ret; } } gsl-doc-2.3/multimin/simplex2.c0000664000175000017500000004142412616157443014545 0ustar eddedd/* multimin/simplex2.c * * Copyright (C) 2007, 2008, 2009 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 - Corrections to nmsimplex_iterate and other functions by Ivo Alxneit - Additional help by Brian Gough - Optimisations added by Brian Gough + use BLAS for frequently-called functions + keep track of the center to avoid unnecessary computation + compute size as RMS value, allowing linear update on each step instead of recomputing from all N+1 vectors. */ /* 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 #include #include #include #include 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 */ gsl_vector *center; /* center of all points */ gsl_vector *delta; /* current step */ gsl_vector *xmc; /* x - center (workspace) */ double S2; unsigned long count; } nmsimplex_state_t; static int compute_center (const nmsimplex_state_t * state, gsl_vector * center); static double compute_size (nmsimplex_state_t * state, const gsl_vector * center); static double try_corner_move (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; const size_t P = x1->size1; double newval; /* xc = (1-coeff)*(P/(P-1)) * center(all) + ((P*coeff-1)/(P-1))*x_corner */ { double alpha = (1 - coeff) * P / (P - 1.0); double beta = (P * coeff - 1.0) / (P - 1.0); gsl_vector_const_view row = gsl_matrix_const_row (x1, corner); gsl_vector_memcpy (xc, state->center); gsl_blas_dscal (alpha, xc); gsl_blas_daxpy (beta, &row.vector, xc); } newval = GSL_MULTIMIN_FN_EVAL (f, xc); return newval; } static void update_point (nmsimplex_state_t * state, size_t i, const gsl_vector * x, double val) { gsl_vector_const_view x_orig = gsl_matrix_const_row (state->x1, i); const size_t P = state->x1->size1; /* Compute delta = x - x_orig */ gsl_vector_memcpy (state->delta, x); gsl_blas_daxpy (-1.0, &x_orig.vector, state->delta); /* Compute xmc = x_orig - c */ gsl_vector_memcpy (state->xmc, &x_orig.vector); gsl_blas_daxpy (-1.0, state->center, state->xmc); /* Update size: S2' = S2 + (2/P) * (x_orig - c).delta + (P-1)*(delta/P)^2 */ { double d = gsl_blas_dnrm2 (state->delta); double xmcd; gsl_blas_ddot (state->xmc, state->delta, &xmcd); state->S2 += (2.0 / P) * xmcd + ((P - 1.0) / P) * (d * d / P); } /* Update center: c' = c + (x - x_orig) / P */ { double alpha = 1.0 / P; gsl_blas_daxpy (-alpha, &x_orig.vector, state->center); gsl_blas_daxpy (alpha, x, state->center); } gsl_matrix_set_row (state->x1, i, x); gsl_vector_set (state->y1, i, val); } static int 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. (This function is rarely called in practice, since it is the last choice, hence not optimised - BJG) */ /* the xc vector is simply work space here */ gsl_matrix *x1 = state->x1; gsl_vector *y1 = state->y1; size_t i, j; double newval; int status = GSL_SUCCESS; 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); /* notify caller that we found at least one bad function value. we finish the contraction (and do not abort) to allow the user to handle the situation */ if (!gsl_finite (newval)) { status = GSL_EBADFUNC; } } } /* We need to update the centre and size as well */ compute_center (state, state->center); compute_size (state, state->center); return status; } static int compute_center (const nmsimplex_state_t * state, gsl_vector * center) { /* calculates the center of the simplex and stores in center */ gsl_matrix *x1 = state->x1; const size_t P = x1->size1; size_t i; gsl_vector_set_zero (center); for (i = 0; i < P; i++) { gsl_vector_const_view row = gsl_matrix_const_row (x1, i); gsl_blas_daxpy (1.0, &row.vector, center); } { const double alpha = 1.0 / P; gsl_blas_dscal (alpha, center); } return GSL_SUCCESS; } static double compute_size (nmsimplex_state_t * state, const gsl_vector * center) { /* calculates simplex size as rms sum of length of vectors from simplex center to corner points: sqrt( sum ( || y - y_middlepoint ||^2 ) / n ) */ gsl_vector *s = state->ws1; gsl_matrix *x1 = state->x1; const size_t P = x1->size1; size_t i; double ss = 0.0; for (i = 0; i < P; i++) { double t; gsl_matrix_get_row (s, x1, i); gsl_blas_daxpy (-1.0, center, s); t = gsl_blas_dnrm2 (s); ss += t * t; } /* Store squared size in the state */ state->S2 = (ss / P); return sqrt (ss / P); } static int nmsimplex_alloc (void *vstate, size_t n) { nmsimplex_state_t *state = (nmsimplex_state_t *) vstate; if (n == 0) { GSL_ERROR ("invalid number of parameters specified", GSL_EINVAL); } 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_matrix_free (state->x1); GSL_ERROR ("failed to allocate space for y", GSL_ENOMEM); } state->ws1 = gsl_vector_alloc (n); if (state->ws1 == NULL) { gsl_matrix_free (state->x1); gsl_vector_free (state->y1); GSL_ERROR ("failed to allocate space for ws1", GSL_ENOMEM); } state->ws2 = gsl_vector_alloc (n); if (state->ws2 == NULL) { gsl_matrix_free (state->x1); gsl_vector_free (state->y1); gsl_vector_free (state->ws1); GSL_ERROR ("failed to allocate space for ws2", GSL_ENOMEM); } state->center = gsl_vector_alloc (n); if (state->center == NULL) { gsl_matrix_free (state->x1); gsl_vector_free (state->y1); gsl_vector_free (state->ws1); gsl_vector_free (state->ws2); GSL_ERROR ("failed to allocate space for center", GSL_ENOMEM); } state->delta = gsl_vector_alloc (n); if (state->delta == NULL) { gsl_matrix_free (state->x1); gsl_vector_free (state->y1); gsl_vector_free (state->ws1); gsl_vector_free (state->ws2); gsl_vector_free (state->center); GSL_ERROR ("failed to allocate space for delta", GSL_ENOMEM); } state->xmc = gsl_vector_alloc (n); if (state->xmc == NULL) { gsl_matrix_free (state->x1); gsl_vector_free (state->y1); gsl_vector_free (state->ws1); gsl_vector_free (state->ws2); gsl_vector_free (state->center); gsl_vector_free (state->delta); GSL_ERROR ("failed to allocate space for xmc", GSL_ENOMEM); } state->count = 0; 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); gsl_vector_free (state->center); gsl_vector_free (state->delta); gsl_vector_free (state->xmc); } 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; if (xtemp->size != x->size) { GSL_ERROR ("incompatible size of x", GSL_EINVAL); } if (xtemp->size != step_size->size) { GSL_ERROR ("incompatible size of step_size", GSL_EINVAL); } /* first point is the original x0 */ val = GSL_MULTIMIN_FN_EVAL (f, x); if (!gsl_finite (val)) { GSL_ERROR ("non-finite function value encountered", GSL_EBADFUNC); } 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); } { double xi = gsl_vector_get (x, i); double si = gsl_vector_get (step_size, i); gsl_vector_set (xtemp, i, xi + si); val = GSL_MULTIMIN_FN_EVAL (f, xtemp); } if (!gsl_finite (val)) { GSL_ERROR ("non-finite function value encountered", GSL_EBADFUNC); } gsl_matrix_set_row (state->x1, i + 1, xtemp); gsl_vector_set (state->y1, i + 1, val); } compute_center (state, state->center); /* Initialize simplex size */ *size = compute_size (state, state->center); state->count++; return GSL_SUCCESS; } 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 */ 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; const size_t n = y1->size; size_t i; size_t hi, s_hi, lo; double dhi, ds_hi, dlo; int status; double val, val2; if (xc->size != x->size) { GSL_ERROR ("incompatible size of x", GSL_EINVAL); } /* get index of highest, second highest and lowest point */ dhi = dlo = gsl_vector_get (y1, 0); hi = 0; lo = 0; ds_hi = gsl_vector_get (y1, 1); s_hi = 1; 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; } } /* try reflecting the highest value point */ val = try_corner_move (-1.0, state, hi, xc, f); if (gsl_finite (val) && val < gsl_vector_get (y1, lo)) { /* reflected point is lowest, try expansion */ val2 = try_corner_move (-2.0, state, hi, xc2, f); if (gsl_finite (val2) && val2 < gsl_vector_get (y1, lo)) { update_point (state, hi, xc2, val2); } else { update_point (state, hi, xc, val); } } else if (!gsl_finite (val) || val > gsl_vector_get (y1, s_hi)) { /* reflection does not improve things enough, or we got a non-finite function value */ if (gsl_finite (val) && val <= gsl_vector_get (y1, hi)) { /* if trial point is better than highest point, replace highest point */ update_point (state, hi, xc, val); } /* try one-dimensional contraction */ val2 = try_corner_move (0.5, state, hi, xc2, f); if (gsl_finite (val2) && val2 <= gsl_vector_get (y1, hi)) { update_point (state, hi, xc2, val2); } else { /* contract the whole simplex about the best point */ status = contract_by_best (state, lo, xc, f); if (status != GSL_SUCCESS) { GSL_ERROR ("contraction failed", GSL_EFAILED); } } } else { /* trial point is better than second highest point. Replace highest point by it */ update_point (state, hi, xc, 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 */ { double S2 = state->S2; if (S2 > 0) { *size = sqrt (S2); } else { /* recompute if accumulated error has made size invalid */ *size = compute_size (state, state->center); } } return GSL_SUCCESS; } static const gsl_multimin_fminimizer_type nmsimplex_type = { "nmsimplex2", /* name */ sizeof (nmsimplex_state_t), &nmsimplex_alloc, &nmsimplex_set, &nmsimplex_iterate, &nmsimplex_free }; const gsl_multimin_fminimizer_type * gsl_multimin_fminimizer_nmsimplex2 = &nmsimplex_type; static inline double ran_unif (unsigned long *seed) { unsigned long s = *seed; *seed = (s * 69069 + 1) & 0xffffffffUL; return (*seed) / 4294967296.0; } static int nmsimplex_set_rand (void *vstate, gsl_multimin_function * f, const gsl_vector * x, double *size, const gsl_vector * step_size) { size_t i, j; double val; nmsimplex_state_t *state = (nmsimplex_state_t *) vstate; gsl_vector *xtemp = state->ws1; if (xtemp->size != x->size) { GSL_ERROR ("incompatible size of x", GSL_EINVAL); } if (xtemp->size != step_size->size) { GSL_ERROR ("incompatible size of step_size", GSL_EINVAL); } /* first point is the original x0 */ val = GSL_MULTIMIN_FN_EVAL (f, x); if (!gsl_finite (val)) { GSL_ERROR ("non-finite function value encountered", GSL_EBADFUNC); } gsl_matrix_set_row (state->x1, 0, x); gsl_vector_set (state->y1, 0, val); { gsl_matrix_view m = gsl_matrix_submatrix (state->x1, 1, 0, x->size, x->size); /* generate a random orthornomal basis */ unsigned long seed = state->count ^ 0x12345678; ran_unif (&seed); /* warm it up */ gsl_matrix_set_identity (&m.matrix); /* start with random reflections */ for (i = 0; i < x->size; i++) { double s = ran_unif (&seed); if (s > 0.5) gsl_matrix_set (&m.matrix, i, i, -1.0); } /* apply random rotations */ for (i = 0; i < x->size; i++) { for (j = i + 1; j < x->size; j++) { /* rotate columns i and j by a random angle */ double angle = 2.0 * M_PI * ran_unif (&seed); double c = cos (angle), s = sin (angle); gsl_vector_view c_i = gsl_matrix_column (&m.matrix, i); gsl_vector_view c_j = gsl_matrix_column (&m.matrix, j); gsl_blas_drot (&c_i.vector, &c_j.vector, c, s); } } /* scale the orthonormal basis by the user-supplied step_size in each dimension, and use as an offset from the central point x */ for (i = 0; i < x->size; i++) { double x_i = gsl_vector_get (x, i); double s_i = gsl_vector_get (step_size, i); gsl_vector_view c_i = gsl_matrix_column (&m.matrix, i); for (j = 0; j < x->size; j++) { double x_ij = gsl_vector_get (&c_i.vector, j); gsl_vector_set (&c_i.vector, j, x_i + s_i * x_ij); } } /* compute the function values at each offset point */ for (i = 0; i < x->size; i++) { gsl_vector_view r_i = gsl_matrix_row (&m.matrix, i); val = GSL_MULTIMIN_FN_EVAL (f, &r_i.vector); if (!gsl_finite (val)) { GSL_ERROR ("non-finite function value encountered", GSL_EBADFUNC); } gsl_vector_set (state->y1, i + 1, val); } } compute_center (state, state->center); /* Initialize simplex size */ *size = compute_size (state, state->center); state->count++; return GSL_SUCCESS; } static const gsl_multimin_fminimizer_type nmsimplex2rand_type = { "nmsimplex2rand", /* name */ sizeof (nmsimplex_state_t), &nmsimplex_alloc, &nmsimplex_set_rand, &nmsimplex_iterate, &nmsimplex_free }; const gsl_multimin_fminimizer_type * gsl_multimin_fminimizer_nmsimplex2rand = &nmsimplex2rand_type; gsl-doc-2.3/multimin/fminimizer.c0000664000175000017500000000626012616157443015152 0ustar eddedd/* multimin/fminimizer.c * * Copyright (C) 2002, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/multimin/diff.c0000664000175000017500000000305612616157443013711 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include 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; } gsl-doc-2.3/multimin/test.c0000664000175000017500000001372012616157443013757 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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, const gsl_multimin_fminimizer_type *T); int main (void) { gsl_ieee_env_setup (); { const gsl_multimin_fdfminimizer_type *fdfminimizers[6]; const gsl_multimin_fdfminimizer_type ** T; 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); test_fdf("Rosenbrock1", &rosenbrock, rosenbrock_initpt1,*T); test_fdf("SimpleAbs", &simpleabs, simpleabs_initpt,*T); T++; } 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++; } } { const gsl_multimin_fminimizer_type *fminimizers[4]; const gsl_multimin_fminimizer_type ** T; fminimizers[0] = gsl_multimin_fminimizer_nmsimplex; fminimizers[1] = gsl_multimin_fminimizer_nmsimplex2; fminimizers[2] = gsl_multimin_fminimizer_nmsimplex2rand; fminimizers[3] = 0; T = fminimizers; while (*T != 0) { test_f("Roth", &roth_fmin, roth_initpt,*T); test_f("Wood", &wood_fmin, wood_initpt,*T); test_f("Rosenbrock", &rosenbrock_fmin, rosenbrock_initpt,*T); test_f("Spring", &spring_fmin, spring_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("status=%d\n", status); printf("\n"); #endif if (status == GSL_ENOPROG) break; status = gsl_multimin_test_gradient(s->gradient,1e-3); } while (iter < 5000 && status == GSL_CONTINUE); /* If no error in iteration, test for numerical convergence */ if (status == GSL_CONTINUE || status == GSL_ENOPROG) 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, const gsl_multimin_fminimizer_type *T) { int status; size_t i, iter = 0; 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; } gsl-doc-2.3/mkinstalldirs0000755000175000017500000000672212630105474013577 0ustar eddedd#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec 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. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # 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-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/multilarge/0000755000175000017500000000000013022553154013125 5ustar eddeddgsl-doc-2.3/multilarge/multilarge.c0000644000175000017500000002461512737536473015467 0ustar eddedd/* multilarge.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include gsl_multilarge_linear_workspace * gsl_multilarge_linear_alloc(const gsl_multilarge_linear_type *T, const size_t p) { gsl_multilarge_linear_workspace *w; w = calloc(1, sizeof(gsl_multilarge_linear_workspace)); if (w == NULL) { GSL_ERROR_NULL("failed to allocate space for workspace", GSL_ENOMEM); } w->type = T; w->state = w->type->alloc(p); if (w->state == NULL) { gsl_multilarge_linear_free(w); GSL_ERROR_NULL("failed to allocate space for multilarge state", GSL_ENOMEM); } w->p = p; /* initialize newly allocated state */ gsl_multilarge_linear_reset(w); return w; } void gsl_multilarge_linear_free(gsl_multilarge_linear_workspace *w) { RETURN_IF_NULL(w); if (w->state) w->type->free(w->state); free(w); } const char * gsl_multilarge_linear_name(const gsl_multilarge_linear_workspace *w) { return w->type->name; } int gsl_multilarge_linear_reset(gsl_multilarge_linear_workspace *w) { int status = w->type->reset(w->state); return status; } int gsl_multilarge_linear_accumulate(gsl_matrix * X, gsl_vector * y, gsl_multilarge_linear_workspace * w) { int status = w->type->accumulate(X, y, w->state); return status; } int gsl_multilarge_linear_solve(const double lambda, gsl_vector * c, double * rnorm, double * snorm, gsl_multilarge_linear_workspace * w) { int status = w->type->solve(lambda, c, rnorm, snorm, w->state); return status; } int gsl_multilarge_linear_rcond(double *rcond, gsl_multilarge_linear_workspace * w) { int status = w->type->rcond(rcond, w->state); return status; } int gsl_multilarge_linear_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, gsl_multilarge_linear_workspace * w) { const size_t len = reg_param->size; if (len != rho->size) { GSL_ERROR ("reg_param and rho have different sizes", GSL_EBADLEN); } else if (len != eta->size) { GSL_ERROR ("reg_param and eta have different sizes", GSL_EBADLEN); } else { int status = w->type->lcurve(reg_param, rho, eta, w->state); return status; } } /* gsl_multilarge_linear_wstdform1() Using regularization matrix L = diag(l_1,l_2,...,l_p), transform to Tikhonov standard form: X~ = sqrt(W) X L^{-1} y~ = sqrt(W) y c~ = L c Inputs: L - Tikhonov matrix as a vector of diagonal elements p-by-1; or NULL for L = I X - least squares matrix n-by-p y - right hand side vector n-by-1 w - weight vector n-by-1; or NULL for W = I Xs - least squares matrix in standard form X~ n-by-p ys - right hand side vector in standard form y~ n-by-1 work - workspace Return: success/error Notes: 1) It is allowed for X = Xs and y = ys */ int gsl_multilarge_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work) { const size_t n = X->size1; const size_t p = X->size2; if (L != NULL && p != L->size) { GSL_ERROR("L vector does not match X", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("weight vector does not match X", GSL_EBADLEN); } else if (n != Xs->size1 || p != Xs->size2) { GSL_ERROR("Xs matrix dimensions do not match X", GSL_EBADLEN); } else if (n != ys->size) { GSL_ERROR("ys vector must be length n", GSL_EBADLEN); } else { int status = GSL_SUCCESS; /* compute Xs = sqrt(W) X and ys = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, Xs, ys); if (status) return status; if (L != NULL) { size_t j; /* construct X~ = sqrt(W) X * L^{-1} matrix */ for (j = 0; j < p; ++j) { gsl_vector_view Xj = gsl_matrix_column(Xs, j); double lj = gsl_vector_get(L, j); if (lj == 0.0) { GSL_ERROR("L matrix is singular", GSL_EDOM); } gsl_vector_scale(&Xj.vector, 1.0 / lj); } } return status; } } int gsl_multilarge_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work) { int status; status = gsl_multilarge_linear_wstdform1(L, X, NULL, y, Xs, ys, work); return status; } int gsl_multilarge_linear_L_decomp (gsl_matrix * L, gsl_vector * tau) { const size_t m = L->size1; const size_t p = L->size2; if (m < p) { GSL_ERROR("m < p not yet supported", GSL_EBADLEN); } else { int status; status = gsl_multifit_linear_L_decomp(L, tau); return status; } } int gsl_multilarge_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work) { const size_t m = LQR->size1; const size_t n = X->size1; const size_t p = X->size2; if (p != work->p) { GSL_ERROR("X has wrong number of columns", GSL_EBADLEN); } else if (p != LQR->size2) { GSL_ERROR("LQR and X matrices have different numbers of columns", GSL_EBADLEN); } else if (n != y->size) { GSL_ERROR("y vector does not match X", GSL_EBADLEN); } else if (w != NULL && n != w->size) { GSL_ERROR("weights vector must be length n", GSL_EBADLEN); } else if (m < p) { GSL_ERROR("m < p not yet supported", GSL_EBADLEN); } else if (n != Xs->size1 || p != Xs->size2) { GSL_ERROR("Xs matrix must be n-by-p", GSL_EBADLEN); } else if (n != ys->size) { GSL_ERROR("ys vector must have length n", GSL_EBADLEN); } else { int status; size_t i; gsl_matrix_const_view R = gsl_matrix_const_submatrix(LQR, 0, 0, p, p); /* compute Xs = sqrt(W) X and ys = sqrt(W) y */ status = gsl_multifit_linear_applyW(X, w, y, Xs, ys); if (status) return status; /* compute X~ = X R^{-1} using QR decomposition of L */ for (i = 0; i < n; ++i) { gsl_vector_view v = gsl_matrix_row(Xs, i); /* solve: R^T y = X_i */ gsl_blas_dtrsv(CblasUpper, CblasTrans, CblasNonUnit, &R.matrix, &v.vector); } return GSL_SUCCESS; } } int gsl_multilarge_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work) { int status; status = gsl_multilarge_linear_wstdform2(LQR, Ltau, X, NULL, y, Xs, ys, work); return status; } /* gsl_multilarge_linear_genform1() Backtransform regularized solution vector using matrix L = diag(L) */ int gsl_multilarge_linear_genform1 (const gsl_vector * L, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work) { if (L->size != work->p) { GSL_ERROR("L vector does not match workspace", GSL_EBADLEN); } else if (L->size != cs->size) { GSL_ERROR("cs vector does not match L", GSL_EBADLEN); } else if (L->size != c->size) { GSL_ERROR("c vector does not match L", GSL_EBADLEN); } else { /* compute true solution vector c = L^{-1} c~ */ gsl_vector_memcpy(c, cs); gsl_vector_div(c, L); return GSL_SUCCESS; } } int gsl_multilarge_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work) { const size_t m = LQR->size1; const size_t p = LQR->size2; if (p != c->size) { GSL_ERROR("c vector does not match LQR", GSL_EBADLEN); } else if (m < p) { GSL_ERROR("m < p not yet supported", GSL_EBADLEN); } else if (p != cs->size) { GSL_ERROR("cs vector size does not match c", GSL_EBADLEN); } else { int s; gsl_matrix_const_view R = gsl_matrix_const_submatrix(LQR, 0, 0, p, p); /* R factor of L */ /* solve R c = cs for true solution c, using QR decomposition of L */ gsl_vector_memcpy(c, cs); s = gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, &R.matrix, c); return s; } } gsl-doc-2.3/multilarge/Makefile.am0000644000175000017500000000127513004361416015164 0ustar eddeddnoinst_LTLIBRARIES = libgslmultilarge.la pkginclude_HEADERS = gsl_multilarge.h libgslmultilarge_la_SOURCES = multilarge.c normal.c tsqr.c AM_CPPFLAGS = -I$(top_srcdir) check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultilarge.la ../test/libgsltest.la ../multifit/libgslmultifit.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../complex/libgslcomplex.la ../min/libgslmin.la gsl-doc-2.3/multilarge/gsl_multilarge.h0000644000175000017500000001244312657143374016330 0ustar eddedd/* gsl_multilarge.h * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_MULTILARGE_H__ #define __GSL_MULTILARGE_H__ #include #include #include #include #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 /* iteration solver type */ typedef struct { const char *name; void * (*alloc) (const size_t p); int (*reset) (void *); int (*accumulate) (gsl_matrix * X, gsl_vector * y, void *); int (*solve) (const double lambda, gsl_vector * c, double * rnorm, double * snorm, void *); int (*rcond) (double * rcond, void *); int (*lcurve) (gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, void *); void (*free) (void *); } gsl_multilarge_linear_type; typedef struct { const gsl_multilarge_linear_type * type; void * state; size_t p; } gsl_multilarge_linear_workspace; /* available types */ GSL_VAR const gsl_multilarge_linear_type * gsl_multilarge_linear_normal; GSL_VAR const gsl_multilarge_linear_type * gsl_multilarge_linear_tsqr; /* * Prototypes */ gsl_multilarge_linear_workspace * gsl_multilarge_linear_alloc(const gsl_multilarge_linear_type * T, const size_t p); void gsl_multilarge_linear_free(gsl_multilarge_linear_workspace * w); const char *gsl_multilarge_linear_name(const gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_reset(gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_accumulate(gsl_matrix * X, gsl_vector * y, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_solve(const double lambda, gsl_vector * c, double * rnorm, double * snorm, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_rcond(double *rcond, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_L_decomp (gsl_matrix * L, gsl_vector * tau); int gsl_multilarge_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_genform1 (const gsl_vector * L, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work); __END_DECLS #endif /* __GSL_MULTILARGE_H__ */ gsl-doc-2.3/multilarge/normal.c0000644000175000017500000003075312753406116014576 0ustar eddedd/* normal.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include typedef struct { size_t p; /* number of columns of LS matrix */ gsl_matrix *ATA; /* A^T A, p-by-p */ gsl_vector *ATb; /* A^T b, p-by-1 */ double normb; /* || b || */ gsl_matrix *work_ATA; /* workspace for chol(ATA), p-by-p */ gsl_permutation *perm; /* permutation vector */ gsl_vector *workp; /* workspace size p */ gsl_vector *work3p; /* workspace size 3*p */ gsl_vector *D; /* scale factors for ATA, size p */ gsl_vector *c; /* solution vector for L-curve */ int eigen; /* 1 if eigenvalues computed */ double eval_min; /* minimum eigenvalue */ double eval_max; /* maximum eigenvalue */ gsl_eigen_symm_workspace *eigen_p; } normal_state_t; static void *normal_alloc(const size_t p); static void normal_free(void *vstate); static int normal_reset(void *vstate); static int normal_accumulate(gsl_matrix * A, gsl_vector * b, void * vstate); static int normal_solve(const double lambda, gsl_vector * x, double * rnorm, double * snorm, void * vstate); static int normal_rcond(double * rcond, void * vstate); static int normal_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, void * vstate); static int normal_solve_system(const double lambda, gsl_vector * x, normal_state_t *state); static int normal_solve_cholesky(gsl_matrix * ATA, const gsl_vector * ATb, gsl_vector * x, normal_state_t *state); static int normal_calc_norms(const gsl_vector *x, double *rnorm, double *snorm, normal_state_t *state); static int normal_eigen(normal_state_t *state); /* normal_alloc() Allocate workspace for solving large linear least squares problems using the normal equations approach Inputs: p - number of columns of LS matrix Return: pointer to workspace */ static void * normal_alloc(const size_t p) { normal_state_t *state; if (p == 0) { GSL_ERROR_NULL("p must be a positive integer", GSL_EINVAL); } state = calloc(1, sizeof(normal_state_t)); if (!state) { GSL_ERROR_NULL("failed to allocate normal state", GSL_ENOMEM); } state->p = p; state->ATA = gsl_matrix_alloc(p, p); if (state->ATA == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate ATA matrix", GSL_ENOMEM); } state->work_ATA = gsl_matrix_alloc(p, p); if (state->work_ATA == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate temporary ATA matrix", GSL_ENOMEM); } state->ATb = gsl_vector_alloc(p); if (state->ATb == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate ATb vector", GSL_ENOMEM); } state->perm = gsl_permutation_alloc(p); if (state->perm == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate perm", GSL_ENOMEM); } state->D = gsl_vector_alloc(p); if (state->D == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate D vector", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate temporary ATb vector", GSL_ENOMEM); } state->work3p = gsl_vector_alloc(3 * p); if (state->work3p == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate work3p", GSL_ENOMEM); } state->c = gsl_vector_alloc(p); if (state->c == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate c vector", GSL_ENOMEM); } state->eigen_p = gsl_eigen_symm_alloc(p); if (state->eigen_p == NULL) { normal_free(state); GSL_ERROR_NULL("failed to allocate eigen workspace", GSL_ENOMEM); } normal_reset(state); return state; } static void normal_free(void *vstate) { normal_state_t *state = (normal_state_t *) vstate; if (state->ATA) gsl_matrix_free(state->ATA); if (state->work_ATA) gsl_matrix_free(state->work_ATA); if (state->ATb) gsl_vector_free(state->ATb); if (state->perm) gsl_permutation_free(state->perm); if (state->D) gsl_vector_free(state->D); if (state->workp) gsl_vector_free(state->workp); if (state->work3p) gsl_vector_free(state->work3p); if (state->c) gsl_vector_free(state->c); if (state->eigen_p) gsl_eigen_symm_free(state->eigen_p); free(state); } static int normal_reset(void *vstate) { normal_state_t *state = (normal_state_t *) vstate; gsl_matrix_set_zero(state->ATA); gsl_vector_set_zero(state->ATb); state->normb = 0.0; state->eigen = 0; state->eval_min = 0.0; state->eval_max = 0.0; return GSL_SUCCESS; } /* normal_accumulate() Add a new block of rows to the normal equations system Inputs: A - new block of rows, n-by-p b - new rhs vector n-by-1 vstate - workspace Return: success/error */ static int normal_accumulate(gsl_matrix * A, gsl_vector * b, void * vstate) { normal_state_t *state = (normal_state_t *) vstate; const size_t n = A->size1; if (A->size2 != state->p) { GSL_ERROR("columns of A do not match workspace", GSL_EBADLEN); } else if (n != b->size) { GSL_ERROR("A and b have different numbers of rows", GSL_EBADLEN); } else { int s; /* ATA += A^T A, using only the lower half of the matrix */ s = gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, A, 1.0, state->ATA); if (s) return s; /* ATb += A^T b */ s = gsl_blas_dgemv(CblasTrans, 1.0, A, b, 1.0, state->ATb); if (s) return s; /* update || b || */ state->normb = gsl_hypot(state->normb, gsl_blas_dnrm2(b)); return GSL_SUCCESS; } } /* normal_solve() Solve normal equations system: (A^T A + \lambda^2 I) x = A^T b using Cholesky decomposition Inputs: lambda - regularization parameter x - (output) solution vector p-by-1 rnorm - (output) residual norm ||b - A x|| snorm - (output) solution norm ||x|| vstate - workspace Return: success/error */ static int normal_solve(const double lambda, gsl_vector * x, double * rnorm, double * snorm, void * vstate) { normal_state_t *state = (normal_state_t *) vstate; if (x->size != state->p) { GSL_ERROR("solution vector does not match workspace", GSL_EBADLEN); } else { int status; /* solve system (A^T A) x = A^T b */ status = normal_solve_system(lambda, x, state); if (status) { GSL_ERROR("failed to solve normal equations", status); } /* compute residual norm ||y - X c|| and solution norm ||x|| */ normal_calc_norms(x, rnorm, snorm, state); return GSL_SUCCESS; } } static int normal_rcond(double * rcond, void * vstate) { normal_state_t *state = (normal_state_t *) vstate; int status = GSL_SUCCESS; double rcond_ATA; status = gsl_linalg_pcholesky_rcond(state->work_ATA, state->perm, &rcond_ATA, state->work3p); if (status == GSL_SUCCESS) *rcond = sqrt(rcond_ATA); return status; } /* normal_lcurve() Compute L-curve of least squares system Inputs: reg_param - (output) vector of regularization parameters rho - (output) vector of residual norms eta - (output) vector of solution norms vstate - workspace Return: success/error */ static int normal_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, void * vstate) { normal_state_t *state = (normal_state_t *) vstate; int status; double smin, smax; /* minimum/maximum singular values */ size_t i; if (state->eigen == 0) { status = normal_eigen(state); if (status) return status; } if (state->eval_max < 0.0) { GSL_ERROR("matrix is not positive definite", GSL_EDOM); } /* compute singular values which are sqrts of eigenvalues */ smax = sqrt(state->eval_max); if (state->eval_min > 0.0) smin = sqrt(state->eval_min); else smin = 0.0; /* compute vector of regularization parameters */ gsl_multifit_linear_lreg(smin, smax, reg_param); /* solve normal equations for each regularization parameter */ for (i = 0; i < reg_param->size; ++i) { double lambda = gsl_vector_get(reg_param, i); double rnorm, snorm; status = normal_solve_system(lambda, state->c, state); if (status) return status; /* compute ||y - X c|| and ||c|| */ normal_calc_norms(state->c, &rnorm, &snorm, state); gsl_vector_set(rho, i, rnorm); gsl_vector_set(eta, i, snorm); } return GSL_SUCCESS; } /* normal_solve_system() Compute solution to normal equations: (A^T A + lambda^2*I) x = A^T b using LDL decomposition. Inputs: x - (output) solution vector state - workspace Return: success/error */ static int normal_solve_system(const double lambda, gsl_vector * x, normal_state_t *state) { int status; const double lambda_sq = lambda * lambda; gsl_vector_view d = gsl_matrix_diagonal(state->work_ATA); /* copy ATA matrix to temporary workspace and regularize */ gsl_matrix_tricpy('L', 1, state->work_ATA, state->ATA); gsl_vector_add_constant(&d.vector, lambda_sq); /* solve with LDL decomposition */ status = normal_solve_cholesky(state->work_ATA, state->ATb, x, state); if (status) return status; return status; } static int normal_solve_cholesky(gsl_matrix * ATA, const gsl_vector * ATb, gsl_vector * x, normal_state_t *state) { int status; status = gsl_linalg_pcholesky_decomp2(ATA, state->perm, state->D); if (status) return status; status = gsl_linalg_pcholesky_solve2(ATA, state->perm, state->D, ATb, x); if (status) return status; return GSL_SUCCESS; } /* normal_calc_norms() Compute residual norm ||y - X c|| and solution norm ||c|| Inputs: x - solution vector rnorm - (output) residual norm ||y - X c|| snorm - (output) solution norm ||c|| state - workspace */ static int normal_calc_norms(const gsl_vector *x, double *rnorm, double *snorm, normal_state_t *state) { double r2; /* compute solution norm ||x|| */ *snorm = gsl_blas_dnrm2(x); /* compute residual norm ||b - Ax|| */ /* compute: A^T A x - 2 A^T b */ gsl_vector_memcpy(state->workp, state->ATb); gsl_blas_dsymv(CblasLower, 1.0, state->ATA, x, -2.0, state->workp); /* compute: x^T A^T A x - 2 x^T A^T b */ gsl_blas_ddot(x, state->workp, &r2); /* add b^T b */ r2 += state->normb * state->normb; *rnorm = sqrt(r2); return GSL_SUCCESS; } /* normal_eigen() Compute eigenvalues of A^T A matrix, which are stored in state->workp on output. Also, state->eval_min and state->eval_max are set to the minimum/maximum eigenvalues */ static int normal_eigen(normal_state_t *state) { int status; /* copy lower triangle of ATA to temporary workspace */ gsl_matrix_tricpy('L', 1, state->work_ATA, state->ATA); /* compute eigenvalues of ATA */ status = gsl_eigen_symm(state->work_ATA, state->workp, state->eigen_p); if (status) return status; gsl_vector_minmax(state->workp, &state->eval_min, &state->eval_max); state->eigen = 1; return GSL_SUCCESS; } static const gsl_multilarge_linear_type normal_type = { "normal", normal_alloc, normal_reset, normal_accumulate, normal_solve, normal_rcond, normal_lcurve, normal_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_normal = &normal_type; gsl-doc-2.3/multilarge/Makefile.in0000644000175000017500000010513113022372406015172 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = multilarge DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultilarge_la_LIBADD = am_libgslmultilarge_la_OBJECTS = multilarge.lo normal.lo tsqr.lo libgslmultilarge_la_OBJECTS = $(am_libgslmultilarge_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultilarge.la ../test/libgsltest.la \ ../multifit/libgslmultifit.la ../eigen/libgsleigen.la \ ../linalg/libgsllinalg.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../permutation/libgslpermutation.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la ../sys/libgslsys.la \ ../utils/libutils.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../complex/libgslcomplex.la ../min/libgslmin.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultilarge_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultilarge_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultilarge.la pkginclude_HEADERS = gsl_multilarge.h libgslmultilarge_la_SOURCES = multilarge.c normal.c tsqr.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultilarge.la ../test/libgsltest.la ../multifit/libgslmultifit.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../complex/libgslcomplex.la ../min/libgslmin.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multilarge/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multilarge/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultilarge.la: $(libgslmultilarge_la_OBJECTS) $(libgslmultilarge_la_DEPENDENCIES) $(EXTRA_libgslmultilarge_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultilarge_la_OBJECTS) $(libgslmultilarge_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilarge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsqr.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multilarge/tsqr.c0000644000175000017500000004273512737536473014316 0ustar eddedd/* tsqr.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module implements the sequential TSQR algorithm * described in * * [1] Demmel, J., Grigori, L., Hoemmen, M. F., and Langou, J. * "Communication-optimal parallel and sequential QR and LU factorizations", * UCB Technical Report No. UCB/EECS-2008-89, 2008. * * The algorithm operates on a tall least squares system: * * [ A_1 ] x = [ b_1 ] * [ A_2 ] [ b_2 ] * [ ... ] [ ... ] * [ A_k ] [ b_k ] * * as follows: * * 1. Initialize * a. [Q_1,R_1] = qr(A_1) * b. z_1 = Q_1^T b_1 * 2. Loop i = 2:k * a. [Q_i,R_i] = qr( [ R_{i-1} ; A_i ] ) * b. z_i = Q_i^T [ z_{i-1} ; b_i ] * 3. Output: * a. R = R_k * b. Q^T b = z_k * * Step 2(a) is optimized to take advantage * of the sparse structure of the matrix */ #include #include #include #include #include #include #include #include #include typedef struct { size_t p; /* number of columns of LS matrix */ int init; /* QR system has been initialized */ int svd; /* SVD of R has been computed */ double normb; /* || b || for computing residual norm */ gsl_vector *tau; /* Householder scalars, p-by-1 */ gsl_matrix *R; /* [ R ; A_i ], size p-by-p */ gsl_vector *QTb; /* [ Q^T b ; b_i ], size p-by-1 */ gsl_multifit_linear_workspace *multifit_workspace_p; } tsqr_state_t; static void *tsqr_alloc(const size_t p); static void tsqr_free(void *vstate); static int tsqr_reset(void *vstate); static int tsqr_accumulate(gsl_matrix * A, gsl_vector * b, void * vstate); static int tsqr_solve(const double lambda, gsl_vector * x, double * rnorm, double * snorm, void * vstate); static int tsqr_rcond(double * rcond, void * vstate); static int tsqr_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, void * vstate); static int tsqr_svd(tsqr_state_t * state); static double tsqr_householder_transform (double *v0, gsl_vector * v); static int tsqr_householder_hv (const double tau, const gsl_vector * v, double *w0, gsl_vector * w); static int tsqr_householder_hm (const double tau, const gsl_vector * v, gsl_matrix * R, gsl_matrix * A); static int tsqr_QR_decomp (gsl_matrix * R, gsl_matrix * A, gsl_vector * tau); /* tsqr_alloc() Allocate workspace for solving large linear least squares problems using the TSQR approach Inputs: p - number of columns of LS matrix Return: pointer to workspace */ static void * tsqr_alloc(const size_t p) { tsqr_state_t *state; if (p == 0) { GSL_ERROR_NULL("p must be a positive integer", GSL_EINVAL); } state = calloc(1, sizeof(tsqr_state_t)); if (!state) { GSL_ERROR_NULL("failed to allocate tsqr state", GSL_ENOMEM); } state->p = p; state->init = 0; state->svd = 0; state->normb = 0.0; state->R = gsl_matrix_alloc(p, p); if (state->R == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate R matrix", GSL_ENOMEM); } state->QTb = gsl_vector_alloc(p); if (state->QTb == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate QTb vector", GSL_ENOMEM); } state->tau = gsl_vector_alloc(p); if (state->tau == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate tau vector", GSL_ENOMEM); } state->multifit_workspace_p = gsl_multifit_linear_alloc(p, p); if (state->multifit_workspace_p == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate multifit workspace", GSL_ENOMEM); } return state; } static void tsqr_free(void *vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; if (state->R) gsl_matrix_free(state->R); if (state->QTb) gsl_vector_free(state->QTb); if (state->tau) gsl_vector_free(state->tau); if (state->multifit_workspace_p) gsl_multifit_linear_free(state->multifit_workspace_p); free(state); } static int tsqr_reset(void *vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; gsl_matrix_set_zero(state->R); gsl_vector_set_zero(state->QTb); state->init = 0; state->svd = 0; state->normb = 0.0; return GSL_SUCCESS; } /* tsqr_accumulate() Add a new block of rows to the QR system Inputs: A - new block of rows, n-by-p b - new rhs vector n-by-1 vstate - workspace Return: success/error Notes: 1) On output, the upper triangular portion of state->R(1:p,1:p) contains current R matrix 2) state->QTb(1:p) contains current Q^T b vector 3) A and b are destroyed */ static int tsqr_accumulate(gsl_matrix * A, gsl_vector * b, void * vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; const size_t n = A->size1; const size_t p = A->size2; if (p != state->p) { GSL_ERROR("columns of A do not match workspace", GSL_EBADLEN); } else if (n != b->size) { GSL_ERROR("A and b have different numbers of rows", GSL_EBADLEN); } else if (state->init == 0) { int status; const size_t npmin = GSL_MIN(n, p); gsl_vector_view tau = gsl_vector_subvector(state->tau, 0, npmin); gsl_matrix_view R = gsl_matrix_submatrix(state->R, 0, 0, npmin, p); gsl_matrix_view Av = gsl_matrix_submatrix(A, 0, 0, npmin, p); gsl_vector_view QTb = gsl_vector_subvector(state->QTb, 0, npmin); gsl_vector_view bv = gsl_vector_subvector(b, 0, npmin); /* this is the first matrix block A_1, compute its (dense) QR decomposition */ /* compute QR decomposition of A */ status = gsl_linalg_QR_decomp(A, &tau.vector); if (status) return status; /* store upper triangular R factor in state->R */ gsl_matrix_tricpy('U', 1, &R.matrix, &Av.matrix); /* compute ||b|| */ state->normb = gsl_blas_dnrm2(b); /* compute Q^T b and keep the first p elements */ gsl_linalg_QR_QTvec(A, &tau.vector, b); gsl_vector_memcpy(&QTb.vector, &bv.vector); state->init = 1; return GSL_SUCCESS; } else { int status; /* compute QR decomposition of [ R_{i-1} ; A_i ], accounting for * sparse structure */ status = tsqr_QR_decomp(state->R, A, state->tau); if (status) return status; /* update ||b|| */ state->normb = gsl_hypot(state->normb, gsl_blas_dnrm2(b)); /* * compute Q^T [ QTb_{i - 1}; b_i ], accounting for the sparse * structure of the Householder reflectors */ { size_t i; for (i = 0; i < p; i++) { const double ti = gsl_vector_get (state->tau, i); gsl_vector_const_view h = gsl_matrix_const_column (A, i); double *wi = gsl_vector_ptr(state->QTb, i); tsqr_householder_hv (ti, &(h.vector), wi, b); } } return GSL_SUCCESS; } } /* tsqr_solve() Solve the least squares system: chi^2 = || QTb - R x ||^2 + lambda^2 || x ||^2 using the SVD of R Inputs: lambda - regularization parameter x - (output) solution vector p-by-1 rnorm - (output) residual norm ||b - A x|| snorm - (output) solution norm ||x|| vstate - workspace Return: success/error */ static int tsqr_solve(const double lambda, gsl_vector * x, double * rnorm, double * snorm, void * vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; const size_t p = x->size; if (p != state->p) { GSL_ERROR("solution vector does not match workspace", GSL_EBADLEN); } else { int status; /* compute SVD of R if not already computed */ if (state->svd == 0) { status = tsqr_svd(state); if (status) return status; } status = gsl_multifit_linear_solve(lambda, state->R, state->QTb, x, rnorm, snorm, state->multifit_workspace_p); if (status) return status; /* * Since we're solving a reduced square system above, we need * to account for the full residual vector: * * rnorm = || [ Q1^T b - R x ; Q2^T b ] || * * where Q1 is the thin Q factor of X, and Q2 * are the remaining columns of Q. But: * * || Q2^T b ||^2 = ||b||^2 - ||Q1^T b||^2 * * so add this into the rnorm calculation */ { double norm_Q1Tb = gsl_blas_dnrm2(state->QTb); double ratio = norm_Q1Tb / state->normb; double diff = 1.0 - ratio*ratio; if (diff > GSL_DBL_EPSILON) { double norm_Q2Tb = state->normb * sqrt(diff); *rnorm = gsl_hypot(*rnorm, norm_Q2Tb); } } return GSL_SUCCESS; } } /* tsqr_lcurve() Compute L-curve of least squares system Inputs: reg_param - (output) vector of regularization parameters rho - (output) vector of residual norms eta - (output) vector of solution norms vstate - workspace Return: success/error */ static int tsqr_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, void * vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; int status; /* compute SVD of R if not already computed */ if (state->svd == 0) { status = tsqr_svd(state); if (status) return status; } status = gsl_multifit_linear_lcurve(state->QTb, reg_param, rho, eta, state->multifit_workspace_p); /* now add contribution to rnorm from Q2 factor */ { double norm_Q1Tb = gsl_blas_dnrm2(state->QTb); double ratio = norm_Q1Tb / state->normb; double diff = 1.0 - ratio*ratio; size_t i; if (diff > GSL_DBL_EPSILON) { double norm_Q2Tb = state->normb * sqrt(diff); for (i = 0; i < rho->size; ++i) { double *rhoi = gsl_vector_ptr(rho, i); *rhoi = gsl_hypot(*rhoi, norm_Q2Tb); } } } return status; } static int tsqr_rcond(double * rcond, void * vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; /* compute SVD of R if not already computed */ if (state->svd == 0) { int status = tsqr_svd(state); if (status) return status; } *rcond = gsl_multifit_linear_rcond(state->multifit_workspace_p); return GSL_SUCCESS; } /* tsqr_svd() Compute the SVD of the upper triangular R factor. This allows us to compute the upper/lower bounds on the regularization parameter and compute the matrix reciprocal condition number. Inputs: state - workspace Return: success/error */ static int tsqr_svd(tsqr_state_t * state) { int status; status = gsl_multifit_linear_svd(state->R, state->multifit_workspace_p); if (status) { GSL_ERROR("error computing SVD of R", status); } state->svd = 1; return GSL_SUCCESS; } /* tsqr_householder_transform() This routine is an optimized version of gsl_linalg_householder_transform(), designed for the QR decomposition of M-by-N matrices of the form: T = [ R ] [ A ] where R is N-by-N upper triangular, and A is (M-N)-by-N dense. This routine computes a householder transformation (tau,v) of a x so that P x = [ I - tau*v*v' ] x annihilates x(1:n-1). x will be a subcolumn of the matrix T, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of R [ 0 ] <- N - j - 1 zeros, where j is column of matrix in [0,N-1] [ x ] <- M-N nonzero values for the dense part A Inputs: v0 - pointer to diagonal element of R on input, v0 = x0; v - on input, x vector on output, householder vector v */ static double tsqr_householder_transform (double *v0, gsl_vector * v) { /* replace v[0:M-1] with a householder vector (v[0:M-1]) and coefficient tau that annihilate v[1:M-1] */ double alpha, beta, tau ; /* compute xnorm = || [ 0 ; v ] ||, ignoring zero part of vector */ double xnorm = gsl_blas_dnrm2(v); if (xnorm == 0) { return 0.0; /* tau = 0 */ } alpha = *v0; beta = - (alpha >= 0.0 ? +1.0 : -1.0) * hypot(alpha, xnorm) ; tau = (beta - alpha) / beta ; { double s = (alpha - beta); if (fabs(s) > GSL_DBL_MIN) { gsl_blas_dscal (1.0 / s, v); *v0 = beta; } else { gsl_blas_dscal (GSL_DBL_EPSILON / s, v); gsl_blas_dscal (1.0 / GSL_DBL_EPSILON, v); *v0 = beta; } } return tau; } /* tsqr_householder_hv() Apply Householder reflector to a vector. The Householder reflectors are for the QR decomposition of the matrix [ R ] [ A ] where R is p-by-p upper triangular and A is n-by-p dense. Therefore all relevant components of the Householder vector are stored in the columns of A, while the components in R are 0, except for diag(R) which are 1. The vector w to be transformed is partitioned as [ w1 ] [ w2 ] where w1 is p-by-1 and w2 is n-by-1. The w2 portion of w is transformed by v, but most of w1 remains unchanged except for the first element, w0 Inputs: tau - Householder scalar v - Householder vector, n-by-1 w0 - (input/output) on input, w1(0); on output, transformed w1(0) w - (input/output) n-by-1 on input, vector w2; on output, P*w2 */ static int tsqr_householder_hv (const double tau, const gsl_vector * v, double *w0, gsl_vector * w) { /* applies a householder transformation v to vector w */ if (tau == 0) return GSL_SUCCESS ; { double d1, d; /* compute d1 = v(2:n)' w(2:n) */ gsl_blas_ddot (v, w, &d1); /* compute d = v'w = w(1) + d1 since v(1) = 1 */ d = *w0 + d1; /* compute w = w - tau (v) (v'w) */ *w0 -= tau * d; gsl_blas_daxpy (-tau * d, v, w); } return GSL_SUCCESS; } /* tsqr_householder_hm() Apply Householder reflector to a submatrix of [ R ] [ A ] where R is p-by-p upper triangular and A is n-by-p dense. The diagonal terms of R are already transformed by tsqr_householder_transform(), so we just need to operate on the submatrix A(:,i:p) as well as the superdiagonal elements of R Inputs: tau - Householder scalar v - Householder vector R - upper triangular submatrix of R, (p-i)-by-(p-i-1) A - dense submatrix of A, n-by-(p-i) */ static int tsqr_householder_hm (const double tau, const gsl_vector * v, gsl_matrix * R, gsl_matrix * A) { /* applies a householder transformation v,tau to matrix [ R ; A ] */ if (tau == 0.0) { return GSL_SUCCESS; } else { size_t j; for (j = 0; j < A->size2; j++) { double R0j = gsl_matrix_get (R, 0, j); double wj; gsl_vector_view A1j = gsl_matrix_column(A, j); gsl_blas_ddot (&A1j.vector, v, &wj); wj += R0j; gsl_matrix_set (R, 0, j, R0j - tau * wj); gsl_blas_daxpy (-tau * wj, v, &A1j.vector); } return GSL_SUCCESS; } } /* tsqr_QR_decomp() Compute the QR decomposition of the matrix [ R ] [ A ] where R is p-by-p upper triangular and A is n-by-p dense. Inputs: R - upper triangular p-by-p matrix A - dense n-by-p matrix tau - Householder scalars */ static int tsqr_QR_decomp (gsl_matrix * R, gsl_matrix * A, gsl_vector * tau) { const size_t n = A->size1; const size_t p = R->size2; if (R->size2 != A->size2) { GSL_ERROR ("R and A have different number of columns", GSL_EBADLEN); } else if (tau->size != p) { GSL_ERROR ("size of tau must be p", GSL_EBADLEN); } else { size_t i; for (i = 0; i < p; i++) { /* Compute the Householder transformation to reduce the j-th column of the matrix [ R ; A ] to a multiple of the j-th unit vector, taking into account the sparse structure of R */ gsl_vector_view c = gsl_matrix_column(A, i); double *Rii = gsl_matrix_ptr(R, i, i); double tau_i = tsqr_householder_transform(Rii, &c.vector); gsl_vector_set (tau, i, tau_i); /* Apply the transformation to the remaining columns and update the norms */ if (i + 1 < p) { gsl_matrix_view Rv = gsl_matrix_submatrix(R, i, i + 1, p - i, p - (i + 1)); gsl_matrix_view Av = gsl_matrix_submatrix(A, 0, i + 1, n, p - (i + 1)); tsqr_householder_hm (tau_i, &(c.vector), &(Rv.matrix), &(Av.matrix)); } } return GSL_SUCCESS; } } static const gsl_multilarge_linear_type tsqr_type = { "tsqr", tsqr_alloc, tsqr_reset, tsqr_accumulate, tsqr_solve, tsqr_rcond, tsqr_lcurve, tsqr_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_tsqr = &tsqr_type; gsl-doc-2.3/multilarge/test.c0000644000175000017500000003611312737536473014275 0ustar eddedd/* multilarge/test.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include static void test_random_matrix_orth(gsl_matrix *m, const gsl_rng *r); static void test_random_matrix_ill(gsl_matrix *m, const gsl_rng *r); static void test_random_vector(gsl_vector *v, const gsl_rng *r, const double lower, const double upper); static void test_random_matrix(gsl_matrix *m, const gsl_rng *r, const double lower, const double upper); static void test_random_vector_noise(const gsl_rng *r, gsl_vector *y); static void test_compare_vectors(const double tol, const gsl_vector * a, const gsl_vector * b, const char * desc); static void test_multifit_solve(const double lambda, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const gsl_vector * diagL, const gsl_matrix * L, double *rnorm, double *snorm, gsl_vector * c); static void test_multilarge_solve(const gsl_multilarge_linear_type * T, const double lambda, const gsl_matrix * X, const gsl_vector * y, gsl_vector * wts, const gsl_vector * diagL, const gsl_matrix * L, double *rnorm, double *snorm, gsl_vector * c); /* generate random square orthogonal matrix via QR decomposition */ static void test_random_matrix_orth(gsl_matrix *m, const gsl_rng *r) { const size_t M = m->size1; gsl_matrix *A = gsl_matrix_alloc(M, M); gsl_vector *tau = gsl_vector_alloc(M); gsl_matrix *R = gsl_matrix_alloc(M, M); test_random_matrix(A, r, -1.0, 1.0); gsl_linalg_QR_decomp(A, tau); gsl_linalg_QR_unpack(A, tau, m, R); gsl_matrix_free(A); gsl_matrix_free(R); gsl_vector_free(tau); } /* construct ill-conditioned matrix via SVD */ static void test_random_matrix_ill(gsl_matrix *m, const gsl_rng *r) { const size_t M = m->size1; const size_t N = m->size2; gsl_matrix *U = gsl_matrix_alloc(M, M); gsl_matrix *V = gsl_matrix_alloc(N, N); gsl_vector *S = gsl_vector_alloc(N); gsl_matrix_view Uv = gsl_matrix_submatrix(U, 0, 0, M, N); const double smin = 16.0 * GSL_DBL_EPSILON; const double smax = 10.0; const double ratio = pow(smin / smax, 1.0 / (N - 1.0)); double s; size_t j; test_random_matrix_orth(U, r); test_random_matrix_orth(V, r); /* compute U * S */ s = smax; for (j = 0; j < N; ++j) { gsl_vector_view uj = gsl_matrix_column(U, j); gsl_vector_scale(&uj.vector, s); s *= ratio; } /* compute m = (U * S) * V' */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, &Uv.matrix, V, 0.0, m); gsl_matrix_free(U); gsl_matrix_free(V); gsl_vector_free(S); } static void test_random_vector(gsl_vector *v, const gsl_rng *r, const double lower, const double upper) { size_t i; size_t N = v->size; for (i = 0; i < N; ++i) { gsl_vector_set(v, i, gsl_rng_uniform(r) * (upper - lower) + lower); } } static void test_random_matrix(gsl_matrix *m, const gsl_rng *r, const double lower, const double upper) { size_t i, j; size_t M = m->size1; size_t N = m->size2; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { gsl_matrix_set(m, i, j, gsl_rng_uniform(r) * (upper - lower) + lower); } } } /* generate Vandermonde matrix using equally spaced input points * on [0,1] */ static void test_vander_matrix(gsl_matrix * m) { const size_t M = m->size1; const size_t N = m->size2; const double dt = 1.0 / (M - 1.0); size_t i, j; for (i = 0; i < M; ++i) { double ti = i * dt; double mij = 1.0; for (j = 0; j < N; ++j) { gsl_matrix_set(m, i, j, mij); mij *= ti; } } } static void test_random_vector_noise(const gsl_rng *r, gsl_vector *y) { size_t i; for (i = 0; i < y->size; ++i) { double *ptr = gsl_vector_ptr(y, i); *ptr += 1.0e-3 * gsl_rng_uniform(r); } } static void test_compare_vectors(const double tol, const gsl_vector * a, const gsl_vector * b, const char * desc) { size_t i; for (i = 0; i < a->size; ++i) { double ai = gsl_vector_get(a, i); double bi = gsl_vector_get(b, i); gsl_test_rel(bi, ai, tol, "%s i=%zu", desc, i); } } /* solve least squares system with multifit SVD */ static void test_multifit_solve(const double lambda, const gsl_matrix * X, const gsl_vector * y, const gsl_vector * wts, const gsl_vector * diagL, const gsl_matrix * L, double *rnorm, double *snorm, gsl_vector * c) { const size_t n = X->size1; const size_t p = X->size2; gsl_multifit_linear_workspace *w = gsl_multifit_linear_alloc(n, p); gsl_matrix *Xs = gsl_matrix_alloc(n, p); gsl_vector *ys = gsl_vector_alloc(n); gsl_vector *cs = gsl_vector_alloc(p); gsl_matrix *LQR = NULL; gsl_vector *Ltau = NULL; gsl_matrix *M = NULL; /* convert to standard form */ if (diagL) { gsl_multifit_linear_wstdform1(diagL, X, wts, y, Xs, ys, w); } else if (L) { const size_t m = L->size1; LQR = gsl_matrix_alloc(m, p); Ltau = gsl_vector_alloc(GSL_MIN(m, p)); M = (m >= p) ? gsl_matrix_alloc(m, p) : gsl_matrix_alloc(n, p); gsl_matrix_memcpy(LQR, L); gsl_multifit_linear_L_decomp(LQR, Ltau); gsl_multifit_linear_wstdform2(LQR, Ltau, X, wts, y, Xs, ys, M, w); } else { gsl_matrix_memcpy(Xs, X); gsl_vector_memcpy(ys, y); } gsl_multifit_linear_svd(Xs, w); gsl_multifit_linear_solve(lambda, Xs, ys, cs, rnorm, snorm, w); /* convert to general form */ if (diagL) gsl_multifit_linear_genform1(diagL, cs, c, w); else if (L) gsl_multifit_linear_wgenform2(LQR, Ltau, X, wts, y, cs, M, c, w); else gsl_vector_memcpy(c, cs); gsl_multifit_linear_free(w); gsl_matrix_free(Xs); gsl_vector_free(ys); gsl_vector_free(cs); if (LQR) gsl_matrix_free(LQR); if (Ltau) gsl_vector_free(Ltau); if (M) gsl_matrix_free(M); } /* solve least squares system with multilarge */ static void test_multilarge_solve(const gsl_multilarge_linear_type * T, const double lambda, const gsl_matrix * X, const gsl_vector * y, gsl_vector * wts, const gsl_vector * diagL, const gsl_matrix * L, double *rnorm, double *snorm, gsl_vector * c) { const size_t n = X->size1; const size_t p = X->size2; const size_t nblock = 5; const size_t nrows = n / nblock; /* number of rows per block */ gsl_multilarge_linear_workspace *w = gsl_multilarge_linear_alloc(T, p); gsl_matrix *Xs = gsl_matrix_alloc(nrows, p); gsl_vector *ys = gsl_vector_alloc(nrows); gsl_vector *cs = gsl_vector_alloc(p); gsl_matrix *LQR = NULL; gsl_vector *Ltau = NULL; size_t rowidx = 0; if (L) { const size_t m = L->size1; LQR = gsl_matrix_alloc(m, p); Ltau = gsl_vector_alloc(p); gsl_matrix_memcpy(LQR, L); gsl_multilarge_linear_L_decomp(LQR, Ltau); } while (rowidx < n) { size_t nleft = n - rowidx; size_t nr = GSL_MIN(nrows, nleft); gsl_matrix_const_view Xv = gsl_matrix_const_submatrix(X, rowidx, 0, nr, p); gsl_vector_const_view yv = gsl_vector_const_subvector(y, rowidx, nr); gsl_vector_view wv; gsl_matrix_view Xsv = gsl_matrix_submatrix(Xs, 0, 0, nr, p); gsl_vector_view ysv = gsl_vector_subvector(ys, 0, nr); if (wts) wv = gsl_vector_subvector(wts, rowidx, nr); /* convert to standard form */ if (diagL) { gsl_multilarge_linear_wstdform1(diagL, &Xv.matrix, wts ? &wv.vector : NULL, &yv.vector, &Xsv.matrix, &ysv.vector, w); } else if (L) { gsl_multilarge_linear_wstdform2(LQR, Ltau, &Xv.matrix, wts ? &wv.vector : NULL, &yv.vector, &Xsv.matrix, &ysv.vector, w); } else { gsl_matrix_memcpy(&Xsv.matrix, &Xv.matrix); gsl_vector_memcpy(&ysv.vector, &yv.vector); } gsl_multilarge_linear_accumulate(&Xsv.matrix, &ysv.vector, w); rowidx += nr; } gsl_multilarge_linear_solve(lambda, cs, rnorm, snorm, w); if (diagL) gsl_multilarge_linear_genform1(diagL, cs, c, w); else if (L) gsl_multilarge_linear_genform2(LQR, Ltau, cs, c, w); else gsl_vector_memcpy(c, cs); gsl_multilarge_linear_free(w); gsl_matrix_free(Xs); gsl_vector_free(ys); gsl_vector_free(cs); if (LQR) gsl_matrix_free(LQR); if (Ltau) gsl_vector_free(Ltau); } static void test_random(const gsl_multilarge_linear_type * T, const size_t n, const size_t p, const double tol, const gsl_rng * r) { const double tol1 = 1.0e3 * tol; gsl_matrix *X = gsl_matrix_alloc(n, p); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *c = gsl_vector_alloc(p); gsl_vector *w = gsl_vector_alloc(n); gsl_vector *diagL = gsl_vector_alloc(p); gsl_matrix *Lsqr = gsl_matrix_alloc(p, p); gsl_matrix *Ltall = gsl_matrix_alloc(5*p, p); gsl_vector *c0 = gsl_vector_alloc(p); gsl_vector *c1 = gsl_vector_alloc(p); double rnorm0, snorm0; double rnorm1, snorm1; char str[2048]; size_t i; /* generate LS system */ test_random_matrix_ill(X, r); /*test_random_matrix(X, r, -1.0, 1.0);*/ test_random_vector(c, r, -1.0, 1.0); /* compute y = X c + noise */ gsl_blas_dgemv(CblasNoTrans, 1.0, X, c, 0.0, y); test_random_vector_noise(r, y); /* random weights */ test_random_vector(w, r, 0.0, 1.0); /* random diag(L) */ test_random_vector(diagL, r, 1.0, 5.0); /* random square L */ test_random_matrix(Lsqr, r, -5.0, 5.0); /* random tall L */ test_random_matrix(Ltall, r, -10.0, 10.0); for (i = 0; i < 2; ++i) { double lambda = pow(10.0, -(double) i); /* unweighted with L = I */ { test_multifit_solve(lambda, X, y, NULL, NULL, NULL, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, NULL, NULL, NULL, &rnorm1, &snorm1, c1); sprintf(str, "random %s unweighted stdform n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* weighted, L = diag(L) */ { test_multifit_solve(lambda, X, y, w, diagL, NULL, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, w, diagL, NULL, &rnorm1, &snorm1, c1); sprintf(str, "random %s weighted diag(L) n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* unweighted, L = diag(L) */ { test_multifit_solve(lambda, X, y, NULL, diagL, NULL, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, NULL, diagL, NULL, &rnorm1, &snorm1, c1); sprintf(str, "random %s unweighted diag(L) n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* weighted, L = square */ { test_multifit_solve(lambda, X, y, w, NULL, Lsqr, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, w, NULL, Lsqr, &rnorm1, &snorm1, c1); sprintf(str, "random %s weighted Lsqr n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* unweighted, L = square */ { test_multifit_solve(lambda, X, y, NULL, NULL, Lsqr, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, NULL, NULL, Lsqr, &rnorm1, &snorm1, c1); sprintf(str, "random %s unweighted Lsqr n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* weighted, L = tall */ { test_multifit_solve(lambda, X, y, w, NULL, Ltall, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, w, NULL, Ltall, &rnorm1, &snorm1, c1); sprintf(str, "random %s weighted Ltall n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } /* unweighted, L = tall */ { test_multifit_solve(lambda, X, y, NULL, NULL, Ltall, &rnorm0, &snorm0, c0); test_multilarge_solve(T, lambda, X, y, NULL, NULL, Ltall, &rnorm1, &snorm1, c1); sprintf(str, "random %s unweighted Ltall n=%zu p=%zu lambda=%g", T->name, n, p, lambda); test_compare_vectors(tol, c0, c1, str); gsl_test_rel(rnorm1, rnorm0, tol1, "rnorm %s", str); gsl_test_rel(snorm1, snorm0, tol, "snorm %s", str); } } gsl_matrix_free(X); gsl_vector_free(y); gsl_vector_free(c); gsl_vector_free(w); gsl_vector_free(diagL); gsl_matrix_free(Lsqr); gsl_matrix_free(Ltall); gsl_vector_free(c0); gsl_vector_free(c1); } int main (void) { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); gsl_ieee_env_setup(); { const double tol1 = 1.0e-8; const double tol2 = 1.0e-11; const size_t n_vals[] = { 40, 356, 501 }; const size_t p_vals[] = { 40, 213, 345 }; size_t i; for (i = 0; i < 2; ++i) { size_t n = n_vals[i]; size_t p = p_vals[i]; /* generate random ill-conditioned LS system and test */ test_random(gsl_multilarge_linear_normal, n, p, tol1, r); test_random(gsl_multilarge_linear_tsqr, n, p, tol2, r); } } gsl_rng_free(r); exit (gsl_test_summary ()); } gsl-doc-2.3/min/0000755000175000017500000000000013022553155011544 5ustar eddeddgsl-doc-2.3/min/golden.c0000664000175000017500000000655512616157443013205 0ustar eddedd/* min/golden.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; gsl-doc-2.3/min/bracketing.c0000664000175000017500000000775112616157443014045 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; } gsl-doc-2.3/min/test.h0000664000175000017500000000306212616157443012707 0ustar eddedd/* min/test.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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); gsl-doc-2.3/min/Makefile.am0000664000175000017500000000070112616157443013610 0ustar eddeddnoinst_LTLIBRARIES = libgslmin.la pkginclude_HEADERS = gsl_min.h noinst_HEADERS = min.h AM_CPPFLAGS = -I$(top_srcdir) libgslmin_la_SOURCES = fsolver.c golden.c brent.c convergence.c bracketing.c quad_golden.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 gsl-doc-2.3/min/min.h0000664000175000017500000000174312616157443012517 0ustar eddedd/* min/min.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 (!gsl_finite(*yp)) \ GSL_ERROR("computed function value is infinite or NaN", GSL_EBADFUNC); \ } while (0) gsl-doc-2.3/min/brent.c0000664000175000017500000001162212616157443013036 0ustar eddedd/* min/brent.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; } else { *x_upper = u; *f_upper = f_u; } 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_SUCCESS; } 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; gsl-doc-2.3/min/Makefile.in0000644000175000017500000010450613022372405013614 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmin_la_LIBADD = am_libgslmin_la_OBJECTS = fsolver.lo golden.lo brent.lo convergence.lo \ bracketing.lo quad_golden.lo libgslmin_la_OBJECTS = $(am_libgslmin_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmin.la pkginclude_HEADERS = gsl_min.h noinst_HEADERS = min.h AM_CPPFLAGS = -I$(top_srcdir) libgslmin_la_SOURCES = fsolver.c golden.c brent.c convergence.c bracketing.c quad_golden.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu min/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmin.la: $(libgslmin_la_OBJECTS) $(libgslmin_la_DEPENDENCIES) $(EXTRA_libgslmin_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmin_la_OBJECTS) $(libgslmin_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bracketing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quad_golden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/min/ChangeLog0000664000175000017500000000602112616157443013327 0ustar eddedd2009-07-11 Brian Gough * quad_golden.c: added new safeguarded step-length algorithm from James Howse 2009-07-09 Brian Gough * fsolver.c (gsl_min_fminimizer_free): handle NULL argument in free 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-01-09 Brian Gough * brent.c (brent_iterate): remove spurious early return 2007-07-30 Brian Gough * min.h (SAFE_FUNC_CALL): use gsl_finite instead of finite 2005-09-09 Brian Gough * min.h: improved error message, function can be discontinuous despite what error message said. 2005-04-28 Brian Gough * 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 * brent.c (brent_iterate): corrected condition for setting to +/-tolerance. Sun Apr 7 15:22:11 2002 Brian Gough * 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 * test.c (main): added an extra test Sun Jul 15 17:53:26 2001 Brian Gough * eliminated interval type, changed order of arguments to set functions Tue Apr 17 22:13:58 2001 Brian Gough * fsolver.c (gsl_min_fminimizer_alloc): removed unnecessary status variable Mon Apr 2 14:54:33 2001 Brian Gough * 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 * 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 * 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 * 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 * made all internal functions static Wed Oct 13 16:08:03 1999 Brian Gough * rewritten to allow initial values to be specified gsl-doc-2.3/min/fsolver.c0000664000175000017500000001165012616157443013405 0ustar eddedd/* min/fsolver.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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) { RETURN_IF_NULL (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; } gsl-doc-2.3/min/convergence.c0000664000175000017500000000332412616157443014222 0ustar eddedd/* min/convergence.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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 ; } gsl-doc-2.3/min/gsl_min.h0000664000175000017500000000770712616157443013372 0ustar eddedd/* min/gsl_min.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; GSL_VAR const gsl_min_fminimizer_type * gsl_min_fminimizer_quad_golden; 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__ */ gsl-doc-2.3/min/quad_golden.c0000664000175000017500000002656712616157443014224 0ustar eddedd/*----------------------------------------------------------------------------*/ /* */ /* quad_golden.c */ /* */ /* Copyright (C) 2007 James Howse */ /* Copyright (C) 2009 Brian Gough */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 3 of the License, or (at */ /* your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, but */ /* WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ /* General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public 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 algorithm performs univariate minimization (i.e., line search). */ /* It requires only objective function values g(x) to compute the minimum. */ /* The algorithm maintains an interval of uncertainty [a,b] and a point x */ /* in the interval [a,b] such that a < x < b, and g(a) > g(x) and */ /* g(x) < g(b). The algorithm also maintains the three points with the */ /* smallest objective values x, v and w such that g(x) < g(v) < g(w). The */ /* algorithm terminates when max( x - a, b - x ) < 2(r |x| + t) where r */ /* and t are small positive reals. At a given iteration, the algorithm */ /* first fits a quadratic through the three points (x, g(x)), (v, g(v)) */ /* and (w, g(w)) and computes the location of the minimum u of the */ /* resulting quadratic. If u is in the interval [a,b] then g(u) is */ /* computed. If u is not in the interval [a,b], and either v < x and */ /* w < x, or v > x and w > x (i.e., the quadratic is extrapolating), then */ /* a point u' is computed using a safeguarding procedure and g(u') is */ /* computed. If u is not in the interval [a,b], and the quadratic is not */ /* extrapolating, then a point u'' is computed using approximate golden */ /* section and g(u'') is computed. After evaluating g() at the */ /* appropriate new point, a, b, x, v, and w are updated and the next */ /* iteration is performed. The algorithm is based on work presented in */ /* the following references. */ /* */ /* Algorithms for Minimization without derivatives */ /* Richard Brent */ /* Prentice-Hall Inc., Englewood Cliffs, NJ, 1973 */ /* */ /* Safeguarded Steplength Algorithms for Optimization using Descent Methods */ /* Philip E. Gill and Walter Murray */ /* Division of Numerical Analysis and Computing */ /* National Physical Laboratory, Teddington, United Kingdom */ /* NPL Report NAC 37, August 1974 */ /* */ /*----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include "min.h" #define REL_ERR_VAL 1.0e-06 #define ABS_ERR_VAL 1.0e-10 #define GOLDEN_MEAN 0.3819660112501052 /* (3 - sqrt(5))/2 */ #define GOLDEN_RATIO 1.6180339887498950 /* (1 + sqrt(5))/2 */ #define DEBUG_PRINTF(x) /* do nothing */ typedef struct { double step_size, stored_step, prev_stored_step; double x_prev_small, f_prev_small, x_small, f_small; unsigned int num_iter; } quad_golden_state_t; static int quad_golden_init (void *vstate, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper) { quad_golden_state_t *state = (quad_golden_state_t *) vstate; /* For the original behavior, the first value for x_minimum_minimum passed in by the user should be a golden section step but we don't enforce this here. */ state->x_prev_small = x_minimum; state->x_small = x_minimum; state->f_prev_small = f_minimum; state->f_small = f_minimum; state->step_size = 0.0; state->stored_step = 0.0; state->prev_stored_step = 0.0; state->num_iter = 0; x_lower = 0 ; /* avoid warnings about unused variables */ x_upper = 0 ; f_lower = 0 ; f_upper = 0 ; f = 0; return GSL_SUCCESS; } static int quad_golden_iterate (void *vstate, gsl_function * f, double *x_minimum, double *f_minimum, double *x_lower, double *f_lower, double *x_upper, double *f_upper) { quad_golden_state_t *state = (quad_golden_state_t *) vstate; const double x_m = *x_minimum; const double f_m = *f_minimum; const double x_l = *x_lower; const double x_u = *x_upper; const double x_small = state->x_small; const double f_small = state->f_small; const double x_prev_small = state->x_prev_small; const double f_prev_small = state->f_prev_small; double stored_step = state->stored_step; /* update on exit */ double prev_stored_step = state->prev_stored_step; /* update on exit */ double step_size = state->step_size; /* update on exit */ double quad_step_size = prev_stored_step; double x_trial; double x_eval, f_eval; double x_midpoint = 0.5 * (x_l + x_u); double tol = REL_ERR_VAL * fabs (x_m) + ABS_ERR_VAL; /* total error tolerance */ if (fabs (stored_step) - tol > -2.0 * GSL_DBL_EPSILON) { /* Fit quadratic */ double c3 = (x_m - x_small) * (f_m - f_prev_small); double c2 = (x_m - x_prev_small) * (f_m - f_small); double c1 = (x_m - x_prev_small) * c2 - (x_m - x_small) * c3; c2 = 2.0 * (c2 - c3); if (fabs (c2) > GSL_DBL_EPSILON) /* if( c2 != 0 ) */ { if (c2 > 0.0) c1 = -c1; c2 = fabs (c2); quad_step_size = c1 / c2; } else { /* Handle case where c2 ~=~ 0 */ /* Insure that the line search will NOT take a quadratic interpolation step in this iteration */ quad_step_size = stored_step; } prev_stored_step = stored_step; stored_step = step_size; } x_trial = x_m + quad_step_size; if (fabs (quad_step_size) < fabs (0.5 * prev_stored_step) && x_trial > x_l && x_trial < x_u) { /* Take quadratic interpolation step */ step_size = quad_step_size; /* Do not evaluate function too close to x_l or x_u */ if ((x_trial - x_l) < 2.0 * tol || (x_u - x_trial) < 2.0 * tol) { step_size = (x_midpoint >= x_m ? +1.0 : -1.0) * fabs(tol); } DEBUG_PRINTF(("quadratic step: %g\n", step_size)); } else if ((x_small != x_prev_small && x_small < x_m && x_prev_small < x_m) || (x_small != x_prev_small && x_small > x_m && x_prev_small > x_m)) { /* Take safeguarded function comparison step */ double outside_interval, inside_interval; if (x_small < x_m) { outside_interval = x_l - x_m; inside_interval = x_u - x_m; } else { outside_interval = x_u - x_m; inside_interval = x_l - x_m; } if (fabs (inside_interval) <= tol) { /* Swap inside and outside intervals */ double tmp = outside_interval; outside_interval = inside_interval; inside_interval = tmp; } { double step = inside_interval; double scale_factor; if (fabs (outside_interval) < fabs (inside_interval)) { scale_factor = 0.5 * sqrt (-outside_interval / inside_interval); } else { scale_factor = (5.0 / 11.0) * (0.1 - inside_interval / outside_interval); } state->stored_step = step; step_size = scale_factor * step; } DEBUG_PRINTF(("safeguard step: %g\n", step_size)); } else { /* Take golden section step */ double step; if (x_m < x_midpoint) { step = x_u - x_m; } else { step = x_l - x_m; } state->stored_step = step; step_size = GOLDEN_MEAN * step; DEBUG_PRINTF(("golden step: %g\n", step_size)); } /* Do not evaluate function too close to x_minimum */ if (fabs (step_size) > tol) { x_eval = x_m + step_size; } else { x_eval = x_m + (step_size >= 0 ? +1.0 : -1.0) * fabs(tol); } /* Evaluate function at the new point x_eval */ SAFE_FUNC_CALL(f, x_eval, &f_eval); /* Update {x,f}_lower, {x,f}_upper, {x,f}_prev_small, {x,f}_small, and {x,f}_minimum */ if (f_eval <= f_m) { if (x_eval < x_m) { *x_upper = x_m; *f_upper = f_m; } else { *x_lower = x_m; *f_upper = f_m; } state->x_prev_small = x_small; state->f_prev_small = f_small; state->x_small = x_m; state->f_small = f_m; *x_minimum = x_eval; *f_minimum = f_eval; } else { if (x_eval < x_m) { *x_lower = x_eval; *f_lower = f_eval; } else { *x_upper = x_eval; *f_upper = f_eval; } if (f_eval <= f_small || fabs (x_small - x_m) < 2.0 * GSL_DBL_EPSILON) { state->x_prev_small = x_small; state->f_prev_small = f_small; state->x_small = x_eval; state->f_small = f_eval; } else if (f_eval <= f_prev_small || fabs (x_prev_small - x_m) < 2.0 * GSL_DBL_EPSILON || fabs (x_prev_small - x_small) < 2.0 * GSL_DBL_EPSILON) { state->x_prev_small = x_eval; state->f_prev_small = f_eval; } } /* Update stored values for next iteration */ state->stored_step = stored_step; state->prev_stored_step = prev_stored_step; state->step_size = step_size; state->num_iter++; DEBUG_PRINTF(("[%d] Final State: %g %g %g\n", state->num_iter, x_l, x_m, x_u)); return GSL_SUCCESS; } static const gsl_min_fminimizer_type quad_golden_type = { "quad-golden", /* name */ sizeof (quad_golden_state_t), &quad_golden_init, &quad_golden_iterate }; const gsl_min_fminimizer_type *gsl_min_fminimizer_quad_golden = &quad_golden_type; gsl-doc-2.3/min/test_funcs.c0000664000175000017500000000354512616157443014106 0ustar eddedd/* min/test_funcs.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #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)); } gsl-doc-2.3/min/test.c0000664000175000017500000001443612616157443012711 0ustar eddedd/* min/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #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] = gsl_min_fminimizer_quad_golden; fminimizer[3] = 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 status=%d\n", a, GSL_FN_EVAL(f, a), m, GSL_FN_EVAL(f, m), b, GSL_FN_EVAL(f, b), status); #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; } gsl-doc-2.3/complex/0000755000175000017500000000000013022553152012425 5ustar eddeddgsl-doc-2.3/complex/results_zreal.h0000664000175000017500000000434412616157443015516 0ustar eddedd {FN (pow_real), ARG(0.0e+00,0.0e+00), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,0.0e+00), 1.0e+00, RES(0e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,0.0e+00), 5.0e-01, RES(0e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,0.0e+00), 2.0e+00, RES(0e0, 0.0)}, {FN (pow_real), ARG(1.0e+00,0.0e+00), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(1.0e+00,0.0e+00), 1.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(1.0e+00,0.0e+00), 5.0e-01, RES(1e0, 0.0)}, {FN (pow_real), ARG(1.0e+00,0.0e+00), 2.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,1.0e+00), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,1.0e+00), 1.0e+00, RES(0, 1)}, {FN (pow_real), ARG(0.0e+00,1.0e+00), 5.0e-01, RES(7.0710678118654752440e-1, 7.0710678118654752440e-1)}, {FN (pow_real), ARG(0.0e+00,1.0e+00), 2.0e+00, RES(-1e0, 0.0)}, {FN (pow_real), ARG(-1.0e+00,0.0e+00), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(-1.0e+00,0.0e+00), 1.0e+00, RES(-1e0, 0.0)}, {FN (pow_real), ARG(-1.0e+00,0.0e+00), 5.0e-01, RES(0, 1)}, {FN (pow_real), ARG(-1.0e+00,0.0e+00), 2.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,-1.0e+00), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(0.0e+00,-1.0e+00), 1.0e+00, RES(0, -1)}, {FN (pow_real), ARG(0.0e+00,-1.0e+00), 5.0e-01, RES(7.0710678118654752440e-1, -7.0710678118654752440e-1)}, {FN (pow_real), ARG(0.0e+00,-1.0e+00), 2.0e+00, RES(-1e0, 0.0)}, {FN (pow_real), ARG(5.0e-01,1.00000000000000005551e-01), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(5.0e-01,1.00000000000000005551e-01), 1.0e+00, RES(5e-1, 1.0000000000000000555e-1)}, {FN (pow_real), ARG(5.0e-01,1.00000000000000005551e-01), 5.0e-01, RES(7.1059902594898006379e-1, 7.0363169908974695409e-2)}, {FN (pow_real), ARG(5.0e-01,1.00000000000000005551e-01), 2.0e+00, RES(2.3999999999999999889e-1, 1.0000000000000000555e-1)}, {FN (pow_real), ARG(5.0e-01,-1.00000000000000005551e-01), 0.0e+00, RES(1e0, 0.0)}, {FN (pow_real), ARG(5.0e-01,-1.00000000000000005551e-01), 1.0e+00, RES(5e-1, -1.0000000000000000555e-1)}, {FN (pow_real), ARG(5.0e-01,-1.00000000000000005551e-01), 5.0e-01, RES(7.1059902594898006379e-1, -7.0363169908974695409e-2)}, {FN (pow_real), ARG(5.0e-01,-1.00000000000000005551e-01), 2.0e+00, RES(2.3999999999999999889e-1, -1.0000000000000000555e-1)}, gsl-doc-2.3/complex/results.h0000644000175000017500000172434712766553044014337 0ustar eddedd {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 (tan), ARG(0.0e+00,1.0e+03), RES(0.0, 1.0)}, {FN (tan), ARG(0.0e+00,-1.0e+03), RES(0.0, -1.0)}, {FN (tan), ARG(0.0e+00,-1.23456e+05), RES(0.0, -1.0)}, {FN (tan), ARG(1.0e+03,0.0e+00), RES(1.470324155702718e+00, 0.0)}, {FN (tan), ARG(-1.0e+03,0.0e+00), RES(-1.470324155702718e+00, 0.0)}, {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)}, gsl-doc-2.3/complex/Makefile.am0000664000175000017500000000150212616157443014474 0ustar eddeddnoinst_LTLIBRARIES = libgslcomplex.la pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h AM_CPPFLAGS = -I$(top_srcdir) libgslcomplex_la_SOURCES = math.c inline.c TESTS = $(check_PROGRAMS) check_PROGRAMS = test test_SOURCES = test.c results.h results1.h results2.h results_real.h results_zreal.h test_LDADD = libgslcomplex.la ../err/libgslerr.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la results: emacs -batch -l test.el -f test1 | sed 's/00\+e/0e/g' > results1.h emacs -batch -l test.el -f test2 | sed 's/00\+e/0e/g' > results.h emacs -batch -l test.el -f test3 | sed 's/00\+e/0e/g' > results_real.h emacs -batch -l test.el -f test4 | sed 's/00\+e/0e/g' > results2.h emacs -batch -l test.el -f test5 | sed 's/00\+e/0e/g' > results_zreal.h gsl-doc-2.3/complex/results_real.h0000664000175000017500000002060412616157443015321 0ustar eddedd {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)}, gsl-doc-2.3/complex/results1.h0000664000175000017500000013176112616157443014406 0ustar eddedd {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)}, gsl-doc-2.3/complex/TODO0000664000175000017500000000156712616157443013143 0ustar eddedd# -*- org -*- #+CATEGORY: complex * 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. * Comparing the Complex Arithmetic routines in Section 5.5 of Numerical Recipes gsl_complex_div() uses simple complex division while 5.5.5 has a more sophisticated one that avoids underflow/overflow. gsl-doc-2.3/complex/gsl_complex_math.h0000664000175000017500000001364012616157443016144 0ustar eddedd/* complex/gsl_complex_math.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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_polar (double r, double theta); /* r= r e^(i theta) */ INLINE_DECL gsl_complex gsl_complex_rect (double x, double y); /* r= real+i*imag */ #ifdef HAVE_INLINE INLINE_FUN 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__ */ gsl-doc-2.3/complex/math.c0000644000175000017500000005556112766553044013554 0ustar eddedd/* complex/math.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 * * 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 #include #include #include #include /********************************************************************** * Complex numbers **********************************************************************/ 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) { if (GSL_REAL (b) == 0 && GSL_IMAG (b) == 0.0) { GSL_SET_COMPLEX (&z, 1.0, 0.0); } else { GSL_SET_COMPLEX (&z, 0.0, 0.0); } } else if (GSL_REAL (b) == 1.0 && GSL_IMAG (b) == 0.0) { return a; } else if (GSL_REAL (b) == -1.0 && GSL_IMAG (b) == 0.0) { return gsl_complex_inverse (a); } 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) { if (b == 0) { GSL_SET_COMPLEX (&z, 1, 0); } else { 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 D = pow (cos (R), 2.0) + pow (sinh (I), 2.0); double F = 1 + pow(cos (R)/sinh (I), 2.0); GSL_SET_COMPLEX (&z, 0.5 * sin (2 * R) / D, 1 / (tanh (I) * F)); } 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); } gsl-doc-2.3/complex/inline.c0000664000175000017500000000161612616157443014070 0ustar eddedd/* complex/inline.c * * Copyright (C) 2008 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/complex/results2.h0000664000175000017500000001056312766555405014411 0ustar eddedd {FN (pow), ARG(1.0e+00,0.0e+00), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(1.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(0.0e+00,1.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(-1.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(0.0e+00,-1.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(5.0e-01,1.00000000000000005551e-01), RES(1e0, 0.0)}, {FN (pow), ARG(1.0e+00,0.0e+00), ARG(5.0e-01,-1.00000000000000005551e-01), RES(1e0, 0.0)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(1.0e+00,0.0e+00), RES(0, 1)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(0.0e+00,1.0e+00), RES(2.0787957635076190855e-1, 0.0)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(-1.0e+00,0.0e+00), RES(0, -1)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(0.0e+00,-1.0e+00), RES(4.8104773809653516555e0, 0.0)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(5.0e-01,1.00000000000000005551e-01), RES(6.0431891044739184057e-1, 6.0431891044739184057e-1)}, {FN (pow), ARG(0.0e+00,1.0e+00), ARG(5.0e-01,-1.00000000000000005551e-01), RES(8.2737771622906514822e-1, 8.2737771622906514822e-1)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(1.0e+00,0.0e+00), RES(-1e0, 0.0)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(0.0e+00,1.0e+00), RES(4.3213918263772249774e-2, 0.0)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(-1.0e+00,0.0e+00), RES(-1e0, 0.0)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(0.0e+00,-1.0e+00), RES(2.3140692632779269006e1, 0.0)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(5.0e-01,1.00000000000000005551e-01), RES(0, 7.3040269104864559813e-1)}, {FN (pow), ARG(-1.0e+00,0.0e+00), ARG(5.0e-01,-1.00000000000000005551e-01), RES(0, 1.3691077706248469087e0)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(1.0e+00,0.0e+00), RES(0, -1)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(0.0e+00,1.0e+00), RES(4.8104773809653516555e0, 0.0)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(-1.0e+00,0.0e+00), RES(0, 1)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(0.0e+00,-1.0e+00), RES(2.0787957635076190855e-1, 0.0)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(5.0e-01,1.00000000000000005551e-01), RES(8.2737771622906514822e-1, -8.2737771622906514822e-1)}, {FN (pow), ARG(0.0e+00,-1.0e+00), ARG(5.0e-01,-1.00000000000000005551e-01), RES(6.0431891044739184057e-1, -6.0431891044739184057e-1)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(1.0e+00,0.0e+00), RES(5e-1, 1.0000000000000000555e-1)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(0.0e+00,1.0e+00), RES(6.4160554864378080418e-1, -5.1201864456768275590e-1)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(-1.0e+00,0.0e+00), RES(1.9230769230769230687e0, -3.8461538461538463509e-1)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(0.0e+00,-1.0e+00), RES(9.5219021866126714108e-1, 7.5987364224031834571e-1)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(5.0e-01,1.00000000000000005551e-01), RES(6.9977300530987816719e-1, 2.1940939105372143160e-2)}, {FN (pow), ARG(5.0e-01,1.00000000000000005551e-01), ARG(5.0e-01,-1.00000000000000005551e-01), RES(7.1829191470060938876e-1, 1.2038189555821612762e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(0.0e+00,0.0e+00), RES(1e0, 0.0)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(1.0e+00,0.0e+00), RES(5e-1, -1.0000000000000000555e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(0.0e+00,1.0e+00), RES(9.5219021866126714108e-1, -7.5987364224031834571e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(-1.0e+00,0.0e+00), RES(1.9230769230769230687e0, 3.8461538461538463509e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(0.0e+00,-1.0e+00), RES(6.4160554864378080418e-1, 5.1201864456768275590e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(5.0e-01,1.00000000000000005551e-01), RES(7.1829191470060938876e-1, -1.2038189555821612762e-1)}, {FN (pow), ARG(5.0e-01,-1.00000000000000005551e-01), ARG(5.0e-01,-1.00000000000000005551e-01), RES(6.9977300530987816719e-1, -2.1940939105372143160e-2)}, {FN (pow), ARG(0.0e+00,9.0e+00), ARG(2.0e+00,0.0e+00), RES(-8.1e+01, 0.0e+00)}, gsl-doc-2.3/complex/Makefile.in0000644000175000017500000010446513022372405014504 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcomplex_la_LIBADD = am_libgslcomplex_la_OBJECTS = math.lo inline.lo libgslcomplex_la_OBJECTS = $(am_libgslcomplex_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcomplex.la pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h AM_CPPFLAGS = -I$(top_srcdir) libgslcomplex_la_SOURCES = math.c inline.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c results.h results1.h results2.h results_real.h results_zreal.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu complex/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcomplex.la: $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_DEPENDENCIES) $(EXTRA_libgslcomplex_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS results: emacs -batch -l test.el -f test1 | sed 's/00\+e/0e/g' > results1.h emacs -batch -l test.el -f test2 | sed 's/00\+e/0e/g' > results.h emacs -batch -l test.el -f test3 | sed 's/00\+e/0e/g' > results_real.h emacs -batch -l test.el -f test4 | sed 's/00\+e/0e/g' > results2.h emacs -batch -l test.el -f test5 | sed 's/00\+e/0e/g' > results_zreal.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: gsl-doc-2.3/complex/ChangeLog0000664000175000017500000000505512616157443014221 0ustar eddedd2010-05-06 Brian Gough * test.c (main): added tests for functions like pow_real 2008-07-03 Brian Gough * math.c: handle inline functions separately * gsl_complex_math.h: add declarations for inline functions * inline.c: separate file for inline functions * Makefile.am (INCLUDES): use top_srcdir 2007-09-14 Brian Gough * test.c: add a margin of safety on tests for released versions, as in special functions 2007-08-30 Brian Gough * Makefile.am (test_SOURCES): added missing file results2.h 2007-08-30 Brian Gough * Makefile.am (test_SOURCES): added missing file results2.h 2007-08-15 Brian Gough * math.c (gsl_complex_pow): handle (0,0)^(0,0) (x,y)^(1,0) and (x,y)^(-1,0) as special cases 2003-01-25 Brian Gough * math.c (gsl_complex_arccsc_real): fixed bug for incorrect sign of imaginary part when -1 * math.c (gsl_complex_arg): enforce special case arg(0,0) = 0.0 Mon Sep 10 22:57:27 2001 Brian Gough * 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 * test.el: trim the tests down to a more reasonable size Thu Aug 9 15:48:48 2001 Brian Gough * math.c (gsl_complex_tanh): improve accuracy for large R Fri Jul 27 23:29:10 2001 Brian Gough * 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 * 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 * 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 * 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 * gsl_complex.h: moved into complex/ subdirectory from top-level gsl-doc-2.3/complex/test.c0000644000175000017500000001525712766553044013600 0ustar eddedd/* complex/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include 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 fzz { char *name; gsl_complex (*f) (gsl_complex z1, gsl_complex z2); double x1; double y1; double x2; double y2; double fx; double fy; }; struct freal { char *name; gsl_complex (*f) (double x); double x; double fx; double fy; }; struct fzreal { char *name; gsl_complex (*f) (gsl_complex z, double a); double x; double y; double a; 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 fzz listzz[] = { {FN (pow), ARG(0.0,0.0), ARG(0.0,0.0), RES(1.0, 0.0)}, #include "results2.h" {"", 0, 0, 0, 0, 0, 0, 0} }; struct freal listreal[] = { #include "results_real.h" {"", 0, 0, 0, 0} }; struct fzreal listzreal[] = { #include "results_zreal.h" {"", 0, 0, 0, 0, 0, 0} }; #ifndef TEST_FACTOR #ifdef RELEASED #define TEST_FACTOR 100.0 #else #define TEST_FACTOR 1.0 #endif #endif int main (void) { size_t i = 0; const double tol = TEST_FACTOR * 10 * GSL_DBL_EPSILON; const double tolf = TEST_FACTOR * 10 * GSL_FLT_EPSILON; 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, tol, "gsl_complex_polar real part at (r=%g,t=%g)", r, t); gsl_test_rel (GSL_IMAG(z), y, tol, "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, tol, "%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, tol, "%s real part at (%g,%g)", t.name, t.x, t.y); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,%g)", t.name, t.x, t.y); i++; } i = 0; while (listzz[i].f) { struct fzz t = listzz[i]; gsl_complex z1 = gsl_complex_rect (t.x1, t.y1); gsl_complex z2 = gsl_complex_rect (t.x2, t.y2); gsl_complex fz = (t.f) (z1, z2); double fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x1 = "); gsl_ieee_fprintf_double (stdout, &t.x1); printf("\n"); printf("y1 = "); gsl_ieee_fprintf_double (stdout, &t.y1); printf("\n"); printf("x2 = "); gsl_ieee_fprintf_double (stdout, &t.x2); printf("\n"); printf("y2 = "); gsl_ieee_fprintf_double (stdout, &t.y2); 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, tolf, "%s real part at (%g,%g;%g,%g)", t.name, t.x1, t.y1, t.x2, t.y2); gsl_test_rel (fy, t.fy, tolf, "%s imag part at (%g,%g;%g,%g)", t.name, t.x1, t.y1, t.x2, t.y2); 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, tol, "%s real part at (%g,0)", t.name, t.x); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,0)", t.name, t.x); i++; } i = 0; while (listzreal[i].f) { struct fzreal t = listzreal[i]; gsl_complex z = gsl_complex_rect (t.x, t.y); gsl_complex fz = (t.f) (z, t.a); 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("a = "); gsl_ieee_fprintf_double (stdout, &t.a); 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, tol, "%s real part at (%g,0)", t.name, t.x); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,0)", t.name, t.x); i++; } exit (gsl_test_summary ()); } gsl-doc-2.3/complex/gsl_complex.h0000664000175000017500000000645612616157443015142 0ustar eddedd/* complex/gsl_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/vector/0000755000175000017500000000000013022553152012260 5ustar eddeddgsl-doc-2.3/vector/subvector.c0000664000175000017500000000713612616157443014464 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/subvector_source.c0000664000175000017500000000456612616157443016050 0ustar eddedd/* vector/subvector_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/vector/reim.c0000664000175000017500000000167012616157443013401 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/oper.c0000664000175000017500000000346012616157443013411 0ustar eddedd#include #include #include #include #include #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 gsl-doc-2.3/vector/gsl_vector_float.h0000664000175000017500000001650412616157443016010 0ustar eddedd/* vector/gsl_vector_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_float * u, const gsl_vector_float * v); 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); int gsl_vector_float_isnonneg (const gsl_vector_float * v); INLINE_DECL float gsl_vector_float_get (const gsl_vector_float * v, const size_t i); INLINE_DECL void gsl_vector_float_set (gsl_vector_float * v, const size_t i, float x); INLINE_DECL float * gsl_vector_float_ptr (gsl_vector_float * v, const size_t i); INLINE_DECL const float * gsl_vector_float_const_ptr (const gsl_vector_float * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN float gsl_vector_float_get (const gsl_vector_float * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_float_set (gsl_vector_float * v, const size_t i, float x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN float * gsl_vector_float_ptr (gsl_vector_float * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (float *) (v->data + i * v->stride); } INLINE_FUN const float * gsl_vector_float_const_ptr (const gsl_vector_float * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/file_source.c0000664000175000017500000000443412616157443014745 0ustar eddedd/* vector/file_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 gsl-doc-2.3/vector/test_static.c0000664000175000017500000000015112616157443014764 0ustar eddedd#undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-doc-2.3/vector/copy.c0000664000175000017500000000336112616157443013416 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/gsl_vector.h0000664000175000017500000000112612616157443014615 0ustar eddedd#ifndef __GSL_VECTOR_H__ #define __GSL_VECTOR_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_VECTOR_H__ */ gsl-doc-2.3/vector/Makefile.am0000664000175000017500000000236312616157443014335 0ustar eddeddnoinst_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 AM_CPPFLAGS = -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 = 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 oper_complex_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 gsl-doc-2.3/vector/gsl_vector_complex_long_double.h0000664000175000017500000002335712757077315020734 0ustar eddedd/* vector/gsl_vector_complex_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 */ 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_equal (const gsl_vector_complex_long_double * u, const gsl_vector_complex_long_double * v); 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); int gsl_vector_complex_long_double_isnonneg (const gsl_vector_complex_long_double * v); int gsl_vector_complex_long_double_add (gsl_vector_complex_long_double * a, const gsl_vector_complex_long_double * b); int gsl_vector_complex_long_double_sub (gsl_vector_complex_long_double * a, const gsl_vector_complex_long_double * b); int gsl_vector_complex_long_double_mul (gsl_vector_complex_long_double * a, const gsl_vector_complex_long_double * b); int gsl_vector_complex_long_double_div (gsl_vector_complex_long_double * a, const gsl_vector_complex_long_double * b); int gsl_vector_complex_long_double_scale (gsl_vector_complex_long_double * a, const gsl_complex_long_double x); int gsl_vector_complex_long_double_add_constant (gsl_vector_complex_long_double * a, const gsl_complex_long_double x); INLINE_DECL gsl_complex_long_double gsl_vector_complex_long_double_get (const gsl_vector_complex_long_double * v, const size_t i); INLINE_DECL void gsl_vector_complex_long_double_set (gsl_vector_complex_long_double * v, const size_t i, gsl_complex_long_double z); INLINE_DECL gsl_complex_long_double *gsl_vector_complex_long_double_ptr (gsl_vector_complex_long_double * v, const size_t i); INLINE_DECL const gsl_complex_long_double *gsl_vector_complex_long_double_const_ptr (const gsl_vector_complex_long_double * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN 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 (GSL_RANGE_COND(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); } INLINE_FUN 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 (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif *GSL_COMPLEX_LONG_DOUBLE_AT (v, i) = z; } INLINE_FUN 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 (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return GSL_COMPLEX_LONG_DOUBLE_AT (v, i); } INLINE_FUN 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 (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/swap_source.c0000664000175000017500000000507312616157443015000 0ustar eddedd/* vector/swap_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/vector/gsl_vector_ushort.h0000664000175000017500000001716612616157443016234 0ustar eddedd/* vector/gsl_vector_ushort.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_ushort * u, const gsl_vector_ushort * v); 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); int gsl_vector_ushort_isnonneg (const gsl_vector_ushort * v); INLINE_DECL unsigned short gsl_vector_ushort_get (const gsl_vector_ushort * v, const size_t i); INLINE_DECL void gsl_vector_ushort_set (gsl_vector_ushort * v, const size_t i, unsigned short x); INLINE_DECL unsigned short * gsl_vector_ushort_ptr (gsl_vector_ushort * v, const size_t i); INLINE_DECL const unsigned short * gsl_vector_ushort_const_ptr (const gsl_vector_ushort * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN unsigned short gsl_vector_ushort_get (const gsl_vector_ushort * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_ushort_set (gsl_vector_ushort * v, const size_t i, unsigned short x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN unsigned short * gsl_vector_ushort_ptr (gsl_vector_ushort * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (unsigned short *) (v->data + i * v->stride); } INLINE_FUN const unsigned short * gsl_vector_ushort_const_ptr (const gsl_vector_ushort * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/prop_source.c0000664000175000017500000000575212616157443015012 0ustar eddedd/* vector/prop_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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, equal) (const TYPE (gsl_vector) * u, const TYPE (gsl_vector) * v) { const size_t n = v->size; const size_t stride_u = u->stride ; const size_t stride_v = v->stride ; size_t j; if (u->size != v->size) { GSL_ERROR_VAL ("vectors must have same length", GSL_EBADLEN, 0); } for (j = 0; j < n; j++) { size_t k; for (k = 0; k < MULTIPLICITY; k++) { if (u->data[MULTIPLICITY * stride_u * j + k] != v->data[MULTIPLICITY * stride_v * j + k]) { return 0; } } } return 1; } 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; } int FUNCTION (gsl_vector, isnonneg) (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; } gsl-doc-2.3/vector/file.c0000664000175000017500000000343712616157443013367 0ustar eddedd#include #include #include #include #include #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 gsl-doc-2.3/vector/minmax_source.c0000664000175000017500000001007112757056176015320 0ustar eddedd/* vector/minmax_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/vector/view_source.c0000664000175000017500000000402712616157443014776 0ustar eddedd/* vector/view_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/vector/TODO0000664000175000017500000000011412616157443012761 0ustar eddedd# -*- org -*- #+CATEGORY: vector * Pretty print function * Vector p-norms gsl-doc-2.3/vector/gsl_vector_char.h0000664000175000017500000001626212616157443015621 0ustar eddedd/* vector/gsl_vector_char.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_char * u, const gsl_vector_char * v); 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); int gsl_vector_char_isnonneg (const gsl_vector_char * v); INLINE_DECL char gsl_vector_char_get (const gsl_vector_char * v, const size_t i); INLINE_DECL void gsl_vector_char_set (gsl_vector_char * v, const size_t i, char x); INLINE_DECL char * gsl_vector_char_ptr (gsl_vector_char * v, const size_t i); INLINE_DECL const char * gsl_vector_char_const_ptr (const gsl_vector_char * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN char gsl_vector_char_get (const gsl_vector_char * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_char_set (gsl_vector_char * v, const size_t i, char x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN char * gsl_vector_char_ptr (gsl_vector_char * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (char *) (v->data + i * v->stride); } INLINE_FUN const char * gsl_vector_char_const_ptr (const gsl_vector_char * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/view.h0000664000175000017500000000011712616157443013417 0ustar eddedd#define NULL_VECTOR {0, 0, 0, 0, 0} #define NULL_VECTOR_VIEW {{0, 0, 0, 0, 0}} gsl-doc-2.3/vector/vector.c0000664000175000017500000000207312616157443013745 0ustar eddedd/* vector/vector.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include /* turn on range checking at runtime (disabled if zero) */ int gsl_check_range = 1; gsl-doc-2.3/vector/gsl_vector_int.h0000664000175000017500000001604012616157443015470 0ustar eddedd/* vector/gsl_vector_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_int * u, const gsl_vector_int * v); 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); int gsl_vector_int_isnonneg (const gsl_vector_int * v); INLINE_DECL int gsl_vector_int_get (const gsl_vector_int * v, const size_t i); INLINE_DECL void gsl_vector_int_set (gsl_vector_int * v, const size_t i, int x); INLINE_DECL int * gsl_vector_int_ptr (gsl_vector_int * v, const size_t i); INLINE_DECL const int * gsl_vector_int_const_ptr (const gsl_vector_int * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN int gsl_vector_int_get (const gsl_vector_int * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_int_set (gsl_vector_int * v, const size_t i, int x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN int * gsl_vector_int_ptr (gsl_vector_int * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (int *) (v->data + i * v->stride); } INLINE_FUN const int * gsl_vector_int_const_ptr (const gsl_vector_int * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/swap.c0000664000175000017500000000336112616157443013416 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/test_source.c0000664000175000017500000005101612616157443015003 0ustar eddedd/* vector/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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"); status = (FUNCTION(gsl_vector,isnonneg)(v) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 1); TEST (status, "_isnonneg" DESC " on non-negative vector") ; } #ifndef UNSIGNED { int status = 0; for (i = 0; i < N; i++) { ATOMIC vi = (i % 10) - (ATOMIC) 5; FUNCTION (gsl_vector, set) (v, i, vi); } 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 0); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 0); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 1); TEST (status, "_isnonneg" 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") ; status = (FUNCTION(gsl_vector,isnonneg)(v) != 0); TEST (status, "_isnonneg" 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) ((ATOMIC)i*(ATOMIC)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) ((ATOMIC)i*(ATOMIC)2.0 + (ATOMIC)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)); } { int status = (FUNCTION(gsl_vector,equal) (a,b) != 0); TEST2 (status, "_equal vectors unequal"); } FUNCTION(gsl_vector, memcpy) (v, a); { int status = (FUNCTION(gsl_vector,equal) (a,v) != 1); TEST2 (status, "_equal vectors equal"); } 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; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen (fd, "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 (filename, "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); } unlink(filename); 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; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen (fd, "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 (filename, "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); } unlink(filename); 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 */ } gsl-doc-2.3/vector/init_source.c0000664000175000017500000001223112616157443014763 0ustar eddedd/* vector/init_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; memset takes care of the padding bytes */ memset(v->data, 0, MULTIPLICITY * n * sizeof(ATOMIC)); 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) { RETURN_IF_NULL (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; } gsl-doc-2.3/vector/gsl_vector_long.h0000664000175000017500000001626212616157443015643 0ustar eddedd/* vector/gsl_vector_long.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_long * u, const gsl_vector_long * v); 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); int gsl_vector_long_isnonneg (const gsl_vector_long * v); INLINE_DECL long gsl_vector_long_get (const gsl_vector_long * v, const size_t i); INLINE_DECL void gsl_vector_long_set (gsl_vector_long * v, const size_t i, long x); INLINE_DECL long * gsl_vector_long_ptr (gsl_vector_long * v, const size_t i); INLINE_DECL const long * gsl_vector_long_const_ptr (const gsl_vector_long * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN long gsl_vector_long_get (const gsl_vector_long * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_long_set (gsl_vector_long * v, const size_t i, long x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN long * gsl_vector_long_ptr (gsl_vector_long * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (long *) (v->data + i * v->stride); } INLINE_FUN const long * gsl_vector_long_const_ptr (const gsl_vector_long * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/init.c0000664000175000017500000000337612616157443013415 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/vector/oper_complex_source.c0000664000175000017500000001043412616157443016517 0ustar eddedd/* vector/oper_source.c * * Copyright (C) 2008 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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[2 * i * stride_a] += b->data[2 * i * stride_b]; a->data[2 * i * stride_a + 1] += b->data[2 * i * stride_b + 1]; } 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[2 * i * stride_a] -= b->data[2 * i * stride_b]; a->data[2 * i * stride_a + 1] -= b->data[2 * i * stride_b + 1]; } 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++) { ATOMIC ar = a->data[2 * i * stride_a]; ATOMIC ai = a->data[2 * i * stride_a + 1]; ATOMIC br = b->data[2 * i * stride_b]; ATOMIC bi = b->data[2 * i * stride_b + 1]; a->data[2 * i * stride_a] = ar * br - ai * bi; a->data[2 * i * stride_a + 1] = ar * bi + ai * br; } 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++) { ATOMIC ar = a->data[2 * i * stride_a]; ATOMIC ai = a->data[2 * i * stride_a + 1]; ATOMIC br = b->data[2 * i * stride_b]; ATOMIC bi = b->data[2 * i * stride_b + 1]; ATOMIC s = 1.0 / hypot(br, bi); ATOMIC sbr = s * br; ATOMIC sbi = s * bi; a->data[2 * i * stride_a] = (ar * sbr + ai * sbi) * s; a->data[2 * i * stride_a + 1] = (ai * sbr - ar * sbi) * s; } return GSL_SUCCESS; } } int FUNCTION(gsl_vector, scale) (TYPE(gsl_vector) * a, const BASE x) { const size_t N = a->size; const size_t stride = a->stride; size_t i; ATOMIC xr = GSL_REAL(x); ATOMIC xi = GSL_IMAG(x); for (i = 0; i < N; i++) { ATOMIC ar = a->data[2 * i * stride]; ATOMIC ai = a->data[2 * i * stride + 1]; a->data[2 * i * stride] = ar * xr - ai * xi; a->data[2 * i * stride + 1] = ar * xi + ai * xr; } return GSL_SUCCESS; } int FUNCTION(gsl_vector, add_constant) (TYPE(gsl_vector) * a, const BASE x) { const size_t N = a->size; const size_t stride = a->stride; size_t i; ATOMIC xr = GSL_REAL(x); ATOMIC xi = GSL_IMAG(x); for (i = 0; i < N; i++) { a->data[2 * i * stride] += xr; a->data[2 * i * stride + 1] += xi; } return GSL_SUCCESS; } gsl-doc-2.3/vector/prop.c0000664000175000017500000000336112616157443013424 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/Makefile.in0000644000175000017500000011063413022372407014334 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) DIST_SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -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 = 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 oper_complex_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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu vector/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslvector.la: $(libgslvector_la_OBJECTS) $(libgslvector_la_DEPENDENCIES) $(EXTRA_libgslvector_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslvector_la_OBJECTS) $(libgslvector_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES) $(EXTRA_test_static_DEPENDENCIES) @rm -f test_static$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subvector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_static.log: test_static$(EXEEXT) @p='test_static$(EXEEXT)'; \ b='test_static'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/vector/ChangeLog0000664000175000017500000001656112616157443014060 0ustar eddedd2010-03-12 Brian Gough * prop_source.c (FUNCTION): added a function to test if two vectors are equal 2009-11-14 Brian Gough * gsl_vector_complex.h (GSL_VECTOR_COMPLEX): added missing dereference 2009-07-09 Brian Gough * init_source.c (FUNCTION): handle NULL argument in free 2008-09-27 Brian Gough * gsl_vector_complex_double.h: added missing functions isnonneg, add, sub, mul, div, scale, add_constant 2008-07-03 Brian Gough * gsl_vector.h: use new inline declarations in all header files * vector.c: compile inline functions from header here * vector_source.c: removed * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-08-21 Brian Gough * prop_source.c (FUNCTION): added gsl_vector_isnonneg 2007-02-17 Brian Gough * test_source.c (FUNCTION): avoid running tests on char, because it can be unsigned 2007-01-26 Brian Gough * minmax_source.c: added support for NaNs 2006-10-31 Brian Gough * prop_source.c: added functions gsl_vector_ispos, gsl_vector_isneg 2004-09-13 Brian Gough * 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 * 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 * test.c: ensure that range check is working when running the tests Fri Sep 14 19:13:20 2001 Brian Gough * view.c (USE_QUALIFIER): added missing qualified types Thu Aug 23 13:22:29 2001 Brian Gough * 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 * added gsl_vector_ptr and gsl_vector_const_ptr functions Mon Jul 16 21:28:37 2001 Brian Gough * reim_source.c: initialized views to null Fri Jul 13 21:29:06 2001 Brian Gough * changed views to be structs and used casts to initialize them Mon Jul 2 12:34:43 2001 Brian Gough * view.h: provide macros for initializing null vectors and views Sun Jul 1 22:38:30 2001 Brian Gough * 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 * vector_source.c (FUNCTION): removed unnecessary inline from static function definition Tue Mar 27 15:12:07 2001 Brian Gough * view_source.c: split view functions into a separate file Sat Sep 9 16:45:15 2000 Brian Gough * 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 * 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 * changed GSL_EDOM to GSL_EINVAL for invalid vector size arguments Sat Jun 17 15:37:57 2000 Brian Gough * fixed up missing MULTIPLICITY factors in various functions Sun May 28 12:25:31 2000 Brian Gough * 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 * 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 * 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 * 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 * 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 * swap_source.c (FUNCTION): renames gsl_vector_swap to gsl_vector_swap_elements Tue Mar 21 21:15:10 2000 Brian Gough * vector_source.c (FUNCTION): added set_zero function Thu Feb 24 16:19:55 2000 Brian Gough * added missing prototypes for gsl_vector_complex_..._reverse Fri Feb 18 20:48:32 2000 Brian Gough * 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 * 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 * added gsl_vector_swap function to exchange elements Fri Oct 1 15:47:45 1999 Brian Gough * 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 * 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 * 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 * 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 * init_source.c: added a cast for each malloc Sun Apr 26 14:10:06 1998 Brian Gough * added support for complex vectors Mon Apr 6 15:06:38 1998 Brian Gough * make range checking the default, you have to define GSL_RANGE_CHECK_OFF to turn it off gsl-doc-2.3/vector/gsl_vector_long_double.h0000664000175000017500000002026012616157443017166 0ustar eddedd/* vector/gsl_vector_long_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_long_double * u, const gsl_vector_long_double * v); 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); int gsl_vector_long_double_isnonneg (const gsl_vector_long_double * v); INLINE_DECL long double gsl_vector_long_double_get (const gsl_vector_long_double * v, const size_t i); INLINE_DECL void gsl_vector_long_double_set (gsl_vector_long_double * v, const size_t i, long double x); INLINE_DECL long double * gsl_vector_long_double_ptr (gsl_vector_long_double * v, const size_t i); INLINE_DECL const long double * gsl_vector_long_double_const_ptr (const gsl_vector_long_double * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN long double gsl_vector_long_double_get (const gsl_vector_long_double * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_long_double_set (gsl_vector_long_double * v, const size_t i, long double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN long double * gsl_vector_long_double_ptr (gsl_vector_long_double * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (long double *) (v->data + i * v->stride); } INLINE_FUN const long double * gsl_vector_long_double_const_ptr (const gsl_vector_long_double * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/gsl_vector_complex.h0000664000175000017500000000137412616157443016351 0ustar eddedd#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__ */ gsl-doc-2.3/vector/gsl_vector_uchar.h0000664000175000017500000001674412616157443016013 0ustar eddedd/* vector/gsl_vector_uchar.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_uchar * u, const gsl_vector_uchar * v); 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); int gsl_vector_uchar_isnonneg (const gsl_vector_uchar * v); INLINE_DECL unsigned char gsl_vector_uchar_get (const gsl_vector_uchar * v, const size_t i); INLINE_DECL void gsl_vector_uchar_set (gsl_vector_uchar * v, const size_t i, unsigned char x); INLINE_DECL unsigned char * gsl_vector_uchar_ptr (gsl_vector_uchar * v, const size_t i); INLINE_DECL const unsigned char * gsl_vector_uchar_const_ptr (const gsl_vector_uchar * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN unsigned char gsl_vector_uchar_get (const gsl_vector_uchar * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_uchar_set (gsl_vector_uchar * v, const size_t i, unsigned char x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN unsigned char * gsl_vector_uchar_ptr (gsl_vector_uchar * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (unsigned char *) (v->data + i * v->stride); } INLINE_FUN const unsigned char * gsl_vector_uchar_const_ptr (const gsl_vector_uchar * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/minmax.c0000664000175000017500000000260312616157443013733 0ustar eddedd#include #include #include #include #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 gsl-doc-2.3/vector/gsl_vector_double.h0000664000175000017500000001520712616157443016154 0ustar eddedd/* vector/gsl_vector_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector * u, const gsl_vector * v); int gsl_vector_isnull (const gsl_vector * v); int gsl_vector_ispos (const gsl_vector * v); int gsl_vector_isneg (const gsl_vector * v); int gsl_vector_isnonneg (const gsl_vector * v); INLINE_DECL double gsl_vector_get (const gsl_vector * v, const size_t i); INLINE_DECL void gsl_vector_set (gsl_vector * v, const size_t i, double x); INLINE_DECL double * gsl_vector_ptr (gsl_vector * v, const size_t i); INLINE_DECL const double * gsl_vector_const_ptr (const gsl_vector * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN double gsl_vector_get (const gsl_vector * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_set (gsl_vector * v, const size_t i, double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN double * gsl_vector_ptr (gsl_vector * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (double *) (v->data + i * v->stride); } INLINE_FUN const double * gsl_vector_const_ptr (const gsl_vector * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/gsl_vector_complex_double.h0000664000175000017500000002011412757077315017701 0ustar eddedd/* vector/gsl_vector_complex_double.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 */ 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_equal (const gsl_vector_complex * u, const gsl_vector_complex * v); 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); int gsl_vector_complex_isnonneg (const gsl_vector_complex * v); int gsl_vector_complex_add (gsl_vector_complex * a, const gsl_vector_complex * b); int gsl_vector_complex_sub (gsl_vector_complex * a, const gsl_vector_complex * b); int gsl_vector_complex_mul (gsl_vector_complex * a, const gsl_vector_complex * b); int gsl_vector_complex_div (gsl_vector_complex * a, const gsl_vector_complex * b); int gsl_vector_complex_scale (gsl_vector_complex * a, const gsl_complex x); int gsl_vector_complex_add_constant (gsl_vector_complex * a, const gsl_complex x); INLINE_DECL gsl_complex gsl_vector_complex_get (const gsl_vector_complex * v, const size_t i); INLINE_DECL void gsl_vector_complex_set (gsl_vector_complex * v, const size_t i, gsl_complex z); INLINE_DECL gsl_complex *gsl_vector_complex_ptr (gsl_vector_complex * v, const size_t i); INLINE_DECL const gsl_complex *gsl_vector_complex_const_ptr (const gsl_vector_complex * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN gsl_complex gsl_vector_complex_get (const gsl_vector_complex * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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); } INLINE_FUN void gsl_vector_complex_set (gsl_vector_complex * v, const size_t i, gsl_complex z) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif *GSL_COMPLEX_AT (v, i) = z; } INLINE_FUN gsl_complex * gsl_vector_complex_ptr (gsl_vector_complex * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return GSL_COMPLEX_AT (v, i); } INLINE_FUN const gsl_complex * gsl_vector_complex_const_ptr (const gsl_vector_complex * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/gsl_vector_short.h0000664000175000017500000001650412616157443016042 0ustar eddedd/* vector/gsl_vector_short.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_short * u, const gsl_vector_short * v); 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); int gsl_vector_short_isnonneg (const gsl_vector_short * v); INLINE_DECL short gsl_vector_short_get (const gsl_vector_short * v, const size_t i); INLINE_DECL void gsl_vector_short_set (gsl_vector_short * v, const size_t i, short x); INLINE_DECL short * gsl_vector_short_ptr (gsl_vector_short * v, const size_t i); INLINE_DECL const short * gsl_vector_short_const_ptr (const gsl_vector_short * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN short gsl_vector_short_get (const gsl_vector_short * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_short_set (gsl_vector_short * v, const size_t i, short x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN short * gsl_vector_short_ptr (gsl_vector_short * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (short *) (v->data + i * v->stride); } INLINE_FUN const short * gsl_vector_short_const_ptr (const gsl_vector_short * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/gsl_vector_ulong.h0000664000175000017500000001674412616157443016035 0ustar eddedd/* vector/gsl_vector_ulong.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_ulong * u, const gsl_vector_ulong * v); 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); int gsl_vector_ulong_isnonneg (const gsl_vector_ulong * v); INLINE_DECL unsigned long gsl_vector_ulong_get (const gsl_vector_ulong * v, const size_t i); INLINE_DECL void gsl_vector_ulong_set (gsl_vector_ulong * v, const size_t i, unsigned long x); INLINE_DECL unsigned long * gsl_vector_ulong_ptr (gsl_vector_ulong * v, const size_t i); INLINE_DECL const unsigned long * gsl_vector_ulong_const_ptr (const gsl_vector_ulong * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN unsigned long gsl_vector_ulong_get (const gsl_vector_ulong * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_ulong_set (gsl_vector_ulong * v, const size_t i, unsigned long x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN unsigned long * gsl_vector_ulong_ptr (gsl_vector_ulong * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (unsigned long *) (v->data + i * v->stride); } INLINE_FUN const unsigned long * gsl_vector_ulong_const_ptr (const gsl_vector_ulong * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/gsl_vector_uint.h0000664000175000017500000001652212616157443015662 0ustar eddedd/* vector/gsl_vector_uint.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 */ 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_equal (const gsl_vector_uint * u, const gsl_vector_uint * v); 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); int gsl_vector_uint_isnonneg (const gsl_vector_uint * v); INLINE_DECL unsigned int gsl_vector_uint_get (const gsl_vector_uint * v, const size_t i); INLINE_DECL void gsl_vector_uint_set (gsl_vector_uint * v, const size_t i, unsigned int x); INLINE_DECL unsigned int * gsl_vector_uint_ptr (gsl_vector_uint * v, const size_t i); INLINE_DECL const unsigned int * gsl_vector_uint_const_ptr (const gsl_vector_uint * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN unsigned int gsl_vector_uint_get (const gsl_vector_uint * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0); } #endif return v->data[i * v->stride]; } INLINE_FUN void gsl_vector_uint_set (gsl_vector_uint * v, const size_t i, unsigned int x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif v->data[i * v->stride] = x; } INLINE_FUN unsigned int * gsl_vector_uint_ptr (gsl_vector_uint * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return (unsigned int *) (v->data + i * v->stride); } INLINE_FUN const unsigned int * gsl_vector_uint_const_ptr (const gsl_vector_uint * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/view.c0000664000175000017500000000672212616157443013422 0ustar eddedd#include #include #include #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 gsl-doc-2.3/vector/reim_source.c0000664000175000017500000000323212616157443014755 0ustar eddedd/* vector/reim_source.c * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } } gsl-doc-2.3/vector/copy_source.c0000664000175000017500000000300712616157443014773 0ustar eddedd/* vector/copy_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/vector/oper_source.c0000664000175000017500000000623212616157443014771 0ustar eddedd/* vector/oper_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; } gsl-doc-2.3/vector/test_complex_source.c0000664000175000017500000004622412616157443016537 0ustar eddedd/* vector/test_complex_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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") ; } { 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); } { BASE x = ZERO; GSL_REAL(x) = 2.0; GSL_IMAG(x) = 3.0; FUNCTION (gsl_vector, scale) (v, x); } for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); ATOMIC real = -(ATOMIC)i-(ATOMIC)3702; ATOMIC imag = 5*(ATOMIC)i+(ATOMIC)2468; if (GSL_REAL(r) != real || GSL_IMAG(r) != imag) status = 1; }; TEST (status, "_scale" DESC " by 2") ; } { int status = 0; { BASE x = ZERO; GSL_REAL(x) = 7.0; GSL_IMAG(x) = 13.0; FUNCTION (gsl_vector, add_constant) (v, x); } for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); ATOMIC real = -(ATOMIC)i-(ATOMIC)3695; ATOMIC imag = 5*(ATOMIC)i+(ATOMIC)2481; if (GSL_REAL(r) != real || GSL_IMAG(r) != imag) status = 1; }; TEST (status, "_add_constant" DESC) ; } 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, 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++) { BASE z, z1; GSL_REAL (z) = (ATOMIC) 3+i; GSL_IMAG (z) = (ATOMIC) (3+i + 10); GSL_REAL (z1) = (ATOMIC) (3 + 2*i + 5); GSL_IMAG (z1) = (ATOMIC) (3 + 2*i + 20); FUNCTION (gsl_vector, set) (a, i, z); FUNCTION (gsl_vector, set) (b, i, z1); } { int status = (FUNCTION(gsl_vector,equal) (a,b) != 0); TEST2 (status, "_equal vectors unequal"); } FUNCTION(gsl_vector, memcpy) (v, a); { int status = (FUNCTION(gsl_vector,equal) (a,v) != 1); TEST2 (status, "_equal vectors equal"); } FUNCTION(gsl_vector, add) (v, b); { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); if (GSL_REAL(r) != (ATOMIC) (3*i+11) || GSL_IMAG(r) != (ATOMIC) (3*i+36)) status = 1; } TEST2 (status, "_add vector addition"); } { int status = 0; FUNCTION(gsl_vector, swap) (a, b); for (i = 0; i < N; i++) { BASE z, z1; BASE x = FUNCTION (gsl_vector, get) (a, i); BASE y = FUNCTION (gsl_vector, get) (b, i); GSL_REAL (z) = (ATOMIC) 3+i; GSL_IMAG (z) = (ATOMIC) (3+i + 10); GSL_REAL (z1) = (ATOMIC) (3 + 2*i + 5); GSL_IMAG (z1) = (ATOMIC) (3 + 2*i + 20); status |= !GSL_COMPLEX_EQ(z,y); status |= !GSL_COMPLEX_EQ(z1,x); } FUNCTION(gsl_vector, swap) (a, b); for (i = 0; i < N; i++) { BASE z, z1; BASE x = FUNCTION (gsl_vector, get) (a, i); BASE y = FUNCTION (gsl_vector, get) (b, i); GSL_REAL (z) = (ATOMIC) 3+i; GSL_IMAG (z) = (ATOMIC) (3+i + 10); GSL_REAL (z1) = (ATOMIC) (3 + 2*i + 5); GSL_IMAG (z1) = (ATOMIC) (3 + 2*i + 20); status |= !GSL_COMPLEX_EQ(z,x); status |= !GSL_COMPLEX_EQ(z1,y); } 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); if (GSL_REAL(r) != (-(ATOMIC)i-(ATOMIC)5) || GSL_IMAG(r) != (-(ATOMIC)i-(ATOMIC)10)) 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); ATOMIC real = (-35*(ATOMIC)i-275); ATOMIC imag = (173+((ATOMIC)i)*(63+4*(ATOMIC)i)); if (fabs(GSL_REAL(r) - real) > 100 * BASE_EPSILON || fabs(GSL_IMAG(r) - imag) > 100 * BASE_EPSILON) 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); ATOMIC denom = 593 + ((ATOMIC)i)*(124+((ATOMIC)i)*8); ATOMIC real = (323+((ATOMIC)i)*(63+4*((ATOMIC)i))) / denom; ATOMIC imag = (35 +((ATOMIC)i)*5) / denom; if (fabs(GSL_REAL(r) - real) > 100 * BASE_EPSILON) status = 1; if (fabs(GSL_IMAG(r) - imag) > 100 * BASE_EPSILON) 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; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen(fd, "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(filename, "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); } unlink(filename); 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; char filename[] = "test.XXXXXX"; #if !defined( _WIN32 ) int fd = mkstemp(filename); #else char * fd = _mktemp(filename); # define fdopen fopen #endif { FILE *f = fdopen(fd, "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(filename, "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); } unlink(filename); 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); } gsl-doc-2.3/vector/gsl_vector_complex_float.h0000664000175000017500000002156712616157443017544 0ustar eddedd/* vector/gsl_vector_complex_float.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 */ 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_equal (const gsl_vector_complex_float * u, const gsl_vector_complex_float * v); 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); int gsl_vector_complex_float_isnonneg (const gsl_vector_complex_float * v); int gsl_vector_complex_float_add (gsl_vector_complex_float * a, const gsl_vector_complex_float * b); int gsl_vector_complex_float_sub (gsl_vector_complex_float * a, const gsl_vector_complex_float * b); int gsl_vector_complex_float_mul (gsl_vector_complex_float * a, const gsl_vector_complex_float * b); int gsl_vector_complex_float_div (gsl_vector_complex_float * a, const gsl_vector_complex_float * b); int gsl_vector_complex_float_scale (gsl_vector_complex_float * a, const gsl_complex_float x); int gsl_vector_complex_float_add_constant (gsl_vector_complex_float * a, const gsl_complex_float x); INLINE_DECL gsl_complex_float gsl_vector_complex_float_get (const gsl_vector_complex_float * v, const size_t i); INLINE_DECL void gsl_vector_complex_float_set (gsl_vector_complex_float * v, const size_t i, gsl_complex_float z); INLINE_DECL gsl_complex_float *gsl_vector_complex_float_ptr (gsl_vector_complex_float * v, const size_t i); INLINE_DECL const gsl_complex_float *gsl_vector_complex_float_const_ptr (const gsl_vector_complex_float * v, const size_t i); #ifdef HAVE_INLINE INLINE_FUN gsl_complex_float gsl_vector_complex_float_get (const gsl_vector_complex_float * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(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); } INLINE_FUN void gsl_vector_complex_float_set (gsl_vector_complex_float * v, const size_t i, gsl_complex_float z) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_VOID ("index out of range", GSL_EINVAL); } #endif *GSL_COMPLEX_FLOAT_AT (v, i) = z; } INLINE_FUN gsl_complex_float * gsl_vector_complex_float_ptr (gsl_vector_complex_float * v, const size_t i) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(i >= v->size)) { GSL_ERROR_NULL ("index out of range", GSL_EINVAL); } #endif return GSL_COMPLEX_FLOAT_AT (v, i); } INLINE_FUN 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 (GSL_RANGE_COND(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__ */ gsl-doc-2.3/vector/test.c0000664000175000017500000001534012616157443013423 0ustar eddedd/* vector/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #if defined( _MSC_VER ) && defined( GSL_DLL ) #undef inline #define inline __forceinline #endif #if (!GSL_RANGE_CHECK) && defined(HAVE_INLINE) #undef GSL_RANGE_CHECK #define GSL_RANGE_CHECK 1 #endif #include #include #include #include #include #include #include #include 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_complex_ops (stride, ostride, N); test_complex_float_ops (stride, ostride, N); test_complex_long_double_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; } gsl-doc-2.3/test_gsl_histogram.sh0000775000175000017500000000034512616157443015235 0ustar eddedd#! /bin/sh cat > test.exp.1.tmp < 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 gsl-doc-2.3/gsl.pc.in0000664000175000017500000000036612616157443012516 0ustar eddeddprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ GSL_CBLAS_LIB=-lgslcblas Name: GSL Description: GNU Scientific Library Version: @VERSION@ Libs: @GSL_LIBS@ ${GSL_CBLAS_LIB} @GSL_LIBM@ @LIBS@ Cflags: @GSL_CFLAGS@ gsl-doc-2.3/missing0000755000175000017500000001533112630105471012361 0ustar eddedd#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 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, see . # 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 case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/config.sub0000755000175000017500000010531512630105471012747 0ustar eddedd#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # 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. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # 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 ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 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-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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 | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-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-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # 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 ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; 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 ;; cr16 | cr16-*) basic_machine=cr16-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 ;; dicos) basic_machine=i686-pc os=-dicos ;; 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*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 ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; 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-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; 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 ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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-* | ppc64p7-*) 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 | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) 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 ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; 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 ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-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[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 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. -auroraux) os=-auroraux ;; -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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -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* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -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* | -toppers* | -drops* | -es*) # 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 ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) 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 ;; -cnk*|-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: gsl-doc-2.3/gsl.spec.in0000664000175000017500000000510612616157443013043 0ustar eddeddName: 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 gsl-doc-2.3/INSTALL0000644000175000017500000003660512630105471012022 0ustar eddeddInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. 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, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. 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 you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' 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. Running `configure' might take 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, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. 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. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. 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 can use 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 `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer 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. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= 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'. 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. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS 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 machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. 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. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. gsl-doc-2.3/pkgconfig.test0000775000175000017500000000036312616157443013650 0ustar eddedd#!/bin/sh set -e # skip test if we have no pkg-config pkg-config --version >/dev/null 2>&1 || exit 77 PKG_CONFIG_PATH=. export PKG_CONFIG_PATH pkg-config --define-variable=GSL_CBLAS_LIB=-lfoo --libs gsl | grep 'lfoo' > /dev/null 2>&1 exit 0 gsl-doc-2.3/depcomp0000755000175000017500000005601612630105474012347 0ustar eddedd#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 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, see . # 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 Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/COPYING0000664000175000017500000010451312616157443012032 0ustar eddedd GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . gsl-doc-2.3/gsl_math.h0000664000175000017500000001037112616157443012744 0ustar eddedd/* gsl_math.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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)) /* 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__ */ gsl-doc-2.3/siman/0000755000175000017500000000000013022553154012067 5ustar eddeddgsl-doc-2.3/siman/Makefile.am0000664000175000017500000000127512616157443014143 0ustar eddedd## 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 AM_CPPFLAGS = -I$(top_srcdir) gsl-doc-2.3/siman/siman.c0000664000175000017500000001772712616157443013373 0ustar eddedd/* siman/siman.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include static inline double boltzmann(double E, double new_E, double T, gsl_siman_params_t *params) { double x = -(new_E - E) / (params->k * T); /* avoid underflow errors for large uphill steps */ return (x < GSL_LOG_DBL_MIN) ? 0.0 : exp(x); } static inline void copy_state(void *src, void *dst, size_t size, gsl_siman_copy_t copyfunc) { if (copyfunc) { copyfunc(src, dst); } else { memcpy(dst, src, size); } } /* 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; double T, T_factor; 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; T_factor = 1.0 / params.mu_t; if (print_position) { printf ("#-iter #-evals temperature position energy\n"); } while (1) { n_accepts = 0; n_rejects = 0; n_eless = 0; for (i = 0; i < params.iters_fixed_T; ++i) { copy_state(x, new_x, element_size, copyfunc); 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 boltzmann probability */ if (new_E < E) { if (new_E < best_E) { copy_state(new_x, best_x, element_size, copyfunc); best_E = new_E; } /* yay! take a step */ copy_state(new_x, x, element_size, copyfunc); E = new_E; ++n_eless; } else if (gsl_rng_uniform(r) < boltzmann(E, new_E, T, ¶ms)) { /* yay! take a step */ copy_state(new_x, x, element_size, copyfunc); 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 %12g\n", E, best_E); } /* apply the cooling schedule to the temperature */ /* FIXME: I should also introduce a cooling schedule for the iters */ T *= T_factor; ++n_iter; if (T < params.t_min) { break; } } /* at the end, copy the result onto the initial point, so we pass it back to the caller */ copy_state(best_x, x0_p, element_size, copyfunc); 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, T_factor; /* the temperature and a step multiplier */ int i; 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; T_factor = 1.0 / params.mu_t; memcpy (x, x0_p, element_size); n_iter = 0; while (1) { 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] = boltzmann(Ex, energies[i], T, ¶ms); } /* 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] = boltzmann(Ex, energies[i], T, ¶ms); /* 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 *= T_factor; ++n_iter; if (T < params.t_min) { break; } } /* 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); } gsl-doc-2.3/siman/TODO0000664000175000017500000000050712616157443012574 0ustar eddedd# -*- org -*- #+CATEGORY: siman * 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, ...) gsl-doc-2.3/siman/siman_test_driver.sh0000775000175000017500000000107612616157443016166 0ustar eddedd#! /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 gsl-doc-2.3/siman/Makefile.in0000644000175000017500000010574113022372406014143 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsiman_la_LIBADD = am_libgslsiman_la_OBJECTS = siman.lo libgslsiman_la_OBJECTS = $(am_libgslsiman_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \ $(test_SOURCES) DIST_SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \ $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 AM_CPPFLAGS = -I$(top_srcdir) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu siman/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsiman.la: $(libgslsiman_la_OBJECTS) $(libgslsiman_la_DEPENDENCIES) $(EXTRA_libgslsiman_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsiman_la_OBJECTS) $(libgslsiman_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list siman_tsp$(EXEEXT): $(siman_tsp_OBJECTS) $(siman_tsp_DEPENDENCIES) $(EXTRA_siman_tsp_DEPENDENCIES) @rm -f siman_tsp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(siman_tsp_OBJECTS) $(siman_tsp_LDADD) $(LIBS) test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman_tsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-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: gsl-doc-2.3/siman/ChangeLog0000664000175000017500000001105712616157443013660 0ustar eddedd2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2007-05-30 Brian Gough * siman.c (boltzmann): moved safe_exp into boltzmann (copy_state): put all copying into one function 2006-03-08 Brian Gough * test.c (square): removed inline since it causes problems with some compilers 2005-11-14 Brian Gough * siman.c (safe_exp): added a safe_exp function to avoid underflow for large uphill steps 2003-03-31 Brian Gough * 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 * siman.c (gsl_siman_solve): fix acceptance criterion to match documentation (Peter S. Christopher) Thu Jun 13 20:57:00 2002 Brian Gough * siman.c (gsl_siman_solve): keep track of the best result 2002-02-07 Mark Galassi * 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 Thu Jul 12 21:50:07 2001 Brian Gough * gsl_siman.h: changed renamed gsl_Efunc_t to gsl_siman_Efunc_t, in accordance with namespace conventions 2000-12-15 Mark Galassi * 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 * minor fixes. Tue Nov 17 17:22:14 1998 Brian Gough * added #include to all top-level source files Sun Nov 8 20:40:28 1998 Brian Gough * siman_tsp.c: clean up for make strict 1998-11-06 * test.c: added prototype for memcpy using #include * siman_test.c: added prototype for memcpy using #include Wed Oct 28 15:06:58 1998 Brian Gough * siman.c: added #include for memcpy Thu Aug 20 12:22:28 1998 Brian Gough * 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 * 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 * 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 * 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 * siman_test_driver.sh (LAST_ENERGY): fixed a typo; the tests now report well when they converge. 1998-01-30 Mark Galassi * siman_test_driver.sh, Makefile.am (TESTS): added a test driver so that now "make check" does something interesting. gsl-doc-2.3/siman/gsl_siman.h0000664000175000017500000000571212616157443014234 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/siman/siman_tsp.c0000664000175000017500000002242312616157443014246 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* 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); } } } gsl-doc-2.3/siman/test.c0000664000175000017500000001122712616157443013230 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* 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 } gsl-doc-2.3/gsl_nan.h0000664000175000017500000000246712616157443012576 0ustar eddedd/* gsl_nan.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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.0) #define GSL_NEGZERO (-0.0) #endif /* __GSL_NAN_H__ */ gsl-doc-2.3/test-driver0000755000175000017500000000761112630105474013165 0ustar eddedd#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2013 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, see . # 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 or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # 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-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsl-doc-2.3/cdf/0000755000175000017500000000000013022553155011515 5ustar eddeddgsl-doc-2.3/cdf/exponentialinv.c0000664000175000017500000000213112616157443014733 0ustar eddedd/* cdf/exponentialinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/weibull.c0000664000175000017500000000215212616157443013336 0ustar eddedd/* cdf/weibull.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/flat.c0000664000175000017500000000245612616157443012630 0ustar eddedd/* cdf/flat.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/gsl_cdf.h0000664000175000017500000001631512616157443013307 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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. 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__ */ gsl-doc-2.3/cdf/logisticinv.c0000664000175000017500000000247512616157443014235 0ustar eddedd/* cdf/logisticinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/Makefile.am0000664000175000017500000000176312616157443013572 0ustar eddedd## Process this file with automake to produce Makefile.in noinst_LTLIBRARIES = libgslcdf.la pkginclude_HEADERS= gsl_cdf.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/cdf/cauchyinv.c0000664000175000017500000000275412616157443013674 0ustar eddedd/* cdf/cauchyinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/rayleigh.c0000664000175000017500000000217112616157443013500 0ustar eddedd/* cdf/rayleigh.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/betainv.c0000664000175000017500000001126412616157443013327 0ustar eddedd/* cdf/betainv.c * * Copyright (C) 2004 Free Software Foundation, Inc. * Copyright (C) 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include #include #include #include #include "error.h" static double bisect (double x, double P, double a, double b, double xtol, double Ptol) { double x0 = 0, x1 = 1, Px; while (fabs(x1 - x0) > xtol) { Px = gsl_cdf_beta_P (x, a, b); if (fabs(Px - P) < Ptol) { /* return as soon as approximation is good enough, including on the first iteration */ return x; } else if (Px < P) { x0 = x; } else if (Px > P) { x1 = x; } x = 0.5 * (x0 + x1); } return x; } 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; } /* Do bisection to get closer */ x = bisect (x, P, a, b, 0.01, 0.01); { 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: if (fabs(dP) > GSL_SQRT_DBL_EPSILON * P) { GSL_ERROR_VAL("inverse failed to converge", GSL_EFAILED, GSL_NAN); } 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); }; } gsl-doc-2.3/cdf/cauchy.c0000664000175000017500000000243612616157443013154 0ustar eddedd/* cdf/cauchy.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/TODO0000664000175000017500000000257412616157443012227 0ustar eddedd# -*- org -*- #+CATEGORY: cdf * discrete inverse distributions - easy apart from hypergeometric(?) * look for integer overflow in the discrete functions - this could be hard to find - perform computations in double to avoid. gsl_cdf_binomial_P (unsigned int k, double p, unsigned int n); gsl_cdf_binomial_Q (unsigned int k, double p, unsigned int n); gsl_cdf_poisson_P (unsigned int k, double mu); gsl_cdf_poisson_Q (unsigned int k, double mu); gsl_cdf_geometric_P (unsigned int k, double p); gsl_cdf_geometric_Q (unsigned int k, double p); gsl_cdf_negative_binomial_P (unsigned int k, double p, double n); gsl_cdf_negative_binomial_Q (unsigned int k, double p, double n); gsl_cdf_pascal_P (unsigned int k, double p, unsigned int n); gsl_cdf_pascal_Q (unsigned int k, double p, unsigned int n); gsl_cdf_hypergeometric_P (unsigned int k, unsigned int n1, unsigned int n2, unsigned int t); gsl_cdf_hypergeometric_Q (unsigned int k, unsigned int n1, unsigned int n2, unsigned int t); * Unify the beta_inc function with the special functions, put all the functionaity in gsl_sf_beta_inc, providing a new function for the AXPY part if necessary (can we do everything with gsl_sf_beta_inc and gsl_sf_beta_inc_1mx keeping in mind that we cannot do 1-x because of cancellation for small x) gsl-doc-2.3/cdf/gauss.c0000664000175000017500000001577012616157443013027 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 #include #include #include #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); } gsl-doc-2.3/cdf/gumbel2.c0000664000175000017500000000244212616157443013232 0ustar eddedd/* cdf/gumbel2.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/flatinv.c0000664000175000017500000000240712616157443013341 0ustar eddedd/* cdf/flatinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include 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; } gsl-doc-2.3/cdf/exponential.c0000664000175000017500000000250112616157443014217 0ustar eddedd/* cdf/exponential.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/cdf/beta_inc.c0000664000175000017500000001204212616157443013436 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 */ #include 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 if (a > 1e5 && b < 10 && x > a / (a + b)) { /* Handle asymptotic regime, large a, small b, x > peak [AS 26.5.17] */ double N = a + (b - 1.0) / 2.0; return A * gsl_sf_gamma_inc_Q (b, -N * log (x)) + Y; } else if (b > 1e5 && a < 10 && x < b / (a + b)) { /* Handle asymptotic regime, small a, large b, x < peak [AS 26.5.17] */ double N = b + (a - 1.0) / 2.0; return A * gsl_sf_gamma_inc_P (a, -N * log1p (-x)) + 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 gsl-doc-2.3/cdf/paretoinv.c0000664000175000017500000000251612616157443013706 0ustar eddedd/* cdf/paretoinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/rat_eval.h0000664000175000017500000000055412616157443013501 0ustar eddeddstatic 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; } gsl-doc-2.3/cdf/logistic.c0000664000175000017500000000245112616157443013512 0ustar eddedd/* cdf/logistic.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/laplace.c0000664000175000017500000000242512616157443013277 0ustar eddedd/* cdf/laplace.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/weibullinv.c0000664000175000017500000000253112616157443014054 0ustar eddedd/* cdf/weibullinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/exppow.c0000664000175000017500000000345112616157443013220 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/cdf/gumbel1.c0000664000175000017500000000241612616157443013232 0ustar eddedd/* cdf/gumbel1.c * * Copyright (C) 2003, 2007, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include double gsl_cdf_gumbel1_P (const double x, const double a, const double b) { double u = a * x - log (b); double P = exp (-exp (-u)); return P; } double gsl_cdf_gumbel1_Q (const double x, const double a, const double b) { double u = a * x - log (b); double Q; double P = exp (-exp (-u)); if (P < 0.5) { Q = 1 - P; } else { Q = -expm1 (-exp (-u)); } return Q; } gsl-doc-2.3/cdf/gammainv.c0000664000175000017500000001055012616157443013473 0ustar eddedd/* cdf/gammainv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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. BJG: These approximations aren't really valid, the relevant criterion is P*gamma(a+1) < 1. Need to rework these routines and use a single bisection style solver for all the inverse functions. */ 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 < -0.5*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) < 0.5 * fabs (step0)) step += step1; if (x + step > 0) x += step; else { x /= 2.0; } if (fabs (step0) > 1e-10 * x || fabs(step0 * phi) > 1e-10 * P) goto start; } end: if (fabs(dP) > GSL_SQRT_DBL_EPSILON * P) { GSL_ERROR_VAL("inverse failed to converge", GSL_EFAILED, GSL_NAN); } 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 < -0.5*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) < 0.5 * 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; } gsl-doc-2.3/cdf/rayleighinv.c0000664000175000017500000000253412616157443014220 0ustar eddedd/* cdf/rayleighinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/gumbel1inv.c0000664000175000017500000000254512616157443013752 0ustar eddedd/* cdf/gumbel1inv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/Makefile.in0000644000175000017500000011340513022372404013562 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcdf.la pkginclude_HEADERS = gsl_cdf.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cdf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcdf.la: $(libgslcdf_la_OBJECTS) $(libgslcdf_la_DEPENDENCIES) $(EXTRA_libgslcdf_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcdf_la_OBJECTS) $(libgslcdf_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/betainv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchyinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisqinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponentialinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdistinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flatinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gammainv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1inv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2inv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypergeometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplaceinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logisticinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormalinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paretoinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleighinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdistinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibullinv.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/cdf/pareto.c0000664000175000017500000000234312616157443013167 0ustar eddedd/* cdf/pareto.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/ChangeLog0000664000175000017500000000773512616157443013315 0ustar eddedd2009-07-19 Brian Gough * gumbel1.c (gsl_cdf_gumbel1_Q): use a single argument ax-log(b) to get better control over underflow/overflow 2008-12-03 Brian Gough * gammainv.c (gsl_cdf_gamma_Pinv): keep iterating if P is still changing (fix for bug 24704) * test.c (test_chisqinv): added test cases for bug 24704 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-04-29 Brian Gough * gammainv.c (gsl_cdf_gamma_Pinv, gsl_cdf_gamma_Qinv): restrict the range of the gaussian approximation 2008-02-20 Brian Gough * beta_inc.c (beta_inc_AXPY): add some handling for large parameter cases 2008-02-12 Brian Gough * hypergeometric.c (gsl_cdf_hypergeometric_P): compute midpoint in double precision to avoid overflow (gsl_cdf_hypergeometric_Q): ditto 2007-08-22 Brian Gough * betainv.c (gsl_cdf_beta_Pinv): added an error check for inaccurate results * gammainv.c (gsl_cdf_gamma_Pinv): added an error check for inaccurate results * tdistinv.c (gsl_cdf_tdist_Pinv): added an error check for inaccurate results 2007-08-21 Brian Gough * betainv.c (gsl_cdf_beta_Pinv): added bisection method to improve initial approximations 2007-01-23 Brian Gough * betainv.c (gsl_cdf_beta_Pinv): avoid generating a NaN for lx > 0 2006-04-18 Brian Gough * betainv.c (gsl_cdf_beta_Qinv): fix prototype const 2006-03-07 Brian Gough * 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 * 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 * test.c: removed tests using subnormal values, since they tend to fail when extended precision registers are not available. 2004-10-26 Brian Gough * exppow.c: added exppow distribution 2004-10-01 Brian Gough * beta.c (gsl_cdf_beta_P, gsl_cdf_beta_P): return consistent results for out of range values. 2003-08-27 Brian Gough * gauss.c: use parentheses around constant macros to avoid -(-X) being interpreted as --X 2003-07-27 Brian Gough * 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 * 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 gsl-doc-2.3/cdf/pascal.c0000664000175000017500000000240112616157443013133 0ustar eddedd/* cdf/pascal.c * * Copyright (C) 2006, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } gsl-doc-2.3/cdf/poisson.c0000664000175000017500000000357612616157443013400 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 #include #include #include #include #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; } gsl-doc-2.3/cdf/chisq.c0000664000175000017500000000206512616157443013005 0ustar eddedd/* cdf/cdf_chisq.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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); } gsl-doc-2.3/cdf/gaussinv.c0000664000175000017500000001004612616157443013533 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 #include #include #include #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); } gsl-doc-2.3/cdf/lognormal.c0000664000175000017500000000232312616157443013665 0ustar eddedd/* cdf/lognormal.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/error.h0000664000175000017500000000021412616157443013026 0ustar eddedd/* CDF_ERROR: call the error handler, and return a NAN. */ #define CDF_ERROR(reason, gsl_errno) GSL_ERROR_VAL(reason, gsl_errno, GSL_NAN) gsl-doc-2.3/cdf/beta.c0000664000175000017500000000260712616157443012613 0ustar eddedd/* cdf/cdf_beta.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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; } gsl-doc-2.3/cdf/fdist.c0000664000175000017500000000340612616157443013007 0ustar eddedd/* cdf/fdist.c * * Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover. * Copyright (C) 2006, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #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; } gsl-doc-2.3/cdf/binomial.c0000664000175000017500000000472412616157443013474 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include #include #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 #include #include #include #include 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; } gsl-doc-2.3/cdf/test_auto.c0000664000175000017500000036201012616157443013704 0ustar eddeddvoid 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); } gsl-doc-2.3/cdf/hypergeometric.c0000664000175000017500000001021612616157443014721 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 #include #include #include #include #include #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 = ((double)t * n1) / ((double)n1 + (double)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 = ((double)t * n1) / ((double)n1 + (double)n2); if (k < midpoint) { Q = 1 - lower_tail (k, n1, n2, t); } else { Q = upper_tail (k, n1, n2, t); } } return Q; } gsl-doc-2.3/cdf/tdistinv.c0000664000175000017500000001206012616157443013536 0ustar eddedd/* cdf/tdistinv.c * * Copyright (C) 2007, 2010 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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)); return x; } else if (nu == 2.0) { x = (2 * P - 1) / sqrt (2 * P * (1 - P)); return x; } 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: if (fabs(dP) > GSL_SQRT_DBL_EPSILON * P) { GSL_ERROR_VAL("inverse failed to converge", GSL_EFAILED, GSL_NAN); } 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)); return x; } else if (nu == 2.0) { x = (1 - 2 * Q) / sqrt (2 * Q * (1 - Q)); return x; } 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; } gsl-doc-2.3/cdf/fdistinv.c0000664000175000017500000000431712616157443013526 0ustar eddedd/* cdf/fdistinv.c * * Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover. * Copyright (C) 2006, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #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; } gsl-doc-2.3/cdf/nbinomial.c0000664000175000017500000000342412616157443013646 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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; } gsl-doc-2.3/cdf/gamma.c0000664000175000017500000000276112616157443012763 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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. Stover */ #include #include #include #include #include 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; } gsl-doc-2.3/cdf/laplaceinv.c0000664000175000017500000000272012616157443014012 0ustar eddedd/* cdf/laplaceinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/lognormalinv.c0000664000175000017500000000267012616157443014407 0ustar eddedd/* cdf/lognormalinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/gumbel2inv.c0000664000175000017500000000253512616157443013752 0ustar eddedd/* cdf/gumbel2inv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } gsl-doc-2.3/cdf/chisqinv.c0000664000175000017500000000210012616157443013510 0ustar eddedd/* cdf/chisqinv.c * * Copyright (C) 2003, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include 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); } gsl-doc-2.3/cdf/geometric.c0000664000175000017500000000337712616157443013663 0ustar eddedd/* cdf/geometric.c * * Copyright (C) 2004 Jason H. Stover. * Copyright (C) 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #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) { return 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; } gsl-doc-2.3/cdf/test.c0000664000175000017500000021355312616157443012663 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #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); } struct range test_hypergeometric2_range (void) { struct range r = {0, 13250474}; return r; } struct range test_hypergeometric2a_range (void) { struct range r = {3500, 3600}; return r; } struct range test_hypergeometric2b_range (void) { struct range r = {13247474, 13250474}; return r; } double test_hypergeometric2_pdf (unsigned int k) { return gsl_ran_hypergeometric_pdf (k, 76200, 13174274, 678090); } double test_hypergeometric2_cdf_P (unsigned int k) { return gsl_cdf_hypergeometric_P (k, 76200, 13174274, 678090); } double test_hypergeometric2_cdf_Q (unsigned int k) { return gsl_cdf_hypergeometric_Q (k, 76200, 13174274, 678090); } #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); { int s1 = (Pi<0 || Pi>1); int s2 = (Qi<0 || Qi>1); gsl_test(s1, "Pi in range [0,1] (%.18e)", Pi); gsl_test(s2, "Qi in range [0,1] (%.18e)", Qi); } } } #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 HYPERGEOMETRIC2 TEST_DISCRETE(hypergeometric2); #endif #ifdef LOGARITHMIC TEST_DISCRETE(logarithmic); #endif test_discrete_cdf_PQ(&test_hypergeometric2_cdf_P, &test_hypergeometric2_cdf_Q, &test_hypergeometric2a_range, "test gsl_cdf_hypergeometric_P+Q (k=%d)") ; test_discrete_cdf_PQ(&test_hypergeometric2_cdf_P, &test_hypergeometric2_cdf_Q, &test_hypergeometric2b_range, "test gsl_cdf_hypergeometric_P+Q (k=%d)") ; /* 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); /* computed with gp-pari */ TEST (gsl_cdf_fdist_P, (3.479082213465832574, 1, 4040712), 0.93785072763723411967, TEST_TOL6); TEST (gsl_cdf_fdist_P, (3.002774644786533109, 1, 4040712), 0.91687787379476055771, TEST_TOL6); TEST (gsl_cdf_fdist_P, (3.000854441173130827, 1, 4040712), 0.91677930719813578619, TEST_TOL6); TEST (gsl_cdf_fdist_P, (3.000064021622133037, 1, 4040712), 0.9167386972447996480399, 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); TEST (gsl_cdf_beta_Pinv, ( 0.025, 2133.0, 7868.0), 0.20530562929915865457928654, 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 case from Benjamin Redelings */ /* fails on x86_64, FIXME test value is from octave -- get high precision value */ TEST (gsl_cdf_gamma_Pinv, (0.1, 11.887411491530846,1.0), 7.73788447848618e+00, TEST_TOL1); 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_Pinv, (1.93238145206123590e-01, 1.5), 0.211980092931799521729407, TEST_TOL6); TEST (gsl_cdf_chisq_Pinv, (4.83e-8, 19.19), 1.632280186860266704532868343, TEST_TOL6); /* Test cases for bug 24704 */ TEST (gsl_cdf_chisq_Pinv, (0.05, 1263131.0), 1260517.771133388726131469059, TEST_TOL6); TEST (gsl_cdf_chisq_Pinv, (0.05, 2526262.0), 2522565.864973351096735720202, TEST_TOL6); #if 0 /* XXX - bug #39057 */ /* Test case reported by Yan Zhou */ TEST (gsl_cdf_chisq_Pinv, (0.5, 0.01), 0.99477710813146, TEST_TOL6); #endif 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_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); } gsl-doc-2.3/cdf/tdist.c0000664000175000017500000001313212616157443013022 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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 #include #include #include #include #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; } gsl-doc-2.3/config.h.in0000664000175000017500000002000613022372425013003 0ustar eddedd/* config.h.in. Generated from configure.ac by autoheader. */ /* Disable deprecated functions and enums while building */ #define GSL_DISABLE_DEPRECATED 1 /* Define if you have inline with C99 behavior */ #undef HAVE_C99_INLINE /* 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 `fprnd_t', and to 0 if you don't. */ #undef HAVE_DECL_FPRND_T /* 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 header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Defined if you have ansi EXIT_SUCCESS and EXIT_FAILURE in stdlib.h */ #undef HAVE_EXIT_SUCCESS_AND_FAILURE /* Defined on architectures with excess floating-point precision */ #undef HAVE_EXTENDED_PRECISION_REGISTERS /* Define if x86 processor has sse extensions. */ #undef HAVE_FPU_X86_SSE /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* 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 if you have inline */ #undef HAVE_INLINE /* Define to 1 if you have the 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 header file. */ #undef HAVE_MEMORY_H /* Define this if printf can handle %Lf for long double */ #undef HAVE_PRINTF_LONGDOUBLE /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the 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 header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the 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 header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define if you need to hide the static definitions of inline functions */ #undef HIDE_INLINE_STATIC /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* 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 home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Defined if this is an official release */ #undef RELEASED /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if type `char' is unsigned and you are not using gcc. */ #ifndef __CHAR_UNSIGNED__ # undef __CHAR_UNSIGNED__ #endif /* 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 int' if 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 /* 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 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 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. */ #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_ISFINITE #define isfinite gsl_finite #endif #if !HAVE_DECL_FINITE #define finite gsl_finite #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 #define RETURN_IF_NULL(x) if (!x) { return ; } gsl-doc-2.3/specfunc/0000755000175000017500000000000013022553153012565 5ustar eddeddgsl-doc-2.3/specfunc/hyperg.c0000664000175000017500000002107512616157443014250 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; } gsl-doc-2.3/specfunc/gsl_sf_coupling.h0000664000175000017500000001010512616157443016124 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/check.h0000664000175000017500000000017612616157443014033 0ustar eddedd/* check for underflow */ #define CHECK_UNDERFLOW(r) if (fabs((r)->val) < GSL_DBL_MIN) GSL_ERROR("underflow", GSL_EUNDRFLW); gsl-doc-2.3/specfunc/legendre_P.c0000664000175000017500000000603712616157443015017 0ustar eddedd/* legendre_P.c * * Copyright (C) 2009-2013 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 #include #include #include #include /* * The routines in this module compute associated Legendre functions * (ALFs) up to order and degree 2700, using the method described * in * * [1] S. A. Holmes and W. E. Featherstone, A unified approach * to the Clenshaw summation and the recursive computation of very * high degree and order normalised associated Legendre functions, * Journal of Geodesy, 76, pg. 279-299, 2002. * * Further information on ALFs can be found in * * [2] Abramowitz and Stegun, Handbook of Mathematical Functions, * Chapter 8, 1972. */ static void legendre_sqrts(const size_t lmax, double *array); #define LEGENDRE #include "legendre_source.c" #undef LEGENDRE #define LEGENDRE_DERIV #include "legendre_source.c" #undef LEGENDRE_DERIV #define LEGENDRE_DERIV_ALT #include "legendre_source.c" #undef LEGENDRE_DERIV_ALT #define LEGENDRE_DERIV2 #include "legendre_source.c" #undef LEGENDRE_DERIV2 #define LEGENDRE_DERIV2_ALT #include "legendre_source.c" #undef LEGENDRE_DERIV2_ALT /* number of P_{lm} functions for a given lmax */ size_t gsl_sf_legendre_nlm(const size_t lmax) { return ((lmax + 1) * (lmax + 2) / 2); } /* gsl_sf_legendre_array_n() This routine returns the minimum result_array[] size needed for a given lmax */ size_t gsl_sf_legendre_array_n(const size_t lmax) { size_t nlm = gsl_sf_legendre_nlm(lmax); size_t nsqrt = 2 * lmax + 2; /* extra room to precompute sqrt factors */ return (nlm + nsqrt); } /* gsl_sf_legendre_array_n() */ /* gsl_sf_legendre_array_index() This routine computes the index into a result_array[] corresponding to a given (l,m) */ size_t gsl_sf_legendre_array_index(const size_t l, const size_t m) { return (l * (l + 1) / 2 + m); } /* gsl_sf_legendre_array_index() */ /********************************************************* * INTERNAL ROUTINES * *********************************************************/ /* legendre_sqrts() Precompute square root factors needed for Legendre recurrence. On output, array[i] = sqrt(i) */ static void legendre_sqrts(const size_t lmax, double *array) { size_t l; for (l = 0; l <= 2 * lmax + 1; ++l) array[l] = sqrt((double) l); } gsl-doc-2.3/specfunc/recurse.h0000664000175000017500000001724612616157443014434 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_ */ gsl-doc-2.3/specfunc/legendre_H3d.c0000664000175000017500000004205512616157443015236 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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 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; kval = 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)); } gsl-doc-2.3/specfunc/bessel_J1.c0000664000175000017500000000713712616157443014564 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_sf_ellint.h0000664000175000017500000001007712616157443015603 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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, gsl_mode_t mode, gsl_sf_result * result); double gsl_sf_ellint_D(double phi, double k, 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__ */ gsl-doc-2.3/specfunc/bessel_J0.c0000664000175000017500000000627612616157443014566 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "bessel.h" #include "bessel_amp_phase.h" #include #include #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)); } gsl-doc-2.3/specfunc/shint.c0000664000175000017500000000761012616157443014076 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/test_hyperg.c0000644000175000017500000015065112736044021015276 0ustar eddedd/* specfunc/test_hyperg.c * * Copyright (C) 2007, 2009, 2010 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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); #ifdef FIXME /* 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); #ifdef FIXME /* 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_TOL4, GSL_SUCCESS); /* Bug report Lorenzo Moneta */ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, -100., &r), 456.44010011787485545, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 99., &r), 4.13360436014643309757065e36, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 100., &r), 1.0893724312430935129254e37, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 709., &r), 8.7396804160264899999692120e298, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 710., &r), 2.36563187217417898169834615e299, TEST_TOL4, GSL_SUCCESS); /* Bug report from Weibin Li */ #ifdef FIXME TEST_SF(s, gsl_sf_hyperg_1F1_e, (-37.8, 2.01, 103.58, &r), -6.21927211009e17, TEST_TOL1, GSL_SUCCESS); #endif /* Testing BJG */ #ifdef COMPARISON_WITH_MATHEMATICA /* Mathematica uses a different convention for M(-m,-n,x) */ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-1, -1, 0.1, &r), 1.1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1, -1, 0.1, &r), 1.1, TEST_TOL0, GSL_SUCCESS); #endif /* 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); /* Bug report from Stefan Gerlach */ TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 4.0, 1.0, &r), 11.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 3.14, &r), 1.1896, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 1.13, &r), -1.3631, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 0.0, &r), 0.75, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 1e-20, &r), 0.75, TEST_TOL2, GSL_SUCCESS); /* U(a,b,x) for x<0 [bug #27859] */ /* Tests for b >= 0 */ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 0, -0.1, &r), 1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0, -0.1, &r), -0.1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 0, -0.1, &r), 0.21, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 0, -0.1, &r), -0.661, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 0, -0.1, &r), 2.7721, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 0, -0.1, &r), -14.52201, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 0, -0.1, &r), 91.230301, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 1, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 1, -0.1, &r), -1.1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 1, -0.1, &r), 2.41, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 1, -0.1, &r), -7.891, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 1, -0.1, &r), 34.3361, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 1, -0.1, &r), -186.20251, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 1, -0.1, &r), 1208.445361, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 2, -0.1, &r), -10.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 2, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 2, -0.1, &r), -2.1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 2, -0.1, &r), 6.61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 2, -0.1, &r), -27.721, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 2, -0.1, &r), 145.2201, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 2, -0.1, &r), -912.30301, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 2, -0.1, &r), 6682.263421, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 2, 3, -0.1, &r), 100.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 3, -0.1, &r), 90.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 3, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 3, -0.1, &r), -3.10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 3, -0.1, &r), 12.81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 3, -0.1, &r), -66.151, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 3, -0.1, &r), 409.8241, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 3, -0.1, &r), -2961.42351, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 3, -0.1, &r), 24450.804481, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 3, 4, -0.1, &r), -1000.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 2, 4, -0.1, &r), -1900.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 4, -0.1, &r), -1810.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 4, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 4, -0.1, &r), -4.10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 4, -0.1, &r), 21.01, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 4, -0.1, &r), -129.181, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 4, -0.1, &r), 926.5481, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 4, -0.1, &r), -7594.16401, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 4, -0.1, &r), 70015.788541, TEST_TOL2, GSL_SUCCESS); /* Tests for b < 0 */ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -1, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -1, -0.1, &r), 0.9, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -1, -0.1, &r), 0.01, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -1, -0.1, &r), -0.031, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -1, -0.1, &r), 0.1281, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -1, -0.1, &r), -0.66151, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -1, -0.1, &r), 4.098241, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -2, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -2, -0.1, &r), 1.9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -2, -0.1, &r), 1.81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -2, -0.1, &r), -0.001, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -2, -0.1, &r), 0.0041, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -2, -0.1, &r), -0.02101, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -2, -0.1, &r), 0.129181, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -3, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -3, -0.1, &r), 2.9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -3, -0.1, &r), 5.61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -3, -0.1, &r), 5.429, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -3, -0.1, &r), 0.0001, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -3, -0.1, &r), -0.00051, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -3, -0.1, &r), 0.003121, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -4, -0.1, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -4, -0.1, &r), 3.9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -4, -0.1, &r), 11.41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -4, -0.1, &r), 22.259, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -4, -0.1, &r), 21.7161, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -4, -0.1, &r), -1e-5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -4, -0.1, &r), 0.000061, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-7, -4, -0.1, &r), -0.0004341, TEST_TOL0, GSL_SUCCESS); /* Tests for integer a */ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 0.5, -0.5, &r), -9.5, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 0.5, -0.5, &r), 180495.0625, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 1.5, -0.5, &r), 827341.0625, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 1.5, -10, &r), 7.162987810253906e9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (3, 6, -0.5, &r), -296.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (3, 7, -0.5, &r), 2824, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (5, 12, -1.7, &r), -153.262676210016018065768591104, TEST_TOL2, GSL_SUCCESS); /* A few random tests */ TEST_SF(s, gsl_sf_hyperg_U_e, (0, 0, -0.5, &r), 1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (0, 1, -0.5, &r), 1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (0, 1, -0.001, &r), 1, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0.99, -0.1, &r), -1.09, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0, -0.5, &r), -0.5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 0, -0.5, &r), 1.25, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (-7, 0, -0.1, &r), -668.2263421, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_int_e, (3, 6, -0.5, &r), -296.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_int_e, (3, 7, -0.5, &r), 2824, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_int_e, (5, 12, -1.7, &r), -153.262676210016018065768591104, TEST_TOL2, GSL_SUCCESS); /* Bug report from Raymond Rogers */ TEST_SF(s, gsl_sf_hyperg_U_e, (4.11, 0.11, 6.4, &r), 6.422378238765078623739153038e-5, TEST_TOL2, GSL_SUCCESS); /* Addition tests from Raymond Rogers */ TEST_SF(s, gsl_sf_hyperg_U_e, (5, 4, 6.4, &r), 3.2586223825343211136628535e-05, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (2.2,1.2 , 8.7, &r), 5.7250017539318661177749625e-03, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_U_e, (2, -6.4, 1, &r),1.2141502795806162484648638e-02 , TEST_TOL2, 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); /* added special handling with x == 1.0 , Richard J. Mathar, 2008-01-09 */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 3.0, 1.0, &r), 1.6976527263135502482014268 , TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, -4.2, 3.0, 1.0, &r), .15583601560025710649555254 , TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-7.4, 0.7, -1.5, 1.0, &r), -.34478866959246584996859 , TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (0.1, -2.7, -1.5, 1.0, &r), 1.059766766063610122925 , TEST_TOL2, GSL_SUCCESS); /* Taylor Binnington a = 0 */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (0, -2, -4, 0.5, &r), 1.0 , TEST_TOL2, GSL_SUCCESS); /* Andrew Benson bug #24812 in Pari: poch(a,x) = { gamma(a+x)/gamma(a) } t(a,b,c,x,k) = { (poch(a,k)*poch(b,k)/poch(c,k)) * (x^k)/(k!) } suminf(k=0,t(-10.34, 2.05, 3.05, 0.1725,k)) */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (-10.34, 2.05, 3.05, 0.1725, &r), 0.310473552213130010351006093079548, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-9.99999999999, 2.05, 3.05, 0.1725, &r),0.32141934630197487540298837643890, TEST_TOL2, GSL_SUCCESS); /* Didier Pinchon also bug #24812 */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (11, -1, 11.0/2.0, 0.125 , &r), 0.75, TEST_TOL2, GSL_SUCCESS); /* Bill Maier - bug #45926 */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (-0.2, 8.8, 10.0, 0.8, &r), 0.77998971427681563, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-0.2, 9.8, 11.0, 0.8, &r), 0.77574573497387267, TEST_TOL0, GSL_SUCCESS); #if 0 /* XXX - bug #39056 */ /* Test case from Hatef Monajemi */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (3.5, -0.5, 5.0, 0.9, &r), 0.5923981284370653465208973272, TEST_TOL2, GSL_SUCCESS); /* Test case from Robert L Wolpert */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1.0, -10.0, 1.0, 0.5, &r), 6.0, TEST_TOL0, GSL_SUCCESS); /* Test case from ldnlwm@163.com */ TEST_SF(s, gsl_sf_hyperg_2F1_e, (3.23191, -4.0229, 8.02291, 0.5, &r), 0.4300243900348170646, TEST_TOL2, GSL_SUCCESS); #endif /* 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); /* updated correct values, testing enabled, Richard J. Mathar, 2008-01-09 */ TEST_SF(s, gsl_sf_hyperg_2F0_e, (0.01, 1.0, -0.02, &r), .99980388665511730901180717 , TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F0_e, (0.1, 0.5, -0.02, &r), .99901595171179281891589794 , TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F0_e, (1, 1, -0.02, &r), .98075549650574351826538049000 , TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F0_e, (8, 8, -0.02, &r), .32990592849626965538692141 , TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F0_e, (50, 50, -0.02, &r), .2688995263772964415245902e-12 , 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; } gsl-doc-2.3/specfunc/test_sf.c0000664000175000017500000046557212616157443014437 0ustar eddedd/* specfunc/test_sf.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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, d = 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); d = fabs(val - r.val); if(d > 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 TEST_EXCESSIVE_ERROR if(d > 0 && r.err > 1e4 * fabs(val)*tol) s |= TEST_SF_ERRBIG; #endif if(f > TEST_FACTOR * tol) s |= TEST_SF_TOLBAD; } if(s != 0) { char buff[2048]; sprintf(buff, " expected: %20.16e\n", val); strcat(message_buff, buff); sprintf(buff, " obtained: %20.16e +/- %.16e (rel=%g)\n", r.val, r.err, r.err/(fabs(r.val) + r.err)); strcat(message_buff, buff); sprintf(buff, " fracdiff: %20.16e\n", f); strcat(message_buff, buff); sprintf(buff, " tolerance: %20.16e\n", tol); 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_ERRBIG) { strcat(message_buff, " reported error is much too big\n"); } if(s & TEST_SF_TOLBAD) { strcat(message_buff, " value not within tolerance of expected value\n"); } return s; } /* Check a result against a given value and tolerance. */ int test_sf_check_e10(char * message_buff, int e10, int e10_in) { int s = 0; if (e10 != e10_in) { s = TEST_SF_EXPBAD; } if(s != 0) { char buff[2048]; sprintf(buff, " expected exponent: 10^%d\n", e10_in); strcat(message_buff, buff); sprintf(buff, " obtained exponent: 10^%d", e10); strcat(message_buff, buff); } if(s & TEST_SF_EXPBAD) { strcat(message_buff, " exponent is incorrect\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.16e\n", val); strcat(message_buff, buff); sprintf(buff, " obtained: %20.16e\n", rval); strcat(message_buff, buff); sprintf(buff, " fracdiff: %20.16e\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.16e\n", val); strcat(message_buff, buff); sprintf(buff, " obtained: %20.16e +/- %.16e (rel=%g)\n", r.val, r.err, r.err/(fabs(r.val) + r.err)); strcat(message_buff, buff); sprintf(buff, " fracdiff: %20.16e\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.18e %22.18e\n", r.val, r.err); } return local_s; } int test_sf_e10 (gsl_sf_result_e10 re, double val_in, int e10_in, double tol, int status, int expect_return, const char * desc) { char message_buff[4096]; int local_s = 0; gsl_sf_result r; r.val = re.val; r.err = re.err; message_buff[0] = '\0'; local_s |= test_sf_check_result(message_buff, r, val_in, tol); local_s |= test_sf_check_e10(message_buff, re.e10, e10_in); 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.18e %22.18e 10^%d\n", re.val, re.err, re.e10); } 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.18e\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.18e %22.18e\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.18e %22.18e\n", r1.val, r1.err); printf(" %22.18e %22.18e\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.18e %22.18e\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 m1=m2=m3=0 with j1+j2+j3=odd*/ TEST_SF(s, gsl_sf_coupling_3j_e, (2*13, 2*13, 2*13, 0, 0, 0, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_3j_e, (2*2, 2*17, 2*18, 0, 0, 0, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_3j_e, (2*203, 2*203, 2*203, 0, 0, 0, &r), 0, 0, GSL_SUCCESS); /* Test l1=249 l2=248, l3=2, m1=5, m2=-6, m3=1 */ TEST_SF(s, gsl_sf_coupling_3j_e, (2*249.0, 2*248.0, 2*2.0, 2*5.0, 2*(-6.0), 2*1.0, &r), 0.0228787564223517967033998, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_3j_e, (2*248.0, 2*247.0, 2*2.0, 2*5.0, 2*(-6.0), 2*1.0, &r), -0.022926660587726369939271424097, TEST_TOL3, 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_SF(s, gsl_sf_coupling_6j_e, (1, 0, 1, 0, 1, 0, &r), -sqrt(1.0/2.0), TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_6j_e, (1, 0, 1, 1, 0, 1, &r), -1.0/2.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 6j half-integer/integer coupling conditions */ TEST_SF(s, gsl_sf_coupling_6j_e, (0, 2, 2, 44, 43, 43, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_6j_e, (1, 1, 1, 0, 1, 1, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_6j_e, (1, 1, 1, 1, 0, 1, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_6j_e, (1, 1, 1, 1, 1, 0, &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); /* Test 9j half-integer/integer coupling conditions */ TEST_SF(s, gsl_sf_coupling_9j_e, (1, 1, 1, 1, 1, 1, 0, 0, 0, &r), 0, 0, GSL_SUCCESS); TEST_SF(s, gsl_sf_coupling_9j_e, (1, 1, 0, 1, 1, 0, 1, 1, 0, &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); /* Bug report from Thies Heidecke */ TEST_SF(s, gsl_sf_ellint_Kcomp_e, ( 0.99999999906867742538, mode, &r), 11.4369284843320018031, TEST_SNGL, 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); /* Bug report from Will M. Farr bug #31362 */ /* FIXME: we are accepting MAXITER as the return code, but really this should be changed to EINVAL in the routine itself */ TEST_SF(s, gsl_sf_ellint_Kcomp_e, (GSL_NAN, mode, &r), GSL_NAN, GSL_NAN, GSL_EMAXITER); TEST_SF(s, gsl_sf_ellint_Ecomp_e, (GSL_NAN, mode, &r), GSL_NAN, GSL_NAN, GSL_EMAXITER); 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_TOL1, 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_TOL1, 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_TOL1, 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_TOL1, 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, mode, &r), 2.375395076351788975665323192, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (M_PI/2.0, 0.50, mode, &r), 0.8731525818926755496456335628, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (M_PI/2.0, 0.01, mode, &r), 0.7854276176694868932799393751, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.99, mode, &r), 4.305885125424644860264320635, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.50, mode, &r), 1.418324704155697579394036402, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.01, mode, &r), 1.263755353901126149206022061, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.99, mode, &r), 4.750790152703577951330646444, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.50, mode, &r), 1.746305163785351099291267125, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.01, mode, &r), 1.570855235338973786559878750, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.99, mode, &r), 5.195695179982511042396972113, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.50, mode, &r), 2.074285623415004619188497818, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.01, mode, &r), 1.877955116776821423913735408, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.99, mode, &r), 7.126185229055366926995969476, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.50, mode, &r), 2.619457745678026648936900687, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.01, mode, &r), 2.356282853008460679839818125, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.99, mode, &r), 9.056675278128222811594967044, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.50, mode, &r), 3.164629867941048678685303509, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.01, mode, &r), 2.834610589240099935765900794, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.99, mode, &r), 9.501580305407155902661292832, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.50, mode, &r), 3.492610327570702198582534249, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.01, mode, &r), 3.141710470677947573119757500, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.99, mode, &r), 9.946485332686088993727618315, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.50, mode, &r), 3.820590787200355718479764901, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.01, 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, mode, &r), -2.375395076351788975665323192, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI/2.0, 0.50, mode, &r), -0.8731525818926755496456335628, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI/2.0, 0.01, mode, &r), -0.7854276176694868932799393751, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.99, mode, &r), -4.305885125424644860264320635, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.50, mode, &r), -1.418324704155697579394036402, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.01, mode, &r), -1.263755353901126149206022061, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.99, mode, &r), -4.750790152703577951330646444, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.50, mode, &r), -1.746305163785351099291267125, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.01, mode, &r), -1.570855235338973786559878750, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.99, mode, &r), -5.195695179982511042396972113, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.50, mode, &r), -2.074285623415004619188497818, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.01, mode, &r), -1.877955116776821423913735408, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.99, mode, &r), -7.126185229055366926995969476, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.50, mode, &r), -2.619457745678026648936900687, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.01, mode, &r), -2.356282853008460679839818125, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.99, mode, &r), -9.056675278128222811594967044, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.50, mode, &r), -3.164629867941048678685303509, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.01, mode, &r), -2.834610589240099935765900794, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.99, mode, &r), -9.501580305407155902661292832, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.50, mode, &r), -3.492610327570702198582534249, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.01, mode, &r), -3.141710470677947573119757500, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.99, mode, &r), -9.946485332686088993727618315, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.50, mode, &r), -3.820590787200355718479764901, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.01, 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*exp(-x)*exp(M_LN2), &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)"); TEST_SF_E10(s, gsl_sf_exp_mult_e10_e, (1.0, 1.0, &re), M_E, 0, TEST_TOL0, GSL_SUCCESS); sa = 0; sa += gsl_sf_exp_mult_e10_e(1000.0, 1.0e+200, &re); sa += ( test_sf_frac_diff(re.val, 1.970071114017046993888879352) > TEST_TOL3 ); sa += ( re.err > 1.0e-11 ); sa += ( re.e10 != 634 ); gsl_test(sa, "gsl_sf_exp_mult_e10_e(1000.0, 1.0e+200, &re)"); TEST_SF_E10(s, gsl_sf_exp_mult_e10_e, (1000.0, 1.0e+200, &re), 1.970071114017046993888879352, 634, TEST_TOL3, GSL_SUCCESS); 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_err_e10_e(1.0, TEST_TOL0, 1.0, TEST_TOL0, &re)"); TEST_SF_E10(s, gsl_sf_exp_mult_err_e10_e, (1.0, TEST_TOL0, 1.0, TEST_TOL0, &re), M_E, 0, TEST_TOL0, GSL_SUCCESS); 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_E10(s, gsl_sf_exp_mult_err_e10_e, (1000.0, 1.0e-12, 1.0e+200, 1.0e+190, &re), 1.9700711140165661,634, TEST_TOL3, GSL_SUCCESS); /* Test cases from Szymon Jaroszewicz */ TEST_SF_E10(s, gsl_sf_exp_mult_e10_e, (10000.0, 1.0, &re), 8.806818225662921587261496007, 4342, TEST_TOL5, GSL_SUCCESS); TEST_SF_E10(s, gsl_sf_exp_mult_e10_e, (100.0, 1.0, &re), 2.688117141816135448412625551e43, 0, TEST_TOL2, GSL_SUCCESS); TEST_SF_E10(s, gsl_sf_exp_e10_e, (100.0, &re), 2.688117141816135448412625551e43, 0, TEST_TOL2, GSL_SUCCESS); TEST_SF_E10(s, gsl_sf_exp_e10_e, (1000.0, &re), 1.970071114017046993888879352, 434, TEST_TOL3, GSL_SUCCESS); TEST_SF_E10(s, gsl_sf_exp_e10_e, (-100.0, &re), 3.720075976020835962959695803e-44, 0, TEST_TOL2, GSL_SUCCESS); TEST_SF_E10(s, gsl_sf_exp_e10_e, (-1000.0, &re), 5.075958897549456765291809479, -435, TEST_TOL3, 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_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); TEST_SF(s, gsl_sf_exprel_n_e, (1263131.0, 1261282.3637, &r), 545.0113107238425900305428360, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_exprel_n_CF_e, (6.315655e+05, 6.302583168053568806e+05, &r), 385.425369029433473098652465720, 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); /* Tests for E_n(x) */ TEST_SF(s, gsl_sf_expint_En_e, (1,-1.0, &r), -1.8951178163559367555, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,1.0e-10, &r), 22.448635265138923980, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,1.0e-05, &r), 10.935719800043695615, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,0.1, &r), 1.82292395841939066610, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,1.0, &r), 0.21938393439552027368, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,10.0, &r), 4.156968929685324277e-06, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,50.0, &r), 3.783264029550459019e-24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (1,300.0, &r), 1.710384276804510115e-133, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,-1.0, &r), 0.8231640121031084799, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,1.0/4294967296.0, &r), 0.9999999947372139168, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,1.0/65536.0, &r), 0.9998243233207178845, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,0.1, &r), 0.7225450221940205066, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,1.0, &r), 0.14849550677592204792, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,10.0, &r), 3.830240465631608762e-06, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,50.0, &r), 3.711783318868827367e-24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (2,300.0, &r), 1.7047391998483433998e-133, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,0.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,1.0/4294967296.0, &r), 0.499999999767169356972, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,1.0/65536.0, &r), 0.4999847426094515610, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,0.1, &r), 0.4162914579082787612543, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,1.0, &r), 0.10969196719776013683858, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,10.0, &r),0.000003548762553084381959981, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,50.0, &r), 3.6429094264752049812e-24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (3,300.0, &r),1.699131143349179084e-133, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,0.0, &r), 0.111111111111111111, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,1.0/4294967296.0, &r), 0.111111111082007280658, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,1.0/65536.0, &r), 0.11110920377910896018606, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,0.1, &r), 0.099298432000896813567905, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,1.0, &r), 0.036393994031416401634164534, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,10.0, &r), 0.00000232530265702821081778968, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,50.0, &r), 3.223296586749110919572e-24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_e, (10,300.0, &r), 1.6608815083360041367294736e-133, TEST_TOL2, GSL_SUCCESS); /* Tests for Ei(x) */ 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); /* Tests for E_n(x) */ TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,-10000.0, &r), -0.00010001000200060024012, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,-1000.0, &r), -0.0010010020060241207251, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,-10.0, &r), -0.11314702047341077803, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,-1.0, &r), -0.69717488323506606877, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,1.0e-10, &r), 22.448635267383787506, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,1.0e-05, &r), 10.935829157788483865, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,0.1, &r), 2.0146425447084516791, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,1.0, &r), 0.59634736232319407434, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,10.0, &r), 0.091563333939788081876, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,50.0, &r), 0.019615109930114870365, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,300.0, &r), 0.0033222955652707070644, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,1000.0, &r), 0.00099900199402388071500, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (1,10000.0, &r), 0.000099990001999400239880, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,-10000.0, &r), -0.00010002000600240120072, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,-1000.0, &r), -0.0010020060241207250807, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,-10.0, &r), -0.13147020473410778034, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,-1.0, &r), 0.30282511676493393123, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,0.0, &r), 1.0, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,1.0/4294967296.0, &r), 0.99999999497004455927, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,1.0/65536.0, &r), 0.99983957954556245453, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,0.1, &r), 0.79853574552915483209, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,1.0, &r), 0.40365263767680592566, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,10.0, &r), 0.084366660602119181239, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,50.0, &r), 0.019244503494256481735, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,300.0, &r), 0.0033113304187878806691, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,1000.0, &r), 0.00099800597611928500004, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (2,10000.0, &r), 0.000099980005997601199281, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,0.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,1.0/4294967296.0, &r), 0.4999999998835846787586, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,1.0/65536.0, &r), 0.4999923718293796877864492, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,0.1, &r), 0.4600732127235422583955, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,1.0, &r), 0.298173681161597037170539, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,10.0, &r), 0.07816669698940409380349, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,50.0, &r), 0.0188874126435879566345, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (3,300.0, &r), 0.00330043718181789963028657675, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,0.0, &r), 0.111111111111111111, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,1.0/4294967296.0, &r), 0.11111111110787735217158, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,1.0/65536.0, &r), 0.1111108991839472074435, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,0.1, &r), 0.1097417392579033988025, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,1.0, &r), 0.09892913264064615521915, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,10.0, &r), 0.0512181994376050593314159875, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,50.0, &r), 0.0167118436335939556034579, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_expint_En_scaled_e, (10,300.0, &r), 0.0032261400811599644878615, TEST_TOL2, 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); /* Bug report from Wolfgang Ehrhardt */ TEST_SF(s, gsl_sf_atanint_e, (1.0e+9, &r), 32.552029856869591656, 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_TOL6, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (8e6+1, 2.5, 2.5, &r), 0.63251509472091810994286362e6, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (1e7+1, 2.5, 2.5, &r), 0.15299484685632983178033887e7, TEST_SNGL, 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); /* test cases for Ed Smith-Rowland */ TEST_SF(s, gsl_sf_laguerre_n_e, (100, 0.0, 0.5, &r), 0.18682260367692278801, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (100, 0.0, 10.5, &r), 9.1796907354050059874, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (100, 0.0, -10.5, &r), 5.6329215744170606488e24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (100, 0.0, 100.5, &r), -3.9844782875811907525e20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_laguerre_n_e, (100, 0.0, 150, &r), -1.4463204337261709595e31, TEST_TOL2, 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 case from Katrin Wolff fails under double-precision */ TEST_SF(s, gsl_sf_lambert_W0_e, (1.6849341956993852953416990, &r), 0.775706963944252869680440, 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); TEST_SF_2(s, gsl_sf_complex_psi_e, (1.5, 0.0, &r1, &r2), 0.0364899739785765206, TEST_TOL2, 0.0, TEST_TOL1, GSL_SUCCESS); TEST_SF_2(s, gsl_sf_complex_psi_e, (1.0, 5.0, &r1, &r2), 1.612784844615747, TEST_TOL1, 1.470796326794968, TEST_TOL1, 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(s, gsl_sf_lncosh_e, (1000.0, &r), 999.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(s, gsl_sf_lncosh_e, (-1000.0, &r), 999.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, 100*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, 100*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, 100*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, 100*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, 100*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, 100*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()); } gsl-doc-2.3/specfunc/hyperg_2F0.c0000664000175000017500000000353312616157443014656 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_sf_exp.h0000664000175000017500000000740712616157443015113 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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); int gsl_sf_exprel_n_CF_e(const double n, const double x, gsl_sf_result * result); /* 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__ */ gsl-doc-2.3/specfunc/coupling.c0000664000175000017500000003377212616157443014601 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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) { /* * enough to check the triangle condition for one spin vs. the other two */ return ( (two_jb < abs(two_ja - two_jc)) || (two_jb > two_ja + two_jc) || GSL_IS_ODD(two_ja + two_jb + 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 if ( two_ma == 0 && two_mb == 0 && two_mc == 0 && ((two_ja + two_jb + two_jc) % 4 == 2) ) { /* Special case for (ja jb jc; 0 0 0) = 0 when ja+jb+jc=odd */ 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, sum_err = 0.0; gsl_sf_result bc1, bc2, bc3, bcn1, bcn2, bcd1, bcd2, bcd3, bcd4, term, lnorm; status += gsl_sf_lnchoose_e (two_ja, jcc , &bcn1); status += gsl_sf_lnchoose_e (two_jb, jcc , &bcn2); status += gsl_sf_lnchoose_e (jsum+1, jcc , &bcd1); status += gsl_sf_lnchoose_e (two_ja, jmma, &bcd2); status += gsl_sf_lnchoose_e (two_jb, jmmb, &bcd3); status += gsl_sf_lnchoose_e (two_jc, jpmc, &bcd4); lnorm.val = 0.5 * (bcn1.val + bcn2.val - bcd1.val - bcd2.val - bcd3.val - bcd4.val - log(two_jc + 1.0)); lnorm.err = 0.5 * (bcn1.err + bcn2.err + bcd1.err + bcd2.err + bcd3.err + bcd4.err + GSL_DBL_EPSILON * log(two_jc + 1.0)); for (k = kmin; k <= kmax; k++) { status += gsl_sf_lnchoose_e (jcc, k, &bc1); status += gsl_sf_lnchoose_e (jcb, jmma - k, &bc2); status += gsl_sf_lnchoose_e (jca, jpmb - k, &bc3); status += gsl_sf_exp_err_e(bc1.val + bc2.val + bc3.val + lnorm.val, bc1.err + bc2.err + bc3.err + lnorm.err, &term); if (status != 0) { OVERFLOW_ERROR (result); } if (sign < 0) { sum_neg += term.val; } else { sum_pos += term.val; } sum_err += term.err; sign = -sign; } result->val = sum_pos - sum_neg; result->err = sum_err; 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)); } gsl-doc-2.3/specfunc/gsl_sf_log.h0000664000175000017500000000401612616157443015071 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/bessel_amp_phase.c0000664000175000017500000001105312616157443016237 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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; } gsl-doc-2.3/specfunc/gsl_sf_result.h0000664000175000017500000000305112616157443015624 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/specfunc/elljac.c0000664000175000017500000000656012616157443014206 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include /* 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; } } gsl-doc-2.3/specfunc/test_airy.c0000664000175000017500000002220412616157443014750 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; } gsl-doc-2.3/specfunc/legendre_poly.c0000664000175000017500000005123612616157443015604 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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_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 = 0.0; 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; } } } #ifndef GSL_DISABLE_DEPRECATED 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_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; } } } int gsl_sf_legendre_array_size(const int lmax, const int m) { return lmax-m+1; } #endif /* !GSL_DISABLE_DEPRECATED */ /*-*-*-*-*-*-*-*-*-* 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)); } gsl-doc-2.3/specfunc/poch.c0000664000175000017500000003400012616157443013673 0ustar eddedd/* specfunc/poch.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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(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 && a == floor(a)) { /* Special cases for infinite denominator Gamma(a) */ if (a + x < 0 && x == floor(x)) { /* Handle the case where both a and a+x are negative integers. */ gsl_sf_result result_pos; /* Use the reflection formula AMS6.1.17 poch(-a,-x) = (-1)^x (a/(a+x)) 1/poch(a,x) */ int stat = lnpoch_pos (-a, -x, &result_pos); double f = log (a / (a + x)); double s = (fmod(x, 2) == 0) ? 1 : -1; result->val = f - result_pos.val; result->err = result_pos.err + 2.0 * GSL_DBL_EPSILON * f; *sgn = s; return stat; } else if (a + x == 0) { /* Handle a+x = 0 i.e. Gamma(0)/Gamma(a) */ /* poch (-a,a) == (-1)^a Gamma(a+1) */ int stat = gsl_sf_lngamma_sgn_e (-a + 1, result, sgn); double s = (fmod(-a, 2) == 0) ? 1 : -1; *sgn *= s; return stat; } else { /* Handle finite numerator, Gamma(a+x) for a+x != 0 or neg int */ result->val = GSL_NEGINF; result->err = 0.0; *sgn = 1; return GSL_SUCCESS; } } 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); if (lnpoch.val == GSL_NEGINF) { result->val = 0; result->err = 0; return stat_lnpoch; } else { 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)); } gsl-doc-2.3/specfunc/hyperg_2F1.c0000644000175000017500000007117512736044021014652 0ustar eddedd/* specfunc/hyperg_2F1.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman * Copyright (C) 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 del_prev; 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_prev = del; 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; } /* * This stopping criteria is taken from the thesis * "Computation of Hypergeometic Functions" by J. Pearson, pg. 31 * (http://people.maths.ox.ac.uk/porterm/research/pearson_final.pdf) * and fixes bug #45926 */ if (fabs(del_prev / (sum_pos - sum_neg)) < GSL_DBL_EPSILON && fabs(del / (sum_pos - sum_neg)) < GSL_DBL_EPSILON) break; 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; ival = 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); if (status_F1) return status_F1; if (status_F2) return status_F2; 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; /* Handle x == 1.0 RJM */ if (fabs (x - 1.0) < locEPS && (c - a - b) > 0 && c != 0 && !c_neg_integer) { gsl_sf_result lngamc, lngamcab, lngamca, lngamcb; double lngamc_sgn, lngamca_sgn, lngamcb_sgn; int status; int stat1 = gsl_sf_lngamma_sgn_e (c, &lngamc, &lngamc_sgn); int stat2 = gsl_sf_lngamma_e (c - a - b, &lngamcab); int stat3 = gsl_sf_lngamma_sgn_e (c - a, &lngamca, &lngamca_sgn); int stat4 = gsl_sf_lngamma_sgn_e (c - b, &lngamcb, &lngamcb_sgn); if (stat1 != GSL_SUCCESS || stat2 != GSL_SUCCESS || stat3 != GSL_SUCCESS || stat4 != GSL_SUCCESS) { DOMAIN_ERROR (result); } status = gsl_sf_exp_err_e (lngamc.val + lngamcab.val - lngamca.val - lngamcb.val, lngamc.err + lngamcab.err + lngamca.err + lngamcb.err, result); result->val *= lngamc_sgn / (lngamca_sgn * lngamcb_sgn); return status; } if(x < -1.0 || 1.0 <= x) { DOMAIN_ERROR(result); } if(c_neg_integer) { /* If c is a negative integer, then either a or b must be a negative integer of smaller magnitude than c to ensure cancellation of the series. */ if(! (a_neg_integer && a > c + 0.1) && ! (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(ap),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(ap) < 10.0) { /* The famous but nearly worthless "large b" asymptotic. */ int stat = gsl_sf_hyperg_1F1_e(ap, 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)); } gsl-doc-2.3/specfunc/Makefile.am0000664000175000017500000000450012757132056014633 0ustar eddeddnoinst_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 legendre_source.c AM_CPPFLAGS = -I$(top_srcdir) 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_P.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 ../poly/libgslpoly.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 gsl-doc-2.3/specfunc/gsl_sf_erf.h0000664000175000017500000000436712616157443015075 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/bessel.h0000664000175000017500000000604412616157443014233 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 /* 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_ */ gsl-doc-2.3/specfunc/bessel_olver.c0000664000175000017500000007612412616157443015443 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); } } gsl-doc-2.3/specfunc/test_dilog.c0000664000175000017500000002727512616157443015117 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; } gsl-doc-2.3/specfunc/gsl_sf_airy.h0000664000175000017500000000717512616157443015265 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/specfunc/test_coulomb.c0000664000175000017500000004243412616157443015453 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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; #ifdef FIXME /* compute F_37(eta=0,x), F'_37 and G_36(eta=0,x), G'_36 for x=1.2693881947287221e-07 */ /* For eta=0 expanding A&S 4.3.1 gives FplusIG(L,r)={I*exp(-I*r)*sum(k=0,L,((L+k)!/(k!*(L-k)!))*(I^(L-k))*(2*r)^(-k)) or alternatively F+iG can be expressed in terms of bessel functions FplusIG(L,r)=sqrt(Pi*x/2)*besselh1(L+1/2,x)) */ lam_F = 37.0; eta = 0.0; x = 1.2693881947287221e-07; 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, 6.5890724278623412974127e-318 , TEST_TOL3); s += test_sf_check_result(message_buff, Fp, 1.97248369961623986509839591990e-309, TEST_TOL3); s += test_sf_check_result(message_buff, G, 4.46663541714903607940730e299, TEST_TOL3); s += test_sf_check_result(message_buff, Gp, -1.26674311046140805594543e308 , TEST_TOL3); printf("%s", message_buff); gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.2693881947287221e-07, 0.0, lam_F=37, lam_G=36)"); status += s; #endif return status; } gsl-doc-2.3/specfunc/bessel_k.c0000664000175000017500000001445312616157443014543 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; ival = -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; jval = 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)); } gsl-doc-2.3/specfunc/gsl_sf_gegenbauer.h0000664000175000017500000000415212616157443016415 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/legendre.h0000664000175000017500000000447712616157443014553 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 /* 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); gsl-doc-2.3/specfunc/hyperg_U.c0000664000175000017500000016146112616157443014540 0ustar eddedd/* specfunc/hyperg_U.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2009, 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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; ival = 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; } } } } /* Evaluate infinite sum which appears below. */ static int hyperg_U_infinite_sum_stable(int N, double a, double bint, double b, double beps, double x, double xeps, gsl_sf_result sum, gsl_sf_result * result) { const double EPS = 2.0 * GSL_DBL_EPSILON; /* EPS = D1MACH(3) */ 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(bint + xi, &gamrni); int stat_gam123 = GSL_ERROR_SELECT_3(stat_gamr, stat_gamri1, stat_gamrni); int stat_gamall = GSL_ERROR_SELECT_3(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); /* 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/((bint+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; } } static int hyperg_U_infinite_sum_simple(int N, double a, double bint, double b, double beps, double x, double xeps, gsl_sf_result sum, gsl_sf_result * result) { const double EPS = 2.0 * GSL_DBL_EPSILON; /* EPS = D1MACH(3) */ int istrt = ( N < 1 ? 1-N : 0 ); double xi = istrt; gsl_sf_result powx; 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 ) * powx.val; double factor_err = fabs(powx.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(bint + xi, &gamrni); int stat_gam123 = GSL_ERROR_SELECT_2(stat_gamri1, stat_gamrni); int stat_gamall = GSL_ERROR_SELECT_3(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 X = sfact * ( GSL_IS_ODD(N) ? -1.0 : 1.0 ) * powx.val * gsl_sf_poch(1 + a - b, xi - 1 + b - beps) * gsl_sf_gammainv(a); double b0_val = X * 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); /* 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 gamr; gsl_sf_result dgamrbxi; int stat_gamr = gsl_sf_gammainv_e(1.0+a-b, &gamr); int stat_dgamrbxi = gsl_sf_gammainv_e(b+xi, &dgamrbxi); double a0_val = factor_val * gamr.val * pochai.val * dgamrbxi.val * gamri1.val / beps; double a0_err = fabs(factor_val * pochai.val * dgamrbxi.val * gamri1.val / beps) * gamr.err + fabs(factor_val * gamr.val * dgamrbxi.val * gamri1.val / beps) * pochai.err + fabs(factor_val * gamr.val * pochai.val * gamri1.val / beps) * dgamrbxi.err + fabs(factor_val * gamr.val * pochai.val * dgamrbxi.val / beps) * gamri1.err + fabs(pochai.val * gamr.val * dgamrbxi.val * gamri1.val / beps) * factor_err + 2.0 * GSL_DBL_EPSILON * fabs(a0_val); stat_all = GSL_ERROR_SELECT_3(stat_all, stat_gamr, 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/((bint+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(!gsl_finite(t_val) || 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; } } static int hyperg_U_infinite_sum_improved(int N, double a, double bint, double b, double beps, double x, double xeps, gsl_sf_result sum, gsl_sf_result * result) { const double EPS = 2.0 * GSL_DBL_EPSILON; /* EPS = D1MACH(3) */ const double lnx = log(x); 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(bint + xi, &gamrni); int stat_gam123 = GSL_ERROR_SELECT_3(stat_gamr, stat_gamri1, stat_gamrni); int stat_gamall = GSL_ERROR_SELECT_3(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); /* 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; } } /* 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 SQRT_EPS = M_SQRT2 * GSL_SQRT_DBL_EPSILON; double bint = ( b < 0.0 ? ceil(b-0.5) : floor(b+0.5) ); double beps = b - bint; double a_beps = a - beps; double r_a_beps = floor(a_beps + 0.5); double a_beps_int = ( fabs(a_beps - r_a_beps) < INT_THRESHOLD ); /* double a_b_1 = a-b+1; double r_a_b_1 = floor(a_b_1+0.5); double r_a_b_1_int = (fabs(a_b_1-r_a_b_1)< INT_THRESHOLD); Check for (a-beps) being a member of -N; N being 0,1,... */ if (a_beps_int && a_beps <= 0) { beps=beps - 1 + floor(a_beps);bint=bint + 1 - floor(a_beps); } 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 { int N = (int) bint; 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); int stat_inf; /* Evaluate infinite sum. */ if(fabs(xeps-1.0) > 0.5 ) { stat_inf = hyperg_U_infinite_sum_stable(N, a, bint, b, beps, x, xeps, sum, result); } else if (1+a-b < 0 && 1+a-b==floor(1+a-b) && beps != 0) { stat_inf = hyperg_U_infinite_sum_simple(N, a, bint, b, beps, x, xeps, sum, result); } else { stat_inf = hyperg_U_infinite_sum_improved(N, a, bint, b, beps, x, xeps, sum, result); } return GSL_ERROR_SELECT_2(stat_sum, stat_inf); } } /* 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 = 0.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; bpval = 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) && 1 + a - b > 0) { 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; apa_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; apval = 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= 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; apa0+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; apval = factor * r1.val * r2.val; result->err = fabs(factor) * (r1.err + r2.err); result->e10 = 0; return GSL_ERROR_SELECT_2(stat_1, stat_2); } static int hyperg_U_int_origin (const int a, const int b, gsl_sf_result_e10 * result) { return hyperg_U_origin (a, b, result); } /* Calculate U(a,b,x) for x < 0 Abramowitz and Stegun formula 13.1.3 U(a,b,x) = (gamma(1-b)/gamma(1+a-b)) M(a,b,x) - z^(1-b) (gamma(1-b)/gamma(a)) M(1+a-b,2-b,x) can be transformed into U(a,b,x) = poch(1+a-b,-a) M(a,b,x) + z^(1-b) poch(a,-(1+a-b)) M(1+a-b,2-b,x) using the reflection formula 6.1.17 and the definition of Poch(a,b)=gamma(a+b)/gamma(a). Our poch function already handles the special cases of ratios of gamma functions with negative integer argument. Note that U(a,b,x) is complex in general for x<0 due to the term x^(1-b), but is real when 1) b is an integer 4) a is zero or a negative integer so x^(1-b)/gamma(a) is zero. For integer b U(a,b,x) is defined as the limit beta->b U(a,beta,x). This makes the situation slightly more complicated. */ static int hyperg_U_negx (const double a, const double b, const double x, gsl_sf_result_e10 * result) { gsl_sf_result r1, r2; int stat_1, stat_2, status; int a_int = (a == floor(a)); int b_int = (b == floor(b)); double T1 = 0, T1_err = 0, T2 = 0, T2_err = 0; /* Compute the first term poch(1+a-b) M(a,b,x) */ if (b_int && b <= 0 && !(a_int && a <= 0 && a >= b)) { /* Need to handle first term as lim_{beta->b} poch(1+a-beta,-a) M(a,beta,x) due to pole in M(a,b,x) for b == 0 or -ve integer We skip this case when a is zero or a negative integer and a>=b because the hypergeometric series terminates before any singular terms */ /* FIXME: TO BE IMPLEMENTED ! */ result->val = GSL_NAN; result->err = GSL_NAN; GSL_ERROR("limit case integer b <= 0 unimplemented", GSL_EUNIMPL); } else { stat_1 = gsl_sf_poch_e(1+a-b,-a,&r1); status = stat_1; if (r1.val != 0.0) { gsl_sf_result Mr1; int stat_Mr1 = gsl_sf_hyperg_1F1_e (a, b, x, &Mr1); status = GSL_ERROR_SELECT_2(status, stat_Mr1); T1 = Mr1.val * r1.val; T1_err = 2.0 * GSL_DBL_EPSILON * fabs(T1) + fabs(Mr1.err * r1.val) + fabs(Mr1.val * r1.err) ; } } /* Compute the second term z^(1-b) poch(a,-(1+a-b)) M(1+a-b,2-b,x) */ if (b_int && b >= 2 && !(a_int && a <= (b - 2))) { /* Need to handle second term as a limit due to pole in M(1+a-b,2-b,x). We skip this case when a is integer and a <= b-2 because the hypergeometric series terminates before any singular terms */ /* FIXME: TO BE IMPLEMENTED ! */ result->val = GSL_NAN; result->err = GSL_NAN; GSL_ERROR("limit case integer b >= 2 unimplemented", GSL_EUNIMPL); } else { if (a_int && a <= 0 && (b >= 1)) { r2.val = 0; r2.err = 0; } else { stat_2 = gsl_sf_poch_e(a,-(1+a-b),&r2); status = GSL_ERROR_SELECT_2(status, stat_2); } if (r2.val != 0.0) { gsl_sf_result Mr2; int stat_Mr2 = gsl_sf_hyperg_1F1_e (1+a-b, 2-b, x, &Mr2); T2 = Mr2.val * r2.val; T2_err = 2.0 * GSL_DBL_EPSILON * fabs(T2) + fabs(Mr2.err * r2.val) + fabs(Mr2.val * r2.err); status = GSL_ERROR_SELECT_2(status, stat_Mr2); if (T2 != 0.0) { double x1mb = pow(x, 1-b); T2 = x1mb * T2; T2_err = fabs(x1mb) * T2_err; } } } result->val = (T1 + T2); result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + (T1_err + T2_err); result->e10 = 0; return status; } static int hyperg_U_int_negx (const int a, const int b, const double x, gsl_sf_result_e10 * result) { /* Looking at the tests it seems that everything is handled correctly by hyperg_U_negx except aval = res_tem; result->err = res_tem_err; return status; } else { return hyperg_U_negx (a, b, x, result); } } /*-*-*-*-*-*-*-*-*-*-*-* 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 && b >= 1) { DOMAIN_ERROR_E10(result); } else if (x == 0.0) { return hyperg_U_int_origin (a, b, result); } else if (x < 0.0) { return hyperg_U_int_negx (a, b, x, 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 && b >= 1) { 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 (x == 0.0) { return hyperg_U_origin (a, b, result); } else if(a_integer && b == a + 1) /* This is DLMF 13.6.4 */ { gsl_sf_result powx1N_1; gsl_sf_pow_int_e(x, -a, &powx1N_1); result->val = powx1N_1.val; result->err = powx1N_1.err; 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 (x < 0.0) { return hyperg_U_negx (a, b, 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 = {0, 0, 0}; 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 = {0, 0, 0}; 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)); } gsl-doc-2.3/specfunc/bessel_I0.c0000664000175000017500000001416412616157443014560 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); ) } gsl-doc-2.3/specfunc/gsl_sf_lambert.h0000664000175000017500000000342512616157443015741 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/debye.c0000664000175000017500000003340012616157443014035 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_K0.c0000644000175000017500000001313712736044021014545 0ustar eddedd/* specfunc/bessel_K0.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2016 Pavel Holoborodko, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include "error.h" #include "chebyshev.h" #include "cheb_eval.c" /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/ /* Minimax rational approximation for [0,1), peak relative error = 2.04*GSL_DBL_EPSILON. Source: http://www.advanpix.com/?p=3812 */ static double k0_poly[8] = { 1.1593151565841244842077226e-01, 2.7898287891460317300886539e-01, 2.5248929932161220559969776e-02, 8.4603509072136578707676406e-04, 1.4914719243067801775856150e-05, 1.6271068931224552553548933e-07, 1.2082660336282566759313543e-09, 6.6117104672254184399933971e-12 }; static double i0_poly[7] = { 1.0000000000000000044974165e+00, 2.4999999999999822316775454e-01, 2.7777777777892149148858521e-02, 1.7361111083544590676709592e-03, 6.9444476047072424198677755e-05, 1.9288265756466775034067979e-06, 3.9908220583262192851839992e-08 }; /* Chebyshev expansion for [1,8], peak relative error = 1.28*GSL_DBL_EPSILON. Source: Pavel Holoborodko. */ static double ak0_data[24] = { -3.28737867094650101e-02, -4.49369057710236880e-02, +2.98149992004308095e-03, -3.03693649396187920e-04, +3.91085569307646836e-05, -5.86872422399215952e-06, +9.82873709937322009e-07, -1.78978645055651171e-07, +3.48332306845240957e-08, -7.15909210462546599e-09, +1.54019930048919494e-09, -3.44555485579194210e-10, +7.97356101783753023e-11, -1.90090968913069735e-11, +4.65295609304114621e-12, -1.16614287433470780e-12, +2.98554375218596891e-13, -7.79276979512292169e-14, +2.07027467168948402e-14, -5.58987860393825313e-15, +1.53202965950646914e-15, -4.25737536712188186e-16, +1.19840238501357389e-16, -3.41407346762502397e-17 }; static cheb_series ak0_cs = { ak0_data, 23, -1, 1, 10 }; /* Chebyshev expansion for [8,inf), peak relative error = 1.25*GSL_DBL_EPSILON. Source: SLATEC/dbsk0e.f */ static double ak02_data[14] = { -.1201869826307592240E-1, -.9174852691025695311E-2, +.1444550931775005821E-3, -.4013614175435709729E-5, +.1567831810852310673E-6, -.7770110438521737710E-8, +.4611182576179717883E-9, -.3158592997860565771E-10, +.2435018039365041128E-11, -.2074331387398347898E-12, +.1925787280589917085E-13, -.1927554805838956104E-14, +.2062198029197818278E-15, -.2341685117579242403E-16 }; 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 < 1.0) { const double lx = log(x); const double ex = exp(x); const double x2 = x*x; result->val = ex * (gsl_poly_eval(k0_poly,8,x2)-lx*(1.0+0.25*x2*gsl_poly_eval(i0_poly,7,0.25*x2))); result->err = ex * (1.6+fabs(lx)*0.6) * GSL_DBL_EPSILON; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else if(x <= 8.0) { const double sx = sqrt(x); gsl_sf_result c; cheb_eval_e(&ak0_cs, (16.0/x-9.0)/7.0, &c); result->val = (1.203125 + c.val) / sx; /* 1.203125 = 77/64 */ 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 < 1.0) { const double lx = log(x); const double x2 = x*x; result->val = gsl_poly_eval(k0_poly,8,x2)-lx*(1.0+0.25*x2*gsl_poly_eval(i0_poly,7,0.25*x2)); result->err = (1.6+fabs(lx)*0.6) * GSL_DBL_EPSILON; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } 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)); } gsl-doc-2.3/specfunc/zeta.c0000664000175000017500000010076012616157443013714 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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; kval = 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)); } gsl-doc-2.3/specfunc/clausen.c0000664000175000017500000000526212616157443014404 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_i.c0000664000175000017500000002147712616157443014545 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_temme.c0000664000175000017500000001425112616157443015414 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "bessel_temme.h" #include "chebyshev.h" #include "cheb_eval.c" /* nu = (x+1)/4, -1val = -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); } gsl-doc-2.3/specfunc/bessel_Jn.c0000664000175000017500000001171212616157443014653 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "bessel.h" #include "bessel_amp_phase.h" #include "bessel_olver.h" #include /*-*-*-*-*-*-*-*-*-*-*-* 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)); } gsl-doc-2.3/specfunc/gsl_sf_bessel.h0000664000175000017500000003352512616157443015574 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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); int gsl_sf_bessel_Knu_scaled_e10_e(const double nu, const double x, gsl_sf_result_e10 * result); /* 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__ */ gsl-doc-2.3/specfunc/synchrotron.c0000664000175000017500000001626412616157443015346 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_sf_elementary.h0000664000175000017500000000317112616157443016456 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/TODO0000664000175000017500000003315712616157443013302 0ustar eddedd# -*- org -*- #+CATEGORY: specfunc * Complex hypergeometric function 1F1 * Could probably return immediately for exact zeros in 3j,6j,9j functions. Easiest to implement for 3j. Note from Serge Winitzki : 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" To: "Brian Gough" 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" Newsgroups: comp.lang.c References: 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: 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 */ 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 Marsagliagsl-doc-2.3/specfunc/expint3.c0000664000175000017500000000661512616157443014347 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_sf_dilog.h0000664000175000017500000001011312616157443015401 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/trig.c0000664000175000017500000004643112616157443013722 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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), -1val = 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(fabs(x) < -0.5*GSL_LOG_DBL_EPSILON) { result->val = fabs(x) + log(0.5*(1.0 + exp(-2.0*fabs(x)))); result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { result->val = -M_LN2 + fabs(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)); } gsl-doc-2.3/specfunc/gamma_inc.c0000664000175000017500000005043612616157443014670 0ustar eddedd/* specfunc/gamma_inc.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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 */ /* Propagate cancellation error from x-a, since the absolute error of mu=x-a is DBL_EPSILON */ ln_term.err += GSL_DBL_EPSILON * fabs(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); /* Include propagated error from log term */ result->err += fabs(a) * ln_term.err * 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 = 10000; gsl_sf_result D; int stat_D = gamma_inc_D(a, x, &D); /* Approximating the terms of the series using Stirling's approximation gives t_n = (x/a)^n * exp(-n(n+1)/(2a)), so the convergence condition is n^2 / (2a) + (1-(x/a) + (1/2a)) n >> -log(GSL_DBL_EPS) if we want t_n < O(1e-16) t_0. The condition below detects cases where the minimum value of n is > 5000 */ if (x > 0.995 * a && a > 1e5) { /* Difficult case: try continued fraction */ gsl_sf_result cf_res; int status = gsl_sf_exprel_n_CF_e(a, x, &cf_res); result->val = D.val * cf_res.val; result->err = fabs(D.val * cf_res.err) + fabs(D.err * cf_res.val); return status; } /* Series would require excessive number of terms */ if (x > (a + nmax)) { GSL_ERROR ("gamma_inc_P_series x>>a exceeds range", GSL_EMAXITER); } /* Normal case: sum the series */ { double sum = 1.0; double term = 1.0; double remainder; int n; /* Handle lower part of the series where t_n is increasing, |x| > a+n */ int nlow = (x > a) ? (x - a): 0; for(n=1; n < nlow; n++) { term *= x/(a+n); sum += term; } /* Handle upper part of the series where t_n is decreasing, |x| < a+n */ for (/* n = previous n */ ; nval = D.val * sum; result->err = D.err * fabs(sum) + fabs(D.val * remainder); result->err += (1.0 + n) * GSL_DBL_EPSILON * fabs(result->val); if(n == nmax && fabs(remainder/sum) > GSL_SQRT_DBL_EPSILON) GSL_ERROR ("gamma_inc_P_series failed to converge", 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 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; nval = 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 double am1lgx = (a-1.0)*log(x); const int stat_F = gamma_inc_F_CF(a, x, &F); const int stat_E = gsl_sf_exp_err_e(am1lgx - x, GSL_DBL_EPSILON*fabs(am1lgx), &pre); result->val = F.val * pre.val; result->err = fabs(F.err * pre.val) + fabs(F.val * pre.err); result->err += 2.0 * 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)); } gsl-doc-2.3/specfunc/gsl_sf_legendre.h0000664000175000017500000002716312616157443016105 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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); /* associated legendre P_{lm} routines */ typedef enum { GSL_SF_LEGENDRE_SCHMIDT, GSL_SF_LEGENDRE_SPHARM, GSL_SF_LEGENDRE_FULL, GSL_SF_LEGENDRE_NONE } gsl_sf_legendre_t; int gsl_sf_legendre_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[]); int gsl_sf_legendre_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[]); int gsl_sf_legendre_deriv_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_alt_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_alt_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv2_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_alt_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_alt_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[], double result_deriv2_array[]); size_t gsl_sf_legendre_array_n(const size_t lmax); size_t gsl_sf_legendre_array_index(const size_t l, const size_t m); size_t gsl_sf_legendre_nlm(const size_t lmax); __END_DECLS #endif /* __GSL_SF_LEGENDRE_H__ */ gsl-doc-2.3/specfunc/gegenbauer.c0000664000175000017500000001160012616157443015047 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/beta_inc.c0000664000175000017500000001363012616157443014514 0ustar eddedd/* specfunc/beta_inc.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include "error.h" #include "check.h" static double isnegint (const double x) { return (x < 0) && (x == floor(x)); } 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(x < 0.0 || x > 1.0) { DOMAIN_ERROR(result); } else if (isnegint(a) || isnegint(b)) { DOMAIN_ERROR(result); } else if (isnegint(a+b)) { 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 if (a <= 0 || b <= 0) { gsl_sf_result f, beta; int stat; const int stat_f = gsl_sf_hyperg_2F1_e(a, 1-b, a+1, x, &f); const int stat_beta = gsl_sf_beta_e(a, b, &beta); double prefactor = (pow(x, a) / a); result->val = prefactor * f.val / beta.val; result->err = fabs(prefactor) * f.err/ fabs(beta.val) + fabs(result->val/beta.val) * beta.err; stat = GSL_ERROR_SELECT_2(stat_f, stat_beta); if(stat == GSL_SUCCESS) { CHECK_UNDERFLOW(result); } return stat; } 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)); /* since the prefactor term is subtracted from 1 we need to ignore underflow */ if (stat_exp != GSL_EUNDRFLW) { stat = GSL_ERROR_SELECT_2(stat_exp, stat_cf); } else { stat = 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)); } gsl-doc-2.3/specfunc/coulomb_bound.c0000664000175000017500000000725312616157443015603 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_Inu.c0000664000175000017500000000653012616157443015041 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; nval = 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)); } gsl-doc-2.3/specfunc/eval.h0000664000175000017500000000064012616157443013701 0ustar eddedd/* 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; gsl-doc-2.3/specfunc/test_sf.h0000664000175000017500000001064112616157443014423 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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 #ifdef RELEASED #define TEST_FACTOR 100.0 #else #define TEST_FACTOR 1.0 #endif #endif #ifndef TEST_SIGMA #ifdef 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 #define TEST_SF_ERRBIG 32 #define TEST_SF_EXPBAD 64 int test_sf (gsl_sf_result r, double val_in, double tol, int status, int expect_return, const char * desc); int test_sf_e10 (gsl_sf_result_e10 r, double val_in, int e10_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_E10(stat, func, args, val_in, e10_in, tol, expect_return) { int status = func args; stat += test_sf_e10(re, val_in, e10_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 */ gsl-doc-2.3/specfunc/bessel_Yn.c0000664000175000017500000001257412616157443014701 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; kval = 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; jval = 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)); } gsl-doc-2.3/specfunc/gsl_sf_mathieu.h0000664000175000017500000001032312616157443015742 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #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_e(int order, double qq, gsl_sf_result *result); double gsl_sf_mathieu_a(int order, double qq); int gsl_sf_mathieu_b_e(int order, double qq, gsl_sf_result *result); double gsl_sf_mathieu_b(int order, double qq); /* 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_e(int order, double qq, double zz, gsl_sf_result *result); double gsl_sf_mathieu_ce(int order, double qq, double zz); int gsl_sf_mathieu_se_e(int order, double qq, double zz, gsl_sf_result *result); double gsl_sf_mathieu_se(int order, double qq, double zz); 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_e(int kind, int order, double qq, double zz, gsl_sf_result *result); double gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz); int gsl_sf_mathieu_Ms_e(int kind, int order, double qq, double zz, gsl_sf_result *result); double gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz); 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__ */ gsl-doc-2.3/specfunc/test_gamma.c0000664000175000017500000006774312616157443015107 0ustar eddedd/* specfunc/test_gamma.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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); /* Add tests for special cases with negative arguments */ TEST_SF(s, gsl_sf_poch_e, (-9.0, -4.0, &r), 1.0/17160.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, -3.0, &r), -1.0/1320.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, -3.5, &r), 0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, 4.0, &r), 3024.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, 3.0, &r), -504.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, 3.5, &r), 0.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-9.0, 0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-8.0, -4.0, &r), 1.0/11880.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-8.0, -3.0, &r), -1.0/990.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-8.0, +4.0, &r), 1680.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-8.0, +3.0, &r), -336.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-3.0, +4.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS); /* FIXME: we should be able to get an exact answer for poch(-a,a) if gsl_sf_lngamma functions were fixed to handle integer arguments exactly as a special case */ TEST_SF(s, gsl_sf_poch_e, (-3.0, +3.0, &r), -6.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-4.0, +4.0, &r), 24.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_poch_e, (-3.0, +100.0, &r), 0.0, 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 BUG#12 */ TEST_SF(s, gsl_sf_gamma_inc_P_e, (10, 1e-16, &r), 2.755731922398588814734648067e-167, TEST_TOL2, GSL_SUCCESS); /* Regression test for gsl_cdf_chisq_Pinv, (0.05, 1263131.0) */ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1263131.0, 1261282.3637, &r), 0.04994777516935182963821362168, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_gamma_inc_P_e, (1263131.0, 1263131.0, &r), 0.500118321758657770672882362502514254, TEST_TOL4, 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_TOL3, 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_TOL3, 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_TOL4, 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); 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, (-0.1, -0.2, 1.0, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.2, -0.1, 1.0, &r), 1.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.1, -0.2, 0.5, &r), 0.675252001958389971991335, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.2, -0.1, 0.5, &r), 0.324747998041610028008665, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.1, -0.1, 0.0, &r), 0.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.1, -0.2, 0.0, &r), 0.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.2, -0.1, 0.0, &r), 0.0, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.1, -0.2, 0.3, &r), 0.7469186777964287252, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_beta_inc_e, (-0.2, -0.1, 0.3, &r), 0.3995299653262016818, TEST_TOL2, GSL_SUCCESS); /* Bug report from Thomas Tanner */ TEST_SF(s, gsl_sf_beta_inc_e, (0.5, 101.5, 0.999457, &r), 1.0, TEST_TOL2, GSL_SUCCESS); return s; } gsl-doc-2.3/specfunc/gsl_sf_hyperg.h0000664000175000017500000001064512616157443015613 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/gsl_sf_expint.h0000664000175000017500000001045512616157443015623 0ustar eddedd/* specfunc/gsl_sf_expint.h * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_n(x) := Re[ Integrate[ Exp[-xt]/t^n, {t,1,Infinity}] ] * * x != 0.0 * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW */ int gsl_sf_expint_En_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_expint_En(const int n, 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); /* E_n_scaled(x) := exp(x) E_n(x) * * x != 0.0 * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW */ int gsl_sf_expint_En_scaled_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_expint_En_scaled(const int n, 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__ */ gsl-doc-2.3/specfunc/bessel_temme.h0000664000175000017500000000235112616157443015417 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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_ */ gsl-doc-2.3/specfunc/gsl_sf_clausen.h0000664000175000017500000000267312616157443015751 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/erfc.c0000664000175000017500000002770412616157443013676 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_I1.c0000664000175000017500000001523412616157443014560 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/cheb_eval.c0000664000175000017500000000122012616157443014650 0ustar eddedd 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; } gsl-doc-2.3/specfunc/log.c0000664000175000017500000001535012616157443013532 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_j.c0000664000175000017500000002466712616157443014552 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 { result->val = sin(x) / x; result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } } 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 { const double cos_x = cos(x); const double sin_x = sin(x); result->val = (sin_x/x - cos_x)/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_SUCCESS; } } 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 > l*l) { /* We need this path to avoid feeding large x to CF1 below; */ 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; /* The CF1 call will hit 10000 iterations for x > 10000 + l */ int stat_CF1 = gsl_sf_bessel_J_CF1(l+0.5, x, &ratio, &sgn); const double BESSEL_J_SMALL = GSL_DBL_MIN / GSL_DBL_EPSILON; double jellp1 = BESSEL_J_SMALL * ratio; double jell = BESSEL_J_SMALL; 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 = BESSEL_J_SMALL / jell; result->val = j0_result.val * pre; result->err = j0_result.err * fabs(pre); result->err += 4.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 = BESSEL_J_SMALL / jellp1; result->val = j1_result.val * pre; result->err = j1_result.err * fabs(pre); result->err += 4.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)); } gsl-doc-2.3/specfunc/psi.c0000664000175000017500000006036412616157443013551 0ustar eddedd/* specfunc/psi.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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)); result_re->err = 2.0 * GSL_DBL_EPSILON * fabs(GSL_REAL(a)); result_im->err = 2.0 * GSL_DBL_EPSILON * fabs(GSL_IMAG(a)); /* 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); /* accumulate the error, to catch cancellations */ result_re->err += 2.0 * GSL_DBL_EPSILON * fabs(GSL_REAL(zn_inverse)); result_im->err += 2.0 * GSL_DBL_EPSILON * fabs(GSL_IMAG(zn_inverse)); } result_re->val = GSL_REAL(a); result_im->val = GSL_IMAG(a); result_re->err += 2.0 * GSL_DBL_EPSILON * fabs(result_re->val); result_im->err += 2.0 * 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)); } gsl-doc-2.3/specfunc/bessel_y.c0000664000175000017500000001720512616157443014557 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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; jval = 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)); } gsl-doc-2.3/specfunc/gsl_sf.h0000664000175000017500000000202012616157443014221 0ustar eddedd/* Author: G. Jungman */ #ifndef __GSL_SF_H__ #define __GSL_SF_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_SF_H__ */ gsl-doc-2.3/specfunc/cheb_eval_mode.c0000664000175000017500000000125012616157443015657 0ustar eddeddstatic 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; } gsl-doc-2.3/specfunc/bessel_In.c0000664000175000017500000001443012616157443014652 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_specfunc.h0000664000175000017500000000025512616157443015427 0ustar eddedd/* Author: G. Jungman */ /* Convenience header */ #ifndef __GSL_SPECFUNC_H__ #define __GSL_SPECFUNC_H__ #include #endif /* __GSL_SPECFUNC_H__ */ gsl-doc-2.3/specfunc/hyperg.h0000664000175000017500000000433612616157443014256 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 /* 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_ */ gsl-doc-2.3/specfunc/mathieu_angfunc.c0000664000175000017500000002053412616157443016106 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include #include #include int gsl_sf_mathieu_ce_e(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_e(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; iival = 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_e(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_e(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; iival = 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; iisize < (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; jjbb, norm; /* Initialize the result array to zeroes. */ for (ii=0; iisize < (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 cases where order = 0 and/or q = 0. */ if (order == 0) { norm = 1.0; result_array[ii] = 0.0; continue; } 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/mathieu_radfunc.c0000664000175000017500000003032212616157443016103 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include #include #include int gsl_sf_mathieu_Mc_e(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_e(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; kkval = 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_e(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); } /* Handle the trivial cases where order = 0. */ if (order == 0) { result->val = 0.0; result->err = 0.0; return GSL_SUCCESS; } 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_e(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; kkval = 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 2) { GSL_ERROR("kind must be 1 or 2", GSL_EINVAL); } mm = 0; amax = 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++) { fn = 0.0; 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; kkbb; /* Initialize the result array to zeroes. */ for (ii=0; ii 2) { GSL_ERROR("kind must be 1 or 2", GSL_EINVAL); } mm = 0; amax = 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++) { fn = 0.0; even_odd = 0; if (order % 2 != 0) even_odd = 1; /* Handle the trivial cases where order = 0. */ if (order == 0) { result_array[ii] = 0.0; 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 (kk=0; kk #include #include #include #include #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) + 1.0 / 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)); } gsl-doc-2.3/specfunc/bessel_zero.c0000664000175000017500000007020612616157443015266 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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)); } gsl-doc-2.3/specfunc/gsl_sf_debye.h0000664000175000017500000000437712616157443015412 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/result.c0000664000175000017500000000454112616157443014267 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include 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); */ } gsl-doc-2.3/specfunc/chebyshev.h0000664000175000017500000000227212616157443014735 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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; gsl-doc-2.3/specfunc/bessel_Kn.c0000664000175000017500000001467612616157443014670 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; kval = 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; jval = 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)); } gsl-doc-2.3/specfunc/sinint.c0000664000175000017500000002560712616157443014263 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/expint.c0000664000175000017500000003661312616157443014265 0ustar eddedd/* specfunc/expint.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "error.h" #include "check.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 = 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); } } static int expint_En_impl(const int n, const double x, gsl_sf_result * result, const int scale) { if (n < 0) { DOMAIN_ERROR(result); } else if (n == 0) { if (x == 0) { DOMAIN_ERROR(result); } else { result->val = (scale ? 1.0 : exp(-x)) / x; result->err = 2 * GSL_DBL_EPSILON * fabs(result->val); CHECK_UNDERFLOW(result); return GSL_SUCCESS; } } else if (n == 1) { return expint_E1_impl(x, result, scale); } else if (n == 2) { return expint_E2_impl(x, result, scale); } else { if(x < 0) { DOMAIN_ERROR(result); } if (x == 0) { result->val = (scale ? exp(x) : 1 ) * (1/(n-1.0)); result->err = 2 * GSL_DBL_EPSILON * fabs(result->val); CHECK_UNDERFLOW(result); return GSL_SUCCESS; } else { gsl_sf_result result_g; double prefactor = pow(x, n-1); int status = gsl_sf_gamma_inc_e (1-n, x, &result_g); double scale_factor = ( scale ? exp(x) : 1.0 ); result->val = scale_factor * prefactor * result_g.val; result->err = 2 * GSL_DBL_EPSILON * fabs(result->val); result->err += 2 * fabs(scale_factor * prefactor * result_g.err); if (status == GSL_SUCCESS) CHECK_UNDERFLOW(result); return status; } } } /*-*-*-*-*-*-*-*-*-*-*-* 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_En_e(const int n, const double x, gsl_sf_result * result) { return expint_En_impl(n, x, result, 0); } int gsl_sf_expint_En_scaled_e(const int n, const double x, gsl_sf_result * result) { return expint_En_impl(n, 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_En(const int n, const double x) { EVAL_RESULT(gsl_sf_expint_En_e(n, x, &result)); } double gsl_sf_expint_En_scaled(const int n, const double x) { EVAL_RESULT(gsl_sf_expint_En_scaled_e(n, 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)); } gsl-doc-2.3/specfunc/Makefile.in0000644000175000017500000012664013022372406014643 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_P.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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 \ ../poly/libgslpoly.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 legendre_source.c AM_CPPFLAGS = -I$(top_srcdir) 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_P.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 ../poly/libgslpoly.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu specfunc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspecfunc.la: $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_DEPENDENCIES) $(EXTRA_libgslspecfunc_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_der.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_zero.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atanint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_In.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Inu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jnu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Kn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Knu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Yn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Ynu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_amp_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_i.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_j.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_olver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_temme.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_y.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_zero.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta_inc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clausen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb_bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coupling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dawson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debye.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dilog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementary.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ellint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elljac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fermi_dirac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma_inc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gegenbauer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_0F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_1F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_U.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laguerre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lambert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_H3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_P.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_Qn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_con.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_poly.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_angfunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_charv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_coeff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_radfunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_workspace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/result.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sinint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synchrotron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_airy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bessel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_coulomb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dilog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gamma.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hyperg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_legendre.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mathieu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zeta.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/specfunc/ChangeLog0000664000175000017500000006521712616157443014366 0ustar eddedd2011-10-10 Rhys Ulerich * hyperg_U.c (gsl_sf_hyperg_U_int_e,gsl_sf_hyperg_U_e): Always initialize the gsl_sf_result_e10 instances. Thanks to Victor Zverovich for the bug report and patch. 2011-10-10 Brian Gough * coupling.c (gsl_sf_coupling_3j_e): compute 3j factors using logs to allow larger range 2011-09-20 Brian Gough * coupling.c (triangle_selection_fails): extend triangle selection to handle all permutations (gsl_sf_coupling_3j_e): special case for (ja jb jc; 0 0 0) = 0 when ja+jb+jc=odd 2011-08-10 Brian Gough * mathieu_radfunc.c (gsl_sf_mathieu_Mc): set odd functions to zero for order=0, initialise fn to zero before use 2011-07-21 Brian Gough * mathieu_angfunc.c (gsl_sf_mathieu_se_array): handle the case where q=0 2011-07-15 Brian Gough * trig.c (gsl_sf_lncosh_e): handle x symmetrically for middle region 2010-11-11 Brian Gough * ellint.c (gsl_sf_ellint_RC_e, gsl_sf_ellint_RD_e) (gsl_sf_ellint_RF_e, gsl_sf_ellint_RJ_e): introduce a limit of 10000 iterations to avoid infinite loops * bessel_Knu.c (gsl_sf_bessel_Knu_scaled_e10_e): alternative version of Knu_scaled function to allow greater range for gsl_sf_bessel_lnKnu_e. 2010-10-29 Brian Gough * hyperg_U.c (hyperg_U_small_a_bgt0): corrected result->err for case where a==0.0 2010-08-31 Brian Gough * beta_inc.c (gsl_sf_beta_inc_e): ignore underflow error when term is subtracted from 1 2010-08-27 Brian Gough * hyperg_2F1.c (gsl_sf_hyperg_2F1_e): use ap and bp consistently in large c and large b cases, previously mixed a,b and ap,bp. 2010-04-15 Brian Gough * atanint.c (gsl_sf_atanint_e): added missing term 1/ax for large x 2010-02-25 Brian Gough * hyperg_U.c (hyperg_U_negx): handle the case where x<0 2010-01-23 Brian Gough * hyperg_1F1.c (gsl_sf_hyperg_1F1_e): use Kummer transformation for larger range of x when b>a and a<0 2009-07-17 Brian Gough * hyperg_U.c (hyperg_U_series): use a rearrangement of the factor in front of the series to avoid incorrect termination when the the leading term is zero. 2009-07-16 Brian Gough * poch.c (gsl_sf_lnpoch_sgn_e): handle negative and zero values of a, e.g. where gamma(a) and/or gamma(a+x) is infinite (gsl_sf_poch_e): handle the case where lnpoch_sgn returns GSL_NEGINF when the Pochhammer ratio is zero. * test_gamma.c (test_gamma): added tests for poch(a,x) with negative arguments 2009-07-12 Brian Gough * hyperg_U.c (hyperg_U_int_bge1): avoid using the series when 1+a-b is zero or a negative integer. 2009-07-11 Brian Gough * hyperg_U.c (gsl_sf_hyperg_U_int_e10_e, gsl_sf_hyperg_U_e10_e) (hyperg_U_origin, hyperg_U_int_origin): added special case for U(a,b,z=0). 2009-07-09 Brian Gough * mathieu_workspace.c (gsl_sf_mathieu_free): handle NULL argument in free 2009-05-13 Brian Gough * hyperg_2F1.c (gsl_sf_hyperg_2F1_e): fix condition on a and b when c is a negative integer (either a or b must cause cancellation of the series) 2009-01-14 Brian Gough * mathieu_workspace.c (gsl_sf_mathieu_alloc): increase number of terms * mathieu_charv.c (gsl_sf_mathieu_a): increase number of terms (gsl_sf_mathieu_b): increase number of terms 2008-12-04 Brian Gough * gamma_inc.c (gamma_inc_D): propagate cancellation error in (x-a)/x for x close to a 2008-12-03 Brian Gough * exp.c (exprel_n_CF): changed N to double, to allow non-integer usage for gamma_inc, double error factor to allow for two parameters in recurrence. (gsl_sf_exprel_n_CF_e): exported function to allow calls to exprel_n_CF * gamma_inc.c (gamma_inc_P_series): improved convergence condition using estimate of the remainder of the series, added continued fraction as a fallback, increased nmax to 10000 2008-08-26 Brian Gough * ellint.c (gsl_sf_ellint_Kcomp_e): corrected taylor expansion for k close to 1. 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-06-27 Brian Gough * legendre_poly.c (gsl_sf_legendre_array_size): removed inline version of this function in gsl_sf_legendre.h 2008-03-17 Brian Gough * hyperg_2F1.c (gsl_sf_hyperg_2F1_e): replace duplicate error check on stat3 by stat4 2008-03-15 Brian Gough * bessel.c (gsl_sf_bessel_Jnu_asympx_e): use full asymptotic series 2008-03-14 Brian Gough * bessel_j.c (gsl_sf_bessel_jl_e): increase error estimate by factor of 2 2008-02-09 Brian Gough * exp.c (gsl_sf_exp_e10_e): only use exponent e10 when standard exp() is out of range (gsl_sf_exp_mult_e10_e): add full set of error terms 2008-01-10 Brian Gough * hyperg_2F1.c (gsl_sf_hyperg_2F1_e): handle case of x==1 2007-10-25 Brian Gough * bessel.c (gsl_sf_bessel_J_CF1): handle underflow by rescaling in recurrence 2007-09-13 Brian Gough * ellint.c (gsl_sf_ellint_Pcomp_e): remove test for n <1, no restriction needed 2007-09-10 Brian Gough * expint.c (gsl_sf_expint_En_e): added for support En(x) (gsl_sf_expint_En_scaled_e): added for support En(x) scaled * gamma_inc.c (gamma_inc_CF): include finite precision of log term 2007-08-30 Brian Gough * psi.c (psi_complex_rhp): accumulate error, to allow for cancellation effects * beta.c (gsl_sf_lnbeta_sgn_e): added missing factor of 2 for error. 2007-08-27 Brian Gough * beta_inc.c (gsl_sf_beta_inc_e): handle cases where a<=0 or b<=0 2007-04-27 Brian Gough * lambert.c (halley_iteration): increase tolerance to prevent exceeding max iters due to finite precision 2007-04-04 Brian Gough * laguerre.c (gsl_sf_laguerre_n_e): use recursion for a=0 in addition to a>0 2007-02-17 Brian Gough * 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 * mathieu_charv.c: made solve_cubic static 2007-02-12 Brian Gough * 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 * 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 * 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 * test_legendre.c (test_legendre): added extra test cases for underflow 2007-01-26 Brian Gough * 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 * 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 * laguerre.c (laguerre_large_n): use the second term in the asymptotic expansion from Slater, p.73. 2007-01-17 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * fermi_dirac.c (fd_neg): initialize s to zero (avoid spurious warning from compiler) 2006-02-23 Brian Gough * 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 * 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 * 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 * debye.c (gsl_sf_debye_5_e, gsl_sf_debye_6_e): added n=5,6 (R. J. Mathar) 2005-11-15 Brian Gough * dilog.c (dilog_xge0): fix calculation of error estimate 2005-08-04 Brian Gough * coulomb.c (gsl_sf_coulomb_wave_sphF_array): fix warning about variable shadowing for k 2005-07-29 Brian Gough * 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 * 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 * 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 * 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 * test_sf.c (test_jac): added tests over the full period for elljac functions 2005-05-23 Brian Gough * 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 * 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 * 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 * 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 * gsl_sf_coupling.h: fixed declaration to gsl_sf_coupling_6j_INCORRECT instead of gsl_sf_coupling_INCORRECT_6j 2004-11-12 Brian Gough * psi.c (gsl_sf_psi_1): added missing function definition gsl_sf_psi_1 2004-10-11 Brian Gough * expint.c (gsl_sf_expint_Ei_scaled): fixed call to incorrect function gsl_sf_expint_Ei_e 2004-06-03 Brian Gough * psi.c (psi_n_xg0): added missing return type int 2003-11-30 Brian Gough * gsl_sf_log.h: added missing headers for inline functions 2003-08-11 Brian Gough * 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 * 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 * 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 * test_sf.c (test_coupling): added some regression tests for coupling functions 2003-06-02 Brian Gough * gamma_inc.c (gamma_inc_D): handle x10 as a special case 2003-04-18 Brian Gough * gamma.c (gsl_sf_gammainv_e): handle any singularities in gamma(x) up front and return zero directly 2003-04-12 Brian Gough * 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 * gsl_sf_legendre.h: added missing const to formal parameter on gsl_sf_legendre_sphPlm_deriv_array 2003-01-25 Brian Gough * 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 * 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 * test_legendre.c (test_legendre): increased tolerance on test Sat Jul 13 23:11:37 2002 Brian Gough * 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 * test_bessel.c (test_bessel): increased tolerance on test of bessel_Jn_array Tue May 28 21:04:29 2002 Brian Gough * 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 * 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 * 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 * test_airy.c (test_airy): increased tolerance on test Tue Jan 8 14:31:04 2002 Brian Gough * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * erfc.c (gsl_sf_erfc_e): corrected case of -10 * eval.h (EVAL_DOUBLE): avoid returning the status value as a numerical result 2001-06-28 Brian Gough * 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 * 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 * gsl_sf_gamma.h: added const to prototype, to match function definition Sun May 6 13:01:01 2001 Brian Gough * 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 * 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 * trig.c (gsl_sf_polar_to_rect): dropped _e from polar/rect conversion functions Tue Apr 24 17:05:22 2001 Brian Gough * 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 * 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 * 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 for pointing this out). 1999-01-02 Mark Galassi * 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 * Makefile.am (include_HEADERS): added gsl_sf_result.h 1998-12-05 Mark Galassi * 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 * added #include 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 * 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 * bessel_amp_phase.h: undefined consts are now declared extern Mon Jul 13 12:40:27 1998 Brian Gough * 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 * 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 * 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 * 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 gsl-doc-2.3/specfunc/lambert.c0000664000175000017500000001404012616157443014372 0ustar eddedd/* specfunc/lambert.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include /* 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 0) { t = (t/p)/e; /* Newton iteration */ } else { t /= e*p - 0.5*(p + 1.0)*t/p; /* Halley iteration */ }; w -= t; tol = 10 * 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)); } gsl-doc-2.3/specfunc/test_mathieu.c0000664000175000017500000002362212616157443015445 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include "test_sf.h" #define NVAL 100 static double c[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_e, (0, 0.0, 0.0, &r), 0.7071067811865475, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 0.0, M_PI_2, &r), 0.7071067811865475, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 5.0, 0.0, &r), 0.04480018165188902, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 5.0, M_PI_2, &r), 1.334848674698019, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 10.0, 0.0, &r), 0.007626517570935782, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 10.0, M_PI_2, &r), 1.468660470712856, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 15.0, 0.0, &r), 0.001932508315204592, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 15.0, M_PI_2, &r), 1.550108146686649, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 20.0, 0.0, &r), 0.0006037438292242197, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 20.0, M_PI_2, &r), 1.609890857395926, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 25.0, 0.0, &r), 0.0002158630184146612, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (0, 25.0, M_PI_2, &r), 1.657510298323475, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 0.0, 0.0, &r), 1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 5.0, 0.0, &r), 0.2565428793223637, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 10.0, 0.0, &r), 0.05359874774717657, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 15.0, 0.0, &r), 0.01504006645382623, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 20.0, 0.0, &r), 0.005051813764712904, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (1, 25.0, 0.0, &r), 0.001911051506657645, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 0.0, M_PI_2, &r), 1.0000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 5.0, M_PI_2, &r), 1.337433887022345, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 10.0, M_PI_2, &r), 1.468755664102938, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 15.0, M_PI_2, &r), 1.550115074357552, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 20.0, M_PI_2, &r), 1.609891592603772, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (1, 25.0, M_PI_2, &r), 1.657510398374516, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 0.0, 0.0, &r), 1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 0.0, M_PI_2, &r), -1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 5.0, 0.0, &r), 0.7352943084006845, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 5.0, M_PI_2, &r), -0.7244881519676682, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 10.0, 0.0, &r), 0.2458883492913189, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 10.0, M_PI_2, &r), -0.9267592641263211, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 15.0, 0.0, &r), 0.07879282784639313, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 15.0, M_PI_2, &r), -1.019966226030262, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 20.0, 0.0, &r), 0.02864894314707431, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 20.0, M_PI_2, &r), -1.075293228779687, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 25.0, 0.0, &r), 0.0115128663308875, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (2, 25.0, M_PI_2, &r), -1.116278953295253, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 0.0, 0.0, &r), 1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 5.0, 0.0, &r), 1.12480725063848, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 10.0, 0.0, &r), 1.258019941308287, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 15.0, 0.0, &r), 1.193432230413072, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 20.0, 0.0, &r), 0.9365755314226215, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (5, 25.0, 0.0, &r), 0.6106943100506986, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 0.0, M_PI_2, &r), 1.0000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 5.0, M_PI_2, &r), 0.9060779302023551, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 10.0, M_PI_2, &r), 0.8460384335355106, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 15.0, M_PI_2, &r), 0.837949340012484, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 20.0, M_PI_2, &r), 0.8635431218533667, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (5, 25.0, M_PI_2, &r), 0.8992683245108413, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 0.0, 0.0, &r), 1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 0.0, M_PI_2, &r), -1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 5.0, 0.0, &r), 1.025995027089438, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 5.0, M_PI_2, &r), -0.975347487235964, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 10.0, 0.0, &r), 1.053815992100935, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 10.0, M_PI_2, &r), -0.9516453181789554, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 15.0, 0.0, &r), 1.084106311839221, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 15.0, M_PI_2, &r), -0.9285480638845388, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 20.0, 0.0, &r), 1.117788631259397, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 20.0, M_PI_2, &r), -0.9057107845940974, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 25.0, 0.0, &r), 1.156239918632239, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (10, 25.0, M_PI_2, &r), -0.8826919105636903, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 0.0, 0.0, &r), 1.00000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 5.0, 0.0, &r), 1.011293732529566, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 10.0, 0.0, &r), 1.022878282438181, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 15.0, 0.0, &r), 1.034793652236873, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 20.0, 0.0, &r), 1.047084344162887, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_ce_e, (15, 25.0, 0.0, &r), 1.059800441813937, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (15, 0.0, M_PI_2, &r), -1.0000000, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (15, 5.0, M_PI_2, &r), -0.9889607027406357, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (15, 10.0, M_PI_2, &r), -0.9781423471832157, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (15, 15.0, M_PI_2, &r), -0.9675137031854538, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (15, 20.0, M_PI_2, &r), -0.9570452540612817, TEST_SNGL, GSL_SUCCESS); TEST_SF(s, gsl_sf_mathieu_se_e, (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; } gsl-doc-2.3/specfunc/gsl_sf_fermi_dirac.h0000664000175000017500000000652512616157443016563 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/dawson.c0000664000175000017500000002343412616157443014246 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/ellint.c0000664000175000017500000004666412616157443014254 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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]; const int nmax = 10000; 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; int n = 0; 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; n++; if(n==nmax) { MAXITER_ERROR (result); } } 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); const int nmax = 10000; 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; int n = 0; 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; n++; if(n==nmax) { MAXITER_ERROR (result); } } 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]; const int nmax = 10000; 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; int n = 0; 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; n++; if(n==nmax) { MAXITER_ERROR (result); } } 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); const int nmax = 10000; 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; int n = 0; 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; n++; if(n==nmax) { MAXITER_ERROR (result); } } 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 += fabs(sin_phi * rf.err); result->err += n/3.0 * GSL_DBL_EPSILON * fabs(sin3_phi*rj.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, 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.34] */ 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 * (fabs(result->val) + fabs(k/y)); 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.3) phi=pi/2] */ int gsl_sf_ellint_Pcomp_e(double k, double n, gsl_mode_t mode, gsl_sf_result * result) { if(k*k >= 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, gsl_mode_t mode) { EVAL_RESULT(gsl_sf_ellint_D_e(phi, k, 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)); } gsl-doc-2.3/specfunc/fermi_dirac.c0000664000175000017500000010316012616157443015212 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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 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 ? 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)); } gsl-doc-2.3/specfunc/airy_der.c0000664000175000017500000006177612757623464014573 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; 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); 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)); } gsl-doc-2.3/specfunc/gsl_sf_synchrotron.h0000664000175000017500000000327312616157443016704 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/pow_int.c0000664000175000017500000000357212616157443014433 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include /*-*-*-*-*-*-*-*-*-*-*-* 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)); } gsl-doc-2.3/specfunc/error.h0000664000175000017500000000366112616157443014111 0ustar eddedd#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) #define MAXITER_ERROR(result) do { (result)->val = GSL_NAN; (result)->err = GSL_NAN; GSL_ERROR ("too many iterations error", GSL_EMAXITER); } while(0) gsl-doc-2.3/specfunc/beta.c0000664000175000017500000001151212616157443013660 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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 += 2.0 * 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)); } gsl-doc-2.3/specfunc/gsl_sf_laguerre.h0000664000175000017500000000372012616157443016117 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/elementary.c0000664000175000017500000000463512616157443015122 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_Y0.c0000664000175000017500000000704212616157443014575 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/coulomb.c0000664000175000017500000011501712616157443014412 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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 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; } } gsl-doc-2.3/specfunc/gsl_sf_gamma.h0000664000175000017500000001710612616157443015376 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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_EOVRFLW */ 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_EOVRFLW */ 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__ */ gsl-doc-2.3/specfunc/bessel_olver.h0000664000175000017500000000223612616157443015441 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 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_ */ gsl-doc-2.3/specfunc/bessel_sequence.c0000664000175000017500000001026312616157443016114 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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 #include #include #include #include #include #include #include #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; ellval = 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)); } gsl-doc-2.3/specfunc/mathieu_workspace.c0000664000175000017500000001336112616157443016463 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include #include 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; extra_values += 20; /* additional fudge */ 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) { RETURN_IF_NULL (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); } gsl-doc-2.3/specfunc/mathieu_coeff.c0000664000175000017500000002045712616157443015553 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include /***************************************************************************** * 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 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) return GSL_FAILURE; /* Handle the trivial case where q = 0. */ if (qq == 0.0) { for (ii=0; ii #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__ */ gsl-doc-2.3/specfunc/gsl_sf_zeta.h0000664000175000017500000000551612616157443015261 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/legendre_source.c0000664000175000017500000004277312757623714016134 0ustar eddedd/* legendre_source.c * * Copyright (C) 2009-2013 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. */ /* define various macros for functions below */ #define CONCAT2x(a,b) a ## _ ## b #define CONCAT3x(a,b,c) a ## _ ## b ## _ ## c #if defined(LEGENDRE) #define FUNCTION(dir,name) CONCAT2x(dir,name) #define OUTPUT result_array #define OUTPUT_ARG double result_array[] #elif defined(LEGENDRE_DERIV) #define FUNCTION(dir,name) CONCAT3x(dir,deriv,name) #define OUTPUT result_array, result_deriv_array #define OUTPUT_ARG double result_array[], double result_deriv_array[] #elif defined(LEGENDRE_DERIV_ALT) #define FUNCTION(dir,name) CONCAT3x(dir,deriv_alt,name) #define OUTPUT result_array, result_deriv_array #define OUTPUT_ARG double result_array[], double result_deriv_array[] #define LEGENDRE_DERIV #elif defined(LEGENDRE_DERIV2) #define FUNCTION(dir,name) CONCAT3x(dir,deriv2,name) #define OUTPUT result_array, result_deriv_array, result_deriv2_array #define OUTPUT_ARG double result_array[], double result_deriv_array[], double result_deriv2_array[] #define LEGENDRE_DERIV #elif defined(LEGENDRE_DERIV2_ALT) #define FUNCTION(dir,name) CONCAT3x(dir,deriv2_alt,name) #define OUTPUT result_array, result_deriv_array, result_deriv2_array #define OUTPUT_ARG double result_array[], double result_deriv_array[], double result_deriv2_array[] #define LEGENDRE_DERIV #define LEGENDRE_DERIV2 #define LEGENDRE_DERIV_ALT #endif static int FUNCTION (legendre, array_schmidt_e) (const size_t lmax, const double x, const double csphase, OUTPUT_ARG); static int FUNCTION(legendre, array_none_e) (const size_t lmax, const double x, const double csphase, OUTPUT_ARG); /* gsl_sf_legendre_array() Inputs: norm - normlization type lmax - maximum degree x - input argument result_array - (output) normalized P_{lm} result_deriv_array - (output) normalized P'_{lm} result_deriv2_array - (output) normalized P''_{lm} */ int FUNCTION (gsl_sf_legendre, array) (const gsl_sf_legendre_t norm, const size_t lmax, const double x, OUTPUT_ARG) { int s = FUNCTION (gsl_sf_legendre, array_e)(norm, lmax, x, 1.0, OUTPUT); return s; } /* gsl_sf_legendre_array_e() Inputs: norm - normlization type lmax - maximum degree x - input argument csphase - Condon-Shortley phase result_array - (output) normalized P_{lm} result_deriv_array - (output) normalized P'_{lm} result_deriv2_array - (output) normalized P''_{lm} */ int FUNCTION (gsl_sf_legendre, array_e) (const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, OUTPUT_ARG) { int s; const size_t nlm = gsl_sf_legendre_nlm(lmax); #if !defined(LEGENDRE_DERIV_ALT) size_t i; #if defined(LEGENDRE_DERIV) || defined(LEGENDRE_DERIV2) const double u = sqrt((1.0 - x) * (1.0 + x)); const double uinv = 1.0 / u; #endif #if defined(LEGENDRE_DERIV2) const double uinv2 = uinv * uinv; #endif #endif double fac1 = 0.0, fac2 = 0.0; /* normalization factors */ if (norm == GSL_SF_LEGENDRE_NONE) { /* compute P_{lm}(x) */ s = FUNCTION(legendre,array_none_e)(lmax, x, csphase, OUTPUT); } else { /* compute S_{lm}(x) */ s = FUNCTION(legendre,array_schmidt_e)(lmax, x, csphase, OUTPUT); } #if !defined(LEGENDRE_DERIV_ALT) /* scale derivative arrays to recover P'(x) and P''(x) */ for (i = 0; i < nlm; ++i) { #if defined(LEGENDRE_DERIV2) double dp = result_deriv_array[i]; double d2p = result_deriv2_array[i]; result_deriv2_array[i] = (d2p - x * uinv * dp) * uinv2; #endif #if defined(LEGENDRE_DERIV) result_deriv_array[i] *= -uinv; #endif } #endif /* apply scaling for requested normalization */ if (norm == GSL_SF_LEGENDRE_SCHMIDT || norm == GSL_SF_LEGENDRE_NONE) { return s; } else if (norm == GSL_SF_LEGENDRE_SPHARM) { fac1 = 1.0 / sqrt(4.0 * M_PI); fac2 = 1.0 / sqrt(8.0 * M_PI); } else if (norm == GSL_SF_LEGENDRE_FULL) { fac1 = 1.0 / sqrt(2.0); fac2 = 1.0 / sqrt(4.0); } /* * common code for different normalizations * P_{l0} = fac1 * sqrt(2l + 1) * S_{l0} * P_{lm} = fac2 * sqrt(2l + 1) * S_{lm}, m > 0 */ { size_t l, m; size_t twoellp1 = 1; /* 2l + 1 */ double *sqrts = &(result_array[nlm]); for (l = 0; l <= lmax; ++l) { result_array[gsl_sf_legendre_array_index(l, 0)] *= sqrts[twoellp1] * fac1; #if defined(LEGENDRE_DERIV) result_deriv_array[gsl_sf_legendre_array_index(l, 0)] *= sqrts[twoellp1] * fac1; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[gsl_sf_legendre_array_index(l, 0)] *= sqrts[twoellp1] * fac1; #endif for (m = 1; m <= l; ++m) { result_array[gsl_sf_legendre_array_index(l, m)] *= sqrts[twoellp1] * fac2; #if defined(LEGENDRE_DERIV) result_deriv_array[gsl_sf_legendre_array_index(l, m)] *= sqrts[twoellp1] * fac2; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[gsl_sf_legendre_array_index(l, m)] *= sqrts[twoellp1] * fac2; #endif } twoellp1 += 2; } } return s; } /* legendre,array_schmidt_e() This routine computes Schmidt semi-normalized associated Legendre polynomials and their first and second derivatives. Inputs: lmax - maximum order x - legendre argument in [-1,1] csphase - -1.0 to include CS phase (-1)^m, 1.0 to not include result_array - (output) where to store P_{lm}(x) values result_deriv_array - (output) where to store d/dtheta P_{lm}(x) values result_deriv2_array - (output) where to store d^2/dtheta^2 P_{lm}(x) values */ static int FUNCTION(legendre, array_schmidt_e) (const size_t lmax, const double x, const double csphase, OUTPUT_ARG) { if (x > 1.0 || x < -1.0) { GSL_ERROR("x is outside [-1,1]", GSL_EDOM); } #if defined(LEGENDRE_DERIV) || defined(LEGENDRE_DERIV2) else if (fabs(x) == 1.0) { GSL_ERROR("x cannot equal 1 or -1 for derivative computation", GSL_EDOM); } #endif else if (csphase != 1.0 && csphase != -1.0) { GSL_ERROR("csphase has invalid value", GSL_EDOM); } else { const double eps = 1.0e-280; const double u = sqrt((1.0 - x) * (1.0 + x)); /* sin(theta) */ #if defined(LEGENDRE_DERIV) const double uinv = 1.0 / u; #endif #if defined(LEGENDRE_DERIV2) const double uinv2 = 1.0 / u / u; #endif #if defined(LEGENDRE_DERIV) || defined(LEGENDRE_DERIV2) const double xbyu = x * uinv; /* x / u */ #endif size_t l, m; size_t k, idxmm; double plm, /* eps * S(l,m) / u^m */ pmm; /* eps * S(m,m) / u^m */ double rescalem; double pm1, /* S(l-1,m) */ pm2; /* S(l-2,m) */ size_t nlm = gsl_sf_legendre_nlm(lmax); double *sqrts = &(result_array[nlm]); /* precompute square root factors for recurrence */ legendre_sqrts(lmax, sqrts); /* initial values S(0,0) and S(1,0) */ pm2 = 1.0; /* S(0,0) */ pm1 = x; /* S(1,0) */ result_array[0] = pm2; #if defined(LEGENDRE_DERIV) result_deriv_array[0] = 0.0; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[0] = 0.0; #endif if (lmax == 0) return GSL_SUCCESS; result_array[1] = pm1; #if defined(LEGENDRE_DERIV) result_deriv_array[1] = -u; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[1] = -x; #endif /* Compute S(l,0) for l=2..lmax, no scaling required */ k = 1; /* idx(1,0) */ for (l = 2; l <= lmax; ++l) { double linv = 1.0 / (double)l; k += l; /* idx(l,m) = idx(l-1,m) + l */ plm = (2.0 - linv) * x * pm1 - (1.0 - linv) * pm2; result_array[k] = plm; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = uinv * l * (x * plm - pm1); #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = -(double) l * (l + 1.0) * plm - xbyu * result_deriv_array[k]; #endif pm2 = pm1; pm1 = plm; } /* Compute S(m,m), S(m+1,m) and S(l,m) */ /* * pi_m = Prod_{i=2}^m sqrt[ (2m - 1) / (2m) ] * but pi_1 = 1.0, so initialize to sqrt(2) so that * the first m = 1 iteration of the loop will reset it * to 1.0. Starting with m = 2 it will begin accumulating * the correct terms. * * pmm = S(m,m) * eps / u^m = pi_m */ pmm = sqrt(2.0) * eps; rescalem = 1.0 / eps; idxmm = 0; /* tracks idx(m,m), initialize to idx(0,0) */ for (m = 1; m < lmax; ++m) { /* rescalem = u^m / eps */ rescalem *= u; /* * compute: * S(m,m) = u * sqrt((2m - 1) / (2m)) S(m-1,m-1) = u^m * pi_m * d_t S(m,m) = m * x / u * S(m,m) */ idxmm += m + 1; /* idx(m,m) = idx(m-1,m-1) + m + 1 */ pmm *= csphase * sqrts[2 * m - 1] / sqrts[2 * m]; /* S(m,m) * eps / u^m */ result_array[idxmm] = pmm * rescalem; #if defined(LEGENDRE_DERIV) result_deriv_array[idxmm] = m * xbyu * result_array[idxmm]; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[idxmm] = m * (uinv2 * m - (m + 1.0)) * result_array[idxmm] - xbyu * result_deriv_array[idxmm]; #endif pm2 = pmm; /* * compute: * S(m+1,m) = sqrt(2 * m + 1) * x * S(m,m) * d_t S(m+1,m) = 1/u * ((m+1)*x*S(m+1,m) - sqrt(2*m+1)*S(m,m)) */ k = idxmm + m + 1; /* idx(m+1,m) = idx(m,m) + m + 1 */ pm1 = x * sqrts[2 * m + 1] * pm2; result_array[k] = pm1 * rescalem; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = uinv * ((m + 1.0) * x * result_array[k] - sqrts[2 * m + 1] * result_array[idxmm]); #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = (m * m * uinv2 - (m + 1.0) * (m + 2.0)) * result_array[k] - xbyu * result_deriv_array[k]; #endif /* compute S(l,m) for l=m+2...lmax */ for (l = m + 2; l <= lmax; ++l) { k += l; /* idx(l,m) = idx(l-1,m) + l */ plm = (2*l - 1) / sqrts[l + m] / sqrts[l - m] * x * pm1 - sqrts[l - m - 1] * sqrts[l + m - 1] / sqrts[l + m] / sqrts[l - m] * pm2; result_array[k] = plm * rescalem; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = uinv * (l * x * result_array[k] - sqrts[l + m] * sqrts[l - m] * result_array[k - l]); #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = (m * m * uinv2 - l * (l + 1.0)) * result_array[k] - xbyu * result_deriv_array[k]; #endif pm2 = pm1; pm1 = plm; } } /* for (m = 1; m < lmax; ++m) */ /* compute S(lmax,lmax) */ rescalem *= u; idxmm += m + 1; /* idx(lmax,lmax) */ pmm *= csphase * sqrts[2 * lmax - 1] / sqrts[2 * lmax]; result_array[idxmm] = pmm * rescalem; #if defined(LEGENDRE_DERIV) result_deriv_array[idxmm] = lmax * xbyu * result_array[idxmm]; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[idxmm] = lmax * (uinv2 * lmax - (lmax + 1.0)) * result_array[idxmm] - xbyu * result_deriv_array[idxmm]; #endif return GSL_SUCCESS; } } /* legendre_array_none_e() This routine computes unnormalized associated Legendre polynomials and their derivatives. Inputs: lmax - maximum order x - legendre argument in [-1,1] csphase - -1.0 to include CS phase (-1)^m, 1.0 to not include result_array - (output) where to store P_{lm}(x) values result_deriv_array - (output) where to store d/dtheta P_{lm}(x) values result_deriv2_array - (output) where to store d^2/dtheta^2 P_{lm}(x) values */ static int FUNCTION(legendre, array_none_e) (const size_t lmax, const double x, const double csphase, OUTPUT_ARG) { if (x > 1.0 || x < -1.0) { GSL_ERROR("x is outside [-1,1]", GSL_EDOM); } #if defined(LEGENDRE_DERIV) || defined(LEGENDRE_DERIV2) else if (fabs(x) == 1.0) { GSL_ERROR("x cannot equal 1 or -1 for derivative computation", GSL_EDOM); } #endif else if (csphase != 1.0 && csphase != -1.0) { GSL_ERROR("csphase has invalid value", GSL_EDOM); } else { const double u = sqrt((1.0 - x) * (1.0 + x)); /* sin(theta) */ #if defined(LEGENDRE_DERIV) const double uinv = 1.0 / u; #endif #if defined(LEGENDRE_DERIV2) const double uinv2 = 1.0 / u / u; #endif #if defined(LEGENDRE_DERIV) || defined(LEGENDRE_DERIV2) const double xbyu = x * uinv; /* x / u */ #endif size_t l, m; size_t k, idxmm; double plm, pmm; double pm1, /* P(l-1,m) */ pm2; /* P(l-2,m) */ double twomm1; /* 2*m - 1 */ /* initial values P(0,0) and P(1,0) */ pm2 = 1.0; /* P(0,0) */ pm1 = x; /* P(1,0) */ result_array[0] = pm2; #if defined(LEGENDRE_DERIV) result_deriv_array[0] = 0.0; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[0] = 0.0; #endif if (lmax == 0) return 0; result_array[1] = pm1; #if defined(LEGENDRE_DERIV) result_deriv_array[1] = -u; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[1] = -x; #endif /* Compute P(l,0) */ k = 1; for (l = 2; l <= lmax; ++l) { k += l; plm = ((2*l - 1) * x * pm1 - (l - 1) * pm2) / (double) l; result_array[k] = plm; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = -(double)l * (pm1 - x * plm) * uinv; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = -(double) l * (l + 1.0) * plm - xbyu * result_deriv_array[k]; #endif pm2 = pm1; pm1 = plm; } /* Compute P(m,m), P(m+1,m) and P(l,m) */ pmm = 1.0; twomm1 = -1.0; /* 2 * m - 1 */ idxmm = 0; /* tracks idx(m,m), initialize to idx(0,0) */ for (m = 1; m <= lmax - 1; ++m) { /* * compute * * P(m,m) = u * (2m - 1) P(m-1,m-1) * and * dP(m,m)/dtheta = m * x * P(m,m) / u */ idxmm += m + 1; twomm1 += 2.0; pmm *= csphase * u * twomm1; result_array[idxmm] = pmm; #if defined(LEGENDRE_DERIV) result_deriv_array[idxmm] = m * xbyu * pmm; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[idxmm] = m * (uinv2 * m - (m + 1.0)) * result_array[idxmm] - xbyu * result_deriv_array[idxmm]; #endif pm2 = pmm; /* * compute * * P(m+1,m) = (2 * m + 1) * x * P(m,m) * and * dP(m+1,m)/dt = -[(2*m + 1) * P(m,m) - (m+1) * x * P(m+1,m)]/u */ k = idxmm + m + 1; pm1 = x * pmm * (2*m + 1); result_array[k] = pm1; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = -uinv * ((2*m + 1) * pmm - (m + 1) * x * pm1); #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = (m * m * uinv2 - (m + 1.0) * (m + 2.0)) * result_array[k] - xbyu * result_deriv_array[k]; #endif /* compute P(l,m) */ for (l = m + 2; l <= lmax; ++l) { k += l; plm = ((2*l - 1) * x * pm1 - (l + m - 1) * pm2) / (double) (l - m); result_array[k] = plm; #if defined(LEGENDRE_DERIV) result_deriv_array[k] = -uinv * ((l + m) * pm1 - l * x * plm); #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[k] = (m * m * uinv2 - l * (l + 1.0)) * result_array[k] - xbyu * result_deriv_array[k]; #endif pm2 = pm1; pm1 = plm; } } /* for (m = 1; m <= lmax - 1; ++m) */ /* compute P(lmax,lmax) */ idxmm += m + 1; twomm1 += 2.0; pmm *= csphase * u * twomm1; result_array[idxmm] = pmm; #if defined(LEGENDRE_DERIV) result_deriv_array[idxmm] = lmax * x * pmm * uinv; #endif #if defined(LEGENDRE_DERIV2) result_deriv2_array[idxmm] = lmax * (uinv2 * lmax - (lmax + 1.0)) * result_array[idxmm] - xbyu * result_deriv_array[idxmm]; #endif return GSL_SUCCESS; } } /* legendre_array_none_e() */ #undef FUNCTION #undef CONCAT2x #undef CONCAT3x #undef OUTPUT #undef OUTPUT_ARG #undef LEGENDRE_DERIV #undef LEGENDRE_DERIV2 #undef LEGENDRE_DERIV_ALT gsl-doc-2.3/specfunc/airy_zero.c0000664000175000017500000003250612616157443014756 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include "error.h" static const double zero_Ai[] = { 0, -2.3381074104597670385, -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)); } gsl-doc-2.3/specfunc/airy.c0000664000175000017500000005577212616157443013731 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/specfunc/laguerre.c0000664000175000017500000002335012616157443014556 0ustar eddedd/* specfunc/laguerre.c * * Copyright (C) 2007 Brian Gough * 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; kval = 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)); } gsl-doc-2.3/specfunc/gamma.c0000664000175000017500000016652512616157443014046 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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), -1val = (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 ("x too large to extract fraction part", 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)); } gsl-doc-2.3/specfunc/gsl_sf_trig.h0000664000175000017500000000756512616157443015271 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/bessel_amp_phase.h0000664000175000017500000000276712616157443016260 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_ */ gsl-doc-2.3/specfunc/dilog.c0000664000175000017500000004320412616157443014046 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include /* 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; kval = 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(; kval = 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; kval = 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; kval = 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)); } gsl-doc-2.3/specfunc/test_bessel.c0000644000175000017500000012407612736044021015257 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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), 0.00556597490495494615709982972, TEST_TOL4, GSL_SUCCESS); #endif /* Testcase demonstrating long calculation time: Time spent in gsl_sf_bessel_J_CF1 for large x<1000 and n<5 grows in proportion to x Jonny Taylor */ TEST_SF(s, gsl_sf_bessel_Jn_e, (45, 900.0, &r), 0.02562434700634278108, TEST_TOL0, GSL_SUCCESS); 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, (1.95, &r), 0.8513330938802157074894, 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, (6.0, &r), 0.50186313086214003217346, 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, (1.95, &r), 1.050086915104152747182, 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, (6.0, &r), 0.5421759102771335382849, 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, (1.95, &r), 0.1211226255426818887894, 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, (1.95, &r), 0.1494001409315894276793, 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); #ifdef FIXME TEST_SF(s, gsl_sf_bessel_j0_e, (1048576.0, &r), 3.1518281938718287624e-07, TEST_TOL2, GSL_SUCCESS); #endif /* these values are from Mathematica */ #ifdef FIXME TEST_SF(s, gsl_sf_bessel_j0_e, (1.0e18, &r), -9.9296932074040507620955e-19, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j0_e, (1.0e20, &r), -6.4525128526578084420581e-21, TEST_TOL0, GSL_SUCCESS); #endif 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_j1_e, (1.0e18, &r), -1.183719902187107336049e-19, 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); /* Bug reported by Koichi Takahashi , computed from Pari besseljh(n,x) and AS 10.1.1 */ TEST_SF(s, gsl_sf_bessel_jl_e, (30, 3878.62, &r), -0.00023285567034330878410434732790, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_jl_e, (49, 9912.63, &r), 5.2043354544842669214485107019E-5 , TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_jl_e, (49, 9950.35, &r), 5.0077368819565969286578715503E-5 , TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_jl_e, (52, 9930.51, &r), -7.4838588266727718650124475651E-6 , TEST_TOL4, GSL_SUCCESS); /* bug report #37209 */ TEST_SF(s, gsl_sf_bessel_jl_e, (364, 36.62, &r), 1.118907148986954E-318, TEST_TOL0, GSL_SUCCESS); /*TEST_SF(s, gsl_sf_bessel_jl_e, (149, 1.0, &r), 2.6599182755508469E-307, TEST_TOL0, 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); /* [bug #31528] gsl_sf_bessel_lnKnu overflows for large nu */ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (180.0, 2.2, &r), 735.1994170369583930752590258, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_lnKnu_e, (3500.5, 1500.0, &r), 1731.220077116482710070986699, TEST_TOL1, 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; } gsl-doc-2.3/specfunc/legendre_con.c0000664000175000017500000012450112616157443015374 0ustar eddedd/* specfunc/legendre_con.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include #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; kval = 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 GSL_ERROR_SELECT_2(stat_K, stat_E); } } 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 GSL_ERROR_SELECT_2(stat_K, stat_E); } } } 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; ellval = 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; kval = 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)); } gsl-doc-2.3/specfunc/hyperg_0F1.c0000664000175000017500000001200112616157443014643 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_Jnu.c0000664000175000017500000001213212616157443015035 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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; nval = 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)); } gsl-doc-2.3/specfunc/gsl_sf_coulomb.h0000664000175000017500000001046212616157443015752 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #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__ */ gsl-doc-2.3/specfunc/mathieu_charv.c0000664000175000017500000005704412616157443015576 0ustar eddedd/* specfunc/mathieu_charv.c * * Copyright (C) 2002, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You 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 #include #include #include #include #include #include #include /* 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= 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_e(int order, double qq, gsl_sf_result *result) { int even_odd, nterms = 50, ii, counter = 0, maxcount = 1000; int dir = 0; /* step direction for new search */ double a1, a2, fa, fa1, dela, aa_orig, da = 0.025, aa; double aa_approx; /* current approximation for solution */ 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_e(order, -qq, result); else return gsl_sf_mathieu_b_e(order, -qq, result); } /* Compute an initial approximation for the characteristic value. */ aa_approx = approx_c(order, qq); /* Save the original approximation for later comparison. */ aa_orig = aa = aa_approx; /* 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 > 40) { 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)) || (order > 10 && fabs(aa - aa_orig) > 1.5*order)) { counter++; if (counter == maxcount) { result->err = fabs(aa - aa_orig); break; } if (aa > aa_orig) { if (dir == 1) da /= 2; dir = -1; } else { if (dir == -1) da /= 2; dir = 1; } aa_approx += dir*da*counter; aa = aa_approx; 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_e(int order, double qq, gsl_sf_result *result) { int even_odd, nterms = 50, ii, counter = 0, maxcount = 1000; int dir = 0; /* step direction for new search */ double a1, a2, fa, fa1, dela, aa_orig, da = 0.025, aa; double aa_approx; /* current approximation for solution */ 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_e(order, -qq, result); else return gsl_sf_mathieu_a_e(order, -qq, result); } /* Compute an initial approximation for the characteristic value. */ aa_approx = approx_s(order, qq); /* Save the original approximation for later comparison. */ aa_orig = aa = aa_approx; /* 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 > 40) { 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)) || (order > 10 && fabs(aa - aa_orig) > 1.5*order)) { counter++; if (counter == maxcount) { result->err = fabs(aa - aa_orig); break; } if (aa > aa_orig) { if (dir == 1) da /= 2; dir = -1; } else { if (dir == -1) da /= 2; dir = 1; } aa_approx += dir*da*counter; aa = aa_approx; 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; iieven_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; iieval, 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; iieval, 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; iieven_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; iieval, 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; iieval, 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 #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__ */ gsl-doc-2.3/specfunc/bessel.c0000664000175000017500000006643612616157443014241 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #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); } } /* Hankel's Asymptotic Expansion - A&S 9.2.5 * * 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). * * Sat Mar 15 05:16:18 GMT 2008 [BG] * Extended to use additional terms in the series to gain * higher accuracy. * */ int gsl_sf_bessel_Jnu_asympx_e(const double nu, const double x, gsl_sf_result * result) { double mu = 4.0*nu*nu; double chi = x - (0.5*nu + 0.25)*M_PI; double P = 0.0; double Q = 0.0; double k = 0, t = 1; int convP, convQ; do { t *= (k == 0) ? 1 : -(mu - (2*k-1)*(2*k-1)) / (k * (8 * x)); convP = fabs(t) < GSL_DBL_EPSILON * fabs(P); P += t; k++; t *= (mu - (2*k-1)*(2*k-1)) / (k * (8 * x)); convQ = fabs(t) < GSL_DBL_EPSILON * fabs(Q); Q += t; /* To preserve the consistency of the series we need to exit when P and Q have the same number of terms */ if (convP && convQ && k > (nu / 2)) break; k++; } while (k < 1000); { double pre = sqrt(2.0/(M_PI*x)); double c = cos(chi); double s = sin(chi); result->val = pre * (c*P - s*Q); result->err = pre * GSL_DBL_EPSILON * (fabs(c*P) + fabs(s*Q) + fabs(t)) * (1 + fabs(x)); /* NB: final term accounts for phase error with large x */ } 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, &l); 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 double RECUR_SMALL = GSL_SQRT_DBL_MIN; 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; } else if(fabs(An) < RECUR_SMALL || fabs(Bn) < RECUR_SMALL) { An /= RECUR_SMALL; Bn /= RECUR_SMALL; Anm1 /= RECUR_SMALL; Bnm1 /= RECUR_SMALL; Anm2 /= RECUR_SMALL; Bnm2 /= RECUR_SMALL; } 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; } /* FIXME: we should return an error term here as well, because the error from this recurrence affects the overall error estimate. */ *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 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 gsl-doc-2.3/specfunc/test_legendre.c0000664000175000017500000014353412757623206015604 0ustar eddedd/* specfunc/test_legendre.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman * Copyright (C) 2013 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include "test_sf.h" static double test_legendre_dx(const size_t l) { const double dx_max = 0.4; double dx; if (l < 1000) dx = exp((double)l / 1000.0) / exp(2.0); else dx = dx_max; return dx; } /* test_legendre_dx() */ /* test_legendre_sum() This routine computes the sum: Sum_{m=0}^l [P(l,m)(x)]^2 This sum should equate to 1.0 for Schmidt semi-normalized ALFs for all l. */ static double test_legendre_sum(const size_t l, double *p) { double sum = 0.0; size_t idx; size_t m; for (m = 0; m <= l; ++m) { idx = gsl_sf_legendre_array_index(l, m); sum += p[idx] * p[idx]; } return sum; } /* test_legendre_sum() */ /* test_legendre_sum_deriv() This routine computes the sum: Sum_{m=0}^l P(l,m)(x) * dP(l,m)/dx which should equal 0 in the case of Schmidt normalized ALFs. */ static double test_legendre_sum_deriv(const int l, double *p, double *dp) { double sum = 0.0; size_t idx; int m; for (m = 0; m <= l; ++m) { idx = gsl_sf_legendre_array_index(l, m); sum += p[idx] * dp[idx]; } return sum; } /* test_legendre_sum_deriv() */ /* test_legendre_sum_deriv2() This routine computes the sum: Sum_{m=0}^l P(l,m)(x) * dP(l,m)/dx which should equal 0 in the case of Schmidt normalized ALFs. */ static double test_legendre_sum_deriv2(const int l, double *p, double *dp, double *d2p) { double sum = 0.0; int m; for (m = 0; m <= l; ++m) { size_t idx = gsl_sf_legendre_array_index(l, m); sum += dp[idx] * dp[idx] + p[idx] * d2p[idx]; } return sum; } /* test_legendre_sum_deriv2() */ static void test_value(const size_t lmax, const size_t l, const size_t m, const double *p, const double expected, const double tol, const char *desc, const char *desc2) { size_t idx = gsl_sf_legendre_array_index(l, m); double value; if (l > lmax) return; value = p[idx]; gsl_test_rel(value, expected, tol, "%s %s lmax=%zu l=%zu m=%zu", desc, desc2, lmax, l, m); } /* test_value() */ /* Y_{lm} = factor * S_{lm} */ static double test_factor_spharm(const size_t l, const size_t m) { double factor = sqrt( (2.0 * l + 1.0) / 4.0 / M_PI); if (m == 0) return factor; else return (factor / sqrt(2.0)); } /* test_factor_spharm() */ /* N_{lm} = factor * S_{lm} */ static double test_factor_full(const size_t l, const size_t m) { double factor = sqrt(l + 0.5); if (m == 0) return factor; else return (factor / sqrt(2.0)); } /* test_factor_full() */ /* test that p = factor * p_expected */ static int test_legendre_compare(const size_t lmax, const double *p_expected, const double *p, double (*factor)(const size_t l, const size_t m), const char *desc, const char *desc2) { size_t l, m; for (l = 0; l <= lmax; ++l) { for (m = 0; m <= l; ++m) { size_t idx = gsl_sf_legendre_array_index(l, m); double fac = (*factor)(l, m); if (fabs(p_expected[idx]) < GSL_DBL_MIN) continue; gsl_test_rel(p[idx] / fac, p_expected[idx], 1.0e-10, "%s %s l=%zu m=%zu", desc, desc2, l, m); } } return 0; } /* test_legendre_compare() */ static int test_legendre_schmidt(const size_t lmax, const double csphase, const char *desc) { int s = 0; const size_t nlm = gsl_sf_legendre_nlm(lmax); size_t l; double x, dx; double *p, *p2, *dp, *d2p, *p_alt, *dp_alt; size_t dim; size_t i; const gsl_sf_legendre_t norm = GSL_SF_LEGENDRE_SCHMIDT; dim = gsl_sf_legendre_array_n(lmax); p = malloc(sizeof(double) * dim); p2 = malloc(sizeof(double) * dim); dp = malloc(sizeof(double) * dim); d2p = malloc(sizeof(double) * dim); p_alt = malloc(sizeof(double) * dim); dp_alt = malloc(sizeof(double) * dim); /* test specific values */ x = 0.5; gsl_sf_legendre_array(norm, lmax, x, p); test_value(lmax, 0, 0, p, 1.000000000000000, 1.0e-10, desc, "x=0.5"); test_value(lmax, 1, 0, p, 0.500000000000000, 1.0e-10, desc, "x=0.5"); test_value(lmax, 1, 1, p, 0.866025403784439, 1.0e-10, desc, "x=0.5"); test_value(lmax, 2, 0, p, -0.125000000000000, 1.0e-10, desc, "x=0.5"); test_value(lmax, 2, 1, p, 0.750000000000000, 1.0e-10, desc, "x=0.5"); test_value(lmax, 2, 2, p, 0.649519052838329, 1.0e-10, desc, "x=0.5"); test_value(lmax, 3, 0, p, -0.437500000000000, 1.0e-10, desc, "x=0.5"); test_value(lmax, 3, 2, p, 0.726184377413891, 1.0e-10, desc, "x=0.5"); test_value(lmax, 3, 3, p, 0.513489897661093, 1.0e-10, desc, "x=0.5"); x = 0.1; gsl_sf_legendre_array(norm, lmax, x, p); test_value(lmax, 2700, 500, p, -7.421910573369699e-3, 1.0e-10, desc, "x=0.1"); test_value(lmax, 2700, 2500, p, 2.717612388452281e-2, 1.0e-10, desc, "x=0.1"); test_value(lmax, 2700, 2700, p, 1.887509917445211e-7, 1.0e-10, desc, "x=0.1"); x = 0.15; gsl_sf_legendre_deriv_array(norm, lmax, x, p, dp); test_value(lmax, 0, 0, dp, 0.000000000000000, 1.0e-10, desc, "deriv x=0.15"); test_value(lmax, 1, 0, dp, 1.000000000000000, 1.0e-10, desc, "deriv x=0.15"); test_value(lmax, 1, 1, dp, -0.151716521227252, 1.0e-10, desc, "deriv x=0.15"); test_value(lmax, 2, 1, dp, 1.67303727048739, 1.0e-10, desc, "deriv x=0.15"); x = 0.23; gsl_sf_legendre_deriv2_array(norm, lmax, x, p, dp, d2p); test_value(lmax, 0, 0, d2p, 0.000000000000000, 1.0e-10, desc, "deriv2 x=0.23"); test_value(lmax, 1, 0, d2p, 0.000000000000000, 1.0e-10, desc, "deriv2 x=0.23"); test_value(lmax, 1, 1, d2p, -1.08494130865644, 1.0e-10, desc, "deriv2 x=0.23"); test_value(lmax, 2, 0, d2p, 3.000000000000000, 1.0e-10, desc, "deriv2 x=0.23"); test_value(lmax, 2, 1, d2p, -1.25090188696335, 1.0e-10, desc, "deriv2 x=0.23"); /* test array routines */ dx = test_legendre_dx(lmax); for (x = -1.0; x <= 1.0; x += dx) { s += gsl_sf_legendre_array_e(norm, lmax, x, csphase, p); for (l = 0; l <= lmax; ++l) { double sum = test_legendre_sum(l, p); double rhs = 1.0; gsl_test_rel(sum, rhs, 1.0e-10, "%s l=%zu, x=%f, sum=%.12e", desc, l, x, sum); } } /* test deriv array routines */ for (x = -1.0 + dx; x < 1.0 - dx; x += dx) { double u = sqrt((1.0 - x) * (1.0 + x)); double uinv = 1.0 / u; s += gsl_sf_legendre_array(norm, lmax, x, p2); s += gsl_sf_legendre_deriv_array(norm, lmax, x, p, dp); s += gsl_sf_legendre_deriv_alt_array(norm, lmax, x, p_alt, dp_alt); for (i = 0; i < nlm; ++i) { if (fabs(p2[i]) < GSL_DBL_MIN) continue; /* check p = p_alt = p2 */ gsl_test_rel(p[i], p2[i], 1.0e-10, "%s deriv i=%zu", desc, i); gsl_test_rel(p_alt[i], p2[i], 1.0e-10, "%s deriv_alt i=%zu", desc, i); /* check dp = -1/u*dp_alt */ gsl_test_rel(-uinv * dp_alt[i], dp[i], 1.0e-10, "%s deriv_alt x=%f i=%zu", desc, x, i); } for (l = 0; l <= lmax; ++l) { double sum = test_legendre_sum_deriv(l, p, dp); gsl_test_abs(sum, 0.0, 1.0e-10, "%s deriv l=%zu, x=%f, sum=%.12e", desc, l, x, sum); } } /* test deriv2 array routines */ for (x = -1.0 + dx; x < 1.0 - dx; x += dx) { s += gsl_sf_legendre_array(norm, lmax, x, p2); s += gsl_sf_legendre_deriv2_array(norm, lmax, x, p, dp, d2p); /* check p = p2 */ for (i = 0; i < nlm; ++i) { if (fabs(p2[i]) < GSL_DBL_MIN) continue; gsl_test_rel(p[i], p2[i], 1.0e-10, "%s deriv2 i=%zu", desc, i); } for (l = 0; l <= lmax; ++l) { double sum = test_legendre_sum_deriv(l, p, dp); double sum2 = test_legendre_sum_deriv2(l, p, dp, d2p); gsl_test_abs(sum, 0.0, 1.0e-10, "%s deriv2 l=%zu, x=%f, sum=%.12e", desc, l, x, sum); gsl_test_abs(sum2, 0.0, 1.0e-6, "%s deriv2 l=%zu, x=%f, sum=%.12e", desc, l, x, sum2); } } free(p); free(p2); free(dp); free(d2p); free(p_alt); free(dp_alt); return s; } /* test_legendre_schmidt() */ /* test other normalizations (other than schmidt) */ static int test_legendre_norm(const gsl_sf_legendre_t norm_type, const size_t lmax, const double csphase, const char *desc) { int s = 0; double x, dx; double *p_schmidt, *dp_schmidt, *d2p_schmidt; double *p, *dp, *d2p; size_t dim; double (*factor)(const size_t l, const size_t m) = NULL; dim = gsl_sf_legendre_array_n(lmax); p = malloc(sizeof(double) * dim); dp = malloc(sizeof(double) * dim); d2p = malloc(sizeof(double) * dim); p_schmidt = malloc(sizeof(double) * dim); dp_schmidt = malloc(sizeof(double) * dim); d2p_schmidt = malloc(sizeof(double) * dim); if (norm_type == GSL_SF_LEGENDRE_SPHARM) { factor = &test_factor_spharm; } else if (norm_type == GSL_SF_LEGENDRE_FULL) { factor = &test_factor_full; /* test specific values (computed from GNU octave) */ x = 0.45; s += gsl_sf_legendre_array(norm_type, lmax, x, p); test_value(lmax, 0, 0, p, 0.707106781186548, 1.0e-10, desc, "x=0.45"); test_value(lmax, 1, 0, p, 0.551135192126215, 1.0e-10, desc, "x=0.45"); test_value(lmax, 1, 1, p, 0.773385414912901, 1.0e-10, desc, "x=0.45"); test_value(lmax, 2, 0, p, -0.310298495404022, 1.0e-10, desc, "x=0.45"); test_value(lmax, 2, 1, p, 0.778204062248457, 1.0e-10, desc, "x=0.45"); test_value(lmax, 2, 2, p, 0.772176054650104, 1.0e-10, desc, "x=0.45"); test_value(lmax, 3, 0, p, -0.83661120632398589, 1.0e-10, desc, "x=0.45"); test_value(lmax, 3, 1, p, 0.00904294765791280, 1.0e-10, desc, "x=0.45"); test_value(lmax, 3, 2, p, 0.91934361403343767, 1.0e-10, desc, "x=0.45"); test_value(lmax, 3, 3, p, 0.74482641545541073, 1.0e-10, desc, "x=0.45"); } /* * test the scale factors between the Schmidts and these * normalized functions */ dx = test_legendre_dx(lmax); for (x = -1.0; x <= 1.0; x += dx) { s += gsl_sf_legendre_array_e(GSL_SF_LEGENDRE_SCHMIDT, lmax, x, csphase, p_schmidt); s += gsl_sf_legendre_array_e(norm_type, lmax, x, csphase, p); test_legendre_compare(lmax, p_schmidt, p, factor, desc, "p"); } /* test derivatives */ for (x = -1.0 + dx; x < 1.0 - dx; x += dx) { s += gsl_sf_legendre_deriv_array_e(GSL_SF_LEGENDRE_SCHMIDT, lmax, x, csphase, p_schmidt, dp_schmidt); s += gsl_sf_legendre_deriv_array_e(norm_type, lmax, x, csphase, p, dp); test_legendre_compare(lmax, p_schmidt, p, factor, desc, "deriv p"); test_legendre_compare(lmax, dp_schmidt, dp, factor, desc, "deriv dp"); s += gsl_sf_legendre_deriv2_array_e(GSL_SF_LEGENDRE_SCHMIDT, lmax, x, csphase, p_schmidt, dp_schmidt, d2p_schmidt); s += gsl_sf_legendre_deriv2_array_e(norm_type, lmax, x, csphase, p, dp, d2p); test_legendre_compare(lmax, p_schmidt, p, factor, desc, "deriv2 p"); test_legendre_compare(lmax, dp_schmidt, dp, factor, desc, "deriv2 dp"); test_legendre_compare(lmax, d2p_schmidt, d2p, factor, desc, "deriv2 d2p"); } free(p); free(dp); free(d2p); free(p_schmidt); free(dp_schmidt); free(d2p_schmidt); return s; } /* test_legendre_norm() */ /* test_legendre_unnorm() This routine tests the unnormalized ALFs using the relation S(l,m)(x) = a(l,m) * P(l,m)(x) where a(l,0) = 1 a(l,1) = -sqrt(2)/sqrt(l * (l+1)) a(l,m+1) = a(l,m) / sqrt((l+m+1) * (l-m)), m > 1 and S(l,m) are the Schmidt semi-normalized ALFs */ static int test_legendre_unnorm(const size_t lmax_orig, const char *desc) { int s = 0; const int lmax = GSL_MIN(lmax_orig, 140); size_t l, m; double x, dx; double *p, *dp, *d2p, *p2; double *p_schmidt, *dp_schmidt, *d2p_schmidt; size_t dim; dim = gsl_sf_legendre_array_n(lmax); p = malloc(sizeof(double) * dim); dp = malloc(sizeof(double) * dim); d2p = malloc(sizeof(double) * dim); p2 = malloc(sizeof(double) * dim); p_schmidt = malloc(sizeof(double) * dim); dp_schmidt = malloc(sizeof(double) * dim); d2p_schmidt = malloc(sizeof(double) * dim); dx = test_legendre_dx(lmax); for (x = -1.0 + dx; x < 1.0 - dx; x += dx) { gsl_sf_legendre_deriv2_array(GSL_SF_LEGENDRE_SCHMIDT, lmax, x, p_schmidt, dp_schmidt, d2p_schmidt); gsl_sf_legendre_deriv2_array(GSL_SF_LEGENDRE_NONE, lmax, x, p, dp, d2p); for (l = 0; l <= lmax; ++l) { double a_lm = sqrt(2.0 / (double)l / (l + 1.0)); size_t idx; /* test S(l,0) = P(l,0) */ idx = gsl_sf_legendre_array_index(l, 0); gsl_test_rel(p[idx], p_schmidt[idx], 1.0e-10, "unnorm l=%zu, m=0, x=%f", l, x); gsl_test_rel(dp[idx], dp_schmidt[idx], 1.0e-10, "unnorm deriv l=%zu, m=0, x=%f", l, x); gsl_test_rel(d2p[idx], d2p_schmidt[idx], 1.0e-10, "unnorm deriv2 l=%zu, m=0, x=%f", l, x); /* test S(l,m) = a_{lm} * P(l,m) for m > 0 */ for (m = 1; m <= l; ++m) { idx = gsl_sf_legendre_array_index(l, m); gsl_test_rel(a_lm * p[idx], p_schmidt[idx], 1.0e-9, "unnorm l=%zu, m=%zu, x=%f", l, m, x); gsl_test_abs(a_lm * dp[idx], dp_schmidt[idx], 1.0e-10, "unnorm deriv l=%zu, m=%zu, x=%f", l, m, x); gsl_test_abs(a_lm * d2p[idx], d2p_schmidt[idx], 1.0e-10, "unnorm deriv2 l=%zu, m=%zu, x=%f", l, m, x); a_lm /= sqrt((double) (l + m + 1)) * sqrt((double) (l - m)); } } gsl_sf_legendre_array(GSL_SF_LEGENDRE_NONE, lmax, x, p2); /* test if p = p2 */ for (l = 0; l <= lmax; ++l) { for (m = 0; m <= l; ++m) { size_t idx = gsl_sf_legendre_array_index(l, m); gsl_test_rel(p2[idx], p[idx], 1.0e-10, "%s compare l=%zu, m=%zu, x=%f", desc, l, m, x); } } } free(p); free(p2); free(dp); free(d2p); free(p_schmidt); free(dp_schmidt); free(d2p_schmidt); return s; } /* test_legendre_unnorm() */ static int test_legendre_all(const size_t lmax) { int s = 0; s += test_legendre_schmidt(lmax, 1.0, "schmidt csphase=1"); s += test_legendre_schmidt(lmax, -1.0, "schmidt csphase=-1"); s += test_legendre_norm(GSL_SF_LEGENDRE_SPHARM, lmax, 1.0, "spharm csphase=1"); s += test_legendre_norm(GSL_SF_LEGENDRE_SPHARM, lmax, -1.0, "spharm csphase=-1"); s += test_legendre_norm(GSL_SF_LEGENDRE_FULL, lmax, 1.0, "full csphase=1"); s += test_legendre_norm(GSL_SF_LEGENDRE_FULL, lmax, -1.0, "full csphase=-1"); s += test_legendre_unnorm(lmax, "unnorm csphase=1"); return s; } /* test_legendre_all() */ 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); #ifndef GSL_DISABLE_DEPRECATED 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; #endif /* !GSL_DISABLE_DEPRECATED */ 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); #ifdef EXTENDED TEST_SF(s, gsl_sf_legendre_sphPlm_e, (140,135,0.99998689456491752,&r), -6.54265253269093276310395668335e-305, TEST_TOL6, GSL_SUCCESS); #endif #ifndef GSL_DISABLE_DEPRECATED 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; #endif /* !GSL_DISABLE_DEPRECATED */ 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 FIXME 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); /* test associated legendre functions */ { size_t l; for (l = 0; l <= 10; ++l) test_legendre_all(l); test_legendre_all(140); test_legendre_all(1000); /*test_legendre_all(2700);*/ } return s; } gsl-doc-2.3/specfunc/exp.c0000664000175000017500000003723612616157443013554 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "error.h" /* Evaluate the continued fraction for exprel. * [Abramowitz+Stegun, 4.2.41] */ static int exprel_n_CF(const double 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 = 4.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 = (x > GSL_LOG_DBL_MAX || x < GSL_LOG_DBL_MIN) ? (int) floor(x/M_LN10) : 0; 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(x) + fabs(ly) + M_LN10*fabs(N)); 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_CF_e(const double N, const double x, gsl_sf_result * result) { return exprel_n_CF(N, x, 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; kval = 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; kval = -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)); } gsl-doc-2.3/specfunc/gsl_sf_psi.h0000664000175000017500000000517312616157443015110 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/bessel_Knu.c0000664000175000017500000001247512616157443015050 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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 { gsl_sf_result_e10 result_e10; int status = gsl_sf_bessel_Knu_scaled_e10_e(nu, x, &result_e10); int status2 = gsl_sf_result_smash_e(&result_e10, result); return GSL_ERROR_SELECT_2(status, status2); } } int gsl_sf_bessel_Knu_scaled_e10_e(const double nu, const double x, gsl_sf_result_e10 * result) { /* CHECK_POINTER(result) */ if(x <= 0.0 || nu < 0.0) { DOMAIN_ERROR_E10(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, e10 = 0; 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 GSL_SQRT_DBL_MAX) { double p = floor(log(fabs(K_nu))/M_LN10); double factor = pow(10.0, p); K_num1 /= factor; K_nu /= factor; e10 += p; }; 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); result->e10 = e10; 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_e10 K_scaled; int status = gsl_sf_bessel_Knu_scaled_e10_e(nu, x, &K_scaled); result->val = -x + log(fabs(K_scaled.val)) + K_scaled.e10 * M_LN10; result->err = GSL_DBL_EPSILON * fabs(x) + fabs(K_scaled.err/K_scaled.val); result->err += GSL_DBL_EPSILON * fabs(result->val); return status; } } /*-*-*-*-*-*-*-*-*-* 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)); } gsl-doc-2.3/specfunc/gsl_sf_elljac.h0000664000175000017500000000252412616157443015544 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/specfunc/hyperg_1F1.c0000664000175000017500000017043712616157443014666 0ustar eddedd/* specfunc/hyperg_1F1.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2010 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #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 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; nval = 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; nval = 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; nval = 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 = (int) 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; nval = 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; nval = 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; apval = 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; nval = 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; nval = 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) < 2*GSL_LOG_DBL_MAX) { /* 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)); } gsl-doc-2.3/specfunc/bessel_K1.c0000644000175000017500000001373512736044021014552 0ustar eddedd/* specfunc/bessel_K1.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * Copyright (C) 2016 Pavel Holoborodko, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include "error.h" #include "chebyshev.h" #include "cheb_eval.c" /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/ /* Minimax rational approximation for [0,1), peak relative error = 1.83*GSL_DBL_EPSILON. Source: http://www.advanpix.com/?p=3987 */ static double k1_poly[9] = { -3.0796575782920622440538935e-01, -8.5370719728650778045782736e-02, -4.6421827664715603298154971e-03, -1.1253607036630425931072996e-04, -1.5592887702110907110292728e-06, -1.4030163679125934402498239e-08, -8.8718998640336832196558868e-11, -4.1614323580221539328960335e-13, -1.5261293392975541707230366e-15 }; static double i1_poly[7] = { 8.3333333333333325191635191e-02, 6.9444444444467956461838830e-03, 3.4722222211230452695165215e-04, 1.1574075952009842696580084e-05, 2.7555870002088181016676934e-07, 4.9724386164128529514040614e-09 }; /* Chebyshev expansion for [1,8], peak relative error = 1.28*GSL_DBL_EPSILON. Source: Pavel Holoborodko. */ static double ak1_data[25] = { +2.07996868001418246e-01, +1.62581565017881476e-01, -5.87070423518863640e-03, +4.95021520115789501e-04, -5.78958347598556986e-05, +8.18614610209334726e-06, -1.31604832009487277e-06, +2.32546031520101213e-07, -4.42206518311557987e-08, +8.92163994883100361e-09, -1.89046270526983427e-09, +4.17568808108504702e-10, -9.55912361791375794e-11, +2.25769353153867758e-11, -5.48128000211158482e-12, +1.36386122546441926e-12, -3.46936690565986409e-13, +9.00354564415705942e-14, -2.37950577776254432e-14, +6.39447503964025336e-15, -1.74498363492322044e-15, +4.82994547989290473e-16, -1.35460927805445606e-16, +3.84604274446777234e-17, -1.10456856122581316e-17 }; static cheb_series ak1_cs = { ak1_data, 24, -1, 1, 9 }; /* Chebyshev expansion for [8,inf), peak relative error = 1.25*GSL_DBL_EPSILON. Source: SLATEC/dbsk1e.f */ static double ak12_data[14] = { +.637930834373900104E-1, +.283288781304972094E-1, -.247537067390525035E-3, +.577197245160724882E-5, -.206893921953654830E-6, +.973998344138180418E-8, -.558533614038062498E-9, +.373299663404618524E-10, -.282505196102322545E-11, +.237201900248414417E-12, -.217667738799175398E-13, +.215791416161603245E-14, -.229019693071826928E-15, +.258288572982327496E-16 }; 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 < 1.0) { const double lx = log(x); const double ex = exp(x); const double x2 = x*x; const double t = 0.25*x2; const double i1 = 0.5 * x * (1.0 + t * (0.5 + t * gsl_poly_eval(i1_poly,6,t))); result->val = ex * (x2 * gsl_poly_eval(k1_poly,9,x2) + x * lx * i1 + 1) / x; result->err = ex * (1.6+fabs(lx)*0.6) * GSL_DBL_EPSILON; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else if(x <= 8.0) { const double sx = sqrt(x); gsl_sf_result c; cheb_eval_e(&ak1_cs, (16.0/x-9.0)/7.0, &c); result->val = (1.375 + c.val) / sx; /* 1.375 = 11/8 */ 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 < 1.0) { const double lx = log(x); const double x2 = x*x; const double t = 0.25*x2; const double i1 = 0.5 * x * (1.0 + t * (0.5 + t * gsl_poly_eval(i1_poly,6,t))); result->val = (x2 * gsl_poly_eval(k1_poly,9,x2) + x * lx * i1 + 1) / x; result->err = (1.6+fabs(lx)*0.6) * GSL_DBL_EPSILON; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } 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)); } gsl-doc-2.3/specfunc/gsl_sf_transport.h0000664000175000017500000000367212616157443016353 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/specfunc/bessel_Ynu.c0000664000175000017500000000650512616157443015063 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #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)); } gsl-doc-2.3/specfunc/bessel_Y1.c0000664000175000017500000001012112616157443014566 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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)); } gsl-doc-2.3/ode-initval/0000755000175000017500000000000013022553154013173 5ustar eddeddgsl-doc-2.3/ode-initval/bsimp.c0000664000175000017500000003275212616157443014475 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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; gsl-doc-2.3/ode-initval/rkf45.c0000664000175000017500000002056012616157443014310 0ustar eddedd/* ode-initval/rkf45.c * * Copyright (C) 2001, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; gsl-doc-2.3/ode-initval/rk2.c0000664000175000017500000001216412616157443014054 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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 k3", 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 ytmp", 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; gsl-doc-2.3/ode-initval/gear1.c0000664000175000017500000001404112616157443014351 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; iy0; 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; gsl-doc-2.3/ode-initval/Makefile.am0000664000175000017500000000132012616157443015236 0ustar eddeddnoinst_LTLIBRARIES = libgslodeiv.la pkginclude_HEADERS = gsl_odeiv.h AM_CPPFLAGS = -I$(top_srcdir) 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 gsl-doc-2.3/ode-initval/evolve.c0000664000175000017500000001272112616157443014655 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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) { RETURN_IF_NULL (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 */ *t = t0; /* restore original t value */ 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. */ double h_old = h0; const int hadjust_status = gsl_odeiv_control_hadjust (con, step, y, e->yerr, e->dydt_out, &h0); if (hadjust_status == GSL_ODEIV_HADJ_DEC) { /* Check that the reported status is correct (i.e. an actual decrease in h0 occured) and the suggested h0 will change the time by at least 1 ulp */ double t_curr = GSL_COERCE_DBL(*t); double t_next = GSL_COERCE_DBL((*t) + h0); if (fabs(h0) < fabs(h_old) && t_next != t_curr) { /* Step was decreased. Undo step, and try again with new h0. */ DBL_MEMCPY (y, e->y0, dydt->dimension); e->failed_steps++; goto try_step; } else { h0 = h_old; /* keep current step size */ } } } *h = h0; /* suggest step size for next time-step */ return step_status; } gsl-doc-2.3/ode-initval/TODO0000664000175000017500000000737112616157443013706 0ustar eddedd# -*- org -*- #+CATEGORY: ode-initval * 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, VODE, DASSL, 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 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. ---------------------------------------------------------------------- gsl-doc-2.3/ode-initval/rk4.c0000664000175000017500000001657512616157443014070 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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->k); free (state); 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; gsl-doc-2.3/ode-initval/gear2.c0000664000175000017500000002065712616157443014364 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include /* 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; /* initialization */ DBL_MEMCPY (y0, y, dim); /* Save initial values for possible failures */ DBL_MEMCPY (y0_orig, 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; gsl-doc-2.3/ode-initval/odeiv_util.h0000664000175000017500000000021312616157443015516 0ustar eddedd#define DBL_MEMCPY(dest,src,n) memcpy((dest),(src),(n)*sizeof(double)) #define DBL_ZERO_MEMSET(dest,n) memset((dest),0,(n)*sizeof(double)) gsl-doc-2.3/ode-initval/rk4imp.c0000664000175000017500000002147412616157443014570 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; gsl-doc-2.3/ode-initval/rk2imp.c0000664000175000017500000001617012616157443014563 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #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; gsl-doc-2.3/ode-initval/rk8pd.c0000664000175000017500000002742212616157443014411 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; gsl-doc-2.3/ode-initval/cscal.c0000664000175000017500000001115712616157443014444 0ustar eddedd/* ode-initval/cscal.c * * Copyright (C) 2002, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include 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 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; } gsl-doc-2.3/ode-initval/cstd.c0000664000175000017500000001056712616157443014320 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 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); } gsl-doc-2.3/ode-initval/Makefile.in0000644000175000017500000010677413022372406015256 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslodeiv.la pkginclude_HEADERS = gsl_odeiv.h AM_CPPFLAGS = -I$(top_srcdir) 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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ode-initval/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslodeiv.la: $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_DEPENDENCIES) $(EXTRA_libgslodeiv_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsimp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2simp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/ode-initval/ChangeLog0000664000175000017500000001316712616157443014770 0ustar eddedd2011-04-25 Brian Gough * This module is now superseded by ode-initval2 2009-08-12 Brian Gough * rk4.c (rk4_alloc): fix order of free statements to avoid memory leak 2009-07-09 Brian Gough * step.c (gsl_odeiv_step_free): handle NULL argument in free * evolve.c (gsl_odeiv_evolve_free): handle NULL argument in free * control.c (gsl_odeiv_control_free): handle NULL argument in free 2009-04-21 Brian Gough * gear2.c (gear2_apply): save initial values of y for possible failures 2009-04-20 Brian Gough * evolve.c (gsl_odeiv_evolve_apply): restore original t value when step fails 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-01-28 Brian Gough * test.c (test_evolve_negative_h): test evolution with negative steps as well as positive 2008-01-03 Brian Gough * evolve.c (gsl_odeiv_evolve_apply): handle the case where GSL_ODEIV_HADJ_DEC does not represent a real decrease (e.g. where x+h = x due to finite precision) 2006-07-29 Brian Gough * evolve.c (gsl_odeiv_evolve_apply): notify user of step-size which caused any failure by returning it 2006-06-13 Brian Gough * 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 * Fixed all functions to consistently return status instead of GSL_EBADFUNC. 2004-12-29 Brian Gough * test.c (test_compare_vanderpol): avoid variable size array (test_compare_oregonator): as above 2004-12-23 Brian Gough * test.c (test_evolve_xsin): changed description from "failures" to "errors" 2004-12-22 Brian Gough * 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 * 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 * gear2.c (gear2_alloc): added check for non-allocation of primer, and two-step error estimation 2004-11-23 Brian Gough * 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 * test.c: new test program (Tuomo Keskitalo) 2004-11-12 Brian Gough * 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 * 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 * 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 * 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 * 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 * bsimp.c: modified to use new-style vector views Fri Jun 22 11:59:24 2001 Brian Gough * evolve.c: keep track of failed step count Tue Jun 12 11:34:23 2001 Brian Gough * rkf45.c: added Runge-Kutta Fehlberg method, RKF45 * reorganized to use standard gsl conventions Mon Apr 23 10:26:22 2001 Brian Gough * 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 * 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 * bsimp.c (bsimp_step_local): changed gsl_la prefix to gsl_linalg, new naming convention Fri Oct 1 15:46:13 1999 Brian Gough * bsimp.c: converted to use new-style block/vector code gsl-doc-2.3/ode-initval/step.c0000664000175000017500000000415512616157443014332 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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) { RETURN_IF_NULL (s); s->type->free(s->state); free(s); } gsl-doc-2.3/ode-initval/rkck.c0000664000175000017500000002046212616157443014310 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #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; gsl-doc-2.3/ode-initval/gsl_odeiv.h0000664000175000017500000001712012616157443015333 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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 * s); unsigned int gsl_odeiv_step_order(const gsl_odeiv_step * s); 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); /* 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 * e, 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 * e); void gsl_odeiv_evolve_free(gsl_odeiv_evolve * e); __END_DECLS #endif /* __GSL_ODEIV_H__ */ gsl-doc-2.3/ode-initval/rk2simp.c0000644000175000017500000002165312755623667014760 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #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->y_onestep); 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; gsl-doc-2.3/ode-initval/control.c0000664000175000017500000000431612616157443015036 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include 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) { RETURN_IF_NULL (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); } gsl-doc-2.3/ode-initval/test.c0000664000175000017500000006442612616157443014345 0ustar eddedd/* ode-initval/test_odeiv.c * * Copyright (C) 2004, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include #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 */ static int rhs_xsin_reset = 0; static int jac_xsin_reset = 0; int rhs_xsin (double t, const double y[], double f[], void *params) { static int n = 0, m = 0; if (rhs_xsin_reset) { rhs_xsin_reset = 0; n = 0; m = 1;} n++; if (n >= m) { m = n * 1.3; return GSL_EFAILED; } ; 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; if (jac_xsin_reset) { jac_xsin_reset = 0; 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); double * y_orig = malloc (sys->dimension * sizeof(double)); while (t < t1) { double t_orig = t; int s; memcpy (y_orig, y, sys->dimension * sizeof(double)); s= gsl_odeiv_evolve_apply (e, c, step, sys, &t, t1, &h, y); if (s != GSL_SUCCESS) { /* check that t and y are unchanged */ gsl_test_abs(t, t_orig, 0.0, "%s, t must be restored on failure", gsl_odeiv_step_name (step)); for (i = 0; i < sys->dimension; i++) { gsl_test_abs (y[i], y_orig[i], 0.0, "%s, y must be restored on failure", gsl_odeiv_step_name (step), desc, i); } if (sys != &rhs_func_xsin) { /* apart from xsin, other functions should not return errors */ 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); } free (y_orig); 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); rhs_xsin_reset = 1; jac_xsin_reset = 1; 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]"); } /* Test cases from Frank Reininghaus */ int rhs_stepfn (double t, const double * y, double * dydt, void * params) { if (t >= 1.0) dydt [0] = 1; else dydt [0] = 0; return GSL_SUCCESS; } void test_stepfn (void) { /* infinite loop for epsabs = 1e-18, but not for 1e-17 */ double epsabs = 1e-18; double epsrel = 1e-6; const gsl_odeiv_step_type * T = gsl_odeiv_step_rk2; gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, 1); gsl_odeiv_control * c = gsl_odeiv_control_y_new (epsabs, epsrel); gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (1); gsl_odeiv_system sys = {rhs_stepfn, 0, 1, 0}; double t = 0.0; double h = 1e-6; double y = 0.0; int i = 0; int status; while (t < 2.0 && i < 1000000) { status = gsl_odeiv_evolve_apply (e, c, s, &sys, &t, 2, &h, &y); #ifdef DEBUG printf("i=%d status=%d t=%g h=%g y=%g\n", i, status, t, h, y); #endif if (status != GSL_SUCCESS) break; i++; } gsl_test_abs(t, 2.0, 1e-16, "evolve step function, t (stepfn/rk2)"); gsl_test_rel(y, 1.0, epsrel, "evolve step function, y (stepfn/rk2)"); gsl_odeiv_evolve_free (e); gsl_odeiv_control_free (c); gsl_odeiv_step_free (s); } int rhs_stepfn2 (double t, const double * y, double * dydt, void * params) { if (t >= 0.0) dydt [0] = 1e300; else dydt [0] = 0; return GSL_SUCCESS; } void test_stepfn2 (void) { /* infinite loop for epsabs = 1e-25, but not for 1e-24 */ double epsabs = 1e-25; double epsrel = 1e-6; const gsl_odeiv_step_type * T = gsl_odeiv_step_rk2; gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, 1); gsl_odeiv_control * c = gsl_odeiv_control_y_new (epsabs, epsrel); gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (1); gsl_odeiv_system sys = {rhs_stepfn2, 0, 1, 0}; double t = -1.0; double h = 1e-6; double y = 0.0; int i = 0; int status; while (t < 1.0 && i < 10000) { status = gsl_odeiv_evolve_apply (e, c, s, &sys, &t, 1.0, &h, &y); #ifdef DEBUG printf("i=%d status=%d t=%g h=%g y=%g\n", i, status, t, h, y); #endif if (status != GSL_SUCCESS) break; i++; } gsl_test_abs(t, 1.0, 1e-16, "evolve big step function, t (stepfn2/rk2)"); gsl_test_rel(y, 1e300, epsrel, "evolve big step function, y (stepfn2/rk2)"); gsl_odeiv_evolve_free (e); gsl_odeiv_control_free (c); gsl_odeiv_step_free (s); } int rhs_stepfn3 (double t, const double * y, double * dydt, void * params) { static int calls = 0; if (t >= 0.0) dydt [0] = 1e300; else dydt [0] = 0; calls++; return (calls < 100000) ? GSL_SUCCESS : -999; } void test_stepfn3 (void) { /* infinite loop for epsabs = 1e-26, but not for 1e-25 */ double epsabs = 1e-26; double epsrel = 1e-6; const gsl_odeiv_step_type * T = gsl_odeiv_step_rkf45; gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, 1); gsl_odeiv_control * c = gsl_odeiv_control_y_new (epsabs, epsrel); gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (1); gsl_odeiv_system sys = {rhs_stepfn3, 0, 1, 0}; double t = -1.0; double h = 1e-6; double y = 0.0; int i = 0; int status; while (t < 1.0 && i < 10000) { status = gsl_odeiv_evolve_apply (e, c, s, &sys, &t, 1.0, &h, &y); #ifdef DEBUG printf("i=%d status=%d t=%g h=%g y=%g\n", i, status, t, h, y); #endif if (status != GSL_SUCCESS) break; i++; } gsl_test_abs(t, 1.0, 1e-16, "evolve big step function, t (stepfn3/rkf45)"); gsl_test_rel(y, 1e300, epsrel, "evolve big step function, y (stepfn3/rkf45)"); gsl_odeiv_evolve_free (e); gsl_odeiv_control_free (c); gsl_odeiv_step_free (s); } int rhs_cos (double t, const double * y, double * dydt, void * params) { dydt [0] = cos (t); return GSL_SUCCESS; } int jac_cos (double t, const double y[], double *dfdy, double dfdt[], void *params) { dfdy[0] = 0.0; dfdt[0] = -sin(t); return GSL_SUCCESS; } /* Test evolution in negative direction */ void test_evolve_negative_h (const gsl_odeiv_step_type * T, double h, double err) { /* Tolerance factor in testing errors */ const double factor = 10; gsl_odeiv_step * step = gsl_odeiv_step_alloc (T, 1); gsl_odeiv_control * c = gsl_odeiv_control_standard_new (err, err, 1.0, 0.0); gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (1); gsl_odeiv_system sys = {rhs_cos, jac_cos, 1, 0}; double t = 0; double t1 = -4.0; double y = 0.0; double yfin = sin (t1); /* Make initial h negative */ h = -fabs(h); while (t > t1) { int status = gsl_odeiv_evolve_apply (e, c, step, &sys, &t, t1, &h, &y); if (status != GSL_SUCCESS) { gsl_test(status, "%s evolve_apply returned %d for negative h", gsl_odeiv_step_name (step), status); break; } } gsl_test_abs (y, yfin, factor * e->count * err, "evolution with negative h (using %s)", gsl_odeiv_step_name (step)); gsl_odeiv_evolve_free (e); gsl_odeiv_control_free (c); gsl_odeiv_step_free (step); } 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_xsin (p[i].type, 0.1, 1e-8); /* test with large step size */ test_evolve_stiff1 (p[i].type, p[i].h, 1e-7); test_evolve_stiff5 (p[i].type, p[i].h, 1e-7); test_evolve_negative_h (p[i].type, p[i].h, 1e-7); } test_compare_vanderpol(); test_compare_oregonator(); test_stepfn(); test_stepfn2(); test_stepfn3(); exit (gsl_test_summary ()); } gsl-doc-2.3/config.guess0000755000175000017500000013036112630105471013303 0ustar eddedd#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. 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 ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 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 "$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 case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # 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 tuples: *-*-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 ;; sh5el) machine=sh5le-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 -q __ELF__ 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 ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_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 ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; 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 ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-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 /* 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 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:*:[4567]) 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 #include 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 -q __LP64__ 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 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:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-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-${LIBC}`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/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 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 -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${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-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 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.[02]*:*) 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' /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 i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-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; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' 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; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) 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 echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # 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 ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku 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 ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-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 eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi 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 ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} 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 ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #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 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 # 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 < 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: gsl-doc-2.3/AUTHORS0000664000175000017500000000356012620035156012036 0ustar eddeddMark 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) - cyclic functions and the initial functions for canonical permutations. Tuomo Keskitalo (tuomo.keskitalo@iki.fi) - multidimensional minimization and ode-initval2 routines for ordinary differential equations Ivo Alxneit (ivo.alxneit@psi.ch) - multidimensional minimization, wavelet transforms Jason H. Stover (jason@sakla.net) - cumulative distribution functions Patrick Alken - nonsymmetric and generalized eigensystems, B-splines, sparse matrices, linear and nonlinear least squares Rhys Ulerich (rhys.ulerich@gmail.com) - multisets Pavel Holoborodko - fixed order Gauss-Legendre quadrature Pedro Gonnet - CQUAD integration routines. gsl-doc-2.3/qrng/0000755000175000017500000000000013022553153011726 5ustar eddeddgsl-doc-2.3/qrng/qrng.c0000664000175000017500000000401512616157443013055 0ustar eddedd/* Author: G. Jungman */ #include #include #include #include #include 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; } 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) { RETURN_IF_NULL (q); if(q->state != 0) free (q->state); free (q); } gsl-doc-2.3/qrng/sobol.c0000664000175000017500000001442212616157443013227 0ustar eddedd/* 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 #include /* 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; kv_direction[k][0] = 1; /* Initialize in remaining dimensions. */ for(i_dim=1; i_dim= 0; k--) { includ[k] = ((p_i % 2) == 1); p_i /= 2; } /* Leading elements for dimension i come from v_init[][]. */ for(j=0; jv_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; jv_direction[j-degree_i][i_dim]; ell = 1; for(k=0; kv_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_dimv_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_dimlast_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_dimensionv_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; } gsl-doc-2.3/qrng/Makefile.am0000664000175000017500000000064212616157443014000 0ustar eddeddnoinst_LTLIBRARIES = libgslqrng.la pkginclude_HEADERS = gsl_qrng.h AM_CPPFLAGS = -I$(top_srcdir) libgslqrng_la_SOURCES = gsl_qrng.h qrng.c niederreiter-2.c sobol.c halton.c reversehalton.c inline.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 gsl-doc-2.3/qrng/gsl_qrng.h0000664000175000017500000000446312616157443013736 0ustar eddedd/* Author: G. Jungman + modifications from O. Teytaud */ #ifndef __GSL_QRNG_H__ #define __GSL_QRNG_H__ #include #include #include #include #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; GSL_VAR const gsl_qrng_type * gsl_qrng_halton; GSL_VAR const gsl_qrng_type * gsl_qrng_reversehalton; /* 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. */ INLINE_DECL int gsl_qrng_get (const gsl_qrng * q, double x[]); #ifdef HAVE_INLINE INLINE_FUN 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__ */ gsl-doc-2.3/qrng/TODO0000664000175000017500000000113212616157443012427 0ustar eddedd# -*- org -*- #+CATEGORY: qrng * 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 ) gsl-doc-2.3/qrng/reversehalton.c0000664000175000017500000002463012616157443014774 0ustar eddedd/* Authors: O. Teytaud * Copyright (C) 2007 O. Teytaud * (all comments/suggestions welcome at olivier.teytaud@inria.fr) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Implementation for Halton generator, modified according to the * following improvement (reverse scrambling): [ B. Vandewoestyne and * R. Cools, Good permutations for deterministic scrambled Halton * sequences in terms of L2-discrepancy, Computational and Applied * Mathematics 189, 2006] */ #include #include /* maximum allowed space dimension */ #define REVERSEHALTON_MAX_DIMENSION 1229 /* prototypes for generator type functions */ static size_t reversehalton_state_size (unsigned int dimension); static int reversehalton_init (void *state, unsigned int dimension); static int reversehalton_get (void *state, unsigned int dimension, double *v); /* global Halton generator type object */ static const gsl_qrng_type reversehalton_type = { "reversehalton", REVERSEHALTON_MAX_DIMENSION, reversehalton_state_size, reversehalton_init, reversehalton_get }; const gsl_qrng_type *gsl_qrng_reversehalton = &reversehalton_type; /* prime numbers (thanks to trolltech http://doc.trolltech.com/3.2/primes.html) */ static const int prime_numbers[REVERSEHALTON_MAX_DIMENSION] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973 }; /* Halton generator state. * sequence_count = number of calls with this generator */ typedef struct { unsigned int sequence_count; } reversehalton_state_t; static size_t reversehalton_state_size (unsigned int dimension) { return sizeof (reversehalton_state_t); } static int reversehalton_init (void *state, unsigned int dimension) { reversehalton_state_t *h_state = (reversehalton_state_t *) state; h_state->sequence_count = 0; if (dimension < 1 || dimension > REVERSEHALTON_MAX_DIMENSION) { return GSL_EINVAL; } return GSL_SUCCESS; } static double vdcorput (int x, int b) { double r = 0.; double v = 1.; double binv = 1. / (double) b; while (x > 0) { v *= binv; r += v * (double) ((x % b == 0) ? 0 : b - (x % b)); x /= b; } return r; } static int reversehalton_get (void *state, unsigned int dimension, double *v) { reversehalton_state_t *h_state = (reversehalton_state_t *) state; unsigned int i; if (dimension < 1 || dimension > REVERSEHALTON_MAX_DIMENSION) { return GSL_EINVAL; } h_state->sequence_count++; for (i = 0; i < dimension; i++) { v[i] = vdcorput (h_state->sequence_count, prime_numbers[i]); } return GSL_SUCCESS; } gsl-doc-2.3/qrng/niederreiter-2.c0000664000175000017500000002161412616157443014732 0ustar eddedd/* Author: G. Jungman */ /* Implement Niederreiter base 2 generator. * See: * Bratley, Fox, Niederreiter, ACM Trans. Model. Comp. Sim. 2, 195 (1992) */ #include #include #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= bigm) { for(r=kj+1; rcj[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_dimnextq[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_dimnextq[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_dimnextq[i_dim] ^= n_state->cj[r][i_dim]; } n_state->sequence_count++; return GSL_SUCCESS; } gsl-doc-2.3/qrng/inline.c0000664000175000017500000000034612616157443013367 0ustar eddedd/* Author: G. Jungman */ #include #include #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-doc-2.3/qrng/Makefile.in0000644000175000017500000010426313022372406014001 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslqrng_la_LIBADD = am_libgslqrng_la_OBJECTS = qrng.lo niederreiter-2.lo sobol.lo \ halton.lo reversehalton.lo inline.lo libgslqrng_la_OBJECTS = $(am_libgslqrng_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = 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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslqrng.la pkginclude_HEADERS = gsl_qrng.h AM_CPPFLAGS = -I$(top_srcdir) libgslqrng_la_SOURCES = gsl_qrng.h qrng.c niederreiter-2.c sobol.c halton.c reversehalton.c inline.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu qrng/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslqrng.la: $(libgslqrng_la_OBJECTS) $(libgslqrng_la_DEPENDENCIES) $(EXTRA_libgslqrng_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslqrng_la_OBJECTS) $(libgslqrng_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/halton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/niederreiter-2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reversehalton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/qrng/ChangeLog0000664000175000017500000000227712616157443013524 0ustar eddedd2009-07-09 Brian Gough * qrng.c (gsl_qrng_free): handle NULL argument in free 2008-07-03 Brian Gough * qrng.c: moved gsl_qrng_get to inline.c * gsl_qrng.h (gsl_qrng_get): new inline declaration * inline.c: handle inline functions separately * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-03-17 Brian Gough * reversehalton.c (reversehalton_init): removed unused variable i * halton.c (halton_init): removed unused variable i 2006-04-21 Brian Gough * qrng.c gsl_qrng.h: use q instead of r in all prototypes 2004-05-26 Brian Gough * test.c: added for exit() 2002-11-16 Brian Gough * niederreiter-2.c (calculate_cj): clear uninitialized memory Mon Apr 22 19:20:05 2002 Brian Gough * 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 * qrng.c (gsl_qrng_get): use an array type for the array arguments, rather than a pointer gsl-doc-2.3/qrng/halton.c0000664000175000017500000002415212616157443013377 0ustar eddedd/* Authors: O. Teytaud * Copyright (C) 2007 O. Teytaud * (all comments welcome at olivier.teytaud@inria.fr) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Implementation for Halton generator. See [J.H. Halton, On the * efficiency of certain quasi-random sequences of points in * evaluating multi-dimensional integrals Numerische Mathematik, 1960] */ #include #include /* maximum allowed space dimension */ #define HALTON_MAX_DIMENSION 1229 /* prototypes for generator type functions */ static size_t halton_state_size (unsigned int dimension); static int halton_init (void *state, unsigned int dimension); static int halton_get (void *state, unsigned int dimension, double *v); /* global Halton generator type object */ static const gsl_qrng_type halton_type = { "halton", HALTON_MAX_DIMENSION, halton_state_size, halton_init, halton_get }; const gsl_qrng_type *gsl_qrng_halton = &halton_type; /* prime numbers (thanks to trolltech http://doc.trolltech.com/3.2/primes.html) */ static const int prime_numbers[HALTON_MAX_DIMENSION] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973 }; /* Halton generator state. * sequence_count = number of calls with this generator */ typedef struct { unsigned int sequence_count; } halton_state_t; static size_t halton_state_size (unsigned int dimension) { return sizeof (halton_state_t); } static int halton_init (void *state, unsigned int dimension) { halton_state_t *h_state = (halton_state_t *) state; h_state->sequence_count = 0; if (dimension < 1 || dimension > HALTON_MAX_DIMENSION) { return GSL_EINVAL; } return GSL_SUCCESS; } static double vdcorput (int x, int b) { double r = 0.; double v = 1.; double binv = 1. / (double) b; while (x > 0) { v *= binv; r += v * (double) (x % b); x /= b; } return r; } static int halton_get (void *state, unsigned int dimension, double *v) { halton_state_t *h_state = (halton_state_t *) state; unsigned int i; if (dimension < 1 || dimension > HALTON_MAX_DIMENSION) { return GSL_EINVAL; } h_state->sequence_count++; for (i = 0; i < dimension; i++) { v[i] = vdcorput (h_state->sequence_count, prime_numbers[i]); } return GSL_SUCCESS; } gsl-doc-2.3/qrng/test.c0000664000175000017500000001505112616157443013067 0ustar eddedd/* Author: G. Jungman (+modifications from O. Teytaud olivier.teytaud@inria.fr) */ #include #include #include #include #include #include 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_halton(void) { int status = 0; double v[1229]; unsigned int i; /* test in dimension 1229 */ gsl_qrng * g = gsl_qrng_alloc(gsl_qrng_halton, 1229); for (i=0;i<30;i++) gsl_qrng_get(g, v); gsl_qrng_free(g); gsl_test (status, "Halton d=1229"); status = 0; /* test in dimension 2 */ /*should be * 0.5 0.333333 * 0.25 0.666667 * 0.75 0.111111 * 0.125 0.444444*/ g = gsl_qrng_alloc(gsl_qrng_halton, 2); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_test_rel (v[0], 3.0/4.0, 1e-3, "halton(2) k=2 v[0]"); gsl_test_rel (v[1], 1.0/9.0, 1e-3, "halton(2) k=2 v[1]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 1.0/8.0, 1e-3, "halton(2) k=3 v[0]"); gsl_test_rel (v[1], 4.0/9.0, 1e-3, "halton(2) k=3 v[1]"); gsl_qrng_free(g); /* test in dimension 3 */ g = gsl_qrng_alloc(gsl_qrng_halton, 3); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.75, 1e-3, "halton(3) k=3 v[0]"); gsl_test_rel (v[1], 1.0/9.0, 1e-3, "halton(3) k=3 v[1]"); gsl_test_rel (v[2], 0.6, 1e-3, "halton(3) k=3 v[2]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.125, 1e-3, "halton(3) k=4 v[0]"); gsl_test_rel (v[1], 4.0/9.0, 1e-3, "halton(3) k=4 v[1]"); gsl_test_rel (v[2], 0.8, 1e-3, "halton(3) k=4 v[2]"); gsl_qrng_init(g); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.75, 1e-3, "halton(3) reinitialized k=3 v[0]"); gsl_test_rel (v[1], 1.0/9.0, 1e-3, "halton(3) reinitialized k=3 v[1]"); gsl_test_rel (v[2], 0.6, 1e-3, "halton(3) reinitialized k=3 v[2]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.125, 1e-3, "halton(3) reinitialized k=4 v[0]"); gsl_test_rel (v[1], 4.0/9.0, 1e-3, "halton(3) reinitialized k=4 v[1]"); gsl_test_rel (v[2], 0.8, 1e-3, "halton(3) reinitialized k=4 v[2]"); gsl_qrng_free(g); } void test_reversehalton(void) { int status = 0; double v[3]; /* test in dimension 2 */ gsl_qrng * g = gsl_qrng_alloc(gsl_qrng_reversehalton, 2); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); /* should be * 0.5 0.666667 * 0.25 0.333333 * 0.75 0.222222 * 0.125 0.888889*/ gsl_test_rel (v[0], 3.0/4.0, 1e-3, "reversehalton(2) k=2 v[0]"); gsl_test_rel (v[1], 2.0/9.0, 1e-3, "reversehalton(2) k=2 v[1]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 1.0/8.0, 1e-3, "reversehalton(2) k=2 v[0]"); gsl_test_rel (v[1], 8.0/9.0, 1e-3, "reversehalton(2) k=2 v[1]"); gsl_qrng_free(g); /* test in dimension 3 */ g = gsl_qrng_alloc(gsl_qrng_reversehalton, 3); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.75, 1e-3, "reversehalton(3) k=3 v[0]"); gsl_test_rel (v[1], 2.0/9.0, 1e-3, "reversehalton(3) k=3 v[1]"); gsl_test_rel (v[2], 0.4, 1e-3, "reversehalton(3) k=3 v[2]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.125, 1e-3, "reversehalton(3) k=3 v[0]"); gsl_test_rel (v[1], 8.0/9.0, 1e-3, "reversehalton(3) k=3 v[1]"); gsl_test_rel (v[2], 0.2, 1e-3, "reversehalton(3) k=3 v[2]"); status = 0; gsl_qrng_init(g); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.75, 1e-3, "reversehalton(3) reinitialized k=3 v[0]"); gsl_test_rel (v[1], 2.0/9.0, 1e-3, "reversehalton(3) reinitialized k=3 v[1]"); gsl_test_rel (v[2], 0.4, 1e-3, "reversehalton(3) reinitialized k=3 v[2]"); gsl_qrng_get(g, v); gsl_test_rel (v[0], 0.125, 1e-3, "reversehalton(3) reinitialized k=3 v[0]"); gsl_test_rel (v[1], 8.0/9.0, 1e-3, "reversehalton(3) reinitialized k=3 v[1]"); gsl_test_rel (v[2], 0.2, 1e-3, "reversehalton(3) reinitialized k=3 v[2]"); gsl_qrng_free(g); } 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_halton(); test_reversehalton(); test_nied2(); exit (gsl_test_summary ()); } gsl-doc-2.3/THANKS0000644000175000017500000004163212737536472011721 0ustar eddedd* Jim McElwaine for very useful comments and discussions about the dilogarithm and related functions. * Simone Piccardi for extensions to the histogram routines, and providing the ntuple code * Nelson H. F. Beebe for references and testing the software on many different platforms. * Tim Mooney for IEEE support for Tru64, AIX, IRIX, fixes for odes, and testing * Thomas Walter for heapsort routines, cholesky decomposition, bug reports and useful suggestions * Jorma Olavi Tähtinen for complex arithmetic functions * Barak Pearlmutter * Frederick W. Wheeler * Bernd Petrovitsch * Jacek Pliszka for bug report * Michele Clark for bug report * Jeffrey Russell Horner for information on CBLAS * Rahul V. Herwadkar for testing * Trond Bo for bug report * Jan Kasprzak for bug report * David Kaelbling for testing * Mark Levedahl for bug report * David Billinghurst for testing * Jean-Bernard ADDOR for bug report * Fabrice Rossi bug reports and suggestions * Paul Walmsley for bug report and patch for fixing matmult. * Dave Morrison for advice on build procedure and various patches, the diff/ numerical differentiation routines, multmin documentation, and Landau distribution * Brett Viren for debugging qpsrt.c. * Christopher Gabriel contributed the gsl-config and gsl.m4 we use. * C M Murphy patch to fix up consts in header files * Bracy H. Elton for correcting a reference in the FFT Algorithms document * Tadhg O'Meara for finding a bug in gsl-randist * Steve Robbins patch to work around FP_RND problems on Tru64, testing and other patches., bug fix for nm_simplex algorithm. * John Fisher testing on powerpc linux and support for fp-ppclinux.c * OKUJI Yoshinori for a patch for fp-x86linux.c for libc5 * Pablo Bianucci for patches to complex matrix/vectors * Toby White for several patches and improvements to the design, OpenBSD support * Bill Brower for bug report on gsl.m4 * Vladimir Kushnir for ieee support for FreeBSD * F J Franklin for test reports and debugging * Keith Briggs for bug reports and code for the skewed Levy alpha-stable variates gsl_ran_levy_skew * Vince for permutation iterator functions * Henry Sobotka for ieee support for OS/2 and bug fixes * Remy Bruno for bug fix * M. Lavasani for bug reports and testing on HPUX11 * Jason Beegan for NetBSD support * Zeger Knops for bug fix * Rodney Sparapani for Darwin support * Ramin Nakisa for bug reports * Achim Gaedke for bug reports and suggestions, additional histogram code, PyGSL python interface, 2d histogram statistics, bug fixes for simulated annealing * Eric Rose for bug report and useful tip on casting * M Joonas Pihlaja for bug reports * Albert Chin for bug reports, patches, and providing HP-UX platforms for testing * Asterio Gonzalez for a bug report for multmin * Carlo Perassi for implementing the random number generators in Knuth's Seminumerical Algorithms, 3rd Ed. * Dan, Ho-Jin for divided differences interpolation routines * Stefan Koch for useful bug reports and fixes for the special functions * Szymon Jaroszewicz for the combinations modules and bug reports * Theis Peter Hansen fixed unchecked status values in multiroots * Jungemann Markus 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 documentation bug reports * Karsten Howes siman bug fix * Vladimir Savichev bug reports * Jochen Küpper doc bug fixes, additional constants * John Ketchum for bug reports for the blas library * Nicolas Darnis additional permutation functions * Jeff Spirko patch for 1d minimization * David Necas (Yeti) bug reports and patches for linear algebra, interpolation, additional tridiagonal solvers * for bug report * Christian T. Steigies for documentation bug report * Atakan Gurkan for bug reports and patches for the random number generators. * David Ronis for bug reports and patches * Christian T. Steigies for a documentation fix * Teun Burgers improvements to configure script * Olivier Andrieu bug report for Chebyschev memory leak * Hiroshi Imamura extension to psi(1+iy) * Taliver Heath keep track of best solution in siman_solve. * Trevor Blackwell bug report test case for SVD d_n = 0, bug fix to mt19937 generator * Nicolas Bock documentation bug report * Alan Aspuru-Guzik documentation bug report * Peter S. Christopher bug fix for simulated annealing * Gene Carter build shared libraries on MacOS X * Fabian Jakobs fixed a bug in gsl_linalg_bidiag_unpack_B, and documentation bug-fix for blas * Gavin Crooks documentation bug fix, dirichlet distribution, multinomial distribution * Gert Van den Eynde gsl_ldexp, gsl_frexp, gsl_fcmp * Reinhold Bader , fixes for Hitachi SR8000 * Slaven Peles , build options for Compaq cc, doc bug fix * David Favis-Mortlock bug report for gsl_rng_taus2 seeding * Alexander Babansky documentation bug report for Ei(x) * Tiago de Paula Peixoto bug report for multifit memory allocation * Adam Johansen bug report for eigenvalue routines * Wolfgang Hoermann bug report for niederreiter qrng * Jerome Houdayer bug report for taus seeding * Conrad Curry bug and documentation reports * Erik Schnetter documentation bug reports * Maarten De Munck bug fix for vector/matrix get * Axel Hutt bug fix for QAWC integration, documentation bug fix * Martin Jansche various bug reports * Gregory Soyez documentation bug report * Attilio Rivoldini bug report for CBLAS tests * W.M. Vissers bug report for gsl_complex_arccsc_real * Paolo Redaelli bug report for chebyshev functions * Andrew Howard bug report for gsl_ran_discrete * Heiko Bauke bug reports and patches for random number generators * Vincent Sacksteder bug reports for MSVC7 * Peter Verveer improvement to memory usage of MINPACK routines * Mario Pernici 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 provided a much-needed bug fix for the conjugate gradient algorithm multidimensional minimisers. * Krzysztof Pachucki bug report for gsl_sf_hypergU_int * Carsten Svaneborg documentation bug report * Liguo Song documentation bug report * Carlo Ferrigno bug report for CGS units * Giulio Bottazzi many useful bug reports * Olaf Lenz rng frwite/fread, bug reports * Jamie Lokier for testing * Grant Lythe documentation bug report * Jussi Piitulainen documentation bug report * Aaron Schweiger bug report for SVD/column balancing * Carlo Ferrigno bug report about const problems * Jussi Piitulainen documenation bug report for gsl_ran_hypergeometric_pdf * Bas Zoetekouw documentation bug report * Paul Sydney bug report and patch for min/brent.c * Alexei Podtelezhnikov patch for sphere.c * Neil Bushong documentation typo bug report * Brad Bell documentation bug report * Andreas Schneider <1@c07.de> bug report for R250 * Luigi Ballabio fix m4 quoting in gsl.m4 * Zbigniew Koza documentation bug fix for odes * James Scott fix for linalg tests on MSVC * Rémi Butel fixes for multimin overflow conditions * Andris Pavenis Makefile fix for EXEEXT * Daniel Webb bug report for potential cspline division by zero * Ewald Stamp bugfix for vector/swap_source.c * Joerg Wensch LQ decompositions * Jason Stover patch for cdf/beta.c, inverse cumulative distributions, discrete cumulative distributions * Ralph Menikoff bug report for gsl_sf_expint_scaled * Yoshiki documentation bug report * Nigel Lowry documentation proofreading * Giulio Bottazzi cdf for exponential power distribution, bug reports * Tuomo Keskitalo many improvements to ode-initval * Britton Kerin documentation bug reports * Patricio Rojo patch for numerical instability in interpolation integrate function * Damir Herman improved accuracy of histogram range calculations * John Salmon bug report for gsl_cheb_eval_n_err * Dirk Eddelbuettel for bug reports and testing, and maintaining the Debian package for GSL. * Jari Häkkinen for svd bug reports, rng bug reports * Marco Canini patch for IXP2400 Xscale * Ben Klemens bug report for sorting vectors with NANs * Peter Brommer bug report and patch for Brent minimisation algorithm. * Gabriel Withington typo in docs * Stewart V. Wright patch for missing spline functions * Richard Mathar additional Debye functions n=5,6, handle case x==1 in 2F1. * Stefan Jahn bug fix for periodic cubic splines with n=3 * Yoram Burak bug report for scaled bessel function In_scaled * Mario Santos bug report for spherical bessel function * Vincent Plagnol bug report for gsl_randist_binomial_pdf * John Houck bug report for gsl_sf_synchrotron_1 * Jochen Voss ziggurat gaussian generator * John D Lamb Marsaglia-Tsang gamma generator, bug reports * Giulio Bottazzi improved exponential power distribution and gsl_multifit_linear_est * Charles Karney added Leva bounds to gaussian ratio method generator * Torquil Sorenson documentation bug fixes for FFTs * Yajun Wang - bug report for multifit n

- patch for Macos X on Intel * Lowell Johnson - implementation of mathieu functions * Brian Gladman - useful bug reports * B. Lazarov - compilation bug report for randist * Harald Moseby - special functions bug reports * Neil Harvey - bug report for beta pdf * Felipe G. Nievinski - documentation bug report * Daisuke TOMINAGA - Japanese translation of manual and numerous corrections * Andoline Bucciolini - documentation bug for BLAS * Daniel Falster bug report for fdist_Pinv * Giancarlo Marra bug report for M_PI_4 * Alan Irwin for sample implementation of improved BFGS algorithm. * Lionel Barnett for pointing out an error in the elliptic integrals * Ed Smith-Rowland <3dw4rd@verizon.net> patch for laguerre polynomials * Katrin Wolff bug report for Lambert W function * "Heikki Orsila " cleaning up siman code * Eugene Loh bug report for gsl_log1p * Richard Smith bug report and suggestions for correct use of isfinite * Marco Lombardi bug report for svd * I J Wilson bug report for dirichlet function * Justin Lenzo bug reports for vector/matrix tests. * Sebastian Queißer bug report for gsl_cdf_beta_Pinv * Andries Brouwer bug report for underflow in symmetric eigenvalues * Mingxi Wu bug report for multinomial pdf * Chris Mihelich bug reports and suggestions for gsl_ldexp and gsl_frexp * Frank Reininghaus complex polynomial evaluation and ode improvements * Jason Coy optimisation for dwt.c * Richard Guenther bug reports * Stijn van Dongen bug fix for overflow in gsl_cdf_hypergeometric_{P,Q} * Claude Dion documentation bug reports * Michael Kuklik bug report for simplex * Paul Accisano, bug report and fix for cyclic solver * Thomas Weber bug and patch for interp accelerator * Lori A. Pritchett-Sheats bug report for vegas chisq. * Frank Wang bug report for gsl_ran_gamma_knuth. * Peter Johansson fix for make install prefix=PREFIX * Taneli Kalvas bug report for odes * Marco Maggi bug fix for gsl_blas_drotm * Mateus Araújo Santos - bug fix for LM set * James Howse - quad_golden minimisation algorithm * Marc JOURDAIN - polynomial derivatives function * Andrew Steiner - for bug reports * Ettl Martin - bug report, rk4 memory * Yevgeniy Naumovich - bspline allocators fix * Huan Wu - gsl_linalg_complex_cholesky_invert * Ralf Wildenhues - numerous proofreading corrections * Thomas Tanner - bug report for gsl_sf_beta_inc * Sam Mason - bug fix for gsl_pow_int * José Luis García Pallero - error checking for GSL cblas * Teemu Ikonen patch for gsl_ran_chisq_pdf * Evgeny Kurbatov - patch for error handling in interpolation routines * Michel Kern - fix for singular Jacobian in Newton solver * Nikolay Simakov - bug report for gsl_eigen_jacobi * Jim Ward - numerous bug reports and useful suggestions * Josh Neil & Curt Hash - patch for negative binomial * Maximilian Treiber - bug report for gsl_sf_lncosh * Martin Landriau bug report for 3j coupling * Grigory I. Rubtsov - extend range of 3j * Matthias Sitte - bug report and patch for failing complex matrix IO routines * Raymond Rogers - bug fixes for confluent hypergeometric functions gsl-doc-2.3/multifit_nlinear/0000755000175000017500000000000013022553154014325 5ustar eddeddgsl-doc-2.3/multifit_nlinear/test_kowalik.c0000644000175000017500000001021212771454257017203 0ustar eddedd#define kowalik_N 11 #define kowalik_P 4 static double kowalik_x0[kowalik_P] = { 0.25, 0.39, 0.415, 0.39 }; static double kowalik_epsrel = 1.0e-6; static double kowalik_Y[kowalik_N] = { 0.1957, 0.1947, 0.1735, 0.1600, 0.0844, 0.0627, 0.0456, 0.0342, 0.0323, 0.0235, 0.0246 }; static double kowalik_U[kowalik_N] = { 4.0000, 2.0000, 1.0000, 0.5000, 0.2500, 0.1670, 0.1250, 0.1000, 0.0833, 0.0714, 0.0625 }; static void kowalik_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; gsl_vector_const_view v = gsl_vector_const_view_array(x, kowalik_P); const double norm = gsl_blas_dnrm2(&v.vector); const double sumsq_exact1 = 3.075056038492370e-04; double kowalik_x1[kowalik_P] = { 1.928069345723978e-01, 1.912823290344599e-01, 1.230565070690708e-01, 1.360623308065148e-01 }; const double sumsq_exact2 = 0.00102734304869549252; double kowalik_x2[kowalik_P] = { 0.0, /* inf */ -14.0758834005984603, 0.0, /* -inf */ 0.0 }; /* -inf */ const double *kowalik_x; double sumsq_exact; kowalik_x2[0] = GSL_NAN; kowalik_x2[2] = GSL_NAN; kowalik_x2[3] = GSL_NAN; if (norm < 10.0) { kowalik_x = kowalik_x1; sumsq_exact = sumsq_exact1; } else { kowalik_x = kowalik_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kowalik_P; ++i) { if (!gsl_finite(kowalik_x[i])) continue; gsl_test_rel(x[i], kowalik_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kowalik_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double yi = kowalik_Y[i]; double ui = kowalik_U[i]; double fi = yi - (x1*ui*(ui+x2)) / (x4 + ui*(ui + x3)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kowalik_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double ui = kowalik_U[i]; double term1 = ui*(ui + x2); double term2 = ui*(ui + x3) + x4; gsl_matrix_set(J, i, 0, -term1 / term2); gsl_matrix_set(J, i, 1, -ui*x1/term2); gsl_matrix_set(J, i, 2, ui*term1*x1 / (term2*term2)); gsl_matrix_set(J, i, 3, term1*x1 / (term2*term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kowalik_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); size_t i; for (i = 0; i < kowalik_N; ++i) { double ui = kowalik_U[i]; double term2 = ui*(ui + x3) + x4; double term3 = ui*ui*v1 - ui*v3*x1 - v4*x1 + ui*v1*x3 + v1*x4; double term4 = ui*ui*(v3-v2) + v4*x2 + ui*(v4 + v3*x2 - v2*x3) - v2*x4; gsl_vector_set(fvv, i, 2.0*ui*term3*term4 / pow(term2, 3.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf kowalik_func = { kowalik_f, kowalik_df, kowalik_fvv, kowalik_N, kowalik_P, NULL, 0, 0, 0 }; static test_fdf_problem kowalik_problem = { "kowalik", kowalik_x0, NULL, NULL, &kowalik_epsrel, &kowalik_checksol, &kowalik_func }; gsl-doc-2.3/multifit_nlinear/test_brown2.c0000644000175000017500000000651112771454121016750 0ustar eddedd#define brown2_N 5 #define brown2_P 5 static double brown2_x0[brown2_P] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; static double brown2_epsrel = 1.0e-12; static void brown2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; double sumsq_exact; double alpha; const double p = (double) brown2_P; double alpha1mp, lhs, lastel; if (sumsq < 0.5) { /* sumsq = 0 case */ sumsq_exact = 0.0; alpha = x[0]; alpha1mp = pow(alpha, 1.0 - p); lhs = p*pow(alpha, p) - (p + 1)/alpha1mp; lastel = alpha1mp; gsl_test_rel(lhs, -1.0, epsrel, "%s/%s alpha lhs", sname, pname); } else { /* sumsq = 1 case */ sumsq_exact = 1.0; alpha = 0.0; lastel = p + 1.0; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < brown2_P - 1; ++i) { gsl_test_rel(x[i], alpha, epsrel, "%s/%s i=%zu", sname, pname, i); } gsl_test_rel(x[brown2_P - 1], lastel, epsrel, "%s/%s last element", sname, pname); } static int brown2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = -(brown2_N + 1.0); double prod = 1.0; for (i = 0; i < brown2_N; ++i) { double xi = gsl_vector_get(x, i); sum += xi; prod *= xi; } for (i = 0; i < brown2_N - 1; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi + sum); } gsl_vector_set(f, brown2_N - 1, prod - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown2_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (j = 0; j < brown2_P; ++j) { double prod = 1.0; for (i = 0; i < brown2_N - 1; i++) { double Jij = (i == j) ? 2.0 : 1.0; gsl_matrix_set(J, i, j, Jij); } for (i = 0; i < brown2_N; i++) { if (i != j) prod *= gsl_vector_get(x, i); } gsl_matrix_set(J, brown2_N - 1, j, prod); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i, j, k; double sum = 0.0; gsl_vector_set_zero(fvv); for (k = 0; k < brown2_P; ++k) { double vk = gsl_vector_get(v, k); for (i = 0; i < brown2_P; ++i) { double vi = gsl_vector_get(v, i); double delta = (i == k) ? 1.0 : 0.0; double prod = 1.0; for (j = 0; j < brown2_N; ++j) { if (j != i && j != k) { double xj = gsl_vector_get(x, j); prod *= xj; } } sum += vk * vi * (1.0 - delta) * prod; } } gsl_vector_set(fvv, brown2_N - 1, sum); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf brown2_func = { brown2_f, brown2_df, brown2_fvv, brown2_N, brown2_P, NULL, 0, 0, 0 }; static test_fdf_problem brown2_problem = { "brown_almost_linear", brown2_x0, NULL, NULL, &brown2_epsrel, &brown2_checksol, &brown2_func }; gsl-doc-2.3/multifit_nlinear/test_powell1.c0000644000175000017500000000552412771454337017136 0ustar eddedd#define powell1_N 4 #define powell1_P 4 static double powell1_x0[powell1_P] = { 3.0, -1.0, 0.0, 1.0 }; static double powell1_epsrel = 1.0e-4; static void powell1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell1_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); gsl_vector_set(f, 0, x1 + 10.0*x2); gsl_vector_set(f, 1, sqrt(5.0) * (x3 - x4)); gsl_vector_set(f, 2, pow(x2 - 2.0*x3, 2.0)); gsl_vector_set(f, 3, sqrt(10.0) * pow((x1 - x4), 2.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell1_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get (x, 0); double x2 = gsl_vector_get (x, 1); double x3 = gsl_vector_get (x, 2); double x4 = gsl_vector_get (x, 3); double term1 = x2 - 2.0*x3; double term2 = x1 - x4; gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 0, 2, 0.0); gsl_matrix_set(J, 0, 3, 0.0); gsl_matrix_set(J, 1, 0, 0.0); gsl_matrix_set(J, 1, 1, 0.0); gsl_matrix_set(J, 1, 2, sqrt(5.0)); gsl_matrix_set(J, 1, 3, -sqrt(5.0)); gsl_matrix_set(J, 2, 0, 0.0); gsl_matrix_set(J, 2, 1, 2.0*term1); gsl_matrix_set(J, 2, 2, -4.0*term1); gsl_matrix_set(J, 2, 3, 0.0); gsl_matrix_set(J, 3, 0, 2.0*sqrt(10.0)*term2); gsl_matrix_set(J, 3, 1, 0.0); gsl_matrix_set(J, 3, 2, 0.0); gsl_matrix_set(J, 3, 3, -2.0*sqrt(10.0)*term2); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, 2.0 * pow(v2 - 2.0*v3, 2.0)); gsl_vector_set(fvv, 3, 2.0 * sqrt(10.0) * pow(v1 - v4, 2.0)); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf powell1_func = { powell1_f, powell1_df, powell1_fvv, powell1_N, powell1_P, NULL, 0, 0, 0 }; static test_fdf_problem powell1_problem = { "powell_singular", powell1_x0, NULL, NULL, &powell1_epsrel, &powell1_checksol, &powell1_func }; gsl-doc-2.3/multifit_nlinear/test_kirby2.c0000644000175000017500000001562112771454251016747 0ustar eddedd#define kirby2_N 151 #define kirby2_P 5 static double kirby2_x0a[kirby2_P] = { 2.0, -0.1, 0.003, -0.001, 0.00001 }; static double kirby2_x0b[kirby2_P] = { 1.5, -0.15, 0.0025, -0.0015, 0.00002 }; static double kirby2_x[kirby2_P] = { 1.6745063063E+00, -1.3927397867E-01, 2.5961181191E-03, -1.7241811870E-03, 2.1664802578E-05 }; static double kirby2_epsrel = 1.0e-5; static double kirby2_sigma[kirby2_P] = { 8.7989634338E-02, 4.1182041386E-03, 4.1856520458E-05, 5.8931897355E-05, 2.0129761919E-07 }; static double kirby2_F1[kirby2_N] = { 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 }; static double kirby2_F0[kirby2_N] = { 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 }; static void kirby2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 3.9050739624E+00; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < kirby2_P; ++i) { gsl_test_rel(x[i], kirby2_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int kirby2_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double y = ((b[0] + t* (b[1] + t * b[2])) / (1 + t*(b[3] + t *b[4]))); gsl_vector_set (f, i, kirby2_F1[i] - y); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kirby2_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[kirby2_P]; size_t i; for (i = 0; i < kirby2_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double u = (b[0] + t*(b[1] + t*b[2])); double v = (1 + t*(b[3] + t*b[4])); gsl_matrix_set (df, i, 0, -1/v); gsl_matrix_set (df, i, 1, -t/v); gsl_matrix_set (df, i, 2, -t*t/v); gsl_matrix_set (df, i, 3, t*u/(v*v)); gsl_matrix_set (df, i, 4, t*t*u/(v*v)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int kirby2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); size_t i; for (i = 0; i < kirby2_N; i++) { double t = kirby2_F0[i]; double term1 = 1.0 + t*(x4 + t*x5); gsl_vector_set(fvv, i, -2*t/pow(term1, 3.0) * (v4 + t*v5) * (-t*(-v2 + v4*x1 + t*(-v3 + v5*x1 + v4*x2 + t*v5*x2 + t*(v4+t*v5)*x3)) + t*t*(v2 + t*v3)*(x4 + t*x5) + v1*(1.0 + t*(x4 + t*x5)))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf kirby2_func = { kirby2_f, kirby2_df, kirby2_fvv, kirby2_N, kirby2_P, NULL, 0, 0, 0 }; static test_fdf_problem kirby2a_problem = { "nist-kirby2a", kirby2_x0a, NULL, kirby2_sigma, &kirby2_epsrel, &kirby2_checksol, &kirby2_func }; static test_fdf_problem kirby2b_problem = { "nist-kirby2b", kirby2_x0b, NULL, kirby2_sigma, &kirby2_epsrel, &kirby2_checksol, &kirby2_func }; gsl-doc-2.3/multifit_nlinear/subspace2D.c0000644000175000017500000005313512764322712016501 0ustar eddedd/* multifit_nlinear/subspace2D.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module implements a 2D subspace trust region subproblem method, * as outlined in * * [1] G. A. Shultz, R. B. Schnabel, and R. H. Byrd * A Family of Trust-Region-Based Algorithms for Unconstrained * Minimization with Strong Global Convergence Properties, * SIAM Journal on Numerical Analysis 1985 22:1, 47-67 * * [2] R. H. Byrd, R. B. Schnabel, G. A. Shultz, * Approximate solution of the trust region problem by * minimization over two-dimensional subspaces, * Mathematical Programming, January 1988, Volume 40, * Issue 1, pp 247-263 * * The idea is to solve: * * min_{dx} g^T dx + 1/2 dx^T B dx * * with constraints: * * ||D dx|| <= delta * dx \in span{dx_sd, dx_gn} * * where B is the Hessian matrix, B = J^T J * * The steps are as follows: * * 1. preloop: * a. Compute Gauss-Newton and steepest descent vectors, * dx_gn, dx_sd * b. Compute an orthonormal basis for span(D dx_sd, D dx_gn) by * constructing W = [ D dx_sd, D dx_gn ] and performing a QR * decomposition of W. The 2 columns of the Q matrix * will then span the column space of W. W should have rank 2 * unless D*dx_sd and D*dx_gn are parallel, in which case it will * have rank 1. * c. Precompute various quantities needed for the step calculation * * 2. step: * a. If the Gauss-Newton step is inside the trust region, use it * b. if W has rank 1, we cannot form a 2D subspace, so in this case * follow the steepest descent direction to the trust region boundary * and use that as the step. * c. In the full rank 2 case, if the GN point is outside the trust region, * then the minimizer of the objective function lies on the trust * region boundary. Therefore the minimization problem becomes: * * min_{dx} g^T dx + 1/2 dx^T B dx, with ||dx|| = delta, dx = Q * x * * where x is a 2-vector to be determined and the columns of Q are * the orthonormal basis vectors of the subspace. Note the equality * constraint now instead of <=. In terms of the new variable x, * the minimization problem becomes: * * min_x subg^T x + 1/2 x^T subB x, with ||Q*x|| = ||x|| = delta * * where: * subg = Q^T g (2-by-1) * subB = Q^T B Q (2-by-2) * * This equality constrained 2D minimization problem can be solved * with a Lagrangian multiplier, which results in a 4th degree polynomial * equation to be solved. The equation is: * * lambda^4 1 * + lambda^3 2 tr(B) * + lambda^2 (tr(B)^2 + 2 det(B) - g^T g / delta^2) * + lambda^1 (2 det(B) tr(B) - 2 g^T adj(B)^T g / delta^2) * + lambda^0 (det(B)^2 - g^T adj(B)^T adj(B) g / delta^2) * * where adj(B) is the adjugate matrix of B. * * We then check each of the 4 solutions for lambda to determine which * lambda results in the smallest objective function value. This x * is then used to construct the final step: dx = Q*x */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *dx_gn; /* Gauss-Newton step, size p */ gsl_vector *dx_sd; /* steepest descent step, size p */ double norm_Dgn; /* || D dx_gn || */ double norm_Dsd; /* || D dx_sd || */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ gsl_matrix *W; /* orthonormal basis for 2D subspace, p-by-2 */ gsl_matrix *JQ; /* J * Q, n-by-p */ gsl_vector *tau; /* Householder scalars */ gsl_vector *subg; /* subspace gradient = W^T g, 2-by-1 */ gsl_matrix *subB; /* subspace Hessian = W^T B W, 2-by-2 */ gsl_permutation *perm; /* permutation matrix */ double trB; /* Tr(subB) */ double detB; /* det(subB) */ double normg; /* || subg || */ double term0; /* g^T adj(B)^T adj(B) g */ double term1; /* g^T adj(B)^T g */ size_t rank; /* rank of [ dx_sd, dx_gn ] matrix */ gsl_poly_complex_workspace *poly_p; /* tunable parameters */ gsl_multifit_nlinear_parameters params; } subspace2D_state_t; #include "common.c" static void * subspace2D_alloc (const void * params, const size_t n, const size_t p); static void subspace2D_free(void *vstate); static int subspace2D_init(const void *vtrust_state, void *vstate); static int subspace2D_preloop(const void * vtrust_state, void * vstate); static int subspace2D_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int subspace2D_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static int subspace2D_solution(const double lambda, gsl_vector * x, subspace2D_state_t * state); static double subspace2D_objective(const gsl_vector * x, subspace2D_state_t * state); static int subspace2D_calc_gn(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx); static int subspace2D_calc_sd(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx, subspace2D_state_t * state); static void * subspace2D_alloc (const void * params, const size_t n, const size_t p) { const gsl_multifit_nlinear_parameters *par = (const gsl_multifit_nlinear_parameters *) params; subspace2D_state_t *state; state = calloc(1, sizeof(subspace2D_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate subspace2D state", GSL_ENOMEM); } state->dx_gn = gsl_vector_alloc(p); if (state->dx_gn == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_gn", GSL_ENOMEM); } state->dx_sd = gsl_vector_alloc(p); if (state->dx_sd == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_sd", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->W = gsl_matrix_alloc(p, 2); if (state->W == NULL) { GSL_ERROR_NULL ("failed to allocate space for W", GSL_ENOMEM); } state->JQ = gsl_matrix_alloc(n, p); if (state->JQ == NULL) { GSL_ERROR_NULL ("failed to allocate space for JQ", GSL_ENOMEM); } state->tau = gsl_vector_alloc(2); if (state->tau == NULL) { GSL_ERROR_NULL ("failed to allocate space for tau", GSL_ENOMEM); } state->subg = gsl_vector_alloc(2); if (state->subg == NULL) { GSL_ERROR_NULL ("failed to allocate space for subg", GSL_ENOMEM); } state->subB = gsl_matrix_alloc(2, 2); if (state->subB == NULL) { GSL_ERROR_NULL ("failed to allocate space for subB", GSL_ENOMEM); } state->perm = gsl_permutation_alloc(2); if (state->perm == NULL) { GSL_ERROR_NULL ("failed to allocate space for perm", GSL_ENOMEM); } state->poly_p = gsl_poly_complex_workspace_alloc(5); if (state->poly_p == NULL) { GSL_ERROR_NULL ("failed to allocate space for poly workspace", GSL_ENOMEM); } state->n = n; state->p = p; state->rank = 0; state->params = *par; return state; } static void subspace2D_free(void *vstate) { subspace2D_state_t *state = (subspace2D_state_t *) vstate; if (state->dx_gn) gsl_vector_free(state->dx_gn); if (state->dx_sd) gsl_vector_free(state->dx_sd); if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); if (state->W) gsl_matrix_free(state->W); if (state->JQ) gsl_matrix_free(state->JQ); if (state->tau) gsl_vector_free(state->tau); if (state->subg) gsl_vector_free(state->subg); if (state->subB) gsl_matrix_free(state->subB); if (state->perm) gsl_permutation_free(state->perm); if (state->poly_p) gsl_poly_complex_workspace_free(state->poly_p); free(state); } /* subspace2D_init() Initialize subspace2D solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int subspace2D_init(const void *vtrust_state, void *vstate) { (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } /* subspace2D_preloop() Initialize subspace2D method prior to iteration loop. This involves computing the Gauss-Newton step and steepest descent step Notes: on output, 1) state->dx_gn contains Gauss-Newton step 2) state->dx_sd contains steepest descent step 3) state->rank contains the rank([dx_sd, dx_gn]) 4) if full rank subspace (rank = 2), then: state->trB = Tr(subB) state->detB = det(subB) state->normg = || subg || */ static int subspace2D_preloop(const void * vtrust_state, void * vstate) { int status; const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; gsl_vector_view v; double work_data[2]; gsl_vector_view work = gsl_vector_view_array(work_data, 2); int signum; /* calculate Gauss-Newton step */ status = subspace2D_calc_gn(trust_state, state->dx_gn); if (status) return status; /* now calculate the steepest descent step */ status = subspace2D_calc_sd(trust_state, state->dx_sd, state); if (status) return status; /* store norms */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); state->norm_Dsd = scaled_enorm(trust_state->diag, state->dx_sd); /* * now compute orthonormal basis for span(D dx_sd, D dx_gn) using * QR decomposition; set W = [ D dx_sd, D dx_gn ] and normalize each * column to unit magnitude. Then the Q matrix will form a basis for Col(W) */ v = gsl_matrix_column(state->W, 0); gsl_vector_memcpy(&v.vector, state->dx_sd); gsl_vector_mul(&v.vector, trust_state->diag); if (state->norm_Dsd != 0) gsl_vector_scale(&v.vector, 1.0 / state->norm_Dsd); v = gsl_matrix_column(state->W, 1); gsl_vector_memcpy(&v.vector, state->dx_gn); gsl_vector_mul(&v.vector, trust_state->diag); if (state->norm_Dgn != 0) gsl_vector_scale(&v.vector, 1.0 / state->norm_Dgn); /* use a rank revealing QR decomposition in case dx_sd and dx_gn * are parallel */ gsl_linalg_QRPT_decomp(state->W, state->tau, state->perm, &signum, &work.vector); /* check for parallel dx_sd, dx_gn, in which case rank will be 1 */ state->rank = gsl_linalg_QRPT_rank(state->W, -1.0); if (state->rank == 2) { /* * full rank subspace, compute: * subg = Q^T D^{-1} g * subB = Q^T D^{-1} B D^{-1} Q where B = J^T J */ const size_t p = state->p; size_t i; gsl_matrix_view JQ = gsl_matrix_submatrix(state->JQ, 0, 0, state->n, GSL_MIN(2, p)); double B00, B10, B11, g0, g1; /* compute subg */ gsl_vector_memcpy(state->workp, trust_state->g); gsl_vector_div(state->workp, trust_state->diag); gsl_linalg_QR_QTvec(state->W, state->tau, state->workp); g0 = gsl_vector_get(state->workp, 0); g1 = gsl_vector_get(state->workp, 1); gsl_vector_set(state->subg, 0, g0); gsl_vector_set(state->subg, 1, g1); /* compute subB */ /* compute J D^{-1} */ gsl_matrix_memcpy(state->JQ, trust_state->J); for (i = 0; i < p; ++i) { gsl_vector_view c = gsl_matrix_column(state->JQ, i); double di = gsl_vector_get(trust_state->diag, i); gsl_vector_scale(&c.vector, 1.0 / di); } /* compute J D^{-1} Q */ gsl_linalg_QR_matQ(state->W, state->tau, state->JQ); /* compute subB = Q^T D^{-1} J^T J D^{-1} Q */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &JQ.matrix, 0.0, state->subB); B00 = gsl_matrix_get(state->subB, 0, 0); B10 = gsl_matrix_get(state->subB, 1, 0); B11 = gsl_matrix_get(state->subB, 1, 1); state->trB = B00 + B11; state->detB = B00*B11 - B10*B10; state->normg = gsl_blas_dnrm2(state->subg); /* g^T adj(B)^T adj(B) g */ state->term0 = (B10*B10 + B11*B11)*g0*g0 - 2*B10*(B00 + B11)*g0*g1 + (B00*B00 + B10*B10)*g1*g1; /* g^T adj(B)^T g */ state->term1 = B11 * g0 * g0 + g1 * (B00*g1 - 2*B10*g0); } return GSL_SUCCESS; } /* subspace2D_step() Calculate a new step with 2D subspace method. Based on [1]. We seek a vector dx in span{dx_gn, dx_sd} which minimizes the model function subject to ||dx|| <= delta */ static int subspace2D_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else if (state->rank < 2) { /* rank of [dx_sd, dx_gn] is 1, meaning dx_sd and dx_gn * are parallel so we can't form a 2D subspace. Follow the steepest * descent direction to the trust region boundary as our step */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { int status; const double delta_sq = delta * delta; double u = state->normg / delta; double a[5]; double z[8]; #if 1 a[0] = state->detB * state->detB - state->term0 / delta_sq; a[1] = 2 * state->detB * state->trB - 2 * state->term1 / delta_sq; a[2] = state->trB * state->trB + 2 * state->detB - u * u; a[3] = 2 * state->trB; a[4] = 1.0; #else double TrB_D = state->trB * delta; double detB_D = state->detB * delta; double normg_sq = state->normg * state->normg; a[0] = detB_D * detB_D - state->term0; a[1] = 2 * state->detB * state->trB * delta_sq - 2 * state->term1; a[2] = TrB_D * TrB_D + 2 * state->detB * delta_sq - normg_sq; a[3] = 2 * state->trB * delta_sq; a[4] = delta_sq; #endif status = gsl_poly_complex_solve(a, 5, state->poly_p, z); if (status == GSL_SUCCESS) { size_t i; double min = 0.0; int mini = -1; double x_data[2]; gsl_vector_view x = gsl_vector_view_array(x_data, 2); /* * loop through all four values of the Lagrange multiplier * lambda. For each lambda, evaluate the objective function * with Re(lambda) to determine which lambda minimizes the * function */ for (i = 0; i < 4; ++i) { double cost, normx; /*fprintf(stderr, "root: %.12e + %.12e i\n", z[2*i], z[2*i+1]);*/ status = subspace2D_solution(z[2*i], &x.vector, state); if (status != GSL_SUCCESS) continue; /* singular matrix system */ /* ensure ||x|| = delta */ normx = gsl_blas_dnrm2(&x.vector); if (normx == 0.0) continue; gsl_vector_scale(&x.vector, delta / normx); /* evaluate objective function to determine minimizer */ cost = subspace2D_objective(&x.vector, state); if (mini < 0 || cost < min) { mini = (int) i; min = cost; } } if (mini < 0) { /* did not find minimizer - should not get here */ return GSL_FAILURE; } else { /* compute x which minimizes objective function */ subspace2D_solution(z[2*mini], &x.vector, state); /* dx = Q * x */ gsl_vector_set_zero(dx); gsl_vector_set(dx, 0, gsl_vector_get(&x.vector, 0)); gsl_vector_set(dx, 1, gsl_vector_get(&x.vector, 1)); gsl_linalg_QR_Qvec(state->W, state->tau, dx); /* compute final dx by multiplying by D^{-1} */ gsl_vector_div(dx, trust_state->diag); } } else { GSL_ERROR ("gsl_poly_complex_solve failed", status); } } return GSL_SUCCESS; } static int subspace2D_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; subspace2D_state_t *state = (subspace2D_state_t *) vstate; *pred = quadratic_preduction(trust_state->f, trust_state->J, dx, state->workn); return GSL_SUCCESS; } /* solve 2D subspace problem: (B + lambda*I) x = -g */ static int subspace2D_solution(const double lambda, gsl_vector * x, subspace2D_state_t * state) { int status = GSL_SUCCESS; double C_data[4]; gsl_matrix_view C = gsl_matrix_view_array(C_data, 2, 2); double B00 = gsl_matrix_get(state->subB, 0, 0); double B10 = gsl_matrix_get(state->subB, 1, 0); double B11 = gsl_matrix_get(state->subB, 1, 1); /* construct C = B + lambda*I */ gsl_matrix_set(&C.matrix, 0, 0, B00 + lambda); gsl_matrix_set(&C.matrix, 1, 0, B10); gsl_matrix_set(&C.matrix, 0, 1, B10); gsl_matrix_set(&C.matrix, 1, 1, B11 + lambda); /* use modified Cholesky in case C is not positive definite */ gsl_linalg_mcholesky_decomp(&C.matrix, state->perm, NULL); gsl_linalg_mcholesky_solve(&C.matrix, state->perm, state->subg, x); gsl_vector_scale(x, -1.0); return status; } /* evaluate 2D objective function: f(x) = g^T x + 1/2 x^T B x */ static double subspace2D_objective(const gsl_vector * x, subspace2D_state_t * state) { double f; double y_data[2]; gsl_vector_view y = gsl_vector_view_array(y_data, 2); /* compute: y = g + 1/2 B x */ gsl_vector_memcpy(&y.vector, state->subg); gsl_blas_dsymv(CblasLower, 0.5, state->subB, x, 1.0, &y.vector); /* compute: f = x^T ( g + 1/2 B x ) */ gsl_blas_ddot(x, &y.vector, &f); return f; } /* subspace2D_calc_gn() Calculate Gauss-Newton step which satisfies: J dx_gn = -f Inputs: trust_state - trust state variables dx - (output) Gauss-Newton step Return: success/error */ static int subspace2D_calc_gn(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx) { int status; const gsl_multifit_nlinear_parameters *params = trust_state->params; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; /* prepare the linear solver to compute Gauss-Newton step */ status = (params->solver->presolve)(0.0, trust_state, trust_state->solver_state); if (status) return status; /* solve: J dx_gn = -f for Gauss-Newton step */ status = (params->solver->solve)(trust_state->f, dx, trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* subspace2D_calc_sd() Calculate steepest descent step, dx_sd = - || D^{-1} g ||^2 / || J D^{-2} g ||^2 D^{-2} g Inputs: trust_state - trust state variables dx - (output) steepest descent vector state - workspace Return: success/error */ static int subspace2D_calc_sd(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx, subspace2D_state_t * state) { double norm_Dinvg; /* || D^{-1} g || */ double norm_JDinv2g; /* || J D^{-2} g || */ double alpha; /* || D^{-1} g ||^2 / || J D^{-2} g ||^2 */ double u; /* compute workp = D^{-1} g and its norm */ gsl_vector_memcpy(state->workp, trust_state->g); gsl_vector_div(state->workp, trust_state->diag); norm_Dinvg = gsl_blas_dnrm2(state->workp); /* compute workp = D^{-2} g */ gsl_vector_div(state->workp, trust_state->diag); /* compute: workn = J D^{-2} g */ gsl_blas_dgemv(CblasNoTrans, 1.0, trust_state->J, state->workp, 0.0, state->workn); norm_JDinv2g = gsl_blas_dnrm2(state->workn); u = norm_Dinvg / norm_JDinv2g; alpha = u * u; /* dx_sd = -alpha D^{-2} g */ gsl_vector_memcpy(dx, state->workp); gsl_vector_scale(dx, -alpha); return GSL_SUCCESS; } static const gsl_multifit_nlinear_trs subspace2D_type = { "2D-subspace", subspace2D_alloc, subspace2D_init, subspace2D_preloop, subspace2D_step, subspace2D_preduction, subspace2D_free }; const gsl_multifit_nlinear_trs *gsl_multifit_nlinear_trs_subspace2D = &subspace2D_type; gsl-doc-2.3/multifit_nlinear/test_rosenbrocke.c0000644000175000017500000000477712771454407020076 0ustar eddedd#define rosenbrocke_N 8 /* = p */ #define rosenbrocke_P 8 /* must be even */ static double rosenbrocke_x0[rosenbrocke_P] = { -1.2, 1.0, -1.2, 1.0, -1.2, 1.0, -1.2, 1.0 }; static double rosenbrocke_epsrel = 1.0e-12; static void rosenbrocke_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double rosenbrocke_x[rosenbrocke_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrocke_P; ++i) { gsl_test_rel(x[i], rosenbrocke_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrocke_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2i = gsl_vector_get(x, 2*i + 1); double x2im1 = gsl_vector_get(x, 2*i); gsl_vector_set(f, 2*i, 10.0 * (x2i - x2im1*x2im1)); gsl_vector_set(f, 2*i + 1, 1.0 - x2im1); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrocke_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i; gsl_matrix_set_zero(J); for (i = 0; i < rosenbrocke_N / 2; ++i) { double x2im1 = gsl_vector_get(x, 2*i); gsl_matrix_set(J, 2*i, 2*i, -20.0*x2im1); gsl_matrix_set(J, 2*i, 2*i + 1, 10.0); gsl_matrix_set(J, 2*i + 1, 2*i, -1.0); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrocke_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i; for (i = 0; i < rosenbrocke_N / 2; ++i) { double v2im1 = gsl_vector_get(v, 2*i); gsl_vector_set(fvv, 2*i, -20.0 * v2im1 * v2im1); gsl_vector_set(fvv, 2*i + 1, 0.0); } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf rosenbrocke_func = { rosenbrocke_f, rosenbrocke_df, rosenbrocke_fvv, rosenbrocke_N, rosenbrocke_P, NULL, 0, 0, 0 }; static test_fdf_problem rosenbrocke_problem = { "rosenbrock_extended", rosenbrocke_x0, NULL, NULL, &rosenbrocke_epsrel, &rosenbrocke_checksol, &rosenbrocke_func }; gsl-doc-2.3/multifit_nlinear/test_boxbod.c0000644000175000017500000000561212771454077017027 0ustar eddedd#define boxbod_N 6 #define boxbod_P 2 static double boxbod_x0a[boxbod_P] = { 1.0, 1.0 }; static double boxbod_x0b[boxbod_P] = { 100.0, 0.75 }; static double boxbod_epsrel = 1.0e-7; static double boxbod_sigma[boxbod_P] = { 1.2354515176E+01, 1.0455993237E-01 }; static double boxbod_X[boxbod_N] = { 1.0, 2.0, 3.0, 5.0, 7.0, 10.0 }; static double boxbod_F[boxbod_N] = { 109.0, 149.0, 149.0, 191.0, 213.0, 224.0 }; static void boxbod_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.1680088766E+03; const double boxbod_x[boxbod_P] = { 2.1380940889E+02, 5.4723748542E-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < boxbod_P; ++i) { gsl_test_rel(x[i], boxbod_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int boxbod_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double yi; yi = b[0] * (1.0 - exp(-b[1] * xi)); gsl_vector_set (f, i, yi - boxbod_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int boxbod_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[boxbod_P]; size_t i; for (i = 0; i < boxbod_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < boxbod_N; i++) { double xi = boxbod_X[i]; double term = exp(-b[1] * xi); gsl_matrix_set (df, i, 0, 1.0 - term); gsl_matrix_set (df, i, 1, b[0] * term * xi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int boxbod_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < boxbod_N; i++) { double ti = boxbod_X[i]; double term = exp(-x2 * ti); gsl_vector_set(fvv, i, term * ti * v2 * (2*v1 - ti*v2*x1)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf boxbod_func = { boxbod_f, boxbod_df, boxbod_fvv, boxbod_N, boxbod_P, NULL, 0, 0, 0 }; static test_fdf_problem boxboda_problem = { "nist-boxboda", boxbod_x0a, NULL, boxbod_sigma, &boxbod_epsrel, &boxbod_checksol, &boxbod_func }; static test_fdf_problem boxbodb_problem = { "nist-boxbodb", boxbod_x0b, NULL, boxbod_sigma, &boxbod_epsrel, &boxbod_checksol, &boxbod_func }; gsl-doc-2.3/multifit_nlinear/fdjac.c0000644000175000017500000001274512771455427015567 0ustar eddedd/* multifit_nlinear/fdjac.c * * Copyright (C) 2013, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module contains routines for approximating the Jacobian with * finite differences for nonlinear least-squares fitting. */ #include #include #include #include #include static int forward_jac(const double h, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *f, gsl_matrix *J); static int center_jac(const double h, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, gsl_matrix *J, gsl_vector *work); /* forward_jac() Compute approximate Jacobian using forward differences Inputs: h - finite difference step size x - parameter vector wts - data weights fdf - fdf struct f - (input) vector of function values f_i(x) J - (output) Jacobian matrix Return: success or error */ static int forward_jac(const double h, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *f, gsl_matrix *J) { int status = 0; size_t i, j; double delta; for (j = 0; j < fdf->p; ++j) { double xj = gsl_vector_get(x, j); /* use column j of J as temporary storage for f(x + dx) */ gsl_vector_view v = gsl_matrix_column(J, j); delta = h * fabs(xj); if (delta == 0.0) delta = h; /* perturb x_j to compute forward difference */ gsl_vector_set((gsl_vector *) x, j, xj + delta); status += gsl_multifit_nlinear_eval_f (fdf, x, wts, &v.vector); if (status) return status; /* restore x_j */ gsl_vector_set((gsl_vector *) x, j, xj); delta = 1.0 / delta; for (i = 0; i < fdf->n; ++i) { double fnext = gsl_vector_get(&v.vector, i); double fi = gsl_vector_get(f, i); gsl_matrix_set(J, i, j, (fnext - fi) * delta); } } return status; } /* center_jac() Compute approximate Jacobian using centered differences Inputs: h - finite difference step size x - parameter vector wts - data weights fdf - fdf struct J - (output) Jacobian matrix work - additional workspace, size n Return: success or error */ static int center_jac(const double h, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, gsl_matrix *J, gsl_vector *work) { int status = 0; size_t i, j; double delta; for (j = 0; j < fdf->p; ++j) { double xj = gsl_vector_get(x, j); /* use column j of J as temporary storage for f(x + dx) */ gsl_vector_view v = gsl_matrix_column(J, j); delta = h * fabs(xj); if (delta == 0.0) delta = h; /* perturb x_j to compute forward difference, f(x + 1/2 delta e_j) */ gsl_vector_set((gsl_vector *) x, j, xj + 0.5 * delta); status += gsl_multifit_nlinear_eval_f (fdf, x, wts, &v.vector); if (status) return status; /* perturb x_j to compute backward difference, f(x - 1/2 delta e_j) */ gsl_vector_set((gsl_vector *) x, j, xj - 0.5 * delta); status += gsl_multifit_nlinear_eval_f (fdf, x, wts, work); if (status) return status; /* restore x_j */ gsl_vector_set((gsl_vector *) x, j, xj); delta = 1.0 / delta; for (i = 0; i < fdf->n; ++i) { double fnext = gsl_vector_get(&v.vector, i); double fprev = gsl_vector_get(work, i); gsl_matrix_set(J, i, j, (fnext - fprev) * delta); } } return status; } /* gsl_multifit_nlinear_df() Compute approximate Jacobian using finite differences Inputs: h - finite difference step size fdtype - finite difference method x - parameter vector wts - data weights (set to NULL if not needed) fdf - fdf f - (input) function values f_i(x) J - (output) approximate (weighted) Jacobian matrix, sqrt(W) * J work - additional workspace for centered differences, size n Return: success or error */ int gsl_multifit_nlinear_df(const double h, const gsl_multifit_nlinear_fdtype fdtype, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *f, gsl_matrix *J, gsl_vector *work) { int status; if (fdtype == GSL_MULTIFIT_NLINEAR_FWDIFF) { status = forward_jac(h, x, wts, fdf, f, J); } else if (fdtype == GSL_MULTIFIT_NLINEAR_CTRDIFF) { status = center_jac(h, x, wts, fdf, J, work); } else { GSL_ERROR("invalid specified fdtype", GSL_EINVAL); } return status; } gsl-doc-2.3/multifit_nlinear/test_wood.c0000644000175000017500000000514712771454557016530 0ustar eddedd#define wood_N 6 #define wood_P 4 static double wood_x0[wood_P] = { -3.0, -1.0, -3.0, -1.0 }; static double wood_epsrel = 1.0e-12; static void wood_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double wood_x[wood_P] = { 1.0, 1.0, 1.0, 1.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wood_P; ++i) { gsl_test_rel(x[i], wood_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wood_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); gsl_vector_set(f, 0, 10.0*(x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); gsl_vector_set(f, 2, sqrt(90.0)*(x4 - x3*x3)); gsl_vector_set(f, 3, 1.0 - x3); gsl_vector_set(f, 4, sqrt(10.0)*(x2 + x4 - 2.0)); gsl_vector_set(f, 5, (x2 - x4) / sqrt(10.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int wood_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x3 = gsl_vector_get(x, 2); double s90 = sqrt(90.0); double s10 = sqrt(10.0); gsl_matrix_set_zero(J); gsl_matrix_set(J, 0, 0, -20.0*x1); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 2, 2, -2.0*s90*x3); gsl_matrix_set(J, 2, 3, s90); gsl_matrix_set(J, 3, 2, -1.0); gsl_matrix_set(J, 4, 1, s10); gsl_matrix_set(J, 4, 3, s10); gsl_matrix_set(J, 5, 1, 1.0/s10); gsl_matrix_set(J, 5, 3, -1.0/s10); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int wood_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const double s10 = sqrt(10.0); double v1 = gsl_vector_get(v, 0); double v3 = gsl_vector_get(v, 2); gsl_vector_set(fvv, 0, -20.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, -6.0 * s10 * v3 * v3); gsl_vector_set(fvv, 3, 0.0); gsl_vector_set(fvv, 4, 0.0); gsl_vector_set(fvv, 5, 0.0); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf wood_func = { wood_f, wood_df, wood_fvv, wood_N, wood_P, NULL, 0, 0, 0 }; static test_fdf_problem wood_problem = { "wood", wood_x0, NULL, NULL, &wood_epsrel, &wood_checksol, &wood_func }; gsl-doc-2.3/multifit_nlinear/Makefile.am0000644000175000017500000000366212753366320016377 0ustar eddeddnoinst_LTLIBRARIES = libgslmultifit_nlinear.la pkginclude_HEADERS = gsl_multifit_nlinear.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_nlinear_la_SOURCES = cholesky.c convergence.c covar.c dogleg.c fdf.c fdfvv.c fdjac.c lm.c qr.c scaling.c subspace2D.c svd.c trust.c noinst_HEADERS = \ common.c \ nielsen.c \ qrsolv.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_exp1.c \ test_fdf.c \ test_gaussian.c \ test_hahn1.c \ test_helical.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_meyer.c \ test_meyerscal.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wnlin.c \ test_wood.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultifit_nlinear.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../sort/libgslsort.la ../statistics/libgslstatistics.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 ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../poly/libgslpoly.la gsl-doc-2.3/multifit_nlinear/test_gaussian.c0000644000175000017500000000677512771454207017372 0ustar eddedd#define gaussian_N 15 #define gaussian_P 3 static double gaussian_x0[gaussian_P] = { 0.4, 1.0, 0.0 }; static double gaussian_epsrel = 1.0e-10; static double gaussian_Y[gaussian_N] = { 0.0009, 0.0044, 0.0175, 0.0540, 0.1295, 0.2420, 0.3521, 0.3989, 0.3521, 0.2420, 0.1295, 0.0540, 0.0175, 0.0044, 0.0009 }; static void gaussian_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.12793276961871985e-08; const double gaussian_x[gaussian_P] = { 0.398956137838762825, 1.00001908448786647, 0.0 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < gaussian_P; ++i) { gsl_test_rel(x[i], gaussian_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int gaussian_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double yi = gaussian_Y[i]; double term = ti - x3; double fi = x1 * exp(-x2*term*term/2.0) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int gaussian_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double term1 = ti - x3; double term2 = exp(-x2*term1*term1/2.0); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, -0.5*x1*term2*term1*term1); gsl_matrix_set(J, i, 2, x1*x2*term1*term2); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int gaussian_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < gaussian_N; ++i) { double ti = (7.0 - i) / 2.0; double term1 = ti - x3; double term2 = exp(-x2*term1*term1/2.0); gsl_vector_set(fvv, i, 0.25 * term2 * (ti*ti*ti*ti*v2*v2*x1 - 4*ti*ti*ti*v2*x1*(v3*x2 + v2*x3) + v2*x3*x3*(v2*x1*x3*x3 - 4*v1) + 4*v3*v3*x1*x2*(x2*x3*x3 - 1.0) + 4*v3*x3*(-2*v1*x2 + v2*x1*(x2*x3*x3 - 2.0)) + ti*ti*(4*v3*v3*x1*x2*x2 + 2*v2*(-2*v1 + 3*x1*x3*(2*v3*x2 + v2*x3))) - 4*ti*(v2*v2*x1*x3*x3*x3 + 2*v3*x2*(-v1 + v3*x1*x2*x3) + v2*(-2*v1*x3 + v3*x1*(-2.0 + 3*x2*x3*x3))))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf gaussian_func = { gaussian_f, gaussian_df, gaussian_fvv, gaussian_N, gaussian_P, NULL, 0, 0, 0 }; static test_fdf_problem gaussian_problem = { "gaussian", gaussian_x0, NULL, NULL, &gaussian_epsrel, &gaussian_checksol, &gaussian_func }; gsl-doc-2.3/multifit_nlinear/test_meyerscal.c0000644000175000017500000000635012771454312017526 0ustar eddedd#define meyerscal_N 16 #define meyerscal_P 3 static double meyerscal_x0[meyerscal_P] = { 8.85, 4.0, 2.5 }; static double meyerscal_epsrel = 1.0e-6; static double meyerscal_Y[meyerscal_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyerscal_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517003888e-05; const double meyerscal_x[meyerscal_P] = { 2.481778312286695e+00, 6.181346341853554e+00, 3.452236344749865e+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyerscal_P; ++i) { gsl_test_rel(x[i], meyerscal_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyerscal_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double yi = meyerscal_Y[i]; double fi = x1 * exp(10.0*x2 / (ti + x3) - 13.0) - 1.0e-3*yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyerscal_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double term1 = ti + x3; double term2 = exp(10.0*x2/term1 - 13.0); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, 10.0*x1*term2/term1); gsl_matrix_set(J, i, 2, -10.0*x1*x2*term2/(term1*term1)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyerscal_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < meyerscal_N; ++i) { double ti = 0.45 + 0.05*(i + 1.0); double term1 = ti + x3; double term2 = exp(10.0*x2/term1 - 13.0); double term3 = v2*term1 - v3*x2; double term4 = ti*ti*v1 - v3*x1*(5*x2 + x3) + x3*(5*v2*x1 + v1*x3) + ti*(5*v2*x1 - v3*x1 + 2*v1*x3); gsl_vector_set(fvv, i, 20*term2*term3*term4 / pow(term1, 4.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf meyerscal_func = { meyerscal_f, meyerscal_df, meyerscal_fvv, meyerscal_N, meyerscal_P, NULL, 0, 0, 0 }; static test_fdf_problem meyerscal_problem = { "meyerscal", meyerscal_x0, NULL, NULL, &meyerscal_epsrel, &meyerscal_checksol, &meyerscal_func }; gsl-doc-2.3/multifit_nlinear/common.c0000644000175000017500000000621212752713256015774 0ustar eddedd/* multifit_nlinear/common.c * * Copyright (C) 2014, 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 scaled_enorm (const gsl_vector * d, const gsl_vector * f); static void scaled_addition (const double alpha, const gsl_vector * x, const double beta, const gsl_vector * y, gsl_vector * z); static double quadratic_preduction(const gsl_vector *f, const gsl_matrix * J, const gsl_vector * dx, gsl_vector * work); /* compute || diag(d) 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); } /* compute z = alpha*x + beta*y */ static void scaled_addition (const double alpha, const gsl_vector * x, const double beta, const gsl_vector * y, gsl_vector * z) { const size_t N = z->size; size_t i; for (i = 0; i < N; i++) { double xi = gsl_vector_get (x, i); double yi = gsl_vector_get (y, i); gsl_vector_set (z, i, alpha * xi + beta * yi); } } /* quadratic_preduction() Calculate predicted reduction based on standard quadratic model: m_k(dx) = Phi(x_k) + dx' g + 1/2 dx' B_k dx predicted_reduction = m_k(0) - m_k(dx) = -2 g^T dx / ||f||^2 - ( ||J*dx|| / ||f|| )^2 = -2 fhat . beta - ||beta||^2 where: beta = J*dx / ||f|| Inputs: f - f(x), size n J - Jacobian J(x), n-by-p dx - proposed step, size p work - workspace, size n Return: predicted reduction */ static double quadratic_preduction(const gsl_vector * f, const gsl_matrix * J, const gsl_vector * dx, gsl_vector * work) { const size_t n = f->size; const double normf = gsl_blas_dnrm2(f); double pred_reduction; double norm_beta; /* ||J*dx|| / ||f|| */ size_t i; /* compute beta = J*dx / ||f|| */ gsl_blas_dgemv(CblasNoTrans, 1.0 / normf, J, dx, 0.0, work); norm_beta = gsl_blas_dnrm2(work); /* initialize to ( ||J*dx|| / ||f|| )^2 */ pred_reduction = -norm_beta * norm_beta; /* subtract 2*fhat.beta */ for (i = 0; i < n; ++i) { double fi = gsl_vector_get(f, i); double betai = gsl_vector_get(work, i); pred_reduction -= 2.0 * (fi / normf) * betai; } return pred_reduction; } gsl-doc-2.3/multifit_nlinear/test_penalty2.c0000644000175000017500000001026312771454332017300 0ustar eddedd#define penalty2_N 8 /* 2*p */ #define penalty2_P 4 static double penalty2_x0[penalty2_P] = { 0.5, 0.5, 0.5, 0.5 }; static double penalty2_epsrel = 1.0e-12; static void penalty2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 9.37629300735544219e-06; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); (void)x; /* avoid unused parameter warning */ } static int penalty2_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); double x1 = gsl_vector_get(x, 0); size_t i; double sum = penalty2_P * x1 * x1; gsl_vector_set(f, 0, x1 - 0.2); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double yi = exp(0.1*(i + 1.0)) + exp(0.1*i); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) + exp(0.1*xim1) - yi)); sum += (penalty2_P - i) * xi * xi; } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); gsl_vector_set(f, i, sqrt_alpha*(exp(0.1*xi) - exp(-0.1))); } /* row 2p */ gsl_vector_set(f, penalty2_N - 1, sum - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty2_df (const gsl_vector * x, void *params, gsl_matrix * J) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i, j; for (j = 0; j < penalty2_P; ++j) { double xj = gsl_vector_get(x, j); double delta1j = (j == 0) ? 1.0 : 0.0; /* first and last rows */ gsl_matrix_set(J, 0, j, delta1j); gsl_matrix_set(J, penalty2_N - 1, j, 2.0 * (penalty2_P - j) * xj); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double Jij; if (i == j) Jij = exp(0.1 * xi); else if (i - 1 == j) Jij = exp(0.1 * xim1); else Jij = 0.0; Jij *= 0.1 * sqrt_alpha; gsl_matrix_set(J, i, j, Jij); } /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); if (i - penalty2_P + 1 == j) gsl_matrix_set(J, i, j, 0.1 * sqrt_alpha * exp(0.1*xi)); else gsl_matrix_set(J, i, j, 0.0); } } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); double v1 = gsl_vector_get(v, 0); double sum = penalty2_P * v1 * v1; size_t i; /* first row */ gsl_vector_set(fvv, 0, 0.0); /* rows [2:p] */ for (i = 1; i < penalty2_P; ++i) { double xi = gsl_vector_get(x, i); double xim1 = gsl_vector_get(x, i - 1); double vi = gsl_vector_get(v, i); double vim1 = gsl_vector_get(v, i - 1); double term1 = exp(xi / 10.0); double term2 = exp(xim1 / 10.0); gsl_vector_set(fvv, i, sqrt_alpha / 100.0 * (term1 * vi * vi + term2 * vim1 * vim1)); sum += (penalty2_P - i) * vi * vi; } /* last row */ gsl_vector_set(fvv, penalty2_N - 1, 2.0 * sum); /* rows [p+1:2p-1] */ for (i = penalty2_P; i < penalty2_N - 1; ++i) { double xi = gsl_vector_get(x, i - penalty2_P + 1); double vi = gsl_vector_get(v, i - penalty2_P + 1); gsl_vector_set(fvv, i, sqrt_alpha / 100.0 * exp(xi / 10.0) * vi * vi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf penalty2_func = { penalty2_f, penalty2_df, penalty2_fvv, penalty2_N, penalty2_P, NULL, 0, 0, 0 }; static test_fdf_problem penalty2_problem = { "penalty2", penalty2_x0, NULL, NULL, &penalty2_epsrel, &penalty2_checksol, &penalty2_func }; gsl-doc-2.3/multifit_nlinear/lm.c0000644000175000017500000002235012764570033015112 0ustar eddedd/* multifit_nlinear/lm.c * * Copyright (C) 2014, 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include /* * This module contains an implementation of the Levenberg-Marquardt * algorithm for nonlinear optimization problems. This implementation * closely follows the following works: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * [2] J. J. More, The Levenberg-Marquardt Algorithm: Implementation * and Theory, Lecture Notes in Mathematics, v630, 1978. */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *fvv; /* D_v^2 f(x), size n */ gsl_vector *vel; /* geodesic velocity (standard LM step), size p */ gsl_vector *acc; /* geodesic acceleration, size p */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ int accel; /* use geodesic acceleration? */ /* tunable parameters */ gsl_multifit_nlinear_parameters params; } lm_state_t; #include "common.c" static void *lm_alloc (const int accel, const void * params, const size_t n, const size_t p); static void *lm_alloc_noaccel (const void * params, const size_t n, const size_t p); static void *lm_alloc_accel (const void * params, const size_t n, const size_t p); static void lm_free(void *vstate); static int lm_init(const void *vtrust_state, void *vstate); static int lm_preloop(const void * vtrust_state, void * vstate); static int lm_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int lm_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static void * lm_alloc (const int accel, const void * params, const size_t n, const size_t p) { const gsl_multifit_nlinear_parameters *mparams = (const gsl_multifit_nlinear_parameters *) params; lm_state_t *state; state = calloc(1, sizeof(lm_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate lm state", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->fvv = gsl_vector_alloc(n); if (state->fvv == NULL) { GSL_ERROR_NULL ("failed to allocate space for fvv", GSL_ENOMEM); } state->vel = gsl_vector_alloc(p); if (state->vel == NULL) { GSL_ERROR_NULL ("failed to allocate space for vel", GSL_ENOMEM); } state->acc = gsl_vector_alloc(p); if (state->acc == NULL) { GSL_ERROR_NULL ("failed to allocate space for acc", GSL_ENOMEM); } state->n = n; state->p = p; state->params = *mparams; state->accel = accel; return state; } static void * lm_alloc_noaccel (const void * params, const size_t n, const size_t p) { return lm_alloc(0, params, n, p); } static void * lm_alloc_accel (const void * params, const size_t n, const size_t p) { return lm_alloc(1, params, n, p); } static void lm_free(void *vstate) { lm_state_t *state = (lm_state_t *) vstate; if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); if (state->fvv) gsl_vector_free(state->fvv); if (state->vel) gsl_vector_free(state->vel); if (state->acc) gsl_vector_free(state->acc); free(state); } /* lm_init() Initialize LM solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int lm_init(const void *vtrust_state, void *vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; gsl_vector_set_zero(state->vel); gsl_vector_set_zero(state->acc); *(trust_state->avratio) = 0.0; return GSL_SUCCESS; } /* lm_preloop() Initialize LM method for new Jacobian matrix */ static int lm_preloop(const void * vtrust_state, void * vstate) { int status; const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; const gsl_multifit_nlinear_parameters *params = trust_state->params; (void)vstate; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* lm_step() Calculate a new step vector by solving the linear least squares system: [ J ] v = - [ f ] [ sqrt(mu) D ] [ 0 ] */ static int lm_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { int status; const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; const gsl_multifit_nlinear_parameters *params = trust_state->params; const double mu = *(trust_state->mu); (void)delta; /* prepare the linear solver with current LM parameter mu */ status = (params->solver->presolve)(mu, trust_state, trust_state->solver_state); if (status) return status; /* * solve: [ J ] v = - [ f ] * [ sqrt(mu)*D ] [ 0 ] */ status = (params->solver->solve)(trust_state->f, state->vel, trust_state, trust_state->solver_state); if (status) return status; if (state->accel) { double anorm, vnorm; /* compute geodesic acceleration */ status = gsl_multifit_nlinear_eval_fvv(params->h_fvv, trust_state->x, state->vel, trust_state->f, trust_state->J, trust_state->sqrt_wts, trust_state->fdf, state->fvv, state->workp); if (status) return status; /* * solve: [ J ] a = - [ fvv ] * [ sqrt(mu)*D ] [ 0 ] */ status = (params->solver->solve)(state->fvv, state->acc, trust_state, trust_state->solver_state); if (status) return status; anorm = gsl_blas_dnrm2(state->acc); vnorm = gsl_blas_dnrm2(state->vel); /* store |a| / |v| */ *(trust_state->avratio) = anorm / vnorm; } /* compute step dx = v + 1/2 a */ scaled_addition(1.0, state->vel, 0.5, state->acc, dx); return GSL_SUCCESS; } /* lm_preduction() Compute predicted reduction using Eq 4.4 of More 1978 */ static int lm_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; lm_state_t *state = (lm_state_t *) vstate; const gsl_vector *diag = trust_state->diag; const gsl_vector *p = state->vel; const double norm_Dp = scaled_enorm(diag, p); const double normf = gsl_blas_dnrm2(trust_state->f); const double mu = *(trust_state->mu); double norm_Jp; double u, v; (void)dx; /* compute work = J*p */ gsl_blas_dgemv(CblasNoTrans, 1.0, trust_state->J, p, 0.0, state->workn); /* compute ||J*p|| */ norm_Jp = gsl_blas_dnrm2(state->workn); u = norm_Jp / normf; v = norm_Dp / normf; *pred = u * u + 2.0 * mu * v * v; return GSL_SUCCESS; } static const gsl_multifit_nlinear_trs lm_type = { "levenberg-marquardt", lm_alloc_noaccel, lm_init, lm_preloop, lm_step, lm_preduction, lm_free }; const gsl_multifit_nlinear_trs *gsl_multifit_nlinear_trs_lm = &lm_type; static const gsl_multifit_nlinear_trs lmaccel_type = { "levenberg-marquardt+accel", lm_alloc_accel, lm_init, lm_preloop, lm_step, lm_preduction, lm_free }; const gsl_multifit_nlinear_trs *gsl_multifit_nlinear_trs_lmaccel = &lmaccel_type; gsl-doc-2.3/multifit_nlinear/test_biggs.c0000644000175000017500000000704112771454052016634 0ustar eddedd#define biggs_N 20 /* >= p */ #define biggs_P 6 /* dogleg method has trouble converging from recommended starting point, * so we use an x0 which is a little closer to the true solution */ /*static double biggs_x0[biggs_P] = { 1.0, 2.0, 1.0, 1.0, 1.0, 1.0 };*/ static double biggs_x0[biggs_P] = { 1.0, 5.0, 1.0, 2.0, 3.0, 2.0 }; static double biggs_epsrel = 1.0e-9; static void biggs_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 0.0; const double biggs_x[biggs_P] = { 1.0, 10.0, 1.0, 5.0, 4.0, 3.0 }; size_t i; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < biggs_P; ++i) { gsl_test_rel(x[i], biggs_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int biggs_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); double yi = exp(-ti) - 5*exp(-10*ti) + 3*exp(-4*ti); double fi = x3*exp(-ti*x1) - x4*exp(-ti*x2) + x6*exp(-ti*x5) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int biggs_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); gsl_matrix_set(J, i, 0, -ti*x3*exp(-ti*x1)); gsl_matrix_set(J, i, 1, ti*x4*exp(-ti*x2)); gsl_matrix_set(J, i, 2, exp(-ti*x1)); gsl_matrix_set(J, i, 3, -exp(-ti*x2)); gsl_matrix_set(J, i, 4, -ti*x6*exp(-ti*x5)); gsl_matrix_set(J, i, 5, exp(-ti*x5)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int biggs_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double x6 = gsl_vector_get(x, 5); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); double v6 = gsl_vector_get(v, 5); size_t i; for (i = 0; i < biggs_N; ++i) { double ti = 0.1 * (i + 1.0); double term1 = exp(-ti * x1); double term2 = exp(-ti * x2); double term3 = exp(-ti * x5); gsl_vector_set(fvv, i, ti * term1 * term2 * term3 * (v1/(term2*term3)*(-2*v3 + ti*v1*x3) - v2/(term1*term3)*(-2*v4 + ti*v2*x4) + v5/(term1*term2)*(-2*v6 + ti*v5*x6))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf biggs_func = { biggs_f, biggs_df, biggs_fvv, biggs_N, biggs_P, NULL, 0, 0, 0 }; static test_fdf_problem biggs_problem = { "biggs", biggs_x0, NULL, NULL, &biggs_epsrel, &biggs_checksol, &biggs_func }; gsl-doc-2.3/multifit_nlinear/test_powell2.c0000644000175000017500000000375212771454343017135 0ustar eddedd#define powell2_N 2 #define powell2_P 2 static double powell2_x0[powell2_P] = { 3.0, 1.0 }; static double powell2_epsrel = 1.0e-3; static void powell2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell2_P; ++i) { gsl_test_rel(x[i], 0.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell2_f (const gsl_vector * x, void *params, gsl_vector * f) { double x0 = gsl_vector_get (x, 0); double x1 = gsl_vector_get (x, 1); gsl_vector_set(f, 0, x0); gsl_vector_set(f, 1, 10.0*x0/(x0 + 0.1) + 2.0*x1*x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell2_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 term = x0 + 0.1; gsl_matrix_set(df, 0, 0, 1.0); gsl_matrix_set(df, 0, 1, 0.0); gsl_matrix_set(df, 1, 0, 1.0 / (term * term)); gsl_matrix_set(df, 1, 1, 4.0 * x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x0 = gsl_vector_get (x, 0); double v0 = gsl_vector_get (v, 0); double v1 = gsl_vector_get (v, 1); double term = x0 + 0.1; gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 4*v1*v1 - (2*v0*v0)/pow(term, 3.0)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf powell2_func = { powell2_f, powell2_df, powell2_fvv, powell2_N, powell2_P, NULL, 0, 0, 0 }; static test_fdf_problem powell2_problem = { "powell2", powell2_x0, NULL, NULL, &powell2_epsrel, &powell2_checksol, &powell2_func }; gsl-doc-2.3/multifit_nlinear/test_bard.c0000644000175000017500000000652712771454037016464 0ustar eddedd#define bard_N 15 #define bard_P 3 static double bard_x0[bard_P] = { 1.0, 1.0, 1.0 }; static double bard_epsrel = 1.0e-7; static double bard_Y[bard_N] = { 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, 0.96, 1.34, 2.10, 4.39 }; static void bard_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 8.214877306578963e-03; double bard_x1[bard_P] = { 8.241055975623580e-02, 1.133036092245175, 2.343695178435405 }; const double sumsq_exact2 = 17.42869333333333; double bard_x2[bard_P] = { 8.406666666666666e-01, 0.0, /* -inf */ 0.0 }; /* -inf */ double *bard_x; double sumsq_exact; bard_x2[1] = GSL_NAN; bard_x2[2] = GSL_NAN; if (fabs(x[1]) < 10.0 && fabs(x[2]) < 10.0) { bard_x = bard_x1; sumsq_exact = sumsq_exact1; } else { bard_x = bard_x2; sumsq_exact = sumsq_exact2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < bard_P; ++i) { if (!gsl_finite(bard_x[i])) continue; gsl_test_rel(x[i], bard_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int bard_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double yi = bard_Y[i]; double fi = yi - (x1 + (ui / (x2*vi + x3*wi))); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int bard_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double term = x2 * vi + x3 * wi; gsl_matrix_set(J, i, 0, -1.0); gsl_matrix_set(J, i, 1, ui * vi / (term * term)); gsl_matrix_set(J, i, 2, ui * wi / (term * term)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int bard_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < bard_N; ++i) { double ui = i + 1.0; double vi = 16.0 - i - 1.0; double wi = GSL_MIN(ui, vi); double term1 = x2 * vi + x3 * wi; double term2 = v2 * vi + v3 * wi; double ratio = term2 / term1; gsl_vector_set(fvv, i, -2.0 * ui * ratio * ratio / term1); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf bard_func = { bard_f, bard_df, bard_fvv, bard_N, bard_P, NULL, 0, 0, 0 }; static test_fdf_problem bard_problem = { "bard", bard_x0, NULL, NULL, &bard_epsrel, &bard_checksol, &bard_func }; gsl-doc-2.3/multifit_nlinear/test_vardim.c0000644000175000017500000000447512771454435017040 0ustar eddedd#define vardim_N 7 /* p + 2 */ #define vardim_P 5 static double vardim_x0[vardim_P] = { 0.8, 0.6, 0.4, 0.2, 0.0 }; static double vardim_epsrel = 1.0e-12; static void vardim_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < vardim_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int vardim_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i; double sum = 0.0; for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, xi - 1.0); sum += (i + 1.0) * (xi - 1.0); } gsl_vector_set(f, vardim_P, sum); gsl_vector_set(f, vardim_P + 1, sum*sum); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int vardim_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i; double sum = 0.0; gsl_matrix_view m = gsl_matrix_submatrix(J, 0, 0, vardim_P, vardim_P); gsl_matrix_set_identity(&m.matrix); for (i = 0; i < vardim_P; ++i) { double xi = gsl_vector_get(x, i); sum += (i + 1.0) * (xi - 1.0); } for (i = 0; i < vardim_P; ++i) { gsl_matrix_set(J, vardim_P, i, i + 1.0); gsl_matrix_set(J, vardim_P + 1, i, 2*(i + 1.0)*sum); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int vardim_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { size_t i; double sum = 0.0; gsl_vector_set_zero(fvv); for (i = 0; i < vardim_P; ++i) { double vi = gsl_vector_get(v, i); sum += (i + 1.0) * vi; } gsl_vector_set(fvv, vardim_N - 1, 2.0 * sum * sum); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf vardim_func = { vardim_f, vardim_df, vardim_fvv, vardim_N, vardim_P, NULL, 0, 0, 0 }; static test_fdf_problem vardim_problem = { "vardim", vardim_x0, NULL, NULL, &vardim_epsrel, &vardim_checksol, &vardim_func }; gsl-doc-2.3/multifit_nlinear/TODO0000644000175000017500000000044112774422476015033 0ustar eddedd1. rewrite qrsolv (COD, test on lin2) 2. More/Sorensen method for mu calculation 3. better condition estimate for svd 4. Revisit h_fvv = 0.01 vs 0.02 (originally 0.01) 5. fdfvv test currently disabled in test_fdf.c - on MacOS, the lmaccel/box3d/fdfvv test fails 6. Tikhonov regularization gsl-doc-2.3/multifit_nlinear/test_fdf.c0000644000175000017500000002470712771455306016313 0ustar eddedd/* multifit_nlinear/test_fdf.c * * Copyright (C) 2007, 2013, 2014, 2015, 2016 Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 struct { const char *name; double *x0; /* initial parameters (size p) */ double *weights; /* data weights */ double *sigma; double *epsrel; /* relative tolerance for solution checking */ void (*checksol) (const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname); gsl_multifit_nlinear_fdf *fdf; } test_fdf_problem; #include "test_bard.c" #include "test_beale.c" #include "test_biggs.c" #include "test_box.c" #include "test_boxbod.c" #include "test_brown1.c" #include "test_brown2.c" #include "test_brown3.c" #include "test_eckerle.c" #include "test_enso.c" #include "test_exp1.c" #include "test_gaussian.c" #include "test_hahn1.c" #include "test_helical.c" #include "test_jennrich.c" #include "test_kirby2.c" #include "test_kowalik.c" #include "test_lin1.c" #include "test_lin2.c" #include "test_lin3.c" #include "test_meyer.c" #include "test_meyerscal.c" #include "test_osborne.c" #include "test_penalty1.c" #include "test_penalty2.c" #include "test_powell1.c" #include "test_powell2.c" #include "test_powell3.c" #include "test_rat42.c" #include "test_rat43.c" #include "test_rosenbrock.c" #include "test_rosenbrocke.c" #include "test_roth.c" #include "test_thurber.c" #include "test_vardim.c" #include "test_watson.c" #include "test_wood.c" #include "test_wnlin.c" static void test_fdf(const gsl_multifit_nlinear_type * T, const gsl_multifit_nlinear_parameters * params, const double xtol, const double gtol, const double ftol, const double epsrel, test_fdf_problem *problem); static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multifit_nlinear_workspace *s, test_fdf_problem *problem); /* * FIXME: some test problems are disabled since they fail on certain * solvers. Known failures are: * * Method test-problem * ====== ============ * dogleg thurbera * dogleg rat43a * all boxboda */ static test_fdf_problem *test_problems[] = { /* * These test problems are taken from * * H. B. Nielsen, UCTP test problems for unconstrained optimization, * IMM Department of Mathematical Modeling, Tech. Report * IMM-REP-2000-17, 2000. */ &lin1_problem, /* 1 */ &lin2_problem, /* 2 */ &lin3_problem, /* 3 */ &rosenbrock_problem, /* 4 */ &helical_problem, /* 5 */ &powell1_problem, /* 6 */ &roth_problem, /* 7 */ &bard_problem, /* 8 */ &kowalik_problem, /* 9 */ &meyer_problem, /* 10 */ &watson_problem, /* 11 */ &box_problem, /* 12 */ &jennrich_problem, /* 13 */ &brown1_problem, /* 14 */ &brown2_problem, /* 16 */ &osborne_problem, /* 17 */ &exp1_problem, /* 18 */ &meyerscal_problem, /* 20 */ &powell2_problem, /* * These tests are from * * J. J. More, B. S. Garbow and K. E. Hillstrom, Testing * Unconstrained Optimization Software, ACM Trans. Math. Soft. * Vol 7, No 1, 1981. * * Many of these overlap with the Nielsen tests */ &rosenbrock_problem, /* 1 */ &roth_problem, /* 2 */ &powell3_problem, /* 3 */ &brown3_problem, /* 4 */ &beale_problem, /* 5 */ &jennrich_problem, /* 6 */ &helical_problem, /* 7 */ &bard_problem, /* 8 */ &gaussian_problem, /* 9 */ &meyer_problem, /* 10 */ &box_problem, /* 12 */ &powell1_problem, /* 13 */ &wood_problem, /* 14 */ &kowalik_problem, /* 15 */ &brown1_problem, /* 16 */ &osborne_problem, /* 17 */ &biggs_problem, /* 18 */ &watson_problem, /* 20 */ &rosenbrocke_problem, /* 21 */ &penalty1_problem, /* 23 */ &penalty2_problem, /* 24 */ &vardim_problem, /* 25 */ &brown2_problem, /* 27 */ &lin1_problem, /* 32 */ &lin2_problem, /* 33 */ &lin3_problem, /* 34 */ /* NIST test cases */ &kirby2a_problem, &kirby2b_problem, &hahn1a_problem, &hahn1b_problem, &ensoa_problem, &ensob_problem, /*&thurbera_problem,*/ &thurberb_problem, /*&boxboda_problem,*/ &boxbodb_problem, &rat42a_problem, &rat42b_problem, &eckerlea_problem, &eckerleb_problem, /*&rat43a_problem,*/ &rat43b_problem, /* weighted test cases */ &wnlin_problem1, &wnlin_problem2, NULL }; static void test_fdf_main(const gsl_multifit_nlinear_parameters * params) { const double xtol = pow(GSL_DBL_EPSILON, 0.9); const double gtol = pow(GSL_DBL_EPSILON, 0.9); const double ftol = 0.0; size_t i; for (i = 0; test_problems[i] != NULL; ++i) { test_fdf_problem *problem = test_problems[i]; double epsrel = *(problem->epsrel); gsl_multifit_nlinear_fdf fdf; test_fdf(gsl_multifit_nlinear_trust, params, xtol, gtol, ftol, epsrel, problem); /* test finite difference Jacobian * XXX: watson problem doesn't work with forward differences */ if (problem != &watson_problem) { fdf.df = problem->fdf->df; problem->fdf->df = NULL; test_fdf(gsl_multifit_nlinear_trust, params, xtol, gtol, ftol, 1.0e3 * epsrel, problem); problem->fdf->df = fdf.df; } #if 1 /*XXX: box3d test fails on MacOS here */ if (params->trs == gsl_multifit_nlinear_trs_lmaccel && problem->fdf->fvv != NULL) { /* test finite difference second directional derivative */ fdf.fvv = problem->fdf->fvv; problem->fdf->fvv = NULL; test_fdf(gsl_multifit_nlinear_trust, params, xtol, gtol, ftol, epsrel / params->h_fvv, problem); problem->fdf->fvv = fdf.fvv; } #endif } } /* test_fdf() Test a weighted nonlinear least squares problem Inputs: T - solver to use params - solver parameters xtol - tolerance in x gtol - tolerance in gradient ftol - tolerance in residual vector epsrel - relative error tolerance in solution problem - contains the nonlinear problem and solution point */ static void test_fdf(const gsl_multifit_nlinear_type * T, const gsl_multifit_nlinear_parameters * params, const double xtol, const double gtol, const double ftol, const double epsrel, test_fdf_problem *problem) { gsl_multifit_nlinear_fdf *fdf = problem->fdf; const size_t n = fdf->n; const size_t p = fdf->p; const size_t max_iter = 2500; gsl_vector *x0 = gsl_vector_alloc(p); gsl_vector_view x0v = gsl_vector_view_array(problem->x0, p); gsl_multifit_nlinear_workspace *w = gsl_multifit_nlinear_alloc (T, params, n, p); const char *pname = problem->name; char buf[2048]; char sname[2048]; int status, info; sprintf(buf, "%s/%s/scale=%s/solver=%s", gsl_multifit_nlinear_name(w), params->trs->name, params->scale->name, params->solver->name); if (problem->fdf->df == NULL) { if (params->fdtype == GSL_MULTIFIT_NLINEAR_FWDIFF) strcat(buf, "/fdjac,forward"); else strcat(buf, "/fdjac,center"); } if (problem->fdf->fvv == NULL) { strcat(buf, "/fdfvv"); } strcpy(sname, buf); gsl_vector_memcpy(x0, &x0v.vector); if (problem->weights != NULL) { gsl_vector_const_view wv = gsl_vector_const_view_array(problem->weights, n); gsl_multifit_nlinear_winit(x0, &wv.vector, fdf, w); } else gsl_multifit_nlinear_init(x0, fdf, w); status = gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, w); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); /* check solution */ test_fdf_checksol(sname, pname, epsrel, w, problem); if (problem->weights == NULL) { /* test again with weighting matrix W = I */ gsl_vector *wv = gsl_vector_alloc(n); sprintf(sname, "%s/weighted", buf); gsl_vector_memcpy(x0, &x0v.vector); gsl_vector_set_all(wv, 1.0); gsl_multifit_nlinear_winit(x0, wv, fdf, w); status = gsl_multifit_nlinear_driver(max_iter, xtol, gtol, ftol, NULL, NULL, &info, w); gsl_test(status, "%s/%s did not converge, status=%s", sname, pname, gsl_strerror(status)); test_fdf_checksol(sname, pname, epsrel, w, problem); gsl_vector_free(wv); } gsl_multifit_nlinear_free(w); gsl_vector_free(x0); } static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multifit_nlinear_workspace *w, test_fdf_problem *problem) { gsl_multifit_nlinear_fdf *fdf = problem->fdf; const double *sigma = problem->sigma; gsl_vector *f = gsl_multifit_nlinear_residual(w); gsl_vector *x = gsl_multifit_nlinear_position(w); double sumsq; /* check solution vector x and sumsq = ||f||^2 */ gsl_blas_ddot(f, f, &sumsq); (problem->checksol)(x->data, sumsq, epsrel, sname, pname); /* check variances */ if (sigma) { const size_t n = fdf->n; const size_t p = fdf->p; size_t i; gsl_matrix * covar = gsl_matrix_alloc (p, p); gsl_matrix *J = gsl_multifit_nlinear_jac (w); gsl_multifit_nlinear_covar (J, 0.0, covar); for (i = 0; i < p; i++) { double ei = sqrt(sumsq/(n-p))*sqrt(gsl_matrix_get(covar,i,i)); gsl_test_rel (ei, sigma[i], epsrel, "%s/%s, sigma(%d)", sname, pname, i) ; } gsl_matrix_free (covar); } } gsl-doc-2.3/multifit_nlinear/test_jennrich.c0000644000175000017500000000462412771454236017351 0ustar eddedd#define jennrich_N 10 #define jennrich_P 2 static double jennrich_x0[jennrich_P] = { 0.3, 0.4 }; static double jennrich_epsrel = 1.0e-7; static void jennrich_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.243621823556148e+02; const double jennrich_x[jennrich_P] = { 2.578252139935855e-01, 2.578252133471426e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < jennrich_P; ++i) { gsl_test_rel(x[i], jennrich_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int jennrich_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; double fi = 2.0*(i + 2.0) - (exp(x1*ip1) + exp(x2*ip1)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int jennrich_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; gsl_matrix_set(J, i, 0, -ip1*exp(ip1*x1)); gsl_matrix_set(J, i, 1, -ip1*exp(ip1*x2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int jennrich_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < jennrich_N; ++i) { double ip1 = i + 1.0; double term1 = exp(ip1*x1); double term2 = exp(ip1*x2); gsl_vector_set(fvv, i, -ip1*ip1*(v1*v1*term1 + v2*v2*term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf jennrich_func = { jennrich_f, jennrich_df, jennrich_fvv, jennrich_N, jennrich_P, NULL, 0, 0, 0 }; static test_fdf_problem jennrich_problem = { "jennrich", jennrich_x0, NULL, NULL, &jennrich_epsrel, &jennrich_checksol, &jennrich_func }; gsl-doc-2.3/multifit_nlinear/test_rat43.c0000644000175000017500000000553212771454375016511 0ustar eddedd#define rat43_N 15 #define rat43_P 4 static double rat43_x0a[rat43_P] = { 100.0, 10.0, 1.0, 1.0 }; static double rat43_x0b[rat43_P] = { 700.0, 5.0, 0.75, 1.3 }; static double rat43_epsrel = 1.0e-6; static double rat43_sigma[rat43_P] = { 1.6302297817E+01, 2.0828735829E+00, 1.9566123451E-01, 6.8761936385E-01 }; static double rat43_F[rat43_N] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 }; static void rat43_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.7864049080E+03; const double rat43_x[rat43_P] = { 6.9964151270E+02, 5.2771253025E+00, 7.5962938329E-01, 1.2792483859E+00 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat43_P; ++i) { gsl_test_rel(x[i], rat43_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat43_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double yi = b[0] / pow(1.0 + e, 1.0 / b[3]); gsl_vector_set (f, i, yi - rat43_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat43_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[rat43_P]; size_t i; for (i = 0; i < rat43_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat43_N; i++) { double xi = i + 1.0; double e = exp(b[1] - b[2]*xi); double term1 = 1.0 + e; double term2 = pow(term1, -1.0 / b[3]); gsl_matrix_set (df, i, 0, term2); gsl_matrix_set (df, i, 1, -b[0] / b[3] * e * term2 / term1); gsl_matrix_set (df, i, 2, b[0] / b[3] * xi * e * term2 / term1); gsl_matrix_set (df, i, 3, b[0] / b[3] / b[3] * log(term1) * term2); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf rat43_func = { rat43_f, rat43_df, NULL, /* analytic expression too complex */ rat43_N, rat43_P, NULL, 0, 0, 0 }; static test_fdf_problem rat43a_problem = { "nist-rat43a", rat43_x0a, NULL, rat43_sigma, &rat43_epsrel, &rat43_checksol, &rat43_func }; static test_fdf_problem rat43b_problem = { "nist-rat43b", rat43_x0b, NULL, rat43_sigma, &rat43_epsrel, &rat43_checksol, &rat43_func }; gsl-doc-2.3/multifit_nlinear/test_roth.c0000644000175000017500000000437712771454413016527 0ustar eddedd#define roth_N 2 #define roth_P 2 static double roth_x0[roth_P] = { 0.5, -2.0 }; static double roth_epsrel = 1.0e-6; static void roth_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact1 = 0.0; const double roth_x1[roth_P] = { 5.0, 4.0 }; const double sumsq_exact2 = 48.9842536792400; const double roth_x2[roth_P] = { 11.4127789869021, -0.896805253274477 }; const double *roth_x; double sumsq_exact; if (fabs(sumsq) < 0.1) { sumsq_exact = sumsq_exact1; roth_x = roth_x1; } else { sumsq_exact = sumsq_exact2; roth_x = roth_x2; } gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < roth_P; ++i) { gsl_test_rel(x[i], roth_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int roth_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - x2*(2.0 - x2*(5.0 - x2)) - 13.0); gsl_vector_set(f, 1, x1 - x2*(14.0 - x2*(1.0 + x2)) - 29.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int roth_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 0, 1, -2.0 + x2*(10.0 - 3.0*x2)); gsl_matrix_set(J, 1, 0, 1.0); gsl_matrix_set(J, 1, 1, -14.0 + x2*(2.0 + 3.0*x2)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int roth_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, (10.0 - 6.0*x2) * v2 * v2); gsl_vector_set(fvv, 1, (2.0 + 6.0*x2) * v2 * v2); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf roth_func = { roth_f, roth_df, roth_fvv, roth_N, roth_P, NULL, 0, 0, 0 }; static test_fdf_problem roth_problem = { "roth_freudenstein", roth_x0, NULL, NULL, &roth_epsrel, &roth_checksol, &roth_func }; gsl-doc-2.3/multifit_nlinear/test_penalty1.c0000644000175000017500000000446512771454325017310 0ustar eddedd#define penalty1_P 10 #define penalty1_N (penalty1_P + 1) static double penalty1_x0[penalty1_P] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 }; static double penalty1_epsrel = 1.0e-12; static void penalty1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 7.08765146709037993e-05; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); (void)x; /* avoid unused parameter warning */ } static int penalty1_f (const gsl_vector * x, void *params, gsl_vector * f) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; double sum = 0.0; for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_vector_set(f, i, sqrt_alpha*(xi - 1.0)); sum += xi * xi; } gsl_vector_set(f, penalty1_N - 1, sum - 0.25); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty1_df (const gsl_vector * x, void *params, gsl_matrix * J) { const double alpha = 1.0e-5; const double sqrt_alpha = sqrt(alpha); size_t i; gsl_matrix_view m = gsl_matrix_submatrix(J, 0, 0, penalty1_P, penalty1_P); gsl_vector_view diag = gsl_matrix_diagonal(&m.matrix); gsl_matrix_set_zero(&m.matrix); gsl_vector_set_all(&diag.vector, sqrt_alpha); for (i = 0; i < penalty1_P; ++i) { double xi = gsl_vector_get(x, i); gsl_matrix_set(J, penalty1_N - 1, i, 2.0 * xi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int penalty1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double u; gsl_vector_set_zero(fvv); gsl_blas_ddot(v, v, &u); gsl_vector_set(fvv, penalty1_N - 1, 2.0 * u); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf penalty1_func = { penalty1_f, penalty1_df, penalty1_fvv, penalty1_N, penalty1_P, NULL, 0, 0, 0 }; static test_fdf_problem penalty1_problem = { "penalty1", penalty1_x0, NULL, NULL, &penalty1_epsrel, &penalty1_checksol, &penalty1_func }; gsl-doc-2.3/multifit_nlinear/test_rosenbrock.c0000644000175000017500000000363412771454402017713 0ustar eddedd#define rosenbrock_N 2 #define rosenbrock_P 2 static double rosenbrock_x0[rosenbrock_P] = { -1.2, 1.0 }; static double rosenbrock_epsrel = 1.0e-12; static void rosenbrock_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rosenbrock_P; ++i) { gsl_test_rel(x[i], 1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 10.0 * (x2 - x1*x1)); gsl_vector_set(f, 1, 1.0 - x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrock_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); gsl_matrix_set(J, 0, 0, -20.0*x1); gsl_matrix_set(J, 0, 1, 10.0); gsl_matrix_set(J, 1, 0, -1.0); gsl_matrix_set(J, 1, 1, 0.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rosenbrock_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); gsl_vector_set(fvv, 0, -20.0 * v1 * v1); gsl_vector_set(fvv, 1, 0.0); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf rosenbrock_func = { rosenbrock_f, rosenbrock_df, rosenbrock_fvv, rosenbrock_N, rosenbrock_P, NULL, 0, 0, 0 }; static test_fdf_problem rosenbrock_problem = { "rosenbrock", rosenbrock_x0, NULL, NULL, &rosenbrock_epsrel, &rosenbrock_checksol, &rosenbrock_func }; gsl-doc-2.3/multifit_nlinear/test_box.c0000644000175000017500000000647512771454105016342 0ustar eddedd#define box_N 10 /* can be >= p */ #define box_P 3 /* dogleg method fails with recommended starting point, so use * a slightly easier x0 */ /*static double box_x0[box_P] = { 0.0, 10.0, 20.0 };*/ static double box_x0[box_P] = { 5.0, 10.0, 2.0 }; static double box_epsrel = 1.0e-12; static void box_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 0.0; const double eps = 1.0e-6; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* there are 3 possible solution vectors */ if (fabs(x[2] - 1.0) < eps) { /* case 1: x* = [ 1; 10; 1 ] */ gsl_test_rel(x[0], 1.0, epsrel, "%s/%s i=0", sname, pname); gsl_test_rel(x[1], 10.0, epsrel, "%s/%s i=1", sname, pname); gsl_test_rel(x[2], 1.0, epsrel, "%s/%s i=2", sname, pname); } else if (fabs(x[2] + 1.0) < eps) { /* case 2: x* = [ 10; 1; -1 ] */ gsl_test_rel(x[0], 10.0, epsrel, "%s/%s i=0", sname, pname); gsl_test_rel(x[1], 1.0, epsrel, "%s/%s i=1", sname, pname); gsl_test_rel(x[2], -1.0, epsrel, "%s/%s i=2", sname, pname); } else { /* case 3: x* = [ a; a; 0 ] for any a */ gsl_test_rel(x[0], x[1], epsrel, "%s/%s i=0,1", sname, pname); gsl_test_rel(x[2], 0.0, epsrel, "%s/%s i=2", sname, pname); } } static int box_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double fi = exp(-x1*ti) - exp(-x2*ti) - x3*(exp(-ti) - exp(-10.0*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int box_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double term1 = exp(-x1*ti); double term2 = exp(-x2*ti); double term3 = exp(-10.0*ti) - exp(-ti); gsl_matrix_set(J, i, 0, -ti*term1); gsl_matrix_set(J, i, 1, ti*term2); gsl_matrix_set(J, i, 2, term3); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int box_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < box_N; ++i) { double ti = (i + 1.0) / 10.0; double term1 = exp(-x1*ti); double term2 = exp(-x2*ti); gsl_vector_set(fvv, i, ti * ti * (v1*v1*term1 - v2*v2*term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf box_func = { box_f, box_df, box_fvv, box_N, box_P, NULL, 0, 0, 0 }; static test_fdf_problem box_problem = { "box3d", box_x0, NULL, NULL, &box_epsrel, &box_checksol, &box_func }; gsl-doc-2.3/multifit_nlinear/test_lin2.c0000644000175000017500000000402012771454271016402 0ustar eddedd#define lin2_N 20 /* can be anything >= p */ #define lin2_P 5 static double lin2_x0[lin2_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin2_epsrel = 1.0e-9; static void lin2_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin2_N; const double sumsq_exact = 0.5 * (n*(n - 1.0)) / (2.0*n + 1.0); const double sum_exact = 3.0 / (2.0*n + 1.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin2_P; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); } static int lin2_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin2_N; ++i) { double fi = 0.0; for (j = 0; j < lin2_P; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = (i + 1) * fi - 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin2_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (i = 0; i < lin2_N; ++i) { for (j = 0; j < lin2_P; ++j) { gsl_matrix_set(J, i, j, (i + 1.0) * (j + 1.0)); } } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin2_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf lin2_func = { lin2_f, lin2_df, lin2_fvv, lin2_N, lin2_P, NULL, 0, 0, 0 }; static test_fdf_problem lin2_problem = { "linear_rank1", lin2_x0, NULL, NULL, &lin2_epsrel, &lin2_checksol, &lin2_func }; gsl-doc-2.3/multifit_nlinear/test_beale.c0000644000175000017500000000445312771454044016616 0ustar eddedd#define beale_N 3 #define beale_P 2 static double beale_x0[beale_P] = { 1.0, 1.0 }; static double beale_epsrel = 1.0e-12; static double beale_Y[beale_N] = { 1.5, 2.25, 2.625 }; static void beale_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double beale_x[beale_P] = { 3.0, 0.5 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < beale_P; ++i) { gsl_test_rel(x[i], beale_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int beale_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double yi = beale_Y[i]; double term = pow(x2, i + 1.0); double fi = yi - x1*(1.0 - term); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int beale_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); size_t i; for (i = 0; i < beale_N; ++i) { double term = pow(x2, (double) i); gsl_matrix_set(J, i, 0, term*x2 - 1.0); gsl_matrix_set(J, i, 1, (i + 1.0) * x1 * term); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int beale_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < beale_N; ++i) { double term = pow(x2, (double)i - 1.0); gsl_vector_set(fvv, i, (i + 1.0) * v2 * term * (i * v2 * x1 + 2.0 * v1 * x2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf beale_func = { beale_f, beale_df, beale_fvv, beale_N, beale_P, NULL, 0, 0, 0 }; static test_fdf_problem beale_problem = { "beale", beale_x0, NULL, NULL, &beale_epsrel, &beale_checksol, &beale_func }; gsl-doc-2.3/multifit_nlinear/test_lin3.c0000644000175000017500000000432512771454276016420 0ustar eddedd#define lin3_N 50 /* can be anything >= p */ #define lin3_P 10 /* >= 3 */ static double lin3_x0[lin3_P] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin3_epsrel = 1.0e-8; static void lin3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double n = (double) lin3_N; const double sumsq_exact = 0.5 * (n*n + 3*n - 6.0) / (2*n - 3.0); const double sum_exact = 3.0 / (2.0*n - 3.0); double sum = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 1; i < lin3_P - 1; ++i) sum += (i + 1.0) * x[i]; gsl_test_rel(sum, sum_exact, epsrel, "%s/%s coeff sum", sname, pname); (void)x; /* avoid unused parameter warning */ } static int lin3_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; gsl_vector_set(f, 0, -1.0); gsl_vector_set(f, lin3_N - 1, -1.0); for (i = 1; i < lin3_N - 1; ++i) { double fi = 0.0; for (j = 1; j < lin3_P - 1; ++j) { double xj = gsl_vector_get(x, j); fi += (j + 1) * xj; } fi = i * fi - 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin3_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; gsl_matrix_set_zero(J); for (i = 1; i < lin3_N - 1; ++i) { for (j = 1; j < lin3_P - 1; ++j) { gsl_matrix_set(J, i, j, i * (j + 1.0)); } } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf lin3_func = { lin3_f, lin3_df, lin3_fvv, lin3_N, lin3_P, NULL, 0, 0, 0 }; static test_fdf_problem lin3_problem = { "linear_rank1zeros", lin3_x0, NULL, NULL, &lin3_epsrel, &lin3_checksol, &lin3_func }; gsl-doc-2.3/multifit_nlinear/test_helical.c0000644000175000017500000000522312771454230017140 0ustar eddedd#define helical_N 3 #define helical_P 3 static double helical_x0[helical_P] = { -1.0, 0.0, 0.0 }; static double helical_x[helical_P] = { 1.0, 0.0, 0.0 }; static double helical_epsrel = 1.0e-12; static void helical_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < helical_P; ++i) { gsl_test_rel(x[i], helical_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int helical_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double theta = (x1 >= 0.0) ? 0.0 : 5.0; double nx = gsl_hypot(x1, x2); gsl_vector_set(f, 0, 10.0 * (x3 - 5.0/M_PI*atan(x2 / x1) - theta)); gsl_vector_set(f, 1, 10.0*(nx - 1.0)); gsl_vector_set(f, 2, x3); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int helical_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double nx = gsl_hypot(x1, x2); double nx_sq = nx * nx; double term1 = 50.0 / (M_PI * nx_sq); double term2 = 10.0 / nx; gsl_matrix_set(J, 0, 0, term1*x2); gsl_matrix_set(J, 0, 1, -term1*x1); gsl_matrix_set(J, 0, 2, 10.0); gsl_matrix_set(J, 1, 0, term2*x1); gsl_matrix_set(J, 1, 1, term2*x2); gsl_matrix_set(J, 1, 2, 0.0); gsl_matrix_set(J, 2, 0, 0.0); gsl_matrix_set(J, 2, 1, 0.0); gsl_matrix_set(J, 2, 2, 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int helical_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double term1 = v2*x1 - v1*x2; double term2 = v1*x1 + v2*x2; double term3 = x1*x1 + x2*x2; gsl_vector_set(fvv, 0, 100.0 / M_PI * (term1 / term3) * (term2 / term3)); gsl_vector_set(fvv, 1, 10.0 * (term1 * term1) / pow(term3, 1.5)); gsl_vector_set(fvv, 2, 0.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf helical_func = { helical_f, helical_df, helical_fvv, helical_N, helical_P, NULL, 0, 0, 0 }; static test_fdf_problem helical_problem = { "helical", helical_x0, NULL, NULL, &helical_epsrel, &helical_checksol, &helical_func }; gsl-doc-2.3/multifit_nlinear/trust.c0000644000175000017500000004156712764323524015677 0ustar eddedd/* multifit_nlinear/trust.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "common.c" #include "nielsen.c" /* * This module contains a high level driver for a general trust * region nonlinear least squares solver. This container handles * the computation of all of the quantities relevant to all trust * region methods, including: * * residual vector: f_k = f(x_k) * Jacobian matrix: J_k = J(x_k) * gradient vector: g_k = J_k^T f_k * scaling matrix: D_k */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ double delta; /* trust region radius */ double mu; /* LM parameter */ long nu; /* for updating LM parameter */ gsl_vector *diag; /* D = diag(J^T J) */ gsl_vector *x_trial; /* trial parameter vector */ gsl_vector *f_trial; /* trial function vector */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ void *trs_state; /* workspace for trust region subproblem */ void *solver_state; /* workspace for linear least squares solver */ double avratio; /* current |a| / |v| */ /* tunable parameters */ gsl_multifit_nlinear_parameters params; } trust_state_t; static void * trust_alloc (const gsl_multifit_nlinear_parameters * params, const size_t n, const size_t p); static void trust_free(void *vstate); static int trust_init(void *vstate, const gsl_vector * swts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *x, gsl_vector *f, gsl_matrix *J, gsl_vector *g); static int trust_iterate(void *vstate, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_matrix *J, gsl_vector *g, gsl_vector *dx); static int trust_rcond(double *rcond, void *vstate); static double trust_avratio(void *vstate); static void trust_trial_step(const gsl_vector * x, const gsl_vector * dx, gsl_vector * x_trial); static double trust_calc_rho(const gsl_vector * f, const gsl_vector * f_trial, const gsl_vector * g, const gsl_matrix * J, const gsl_vector * dx, trust_state_t * state); static int trust_eval_step(const gsl_vector * f, const gsl_vector * f_trial, const gsl_vector * g, const gsl_matrix * J, const gsl_vector * dx, double * rho, trust_state_t * state); static double trust_scaled_norm(const gsl_vector *D, const gsl_vector *a); static void * trust_alloc (const gsl_multifit_nlinear_parameters * params, const size_t n, const size_t p) { trust_state_t *state; state = calloc(1, sizeof(trust_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate lm state", GSL_ENOMEM); } state->diag = gsl_vector_alloc(p); if (state->diag == NULL) { GSL_ERROR_NULL ("failed to allocate space for diag", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->x_trial = gsl_vector_alloc(p); if (state->x_trial == NULL) { GSL_ERROR_NULL ("failed to allocate space for x_trial", GSL_ENOMEM); } state->f_trial = gsl_vector_alloc(n); if (state->f_trial == NULL) { GSL_ERROR_NULL ("failed to allocate space for f_trial", GSL_ENOMEM); } state->trs_state = (params->trs->alloc)(params, n, p); if (state->trs_state == NULL) { GSL_ERROR_NULL ("failed to allocate space for trs state", GSL_ENOMEM); } state->solver_state = (params->solver->alloc)(n, p); if (state->solver_state == NULL) { GSL_ERROR_NULL ("failed to allocate space for solver state", GSL_ENOMEM); } state->n = n; state->p = p; state->delta = 0.0; state->params = *params; return state; } static void trust_free(void *vstate) { trust_state_t *state = (trust_state_t *) vstate; const gsl_multifit_nlinear_parameters *params = &(state->params); if (state->diag) gsl_vector_free(state->diag); if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); if (state->x_trial) gsl_vector_free(state->x_trial); if (state->f_trial) gsl_vector_free(state->f_trial); if (state->trs_state) (params->trs->free)(state->trs_state); if (state->solver_state) (params->solver->free)(state->solver_state); free(state); } /* trust_init() Initialize trust region solver Inputs: vstate - workspace swts - sqrt(W) vector fdf - user callback functions x - initial parameter values f - (output) f(x) vector J - (output) J(x) matrix g - (output) J(x)' f(x) vector Return: success/error */ static int trust_init(void *vstate, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *x, gsl_vector *f, gsl_matrix *J, gsl_vector *g) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multifit_nlinear_parameters *params = &(state->params); double Dx; /* evaluate function and Jacobian at x and apply weight transform */ status = gsl_multifit_nlinear_eval_f(fdf, x, swts, f); if (status) return status; status = gsl_multifit_nlinear_eval_df(x, f, swts, params->h_df, params->fdtype, fdf, J, state->workn); if (status) return status; /* compute g = J^T f */ gsl_blas_dgemv(CblasTrans, 1.0, J, f, 0.0, g); /* initialize diagonal scaling matrix D */ (params->scale->init)(J, state->diag); /* compute initial trust region radius */ Dx = trust_scaled_norm(state->diag, x); state->delta = 0.3 * GSL_MAX(1.0, Dx); /* initialize LM parameter */ status = nielsen_init(J, state->diag, &(state->mu), &(state->nu)); if (status) return status; /* initialize trust region method solver */ { const gsl_multifit_nlinear_trust_state trust_state = { x, f, g, J, state->diag, swts, &(state->mu), params, state->solver_state, fdf, &(state->avratio) }; status = (params->trs->init)(&trust_state, state->trs_state); if (status) return status; } /* set default parameters */ state->avratio = 0.0; return GSL_SUCCESS; } /* trust_iterate() This function performs 1 iteration of the trust region algorithm. It calls a user-specified method for computing the next step (LM or dogleg), then tests if the computed step is acceptable. Args: vstate - trust workspace swts - data weights (NULL if unweighted) fdf - function and Jacobian pointers x - on input, current parameter vector on output, new parameter vector x + dx f - on input, f(x) on output, f(x + dx) J - on input, J(x) on output, J(x + dx) g - on input, g(x) = J(x)' f(x) on output, g(x + dx) = J(x + dx)' f(x + dx) dx - (output only) parameter step vector Return: 1) GSL_SUCCESS if we found a step which reduces the cost function 2) GSL_ENOPROG if 15 successive attempts were to made to find a good step without success 3) If a scaling matrix D is used, inputs and outputs are set to the unscaled quantities (ie: J and g) */ static int trust_iterate(void *vstate, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *x, gsl_vector *f, gsl_matrix *J, gsl_vector *g, gsl_vector *dx) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multifit_nlinear_parameters *params = &(state->params); const gsl_multifit_nlinear_trs *trs = params->trs; /* collect all state parameters needed by low level methods */ const gsl_multifit_nlinear_trust_state trust_state = { x, f, g, J, state->diag, swts, &(state->mu), params, state->solver_state, fdf, &(state->avratio) }; gsl_vector *x_trial = state->x_trial; /* trial x + dx */ gsl_vector *f_trial = state->f_trial; /* trial f(x + dx) */ gsl_vector *diag = state->diag; /* diag(D) */ double rho; /* ratio actual_reduction/predicted_reduction */ int foundstep = 0; /* found step dx */ int bad_steps = 0; /* consecutive rejected steps */ /* initialize trust region subproblem with this Jacobian */ status = (trs->preloop)(&trust_state, state->trs_state); if (status) return status; /* loop until we find an acceptable step dx */ while (!foundstep) { /* calculate new step */ status = (trs->step)(&trust_state, state->delta, dx, state->trs_state); /* occasionally the iterative methods (ie: CG Steihaug) can fail to find a step, * so in this case skip rho calculation and count it as a rejected step */ if (status == GSL_SUCCESS) { /* compute x_trial = x + dx */ trust_trial_step(x, dx, x_trial); /* compute f_trial = f(x + dx) */ status = gsl_multifit_nlinear_eval_f(fdf, x_trial, swts, f_trial); if (status) return status; /* check if step should be accepted or rejected */ status = trust_eval_step(f, f_trial, g, J, dx, &rho, state); if (status == GSL_SUCCESS) foundstep = 1; } else { /* an iterative TRS method failed to find a step vector */ rho = -1.0; } /* * update trust region radius: if rho is large, * then the quadratic model is a good approximation * to the objective function, enlarge trust region. * If rho is small (or negative), the model function * is a poor approximation so decrease trust region. This * can happen even if the step is accepted. */ if (rho > 0.75) state->delta *= params->factor_up; else if (rho < 0.25) state->delta /= params->factor_down; if (foundstep) { /* step was accepted */ /* compute J <- J(x + dx) */ status = gsl_multifit_nlinear_eval_df(x_trial, f_trial, swts, params->h_df, params->fdtype, fdf, J, state->workn); if (status) return status; /* update x <- x + dx */ gsl_vector_memcpy(x, x_trial); /* update f <- f(x + dx) */ gsl_vector_memcpy(f, f_trial); /* compute new g = J^T f */ gsl_blas_dgemv(CblasTrans, 1.0, J, f, 0.0, g); /* update scaling matrix D */ (params->scale->update)(J, diag); /* step accepted, decrease LM parameter */ status = nielsen_accept(rho, &(state->mu), &(state->nu)); if (status) return status; bad_steps = 0; } else { /* step rejected, increase LM parameter */ status = nielsen_reject(&(state->mu), &(state->nu)); if (status) return status; if (++bad_steps > 15) { /* if more than 15 consecutive rejected steps, report no progress */ return GSL_ENOPROG; } } } return GSL_SUCCESS; } /* trust_iterate() */ static int trust_rcond(double *rcond, void *vstate) { int status; trust_state_t *state = (trust_state_t *) vstate; const gsl_multifit_nlinear_parameters *params = &(state->params); status = (params->solver->rcond)(rcond, state->solver_state); return status; } static double trust_avratio(void *vstate) { trust_state_t *state = (trust_state_t *) vstate; return state->avratio; } /* compute x_trial = x + dx */ static void trust_trial_step(const gsl_vector * x, const gsl_vector * dx, gsl_vector * x_trial) { size_t i, N = x->size; for (i = 0; i < N; i++) { double dxi = gsl_vector_get (dx, i); double xi = gsl_vector_get (x, i); gsl_vector_set (x_trial, i, xi + dxi); } } /* trust_calc_rho() Calculate ratio of actual reduction to predicted reduction. rho = actual_reduction / predicted_reduction actual_reduction = 1 - ( ||f+|| / ||f|| )^2 predicted_reduction = -2 g^T dx / ||f||^2 - ( ||J*dx|| / ||f|| )^2 = -2 fhat . beta - ||beta||^2 where: beta = J*dx / ||f|| Inputs: f - f(x) f_trial - f(x + dx) g - gradient J^T f J - Jacobian dx - proposed step, size p state - workspace Return: rho = actual_reduction / predicted_reduction If actual_reduction is < 0, return rho = -1 */ static double trust_calc_rho(const gsl_vector * f, const gsl_vector * f_trial, const gsl_vector * g, const gsl_matrix * J, const gsl_vector * dx, trust_state_t * state) { int status; const gsl_multifit_nlinear_parameters *params = &(state->params); const gsl_multifit_nlinear_trs *trs = params->trs; const gsl_multifit_nlinear_trust_state trust_state = { NULL, f, g, J, state->diag, NULL, &(state->mu), params, state->solver_state, NULL, &(state->avratio) }; const double normf = gsl_blas_dnrm2(f); const double normf_trial = gsl_blas_dnrm2(f_trial); double rho; double actual_reduction; double pred_reduction; double u; /* if ||f(x+dx)|| > ||f(x)|| reject step immediately */ if (normf_trial >= normf) return -1.0; /* compute numerator of rho (actual reduction) */ u = normf_trial / normf; actual_reduction = 1.0 - u*u; /* * compute denominator of rho (predicted reduction); this is calculated * inside each trust region subproblem, since it depends on the local * model used, which can vary according to each TRS */ status = (trs->preduction)(&trust_state, dx, &pred_reduction, state->trs_state); if (status) return -1.0; if (pred_reduction > 0.0) rho = actual_reduction / pred_reduction; else rho = -1.0; return rho; } /* trust_eval_step() Evaluate proposed step to determine if it should be accepted or rejected */ static int trust_eval_step(const gsl_vector * f, const gsl_vector * f_trial, const gsl_vector * g, const gsl_matrix * J, const gsl_vector * dx, double * rho, trust_state_t * state) { int status = GSL_SUCCESS; const gsl_multifit_nlinear_parameters *params = &(state->params); if (params->trs == gsl_multifit_nlinear_trs_lmaccel) { /* reject step if acceleration is too large compared to velocity */ if (state->avratio > params->avmax) status = GSL_FAILURE; } /* compute rho */ *rho = trust_calc_rho(f, f_trial, g, J, dx, state); if (*rho <= 0.0) status = GSL_FAILURE; return status; } /* compute || diag(D) a || */ static double trust_scaled_norm(const gsl_vector *D, const gsl_vector *a) { const size_t n = a->size; double e2 = 0.0; size_t i; for (i = 0; i < n; ++i) { double Di = gsl_vector_get(D, i); double ai = gsl_vector_get(a, i); double u = Di * ai; e2 += u * u; } return sqrt (e2); } static const gsl_multifit_nlinear_type trust_type = { "trust-region", trust_alloc, trust_init, trust_iterate, trust_rcond, trust_avratio, trust_free }; const gsl_multifit_nlinear_type *gsl_multifit_nlinear_trust = &trust_type; gsl-doc-2.3/multifit_nlinear/test_eckerle.c0000644000175000017500000000741612771517606017166 0ustar eddedd#define eckerle_N 35 #define eckerle_P 3 static double eckerle_x0a[eckerle_P] = { 1.0, 10.0, 500.0 }; static double eckerle_x0b[eckerle_P] = { 1.5, 5.0, 450.0 }; static double eckerle_epsrel = 1.0e-7; static double eckerle_sigma[eckerle_P] = { 1.5408051163E-02, 4.6803020753E-02, 4.6800518816E-02 }; static double eckerle_X[eckerle_N] = { 400.000000, 405.000000, 410.000000, 415.000000, 420.000000, 425.000000, 430.000000, 435.000000, 436.500000, 438.000000, 439.500000, 441.000000, 442.500000, 444.000000, 445.500000, 447.000000, 448.500000, 450.000000, 451.500000, 453.000000, 454.500000, 456.000000, 457.500000, 459.000000, 460.500000, 462.000000, 463.500000, 465.000000, 470.000000, 475.000000, 480.000000, 485.000000, 490.000000, 495.000000, 500.000000 }; static double eckerle_F[eckerle_N] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 }; static void eckerle_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.4635887487E-03; const double eckerle_x[eckerle_P] = { 1.5543827178E+00, 4.0888321754E+00, 4.5154121844E+02 }; double new_x[3]; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* x1 and x2 are unique up to a sign, but they must be * the same sign */ if (x[0] < 0.0 && x[1] < 0.0) { new_x[0] = -x[0]; new_x[1] = -x[1]; } else { new_x[0] = x[0]; new_x[1] = x[1]; } new_x[2] = x[2]; for (i = 0; i < eckerle_P; ++i) { gsl_test_rel(new_x[i], eckerle_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int eckerle_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term = xi - b[2]; double yi; yi = b[0] / b[1] * exp(-0.5 * term * term / b[1] / b[1]); gsl_vector_set (f, i, yi - eckerle_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int eckerle_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[eckerle_P]; size_t i; for (i = 0; i < eckerle_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < eckerle_N; i++) { double xi = eckerle_X[i]; double term1 = xi - b[2]; double term2 = exp(-0.5 * term1 * term1 / (b[1] * b[1])); gsl_matrix_set (df, i, 0, term2 / b[1]); gsl_matrix_set (df, i, 1, -b[0] * term2 / (b[1] * b[1]) + b[0] / pow(b[1], 4.0) * term2 * term1 * term1); gsl_matrix_set (df, i, 2, b[0] / pow(b[1], 3.0) * term1 * term2); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf eckerle_func = { eckerle_f, eckerle_df, NULL, /* analytic expression too complex */ eckerle_N, eckerle_P, NULL, 0, 0, 0 }; static test_fdf_problem eckerlea_problem = { "nist-eckerlea", eckerle_x0a, NULL, eckerle_sigma, &eckerle_epsrel, &eckerle_checksol, &eckerle_func }; static test_fdf_problem eckerleb_problem = { "nist-eckerleb", eckerle_x0b, NULL, eckerle_sigma, &eckerle_epsrel, &eckerle_checksol, &eckerle_func }; gsl-doc-2.3/multifit_nlinear/nielsen.c0000644000175000017500000000532212753366676016155 0ustar eddedd/* multifit_nlinear/nielsen.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module contains routines for updating the Levenberg-Marquardt * damping parameter on each iteration using Nielsen's method: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * 5 routines are needed to implement the update procedure: * * 1. accept - update parameter after a step has been accepted * 2. reject - update parameter after a step has been rejected * 3. free - free workspace state */ #include #include #include #include #include #include #include #include #define LM_ONE_THIRD (0.333333333333333) static int nielsen_init(const gsl_matrix * J, const gsl_vector * diag, double * mu, long * nu); static int nielsen_accept(const double rho, double * mu, long * nu); static int nielsen_reject(double * mu, long * nu); static int nielsen_init(const gsl_matrix * J, const gsl_vector * diag, double * mu, long * nu) { const double mu0 = 1.0e-3; const size_t p = J->size2; size_t j; double max = -1.0; *nu = 2; /* set mu = mu0 * max(diag(J~^T J~)), with J~ = J D^{-1} */ for (j = 0; j < p; ++j) { gsl_vector_const_view v = gsl_matrix_const_column(J, j); double dj = gsl_vector_get(diag, j); double norm = gsl_blas_dnrm2(&v.vector) / dj; max = GSL_MAX(max, norm); } *mu = mu0 * max * max; return GSL_SUCCESS; } static int nielsen_accept(const double rho, double * mu, long * nu) { double b; /* reset nu */ *nu = 2; b = 2.0 * rho - 1.0; b = 1.0 - b*b*b; *mu *= GSL_MAX(LM_ONE_THIRD, b); return GSL_SUCCESS; } static int nielsen_reject(double * mu, long * nu) { *mu *= (double) *nu; /* nu := 2*nu */ *nu <<= 1; return GSL_SUCCESS; } gsl-doc-2.3/multifit_nlinear/fdfvv.c0000644000175000017500000000720112771455605015620 0ustar eddedd/* multifit_nlinear/fdfvv.c * * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* fdfvv() Compute approximate second directional derivative using finite differences. See Eq. 19 of: M. K. Transtrum, J. P. Sethna, Improvements to the Levenberg Marquardt algorithm for nonlinear least-squares minimization, arXiv:1201.5885, 2012. Inputs: h - step size for finite difference x - parameter vector, size p v - geodesic velocity, size p f - vector of function values f_i(x), size n J - Jacobian matrix J(x), n-by-p swts - data weights fdf - fdf struct fvv - (output) approximate second directional derivative vector D_v^2 f(x) work - workspace, size p Return: success or error */ static int fdfvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *fvv, gsl_vector *work) { int status; const size_t n = fdf->n; const size_t p = fdf->p; const double hinv = 1.0 / h; size_t i; /* compute work = x + h*v */ for (i = 0; i < p; ++i) { double xi = gsl_vector_get(x, i); double vi = gsl_vector_get(v, i); gsl_vector_set(work, i, xi + h * vi); } /* compute f(x + h*v) */ status = gsl_multifit_nlinear_eval_f (fdf, work, swts, fvv); if (status) return status; for (i = 0; i < n; ++i) { double fi = gsl_vector_get(f, i); /* f_i(x) */ double fip = gsl_vector_get(fvv, i); /* f_i(x + h*v) */ gsl_vector_const_view row = gsl_matrix_const_row(J, i); double u, fvvi; /* compute u = sum_{ij} J_{ij} D v_j */ gsl_blas_ddot(&row.vector, v, &u); fvvi = (2.0 * hinv) * ((fip - fi) * hinv - u); gsl_vector_set(fvv, i, fvvi); } return status; } /* gsl_multifit_nlinear_fdfvv() Compute approximate second directional derivative using finite differences Inputs: h - step size for finite difference x - parameter vector, size p v - geodesic velocity, size p f - function values f_i(x), size n J - Jacobian matrix J(x), n-by-p swts - sqrt data weights (set to NULL if not needed) fdf - fdf fvv - (output) approximate (weighted) second directional derivative vector, size n, sqrt(W) fvv work - workspace, size p Return: success or error */ int gsl_multifit_nlinear_fdfvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *fvv, gsl_vector *work) { return fdfvv(h, x, v, f, J, swts, fdf, fvv, work); } gsl-doc-2.3/multifit_nlinear/covar.c0000644000175000017500000001156712757326356015635 0ustar eddedd/* multifit_nlinear/covar.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include static int covar_QRPT (gsl_matrix * r, gsl_permutation * perm, const double epsrel, gsl_matrix * covar); /* Compute the covariance matrix cov = inv (J^T J) by QRP^T decomposition of J */ int gsl_multifit_nlinear_covar (const gsl_matrix * J, const double epsrel, gsl_matrix * covar) { int status; gsl_matrix * r; gsl_vector * tau; gsl_vector * norm; gsl_permutation * perm; const size_t m = J->size1; const size_t 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); } status = covar_QRPT(r, perm, epsrel, covar); gsl_matrix_free (r); gsl_permutation_free (perm); gsl_vector_free (tau); gsl_vector_free (norm); return status; } static int covar_QRPT (gsl_matrix * r, gsl_permutation * perm, const double epsrel, gsl_matrix * covar) { /* Form the inverse of R in the full upper triangle of R */ double tolr = epsrel * fabs(gsl_matrix_get(r, 0, 0)); const size_t n = r->size2; size_t i, j, k; size_t kmax = 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); } } return GSL_SUCCESS; } gsl-doc-2.3/multifit_nlinear/test_watson.c0000644000175000017500000000671212771454441017062 0ustar eddedd#define watson_N 31 #define watson_P 6 static double watson_x0[watson_P] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; static double watson_epsrel = 1.0e-6; static void watson_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 2.287670053552372e-03; const double watson_x[watson_P] = { -1.572508640629858e-02, 1.012434869366059e+00, -2.329916259263380e-01, 1.260430087686035e+00, -1.513728922580576e+00, 9.929964323646112e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < watson_P; ++i) { gsl_test_rel(x[i], watson_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int watson_f (const gsl_vector * x, void *params, gsl_vector * f) { const double x1 = gsl_vector_get(x, 0); const double x2 = gsl_vector_get(x, 1); size_t i, j; for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0, sum2 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; if (j > 0) { sum2 += j * xj * tjm2; tjm2 *= ti; } } gsl_vector_set (f, i, sum2 - sum1*sum1 - 1.0); } gsl_vector_set(f, watson_N - 2, x1); gsl_vector_set(f, watson_N - 1, x2 - x1*x1 - 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int watson_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get (x, 0); size_t i, j; gsl_matrix_set_zero(J); for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double tjm1 = 1.0, tjm2 = 1.0; double sum1 = 0.0; for (j = 0; j < watson_P; ++j) { double xj = gsl_vector_get(x, j); sum1 += xj * tjm1; tjm1 *= ti; } tjm1 = 1.0; tjm2 = 1.0; for (j = 0; j < watson_P; ++j) { gsl_matrix_set(J, i, j, j * tjm2 - 2.0*sum1*tjm1); tjm1 *= ti; if (j > 0) tjm2 *= ti; } } gsl_matrix_set(J, watson_N - 2, 0, 1.0); gsl_matrix_set(J, watson_N - 1, 0, -2.0*x1); gsl_matrix_set(J, watson_N - 1, 1, 1.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int watson_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get (v, 0); size_t i, j; for (i = 0; i < watson_N - 2; ++i) { double ti = (i + 1) / 29.0; double sum = 0.0; double tjm1 = 1.0; for (j = 0; j < watson_P; ++j) { double vj = gsl_vector_get(v, j); sum += vj * tjm1; tjm1 *= ti; } gsl_vector_set(fvv, i, -2.0*sum*sum); } gsl_vector_set(fvv, watson_N - 2, 0.0); gsl_vector_set(fvv, watson_N - 1, -2.0*v1*v1); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf watson_func = { watson_f, watson_df, watson_fvv, watson_N, watson_P, NULL, 0, 0, 0 }; static test_fdf_problem watson_problem = { "watson", watson_x0, NULL, NULL, &watson_epsrel, &watson_checksol, &watson_func }; gsl-doc-2.3/multifit_nlinear/Makefile.in0000644000175000017500000011146413022372406016400 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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_nlinear DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultifit_nlinear_la_LIBADD = am_libgslmultifit_nlinear_la_OBJECTS = cholesky.lo convergence.lo \ covar.lo dogleg.lo fdf.lo fdfvv.lo fdjac.lo lm.lo qr.lo \ scaling.lo subspace2D.lo svd.lo trust.lo libgslmultifit_nlinear_la_OBJECTS = \ $(am_libgslmultifit_nlinear_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultifit_nlinear.la ../eigen/libgsleigen.la \ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../sort/libgslsort.la \ ../statistics/libgslstatistics.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 \ ../rng/libgslrng.la ../specfunc/libgslspecfunc.la \ ../poly/libgslpoly.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultifit_nlinear_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultifit_nlinear_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultifit_nlinear.la pkginclude_HEADERS = gsl_multifit_nlinear.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_nlinear_la_SOURCES = cholesky.c convergence.c covar.c dogleg.c fdf.c fdfvv.c fdjac.c lm.c qr.c scaling.c subspace2D.c svd.c trust.c noinst_HEADERS = \ common.c \ nielsen.c \ qrsolv.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_exp1.c \ test_fdf.c \ test_gaussian.c \ test_hahn1.c \ test_helical.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_meyer.c \ test_meyerscal.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wnlin.c \ test_wood.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultifit_nlinear.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../sort/libgslsort.la ../statistics/libgslstatistics.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 ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../poly/libgslpoly.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multifit_nlinear/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multifit_nlinear/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultifit_nlinear.la: $(libgslmultifit_nlinear_la_OBJECTS) $(libgslmultifit_nlinear_la_DEPENDENCIES) $(EXTRA_libgslmultifit_nlinear_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultifit_nlinear_la_OBJECTS) $(libgslmultifit_nlinear_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfvv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/multifit_nlinear/test_powell3.c0000644000175000017500000000417612771454350017135 0ustar eddedd#define powell3_N 2 #define powell3_P 2 static double powell3_x0[powell3_P] = { 0.0, 1.0 }; static double powell3_epsrel = 1.0e-10; static void powell3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double powell3_x[powell3_P] = { 1.09815932969975976e-05, 9.10614673986700218 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < powell3_P; ++i) { gsl_test_rel(x[i], powell3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int powell3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, 1.0e4*x1*x2 - 1.0); gsl_vector_set(f, 1, exp(-x1) + exp(-x2) - 1.0001); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell3_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set(J, 0, 0, 1.0e4*x2); gsl_matrix_set(J, 0, 1, 1.0e4*x1); gsl_matrix_set(J, 1, 0, -exp(-x1)); gsl_matrix_set(J, 1, 1, -exp(-x2)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int powell3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, 2.0e4 * v1 * v2); gsl_vector_set(fvv, 1, v1*v1*exp(-x1) + v2*v2*exp(-x2)); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf powell3_func = { powell3_f, powell3_df, powell3_fvv, powell3_N, powell3_P, NULL, 0, 0, 0 }; static test_fdf_problem powell3_problem = { "powell_badly_scaled", powell3_x0, NULL, NULL, &powell3_epsrel, &powell3_checksol, &powell3_func }; gsl-doc-2.3/multifit_nlinear/test_hahn1.c0000644000175000017500000001741112771454223016542 0ustar eddedd#define hahn1_N 236 #define hahn1_P 7 static double hahn1_x0a[hahn1_P] = { 10, -1, 0.05, -0.00001, -0.05, 0.001, -0.000001 }; static double hahn1_x0b[hahn1_P] = { 1, -0.1, 0.005, -0.000001, -0.005, 0.0001, -0.0000001}; static double hahn1_epsrel = 1.0e-5; static double hahn1_sigma[hahn1_P] = { 1.7070154742E-01, 1.2000289189E-02, 2.2508314937E-04, 2.7578037666E-07, 2.4712888219E-04, 1.0449373768E-05, 1.3027335327E-08 }; static double hahn1_F1[hahn1_N] = { .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 }; static double hahn1_F0[hahn1_N] = { 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 }; static void hahn1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.5324382854E+00; const double hahn1_x[hahn1_P] = { 1.0776351733E+00, -1.2269296921E-01, 4.0863750610E-03, -1.4262662514E-06, -5.7609940901E-03, 2.4053735503E-04, -1.2314450199E-07 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < hahn1_P; ++i) { gsl_test_rel(x[i], hahn1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int hahn1_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; i++) { double t = hahn1_F0[i]; double y = ((b[0] + t* (b[1] + t * (b[2] + t * b[3]))) / (1 + t*(b[4] + t *(b[5] + t*b[6])))); gsl_vector_set (f, i, hahn1_F1[i] - y); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int hahn1_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[hahn1_P]; size_t i; for (i = 0; i < hahn1_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < hahn1_N; i++) { double t = hahn1_F0[i]; double u = (b[0] + t*(b[1] + t*(b[2] + t * b[3]))); double v = (1 + t*(b[4] + t*(b[5] + t*b[6]))); gsl_matrix_set (df, i, 0, -1/v); gsl_matrix_set (df, i, 1, -t/v); gsl_matrix_set (df, i, 2, -t*t/v); gsl_matrix_set (df, i, 3, -t*t*t/v); gsl_matrix_set (df, i, 4, t*u/(v*v)); gsl_matrix_set (df, i, 5, t*t*u/(v*v)); gsl_matrix_set (df, i, 6, t*t*t*u/(v*v)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf hahn1_func = { hahn1_f, hahn1_df, NULL, /* analytic expression too complex */ hahn1_N, hahn1_P, NULL, 0, 0, 0 }; static test_fdf_problem hahn1a_problem = { "nist-hahn1a", hahn1_x0a, NULL, hahn1_sigma, &hahn1_epsrel, &hahn1_checksol, &hahn1_func }; static test_fdf_problem hahn1b_problem = { "nist-hahn1b", hahn1_x0b, NULL, hahn1_sigma, &hahn1_epsrel, &hahn1_checksol, &hahn1_func }; gsl-doc-2.3/multifit_nlinear/test_lin1.c0000644000175000017500000000400412771454264016405 0ustar eddedd#define lin1_N 11 /* can be anything >= p */ #define lin1_P 5 static double lin1_x0[lin1_P] = { 1.0, 1.0, 1.0, 1.0, 1.0 }; static double lin1_epsrel = 1.0e-10; static void lin1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = (double) (lin1_N - lin1_P); gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < lin1_P; ++i) { gsl_test_rel(x[i], -1.0, epsrel, "%s/%s i=%zu", sname, pname, i); } } static int lin1_f (const gsl_vector * x, void *params, gsl_vector * f) { size_t i, j; for (i = 0; i < lin1_N; ++i) { double fi = 0.0; for (j = 0; j < lin1_P; ++j) { double xj = gsl_vector_get(x, j); double Aij = (i == j) ? 1.0 : 0.0; Aij -= 2.0 / lin1_N; fi += Aij * xj; } fi -= 1.0; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin1_df (const gsl_vector * x, void *params, gsl_matrix * J) { size_t i, j; for (i = 0; i < lin1_N; ++i) { for (j = 0; j < lin1_P; ++j) { double Jij = (i == j) ? 1.0 : 0.0; Jij -= 2.0 / lin1_N; gsl_matrix_set(J, i, j, Jij); } } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int lin1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { (void)x; /* avoid unused parameter warnings */ (void)v; (void)params; gsl_vector_set_zero(fvv); return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf lin1_func = { lin1_f, lin1_df, lin1_fvv, lin1_N, lin1_P, NULL, 0, 0, 0 }; static test_fdf_problem lin1_problem = { "linear_full", lin1_x0, NULL, NULL, &lin1_epsrel, &lin1_checksol, &lin1_func }; gsl-doc-2.3/multifit_nlinear/qrsolv.c0000644000175000017500000001302612737536472016041 0ustar eddedd/* 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. The diagonal elements are modified but restored on output. 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 S: on output contains the matrix S, n-by-n x: on output contains the least squares solution of the system work: 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_matrix * S, gsl_vector * x, gsl_vector * work) { 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 (S, i, j, rji); } gsl_vector_set (x, j, rjj); gsl_vector_set (work, 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_matrix_set (S, j, j, diagpj); for (k = j + 1; k < n; k++) { gsl_matrix_set (S, k, 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 wk = gsl_vector_get (work, k); double rkk = gsl_matrix_get (r, k, k); double skk = gsl_matrix_get (S, k, k); if (skk == 0) { continue; } if (fabs (rkk) < fabs (skk)) { double cotangent = rkk / skk; sine = 0.5 / sqrt (0.25 + 0.25 * cotangent * cotangent); cosine = sine * cotangent; } else { double tangent = skk / 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 * skk; double new_wk = cosine * wk + sine * qtbpj; qtbpj = -sine * wk + cosine * qtbpj; gsl_matrix_set(r, k, k, new_rkk); gsl_matrix_set(S, k, k, new_rkk); gsl_vector_set(work, k, new_wk); } /* Accumulate the transformation in the row of s */ for (i = k + 1; i < n; i++) { double sik = gsl_matrix_get (S, i, k); double sii = gsl_matrix_get (S, i, i); double new_sik = cosine * sik + sine * sii; double new_sii = -sine * sik + cosine * sii; gsl_matrix_set(S, i, k, new_sik); gsl_matrix_set(S, i, i, new_sii); } } /* Store the corresponding diagonal element of s and restore the corresponding diagonal element of r */ { double xj = gsl_vector_get(x, j); 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 sjj = gsl_matrix_get (S, j, j); if (sjj == 0) { nsing = j; break; } } for (j = nsing; j < n; j++) { gsl_vector_set (work, 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(S, i, j) * gsl_vector_get(work, i); } { double wj = gsl_vector_get (work, j); double sjj = gsl_matrix_get (S, j, j); gsl_vector_set (work, j, (wj - sum) / sjj); } } /* 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 wj = gsl_vector_get (work, j); gsl_vector_set (x, pj, wj); } return GSL_SUCCESS; } gsl-doc-2.3/multifit_nlinear/test_brown3.c0000644000175000017500000000403012771454132016745 0ustar eddedd#define brown3_N 3 #define brown3_P 2 static double brown3_x0[brown3_P] = { 1.0, 1.0 }; static double brown3_epsrel = 1.0e-12; static void brown3_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 0.0; const double brown3_x[brown3_P] = { 1.0e6, 2.0e-6 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown3_P; ++i) { gsl_test_rel(x[i], brown3_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown3_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_vector_set(f, 0, x1 - 1.0e6); gsl_vector_set(f, 1, x2 - 2.0e-6); gsl_vector_set(f, 2, x1*x2 - 2.0); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown3_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); gsl_matrix_set_zero(J); gsl_matrix_set(J, 0, 0, 1.0); gsl_matrix_set(J, 1, 1, 1.0); gsl_matrix_set(J, 2, 0, x2); gsl_matrix_set(J, 2, 1, x1); (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown3_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); gsl_vector_set(fvv, 0, 0.0); gsl_vector_set(fvv, 1, 0.0); gsl_vector_set(fvv, 2, 2.0 * v1 * v2); (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf brown3_func = { brown3_f, brown3_df, brown3_fvv, brown3_N, brown3_P, NULL, 0, 0, 0 }; static test_fdf_problem brown3_problem = { "brown_badly_scaled", brown3_x0, NULL, NULL, &brown3_epsrel, &brown3_checksol, &brown3_func }; gsl-doc-2.3/multifit_nlinear/dogleg.c0000644000175000017500000003340312763322147015744 0ustar eddedd/* multifit_nlinear/dogleg.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include /* * This module contains an implementation of the Powell dogleg * algorithm for nonlinear optimization problems. This implementation * closely follows the following works: * * [1] H. B. Nielsen, K. Madsen, Introduction to Optimization and * Data Fitting, Informatics and Mathematical Modeling, * Technical University of Denmark (DTU), 2010. * * [2] J. E. Dennis and H. H. W. Mei, Two new unconstrained optimization * algorithms which use function and gradient values, J. Opt. Theory and * Appl., 28(4), 1979. */ typedef struct { size_t n; /* number of observations */ size_t p; /* number of parameters */ gsl_vector *dx_gn; /* Gauss-Newton step, size p */ gsl_vector *dx_sd; /* steepest descent step, size p */ double norm_Dgn; /* || D dx_gn || */ double norm_Dsd; /* || D dx_sd || */ double norm_Dinvg; /* || D^{-1} g || */ double norm_JDinv2g; /* || J D^{-2} g || */ gsl_vector *workp; /* workspace, length p */ gsl_vector *workn; /* workspace, length n */ /* tunable parameters */ gsl_multifit_nlinear_parameters params; } dogleg_state_t; #include "common.c" static void * dogleg_alloc (const void * params, const size_t n, const size_t p); static void dogleg_free(void *vstate); static int dogleg_init(const void *vtrust_state, void *vstate); static int dogleg_preloop(const void * vtrust_state, void * vstate); static int dogleg_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int dogleg_double_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); static int dogleg_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); static int dogleg_calc_gn(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx); static double dogleg_beta(const double t, const double delta, const gsl_vector * diag, dogleg_state_t * state); static void * dogleg_alloc (const void * params, const size_t n, const size_t p) { const gsl_multifit_nlinear_parameters *mparams = (const gsl_multifit_nlinear_parameters *) params; dogleg_state_t *state; state = calloc(1, sizeof(dogleg_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate dogleg state", GSL_ENOMEM); } state->dx_gn = gsl_vector_alloc(p); if (state->dx_gn == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_gn", GSL_ENOMEM); } state->dx_sd = gsl_vector_alloc(p); if (state->dx_sd == NULL) { GSL_ERROR_NULL ("failed to allocate space for dx_sd", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->n = n; state->p = p; state->params = *mparams; return state; } static void dogleg_free(void *vstate) { dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->dx_gn) gsl_vector_free(state->dx_gn); if (state->dx_sd) gsl_vector_free(state->dx_sd); if (state->workp) gsl_vector_free(state->workp); if (state->workn) gsl_vector_free(state->workn); free(state); } /* dogleg_init() Initialize dogleg solver Inputs: vtrust_state - trust state vstate - workspace Return: success/error */ static int dogleg_init(const void *vtrust_state, void *vstate) { (void)vtrust_state; (void)vstate; return GSL_SUCCESS; } /* dogleg_preloop() Initialize dogleg method prior to iteration loop. This involves computing the steepest descent step. The Gauss-Newton step is computed if needed in the _step() routines. Notes: on output, 1) state->dx_sd contains steepest descent step 2) state->norm_Dinvg contains || D^{-1} g || 3) state->norm_JDinv2g contains || J D^{-2} g || */ static int dogleg_preloop(const void * vtrust_state, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; double u; double alpha; /* ||g||^2 / ||Jg||^2 */ /* calculate the steepest descent step */ /* compute workp = D^{-1} g and its norm */ gsl_vector_memcpy(state->workp, trust_state->g); gsl_vector_div(state->workp, trust_state->diag); state->norm_Dinvg = gsl_blas_dnrm2(state->workp); /* compute workp = D^{-2} g */ gsl_vector_div(state->workp, trust_state->diag); /* compute: workn = J D^{-2} g */ gsl_blas_dgemv(CblasNoTrans, 1.0, trust_state->J, state->workp, 0.0, state->workn); state->norm_JDinv2g = gsl_blas_dnrm2(state->workn); u = state->norm_Dinvg / state->norm_JDinv2g; alpha = u * u; /* dx_sd = -alpha D^{-2} g */ gsl_vector_memcpy(state->dx_sd, state->workp); gsl_vector_scale(state->dx_sd, -alpha); state->norm_Dsd = scaled_enorm(trust_state->diag, state->dx_sd); state->norm_Dgn = -1.0; /* computed later if needed */ return GSL_SUCCESS; } /* dogleg_step() Calculate a new step vector */ static int dogleg_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->norm_Dsd >= delta) { /* steepest descent step is outside trust region; * truncate steepest descent step to trust region boundary */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { /* compute Gauss-Newton step if needed */ if (state->norm_Dgn < 0.0) { int status = dogleg_calc_gn(trust_state, state->dx_gn); if (status) return status; /* compute || D dx_gn || */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); } if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else { /* Gauss-Newton step is outside trust region, but steepest * descent is inside; use dogleg step */ double beta = dogleg_beta(1.0, delta, trust_state->diag, state); /* compute: workp = dx_gn - dx_sd */ scaled_addition(1.0, state->dx_gn, -1.0, state->dx_sd, state->workp); /* dx = dx_sd + beta*(dx_gn - dx_sd) */ scaled_addition(beta, state->workp, 1.0, state->dx_sd, dx); } } return GSL_SUCCESS; } /* dogleg_double_step() Calculate a new step with double dogleg method. Based on section 3 of [2] */ static int dogleg_double_step(const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate) { const double alpha_fac = 0.8; /* recommended value from Dennis and Mei */ const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; if (state->norm_Dsd >= delta) { /* steepest descent step is outside trust region; * truncate steepest descent step to trust region boundary */ gsl_vector_memcpy(dx, state->dx_sd); gsl_vector_scale(dx, delta / state->norm_Dsd); } else { /* compute Gauss-Newton step if needed */ if (state->norm_Dgn < 0.0) { int status = dogleg_calc_gn(trust_state, state->dx_gn); if (status) return status; /* compute || D dx_gn || */ state->norm_Dgn = scaled_enorm(trust_state->diag, state->dx_gn); } if (state->norm_Dgn <= delta) { /* Gauss-Newton step is inside trust region, use it as final step * since it is the global minimizer of the quadratic model function */ gsl_vector_memcpy(dx, state->dx_gn); } else { double t, u, v, c; /* compute: u = ||D^{-1} g||^2 / ||J D^{-2} g||^2 */ v = state->norm_Dinvg / state->norm_JDinv2g; u = v * v; /* compute: v = g^T dx_gn */ gsl_blas_ddot(trust_state->g, state->dx_gn, &v); /* compute: c = ||D^{-1} g||^4 / (||J D^{-2} g||^2 * |g^T dx_gn|) */ c = u * (state->norm_Dinvg / fabs(v)) * state->norm_Dinvg; /* compute: t = 1 - alpha_fac*(1-c) */ t = 1.0 - alpha_fac*(1.0 - c); if (t * state->norm_Dgn <= delta) { /* set dx = (delta / ||D dx_gn||) dx_gn */ gsl_vector_memcpy(dx, state->dx_gn); gsl_vector_scale(dx, delta / state->norm_Dgn); } else { /* Cauchy point is inside, Gauss-Newton is outside trust region; * use double dogleg step */ double beta = dogleg_beta(t, delta, trust_state->diag, state); /* compute: workp = t*dx_gn - dx_sd */ scaled_addition(t, state->dx_gn, -1.0, state->dx_sd, state->workp); /* dx = dx_sd + beta*(t*dx_gn - dx_sd) */ scaled_addition(beta, state->workp, 1.0, state->dx_sd, dx); } } } return GSL_SUCCESS; } static int dogleg_preduction(const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; dogleg_state_t *state = (dogleg_state_t *) vstate; *pred = quadratic_preduction(trust_state->f, trust_state->J, dx, state->workn); return GSL_SUCCESS; } /* dogleg_calc_gn() Calculate Gauss-Newton step which satisfies: J dx_gn = -f Inputs: trust_state - trust state variables dx - (output) Gauss-Newton step Return: success/error */ static int dogleg_calc_gn(const gsl_multifit_nlinear_trust_state * trust_state, gsl_vector * dx) { int status; const gsl_multifit_nlinear_parameters *params = trust_state->params; /* initialize linear least squares solver */ status = (params->solver->init)(trust_state, trust_state->solver_state); if (status) return status; /* prepare the linear solver to compute Gauss-Newton step */ status = (params->solver->presolve)(0.0, trust_state, trust_state->solver_state); if (status) return status; /* solve: J dx_gn = -f for Gauss-Newton step */ status = (params->solver->solve)(trust_state->f, dx, trust_state, trust_state->solver_state); if (status) return status; return GSL_SUCCESS; } /* dogleg_beta() This function finds beta in [0,1] such that the step dx = dx_sd + beta*(t*dx_gn - dx_sd) has norm ||D dx|| = delta beta is the positive root of the quadratic: a beta^2 + b beta + c = 0 with a = ||D(t*dx_gn - dx_sd)||^2 b = 2 dx_sd^T D^T D (t*dx_gn - dx_sd) c = ||D dx_sd||^2 - delta^2 Inputs: t - amount of Gauss-Newton step to use for dogleg (= 1 for classical dogleg, <= 1 for double dogleg) delta - trust region radius diag - diag(D) scaling matrix state - workspace */ static double dogleg_beta(const double t, const double delta, const gsl_vector * diag, dogleg_state_t * state) { double beta; double a, b, c; /* compute: workp = t*dx_gn - dx_sd */ scaled_addition(t, state->dx_gn, -1.0, state->dx_sd, state->workp); /* a = || D (t*dx_gn - dx_sd) ||^2 */ a = scaled_enorm(diag, state->workp); a *= a; /* workp = D^T D (t*dx_gn - dx_sd) */ gsl_vector_mul(state->workp, diag); gsl_vector_mul(state->workp, diag); /* b = 2 dx_sd^T D^T D (t*dx_gn - dx-sd) */ gsl_blas_ddot(state->dx_sd, state->workp, &b); b *= 2.0; /* c = || D dx_sd ||^2 - delta^2 = (||D dx_sd|| + delta) (||D dx_sd|| - delta) */ c = (state->norm_Dsd + delta) * (state->norm_Dsd - delta); if (b > 0.0) { beta = (-2.0 * c) / (b + sqrt(b*b - 4.0*a*c)); } else { beta = (-b + sqrt(b*b - 4.0*a*c)) / (2.0 * a); } return beta; } static const gsl_multifit_nlinear_trs dogleg_type = { "dogleg", dogleg_alloc, dogleg_init, dogleg_preloop, dogleg_step, dogleg_preduction, dogleg_free }; const gsl_multifit_nlinear_trs *gsl_multifit_nlinear_trs_dogleg = &dogleg_type; static const gsl_multifit_nlinear_trs ddogleg_type = { "double-dogleg", dogleg_alloc, dogleg_init, dogleg_preloop, dogleg_double_step, dogleg_preduction, dogleg_free }; const gsl_multifit_nlinear_trs *gsl_multifit_nlinear_trs_ddogleg = &ddogleg_type; gsl-doc-2.3/multifit_nlinear/convergence.c0000644000175000017500000000676212737536472017022 0ustar eddedd/* multifit_nlinear/convergence.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2015 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include static int test_delta (const gsl_vector * dx, const gsl_vector * x, double epsabs, double epsrel); static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g); /* gsl_multifit_nlinear_test() Convergence tests for nonlinear minimization (1) |dx_i| <= xtol * (1 + |x_i|) for all i (2) || g .* x ||_inf <= gtol ||f||^2 (3) ||f(x+dx) - f(x)|| <= ftol * max(||f(x)||, 1) Inputs: xtol - tolerance for step size gtol - tolerance for gradient vector ftol - tolerance for residual vector info - (output) 1 - stopped by small x step 2 - stopped by small gradient 3 - stopped by small residual vector change w - workspace */ int gsl_multifit_nlinear_test (const double xtol, const double gtol, const double ftol, int *info, const gsl_multifit_nlinear_workspace * w) { int status; double gnorm, fnorm, phi; *info = 0; status = test_delta(w->dx, w->x, xtol*xtol, xtol); if (status == GSL_SUCCESS) { *info = 1; return GSL_SUCCESS; } /* compute gnorm = max_i( g_i * max(x_i, 1) ) */ gnorm = scaled_infnorm(w->x, w->g); /* compute fnorm = ||f|| */ fnorm = gsl_blas_dnrm2(w->f); phi = 0.5 * fnorm * fnorm; if (gnorm <= gtol * GSL_MAX(phi, 1.0)) { *info = 2; return GSL_SUCCESS; } #if 0 /* XXX */ if (dfnorm <= ftol * GSL_MAX(fnorm, 1.0)) { *info = 3; return GSL_SUCCESS; } #else (void)ftol; #endif return GSL_CONTINUE; } static int 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; } static double scaled_infnorm(const gsl_vector *x, const gsl_vector *g) { const size_t n = x->size; size_t i; double norm = 0.0; for (i = 0; i < n; ++i) { double xi = GSL_MAX(gsl_vector_get(x, i), 1.0); double gi = gsl_vector_get(g, i); double tmp = fabs(xi * gi); if (tmp > norm) norm = tmp; } return norm; } gsl-doc-2.3/multifit_nlinear/test_exp1.c0000644000175000017500000000634612771454174016432 0ustar eddedd#define exp1_N 45 #define exp1_P 4 static double exp1_x0[exp1_P] = { -1.0, -2.0, 1.0, -1.0 }; static double exp1_epsrel = 1.0e-4; static double exp1_Y[exp1_N] = { 0.090542, 0.124569, 0.179367, 0.195654, 0.269707, 0.286027, 0.289892, 0.317475, 0.308191, 0.336995, 0.348371, 0.321337, 0.299423, 0.338972, 0.304763, 0.288903, 0.300820, 0.303974, 0.283987, 0.262078, 0.281593, 0.267531, 0.218926, 0.225572, 0.200594, 0.197375, 0.182440, 0.183892, 0.152285, 0.174028, 0.150874, 0.126220, 0.126266, 0.106384, 0.118923, 0.091868, 0.128926, 0.119273, 0.115997, 0.105831, 0.075261, 0.068387, 0.090823, 0.085205, 0.067203 }; static void exp1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 1.0e-2; const double exp1_x[exp1_P] = { -4.0, -5.0, 4.0, -4.0 }; /* approx */ gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < exp1_P; ++i) { gsl_test_rel(x[i], exp1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int exp1_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double yi = exp1_Y[i]; double fi = yi - (x3*exp(x1*ti) + x4*exp(x2*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int exp1_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double term1 = exp(x1*ti); double term2 = exp(x2*ti); gsl_matrix_set(J, i, 0, -x3*ti*term1); gsl_matrix_set(J, i, 1, -x4*ti*term2); gsl_matrix_set(J, i, 2, -term1); gsl_matrix_set(J, i, 3, -term2); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int exp1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); size_t i; for (i = 0; i < exp1_N; ++i) { double ti = 0.02*(i + 1.0); double term1 = exp(x1*ti); double term2 = exp(x2*ti); double term3 = 2*v3 + ti*v1*x3; double term4 = 2*v4 + ti*v2*x4; gsl_vector_set(fvv, i, -ti*(v1*term1*term3 + v2*term2*term4)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf exp1_func = { exp1_f, exp1_df, exp1_fvv, exp1_N, exp1_P, NULL, 0, 0, 0 }; static test_fdf_problem exp1_problem = { "expfit1", exp1_x0, NULL, NULL, &exp1_epsrel, &exp1_checksol, &exp1_func }; gsl-doc-2.3/multifit_nlinear/test_brown1.c0000644000175000017500000000554112771454113016752 0ustar eddedd#define brown1_N 20 #define brown1_P 4 static double brown1_x0[brown1_P] = { 25, 5, -5, -1 }; static double brown1_epsrel = 1.0e-5; static void brown1_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.582220162635628e+04; const double brown1_x[brown1_P] = { -1.159443990239263e+01, 1.320363005221244e+01, -4.034395456782477e-01, 2.367789088597534e-01 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < brown1_P; ++i) { gsl_test_rel(x[i], brown1_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int brown1_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 < brown1_N; 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); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown1_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 < brown1_N; 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)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int brown1_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double v0 = gsl_vector_get (v, 0); double v1 = gsl_vector_get (v, 1); double v2 = gsl_vector_get (v, 2); double v3 = gsl_vector_get (v, 3); size_t i; for (i = 0; i < brown1_N; i++) { double ti = 0.2 * (i + 1); double term1 = v0 + ti*v1; double term2 = v3*sin(ti); gsl_vector_set (fvv, i, 2.0 * (term1*term1 + v2*v2 + term2 * (2*v2 + term2))); } (void)x; /* avoid unused parameter warning */ (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf brown1_func = { brown1_f, brown1_df, brown1_fvv, brown1_N, brown1_P, NULL, 0, 0, 0 }; static test_fdf_problem brown1_problem = { "brown_dennis", brown1_x0, NULL, NULL, &brown1_epsrel, &brown1_checksol, &brown1_func }; gsl-doc-2.3/multifit_nlinear/svd.c0000644000175000017500000001457012737536472015314 0ustar eddedd/* multifit_nlinear/svd.c * * Copyright (C) 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module handles the solution of the linear least squares * system: * * [ J ] dx = - [ f ] * [ sqrt(mu)*D ] [ 0 ] * * using an SVD approach. The system above is transformed to "standard form" * via: * * J~ = J D^{-1} * dx~ = D dx * * so that * * [ J~ ] dx~ = - [ f ] * [ sqrt(mu)*I ] [ 0 ] * * can be solved with a standard SVD method, and then dx is recovered * from dx~ via: dx = D^{-1} dx~ */ #include #include #include #include #include #include #include #include typedef struct { size_t n; /* number of residuals */ size_t p; /* number of parameters */ gsl_matrix *U; /* U factor of J, n-by-p */ gsl_matrix *V; /* V factor of J, p-by-p */ gsl_vector *S; /* singular values, size p */ gsl_vector *workp; /* workspace, length p */ double mu; /* LM parameter */ } svd_state_t; static int svd_init(const void * vtrust_state, void * vstate); static int svd_presolve(const double mu, const void * vtrust_state, void * vstate); static int svd_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate); static int svd_rcond(double * rcond, void * vstate); static void * svd_alloc (const size_t n, const size_t p) { svd_state_t *state; (void)n; state = calloc(1, sizeof(svd_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate svd state", GSL_ENOMEM); } state->U = gsl_matrix_alloc(n, p); if (state->U == NULL) { GSL_ERROR_NULL ("failed to allocate space for U", GSL_ENOMEM); } state->V = gsl_matrix_alloc(p, p); if (state->V == NULL) { GSL_ERROR_NULL ("failed to allocate space for V", GSL_ENOMEM); } state->S = gsl_vector_alloc(p); if (state->S == NULL) { GSL_ERROR_NULL ("failed to allocate space for S", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->mu = 0.0; state->n = n; state->p = p; return state; } static void svd_free(void *vstate) { svd_state_t *state = (svd_state_t *) vstate; if (state->U) gsl_matrix_free(state->U); if (state->V) gsl_matrix_free(state->V); if (state->S) gsl_vector_free(state->S); if (state->workp) gsl_vector_free(state->workp); free(state); } /* compute svd of J */ static int svd_init(const void * vtrust_state, void * vstate) { int status; const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; svd_state_t *state = (svd_state_t *) vstate; size_t i; gsl_matrix_set_zero(state->U); /* compute U = J D^{-1} */ for (i = 0; i < state->p; ++i) { gsl_vector_const_view Ji = gsl_matrix_const_column(trust_state->J, i); gsl_vector_view ui = gsl_matrix_column(state->U, i); double di = gsl_vector_get(trust_state->diag, i); gsl_blas_daxpy(1.0 / di, &Ji.vector, &ui.vector); } status = gsl_linalg_SV_decomp(state->U, state->V, state->S, state->workp); return status; } static int svd_presolve(const double mu, const void * vtrust_state, void * vstate) { svd_state_t *state = (svd_state_t *) vstate; state->mu = mu; (void)vtrust_state; return GSL_SUCCESS; } static int svd_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate) { int status = GSL_SUCCESS; const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; svd_state_t *state = (svd_state_t *) vstate; const size_t p = state->p; const double tol = GSL_DBL_EPSILON; const double s0 = gsl_vector_get(state->S, 0); size_t j; /* compute workp = - U^T f */ gsl_blas_dgemv(CblasTrans, -1.0, state->U, f, 0.0, state->workp); /* * compute: * * workp = sum_i s_i / (s_i^2 + mu) (-u_i^T f) */ if (state->mu == 0.0) { /* * compute Gauss-Newton direction by solving * J x = -f */ for (j = 0; j < p; ++j) { double sj = gsl_vector_get(state->S, j); double *ptr = gsl_vector_ptr(state->workp, j); double alpha; if (sj <= tol * s0) alpha = 0.0; else alpha = 1.0 / sj; *ptr *= alpha; } } else { /* * solve: * * [ J D^{-1} ] (D x) = -[ f ] * [ sqrt(mu) I ] [ 0 ] * * using SVD factorization of J D^{-1} */ for (j = 0; j < p; ++j) { double sj = gsl_vector_get(state->S, j); double *ptr = gsl_vector_ptr(state->workp, j); *ptr *= sj / (sj*sj + state->mu); } } /* compute: x = V * workp */ gsl_blas_dgemv(CblasNoTrans, 1.0, state->V, state->workp, 0.0, x); /* compute D^{-1} x */ gsl_vector_div(x, trust_state->diag); return status; } static int svd_rcond(double * rcond, void * vstate) { int status = GSL_SUCCESS; svd_state_t *state = (svd_state_t *) vstate; double smax = gsl_vector_get(state->S, 0); double smin = gsl_vector_get(state->S, state->p - 1); *rcond = smin / smax; return status; } static const gsl_multifit_nlinear_solver svd_type = { "svd", svd_alloc, svd_init, svd_presolve, svd_solve, svd_rcond, svd_free }; const gsl_multifit_nlinear_solver *gsl_multifit_nlinear_solver_svd = &svd_type; gsl-doc-2.3/multifit_nlinear/test_osborne.c0000644000175000017500000000652112771454320017210 0ustar eddedd#define osborne_N 33 #define osborne_P 5 static double osborne_x0[osborne_P] = { 0.5, 1.5, -1.0, 0.01, 0.02 }; static double osborne_epsrel = 1.0e-8; static double osborne_Y[osborne_N] = { 0.844, 0.908, 0.932, 0.936, 0.925, 0.908, 0.881, 0.850, 0.818, 0.784, 0.751, 0.718, 0.685, 0.658, 0.628, 0.603, 0.580, 0.558, 0.538, 0.522, 0.506, 0.490, 0.478, 0.467, 0.457, 0.448, 0.438, 0.431, 0.424, 0.420, 0.414, 0.411, 0.406 }; static void osborne_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { const double sumsq_exact = 5.464894697482687e-05; double osborne_x[osborne_P]; osborne_x[0] = 3.754100521058740e-01; osborne_x[1] = GSL_NAN; osborne_x[2] = GSL_NAN; osborne_x[3] = GSL_NAN; osborne_x[4] = GSL_NAN; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); /* only the first model parameter is uniquely constrained */ gsl_test_rel(x[0], osborne_x[0], epsrel, "%s/%s i=0", sname, pname); } static int osborne_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double yi = osborne_Y[i]; double fi = yi - (x1 + x2*exp(-x4*ti) + x3*exp(-x5*ti)); gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int osborne_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double term1 = exp(-x4*ti); double term2 = exp(-x5*ti); gsl_matrix_set(J, i, 0, -1.0); gsl_matrix_set(J, i, 1, -term1); gsl_matrix_set(J, i, 2, -term2); gsl_matrix_set(J, i, 3, ti*x2*term1); gsl_matrix_set(J, i, 4, ti*x3*term2); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int osborne_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double x4 = gsl_vector_get(x, 3); double x5 = gsl_vector_get(x, 4); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); double v4 = gsl_vector_get(v, 3); double v5 = gsl_vector_get(v, 4); size_t i; for (i = 0; i < osborne_N; ++i) { double ti = 10.0*i; double term1 = exp(-x4*ti); double term2 = exp(-x5*ti); double term3 = -2*v2 + ti*v4*x2; double term4 = -2*v3 + ti*v5*x3; gsl_vector_set(fvv, i, -term1 * term2 * ti * (v4 / term2 * term3 + v5 / term1 * term4)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf osborne_func = { osborne_f, osborne_df, osborne_fvv, osborne_N, osborne_P, NULL, 0, 0, 0 }; static test_fdf_problem osborne_problem = { "osborne", osborne_x0, NULL, NULL, &osborne_epsrel, &osborne_checksol, &osborne_func }; gsl-doc-2.3/multifit_nlinear/test_thurber.c0000644000175000017500000000731712771454430017222 0ustar eddedd#define thurber_N 37 #define thurber_P 7 static double thurber_x0a[thurber_P] = { 1000.0, 1000.0, 400.0, 40.0, 0.7, 0.3, 0.03 }; static double thurber_x0b[thurber_P] = { 1300.0, 1500.0, 500.0, 75.0, 1.0, 0.4, 0.05 }; static double thurber_epsrel = 1.0e-6; static double thurber_sigma[thurber_P] = { 4.6647963344E+00, 3.9571156086E+01, 2.8698696102E+01, 5.5675370270E+00, 3.1333340687E-02, 1.4984928198E-02, 6.5842344623E-03 }; static double thurber_X[thurber_N] = { -3.067, -2.981, -2.921, -2.912, -2.840, -2.797, -2.702, -2.699, -2.633, -2.481, -2.363, -2.322, -1.501, -1.460, -1.274, -1.212, -1.100, -1.046, -0.915, -0.714, -0.566, -0.545, -0.400, -0.309, -0.109, -0.103, 0.010, 0.119, 0.377, 0.790, 0.963, 1.006, 1.115, 1.572, 1.841, 2.047, 2.200 }; static double thurber_F[thurber_N] = { 80.574, 84.248, 87.264, 87.195, 89.076, 89.608, 89.868, 90.101, 92.405, 95.854, 100.696, 101.060, 401.672, 390.724, 567.534, 635.316, 733.054, 759.087, 894.206, 990.785, 1090.109, 1080.914, 1122.643, 1178.351, 1260.531, 1273.514, 1288.339, 1327.543, 1353.863, 1414.509, 1425.208, 1421.384, 1442.962, 1464.350, 1468.705, 1447.894, 1457.628 }; static void thurber_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 5.6427082397E+03; const double thurber_x[thurber_P] = { 1.2881396800E+03, 1.4910792535E+03, 5.8323836877E+02, 7.5416644291E+01, 9.6629502864E-01, 3.9797285797E-01, 4.9727297349E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < thurber_P; ++i) { gsl_test_rel(x[i], thurber_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int thurber_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double yi; yi = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; yi /= 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; gsl_vector_set (f, i, yi - thurber_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int thurber_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[thurber_P]; size_t i; for (i = 0; i < thurber_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < thurber_N; i++) { double xi = thurber_X[i]; double d, n, d_sq; n = b[0] + b[1]*xi + b[2]*xi*xi + b[3]*xi*xi*xi; d = 1.0 + b[4]*xi + b[5]*xi*xi + b[6]*xi*xi*xi; d_sq = d * d; gsl_matrix_set (df, i, 0, 1.0 / d); gsl_matrix_set (df, i, 1, xi / d); gsl_matrix_set (df, i, 2, (xi * xi) / d); gsl_matrix_set (df, i, 3, (xi * xi * xi) / d); gsl_matrix_set (df, i, 4, -xi * n / d_sq); gsl_matrix_set (df, i, 5, -xi * xi * n / d_sq); gsl_matrix_set (df, i, 6, -xi * xi * xi * n / d_sq); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf thurber_func = { thurber_f, thurber_df, NULL, /* analytic expression too complex */ thurber_N, thurber_P, NULL, 0, 0, 0 }; static test_fdf_problem thurbera_problem = { "nist-thurbera", thurber_x0a, NULL, thurber_sigma, &thurber_epsrel, &thurber_checksol, &thurber_func }; static test_fdf_problem thurberb_problem = { "nist-thurberb", thurber_x0b, NULL, thurber_sigma, &thurber_epsrel, &thurber_checksol, &thurber_func }; gsl-doc-2.3/multifit_nlinear/cholesky.c0000644000175000017500000001761512753363626016341 0ustar eddedd/* multifit_nlinear/cholesky.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module calculates the solution of the normal equations least squares * system: * * [ J~^T J~ + mu D~^T D~ ] p~ = -J~^T f * * using the modified Cholesky decomposition. Quantities are scaled * according to: * * J~ = J S * D~ = D S * p~ = S^{-1} p * * where S is a diagonal matrix and S_jj = || J_j || and J_j is column * j of the Jacobian. This balancing transformation seems to be more * numerically stable for some Jacobians. */ #include #include #include #include #include #include #include #include #include #include "common.c" typedef struct { gsl_matrix *JTJ; /* J^T J */ gsl_matrix *work_JTJ; /* copy of J^T J */ gsl_vector *rhs; /* -J^T f, size p */ gsl_permutation *perm; /* permutation matrix for modified Cholesky */ gsl_vector *work3p; /* workspace, size 3*p */ double mu; /* current regularization parameter */ } cholesky_state_t; static void *cholesky_alloc (const size_t n, const size_t p); static int cholesky_init(const void * vtrust_state, void * vstate); static int cholesky_presolve(const double mu, const void * vtrust_state, void * vstate); static int cholesky_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate); static int cholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, cholesky_state_t *state); static int cholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, cholesky_state_t * state); static void * cholesky_alloc (const size_t n, const size_t p) { cholesky_state_t *state; (void)n; state = calloc(1, sizeof(cholesky_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate cholesky state", GSL_ENOMEM); } state->JTJ = gsl_matrix_alloc(p, p); if (state->JTJ == NULL) { GSL_ERROR_NULL ("failed to allocate space for JTJ", GSL_ENOMEM); } state->work_JTJ = gsl_matrix_alloc(p, p); if (state->work_JTJ == NULL) { GSL_ERROR_NULL ("failed to allocate space for JTJ workspace", GSL_ENOMEM); } state->rhs = gsl_vector_alloc(p); if (state->rhs == NULL) { GSL_ERROR_NULL ("failed to allocate space for rhs", GSL_ENOMEM); } state->perm = gsl_permutation_alloc(p); if (state->perm == NULL) { GSL_ERROR_NULL ("failed to allocate space for perm", GSL_ENOMEM); } state->work3p = gsl_vector_alloc(3 * p); if (state->work3p == NULL) { GSL_ERROR_NULL ("failed to allocate space for work3p", GSL_ENOMEM); } state->mu = -1.0; return state; } static void cholesky_free(void *vstate) { cholesky_state_t *state = (cholesky_state_t *) vstate; if (state->JTJ) gsl_matrix_free(state->JTJ); if (state->work_JTJ) gsl_matrix_free(state->work_JTJ); if (state->rhs) gsl_vector_free(state->rhs); if (state->perm) gsl_permutation_free(state->perm); if (state->work3p) gsl_vector_free(state->work3p); free(state); } static int cholesky_init(const void * vtrust_state, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; cholesky_state_t *state = (cholesky_state_t *) vstate; /* compute J^T J */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, trust_state->J, 0.0, state->JTJ); return GSL_SUCCESS; } /* cholesky_presolve() Compute the modified Cholesky decomposition of J^T J + mu D^T D. Modified Cholesky is used in case mu = 0 and there are rounding errors in forming J^T J which could lead to an indefinite matrix. Inputs: mu - LM parameter vstate - workspace Notes: 1) On output, state->work_JTJ contains the Cholesky decomposition of J^T J + mu D^T D */ static int cholesky_presolve(const double mu, const void * vtrust_state, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; cholesky_state_t *state = (cholesky_state_t *) vstate; gsl_matrix *JTJ = state->work_JTJ; const gsl_vector *diag = trust_state->diag; int status; /* copy lower triangle of A to workspace */ gsl_matrix_tricpy('L', 1, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = cholesky_regularize(mu, diag, JTJ, state); if (status) return status; /* compute modified Cholesky decomposition */ status = gsl_linalg_mcholesky_decomp(JTJ, state->perm, NULL); if (status) return status; state->mu = mu; return GSL_SUCCESS; } /* cholesky_solve() Compute (J^T J + mu D^T D) x = -J^T f Inputs: f - right hand side vector f x - (output) solution vector vstate - cholesky workspace */ static int cholesky_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; cholesky_state_t *state = (cholesky_state_t *) vstate; int status; /* compute rhs = -J^T f */ gsl_blas_dgemv(CblasTrans, -1.0, trust_state->J, f, 0.0, state->rhs); status = cholesky_solve_rhs(state->rhs, x, state); if (status) return status; return GSL_SUCCESS; } static int cholesky_rcond(double * rcond, void * vstate) { int status; cholesky_state_t *state = (cholesky_state_t *) vstate; double rcond_JTJ; if (state->mu != 0) { /* * Cholesky decomposition hasn't been computed yet, or was computed * with mu > 0 - recompute Cholesky decomposition of J^T J */ /* copy lower triangle of JTJ to workspace */ gsl_matrix_tricpy('L', 1, state->work_JTJ, state->JTJ); /* compute modified Cholesky decomposition */ status = gsl_linalg_mcholesky_decomp(state->work_JTJ, state->perm, NULL); if (status) return status; } status = gsl_linalg_mcholesky_rcond(state->work_JTJ, state->perm, &rcond_JTJ, state->work3p); if (status == GSL_SUCCESS) *rcond = sqrt(rcond_JTJ); return status; } /* solve: (J^T J + mu D^T D) x = b */ static int cholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, cholesky_state_t *state) { int status; gsl_matrix *JTJ = state->work_JTJ; status = gsl_linalg_mcholesky_solve(JTJ, state->perm, b, x); if (status) return status; return GSL_SUCCESS; } /* A <- A + mu D^T D */ static int cholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, cholesky_state_t * state) { (void) state; if (mu != 0.0) { size_t i; for (i = 0; i < diag->size; ++i) { double di = gsl_vector_get(diag, i); double *Aii = gsl_matrix_ptr(A, i, i); *Aii += mu * di * di; } } return GSL_SUCCESS; } static const gsl_multifit_nlinear_solver cholesky_type = { "cholesky", cholesky_alloc, cholesky_init, cholesky_presolve, cholesky_solve, cholesky_rcond, cholesky_free }; const gsl_multifit_nlinear_solver *gsl_multifit_nlinear_solver_cholesky = &cholesky_type; gsl-doc-2.3/multifit_nlinear/test_enso.c0000644000175000017500000001204112771454166016507 0ustar eddedd#define enso_N 168 #define enso_P 9 static double enso_x0a[enso_P] = { 11.0, 3.0, 0.5, 40.0, -0.7, -1.3, 25.0, -0.3, 1.4 }; static double enso_x0b[enso_P] = { 10.0, 3.0, 0.5, 44.0, -1.5, 0.5, 26.0, -0.1, 1.5 }; static double enso_epsrel = 1.0e-3; static double enso_sigma[enso_P] = { 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 }; static double enso_F[enso_N] = { 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 }; static void enso_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 7.8853978668E+02; const double enso_x[enso_P] = { 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 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < enso_P; ++i) { gsl_test_rel(x[i], enso_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int enso_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; 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); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int enso_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[enso_P]; size_t i; for (i = 0; i < enso_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < enso_N; 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])); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf enso_func = { enso_f, enso_df, NULL, /* analytic expression too complex */ enso_N, enso_P, NULL, 0, 0, 0 }; static test_fdf_problem ensoa_problem = { "nist-ENSOa", enso_x0a, NULL, enso_sigma, &enso_epsrel, &enso_checksol, &enso_func }; static test_fdf_problem ensob_problem = { "nist-ENSOb", enso_x0b, NULL, enso_sigma, &enso_epsrel, &enso_checksol, &enso_func }; gsl-doc-2.3/multifit_nlinear/scaling.c0000644000175000017500000001031712737536472016133 0ustar eddedd/* multifit_nlinear/scaling.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module handles the updating of the scaling matrix D_k in the * trust region subproblem: * * min m_k (dx), || D_k dx || <= Delta_k * * where m_k(dx) is a model which approximates the cost function * F(x_k + dx) near the current iteration point x_k * * D_k can be updated according to several different strategies. */ #include #include #include #include #include #include #include #include static int init_diag_levenberg(const gsl_matrix * J, gsl_vector * diag); static int update_diag_levenberg(const gsl_matrix * J, gsl_vector * diag); static int init_diag_marquardt(const gsl_matrix * J, gsl_vector * diag); static int update_diag_marquardt (const gsl_matrix * J, gsl_vector * diag); static int init_diag_more(const gsl_matrix * J, gsl_vector * diag); static int update_diag_more(const gsl_matrix * J, gsl_vector * diag); /* Levenberg scaling, D = I */ static int init_diag_levenberg(const gsl_matrix * J, gsl_vector * diag) { (void)J; /* avoid unused parameter warning */ gsl_vector_set_all(diag, 1.0); return GSL_SUCCESS; } static int update_diag_levenberg(const gsl_matrix * J, gsl_vector * diag) { (void)J; /* avoid unused parameter warning */ (void)diag; /* avoid unused parameter warning */ /* nothing to do */ return GSL_SUCCESS; } /* initialize diagonal scaling matrix D according to Marquardt method */ static int init_diag_marquardt(const gsl_matrix * J, gsl_vector * diag) { return update_diag_marquardt(J, diag); } /* update diagonal scaling matrix D according to Marquardt method */ static int update_diag_marquardt (const gsl_matrix * J, gsl_vector * diag) { const size_t p = J->size2; size_t j; for (j = 0; j < p; j++) { gsl_vector_const_view v = gsl_matrix_const_column(J, j); double norm = gsl_blas_dnrm2(&v.vector); if (norm == 0.0) norm = 1.0; gsl_vector_set(diag, j, norm); } return GSL_SUCCESS; } /* initialize diagonal scaling matrix D according to Eq 6.3 of * More, 1978 */ static int init_diag_more(const gsl_matrix * J, gsl_vector * diag) { int status; gsl_vector_set_zero(diag); status = update_diag_more(J, diag); return status; } /* update diagonal scaling matrix D according to Eq. 6.3 of * More, 1978 */ static int update_diag_more (const gsl_matrix * J, gsl_vector * diag) { const size_t p = J->size2; size_t j; for (j = 0; j < p; j++) { gsl_vector_const_view v = gsl_matrix_const_column(J, j); double norm = gsl_blas_dnrm2(&v.vector); double *diagj = gsl_vector_ptr(diag, j); if (norm == 0.0) norm = 1.0; *diagj = GSL_MAX(*diagj, norm); } return GSL_SUCCESS; } static const gsl_multifit_nlinear_scale levenberg_type = { "levenberg", init_diag_levenberg, update_diag_levenberg }; static const gsl_multifit_nlinear_scale marquardt_type = { "marquardt", init_diag_marquardt, update_diag_marquardt }; static const gsl_multifit_nlinear_scale more_type = { "more", init_diag_more, update_diag_more }; const gsl_multifit_nlinear_scale *gsl_multifit_nlinear_scale_levenberg = &levenberg_type; const gsl_multifit_nlinear_scale *gsl_multifit_nlinear_scale_marquardt = &marquardt_type; const gsl_multifit_nlinear_scale *gsl_multifit_nlinear_scale_more = &more_type; gsl-doc-2.3/multifit_nlinear/test_meyer.c0000644000175000017500000000601712771454303016663 0ustar eddedd#define meyer_N 16 #define meyer_P 3 static double meyer_x0[meyer_P] = { 0.02, 4000.0, 250.0 }; static double meyer_epsrel = 1.0e-6; static double meyer_Y[meyer_N] = { 34780., 28610., 23650., 19630., 16370., 13720., 11540., 9744., 8261., 7030., 6005., 5147., 4427., 3820., 3307., 2872. }; static void meyer_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.794585517053883e+01; const double meyer_x[meyer_P] = { 5.609636471049458e-03, 6.181346346283188e+03, 3.452236346240292e+02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < meyer_P; ++i) { gsl_test_rel(x[i], meyer_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int meyer_f (const gsl_vector * x, void *params, gsl_vector * f) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double yi = meyer_Y[i]; double fi = x1 * exp(x2 / (ti + x3)) - yi; gsl_vector_set(f, i, fi); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyer_df (const gsl_vector * x, void *params, gsl_matrix * J) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double term1 = ti + x3; double term2 = exp(x2 / term1); gsl_matrix_set(J, i, 0, term2); gsl_matrix_set(J, i, 1, x1*term2/term1); gsl_matrix_set(J, i, 2, -x1*x2*term2/(term1*term1)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int meyer_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < meyer_N; ++i) { double ti = 45.0 + 5.0*(i + 1.0); double term1 = ti + x3; double term2 = exp(x2 / term1); double term3 = v2*term1 - v3*x2; double term4 = 2*ti*ti*v1 - v3*x1*(x2 + 2*x3) + x3*(v2*x1 + 2*v1*x3) + ti*(v2*x1 - 2*v3*x1 + 4*v1*x3); gsl_vector_set(fvv, i, term2 * term3 * term4 / pow(term1, 4.0)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf meyer_func = { meyer_f, meyer_df, meyer_fvv, meyer_N, meyer_P, NULL, 0, 0, 0 }; static test_fdf_problem meyer_problem = { "meyer", meyer_x0, NULL, NULL, &meyer_epsrel, &meyer_checksol, &meyer_func }; gsl-doc-2.3/multifit_nlinear/test_rat42.c0000644000175000017500000000657612771454363016516 0ustar eddedd#define rat42_N 9 #define rat42_P 3 static double rat42_x0a[rat42_P] = { 100.0, 1.0, 0.1 }; static double rat42_x0b[rat42_P] = { 75.0, 2.5, 0.07 }; static double rat42_epsrel = 1.0e-7; static double rat42_sigma[rat42_P] = { 1.7340283401E+00, 8.8295217536E-02, 3.4465663377E-03 }; static double rat42_X[rat42_N] = { 9.0, 14.0, 21.0, 28.0, 42.0, 57.0, 63.0, 70.0, 79.0 }; static double rat42_F[rat42_N] = { 8.930, 10.800, 18.590, 22.330, 39.350, 56.110, 61.730, 64.620, 67.080 }; static void rat42_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 8.0565229338E+00; const double rat42_x[rat42_P] = { 7.2462237576E+01, 2.6180768402E+00, 6.7359200066E-02 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < rat42_P; ++i) { gsl_test_rel(x[i], rat42_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int rat42_f (const gsl_vector * x, void *params, gsl_vector * f) { double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double yi = b[0] / (1.0 + exp(b[1] - b[2]*xi)); gsl_vector_set (f, i, yi - rat42_F[i]); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat42_df (const gsl_vector * x, void *params, gsl_matrix * df) { double b[rat42_P]; size_t i; for (i = 0; i < rat42_P; i++) { b[i] = gsl_vector_get(x, i); } for (i = 0; i < rat42_N; i++) { double xi = rat42_X[i]; double term1 = exp(b[1] - b[2]*xi); double term2 = 1.0 + term1; gsl_matrix_set (df, i, 0, 1.0 / term2); gsl_matrix_set (df, i, 1, -b[0] * term1 / (term2 * term2)); gsl_matrix_set (df, i, 2, b[0] * term1 * xi / (term2 * term2)); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static int rat42_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { double x1 = gsl_vector_get(x, 0); double x2 = gsl_vector_get(x, 1); double x3 = gsl_vector_get(x, 2); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); double v3 = gsl_vector_get(v, 2); size_t i; for (i = 0; i < rat42_N; i++) { double ti = rat42_X[i]; double term1 = exp(x2); double term2 = exp(ti * x3); gsl_vector_set(fvv, i, -pow(term1 + term2, -3.0) * term1 * term2 * (v2 - ti*v3) * (term1*(2*v1 - v2*x1 + ti*v3*x1) + term2*(2*v1 + x1*(v2 - ti*v3)))); } (void)params; /* avoid unused parameter warning */ return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf rat42_func = { rat42_f, rat42_df, rat42_fvv, rat42_N, rat42_P, NULL, 0, 0, 0 }; static test_fdf_problem rat42a_problem = { "nist-rat42a", rat42_x0a, NULL, rat42_sigma, &rat42_epsrel, &rat42_checksol, &rat42_func }; static test_fdf_problem rat42b_problem = { "nist-rat42b", rat42_x0b, NULL, rat42_sigma, &rat42_epsrel, &rat42_checksol, &rat42_func }; gsl-doc-2.3/multifit_nlinear/fdf.c0000644000175000017500000003320012771517741015242 0ustar eddedd/* multifit_nlinear/fdf.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include gsl_multifit_nlinear_workspace * gsl_multifit_nlinear_alloc (const gsl_multifit_nlinear_type * T, const gsl_multifit_nlinear_parameters * params, const size_t n, const size_t p) { gsl_multifit_nlinear_workspace * w; if (n < p) { GSL_ERROR_VAL ("insufficient data points, n < p", GSL_EINVAL, 0); } w = calloc (1, sizeof (gsl_multifit_nlinear_workspace)); if (w == 0) { GSL_ERROR_VAL ("failed to allocate space for multifit workspace", GSL_ENOMEM, 0); } w->x = gsl_vector_calloc (p); if (w->x == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0); } w->f = gsl_vector_calloc (n); if (w->f == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0); } w->dx = gsl_vector_calloc (p); if (w->dx == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0); } w->g = gsl_vector_alloc (p); if (w->g == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for g", GSL_ENOMEM, 0); } w->J = gsl_matrix_alloc(n, p); if (w->J == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for Jacobian", GSL_ENOMEM, 0); } w->sqrt_wts_work = gsl_vector_calloc (n); if (w->sqrt_wts_work == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for weights", GSL_ENOMEM, 0); } w->state = (T->alloc)(params, n, p); if (w->state == 0) { gsl_multifit_nlinear_free (w); GSL_ERROR_VAL ("failed to allocate space for multifit state", GSL_ENOMEM, 0); } w->type = T; w->fdf = NULL; w->niter = 0; w->params = *params; return w; } void gsl_multifit_nlinear_free (gsl_multifit_nlinear_workspace * w) { RETURN_IF_NULL (w); if (w->state) (w->type->free) (w->state); if (w->dx) gsl_vector_free (w->dx); if (w->x) gsl_vector_free (w->x); if (w->f) gsl_vector_free (w->f); if (w->sqrt_wts_work) gsl_vector_free (w->sqrt_wts_work); if (w->g) gsl_vector_free (w->g); if (w->J) gsl_matrix_free (w->J); free (w); } gsl_multifit_nlinear_parameters gsl_multifit_nlinear_default_parameters(void) { gsl_multifit_nlinear_parameters params; params.trs = gsl_multifit_nlinear_trs_lm; params.scale = gsl_multifit_nlinear_scale_more; params.solver = gsl_multifit_nlinear_solver_qr; params.fdtype = GSL_MULTIFIT_NLINEAR_FWDIFF; params.factor_up = 3.0; params.factor_down = 2.0; params.avmax = 0.75; params.h_df = GSL_SQRT_DBL_EPSILON; params.h_fvv = 0.02; return params; } int gsl_multifit_nlinear_init (const gsl_vector * x, gsl_multifit_nlinear_fdf * fdf, gsl_multifit_nlinear_workspace * w) { return gsl_multifit_nlinear_winit(x, NULL, fdf, w); } int gsl_multifit_nlinear_winit (const gsl_vector * x, const gsl_vector * wts, gsl_multifit_nlinear_fdf * fdf, gsl_multifit_nlinear_workspace * w) { const size_t n = w->f->size; if (n != fdf->n) { GSL_ERROR ("function size does not match workspace", GSL_EBADLEN); } else if (w->x->size != x->size) { GSL_ERROR ("vector length does not match workspace", GSL_EBADLEN); } else if (wts != NULL && n != wts->size) { GSL_ERROR ("weight vector length does not match workspace", GSL_EBADLEN); } else { size_t i; /* initialize counters for function and Jacobian evaluations */ fdf->nevalf = 0; fdf->nevaldf = 0; fdf->nevalfvv = 0; w->fdf = fdf; gsl_vector_memcpy(w->x, x); w->niter = 0; if (wts) { w->sqrt_wts = w->sqrt_wts_work; for (i = 0; i < n; ++i) { double wi = gsl_vector_get(wts, i); gsl_vector_set(w->sqrt_wts, i, sqrt(wi)); } } else { w->sqrt_wts = NULL; } return (w->type->init) (w->state, w->sqrt_wts, w->fdf, w->x, w->f, w->J, w->g); } } int gsl_multifit_nlinear_iterate (gsl_multifit_nlinear_workspace * w) { int status = (w->type->iterate) (w->state, w->sqrt_wts, w->fdf, w->x, w->f, w->J, w->g, w->dx); w->niter++; return status; } double gsl_multifit_nlinear_avratio (const gsl_multifit_nlinear_workspace * w) { return (w->type->avratio) (w->state); } /* gsl_multifit_nlinear_driver() Iterate the nonlinear least squares solver until completion Inputs: maxiter - maximum iterations to allow xtol - tolerance in step x gtol - tolerance in gradient ftol - tolerance in ||f|| callback - callback function to call each iteration callback_params - parameters to pass to callback function info - (output) info flag on why iteration terminated 1 = stopped due to small step size ||dx| 2 = stopped due to small gradient 3 = stopped due to small change in f GSL_ETOLX = ||dx|| has converged to within machine precision (and xtol is too small) GSL_ETOLG = ||g||_inf is smaller than machine precision (gtol is too small) GSL_ETOLF = change in ||f|| is smaller than machine precision (ftol is too small) w - workspace Return: GSL_SUCCESS if converged GSL_MAXITER if maxiter exceeded without converging GSL_ENOPROG if no accepted step found on first iteration */ int gsl_multifit_nlinear_driver (const size_t maxiter, const double xtol, const double gtol, const double ftol, void (*callback)(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w), void *callback_params, int *info, gsl_multifit_nlinear_workspace * w) { int status; size_t iter = 0; /* call user callback function prior to any iterations * with initial system state */ if (callback) callback(iter, callback_params, w); do { status = gsl_multifit_nlinear_iterate (w); /* * If the solver reports no progress on the first iteration, * then it didn't find a single step to reduce the * cost function and more iterations won't help so return. * * If we get a no progress flag on subsequent iterations, * it means we did find a good step in a previous iteration, * so continue iterating since the solver has now reset * mu to its initial value. */ if (status == GSL_ENOPROG && iter == 0) { *info = status; return GSL_EMAXITER; } ++iter; if (callback) callback(iter, callback_params, w); /* test for convergence */ status = gsl_multifit_nlinear_test(xtol, gtol, ftol, info, w); } while (status == GSL_CONTINUE && iter < maxiter); /* * the following error codes mean that the solution has converged * to within machine precision, so record the error code in info * and return success */ if (status == GSL_ETOLF || status == GSL_ETOLX || status == GSL_ETOLG) { *info = status; status = GSL_SUCCESS; } /* check if max iterations reached */ if (iter >= maxiter && status != GSL_SUCCESS) status = GSL_EMAXITER; return status; } /* gsl_multifit_nlinear_driver() */ gsl_matrix * gsl_multifit_nlinear_jac (const gsl_multifit_nlinear_workspace * w) { return w->J; } const char * gsl_multifit_nlinear_name (const gsl_multifit_nlinear_workspace * w) { return w->type->name; } gsl_vector * gsl_multifit_nlinear_position (const gsl_multifit_nlinear_workspace * w) { return w->x; } gsl_vector * gsl_multifit_nlinear_residual (const gsl_multifit_nlinear_workspace * w) { return w->f; } size_t gsl_multifit_nlinear_niter (const gsl_multifit_nlinear_workspace * w) { return w->niter; } int gsl_multifit_nlinear_rcond (double *rcond, const gsl_multifit_nlinear_workspace * w) { int status = (w->type->rcond) (rcond, w->state); return status; } const char * gsl_multifit_nlinear_trs_name (const gsl_multifit_nlinear_workspace * w) { return w->params.trs->name; } /* gsl_multifit_nlinear_eval_f() Compute residual vector y with user callback function, and apply weighting transform if given: y~ = sqrt(W) y Inputs: fdf - callback function x - model parameters swts - weight matrix sqrt(W) = sqrt(diag(w1,w2,...,wn)) set to NULL for unweighted fit y - (output) (weighted) residual vector y_i = sqrt(w_i) f_i where f_i is unweighted residual */ int gsl_multifit_nlinear_eval_f(gsl_multifit_nlinear_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_vector *y) { int s = ((*((fdf)->f)) (x, fdf->params, y)); ++(fdf->nevalf); /* y <- sqrt(W) y */ if (swts) gsl_vector_mul(y, swts); return s; } /* gsl_multifit_nlinear_eval_df() Compute Jacobian matrix J with user callback function, and apply weighting transform if given: J~ = sqrt(W) J Inputs: x - model parameters f - residual vector f(x) swts - weight matrix W = diag(w1,w2,...,wn) set to NULL for unweighted fit h - finite difference step size fdtype - finite difference method fdf - callback function df - (output) (weighted) Jacobian matrix df = sqrt(W) df where df is unweighted Jacobian work - workspace for finite difference, size n */ int gsl_multifit_nlinear_eval_df(const gsl_vector *x, const gsl_vector *f, const gsl_vector *swts, const double h, const gsl_multifit_nlinear_fdtype fdtype, gsl_multifit_nlinear_fdf *fdf, gsl_matrix *df, gsl_vector *work) { int status; if (fdf->df) { /* call user-supplied function */ status = ((*((fdf)->df)) (x, fdf->params, df)); ++(fdf->nevaldf); /* J <- sqrt(W) J */ if (swts) { const size_t n = swts->size; size_t i; for (i = 0; i < n; ++i) { double swi = gsl_vector_get(swts, i); gsl_vector_view v = gsl_matrix_row(df, i); gsl_vector_scale(&v.vector, swi); } } } else { /* use finite difference Jacobian approximation */ status = gsl_multifit_nlinear_df(h, fdtype, x, swts, fdf, f, df, work); } return status; } /* gsl_multifit_nlinear_eval_fvv() Compute second direction derivative vector yvv with user callback function, and apply weighting transform if given: yvv~ = sqrt(W) yvv Inputs: h - step size for finite difference, if needed x - model parameters, size p v - unscaled geodesic velocity vector, size p f - residual vector f(x), size n J - Jacobian matrix J(x), n-by-p swts - weight matrix sqrt(W) = sqrt(diag(w1,w2,...,wn)) set to NULL for unweighted fit fdf - callback function yvv - (output) (weighted) second directional derivative vector yvv_i = sqrt(w_i) fvv_i where f_i is unweighted work - workspace, size p */ int gsl_multifit_nlinear_eval_fvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *yvv, gsl_vector *work) { int status; if (fdf->fvv != NULL) { /* call user-supplied function */ status = ((*((fdf)->fvv)) (x, v, fdf->params, yvv)); ++(fdf->nevalfvv); /* yvv <- sqrt(W) yvv */ if (swts) gsl_vector_mul(yvv, swts); } else { /* use finite difference approximation */ status = gsl_multifit_nlinear_fdfvv(h, x, v, f, J, swts, fdf, yvv, work); } return status; } gsl-doc-2.3/multifit_nlinear/gsl_multifit_nlinear.h0000644000175000017500000002744012753423644020731 0ustar eddedd/* multifit_nlinear/gsl_multifit_nlinear.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_NLINEAR_H__ #define __GSL_MULTIFIT_NLINEAR_H__ #include #include #include #include #include #include #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_MULTIFIT_NLINEAR_FWDIFF, GSL_MULTIFIT_NLINEAR_CTRDIFF } gsl_multifit_nlinear_fdtype; /* Definition of vector-valued functions and gradient with parameters based on gsl_vector */ typedef struct { int (* f) (const gsl_vector * x, void * params, gsl_vector * f); int (* df) (const gsl_vector * x, void * params, gsl_matrix * df); int (* fvv) (const gsl_vector * x, const gsl_vector * v, void * params, gsl_vector * fvv); size_t n; /* number of functions */ size_t p; /* number of independent variables */ void * params; /* user parameters */ size_t nevalf; /* number of function evaluations */ size_t nevaldf; /* number of Jacobian evaluations */ size_t nevalfvv; /* number of fvv evaluations */ } gsl_multifit_nlinear_fdf; /* trust region subproblem method */ typedef struct { const char *name; void * (*alloc) (const void * params, const size_t n, const size_t p); int (*init) (const void * vtrust_state, void * vstate); int (*preloop) (const void * vtrust_state, void * vstate); int (*step) (const void * vtrust_state, const double delta, gsl_vector * dx, void * vstate); int (*preduction) (const void * vtrust_state, const gsl_vector * dx, double * pred, void * vstate); void (*free) (void * vstate); } gsl_multifit_nlinear_trs; /* scaling matrix specification */ typedef struct { const char *name; int (*init) (const gsl_matrix * J, gsl_vector * diag); int (*update) (const gsl_matrix * J, gsl_vector * diag); } gsl_multifit_nlinear_scale; /* * linear least squares solvers - there are three steps to * solving a least squares problem using a trust region * method: * * 1. init: called once per iteration when a new Jacobian matrix * is computed; perform factorization of Jacobian (qr,svd) * or form normal equations matrix (cholesky) * 2. presolve: called each time a new LM parameter value mu is available; * used for cholesky method in order to factor * the (J^T J + mu D^T D) matrix * 3. solve: solve the least square system for a given rhs */ typedef struct { const char *name; void * (*alloc) (const size_t n, const size_t p); int (*init) (const void * vtrust_state, void * vstate); int (*presolve) (const double mu, const void * vtrust_state, void * vstate); int (*solve) (const gsl_vector * f, gsl_vector * x, const void * vtrust_state, void * vstate); int (*rcond) (double * rcond, void * vstate); void (*free) (void * vstate); } gsl_multifit_nlinear_solver; /* tunable parameters */ typedef struct { const gsl_multifit_nlinear_trs *trs; /* trust region subproblem method */ const gsl_multifit_nlinear_scale *scale; /* scaling method */ const gsl_multifit_nlinear_solver *solver; /* solver method */ gsl_multifit_nlinear_fdtype fdtype; /* finite difference method */ double factor_up; /* factor for increasing trust radius */ double factor_down; /* factor for decreasing trust radius */ double avmax; /* max allowed |a|/|v| */ double h_df; /* step size for finite difference Jacobian */ double h_fvv; /* step size for finite difference fvv */ } gsl_multifit_nlinear_parameters; typedef struct { const char *name; void * (*alloc) (const gsl_multifit_nlinear_parameters * params, const size_t n, const size_t p); int (*init) (void * state, const gsl_vector * wts, gsl_multifit_nlinear_fdf * fdf, const gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * g); int (*iterate) (void * state, const gsl_vector * wts, gsl_multifit_nlinear_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * g, gsl_vector * dx); int (*rcond) (double * rcond, void * state); double (*avratio) (void * state); void (*free) (void * state); } gsl_multifit_nlinear_type; /* current state passed to low-level trust region algorithms */ typedef struct { const gsl_vector * x; /* parameter values x */ const gsl_vector * f; /* residual vector f(x) */ const gsl_vector * g; /* gradient J^T f */ const gsl_matrix * J; /* Jacobian J(x) */ const gsl_vector * diag; /* scaling matrix D */ const gsl_vector * sqrt_wts; /* sqrt(diag(W)) or NULL for unweighted */ const double *mu; /* LM parameter */ const gsl_multifit_nlinear_parameters * params; void *solver_state; /* workspace for linear least squares solver */ gsl_multifit_nlinear_fdf * fdf; double *avratio; /* |a| / |v| */ } gsl_multifit_nlinear_trust_state; typedef struct { const gsl_multifit_nlinear_type * type; gsl_multifit_nlinear_fdf * fdf ; gsl_vector * x; /* parameter values x */ gsl_vector * f; /* residual vector f(x) */ gsl_vector * dx; /* step dx */ gsl_vector * g; /* gradient J^T f */ gsl_matrix * J; /* Jacobian J(x) */ gsl_vector * sqrt_wts_work; /* sqrt(W) */ gsl_vector * sqrt_wts; /* ptr to sqrt_wts_work, or NULL if not using weights */ size_t niter; /* number of iterations performed */ gsl_multifit_nlinear_parameters params; void *state; } gsl_multifit_nlinear_workspace; gsl_multifit_nlinear_workspace * gsl_multifit_nlinear_alloc (const gsl_multifit_nlinear_type * T, const gsl_multifit_nlinear_parameters * params, size_t n, size_t p); void gsl_multifit_nlinear_free (gsl_multifit_nlinear_workspace * w); gsl_multifit_nlinear_parameters gsl_multifit_nlinear_default_parameters(void); int gsl_multifit_nlinear_init (const gsl_vector * x, gsl_multifit_nlinear_fdf * fdf, gsl_multifit_nlinear_workspace * w); int gsl_multifit_nlinear_winit (const gsl_vector * x, const gsl_vector * wts, gsl_multifit_nlinear_fdf * fdf, gsl_multifit_nlinear_workspace * w); int gsl_multifit_nlinear_iterate (gsl_multifit_nlinear_workspace * w); double gsl_multifit_nlinear_avratio (const gsl_multifit_nlinear_workspace * w); int gsl_multifit_nlinear_driver (const size_t maxiter, const double xtol, const double gtol, const double ftol, void (*callback)(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w), void *callback_params, int *info, gsl_multifit_nlinear_workspace * w); gsl_matrix * gsl_multifit_nlinear_jac (const gsl_multifit_nlinear_workspace * w); const char * gsl_multifit_nlinear_name (const gsl_multifit_nlinear_workspace * w); gsl_vector * gsl_multifit_nlinear_position (const gsl_multifit_nlinear_workspace * w); gsl_vector * gsl_multifit_nlinear_residual (const gsl_multifit_nlinear_workspace * w); size_t gsl_multifit_nlinear_niter (const gsl_multifit_nlinear_workspace * w); int gsl_multifit_nlinear_rcond (double *rcond, const gsl_multifit_nlinear_workspace * w); const char * gsl_multifit_nlinear_trs_name (const gsl_multifit_nlinear_workspace * w); int gsl_multifit_nlinear_eval_f(gsl_multifit_nlinear_fdf *fdf, const gsl_vector *x, const gsl_vector *swts, gsl_vector *y); int gsl_multifit_nlinear_eval_df(const gsl_vector *x, const gsl_vector *f, const gsl_vector *swts, const double h, const gsl_multifit_nlinear_fdtype fdtype, gsl_multifit_nlinear_fdf *fdf, gsl_matrix *df, gsl_vector *work); int gsl_multifit_nlinear_eval_fvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *yvv, gsl_vector *work); /* covar.c */ int gsl_multifit_nlinear_covar (const gsl_matrix * J, const double epsrel, gsl_matrix * covar); /* convergence.c */ int gsl_multifit_nlinear_test (const double xtol, const double gtol, const double ftol, int *info, const gsl_multifit_nlinear_workspace * w); /* fdjac.c */ int gsl_multifit_nlinear_df(const double h, const gsl_multifit_nlinear_fdtype fdtype, const gsl_vector *x, const gsl_vector *wts, gsl_multifit_nlinear_fdf *fdf, const gsl_vector *f, gsl_matrix *J, gsl_vector *work); /* fdfvv.c */ int gsl_multifit_nlinear_fdfvv(const double h, const gsl_vector *x, const gsl_vector *v, const gsl_vector *f, const gsl_matrix *J, const gsl_vector *swts, gsl_multifit_nlinear_fdf *fdf, gsl_vector *fvv, gsl_vector *work); /* top-level algorithms */ GSL_VAR const gsl_multifit_nlinear_type * gsl_multifit_nlinear_trust; /* trust region subproblem methods */ GSL_VAR const gsl_multifit_nlinear_trs * gsl_multifit_nlinear_trs_lm; GSL_VAR const gsl_multifit_nlinear_trs * gsl_multifit_nlinear_trs_lmaccel; GSL_VAR const gsl_multifit_nlinear_trs * gsl_multifit_nlinear_trs_dogleg; GSL_VAR const gsl_multifit_nlinear_trs * gsl_multifit_nlinear_trs_ddogleg; GSL_VAR const gsl_multifit_nlinear_trs * gsl_multifit_nlinear_trs_subspace2D; /* scaling matrix strategies */ GSL_VAR const gsl_multifit_nlinear_scale * gsl_multifit_nlinear_scale_levenberg; GSL_VAR const gsl_multifit_nlinear_scale * gsl_multifit_nlinear_scale_marquardt; GSL_VAR const gsl_multifit_nlinear_scale * gsl_multifit_nlinear_scale_more; /* linear solvers */ GSL_VAR const gsl_multifit_nlinear_solver * gsl_multifit_nlinear_solver_cholesky; GSL_VAR const gsl_multifit_nlinear_solver * gsl_multifit_nlinear_solver_qr; GSL_VAR const gsl_multifit_nlinear_solver * gsl_multifit_nlinear_solver_svd; __END_DECLS #endif /* __GSL_MULTIFIT_NLINEAR_H__ */ gsl-doc-2.3/multifit_nlinear/qr.c0000644000175000017500000001617512754416317015137 0ustar eddedd/* multifit_nlinear/qr.c * * Copyright (C) 2015, 2016 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 module handles the solution of the linear least squares * system: * * [ J~ ] p~ = - [ f ] * [ sqrt(mu)*D~ ] [ 0 ] * * using a QR approach. Quantities are scaled according to: * * J~ = J S * D~ = D S * p~ = S^{-1} p * * where S is a diagonal matrix and S_jj = || J_j || and J_j is column * j of the Jacobian. This balancing transformation seems to be more * numerically stable for some Jacobians. */ #include #include #include #include #include #include #include #include #include "common.c" #include "qrsolv.c" typedef struct { size_t p; gsl_matrix *QR; /* QR factorization of J */ gsl_vector *tau_Q; /* Householder scalars for Q */ gsl_matrix *T; /* workspace matrix for qrsolv, p-by-p */ gsl_permutation *perm; /* permutation matrix */ size_t rank; /* rank of J */ gsl_vector *residual; /* residual of LS problem [ J; sqrt(mu) D ] p = - [ f; 0 ] */ gsl_vector *qtf; /* Q^T f */ gsl_vector *workn; /* workspace, length n */ gsl_vector *workp; /* workspace, length p */ gsl_vector *work3p; /* workspace, length 3*p */ double mu; /* LM parameter */ } qr_state_t; static int qr_init(const void * vtrust_state, void * vstate); static int qr_presolve(const double mu, const void * vtrust_state, void * vstate); static int qr_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate); static int qr_rcond(double * rcond, void * vstate); static void * qr_alloc (const size_t n, const size_t p) { qr_state_t *state; (void)n; state = calloc(1, sizeof(qr_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate qr state", GSL_ENOMEM); } state->QR = gsl_matrix_alloc(n, p); if (state->QR == NULL) { GSL_ERROR_NULL ("failed to allocate space for QR", GSL_ENOMEM); } state->tau_Q = gsl_vector_alloc(p); if (state->tau_Q == NULL) { GSL_ERROR_NULL ("failed to allocate space for tau_Q", GSL_ENOMEM); } state->T = gsl_matrix_alloc(p, p); if (state->T == NULL) { GSL_ERROR_NULL ("failed to allocate space for T", GSL_ENOMEM); } state->qtf = gsl_vector_alloc(n); if (state->qtf == NULL) { GSL_ERROR_NULL ("failed to allocate space for qtf", GSL_ENOMEM); } state->residual = gsl_vector_alloc(n); if (state->residual == NULL) { GSL_ERROR_NULL ("failed to allocate space for residual", GSL_ENOMEM); } state->perm = gsl_permutation_calloc(p); if (state->perm == NULL) { GSL_ERROR_NULL ("failed to allocate space for perm", GSL_ENOMEM); } state->workn = gsl_vector_alloc(n); if (state->workn == NULL) { GSL_ERROR_NULL ("failed to allocate space for workn", GSL_ENOMEM); } state->workp = gsl_vector_alloc(p); if (state->workp == NULL) { GSL_ERROR_NULL ("failed to allocate space for workp", GSL_ENOMEM); } state->work3p = gsl_vector_alloc(3 * p); if (state->work3p == NULL) { GSL_ERROR_NULL ("failed to allocate space for work3p", GSL_ENOMEM); } state->p = p; state->mu = 0.0; state->rank = 0; return state; } static void qr_free(void *vstate) { qr_state_t *state = (qr_state_t *) vstate; if (state->QR) gsl_matrix_free(state->QR); if (state->tau_Q) gsl_vector_free(state->tau_Q); if (state->T) gsl_matrix_free(state->T); if (state->qtf) gsl_vector_free(state->qtf); if (state->residual) gsl_vector_free(state->residual); if (state->perm) gsl_permutation_free(state->perm); if (state->workn) gsl_vector_free(state->workn); if (state->workp) gsl_vector_free(state->workp); if (state->work3p) gsl_vector_free(state->work3p); free(state); } /* compute J = Q R PT */ static int qr_init(const void * vtrust_state, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; qr_state_t *state = (qr_state_t *) vstate; int signum; /* perform QR decomposition of J */ gsl_matrix_memcpy(state->QR, trust_state->J); gsl_linalg_QRPT_decomp(state->QR, state->tau_Q, state->perm, &signum, state->workp); return GSL_SUCCESS; } static int qr_presolve(const double mu, const void * vtrust_state, void * vstate) { qr_state_t *state = (qr_state_t *) vstate; state->mu = mu; (void) vtrust_state; return GSL_SUCCESS; } static int qr_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate) { qr_state_t *state = (qr_state_t *) vstate; int status; if (state->mu == 0.0) { /* * compute Gauss-Newton direction by solving * J x = f * with an attempt to identify rank deficiency in J */ size_t rank = gsl_linalg_QRPT_rank(state->QR, -1.0); status = gsl_linalg_QRPT_lssolve2(state->QR, state->tau_Q, state->perm, f, rank, x, state->residual); } else { /* * solve: * * [ J ] x = [ f ] * [ sqrt(mu) D ] [ 0 ] * * using QRPT factorization of J */ const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; double sqrt_mu = sqrt(state->mu); /* compute qtf = Q^T f */ gsl_vector_memcpy(state->qtf, f); gsl_linalg_QR_QTvec(state->QR, state->tau_Q, state->qtf); status = qrsolv(state->QR, state->perm, sqrt_mu, trust_state->diag, state->qtf, state->T, x, state->workn); } /* reverse step to go downhill */ gsl_vector_scale(x, -1.0); return status; } static int qr_rcond(double * rcond, void * vstate) { int status; qr_state_t *state = (qr_state_t *) vstate; status = gsl_linalg_QRPT_rcond(state->QR, rcond, state->work3p); return status; } static const gsl_multifit_nlinear_solver qr_type = { "qr", qr_alloc, qr_init, qr_presolve, qr_solve, qr_rcond, qr_free }; const gsl_multifit_nlinear_solver *gsl_multifit_nlinear_solver_qr = &qr_type; gsl-doc-2.3/multifit_nlinear/test.c0000644000175000017500000000653512767073750015477 0ustar eddedd/* multifit_nlinear/test.c * * Copyright (C) 2007, 2013, 2015, 2016 Brian Gough, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include "test_fdf.c" static void test_proc(const gsl_multifit_nlinear_trs *trs, const gsl_multifit_nlinear_scale *scale, const gsl_multifit_nlinear_solver *solver, const int fdtype) { gsl_multifit_nlinear_parameters fdf_params = gsl_multifit_nlinear_default_parameters(); fdf_params.trs = trs; fdf_params.scale = scale; fdf_params.solver = solver; fdf_params.fdtype = fdtype; test_fdf_main(&fdf_params); } int main (void) { const gsl_multifit_nlinear_trs **nlinear_trs[6]; const gsl_multifit_nlinear_solver **nlinear_solvers[4]; const gsl_multifit_nlinear_scale **nlinear_scales[3]; const gsl_multifit_nlinear_trs **trs; const gsl_multifit_nlinear_solver **solver; const gsl_multifit_nlinear_scale **scale; size_t i = 0; gsl_ieee_env_setup(); /* initialize arrays */ nlinear_trs[0] = &gsl_multifit_nlinear_trs_lm; nlinear_trs[1] = &gsl_multifit_nlinear_trs_lmaccel; nlinear_trs[2] = &gsl_multifit_nlinear_trs_dogleg; nlinear_trs[3] = &gsl_multifit_nlinear_trs_ddogleg; nlinear_trs[4] = &gsl_multifit_nlinear_trs_subspace2D; nlinear_trs[5] = NULL; nlinear_solvers[0] = &gsl_multifit_nlinear_solver_cholesky; nlinear_solvers[1] = &gsl_multifit_nlinear_solver_qr; nlinear_solvers[2] = &gsl_multifit_nlinear_solver_svd; nlinear_solvers[3] = NULL; /* skip Marquardt scaling since it won't pass */ nlinear_scales[0] = &gsl_multifit_nlinear_scale_levenberg; nlinear_scales[1] = &gsl_multifit_nlinear_scale_more; nlinear_scales[2] = NULL; /* run testsuite over all parameter combinations */ for (trs = nlinear_trs[i]; trs != NULL; trs = nlinear_trs[++i]) { size_t j = 0; fprintf(stderr, "trs = %s\n", (*trs)->name); for (solver = nlinear_solvers[j]; solver != NULL; solver = nlinear_solvers[++j]) { size_t k = 0; fprintf(stderr, "solver = %s\n", (*solver)->name); for (scale = nlinear_scales[k]; scale != NULL; scale = nlinear_scales[++k]) { test_proc(*trs, *scale, *solver, GSL_MULTIFIT_NLINEAR_FWDIFF); test_proc(*trs, *scale, *solver, GSL_MULTIFIT_NLINEAR_CTRDIFF); } } } exit (gsl_test_summary ()); } gsl-doc-2.3/multifit_nlinear/test_wnlin.c0000644000175000017500000001077412771454551016703 0ustar eddedd#define wnlin_N 40 #define wnlin_P 3 /* initial guess should be chosen so that Jacobian has full rank, * or some solvers will fail */ static double wnlin_x0[wnlin_P] = { 1.0, 0.9, 0.0 }; static double wnlin_epsrel = 1.0e-7; static int wnlin_internal_weight = 1; /* data */ static double wnlin_Y[wnlin_N] = { 6.08035e+00, 5.47552e+00, 5.94654e+00, 5.04920e+00, 4.78568e+00, 3.51748e+00, 2.84671e+00, 3.24634e+00, 3.23395e+00, 3.30385e+00, 2.83439e+00, 2.31891e+00, 2.33858e+00, 2.40559e+00, 2.41856e+00, 1.99966e+00, 1.88127e+00, 1.91477e+00, 1.70415e+00, 1.60316e+00, 1.77937e+00, 1.55302e+00, 1.50903e+00, 1.36364e+00, 1.36873e+00, 1.41954e+00, 1.37778e+00, 1.23573e+00, 1.28524e+00, 1.46327e+00, 1.22315e+00, 1.19330e+00, 1.18717e+00, 8.83172e-01, 1.23424e+00, 1.14683e+00, 1.11091e+00, 1.20396e+00, 1.28722e+00, 1.05801e+00 }; /* weights */ static double wnlin_W[wnlin_N] = { 2.77778e+00, 3.27690e+00, 3.85426e+00, 4.51906e+00, 5.28083e+00, 6.14919e+00, 7.13370e+00, 8.24349e+00, 9.48703e+00, 1.08717e+01, 1.24036e+01, 1.40869e+01, 1.59238e+01, 1.79142e+01, 2.00553e+01, 2.23415e+01, 2.47646e+01, 2.73137e+01, 2.99753e+01, 3.27337e+01, 3.55714e+01, 3.84696e+01, 4.14085e+01, 4.43678e+01, 4.73278e+01, 5.02690e+01, 5.31731e+01, 5.60234e+01, 5.88046e+01, 6.15036e+01, 6.41092e+01, 6.66121e+01, 6.90054e+01, 7.12839e+01, 7.34442e+01, 7.54848e+01, 7.74053e+01, 7.92069e+01, 8.08918e+01, 8.24632e+01 }; static void wnlin_checksol(const double x[], const double sumsq, const double epsrel, const char *sname, const char *pname) { size_t i; const double sumsq_exact = 29.7481259665713758; const double wnlin_x[wnlin_P] = { 5.17378551196259195, 0.111041758006851149, 1.05282724070446099 }; gsl_test_rel(sumsq, sumsq_exact, epsrel, "%s/%s sumsq", sname, pname); for (i = 0; i < wnlin_P; ++i) { gsl_test_rel(x[i], wnlin_x[i], epsrel, "%s/%s i=%zu", sname, pname, i); } } static int wnlin_f (const gsl_vector *x, void *params, gsl_vector *f) { int *iptr = (int *) params; int doweight = iptr ? *iptr : 0; double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); double b = gsl_vector_get (x, 2); size_t i; /* model Yi = A * exp(-lambda * i) + b */ for (i = 0; i < wnlin_N; i++) { double ti = i; double yi = wnlin_Y[i]; double swi = sqrt(wnlin_W[i]); double Mi = A * exp (-lambda * ti) + b; if (doweight) gsl_vector_set (f, i, swi * (Mi - yi)); else gsl_vector_set (f, i, Mi - yi); } return GSL_SUCCESS; } static int wnlin_df (const gsl_vector *x, void *params, gsl_matrix *df) { int *iptr = (int *) params; int doweight = iptr ? *iptr : 0; double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); size_t i; for (i = 0; i < wnlin_N; i++) { gsl_vector_view v = gsl_matrix_row(df, i); double ti = i; double swi = sqrt(wnlin_W[i]); double e = exp(-lambda * ti); gsl_vector_set(&v.vector, 0, e); gsl_vector_set(&v.vector, 1, -ti * A * e); gsl_vector_set(&v.vector, 2, 1.0); if (doweight) gsl_vector_scale(&v.vector, swi); } return GSL_SUCCESS; } static int wnlin_fvv (const gsl_vector * x, const gsl_vector * v, void *params, gsl_vector * fvv) { int *iptr = (int *) params; int doweight = iptr ? *iptr : 0; double A = gsl_vector_get (x, 0); double lambda = gsl_vector_get (x, 1); double v1 = gsl_vector_get(v, 0); double v2 = gsl_vector_get(v, 1); size_t i; for (i = 0; i < wnlin_N; i++) { double ti = i; double swi = sqrt(wnlin_W[i]); double fvvi; fvvi = exp(-ti*lambda)*ti*v2 * (-2*v1 + ti*v2*A); if (doweight) gsl_vector_set(fvv, i, swi * fvvi); else gsl_vector_set(fvv, i, fvvi); } return GSL_SUCCESS; } static gsl_multifit_nlinear_fdf wnlin_func1 = { wnlin_f, wnlin_df, wnlin_fvv, wnlin_N, wnlin_P, (void *) &wnlin_internal_weight, 0, 0, 0 }; static gsl_multifit_nlinear_fdf wnlin_func2 = { wnlin_f, wnlin_df, wnlin_fvv, wnlin_N, wnlin_P, NULL, 0, 0, 0 }; static test_fdf_problem wnlin_problem1 = { "wnlin_internal_weights", wnlin_x0, NULL, NULL, &wnlin_epsrel, &wnlin_checksol, &wnlin_func1 }; static test_fdf_problem wnlin_problem2 = { "wnlin_external_weights", wnlin_x0, wnlin_W, NULL, &wnlin_epsrel, &wnlin_checksol, &wnlin_func2 }; gsl-doc-2.3/ltmain.sh0000644000175000017500000105152212630105467012612 0ustar eddedd # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [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 # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # 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. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # 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+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # 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" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; 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 that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # 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 "$opt_dry_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" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # 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= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_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 $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE 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. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # 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 () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` 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 "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # 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. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # 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 func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # 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= pie_flag= 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) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append 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,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append 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. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # 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 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) 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 "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" 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 $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "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." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # 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 func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' 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." $opt_dry_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 func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi 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$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 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." $opt_dry_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 func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [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: $progname [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 -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler 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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [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 -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -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 -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) 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: $progname [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." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" 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 -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # 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 } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" 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" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # 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. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; 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. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append 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 -e "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. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" 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 func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_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 test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append 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 func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_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 func_basename "$file" destfile="$func_basename_result" 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 func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "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) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # 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 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/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) 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*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; 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 "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # 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. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug 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 # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $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_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" 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 func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_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've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # 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. sed_quote_subst='$sed_quote_subst' # 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+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # 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 variables: generated_by_libtool_version='$macro_version' 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 file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ 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 "\ # 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 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} 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 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #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 # define FOPEN_WB "wb" # 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 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ 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; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); 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 (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); 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 (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); 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 * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } 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; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # 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= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= 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 weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac 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 func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append 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 func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" 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 func_append 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. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append 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 func_append 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" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" 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 # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir 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 func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework 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*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append 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* | *-cegcc* | *-*-haiku*) # 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 func_append deplibs " System.ltframework" 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 func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" 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*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # 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 ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" 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 func_append 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. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append 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 func_append 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" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" 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. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'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\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. 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 $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append 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 $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append 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 notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; 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 # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi 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 "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" 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 \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; 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 func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" 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 func_dirname "$lib" "" "." ladir="$func_dirname_result" 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 *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; 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 func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 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 use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac 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. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # 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 func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append 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 func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" 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. func_append dlprefiles " $lib $dependency_libs" else func_append 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 func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$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 func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac 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 func_append 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*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; 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 $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append 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 "$prefer_static_libs,$installed" = "built,yes"; } || 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 *"$absdir:"*) ;; *) func_append 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 "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append 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 case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && 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 "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" 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* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' 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 "$opt_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 (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; 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 elif test -n "$old_library"; then 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 && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append 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 func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append 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:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; 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:"*) ;; *) func_append 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 [\\/]*) func_append 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*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append 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" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= 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 "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi 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 "*) ;; *) func_append 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 "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append 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 func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" 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 test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # 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="$1" number_minor="$2" number_revision="$3" # # 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 # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; 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]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; 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]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; 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]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" 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 func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result 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 func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result 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 func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; 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 func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_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 | *.gcno) ;; $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 func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append 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 "*) ;; *) func_append 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 "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-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 func_append 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. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi 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 "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append 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 ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append 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 func_append 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 ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; 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 " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) 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 ;; esac ;; 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 with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; 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 # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; 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 " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append 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 # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_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 func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append 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 "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append 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 "$opt_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 shift realname="$1" 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 func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "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" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_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:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # 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 func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append 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. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result 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~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "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" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi 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\" test "X$libobjs" = "X " && libobjs= 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 fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( 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 "$opt_mode" = relink; then $opt_dry_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 func_show_eval '${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 func_show_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 "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_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 and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${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" # $opt_dry_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" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; 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 "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append 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 "*) ;; *) func_append 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append 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 "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status 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 func_append 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 func_append 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi 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" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED '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 "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result 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 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } 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 $symfileobj" 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" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append 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 # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # 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 func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$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 eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$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= len=$len0 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 func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; 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 "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { 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) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # 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' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_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 } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug 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) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; 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 func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append 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 func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # 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 build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 gsl-doc-2.3/templates_off.h0000664000175000017500000000204112616157443013771 0ustar eddedd#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 gsl-doc-2.3/gsl_types.h0000664000175000017500000000217512616157443013162 0ustar eddedd/* gsl_types.h * * Copyright (C) 2001, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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__ */ gsl-doc-2.3/randist/0000755000175000017500000000000013022553154012424 5ustar eddeddgsl-doc-2.3/randist/hyperg.c0000664000175000017500000000542512616157443014107 0ustar eddedd/* randist/hyperg.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } } gsl-doc-2.3/randist/weibull.c0000664000175000017500000000305212616157443014246 0ustar eddedd/* randist/weibull.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/gsl_randist.h0000644000175000017500000002254612752715635015134 0ustar eddedd/* randist/gsl_randist.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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); int gsl_ran_multivariate_gaussian (const gsl_rng * r, const gsl_vector * mu, const gsl_matrix * L, gsl_vector * result); int gsl_ran_multivariate_gaussian_log_pdf (const gsl_vector * x, const gsl_vector * mu, const gsl_matrix * L, double * result, gsl_vector * work); int gsl_ran_multivariate_gaussian_pdf (const gsl_vector * x, const gsl_vector * mu, const gsl_matrix * L, double * result, gsl_vector * work); int gsl_ran_multivariate_gaussian_mean (const gsl_matrix * X, gsl_vector * mu_hat); int gsl_ran_multivariate_gaussian_vcov (const gsl_matrix * X, gsl_matrix * sigma_hat); 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__ */ gsl-doc-2.3/randist/shuffle.c0000664000175000017500000000672312616157443014247 0ustar eddedd/* randist/shuffle.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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) ; } } gsl-doc-2.3/randist/flat.c0000664000175000017500000000261012616157443013530 0ustar eddedd/* randist/flat.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/mvgauss.c0000644000175000017500000001653312752715635014302 0ustar eddedd/* randist/mvgauss.c * * Copyright (C) 2016 Timothée Flutre, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include static int multivar_vcov (const double data[], size_t d, size_t tda, size_t n, double vcov[], size_t tda2); /* Generate a random vector from a multivariate Gaussian distribution using * the Cholesky decomposition of the variance-covariance matrix, following * "Computational Statistics" from Gentle (2009), section 7.4. * * mu mean vector (dimension d) * L matrix resulting from the Cholesky decomposition of * variance-covariance matrix Sigma = L L^T (dimension d x d) * result output vector (dimension d) */ int gsl_ran_multivariate_gaussian (const gsl_rng * r, const gsl_vector * mu, const gsl_matrix * L, gsl_vector * result) { const size_t M = L->size1; const size_t N = L->size2; if (M != N) { GSL_ERROR("requires square matrix", GSL_ENOTSQR); } else if (mu->size != M) { GSL_ERROR("incompatible dimension of mean vector with variance-covariance matrix", GSL_EBADLEN); } else if (result->size != M) { GSL_ERROR("incompatible dimension of result vector", GSL_EBADLEN); } else { size_t i; for (i = 0; i < M; ++i) gsl_vector_set(result, i, gsl_ran_ugaussian(r)); gsl_blas_dtrmv(CblasLower, CblasNoTrans, CblasNonUnit, L, result); gsl_vector_add(result, mu); return GSL_SUCCESS; } } /* Compute the log of the probability density function at a given quantile * vector for a multivariate Gaussian distribution using the Cholesky * decomposition of the variance-covariance matrix. * * x vector of quantiles (dimension d) * mu mean vector (dimension d) * L matrix resulting from the Cholesky decomposition of * variance-covariance matrix Sigma = L L^T (dimension d x d) * result output of the density (dimension 1) * work vector used for intermediate computations (dimension d) */ int gsl_ran_multivariate_gaussian_log_pdf (const gsl_vector * x, const gsl_vector * mu, const gsl_matrix * L, double * result, gsl_vector * work) { const size_t M = L->size1; const size_t N = L->size2; if (M != N) { GSL_ERROR("requires square matrix", GSL_ENOTSQR); } else if (mu->size != M) { GSL_ERROR("incompatible dimension of mean vector with variance-covariance matrix", GSL_EBADLEN); } else if (x->size != M) { GSL_ERROR("incompatible dimension of quantile vector", GSL_EBADLEN); } else if (work->size != M) { GSL_ERROR("incompatible dimension of work vector", GSL_EBADLEN); } else { size_t i; double quadForm; /* (x - mu)' Sigma^{-1} (x - mu) */ double logSqrtDetSigma; /* log [ sqrt(|Sigma|) ] */ /* compute: work = x - mu */ for (i = 0; i < M; ++i) { double xi = gsl_vector_get(x, i); double mui = gsl_vector_get(mu, i); gsl_vector_set(work, i, xi - mui); } /* compute: work = L^{-1} * (x - mu) */ gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasNonUnit, L, work); /* compute: quadForm = (x - mu)' Sigma^{-1} (x - mu) */ gsl_blas_ddot(work, work, &quadForm); /* compute: log [ sqrt(|Sigma|) ] = sum_i log L_{ii} */ logSqrtDetSigma = 0.0; for (i = 0; i < M; ++i) { double Lii = gsl_matrix_get(L, i, i); logSqrtDetSigma += log(Lii); } *result = -0.5*quadForm - logSqrtDetSigma - 0.5*M*log(2.0*M_PI); return GSL_SUCCESS; } } int gsl_ran_multivariate_gaussian_pdf (const gsl_vector * x, const gsl_vector * mu, const gsl_matrix * L, double * result, gsl_vector * work) { double logpdf; int status = gsl_ran_multivariate_gaussian_log_pdf(x, mu, L, &logpdf, work); if (status == GSL_SUCCESS) *result = exp(logpdf); return status; } /* Compute the maximum-likelihood estimate of the mean vector of samples * from a multivariate Gaussian distribution. * * Example from R (GPL): http://www.r-project.org/ * (samples <- matrix(c(4.348817, 2.995049, -3.793431, 4.711934, 1.190864, -1.357363), nrow=3, ncol=2)) * colMeans(samples) # 1.183478 1.515145 */ int gsl_ran_multivariate_gaussian_mean (const gsl_matrix * X, gsl_vector * mu_hat) { const size_t M = X->size1; const size_t N = X->size2; if (N != mu_hat->size) { GSL_ERROR("mu_hat vector has wrong size", GSL_EBADLEN); } else { size_t j; for (j = 0; j < N; ++j) { gsl_vector_const_view c = gsl_matrix_const_column(X, j); double mean = gsl_stats_mean(c.vector.data, c.vector.stride, M); gsl_vector_set(mu_hat, j, mean); } return GSL_SUCCESS; } } /* Compute the maximum-likelihood estimate of the variance-covariance matrix * of samples from a multivariate Gaussian distribution. */ int gsl_ran_multivariate_gaussian_vcov (const gsl_matrix * X, gsl_matrix * sigma_hat) { const size_t M = X->size1; const size_t N = X->size2; if (sigma_hat->size1 != sigma_hat->size2) { GSL_ERROR("sigma_hat must be a square matrix", GSL_ENOTSQR); } else if (N != sigma_hat->size1) { GSL_ERROR("sigma_hat does not match X matrix dimensions", GSL_EBADLEN); } else { return multivar_vcov (X->data, N, X->tda, M, sigma_hat->data, sigma_hat->tda); } } /* Example from R (GPL): http://www.r-project.org/ * (samples <- matrix(c(4.348817, 2.995049, -3.793431, 4.711934, 1.190864, -1.357363), nrow=3, ncol=2)) * cov(samples) # 19.03539 11.91384 \n 11.91384 9.28796 */ static int multivar_vcov (const double data[], size_t d, size_t tda, size_t n, double vcov[], size_t tda2) { size_t j1 = 0, j2 = 0; for (j1 = 0; j1 < d; ++j1) { vcov[j1 * tda2 + j1] = gsl_stats_variance(&(data[j1]), tda, n); for (j2 = j1 + 1; j2 < d; ++j2) { vcov[j1 * tda2 + j2] = gsl_stats_covariance(&(data[j1]), tda, &(data[j2]), tda, n); vcov[j2 * tda2 + j1] = vcov[j1 * tda2 + j2]; } } return GSL_SUCCESS; } gsl-doc-2.3/randist/sphere.c0000664000175000017500000000663712616157443014105 0ustar eddedd/* randist/sphere.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include 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; } } gsl-doc-2.3/randist/gausszig.c0000664000175000017500000002272312616157443014445 0ustar eddedd/* 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include #include #include #include /* 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; const unsigned long int range = r->type->max - r->type->min; const unsigned long int offset = r->type->min; while (1) { if (range >= 0xFFFFFFFF) { unsigned long int k = gsl_rng_get(r) - offset; i = (k & 0xFF); j = (k >> 8) & 0xFFFFFF; } else if (range >= 0x00FFFFFF) { unsigned long int k1 = gsl_rng_get(r) - offset; unsigned long int k2 = gsl_rng_get(r) - offset; i = (k1 & 0xFF); j = (k2 & 0x00FFFFFF); } else { 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; } gsl-doc-2.3/randist/Makefile.am0000644000175000017500000000206512752715635014500 0ustar eddeddnoinst_LTLIBRARIES = libgslrandist.la pkginclude_HEADERS= gsl_randist.h AM_CPPFLAGS = -I$(top_srcdir) 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 mvgauss.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 ../cdf/libgslcdf.la ../specfunc/libgslspecfunc.la ../integration/libgslintegration.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../statistics/libgslstatistics.la ../sort/libgslsort.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la gsl-doc-2.3/randist/rayleigh.c0000664000175000017500000000377612616157443014424 0ustar eddedd/* randist/rayleigh.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/bernoulli.c0000664000175000017500000000255412616157443014604 0ustar eddedd/* randist/bernoulli.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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 ; } } gsl-doc-2.3/randist/cauchy.c0000664000175000017500000000261612616157443014064 0ustar eddedd/* randist/cauchy.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } gsl-doc-2.3/randist/TODO0000664000175000017500000000600412616157443013127 0ustar eddedd# -*- org -*- #+CATEGORY: randist * ACM Computing Surveys (CSUR) Volume 39 , Issue 4 (2007) Gaussian random number generators David B. Thomas, Wayne Luk, Philip H.W. Leong, John D. Villasenor Article No. 11 * 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 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. gsl-doc-2.3/randist/gauss.c0000664000175000017500000001063712616157443013734 0ustar eddedd/* randist/gauss.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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); } gsl-doc-2.3/randist/exponential.c0000664000175000017500000000255012616157443015133 0ustar eddedd/* randist/exponential.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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 (r); return -mu * log1p (-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; } } gsl-doc-2.3/randist/dirichlet.c0000664000175000017500000000775512616157443014570 0ustar eddedd/* randist/dirichlet.c * * Copyright (C) 2007 Brian Gough * Copyright (C) 2002 Gavin E. Crooks * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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 (2002) */ static void ran_dirichlet_small (const gsl_rng * r, const size_t K, const double alpha[], double theta[]); 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]; } if (norm < GSL_SQRT_DBL_MIN) /* Handle underflow */ { ran_dirichlet_small (r, K, alpha, theta); return; } for (i = 0; i < K; i++) { theta[i] /= norm; } } /* When the values of alpha[] are small, scale the variates to avoid underflow so that the result is not 0/0. Note that the Dirichlet distribution is defined by a ratio of gamma functions so we can take out an arbitrary factor to keep the values in the range of double precision. */ static void ran_dirichlet_small (const gsl_rng * r, const size_t K, const double alpha[], double theta[]) { size_t i; double norm = 0.0, umax = 0; for (i = 0; i < K; i++) { double u = log(gsl_rng_uniform_pos (r)) / alpha[i]; theta[i] = u; if (u > umax || i == 0) { umax = u; } } for (i = 0; i < K; i++) { theta[i] = exp(theta[i] - umax); } for (i = 0; i < K; i++) { theta[i] = theta[i] * gsl_ran_gamma (r, alpha[i] + 1.0, 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; } gsl-doc-2.3/randist/logistic.c0000664000175000017500000000257412616157443014430 0ustar eddedd/* randist/logistic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } gsl-doc-2.3/randist/erlang.c0000664000175000017500000000274712616157443014065 0ustar eddedd/* randist/erlang.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } } gsl-doc-2.3/randist/bigauss.c0000664000175000017500000000417712616157443014251 0ustar eddedd/* randist/bigauss.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } gsl-doc-2.3/randist/laplace.c0000664000175000017500000000270712616157443014212 0ustar eddedd/* randist/laplace.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } gsl-doc-2.3/randist/exppow.c0000664000175000017500000000637212616157443014135 0ustar eddedd/* randist/exppow.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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; } gsl-doc-2.3/randist/levy.c0000664000175000017500000000723712616157443013573 0ustar eddedd/* randist/levy.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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 00. 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; } } gsl-doc-2.3/randist/binomial_tpe.c0000664000175000017500000003120212616157443015243 0ustar eddedd/* randist/binomial_tpe.c * * Copyright (C) 1996, 2003, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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_uint (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= 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| 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; } gsl-doc-2.3/randist/discrete.c0000664000175000017500000003217412616157443014414 0ustar eddedd/* randist/discrete.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., * 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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 #include /* used for NULL, also fprintf(stderr,...) */ #include /* used for malloc's */ #include #include #include #include #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 int push_stack(gsl_stack_t *s, size_t v) { if ((s->i) >= (s->N)) { return -1; /* stack overflow (shouldn't happen) */ } (s->v)[s->i] = v; s->i += 1; return 0; } static size_t pop_stack(gsl_stack_t *s) { if ((s->i) == 0) { GSL_ERROR ("internal error - stack exhausted", GSL_ESANITY); } 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; kK = 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; kA[k] to indicate small or large */ size_t * const which = g->A; for (k=0; k 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; kF)[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; kF)[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) { RETURN_IF_NULL (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; iF)[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; } gsl-doc-2.3/randist/Makefile.in0000644000175000017500000011351613022372406014477 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_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 mvgauss.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_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslrandist.la ../rng/libgslrng.la \ ../cdf/libgslcdf.la ../specfunc/libgslspecfunc.la \ ../integration/libgslintegration.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la ../statistics/libgslstatistics.la \ ../sort/libgslsort.la ../linalg/libgsllinalg.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrandist.la pkginclude_HEADERS = gsl_randist.h AM_CPPFLAGS = -I$(top_srcdir) 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 mvgauss.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 ../cdf/libgslcdf.la ../specfunc/libgslspecfunc.la ../integration/libgslintegration.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../statistics/libgslstatistics.la ../sort/libgslsort.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu randist/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrandist.la: $(libgslrandist_la_OBJECTS) $(libgslrandist_la_DEPENDENCIES) $(EXTRA_libgslrandist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrandist_la_OBJECTS) $(libgslrandist_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bernoulli.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial_tpe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirichlet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erlang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausstail.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausszig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/landau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logarithmic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvgauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shuffle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/randist/pareto.c0000664000175000017500000000254712616157443014105 0ustar eddedd/* randist/pareto.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/ChangeLog0000664000175000017500000004105212616157443014213 0ustar eddedd2012-09-10 Rhys Ulerich * nbinomial.c Add include for gsl_sys.h to fix MSVC. Thanks to Brian Gladman for the suggestion. 2011-06-05 Brian Gough * nbinomial.c (gsl_ran_negative_binomial_pdf): avoid overflow in exp 2010-12-14 Brian Gough * gamma.c (gamma_frac): avoid potential division by zero, handle a=0 as a special case 2010-11-20 Brian Gough * chisq.c (gsl_ran_chisq_pdf): handle x=0 as special case (x=0, nu=2 is also special) 2010-10-12 Brian Gough * test.c (test_binomial_max): added a test case for n larger than maxint 2010-07-21 Brian Gough * beta.c (gsl_ran_beta_pdf): avoid overflow for x==0 || x==1 and a>1,b>1 2010-03-01 Brian Gough * test.c (testPDF): extend the test run if a sample fails on the first pass. 2010-02-24 Brian Gough * fdist.c (gsl_ran_fdist_pdf): compute log of pdf to avoid overflow/underflow. 2009-07-10 Brian Gough * exponential.c (gsl_ran_exponential): use log(1-u) to include 0 in the range of possible outputs 2009-07-09 Brian Gough * discrete.c (gsl_ran_discrete_free): handle NULL argument in free 2009-05-16 Brian Gough * discrete.c (push_stack): replace abort() with an error return value (pop_stack): replace abort() with GSL_ERROR (gsl_ran_discrete_preproc): use g->A as a temporary array to store the results of the test E[k] * test.c (test_gamma_vlarge): added test for a >= UINT_MAX. * gamma.c (gsl_ran_gamma_knuth): handle the case a >= UINT_MAX. 2008-07-03 Brian Gough * Makefile.am (INCLUDES): use top_srcdir instead of top_builddir 2008-02-09 Brian Gough * gausszig.c (gsl_ran_gaussian_ziggurat): handle different generator ranges explicitly 2007-09-20 Brian Gough * multinomial.c (gsl_ran_multinomial_lnpdf): Handle case where n[k]==0 and p[k]==0 2007-08-20 Brian Gough * test.c (integrate): perform the integration of the pdf with the gsl_integration functions for accuracy (needed for dirichlet distribution) * dirichlet.c (ran_dirichlet_small): handle underflow for small alpha[] values 2007-02-20 Brian Gough * 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 * test.c (testPDF): reduce the test sensitivity to avoid failures caused by weaknesses in the underlying rng 2007-01-26 Brian Gough * 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 * discrete.c (gsl_ran_discrete_preproc): use GSL_ENOMEM instead of ENOMEM 2006-04-18 Brian Gough * gausszig.c (gsl_ran_gaussian_ziggurat): fix prototype const 2006-03-26 Brian Gough * multinomial.c (gsl_ran_multinomial_lnpdf): use gsl_sf_lnfact instead of gsl_sf_lngamma for an integer argument 2006-03-17 Brian Gough * binomial_tpe.c (gsl_ran_binomial): cast return values to unsigned 2006-02-27 Brian Gough * beta.c (gsl_ran_beta_pdf): work with logs avoid underflow/overflow 2006-02-19 Brian Gough * 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 * gausszig.c: added ziggurat gaussian (Jochen Voss) 2006-01-20 Brian Gough * 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 * test.c (main): free allocated memory before exit 2005-08-22 Brian Gough * 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 * landau.c (gsl_ran_landau): fix potential array bounds overflow by extending array. 2004-04-22 Brian Gough * sphere.c (gsl_ran_dir_3d): removed unnecessary check for s==0.0 2003-07-25 Brian Gough * dirichlet.c: include gsl_sf_gamma.h instead of gsl_sf.h 2003-07-24 Brian Gough * 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 * 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 * discrete.c (gsl_ran_discrete_preproc): fixed bug reported by ahoward 2003-01-25 Brian Gough * chisq.c: corrected comments 2002-12-10 Brian Gough * 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 * dirichlet.c: added dirichlet distribution Sat Aug 18 22:21:07 2001 Brian Gough * gsl-randist.c: moved to top-level directory Wed Jul 18 12:57:55 2001 Brian Gough * landau.c: added Landau distribution from Dave Morrison Sat Jun 23 12:30:38 2001 Brian Gough * gausstail.c (gsl_ran_gaussian_tail): allow negative values for the tail cutoff parameter. Mon May 21 12:17:07 2001 Brian Gough * 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 * bernoulli.c (gsl_ran_bernoulli_pdf): removed unnecessary reference to gsl_sf.h Mon Apr 23 10:25:44 2001 Brian Gough * changed calls to old specfunc _impl functions to use new error handling conventions Tue Apr 17 19:57:59 2001 Brian Gough * 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 * 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 * 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 * pareto.c (gsl_ran_pareto): made arguments and documentation consistent Wed May 10 14:55:43 2000 Brian Gough * gsl-randist.c (main): fixed bug for lognormal (it was calling exppow) Tadhg O'Meara * 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 * 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 * logistic.c (gsl_ran_logistic_pdf): prevent overflow in computation of pdf for x < 0 Thu Oct 7 12:55:40 1999 Brian Gough * discrete.c (gsl_ran_discrete_free): removed unreachable code "return 0"; Fri Aug 6 16:02:08 1999 Brian Gough * 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 * discrete.c: converted to GSL_ERROR macros for error handling Tue Jul 27 14:14:38 1999 Brian Gough * 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 * discrete.c: (thanks to Frederick W. Wheeler ) changed the type stack_t to gsl_stack_t to avoid a conflict on HPUX. Sun Feb 28 20:41:18 1999 Brian Gough * 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 * 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 * 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 * 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 * 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 * added #include to all top-level source files 1998-11-06 * test.c: ensured that M_PI is available by #include Wed Sep 16 14:44:08 1998 Brian Gough * rayleigh.c: added rayleigh tail distribution Sat Sep 12 13:03:19 1998 Brian Gough * rayleigh.c: added rayleigh distribution Mon Aug 31 James Theiler * Makefile.am: added ../utils/libutils.a to some LDADD's Mon Aug 17 14:31:55 1998 Brian Gough * 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 * 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 * 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 * 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 * gsl-dist.c: renamed gsl-dist.c to gsl-randist.c, for consistency Tue Aug 4 12:29:17 1998 Brian Gough * 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 * 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 * gsl_randist.h: renamed gsl_ran_two_sided_exponential to gsl_ran_laplace 1998-07-26 Mark Galassi * 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 * 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 * 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 * 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 * converted everything to work with rng style generators Sun Apr 19 19:06:59 1998 Brian Gough * 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 * 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 * Makefile.am (lib_LIBRARIES): now it creates libgslrandist.a so that we have gaussian and poisson distributions. gsl-doc-2.3/randist/multinomial.c0000664000175000017500000000572612616157443015147 0ustar eddedd/* randist/multinomial.c * * Copyright (C) 2002 Gavin E. Crooks * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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++) { /* Handle case where n[k]==0 and p[k]==0 */ if (n[k] > 0) { log_pdf += log (p[k] / norm) * n[k] - gsl_sf_lnfact (n[k]); } } return log_pdf; } gsl-doc-2.3/randist/pascal.c0000664000175000017500000000322512616157443014050 0ustar eddedd/* randist/pascal.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } gsl-doc-2.3/randist/poisson.c0000664000175000017500000000404112616157443014274 0ustar eddedd/* randist/poisson.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } gsl-doc-2.3/randist/logarithmic.c0000664000175000017500000000351712616157443015113 0ustar eddedd/* randist/logarithmic.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/chisq.c0000664000175000017500000000311012616157443013705 0ustar eddedd/* randist/chisq.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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 { if(nu == 2.0) { return exp(-x/2.0) / 2.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; } } } gsl-doc-2.3/randist/lognormal.c0000664000175000017500000000361312616157443014600 0ustar eddedd/* randist/lognormal.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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; } } gsl-doc-2.3/randist/gausstail.c0000664000175000017500000000514312616157443014602 0ustar eddedd/* randist/gausstail.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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) ; } gsl-doc-2.3/randist/beta.c0000644000175000017500000000522512766601004013511 0ustar eddedd/* randist/beta.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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) { if ( (a <= 1.0) && (b <= 1.0) ) { double U, V, X, Y; while (1) { U = gsl_rng_uniform_pos(r); V = gsl_rng_uniform_pos(r); X = pow(U, 1.0/a); Y = pow(V, 1.0/b); if ((X + Y ) <= 1.0) { if (X + Y > 0) { return X/ (X + Y); } else { double logX = log(U)/a; double logY = log(V)/b; double logM = logX > logY ? logX: logY; logX -= logM; logY -= logM; return exp(logX - log(exp(logX) + exp(logY))); } } } } else { 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) { if (a > 1.0 && b > 1.0) { p = 0.0; } else { 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; } } gsl-doc-2.3/randist/fdist.c0000664000175000017500000000362112616157443013716 0ustar eddedd/* randist/fdist.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include /* 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 + (nu1 / 2 - 1) * log (x) - ((nu1 + nu2) / 2) * log (nu2 + nu1 * x)); return p; } } gsl-doc-2.3/randist/binomial.c0000664000175000017500000000441112616157443014375 0ustar eddedd/* randist/binomial.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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; } } gsl-doc-2.3/randist/landau.c0000664000175000017500000005112012616157443014046 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include 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; } gsl-doc-2.3/randist/nbinomial.c0000664000175000017500000000325512616157443014560 0ustar eddedd/* randist/nbinomial.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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 + n * log(p) + k * log1p(-p)); return P; } gsl-doc-2.3/randist/gamma.c0000664000175000017500000001223512616157443013670 0ustar eddedd/* randist/gamma.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include 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 >= UINT_MAX) { return b * (gamma_large (r, floor (a)) + gamma_frac (r, a - floor (a))); } else 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; if (a == 0) { return 0; } 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; } } gsl-doc-2.3/randist/gumbel.c0000664000175000017500000000346012616157443014061 0ustar eddedd/* randist/gumbel.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/geometric.c0000664000175000017500000000313012616157443014556 0ustar eddedd/* randist/geometric.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include /* 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; } } gsl-doc-2.3/randist/test.c0000644000175000017500000013670512766600613013572 0ustar eddedd/* randist/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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_binomial_max (void); double test_binomial_max_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_chisqnu2 (void); double test_chisqnu2_pdf (double x); double test_dirichlet (void); double test_dirichlet_pdf (double x); double test_dirichlet_small (void); double test_dirichlet_small_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_fdist_large (void); double test_fdist_large_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_vlarge (void); double test_gamma_vlarge_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_gamma_knuth_vlarge (void); double test_gamma_knuth_vlarge_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); void test_multivariate_gaussian_log_pdf (void); void test_multivariate_gaussian_pdf (void); void test_multivariate_gaussian (void); 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 (chisqnu2)); testPDF (FUNC2 (dirichlet)); testPDF (FUNC2 (dirichlet_small)); 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 (fdist_large)); testPDF (FUNC2 (flat)); testPDF (FUNC2 (gamma)); testPDF (FUNC2 (gamma1)); testPDF (FUNC2 (gamma_int)); testPDF (FUNC2 (gamma_large)); testPDF (FUNC2 (gamma_vlarge)); testPDF (FUNC2 (gamma_knuth_vlarge)); 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)); test_multivariate_gaussian_log_pdf (); test_multivariate_gaussian_pdf (); test_multivariate_gaussian (); 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 (binomial_max)); 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 = (expected > 0) ? fabs (count - expected) / sqrt (expected) : fabs(count - expected); status = (sigma > 3); gsl_test (status, "%s [%g,%g] (%g observed vs %g expected)", name, a, b, count / N, p); } #define BINS 100 typedef double pdf_func(double); /* Keep track of invalid values during integration */ static int pdf_errors = 0; static double pdf_errval = 0.0; double wrapper_function (double x, void *params) { pdf_func * pdf = (pdf_func *)params; double P = pdf(x); if (!gsl_finite(P)) { pdf_errors++; pdf_errval = P; P = 0; /* skip invalid value now, but return pdf_errval at the end */ } return P; } double integrate (pdf_func * pdf, double a, double b) { double result, abserr; size_t n = 1000; gsl_function f; gsl_integration_workspace * w = gsl_integration_workspace_alloc (n); f.function = &wrapper_function; f.params = (void *)pdf; pdf_errors = 0; gsl_integration_qags (&f, a, b, 1e-16, 1e-4, n, w, &result, &abserr); gsl_integration_workspace_free (w); if (pdf_errors) return pdf_errval; return result; } void testPDF (double (*f) (void), double (*pdf) (double), const char *name) { double count[BINS], edge[BINS], p[BINS]; double a = -5.0, b = +5.0; double dx = (b - a) / BINS; double bin; double total = 0, mean; int i, j, status = 0, status_i = 0, attempts = 0; long int n0 = 0, n = N; for (i = 0; i < BINS; i++) { /* Compute the integral of p(x) from x to x+dx */ double x = a + i * dx; if (fabs (x) < 1e-10) /* hit the origin exactly */ x = 0.0; p[i] = integrate (pdf, x, x+dx); } for (i = 0; i < BINS; i++) { count[i] = 0; edge[i] = 0; } trial: attempts++; for (i = n0; i < n; i++) { double r = f (); total += r; if (r < b && r > a) { double u = (r - a) / dx; double f = modf(u, &bin); j = (int)bin; if (f == 0) edge[j]++; else count[j]++; } } /* Sort out where the hits on the edges should go */ for (i = 0; i < BINS; i++) { /* If the bin above is empty, its lower edge hits belong in the lower bin */ if (i + 1 < BINS && count[i+1] == 0) { count[i] += edge[i+1]; edge[i+1] = 0; } count[i] += edge[i]; edge[i] = 0; } mean = (total / n); status = !gsl_finite(mean); if (status) { gsl_test (status, "%s, finite mean, observed %g", name, mean); return; } for (i = 0; i < BINS; i++) { double x = a + i * dx; double d = fabs (count[i] - n * p[i]); if (!gsl_finite(p[i])) { status_i = 1; } else if (p[i] != 0) { double s = d / sqrt (n * p[i]); status_i = (s > 5) && (d > 2); } else { status_i = (count[i] != 0); } /* Extend the sample if there is an outlier on the first attempt to avoid spurious failures when running large numbers of tests. */ if (status_i && attempts < 50) { n0 = n; n = 2.0*n; goto trial; } 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_binomial_max (void) { return gsl_ran_binomial (r_global, 1e-8, 1<<31); } double test_binomial_max_pdf (unsigned int n) { return gsl_ran_binomial_pdf (n, 1e-8, 1<<31); } 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_chisqnu2 (void) { return gsl_ran_chisq (r_global, 2.0); } double test_chisqnu2_pdf (double x) { return gsl_ran_chisq_pdf (x, 2.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); } double test_dirichlet_small (void) { size_t K = 2; double alpha[2] = { 2.5e-3, 5.0e-3}; double theta[2] = { 0.0, 0.0 }; gsl_ran_dirichlet (r_global, K, alpha, theta); return theta[0]; } double test_dirichlet_small_pdf (double x) { size_t K = 2; double alpha[2] = { 2.5e-3, 5.0e-3 }; 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); } /* Test case for bug #28500: overflow in gsl_ran_fdist_pdf */ double test_fdist_large (void) { return gsl_ran_fdist (r_global, 8.0, 249.0); } double test_fdist_large_pdf (double x) { return gsl_ran_fdist_pdf (x, 8.0, 249.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_vlarge (void) { /* Scale the distribution to get it into the range [-5,5] */ double c = 2.71828181565; double b = 6.32899304917e-10; double d = 1e4; return (gsl_ran_gamma (r_global, 4294967296.0, b) - c) * d; } double test_gamma_vlarge_pdf (double x) { double c = 2.71828181565; double b = 6.32899304917e-10; double d = 1e4; return gsl_ran_gamma_pdf ((x / d) + c, 4294967296.0, b) / d; } 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_gamma_knuth_vlarge (void) { /* Scale the distribution to get it into the range [-5,5] */ double c = 2.71828181565; double b = 6.32899304917e-10; double d = 1e4; return (gsl_ran_gamma_knuth (r_global, 4294967296.0, b) - c) * d; } double test_gamma_knuth_vlarge_pdf (double x) { double c = 2.71828181565; double b = 6.32899304917e-10; double d = 1e4; return gsl_ran_gamma_pdf ((x / d) + c, 4294967296.0, b) / d; } 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); } /* Examples from R (GPL): http://www.r-project.org/ * library(mvtnorm); packageVersion("mvtnorm") # 1.0.5 * mu <- c(1, 2) * Sigma <- matrix(c(4,2, 2,3), ncol=2) * x <- c(0, 0) * sprintf("%.15f", dmvnorm(x=x, mean=mu, sigma=Sigma, log=TRUE)) # -3.565097837249263 */ void test_multivariate_gaussian_log_pdf (void) { size_t d = 2; const double exp_res = -3.565097837249263; double obs_res; gsl_vector * mu = gsl_vector_calloc(d); gsl_matrix * Sigma = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_vector * x = gsl_vector_calloc(d); gsl_vector * work = gsl_vector_calloc(d); gsl_vector_set(mu, 0, 1); gsl_vector_set(mu, 1, 2); gsl_matrix_set(Sigma, 0, 0, 4); gsl_matrix_set(Sigma, 1, 1, 3); gsl_matrix_set(Sigma, 0, 1, 2); gsl_matrix_set(Sigma, 1, 0, 2); gsl_matrix_memcpy(L, Sigma); gsl_linalg_cholesky_decomp1(L); gsl_ran_multivariate_gaussian_log_pdf(x, mu, L, &obs_res, work); gsl_test_rel(obs_res, exp_res, 1.0e-10, "gsl_ran_multivariate_gaussian_log_pdf"); gsl_vector_free(mu); gsl_matrix_free(Sigma); gsl_matrix_free(L); gsl_vector_free(x); gsl_vector_free(work); } /* Examples from R (GPL): http://www.r-project.org/ * library(mvtnorm); packageVersion("mvtnorm") # 1.0.5 * mu <- c(1, 2) * Sigma <- matrix(c(4,2, 2,3), ncol=2) * x <- c(0, 0) * sprintf("%.15f", dmvnorm(x=x, mean=mu, sigma=Sigma, log=FALSE)) # 0.028294217120391 */ void test_multivariate_gaussian_pdf (void) { size_t d = 2; const double exp_res = 0.028294217120391; double obs_res = 0; gsl_vector * mu = gsl_vector_calloc(d); gsl_matrix * Sigma = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_vector * x = gsl_vector_calloc(d); gsl_vector * work = gsl_vector_calloc(d); gsl_vector_set(mu, 0, 1); gsl_vector_set(mu, 1, 2); gsl_matrix_set(Sigma, 0, 0, 4); gsl_matrix_set(Sigma, 1, 1, 3); gsl_matrix_set(Sigma, 0, 1, 2); gsl_matrix_set(Sigma, 1, 0, 2); gsl_matrix_memcpy(L, Sigma); gsl_linalg_cholesky_decomp1(L); gsl_ran_multivariate_gaussian_pdf(x, mu, L, &obs_res, work); gsl_test_rel(obs_res, exp_res, 1.0e-10, "gsl_ran_multivariate_gaussian_pdf"); gsl_vector_free(mu); gsl_matrix_free(Sigma); gsl_matrix_free(L); gsl_vector_free(x); gsl_vector_free(work); } /* Draw N random vectors according to a given MVN(mu,Sigma). Then, check that * one can't reject the null hypothesis that the sample mean is equal to * the true mean, using Hotelling's test statistic at 95% confidence level. * Details in "Applied Multivariate Statistical Analysis" by Johnson & Wichern * (2001), section 5, page 212. */ void test_multivariate_gaussian (void) { size_t d = 2, i = 0; int status = 0; double T2 = 0, threshold = 0, alpha = 0.05, pvalue = 0; gsl_vector * mu = gsl_vector_calloc(d); gsl_matrix * Sigma = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_vector * sample = gsl_vector_calloc(d); gsl_matrix * samples = gsl_matrix_calloc(N, d); gsl_vector * mu_hat = gsl_vector_calloc(d); gsl_matrix * Sigma_hat = gsl_matrix_calloc(d, d); gsl_vector * mu_hat_ctr = gsl_vector_calloc(d); gsl_matrix * Sigma_hat_inv = gsl_matrix_calloc(d, d); gsl_vector * tmp = gsl_vector_calloc(d); /* set the true values of parameters mu and Sigma */ gsl_vector_set(mu, 0, 1); gsl_vector_set(mu, 1, 2); gsl_matrix_set(Sigma, 0, 0, 4); gsl_matrix_set(Sigma, 1, 1, 3); gsl_matrix_set(Sigma, 0, 1, 2); gsl_matrix_set(Sigma, 1, 0, 2); /* draw N random vectors */ gsl_matrix_memcpy(L, Sigma); gsl_linalg_cholesky_decomp1(L); for (i = 0; i < N; ++i) { gsl_ran_multivariate_gaussian(r_global, mu, L, sample); gsl_matrix_set_row(samples, i, sample); } /* compute the maximum-likelihood estimates */ gsl_ran_multivariate_gaussian_mean (samples, mu_hat); gsl_ran_multivariate_gaussian_vcov (samples, Sigma_hat); /* compute Hotelling's test statistic: T^2 = n (hat{mu} - mu)' hat{Sigma}^-1 (hat{mu} - mu) */ gsl_vector_memcpy(mu_hat_ctr, mu_hat); gsl_vector_sub(mu_hat_ctr, mu); gsl_matrix_memcpy(Sigma_hat_inv, Sigma_hat); gsl_linalg_cholesky_decomp1(Sigma_hat_inv); gsl_linalg_cholesky_invert(Sigma_hat_inv); gsl_blas_dgemv(CblasNoTrans, 1, Sigma_hat_inv, mu_hat_ctr, 0, tmp); gsl_blas_ddot(mu_hat_ctr, tmp, &T2); T2 *= N; /* test if the null hypothesis (hat{mu} = mu) can be rejected at the alpha level*/ threshold = (N-1) * d / (double)(N-d) * gsl_cdf_fdist_Pinv(1-alpha, d, N-d); status = (T2 > threshold); gsl_test(status, "test gsl_ran_multivariate_gaussian: T2 %f < %f", T2, threshold); pvalue = gsl_cdf_fdist_Q(T2, d, N-d); status = (pvalue < alpha); gsl_test(status, "test gsl_ran_multivariate_gaussian: p value %f > %f", pvalue, alpha); gsl_vector_free(mu); gsl_matrix_free(Sigma); gsl_matrix_free(L); gsl_vector_free(sample); gsl_matrix_free(samples); gsl_vector_free(mu_hat); gsl_matrix_free(Sigma_hat); gsl_vector_free(mu_hat_ctr); gsl_matrix_free(Sigma_hat_inv); gsl_vector_free(tmp); } 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); } gsl-doc-2.3/randist/tdist.c0000664000175000017500000000420012616157443013726 0ustar eddedd/* randist/tdist.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include /* 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; } gsl-doc-2.3/gsl/0000755000175000017500000000000013022553152011543 5ustar eddeddgsl-doc-2.3/gsl/Makefile.am0000664000175000017500000000047712616157443013624 0ustar eddedd 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-local: remove-links distclean-local: remove-links gsl-doc-2.3/gsl/Makefile.in0000644000175000017500000003201113022372405013605 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs 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 = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gsl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: 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: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distclean-local distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-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-local: remove-links distclean-local: remove-links # 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: gsl-doc-2.3/ode-initval2/0000755000175000017500000000000013022553154013255 5ustar eddeddgsl-doc-2.3/ode-initval2/bsimp.c0000664000175000017500000003316012616157443014551 0ustar eddedd/* ode-initval2/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" #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_odeiv2_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_odeiv2_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_odeiv2_step_type bsimp_type = { "bsimp", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &bsimp_alloc, &bsimp_apply, &stepper_set_driver_null, &bsimp_reset, &bsimp_order, &bsimp_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_bsimp = &bsimp_type; gsl-doc-2.3/ode-initval2/rkf45.c0000664000175000017500000002107412616157443014373 0ustar eddedd/* ode-initval2/rkf45.c * * Copyright (C) 2001, 2004, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" /* 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_odeiv2_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_odeiv2_step_type rkf45_type = { "rkf45", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &rkf45_alloc, &rkf45_apply, &stepper_set_driver_null, &rkf45_reset, &rkf45_order, &rkf45_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rkf45 = &rkf45_type; gsl-doc-2.3/ode-initval2/msadams.c0000664000175000017500000007635212616157443015076 0ustar eddedd/* ode-initval2/msadams.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* A variable-coefficient linear multistep Adams method in Nordsieck form. This stepper uses explicit Adams-Bashforth (predictor) and implicit Adams-Moulton (corrector) methods in P(EC)^m functional iteration mode. Method order varies dynamically between 1 and 12. References: Byrne, G. D., and Hindmarsh, A. C., A Polyalgorithm for the Numerical Solution of Ordinary Differential Equations, ACM Trans. Math. Software, 1 (1975), pp. 71-96. Brown, P. N., Byrne, G. D., and Hindmarsh, A. C., VODE: A Variable-coefficient ODE Solver, SIAM J. Sci. Stat. Comput. 10, (1989), pp. 1038-1051. Hindmarsh, A. C., Brown, P. N., Grant, K. E., Lee, S. L., Serban, R., Shumaker, D. E., and Woodward, C. S., SUNDIALS: Suite of Nonlinear and Differential/Algebraic Equation Solvers, ACM Trans. Math. Software 31 (2005), pp. 363-396. Note: The algorithms have been adapted for GSL ode-initval2 framework. */ #include #include #include #include #include #include #include #include "odeiv_util.h" /* Maximum order of Adams methods */ #define MSADAMS_MAX_ORD 12 typedef struct { /* Nordsieck history matrix. Includes concatenated Nordsieck vectors [y_n, h*y_n', (h^2/2!)*y_n'', ..., (h^ord/ord!)*d^(ord)(y_n)]. Nordsieck vector number i is located at z[i*dim] (i=0..ord). */ double *z; double *zbackup; /* backup of Nordsieck matrix */ double *ytmp; /* work area */ double *ytmp2; /* work area */ double *pc; /* product term coefficients */ double *l; /* polynomial coefficients */ double *hprev; /* previous step sizes */ double *hprevbackup; /* backup of hprev */ double *errlev; /* desired error level of y */ gsl_vector *abscor; /* absolute y values for correction */ gsl_vector *relcor; /* relative y values for correction */ gsl_vector *svec; /* saved abscor & work area */ gsl_vector *tempvec; /* work area */ const gsl_odeiv2_driver *driver; /* pointer to gsl_odeiv2_driver object */ long int ni; /* stepper call counter */ size_t ord; /* current order of method */ size_t ordprev; /* order of previous call */ size_t ordprevbackup; /* backup of ordprev */ double tprev; /* t point of previous call */ size_t ordwait; /* counter for order change */ size_t ordwaitbackup; /* backup of ordwait */ size_t failord; /* order of convergence failure */ double failt; /* t point of convergence failure */ double ordm1coeff; /* saved order-1 coefficiet */ double ordp1coeffprev; /* saved order+1 coefficient */ size_t failcount; /* counter for rejected steps */ } msadams_state_t; /* Introduce msadams_reset for use in msadams_alloc and _apply */ static int msadams_reset (void *, size_t); static void * msadams_alloc (size_t dim) { msadams_state_t *state = (msadams_state_t *) malloc (sizeof (msadams_state_t)); if (state == 0) { GSL_ERROR_NULL ("failed to allocate space for msadams_state", GSL_ENOMEM); } state->z = (double *) malloc ((MSADAMS_MAX_ORD + 1) * dim * sizeof (double)); if (state->z == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for z", GSL_ENOMEM); } state->zbackup = (double *) malloc ((MSADAMS_MAX_ORD + 1) * dim * sizeof (double)); if (state->zbackup == 0) { free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for zbackup", GSL_ENOMEM); } state->ytmp = (double *) malloc (dim * sizeof (double)); if (state->ytmp == 0) { free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM); } state->ytmp2 = (double *) malloc (dim * sizeof (double)); if (state->ytmp2 == 0) { free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp2", GSL_ENOMEM); } state->pc = (double *) malloc ((MSADAMS_MAX_ORD + 1) * sizeof (double)); if (state->pc == 0) { free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for pc", GSL_ENOMEM); } state->l = (double *) malloc ((MSADAMS_MAX_ORD + 1) * sizeof (double)); if (state->l == 0) { free (state->pc); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for l", GSL_ENOMEM); } state->hprev = (double *) malloc (MSADAMS_MAX_ORD * sizeof (double)); if (state->hprev == 0) { free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for hprev", GSL_ENOMEM); } state->hprevbackup = (double *) malloc (MSADAMS_MAX_ORD * sizeof (double)); if (state->hprevbackup == 0) { free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for hprevbackup", GSL_ENOMEM); } state->errlev = (double *) malloc (dim * sizeof (double)); if (state->errlev == 0) { free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for errlev", GSL_ENOMEM); } state->abscor = gsl_vector_alloc (dim); if (state->abscor == 0) { free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for abscor", GSL_ENOMEM); } state->relcor = gsl_vector_alloc (dim); if (state->relcor == 0) { gsl_vector_free (state->abscor); free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for relcor", GSL_ENOMEM); } state->svec = gsl_vector_alloc (dim); if (state->svec == 0) { gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for svec", GSL_ENOMEM); } state->tempvec = gsl_vector_alloc (dim); if (state->tempvec == 0) { gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for tempvec", GSL_ENOMEM); } msadams_reset ((void *) state, dim); state->driver = NULL; return state; } static int msadams_failurehandler (void *vstate, const size_t dim, const double t) { /* Internal failure handler routine for msadams. Adjusted strategy for GSL: Decrease order if this is the second time a failure has occurred at this order and point. */ msadams_state_t *state = (msadams_state_t *) vstate; const size_t ord = state->ord; if (ord > 1 && (ord - state->ordprev == 0) && ord == state->failord && t == state->failt) { state->ord--; } /* Save information about failure */ state->failord = ord; state->failt = t; state->ni++; /* Force reinitialization if failure took place at lowest order */ if (ord == 1) { msadams_reset (vstate, dim); } return GSL_SUCCESS; } static int msadams_calccoeffs (const size_t ord, const size_t ordwait, const double h, const double hprev[], double pc[], double l[], double *errcoeff, double *ordm1coeff, double *ordp1coeff, double *ordp2coeff) { /* Calculates coefficients (l) of polynomial Lambda, error and auxiliary order change evaluation coefficients. */ if (ord == 1) { l[0] = 1.0; l[1] = 1.0; *errcoeff = 0.5; *ordp1coeff = 1.0; *ordp2coeff = 12.0; } else { size_t i, j; double hsum = h; double st1 = 0.0; /* sum term coefficients */ double st2 = 0.0; /* Calculate coefficients (pc) of product terms */ DBL_ZERO_MEMSET (pc, MSADAMS_MAX_ORD + 1); pc[0] = 1.0; for (i = 1; i < ord; i++) { /* Calculate auxiliary coefficient used in evaluation of change of order */ if (i == ord - 1 && ordwait == 1) { int s = 1; *ordm1coeff = 0.0; for (j = 0; j < ord - 1; j++) { *ordm1coeff += s * pc[j] / (j + 2); s = -s; } *ordm1coeff = pc[ord - 2] / (ord * (*ordm1coeff)); } for (j = i; j > 0; j--) { pc[j] += pc[j - 1] * h / hsum; } hsum += hprev[i - 1]; } /* Calculate sum term 1 for error estimation */ { int s = 1; for (i = 0; i < ord; i++) { st1 += s * pc[i] / (i + 1.0); s = -s; } } /* Calculate sum term 2 for error estimation */ { int s = 1; for (i = 0; i < ord; i++) { st2 += s * pc[i] / (i + 2.0); s = -s; } } /* Calculate the actual polynomial coefficients (l) */ DBL_ZERO_MEMSET (l, MSADAMS_MAX_ORD + 1); l[0] = 1.0; for (i = 1; i < ord + 1; i++) { l[i] = pc[i - 1] / (i * st1); } #ifdef DEBUG { size_t di; printf ("-- calccoeffs l: "); for (di = 0; di < ord + 1; di++) { printf ("%.5e ", l[di]); } printf ("\n"); printf ("-- calccoeffs pc: "); for (di = 0; di < ord; di++) { printf ("%.5e ", pc[di]); } printf ("\n"); printf ("-- calccoeffs st1=%.5e, st2=%.5e\n", st1, st2); } #endif /* Calculate error coefficient */ *errcoeff = (h / hsum) * (st2 / st1); /* Calculate auxiliary coefficients used in evaluation of change of order */ if (ordwait < 2) { int s = 1; *ordp1coeff = hsum / (h * l[ord]); *ordp2coeff = 0.0; for (i = ord; i > 0; i--) { pc[i] += pc[i - 1] * (h / hsum); } for (i = 0; i < ord + 1; i++) { *ordp2coeff += s * pc[i] / (i + 2); s = -s; } *ordp2coeff = (ord + 1) * st1 / (*ordp2coeff); } } #ifdef DEBUG printf ("-- calccoeffs ordm1coeff=%.5e ", *ordm1coeff); printf ("ordp1coeff=%.5e ", *ordp1coeff); printf ("ordp2coeff=%.5e ", *ordp2coeff); printf ("errcoeff=%.5e\n", *errcoeff); #endif return GSL_SUCCESS; } static int msadams_corrector (void *vstate, const gsl_odeiv2_system * sys, const double t, const double h, const size_t dim, const double z[], const double errlev[], const double l[], const double errcoeff, gsl_vector * abscor, gsl_vector * relcor, double ytmp[], double ytmp2[]) { /* Calculates the correction step (abscor). Non-linear equation system is solved by functional iteration. */ size_t mi, i; const size_t max_iter = 3; /* Maximum number of iterations */ double convrate = 1.0; /* convergence rate */ double stepnorm = 0.0; /* norm of correction step */ double stepnormprev = 0.0; /* Evaluate at predicted values */ { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, ytmp); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate correction step (abscor) */ gsl_vector_set_zero (abscor); for (mi = 0; mi < max_iter; mi++) { const double safety = 0.3; const double safety2 = 0.1; /* Calculate new y values to ytmp2 */ for (i = 0; i < dim; i++) { ytmp[i] *= h; ytmp[i] -= z[1 * dim + i]; ytmp[i] /= l[1]; ytmp2[i] = z[0 * dim + i] + ytmp[i]; } #ifdef DEBUG { size_t di; printf ("-- dstep: "); for (di = 0; di < dim; di++) { printf ("%.5e ", ytmp[di]); } printf ("\n"); } #endif /* Convergence test. Norms used are root-mean-square norms. */ for (i = 0; i < dim; i++) { gsl_vector_set (relcor, i, (ytmp[i] - gsl_vector_get (abscor, i)) / errlev[i]); gsl_vector_set (abscor, i, ytmp[i]); } stepnorm = gsl_blas_dnrm2 (relcor) / sqrt (dim); if (mi > 0) { convrate = GSL_MAX_DBL (safety * convrate, stepnorm / stepnormprev); } else { convrate = 1.0; } { const double convtest = GSL_MIN_DBL (convrate, 1.0) * stepnorm * errcoeff / safety2; #ifdef DEBUG printf ("-- func iter loop %d, errcoeff=%.5e, stepnorm =%.5e, convrate = %.5e, convtest = %.5e\n", (int) mi, errcoeff, stepnorm, convrate, convtest); #endif if (convtest <= 1.0) { break; } } /* Check for divergence during iteration */ { const double div_const = 2.0; if (mi > 1 && stepnorm > div_const * stepnormprev) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL, diverging functional iteration\n"); #endif return GSL_FAILURE; } } /* Evaluate at new y */ { int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp2, ytmp); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } stepnormprev = stepnorm; } #ifdef DEBUG printf ("-- functional iteration exit at mi=%d\n", (int) mi); #endif /* Handle convergence failure */ if (mi == max_iter) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL, max_iter reached\n"); #endif return GSL_FAILURE; } return GSL_SUCCESS; } static int msadams_eval_order (gsl_vector * abscor, gsl_vector * tempvec, gsl_vector * svec, const double errcoeff, const size_t dim, const double errlev[], const double ordm1coeff, const double ordp1coeff, const double ordp1coeffprev, const double ordp2coeff, const double hprev[], const double h, const double z[], size_t * ord, size_t * ordwait) { /* Evaluates and executes change in method order (current, current-1 or current+1). Order which maximizes the step length is selected. */ size_t i; /* step size estimates at current order, order-1 and order+1 */ double ordest = 0.0; double ordm1est = 0.0; double ordp1est = 0.0; const double safety = 1e-6; const double bias = 6.0; const double bias2 = 10.0; /* Relative step length estimate for current order */ ordest = 1.0 / (pow (bias * gsl_blas_dnrm2 (abscor) / sqrt (dim) * errcoeff, 1.0 / (*ord + 1)) + safety); /* Relative step length estimate for order ord - 1 */ if (*ord > 1) { for (i = 0; i < dim; i++) { gsl_vector_set (tempvec, i, z[*ord * dim + i] / errlev[i]); } ordm1est = 1.0 / (pow (bias * gsl_blas_dnrm2 (tempvec) / sqrt (dim) / ordm1coeff, 1.0 / (*ord)) + safety); } else { ordm1est = 0.0; } /* Relative step length estimate for order ord + 1 */ if (*ord < MSADAMS_MAX_ORD) { const double c = -ordp1coeff / ordp1coeffprev * pow (h / hprev[1], *ord + 1); for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (svec, i) * c + gsl_vector_get (abscor, i)); } ordp1est = 1.0 / (pow (bias2 * gsl_blas_dnrm2 (svec) / sqrt (dim) / ordp2coeff, 1.0 / (*ord + 2)) + safety); } else { ordp1est = 0.0; } #ifdef DEBUG printf ("-- eval_order ord=%d, ordest=%.5e, ordm1est=%.5e, ordp1est=%.5e\n", (int) *ord, ordest, ordm1est, ordp1est); #endif /* Choose order that maximises step size and increases step size markedly compared to current step */ { const double min_incr = 1.5; if (ordm1est > ordest && ordm1est > ordp1est && ordm1est > min_incr) { *ord -= 1; #ifdef DEBUG printf ("-- eval_order order DECREASED to %d\n", (int) *ord); #endif } else if (ordp1est > ordest && ordp1est > ordm1est && ordp1est > min_incr) { *ord += 1; #ifdef DEBUG printf ("-- eval_order order INCREASED to %d\n", (int) *ord); #endif } } *ordwait = *ord + 2; return GSL_SUCCESS; } static int msadams_apply (void *vstate, size_t dim, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv2_system * sys) { /* Conducts a step by Adams linear multistep methods. */ msadams_state_t *state = (msadams_state_t *) vstate; double *const z = state->z; double *const zbackup = state->zbackup; double *const ytmp = state->ytmp; double *const ytmp2 = state->ytmp2; double *const pc = state->pc; double *const l = state->l; double *const hprev = state->hprev; double *const hprevbackup = state->hprevbackup; double *const errlev = state->errlev; gsl_vector *const abscor = state->abscor; gsl_vector *const relcor = state->relcor; gsl_vector *const svec = state->svec; gsl_vector *const tempvec = state->tempvec; size_t ord = state->ord; double ordm1coeff = 0.0; double ordp1coeff = 0.0; double ordp2coeff = 0.0; double errcoeff = 0.0; /* error coefficient */ int deltaord; #ifdef DEBUG { size_t di; printf ("msadams_apply: t=%.5e, ord=%d, h=%.5e, y:", t, (int) ord, h); for (di = 0; di < dim; di++) { printf ("%.5e ", y[di]); } printf ("\n"); } #endif /* Check if t is the same as on previous stepper call (or last failed call). This means that calculation of previous step failed or the step was rejected, and therefore previous state will be restored or the method will be reset. */ if (state->ni > 0 && (t == state->tprev || t == state->failt)) { if (state->ni == 1) { /* No step has been accepted yet, reset method */ msadams_reset (vstate, dim); #ifdef DEBUG printf ("-- first step was REJECTED, msadams_reset called\n"); #endif } else { /* A succesful step has been saved, restore previous state. */ /* If previous step suggests order increase, but the step was rejected, then do not increase order. */ if (ord > state->ordprev) { state->ord = state->ordprev; ord = state->ord; } /* Restore previous state */ DBL_MEMCPY (z, zbackup, (MSADAMS_MAX_ORD + 1) * dim); DBL_MEMCPY (hprev, hprevbackup, MSADAMS_MAX_ORD); state->ordprev = state->ordprevbackup; state->ordwait = state->ordwaitbackup; #ifdef DEBUG printf ("-- previous step was REJECTED, state restored\n"); #endif } /* If step is repeatedly rejected, then reset method */ state->failcount++; { const size_t max_failcount = 3; if (state->failcount > max_failcount && state->ni > 1) { msadams_reset (vstate, dim); ord = state->ord; #ifdef DEBUG printf ("-- max_failcount reached, msadams_reset called\n"); #endif } } } else { /* The previous step was accepted. Backup current state. */ DBL_MEMCPY (zbackup, z, (MSADAMS_MAX_ORD + 1) * dim); DBL_MEMCPY (hprevbackup, hprev, MSADAMS_MAX_ORD); state->ordprevbackup = state->ordprev; state->ordwaitbackup = state->ordwait; state->failcount = 0; #ifdef DEBUG if (state->ni > 0) { printf ("-- previous step was ACCEPTED, state saved\n"); } #endif } #ifdef DEBUG printf ("-- ord=%d, ni=%ld, ordwait=%d\n", (int) ord, state->ni, (int) state->ordwait); printf ("-- ordprev: %d\n", (int) state->ordprev); #endif /* Get desired error levels via gsl_odeiv2_control object through driver object, which is a requirement for this stepper. */ if (state->driver == NULL) { return GSL_EFAULT; } else { size_t i; for (i = 0; i < dim; i++) { if (dydt_in != NULL) { gsl_odeiv2_control_errlevel (state->driver->c, y[i], dydt_in[i], h, i, &errlev[i]); } else { gsl_odeiv2_control_errlevel (state->driver->c, y[i], 0.0, h, i, &errlev[i]); } } } #ifdef DEBUG { size_t di; printf ("-- errlev: "); for (di = 0; di < dim; di++) { printf ("%.5e ", errlev[di]); } printf ("\n"); } #endif /* On first call initialize Nordsieck matrix */ if (state->ni == 0) { size_t i; DBL_ZERO_MEMSET (z, (MSADAMS_MAX_ORD + 1) * dim); if (dydt_in != NULL) { DBL_MEMCPY (ytmp, dydt_in, dim); } else { int s = GSL_ODEIV_FN_EVAL (sys, t, y, ytmp); if (s != GSL_SUCCESS) { return s; } } DBL_MEMCPY (&z[0 * dim], y, dim); DBL_MEMCPY (&z[1 * dim], ytmp, dim); for (i = 0; i < dim; i++) { z[1 * dim + i] *= h; } } /* Sanity check */ deltaord = ord - state->ordprev; if (deltaord > 1 || deltaord < -1) { printf ("-- order change %d\n", deltaord); GSL_ERROR_NULL ("msadams_apply too large order change", GSL_ESANITY); } /* Modify Nordsieck matrix if order or step length has been changed */ /* If order increased by 1, initialize new Nordsieck vector */ if (deltaord == 1) { DBL_ZERO_MEMSET (&z[ord * dim], dim); #ifdef DEBUG printf ("-- order increase detected, Nordsieck modified\n"); #endif } /* If order decreased by 1, adjust Nordsieck matrix */ if (deltaord == -1) { double hsum = 0.0; size_t i, j; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSADAMS_MAX_ORD + 1); l[1] = 1.0; for (i = 1; i < ord; i++) { hsum += hprev[i - 1]; for (j = i + 1; j > 0; j--) { l[j] *= hsum / hprev[0]; l[j] += l[j - 1]; } } for (i = 1; i < ord; i++) { l[i + 1] = (ord + 1) * l[i] / (i + 1); } /* Scale Nordsieck matrix */ for (i = 2; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += -l[i] * z[(ord + 1) * dim + j]; } #ifdef DEBUG printf ("-- order decrease detected, Nordsieck modified\n"); #endif } /* Scale Nordsieck vectors if step size has been changed */ if (state->ni > 0 && h != hprev[0]) { size_t i, j; const double hrel = h / hprev[0]; double coeff = hrel; for (i = 1; i < ord + 1; i++) { for (j = 0; j < dim; j++) { z[i * dim + j] *= coeff; } coeff *= hrel; } #ifdef DEBUG printf ("-- h != hprev, Nordsieck modified\n"); #endif } /* Calculate polynomial coefficients (l), error coefficient and auxiliary coefficients */ msadams_calccoeffs (ord, state->ordwait, h, hprev, pc, l, &errcoeff, º1coeff, &ordp1coeff, &ordp2coeff); /* Carry out the prediction step */ { size_t i, j, k; for (i = 1; i < ord + 1; i++) for (j = ord; j > i - 1; j--) for (k = 0; k < dim; k++) { z[(j - 1) * dim + k] += z[j * dim + k]; } #ifdef DEBUG { size_t di; printf ("-- predicted y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif } /* Calculate correction step to abscor */ { int s; s = msadams_corrector (vstate, sys, t, h, dim, z, errlev, l, errcoeff, abscor, relcor, ytmp, ytmp2); if (s != GSL_SUCCESS) { return s; } } { /* Add accepted final correction step to Nordsieck matrix */ size_t i, j; for (i = 0; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * gsl_vector_get (abscor, j); } #ifdef DEBUG { size_t di; printf ("-- corrected y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif /* Derivatives at output */ if (dydt_out != NULL) { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, dydt_out); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate error estimate */ for (i = 0; i < dim; i++) { yerr[i] = fabs (gsl_vector_get (abscor, i)) * errcoeff; } #ifdef DEBUG { size_t di; printf ("-- yerr: "); for (di = 0; di < dim; di++) { printf ("%.5e ", yerr[di]); } printf ("\n"); } #endif /* Save y values */ for (i = 0; i < dim; i++) { y[i] = z[0 * dim + i]; } } /* Scale abscor with errlev for later use in norm calculations */ { size_t i; for (i = 0; i < dim; i++) { gsl_vector_set (abscor, i, gsl_vector_get (abscor, i) / errlev[i]); } } /* Save items needed for evaluation of order increase on next call, if needed */ if (state->ordwait == 1 && ord < MSADAMS_MAX_ORD) { size_t i; state->ordp1coeffprev = ordp1coeff; state->ordm1coeff = ordm1coeff; for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (abscor, i)); } } /* Consider and execute order change for next step */ if (state->ordwait == 0) { msadams_eval_order (abscor, tempvec, svec, errcoeff, dim, errlev, state->ordm1coeff, ordp1coeff, state->ordp1coeffprev, ordp2coeff, hprev, h, z, &(state->ord), &(state->ordwait)); } /* Save information about current step in state and update counters */ { size_t i; state->ordprev = ord; for (i = MSADAMS_MAX_ORD - 1; i > 0; i--) { hprev[i] = hprev[i - 1]; } hprev[0] = h; #ifdef DEBUG { size_t di; printf ("-- hprev: "); for (di = 0; di < MSADAMS_MAX_ORD; di++) { printf ("%.5e ", hprev[di]); } printf ("\n"); } #endif state->tprev = t; state->ordwait--; state->ni++; } return GSL_SUCCESS; } static int msadams_set_driver (void *vstate, const gsl_odeiv2_driver * d) { msadams_state_t *state = (msadams_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int msadams_reset (void *vstate, size_t dim) { msadams_state_t *state = (msadams_state_t *) vstate; state->ni = 0; state->ord = 1; state->ordprev = 1; state->ordprevbackup = 1; state->ordwait = 2; state->ordwaitbackup = 2; state->failord = 0; state->failt = GSL_NAN; state->failcount = 0; DBL_ZERO_MEMSET (state->hprev, MSADAMS_MAX_ORD); DBL_ZERO_MEMSET (state->z, (MSADAMS_MAX_ORD + 1) * dim); #ifdef DEBUG printf ("-- msadams_reset called\n"); #endif return GSL_SUCCESS; } static unsigned int msadams_order (void *vstate) { msadams_state_t *state = (msadams_state_t *) vstate; return state->ord; } static void msadams_free (void *vstate) { msadams_state_t *state = (msadams_state_t *) vstate; gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); } static const gsl_odeiv2_step_type msadams_type = { "msadams", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &msadams_alloc, &msadams_apply, &msadams_set_driver, &msadams_reset, &msadams_order, &msadams_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_msadams = &msadams_type; gsl-doc-2.3/ode-initval2/control_utils.c0000664000175000017500000000176212616157443016342 0ustar eddedd/* ode-initval2/control_utils.c * * Copyright (C) 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 control_set_driver_null (void *vstate, const gsl_odeiv2_driver * d) { /* Dummy set function for those control objects that do not need pointer to driver object. */ return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/rk2.c0000664000175000017500000001236712616157443014143 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" 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 k3", 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 ytmp", 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_odeiv2_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_odeiv2_step_type rk2_type = { "rk2", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &rk2_alloc, &rk2_apply, &stepper_set_driver_null, &rk2_reset, &rk2_order, &rk2_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2 = &rk2_type; gsl-doc-2.3/ode-initval2/gsl_odeiv2.h0000664000175000017500000003272512616157443015507 0ustar eddedd/* ode-initval/odeiv2.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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 by Tuomo Keskitalo */ #ifndef __GSL_ODEIV2_H__ #define __GSL_ODEIV2_H__ #include #include #include #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_odeiv2_system; /* Function evaluation macros */ #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) /* Type definitions */ typedef struct gsl_odeiv2_step_struct gsl_odeiv2_step; typedef struct gsl_odeiv2_control_struct gsl_odeiv2_control; typedef struct gsl_odeiv2_evolve_struct gsl_odeiv2_evolve; typedef struct gsl_odeiv2_driver_struct gsl_odeiv2_driver; /* 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_odeiv2_system * dydt); int (*set_driver) (void *state, const gsl_odeiv2_driver * d); int (*reset) (void *state, size_t dim); unsigned int (*order) (void *state); void (*free) (void *state); } gsl_odeiv2_step_type; struct gsl_odeiv2_step_struct { const gsl_odeiv2_step_type *type; size_t dimension; void *state; }; /* Available stepper types */ GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rkf45; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rkck; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk8pd; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2imp; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4imp; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_bsimp; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk1imp; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_msadams; GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_msbdf; /* Stepper object methods */ gsl_odeiv2_step *gsl_odeiv2_step_alloc (const gsl_odeiv2_step_type * T, size_t dim); int gsl_odeiv2_step_reset (gsl_odeiv2_step * s); void gsl_odeiv2_step_free (gsl_odeiv2_step * s); const char *gsl_odeiv2_step_name (const gsl_odeiv2_step * s); unsigned int gsl_odeiv2_step_order (const gsl_odeiv2_step * s); int gsl_odeiv2_step_apply (gsl_odeiv2_step * s, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv2_system * dydt); int gsl_odeiv2_step_set_driver (gsl_odeiv2_step * s, const gsl_odeiv2_driver * d); /* Step size control object. */ 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); int (*errlevel) (void *state, const double y, const double dydt, const double h, const size_t ind, double *errlev); int (*set_driver) (void *state, const gsl_odeiv2_driver * d); void (*free) (void *state); } gsl_odeiv2_control_type; struct gsl_odeiv2_control_struct { const gsl_odeiv2_control_type *type; void *state; }; /* 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 */ /* General step size control methods. * * 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. * errlevel function calculates the desired error level D0. * * The general data can be used by specializations * to store state and control their heuristics. */ gsl_odeiv2_control *gsl_odeiv2_control_alloc (const gsl_odeiv2_control_type * T); int gsl_odeiv2_control_init (gsl_odeiv2_control * c, double eps_abs, double eps_rel, double a_y, double a_dydt); void gsl_odeiv2_control_free (gsl_odeiv2_control * c); int gsl_odeiv2_control_hadjust (gsl_odeiv2_control * c, gsl_odeiv2_step * s, const double y[], const double yerr[], const double dydt[], double *h); const char *gsl_odeiv2_control_name (const gsl_odeiv2_control * c); int gsl_odeiv2_control_errlevel (gsl_odeiv2_control * c, const double y, const double dydt, const double h, const size_t ind, double *errlev); int gsl_odeiv2_control_set_driver (gsl_odeiv2_control * c, const gsl_odeiv2_driver * d); /* 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_odeiv2_control *gsl_odeiv2_control_standard_new (double eps_abs, double eps_rel, double a_y, double a_dydt); gsl_odeiv2_control *gsl_odeiv2_control_y_new (double eps_abs, double eps_rel); gsl_odeiv2_control *gsl_odeiv2_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_odeiv2_control *gsl_odeiv2_control_scaled_new (double eps_abs, double eps_rel, double a_y, double a_dydt, const double scale_abs[], size_t dim); /* Evolution object */ struct gsl_odeiv2_evolve_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; const gsl_odeiv2_driver *driver; }; /* Evolution object methods */ gsl_odeiv2_evolve *gsl_odeiv2_evolve_alloc (size_t dim); int gsl_odeiv2_evolve_apply (gsl_odeiv2_evolve * e, gsl_odeiv2_control * con, gsl_odeiv2_step * step, const gsl_odeiv2_system * dydt, double *t, double t1, double *h, double y[]); int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve * e, gsl_odeiv2_control * con, gsl_odeiv2_step * step, const gsl_odeiv2_system * dydt, double *t, const double h0, double y[]); int gsl_odeiv2_evolve_reset (gsl_odeiv2_evolve * e); void gsl_odeiv2_evolve_free (gsl_odeiv2_evolve * e); int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve * e, const gsl_odeiv2_driver * d); /* Driver object * * This is a high level wrapper for step, control and * evolve objects. */ struct gsl_odeiv2_driver_struct { const gsl_odeiv2_system *sys; /* ODE system */ gsl_odeiv2_step *s; /* stepper object */ gsl_odeiv2_control *c; /* control object */ gsl_odeiv2_evolve *e; /* evolve object */ double h; /* step size */ double hmin; /* minimum step size allowed */ double hmax; /* maximum step size allowed */ unsigned long int n; /* number of steps taken */ unsigned long int nmax; /* Maximum number of steps allowed */ }; /* Driver object methods */ gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel); gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel); gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt, const double scale_abs[]); gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_standard_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt); int gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver * d, const double hmin); int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * d, const double hmax); int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * d, const unsigned long int nmax); int gsl_odeiv2_driver_apply (gsl_odeiv2_driver * d, double *t, const double t1, double y[]); int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * d, double *t, const double h, const unsigned long int n, double y[]); int gsl_odeiv2_driver_reset (gsl_odeiv2_driver * d); int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * d, const double hstart); void gsl_odeiv2_driver_free (gsl_odeiv2_driver * state); __END_DECLS #endif /* __GSL_ODEIV2_H__ */ gsl-doc-2.3/ode-initval2/Makefile.am0000664000175000017500000000142112616157443015322 0ustar eddeddnoinst_LTLIBRARIES = libgslodeiv2.la pkginclude_HEADERS = gsl_odeiv2.h AM_CPPFLAGS = -I$(top_srcdir) libgslodeiv2_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c rk1imp.c msadams.c msbdf.c driver.c noinst_HEADERS = odeiv_util.h step_utils.c rksubs.c modnewton1.c control_utils.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_LDADD = libgslodeiv2.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 gsl-doc-2.3/ode-initval2/evolve.c0000644000175000017500000002213312755622157014736 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include "odeiv_util.h" gsl_odeiv2_evolve * gsl_odeiv2_evolve_alloc (size_t dim) { gsl_odeiv2_evolve *e = (gsl_odeiv2_evolve *) malloc (sizeof (gsl_odeiv2_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; e->driver = NULL; return e; } int gsl_odeiv2_evolve_reset (gsl_odeiv2_evolve * e) { e->count = 0; e->failed_steps = 0; e->last_step = 0.0; return GSL_SUCCESS; } void gsl_odeiv2_evolve_free (gsl_odeiv2_evolve * e) { RETURN_IF_NULL (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_odeiv2_evolve_apply (gsl_odeiv2_evolve * e, gsl_odeiv2_control * con, gsl_odeiv2_step * step, const gsl_odeiv2_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); } /* Save y in case of failure in a step */ DBL_MEMCPY (e->y0, y, e->dimension); /* Calculate initial dydt once or reuse previous value if the method can benefit. */ if (step->type->can_use_dydt_in) { if (e->count == 0) { int status = GSL_ODEIV_FN_EVAL (dydt, t0, y, e->dydt_in); if (status) { return status; } } else { DBL_MEMCPY (e->dydt_in, e->dydt_out, e->dimension); } } 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_odeiv2_step_apply (step, t0, h0, y, e->yerr, e->dydt_in, e->dydt_out, dydt); } else { step_status = gsl_odeiv2_step_apply (step, t0, h0, y, e->yerr, NULL, e->dydt_out, dydt); } /* Return if stepper indicates a pointer or user function failure */ if (step_status == GSL_EFAULT || step_status == GSL_EBADFUNC) { return step_status; } /* Check for stepper internal failure */ if (step_status != GSL_SUCCESS) { /* Stepper was unable to calculate step. Try decreasing step size. */ double h_old = h0; h0 *= 0.5; /* Check that an actual decrease in h0 occured and the suggested h0 will change the time by at least 1 ulp */ { double t_curr = GSL_COERCE_DBL (*t); double t_next = GSL_COERCE_DBL ((*t) + h0); if (fabs (h0) < fabs (h_old) && t_next != t_curr) { /* Step was decreased. Undo step, and try again with new h0. */ DBL_MEMCPY (y, e->y0, dydt->dimension); e->failed_steps++; goto try_step; } else { *h = h0; /* notify user of step-size which caused the failure */ *t = t0; /* restore original t value */ 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. */ double h_old = h0; const int hadjust_status = gsl_odeiv2_control_hadjust (con, step, y, e->yerr, e->dydt_out, &h0); if (hadjust_status == GSL_ODEIV_HADJ_DEC) { /* Check that the reported status is correct (i.e. an actual decrease in h0 occured) and the suggested h0 will change the time by at least 1 ulp */ double t_curr = GSL_COERCE_DBL (*t); double t_next = GSL_COERCE_DBL ((*t) + h0); if (fabs (h0) < fabs (h_old) && t_next != t_curr) { /* Step was decreased. Undo step, and try again with new h0. */ DBL_MEMCPY (y, e->y0, dydt->dimension); e->failed_steps++; goto try_step; } else { /* Can not obtain required error tolerance, and can not decrease step-size any further, so give up and return GSL_FAILURE. */ *h = h0; /* notify user of step-size which caused the failure */ return GSL_FAILURE; } } } /* Suggest step size for next time-step. Change of step size is not suggested in the final step, because that step can be very small compared to previous step, to reach t1. */ if (final_step == 0) { *h = h0; } return step_status; } /* Evolves the system using the user specified constant step size h. */ int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve * e, gsl_odeiv2_control * con, gsl_odeiv2_step * step, const gsl_odeiv2_system * dydt, double *t, const double h, double y[]) { const double t0 = *t; int step_status; if (e->dimension != step->dimension) { GSL_ERROR ("step dimension must match evolution size", GSL_EINVAL); } /* Save y in case of failure in a step */ 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; } } if (step->type->can_use_dydt_in) { step_status = gsl_odeiv2_step_apply (step, t0, h, y, e->yerr, e->dydt_in, e->dydt_out, dydt); } else { step_status = gsl_odeiv2_step_apply (step, t0, h, y, e->yerr, NULL, e->dydt_out, dydt); } /* Return the stepper return value in case of an error */ if (step_status != GSL_SUCCESS) { return step_status; } if (con != NULL) { /* Calculate error level. Fail if error level exceeds desired error level. */ double htemp = h; const int hadjust_status = gsl_odeiv2_control_hadjust (con, step, y, e->yerr, e->dydt_out, &htemp); if (hadjust_status == GSL_ODEIV_HADJ_DEC) { DBL_MEMCPY (y, e->y0, dydt->dimension); e->failed_steps++; return GSL_FAILURE; } } /* Step is accepted, update status */ e->count++; e->last_step = h; *t = t0 + h; return GSL_SUCCESS; } int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve * e, const gsl_odeiv2_driver * d) { if (d != NULL) { e->driver = d; } else { GSL_ERROR_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/TODO0000664000175000017500000000653712616157443013773 0ustar eddedd* Implement other stepping methods from well-known packages such as RKSUITE, DASSL, etc * 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 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. ---------------------------------------------------------------------- gsl-doc-2.3/ode-initval2/rk4.c0000664000175000017500000001662212616157443014143 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" 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->k); free (state); 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_odeiv2_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_odeiv2_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 */ for (i = 0; i < dim; i++) { yerr[i] = ODEIV_ERR_SAFETY * 0.5 * (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_odeiv2_step_type rk4_type = { "rk4", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &rk4_alloc, &rk4_apply, &stepper_set_driver_null, &rk4_reset, &rk4_order, &rk4_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4 = &rk4_type; gsl-doc-2.3/ode-initval2/driver.c0000644000175000017500000003003412755623667014737 0ustar eddedd/* ode-initval2/driver.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Driver routine for odeiv2. This is a wrapper for low level GSL functions that allows a simple interface to step, control and evolve layers. */ #include #include #include #include #include static gsl_odeiv2_driver * driver_alloc (const gsl_odeiv2_system * sys, const double hstart, const gsl_odeiv2_step_type * T) { /* Allocates and initializes an ODE driver system. Step and evolve objects are allocated here, but control object is allocated in another function. */ gsl_odeiv2_driver *state; if (sys == NULL) { GSL_ERROR_NULL ("gsl_odeiv2_system must be defined", GSL_EINVAL); } state = (gsl_odeiv2_driver *) calloc (1, sizeof (gsl_odeiv2_driver)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate space for driver state", GSL_ENOMEM); } { const size_t dim = sys->dimension; if (dim == 0) { gsl_odeiv2_driver_free(state); GSL_ERROR_NULL ("gsl_odeiv2_system dimension must be a positive integer", GSL_EINVAL); } state->sys = sys; state->s = gsl_odeiv2_step_alloc (T, dim); if (state->s == NULL) { gsl_odeiv2_driver_free(state); GSL_ERROR_NULL ("failed to allocate step object", GSL_ENOMEM); } state->e = gsl_odeiv2_evolve_alloc (dim); } if (state->e == NULL) { gsl_odeiv2_driver_free(state); GSL_ERROR_NULL ("failed to allocate evolve object", GSL_ENOMEM); } if (hstart > 0.0 || hstart < 0.0) { state->h = hstart; } else { gsl_odeiv2_driver_free(state); GSL_ERROR_NULL ("invalid hstart", GSL_EINVAL); } state->h = hstart; state->hmin = 0.0; state->hmax = GSL_DBL_MAX; state->nmax = 0; state->n = 0; state->c = NULL; return state; } int gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver * d, const double hmin) { /* Sets minimum allowed step size fabs(hmin) for driver. It is required that hmin <= fabs(h) <= hmax. */ if ((fabs (hmin) > fabs (d->h)) || (fabs (hmin) > d->hmax)) { GSL_ERROR_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } d->hmin = fabs (hmin); return GSL_SUCCESS; } int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * d, const double hmax) { /* Sets maximum allowed step size fabs(hmax) for driver. It is required that hmin <= fabs(h) <= hmax. */ if ((fabs (hmax) < fabs (d->h)) || (fabs (hmax) < d->hmin)) { GSL_ERROR_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hmax > 0.0 || hmax < 0.0) { d->hmax = fabs (hmax); } else { GSL_ERROR_NULL ("invalid hmax", GSL_EINVAL); } return GSL_SUCCESS; } int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * d, const unsigned long int nmax) { /* Sets maximum number of allowed steps (nmax) for driver */ d->nmax = nmax; return GSL_SUCCESS; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel) { /* Initializes an ODE driver system with control object of type y_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_y_new (epsabs, epsrel); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel) { /* Initializes an ODE driver system with control object of type yp_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_yp_new (epsabs, epsrel); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_standard_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt) { /* Initializes an ODE driver system with control object of type standard_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_standard_new (epsabs, epsrel, a_y, a_dydt); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt, const double scale_abs[]) { /* Initializes an ODE driver system with control object of type scaled_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_scaled_new (epsabs, epsrel, a_y, a_dydt, scale_abs, sys->dimension); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } int gsl_odeiv2_driver_apply (gsl_odeiv2_driver * d, double *t, const double t1, double y[]) { /* Main driver function that evolves the system from t to t1. In beginning vector y contains the values of dependent variables at t. This function returns values at t=t1 in y. In case of unrecoverable error, y and t contains the values after the last successful step. */ int sign = 0; d->n = 0; /* Determine integration direction sign */ if (d->h > 0.0) { sign = 1; } else { sign = -1; } /* Check that t, t1 and step direction are sensible */ if (sign * (t1 - *t) < 0.0) { GSL_ERROR_NULL ("integration limits and/or step direction not consistent", GSL_EINVAL); } /* Evolution loop */ while (sign * (t1 - *t) > 0.0) { int s = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, d->sys, t, t1, &(d->h), y); if (s != GSL_SUCCESS) { return s; } /* Check for maximum allowed steps */ if ((d->nmax > 0) && (d->n > d->nmax)) { return GSL_EMAXITER; } /* Set step size if maximum size is exceeded */ if (fabs (d->h) > d->hmax) { d->h = sign * d->hmax; } /* Check for too small step size */ if (fabs (d->h) < d->hmin) { return GSL_ENOPROG; } d->n++; } return GSL_SUCCESS; } int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * d, double *t, const double h, const unsigned long int n, double y[]) { /* Alternative driver function that evolves the system from t using * n steps of size h. In the beginning vector y contains the values * of dependent variables at t. This function returns values at t = * t + n * h in y. In case of an unrecoverable error, y and t * contains the values after the last successful step. */ unsigned long int i; d->n = 0; /* Evolution loop */ for (i = 0; i < n; i++) { int s = gsl_odeiv2_evolve_apply_fixed_step (d->e, d->c, d->s, d->sys, t, h, y); if (s != GSL_SUCCESS) { return s; } d->n++; } return GSL_SUCCESS; } int gsl_odeiv2_driver_reset (gsl_odeiv2_driver * d) { /* Reset the driver. Resets evolve and step objects. */ { int s = gsl_odeiv2_evolve_reset (d->e); if (s != GSL_SUCCESS) { return s; } } { int s = gsl_odeiv2_step_reset (d->s); if (s != GSL_SUCCESS) { return s; } } return GSL_SUCCESS; } int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * d, const double hstart) { /* Resets current driver and sets initial step size to hstart */ gsl_odeiv2_driver_reset (d); if ((d->hmin > fabs (hstart)) || (fabs (hstart) > d->hmax)) { GSL_ERROR_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hstart > 0.0 || hstart < 0.0) { d->h = hstart; } else { GSL_ERROR_NULL ("invalid hstart", GSL_EINVAL); } return GSL_SUCCESS; } void gsl_odeiv2_driver_free (gsl_odeiv2_driver * state) { if (state->c) gsl_odeiv2_control_free (state->c); if (state->e) gsl_odeiv2_evolve_free (state->e); if (state->s) gsl_odeiv2_step_free (state->s); free (state); } gsl-doc-2.3/ode-initval2/odeiv_util.h0000664000175000017500000000136512616157443015611 0ustar eddedd#define DBL_MEMCPY(dest,src,n) memcpy((dest),(src),(n)*sizeof(double)) #define DBL_ZERO_MEMSET(dest,n) memset((dest),0,(n)*sizeof(double)) /* Error estimation safety coefficient for methods that use step * doubling for error estimates. Error estimates are multiplied by * this constant to ensure that the error of a step is not * underestimated. * * The default safety value of 8.0 ensures 90% of samples lie within * the error (assuming a Gaussian distribution with prior * p(sigma) = 1 / sigma). Value of 1.0 conforms to equation * by Ascher and Petzold (reference: Ascher, U.M., Petzold, L.R., * Computer methods for ordinary differential and * differential-algebraic equations, SIAM, Philadelphia, 1998). */ #define ODEIV_ERR_SAFETY 8.0 gsl-doc-2.3/ode-initval2/rk4imp.c0000664000175000017500000003113012616157443014640 0ustar eddedd/* ode-initval2/rk4imp.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 rk4imp.c by Gerard Jungman */ /* Gaussian implicit 4th order Runge-Kutta method. Error estimation is carried out by the step doubling method. */ /* References: Ascher, U.M., Petzold, L.R., Computer methods for ordinary differential and differential-algebraic equations, SIAM, Philadelphia, 1998. ISBN 0898714125, 9780898714128 */ #include #include #include #include #include #include #include "odeiv_util.h" #include "rksubs.c" #include "modnewton1.c" /* Stage of method */ #define RK4IMP_STAGE 2 typedef struct { gsl_matrix *A; /* Runge-Kutta coefficients */ double *y_onestep; /* Result with one step */ double *y_twostep; /* Result with two half steps */ double *ytmp; /* Temporary work space */ double *y_save; /* Backup space */ double *YZ; /* Runge-Kutta points */ double *fYZ; /* Derivatives at YZ */ gsl_matrix *dfdy; /* Jacobian matrix */ double *dfdt; /* time derivative of f */ modnewton1_state_t *esol; /* nonlinear equation solver */ double *errlev; /* desired error level of y */ const gsl_odeiv2_driver *driver; /* pointer to driver object */ } 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->A = gsl_matrix_alloc (RK4IMP_STAGE, RK4IMP_STAGE); if (state->A == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for A", GSL_ENOMEM); } state->y_onestep = (double *) malloc (dim * sizeof (double)); if (state->y_onestep == 0) { gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->y_twostep = (double *) malloc (dim * sizeof (double)); if (state->y_twostep == 0) { free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->ytmp = (double *) malloc (dim * sizeof (double)); if (state->ytmp == 0) { free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM); } state->y_save = (double *) malloc (dim * sizeof (double)); if (state->y_save == 0) { free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_save", GSL_ENOMEM); } state->YZ = (double *) malloc (dim * RK4IMP_STAGE * sizeof (double)); if (state->YZ == 0) { free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for YZ", GSL_ENOMEM); } state->fYZ = (double *) malloc (dim * RK4IMP_STAGE * sizeof (double)); if (state->fYZ == 0) { free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for fYZ", GSL_ENOMEM); } state->dfdt = (double *) malloc (dim * sizeof (double)); if (state->dfdt == 0) { free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdt", GSL_ENOMEM); } state->dfdy = gsl_matrix_alloc (dim, dim); if (state->dfdy == 0) { free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdy", GSL_ENOMEM); } state->esol = modnewton1_alloc (dim, RK4IMP_STAGE); if (state->esol == 0) { gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for esol", GSL_ENOMEM); } state->errlev = (double *) malloc (dim * sizeof (double)); if (state->errlev == 0) { modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for errlev", GSL_ENOMEM); } state->driver = NULL; return state; } 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_odeiv2_system * sys) { /* Makes a Gaussian implicit 4th order Runge-Kutta with step size h and estimates the local error of the step. */ rk4imp_state_t *state = (rk4imp_state_t *) vstate; double *const y_onestep = state->y_onestep; double *const y_twostep = state->y_twostep; double *const ytmp = state->ytmp; double *const y_save = state->y_save; double *const YZ = state->YZ; /* Runge-Kutta points */ double *const fYZ = state->fYZ; gsl_matrix *const dfdy = state->dfdy; double *const dfdt = state->dfdt; double *const errlev = state->errlev; const modnewton1_state_t *esol = state->esol; /* Runge-Kutta coefficients */ gsl_matrix *A = state->A; const double b[] = { 0.5, 0.5 }; const double c[] = { (3.0 - M_SQRT3) / 6.0, (3.0 + M_SQRT3) / 6.0 }; gsl_matrix_set (A, 0, 0, 1.0 / 4); gsl_matrix_set (A, 0, 1, (3 - 2 * sqrt (3)) / 12); gsl_matrix_set (A, 1, 0, (3 + 2 * sqrt (3)) / 12); gsl_matrix_set (A, 1, 1, 1.0 / 4); if (esol == NULL) { GSL_ERROR ("no non-linear equation solver speficied", GSL_EINVAL); } /* Get desired error levels via gsl_odeiv2_control object through driver object, which is a requirement for this stepper. */ if (state->driver == NULL) { return GSL_EFAULT; } else { size_t i; for (i = 0; i < dim; i++) { if (dydt_in != NULL) { gsl_odeiv2_control_errlevel (state->driver->c, y[i], dydt_in[i], h, i, &errlev[i]); } else { gsl_odeiv2_control_errlevel (state->driver->c, y[i], 0.0, h, i, &errlev[i]); } } } /* Evaluate Jacobian for modnewton1 */ { int s = GSL_ODEIV_JA_EVAL (sys, t, y, dfdy->data, dfdt); if (s != GSL_SUCCESS) { return s; } } /* Calculate a single step with size h */ { int s = modnewton1_init ((void *) esol, A, h, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } { int s = modnewton1_solve ((void *) esol, A, c, t, h, y, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { size_t j; for (j = 0; j < RK4IMP_STAGE; j++) { int s = GSL_ODEIV_FN_EVAL (sys, t + c[j] * h, &YZ[j * dim], &fYZ[j * dim]); if (s != GSL_SUCCESS) { return s; } } } { int s = rksubs (y_onestep, h, y, fYZ, b, RK4IMP_STAGE, dim); if (s != GSL_SUCCESS) { return s; } } /* Error estimation by step doubling */ { int s = modnewton1_init ((void *) esol, A, h / 2.0, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } /* 1st half step */ { int s = modnewton1_solve ((void *) esol, A, c, t, h / 2.0, y, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { size_t j; for (j = 0; j < RK4IMP_STAGE; j++) { int s = GSL_ODEIV_FN_EVAL (sys, t + c[j] * h / 2.0, &YZ[j * dim], &fYZ[j * dim]); if (s != GSL_SUCCESS) { return s; } } } { int s = rksubs (ytmp, h / 2.0, y, fYZ, b, RK4IMP_STAGE, dim); if (s != GSL_SUCCESS) return s; } /* Save original y values in case of error */ DBL_MEMCPY (y_save, y, dim); /* 2nd half step */ { int s = modnewton1_solve ((void *) esol, A, c, t + h / 2.0, h / 2.0, ytmp, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { size_t j; for (j = 0; j < RK4IMP_STAGE; j++) { int s = GSL_ODEIV_FN_EVAL (sys, t + h / 2.0 + c[j] * h / 2.0, &YZ[j * dim], &fYZ[j * dim]); if (s != GSL_SUCCESS) { return s; } } } { int s = rksubs (y_twostep, h / 2.0, ytmp, fYZ, b, RK4IMP_STAGE, dim); if (s != GSL_SUCCESS) { DBL_MEMCPY (y, y_save, dim); return s; } } /* Note: rk4imp returns y using the results from two half steps instead of the single step since the results are freely available and more precise. */ DBL_MEMCPY (y, y_twostep, dim); /* Error estimation */ { size_t i; for (i = 0; i < dim; i++) { yerr[i] = ODEIV_ERR_SAFETY * 0.5 * fabs (y_twostep[i] - y_onestep[i]) / 15.0; } } /* 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, y_save, dim); return s; } } return GSL_SUCCESS; } static int rk4imp_set_driver (void *vstate, const gsl_odeiv2_driver * d) { rk4imp_state_t *state = (rk4imp_state_t *) vstate; state->driver = d; 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->y_twostep, dim); DBL_ZERO_MEMSET (state->ytmp, dim); DBL_ZERO_MEMSET (state->y_save, dim); DBL_ZERO_MEMSET (state->YZ, dim * RK4IMP_STAGE); DBL_ZERO_MEMSET (state->fYZ, dim * RK4IMP_STAGE); 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->errlev); modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); } static const gsl_odeiv2_step_type rk4imp_type = { "rk4imp", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &rk4imp_alloc, &rk4imp_apply, &rk4imp_set_driver, &rk4imp_reset, &rk4imp_order, &rk4imp_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4imp = &rk4imp_type; gsl-doc-2.3/ode-initval2/rk2imp.c0000664000175000017500000002771612616157443014655 0ustar eddedd/* ode-initval2/rk2imp.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 rk2imp.c by Gerard Jungman */ /* Runge-Kutta 2, Gaussian implicit. Also known as implicit midpoint rule. Error estimation is carried out by the step doubling method. */ /* Reference: Ascher, U.M., Petzold, L.R., Computer methods for ordinary differential and differential-algebraic equations, SIAM, Philadelphia, 1998. */ #include #include #include #include #include #include #include "odeiv_util.h" #include "rksubs.c" #include "modnewton1.c" /* Stage of method */ #define RK2IMP_STAGE 1 typedef struct { gsl_matrix *A; /* Runge-Kutta coefficients */ double *y_onestep; /* Result with one step */ double *y_twostep; /* Result with two half steps */ double *ytmp; /* Temporary work space */ double *y_save; /* Backup space */ double *YZ; /* Runge-Kutta points */ double *fYZ; /* Derivatives at YZ */ gsl_matrix *dfdy; /* Jacobian matrix */ double *dfdt; /* time derivative of f */ modnewton1_state_t *esol; /* nonlinear equation solver */ double *errlev; /* desired error level of y */ const gsl_odeiv2_driver *driver; /* pointer to driver object */ } 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->A = gsl_matrix_alloc (RK2IMP_STAGE, RK2IMP_STAGE); if (state->A == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for A", GSL_ENOMEM); } state->y_onestep = (double *) malloc (dim * sizeof (double)); if (state->y_onestep == 0) { gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->y_twostep = (double *) malloc (dim * sizeof (double)); if (state->y_twostep == 0) { free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->ytmp = (double *) malloc (dim * sizeof (double)); if (state->ytmp == 0) { free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM); } state->y_save = (double *) malloc (dim * sizeof (double)); if (state->y_save == 0) { free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_save", GSL_ENOMEM); } state->YZ = (double *) malloc (dim * RK2IMP_STAGE * sizeof (double)); if (state->YZ == 0) { free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for YZ", GSL_ENOMEM); } state->fYZ = (double *) malloc (dim * RK2IMP_STAGE * sizeof (double)); if (state->fYZ == 0) { free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for fYZ", GSL_ENOMEM); } state->dfdt = (double *) malloc (dim * sizeof (double)); if (state->dfdt == 0) { free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdt", GSL_ENOMEM); } state->dfdy = gsl_matrix_alloc (dim, dim); if (state->dfdy == 0) { free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdy", GSL_ENOMEM); } state->esol = modnewton1_alloc (dim, RK2IMP_STAGE); if (state->esol == 0) { gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for esol", GSL_ENOMEM); } state->errlev = (double *) malloc (dim * sizeof (double)); if (state->errlev == 0) { modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for errlev", GSL_ENOMEM); } state->driver = NULL; return state; } 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_odeiv2_system * sys) { /* Makes a Gaussian implicit 4th order Runge-Kutta step with size h and estimates the local error of the step by step doubling. */ rk2imp_state_t *state = (rk2imp_state_t *) vstate; double *const y_onestep = state->y_onestep; double *const y_twostep = state->y_twostep; double *const ytmp = state->ytmp; double *const y_save = state->y_save; double *const YZ = state->YZ; double *const fYZ = state->fYZ; gsl_matrix *const dfdy = state->dfdy; double *const dfdt = state->dfdt; double *const errlev = state->errlev; const modnewton1_state_t *esol = state->esol; /* Runge-Kutta coefficients */ gsl_matrix *A = state->A; const double b[] = { 1.0 }; const double c[] = { 0.5 }; gsl_matrix_set (A, 0, 0, 0.5); if (esol == NULL) { GSL_ERROR ("no non-linear equation solver speficied", GSL_EINVAL); } /* Get desired error levels via gsl_odeiv2_control object through driver object, which is a requirement for this stepper. */ if (state->driver == NULL) { return GSL_EFAULT; } else { size_t i; for (i = 0; i < dim; i++) { if (dydt_in != NULL) { gsl_odeiv2_control_errlevel (state->driver->c, y[i], dydt_in[i], h, i, &errlev[i]); } else { gsl_odeiv2_control_errlevel (state->driver->c, y[i], 0.0, h, i, &errlev[i]); } } } /* Evaluate Jacobian for modnewton1 */ { int s = GSL_ODEIV_JA_EVAL (sys, t, y, dfdy->data, dfdt); if (s != GSL_SUCCESS) { return s; } } /* Calculate a single step with size h */ { int s = modnewton1_init ((void *) esol, A, h, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } { int s = modnewton1_solve ((void *) esol, A, c, t, h, y, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { int s = GSL_ODEIV_FN_EVAL (sys, t + c[0] * h, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { int s = rksubs (y_onestep, h, y, fYZ, b, RK2IMP_STAGE, dim); if (s != GSL_SUCCESS) { return s; } } /* Error estimation by step doubling */ { int s = modnewton1_init ((void *) esol, A, h / 2.0, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } /* 1st half step */ { int s = modnewton1_solve ((void *) esol, A, c, t, h / 2.0, y, sys, YZ, errlev); if (s != GSL_SUCCESS) return s; } { int s = GSL_ODEIV_FN_EVAL (sys, t + c[0] * h / 2.0, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { int s = rksubs (ytmp, h / 2.0, y, fYZ, b, RK2IMP_STAGE, dim); if (s != GSL_SUCCESS) { return s; } } /* Save original y values in case of error */ DBL_MEMCPY (y_save, y, dim); /* 2nd half step */ { int s = modnewton1_solve ((void *) esol, A, c, t + h / 2.0, h / 2.0, ytmp, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { int s = GSL_ODEIV_FN_EVAL (sys, t + h / 2.0 + c[0] * h / 2.0, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { /* Note: rk2imp returns y using the results from two half steps instead of the single step since the results are freely available and more precise. */ int s = rksubs (y_twostep, h / 2.0, ytmp, fYZ, b, RK2IMP_STAGE, dim); if (s != GSL_SUCCESS) { DBL_MEMCPY (y, y_save, dim); return s; } } DBL_MEMCPY (y, y_twostep, dim); /* Error estimation */ { size_t i; for (i = 0; i < dim; i++) { yerr[i] = ODEIV_ERR_SAFETY * 0.5 * fabs (y_twostep[i] - y_onestep[i]) / 3.0; } } /* 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, y_save, dim); return s; } } return GSL_SUCCESS; } static int rk2imp_set_driver (void *vstate, const gsl_odeiv2_driver * d) { rk2imp_state_t *state = (rk2imp_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int rk2imp_reset (void *vstate, size_t dim) { rk2imp_state_t *state = (rk2imp_state_t *) vstate; DBL_ZERO_MEMSET (state->y_onestep, dim); DBL_ZERO_MEMSET (state->y_twostep, dim); DBL_ZERO_MEMSET (state->ytmp, dim); DBL_ZERO_MEMSET (state->y_save, dim); DBL_ZERO_MEMSET (state->YZ, dim); DBL_ZERO_MEMSET (state->fYZ, 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->errlev); modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); } static const gsl_odeiv2_step_type rk2imp_type = { "rk2imp", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &rk2imp_alloc, &rk2imp_apply, &rk2imp_set_driver, &rk2imp_reset, &rk2imp_order, &rk2imp_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2imp = &rk2imp_type; gsl-doc-2.3/ode-initval2/rk8pd.c0000664000175000017500000002775312616157443014502 0ustar eddedd/* ode-initval2/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" /* 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_odeiv2_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_odeiv2_step_type rk8pd_type = { "rk8pd", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &rk8pd_alloc, &rk8pd_apply, &stepper_set_driver_null, &rk8pd_reset, &rk8pd_order, &rk8pd_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk8pd = &rk8pd_type; gsl-doc-2.3/ode-initval2/cscal.c0000664000175000017500000001254212616157443014525 0ustar eddedd/* ode-initval2/cscal.c * * Copyright (C) 2002, 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "control_utils.c" 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 int sc_control_errlevel (void *vstate, const double y, const double dydt, const double h, const size_t ind, double *errlev) { 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; *errlev = eps_rel * (a_y * fabs (y) + a_dydt * fabs (h * dydt)) + eps_abs * scale_abs[ind]; if (*errlev <= 0.0) { GSL_ERROR_NULL ("errlev <= zero", GSL_ESANITY); } return GSL_SUCCESS; } 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_odeiv2_control_type sc_control_type = { "scaled", /* name */ &sc_control_alloc, &sc_control_init, &sc_control_hadjust, &sc_control_errlevel, &control_set_driver_null, &sc_control_free }; const gsl_odeiv2_control_type *gsl_odeiv2_control_scaled = &sc_control_type; gsl_odeiv2_control * gsl_odeiv2_control_scaled_new (double eps_abs, double eps_rel, double a_y, double a_dydt, const double scale_abs[], size_t dim) { gsl_odeiv2_control *c = gsl_odeiv2_control_alloc (gsl_odeiv2_control_scaled); int status = gsl_odeiv2_control_init (c, eps_abs, eps_rel, a_y, a_dydt); if (status != GSL_SUCCESS) { gsl_odeiv2_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; } gsl-doc-2.3/ode-initval2/cstd.c0000664000175000017500000001217312616157443014375 0ustar eddedd/* ode-initval2/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "control_utils.c" 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 int std_control_errlevel (void *vstate, const double y, const double dydt, const double h, const size_t ind, double *errlev) { 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; *errlev = eps_rel * (a_y * fabs (y) + a_dydt * fabs (h * dydt)) + eps_abs; if (*errlev <= 0.0) { GSL_ERROR_NULL ("errlev <= zero", GSL_ESANITY); } return GSL_SUCCESS; } static void std_control_free (void *vstate) { std_control_state_t *state = (std_control_state_t *) vstate; free (state); } static const gsl_odeiv2_control_type std_control_type = { "standard", /* name */ &std_control_alloc, &std_control_init, &std_control_hadjust, &std_control_errlevel, &control_set_driver_null, &std_control_free }; const gsl_odeiv2_control_type *gsl_odeiv2_control_standard = &std_control_type; gsl_odeiv2_control * gsl_odeiv2_control_standard_new (double eps_abs, double eps_rel, double a_y, double a_dydt) { gsl_odeiv2_control *c = gsl_odeiv2_control_alloc (gsl_odeiv2_control_standard); int status = gsl_odeiv2_control_init (c, eps_abs, eps_rel, a_y, a_dydt); if (status != GSL_SUCCESS) { gsl_odeiv2_control_free (c); GSL_ERROR_NULL ("error trying to initialize control", status); } return c; } gsl_odeiv2_control * gsl_odeiv2_control_y_new (double eps_abs, double eps_rel) { return gsl_odeiv2_control_standard_new (eps_abs, eps_rel, 1.0, 0.0); } gsl_odeiv2_control * gsl_odeiv2_control_yp_new (double eps_abs, double eps_rel) { return gsl_odeiv2_control_standard_new (eps_abs, eps_rel, 0.0, 1.0); } gsl-doc-2.3/ode-initval2/msbdf.c0000664000175000017500000013104412616157443014532 0ustar eddedd/* ode-initval2/msbdf.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* A variable-coefficient linear multistep backward differentiation formula (BDF) method in Nordsieck form. This stepper uses the explicit BDF formula as predictor and implicit BDF formula as corrector. A modified Newton iteration method is used to solve the system of non-linear equations. Method order varies dynamically between 1 and 5. References: Byrne, G. D., and Hindmarsh, A. C., A Polyalgorithm for the Numerical Solution of Ordinary Differential Equations, ACM Trans. Math. Software, 1 (1975), pp. 71-96. Brown, P. N., Byrne, G. D., and Hindmarsh, A. C., VODE: A Variable-coefficient ODE Solver, SIAM J. Sci. Stat. Comput. 10, (1989), pp. 1038-1051. Hindmarsh, A. C., Brown, P. N., Grant, K. E., Lee, S. L., Serban, R., Shumaker, D. E., and Woodward, C. S., SUNDIALS: Suite of Nonlinear and Differential/Algebraic Equation Solvers, ACM Trans. Math. Software 31 (2005), pp. 363-396. Note: The algorithms have been adapted for GSL ode-initval2 framework. */ #include #include #include #include #include #include #include #include #include "odeiv_util.h" /* Maximum order of BDF methods */ #define MSBDF_MAX_ORD 5 /* Steps until Jacobian evaluation is forced */ #define MSBDF_JAC_WAIT 50 /* Steps until iteration matrix M evaluation is forced */ #define MSBDF_M_WAIT 20 typedef struct { /* Nordsieck history matrix. Includes concatenated Nordsieck vectors [y_n, h*y_n', (h^2/2!)*y_n'', ..., (h^ord/ord!)*d^(ord)(y_n)]. Nordsieck vector number i is located at z[i*dim] (i=0..ord). */ double *z; double *zbackup; /* backup of Nordsieck matrix */ double *ytmp; /* work area */ double *ytmp2; /* work area */ double *l; /* polynomial coefficients */ double *hprev; /* previous step sizes */ double *hprevbackup; /* backup of hprev */ size_t *ordprev; /* orders of previous calls */ size_t *ordprevbackup; /* backup of ordprev */ double *errlev; /* desired error level of y */ gsl_vector *abscor; /* absolute y values for correction */ gsl_vector *abscorscaled; /* scaled abscor for order evaluation */ gsl_vector *relcor; /* relative y values for correction */ gsl_vector *svec; /* saved abscor & work area */ gsl_vector *tempvec; /* work area */ const gsl_odeiv2_driver *driver; /* pointer to gsl_odeiv2_driver object */ gsl_matrix *dfdy; /* Jacobian */ double *dfdt; /* storage for time derivative of f */ gsl_matrix *M; /* Newton iteration matrix */ gsl_permutation *p; /* permutation for LU decomposition of M */ gsl_vector *rhs; /* right hand side equations (-G) */ long int ni; /* stepper call counter */ size_t ord; /* current order of method */ double tprev; /* t point of previous call */ size_t ordwait; /* counter for order change */ size_t ordwaitbackup; /* backup of ordwait */ size_t failord; /* order of convergence failure */ double failt; /* t point of convergence failure */ double ordp1coeffprev; /* saved order coefficient */ size_t nJ; /* step counter for Jacobian evaluation */ size_t nM; /* step counter for update of M */ double gammaprev; /* gamma of previous call */ double gammaprevbackup; /* backup of gammaprev */ size_t failcount; /* counter for rejected steps */ } msbdf_state_t; /* Introduce msbdf_reset for use in msbdf_alloc and _apply */ static int msbdf_reset (void *, size_t); static void * msbdf_alloc (size_t dim) { msbdf_state_t *state = (msbdf_state_t *) malloc (sizeof (msbdf_state_t)); if (state == 0) { GSL_ERROR_NULL ("failed to allocate space for msbdf_state", GSL_ENOMEM); } state->z = (double *) malloc ((MSBDF_MAX_ORD + 1) * dim * sizeof (double)); if (state->z == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for z", GSL_ENOMEM); } state->zbackup = (double *) malloc ((MSBDF_MAX_ORD + 1) * dim * sizeof (double)); if (state->zbackup == 0) { free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for zbackup", GSL_ENOMEM); } state->ytmp = (double *) malloc (dim * sizeof (double)); if (state->ytmp == 0) { free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM); } state->ytmp2 = (double *) malloc (dim * sizeof (double)); if (state->ytmp2 == 0) { free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp2", GSL_ENOMEM); } state->l = (double *) malloc ((MSBDF_MAX_ORD + 1) * sizeof (double)); if (state->l == 0) { free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for l", GSL_ENOMEM); } state->hprev = (double *) malloc (MSBDF_MAX_ORD * sizeof (double)); if (state->hprev == 0) { free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for hprev", GSL_ENOMEM); } state->hprevbackup = (double *) malloc (MSBDF_MAX_ORD * sizeof (double)); if (state->hprevbackup == 0) { free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for hprevbackup", GSL_ENOMEM); } state->ordprev = (size_t *) malloc (MSBDF_MAX_ORD * sizeof (size_t)); if (state->ordprev == 0) { free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ordprev", GSL_ENOMEM); } state->ordprevbackup = (size_t *) malloc (MSBDF_MAX_ORD * sizeof (size_t)); if (state->ordprevbackup == 0) { free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for ordprevbackup", GSL_ENOMEM); } state->errlev = (double *) malloc (dim * sizeof (double)); if (state->errlev == 0) { free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for errlev", GSL_ENOMEM); } state->abscor = gsl_vector_alloc (dim); if (state->abscor == 0) { free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for abscor", GSL_ENOMEM); } state->relcor = gsl_vector_alloc (dim); if (state->relcor == 0) { gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for relcor", GSL_ENOMEM); } state->svec = gsl_vector_alloc (dim); if (state->svec == 0) { gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for svec", GSL_ENOMEM); } state->tempvec = gsl_vector_alloc (dim); if (state->tempvec == 0) { gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for tempvec", GSL_ENOMEM); } state->dfdy = gsl_matrix_alloc (dim, dim); if (state->dfdy == 0) { gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdy", GSL_ENOMEM); } state->dfdt = (double *) malloc (dim * sizeof (double)); if (state->dfdt == 0) { gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdt", GSL_ENOMEM); } state->M = gsl_matrix_alloc (dim, dim); if (state->M == 0) { free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for M", GSL_ENOMEM); } state->p = gsl_permutation_alloc (dim); if (state->p == 0) { gsl_matrix_free (state->M); free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for p", GSL_ENOMEM); } state->rhs = gsl_vector_alloc (dim); if (state->rhs == 0) { gsl_permutation_free (state->p); gsl_matrix_free (state->M); free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for rhs", GSL_ENOMEM); } state->abscorscaled = gsl_vector_alloc (dim); if (state->abscorscaled == 0) { gsl_vector_free (state->rhs); gsl_permutation_free (state->p); gsl_matrix_free (state->M); free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); GSL_ERROR_NULL ("failed to allocate space for abscorscaled", GSL_ENOMEM); } msbdf_reset ((void *) state, dim); state->driver = NULL; return state; } static int msbdf_failurehandler (void *vstate, const size_t dim, const double t) { /* Internal failure handler routine for msbdf. Adjusted strategy for GSL: Decrease order if this is the second time a failure has occurred at this order and point. */ msbdf_state_t *state = (msbdf_state_t *) vstate; const size_t ord = state->ord; if (ord > 1 && (ord - state->ordprev[0] == 0) && ord == state->failord && t == state->failt) { state->ord--; } /* Save information about failure */ state->failord = ord; state->failt = t; state->ni++; /* Force reinitialization if failure took place at lowest order */ if (ord == 1) { msbdf_reset (vstate, dim); } return GSL_SUCCESS; } static int msbdf_calccoeffs (const size_t ord, const size_t ordwait, const double h, const double hprev[], double l[], double *errcoeff, double *ordm1coeff, double *ordp1coeff, double *ordp2coeff, double *gamma) { /* Calculates coefficients (l) of polynomial Lambda, error and auxiliary order change evaluation coefficients. */ if (ord == 1) { l[0] = 1.0; l[1] = 1.0; *errcoeff = 0.5; *ordp1coeff = 2.0; { const double hsum = h + hprev[0]; const double a5 = -1.5; const double a6 = -1.0 - h / hsum; const double c2 = 2.0 / (1.0 - a6 + a5); *ordp2coeff = fabs (c2 * (h / hsum) * 3.0 * a5); } } else { size_t i, j; double hsum = h; double coeff1 = -1.0; double x; /* Calculate the actual polynomial coefficients (l) */ DBL_ZERO_MEMSET (l, MSBDF_MAX_ORD + 1); l[0] = 1.0; l[1] = 1.0; for (i = 2; i < ord; i++) { hsum += hprev[i - 2]; coeff1 += -1.0 / i; for (j = i; j > 0; j--) { l[j] += h / hsum * l[j - 1]; } } coeff1 += -1.0 / ord; x = -l[1] - coeff1; for (i = ord; i > 0; i--) { l[i] += l[i - 1] * x; } #ifdef DEBUG { size_t di; printf ("-- calccoeffs l: "); for (di = 0; di < ord + 1; di++) { printf ("%.5e ", l[di]); } printf ("\n"); } #endif hsum += hprev[ord - 2]; { const double coeff2 = -l[1] - h / hsum; const double a1 = 1.0 - coeff2 + coeff1; const double a2 = 1.0 + ord * a1; /* Calculate error coefficient */ *errcoeff = fabs (a1 / (coeff1 * a2)); /* Calculate auxiliary coefficients used in evaluation of change of order */ if (ordwait < 2) { const double a3 = coeff1 + 1.0 / ord; const double a4 = coeff2 + h / hsum; const double c1 = a3 / (1.0 - a4 + a3); *ordm1coeff = fabs (c1 / (x / l[ord])); *ordp1coeff = fabs (a2 / (l[ord] * (h / hsum) / x)); hsum += hprev[ord - 1]; { const double a5 = coeff1 - 1.0 / (ord + 1.0); const double a6 = coeff2 - h / hsum; const double c2 = a2 / (1.0 - a6 + a5); *ordp2coeff = fabs (c2 * (h / hsum) * (ord + 2) * a5); } } } } *gamma = h / l[1]; #ifdef DEBUG printf ("-- calccoeffs ordm1coeff=%.5e ", *ordm1coeff); printf ("ordp1coeff=%.5e ", *ordp1coeff); printf ("ordp2coeff=%.5e ", *ordp2coeff); printf ("errcoeff=%.5e\n", *errcoeff); #endif return GSL_SUCCESS; } static int msbdf_update (void *vstate, const size_t dim, gsl_matrix * dfdy, double *dfdt, const double t, const double *y, const gsl_odeiv2_system * sys, gsl_matrix * M, gsl_permutation * p, const size_t iter, size_t * nJ, size_t * nM, const double tprev, const double failt, const double gamma, const double gammaprev, const double hratio) { /* Evaluates Jacobian dfdy and updates iteration matrix M if criteria for update is met. */ /* Jacobian is evaluated - at first step - if MSBDF_JAC_WAIT steps have been made without re-evaluation - in case of a convergence failure if --- change in gamma is small, or --- convergence failure resulted in step size decrease */ const double c = 0.2; const double gammarel = fabs (gamma / gammaprev - 1.0); if (*nJ == 0 || *nJ > MSBDF_JAC_WAIT || (t == failt && (gammarel < c || hratio < 1.0))) { #ifdef DEBUG printf ("-- evaluate jacobian\n"); #endif int s = GSL_ODEIV_JA_EVAL (sys, t, y, dfdy->data, dfdt); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at jacobian function evaluation\n"); #endif return s; } /* Reset counter */ *nJ = 0; } /* Iteration matrix M (and it's LU decomposition) is generated - at first step - if MSBDF_M_WAIT steps have been made without an update - if change in gamma is significant (e.g. change in step size) - if previous step was rejected */ if (*nM == 0 || *nM > MSBDF_M_WAIT || gammarel >= c || t == tprev || t == failt) { #ifdef DEBUG printf ("-- update M, gamma=%.5e\n", gamma); #endif size_t i; gsl_matrix_memcpy (M, dfdy); gsl_matrix_scale (M, -gamma); for (i = 0; i < dim; i++) { gsl_matrix_set (M, i, i, gsl_matrix_get (M, i, i) + 1.0); } { int signum; int s = gsl_linalg_LU_decomp (M, p, &signum); if (s != GSL_SUCCESS) { return GSL_FAILURE; } } /* Reset counter */ *nM = 0; } return GSL_SUCCESS; } static int msbdf_corrector (void *vstate, const gsl_odeiv2_system * sys, const double t, const double h, const size_t dim, const double z[], const double errlev[], const double l[], const double errcoeff, gsl_vector * abscor, gsl_vector * relcor, double ytmp[], double ytmp2[], gsl_matrix * dfdy, double dfdt[], gsl_matrix * M, gsl_permutation * p, gsl_vector * rhs, size_t * nJ, size_t * nM, const double tprev, const double failt, const double gamma, const double gammaprev, const double hprev0) { /* Calculates the correction step (abscor). Equation system M = I - gamma * dfdy = -G is solved by Newton iteration. */ size_t mi, i; const size_t max_iter = 3; /* Maximum number of iterations */ double convrate = 1.0; /* convergence rate */ double stepnorm = 0.0; /* norm of correction step */ double stepnormprev = 0.0; /* previous norm value */ /* Evaluate at predicted values */ { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, ytmp); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate correction step (abscor) */ gsl_vector_set_zero (abscor); for (mi = 0; mi < max_iter; mi++) { const double safety = 0.3; const double safety2 = 0.1; /* Generate or update Jacobian and/or iteration matrix M if needed */ if (mi == 0) { int s = msbdf_update (vstate, dim, dfdy, dfdt, t + h, z, sys, M, p, mi, nJ, nM, tprev, failt, gamma, gammaprev, h / hprev0); if (s != GSL_SUCCESS) { return s; } } /* Evaluate the right hand side (-G) */ for (i = 0; i < dim; i++) { const double r = -1.0 * gsl_vector_get (abscor, i) - z[1 * dim + i] / l[1] + gamma * ytmp[i]; gsl_vector_set (rhs, i, r); } /* Solve system of equations */ { int s = gsl_linalg_LU_solve (M, p, rhs, relcor); if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at LU_solve\n"); #endif return GSL_FAILURE; } } #ifdef DEBUG { size_t di; printf ("-- dstep: "); for (di = 0; di < dim; di++) { printf ("%.5e ", gsl_vector_get (relcor, di)); } printf ("\n"); } #endif /* Add iteration results */ for (i = 0; i < dim; i++) { const double r = gsl_vector_get (abscor, i) + gsl_vector_get (relcor, i); gsl_vector_set (abscor, i, r); ytmp2[i] = z[i] + r; gsl_vector_set (relcor, i, gsl_vector_get (relcor, i) / errlev[i]); } #ifdef DEBUG { size_t di; printf ("-- abscor: "); for (di = 0; di < dim; di++) { printf ("%.5e ", gsl_vector_get (abscor, di)); } printf ("\n"); } #endif /* Convergence test. Norms used are root-mean-square norms. */ stepnorm = gsl_blas_dnrm2 (relcor) / sqrt (dim); if (mi > 0) { convrate = GSL_MAX_DBL (safety * convrate, stepnorm / stepnormprev); } else { convrate = 1.0; } { const double convtest = GSL_MIN_DBL (convrate, 1.0) * stepnorm * errcoeff / safety2; #ifdef DEBUG printf ("-- newt iter loop %d, errcoeff=%.5e, stepnorm =%.5e, convrate = %.5e, convtest = %.5e\n", (int) mi, errcoeff, stepnorm, convrate, convtest); #endif if (convtest <= 1.0) { break; } } /* Check for divergence during iteration */ { const double div_const = 2.0; if (mi > 1 && stepnorm > div_const * stepnormprev) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL, diverging Newton iteration\n"); #endif return GSL_FAILURE; } } /* Evaluate at new y */ { int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp2, ytmp); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } stepnormprev = stepnorm; } #ifdef DEBUG printf ("-- Newton iteration exit at mi=%d\n", (int) mi); #endif /* Handle convergence failure */ if (mi == max_iter) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL, max_iter reached\n"); #endif return GSL_FAILURE; } return GSL_SUCCESS; } static int msbdf_eval_order (gsl_vector * abscorscaled, gsl_vector * tempvec, gsl_vector * svec, const double errcoeff, const size_t dim, const double errlev[], const double ordm1coeff, const double ordp1coeff, const double ordp1coeffprev, const double ordp2coeff, const double hprev[], const double h, const double z[], size_t * ord) { /* Evaluates and executes change in method order (current, current-1 or current+1). Order which maximizes the step length is selected. */ size_t i; /* step size estimates at current order, order-1 and order+1 */ double ordest = 0.0; double ordm1est = 0.0; double ordp1est = 0.0; const double safety = 1e-6; const double bias = 6.0; const double bias2 = 10.0; const double min_incr = 1.5; /* Relative step length estimate for current order */ ordest = 1.0 / (pow (bias * gsl_blas_dnrm2 (abscorscaled) / sqrt (dim) * errcoeff, 1.0 / (*ord + 1)) + safety); /* Relative step length estimate for order ord - 1 */ if (*ord > 1) { for (i = 0; i < dim; i++) { gsl_vector_set (tempvec, i, z[*ord * dim + i] / errlev[i]); } ordm1est = 1.0 / (pow (bias * gsl_blas_dnrm2 (tempvec) / sqrt (dim) / ordm1coeff, 1.0 / (*ord)) + safety); } else { ordm1est = 0.0; } /* Relative step length estimate for order ord + 1 */ if (*ord < MSBDF_MAX_ORD) { const double c = -ordp1coeff / ordp1coeffprev * pow (h / hprev[1], *ord + 1); for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (svec, i) * c + gsl_vector_get (abscorscaled, i)); } ordp1est = 1.0 / (pow (bias2 * gsl_blas_dnrm2 (svec) / sqrt (dim) / ordp2coeff, 1.0 / (*ord + 2)) + safety); } else { ordp1est = 0.0; } #ifdef DEBUG printf ("-- eval_order ord=%d, ordest=%.5e, ordm1est=%.5e, ordp1est=%.5e\n", (int) *ord, ordest, ordm1est, ordp1est); #endif /* Choose order that maximises step size and increases step size markedly compared to current step */ if (ordm1est > ordest && ordm1est > ordp1est && ordm1est > min_incr) { *ord -= 1; #ifdef DEBUG printf ("-- eval_order order DECREASED to %d\n", (int) *ord); #endif } else if (ordp1est > ordest && ordp1est > ordm1est && ordp1est > min_incr) { *ord += 1; #ifdef DEBUG printf ("-- eval_order order INCREASED to %d\n", (int) *ord); #endif } return GSL_SUCCESS; } static int msbdf_check_no_order_decrease (size_t const ordprev[]) { /* Checks if order has not been decreased according to order history array. Used in stability enhancement. */ size_t i; for (i = 0; i < MSBDF_MAX_ORD - 1; i++) { if (ordprev[i + 1] > ordprev[i]) { return 0; } } return 1; } static int msbdf_check_step_size_decrease (double const hprev[]) { /* Checks if step size has decreased markedly according to step size history array. Used in stability enhancement. */ size_t i; double max = fabs (hprev[0]); const double min = fabs (hprev[0]); const double decrease_limit = 0.5; for (i = 1; i < MSBDF_MAX_ORD; i++) { const double h = fabs (hprev[i]); if (h > min && h > max) { max = h; } } if (min / max < decrease_limit) { return 1; } return 0; } static int msbdf_apply (void *vstate, size_t dim, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv2_system * sys) { /* Carries out a step by BDF linear multistep methods. */ msbdf_state_t *state = (msbdf_state_t *) vstate; double *const z = state->z; double *const zbackup = state->zbackup; double *const ytmp = state->ytmp; double *const ytmp2 = state->ytmp2; double *const l = state->l; double *const hprev = state->hprev; double *const hprevbackup = state->hprevbackup; size_t *const ordprev = state->ordprev; size_t *const ordprevbackup = state->ordprevbackup; double *const errlev = state->errlev; gsl_vector *const abscor = state->abscor; gsl_vector *const abscorscaled = state->abscorscaled; gsl_vector *const relcor = state->relcor; gsl_vector *const svec = state->svec; gsl_vector *const tempvec = state->tempvec; size_t ord = state->ord; /* order for this step */ double ordm1coeff = 0.0; double ordp1coeff = 0.0; double ordp2coeff = 0.0; double errcoeff = 0.0; /* error coefficient */ double gamma = 0.0; /* gamma coefficient */ const size_t max_failcount = 3; size_t i; #ifdef DEBUG { size_t di; printf ("msbdf_apply: t=%.5e, ord=%d, h=%.5e, y:", t, (int) ord, h); for (di = 0; di < dim; di++) { printf ("%.5e ", y[di]); } printf ("\n"); } #endif /* Check if t is the same as on previous stepper call (or last failed call). This means that calculation of previous step failed or the step was rejected, and therefore previous state will be restored or the method will be reset. */ if (state->ni > 0 && (t == state->tprev || t == state->failt)) { if (state->ni == 1) { /* No step has been accepted yet, reset method */ msbdf_reset (vstate, dim); #ifdef DEBUG printf ("-- first step was REJECTED, msbdf_reset called\n"); #endif } else { /* A succesful step has been saved, restore previous state. */ /* If previous step suggests order increase, but the step was rejected, then do not increase order. */ if (ord > ordprev[0]) { state->ord = ordprev[0]; ord = state->ord; } /* Restore previous state */ DBL_MEMCPY (z, zbackup, (MSBDF_MAX_ORD + 1) * dim); DBL_MEMCPY (hprev, hprevbackup, MSBDF_MAX_ORD); for (i = 0; i < MSBDF_MAX_ORD; i++) { ordprev[i] = ordprevbackup[i]; } state->ordwait = state->ordwaitbackup; state->gammaprev = state->gammaprevbackup; #ifdef DEBUG printf ("-- previous step was REJECTED, state restored\n"); #endif } /* If step is repeatedly rejected, then reset method */ state->failcount++; if (state->failcount > max_failcount && state->ni > 1) { msbdf_reset (vstate, dim); ord = state->ord; #ifdef DEBUG printf ("-- max_failcount reached, msbdf_reset called\n"); #endif } } else { /* The previous step was accepted. Backup current state. */ DBL_MEMCPY (zbackup, z, (MSBDF_MAX_ORD + 1) * dim); DBL_MEMCPY (hprevbackup, hprev, MSBDF_MAX_ORD); for (i = 0; i < MSBDF_MAX_ORD; i++) { ordprevbackup[i] = ordprev[i]; } state->ordwaitbackup = state->ordwait; state->gammaprevbackup = state->gammaprev; state->failcount = 0; #ifdef DEBUG if (state->ni > 0) { printf ("-- previous step was ACCEPTED, state saved\n"); } #endif } #ifdef DEBUG printf ("-- ord=%d, ni=%ld, ordwait=%d\n", (int) ord, state->ni, (int) state->ordwait); size_t di; printf ("-- ordprev: "); for (di = 0; di < MSBDF_MAX_ORD; di++) { printf ("%d ", (int) ordprev[di]); } printf ("\n"); #endif /* Get desired error levels via gsl_odeiv2_control object through driver object, which is a requirement for this stepper. */ if (state->driver == NULL) { return GSL_EFAULT; } else { size_t i; for (i = 0; i < dim; i++) { if (dydt_in != NULL) { gsl_odeiv2_control_errlevel (state->driver->c, y[i], dydt_in[i], h, i, &errlev[i]); } else { gsl_odeiv2_control_errlevel (state->driver->c, y[i], 0.0, h, i, &errlev[i]); } } } #ifdef DEBUG { size_t di; printf ("-- errlev: "); for (di = 0; di < dim; di++) { printf ("%.5e ", errlev[di]); } printf ("\n"); } #endif /* On first call initialize Nordsieck matrix */ if (state->ni == 0) { size_t i; DBL_ZERO_MEMSET (z, (MSBDF_MAX_ORD + 1) * dim); if (dydt_in != NULL) { DBL_MEMCPY (ytmp, dydt_in, dim); } else { int s = GSL_ODEIV_FN_EVAL (sys, t, y, ytmp); if (s != GSL_SUCCESS) { return s; } } DBL_MEMCPY (&z[0 * dim], y, dim); DBL_MEMCPY (&z[1 * dim], ytmp, dim); for (i = 0; i < dim; i++) { z[1 * dim + i] *= h; } } /* Stability enhancement heuristic for msbdf: If order > 1 and order has not been changed, check for decrease in step size, that is not accompanied by a decrease in method order. This condition may be indication of BDF method stability problems, a change in ODE system, or convergence problems in Newton iteration. In all cases, the strategy is to decrease method order. */ #ifdef DEBUG printf ("-- check_no_order_decrease %d, check_step_size_decrease %d\n", msbdf_check_no_order_decrease (ordprev), msbdf_check_step_size_decrease (hprev)); #endif if (ord > 1 && ord - ordprev[0] == 0 && msbdf_check_no_order_decrease (ordprev) && msbdf_check_step_size_decrease (hprev)) { state->ord--; state->ordwait = ord + 2; ord = state->ord; #ifdef DEBUG printf ("-- stability enhancement decreased order to %d\n", (int) ord); #endif } /* Sanity check */ { const int deltaord = ord - ordprev[0]; if (deltaord > 1 || deltaord < -1) { printf ("-- order change %d\n", deltaord); GSL_ERROR_NULL ("msbdf_apply too large order change", GSL_ESANITY); } /* Modify Nordsieck matrix if order or step length has been changed */ /* If order increased by 1, adjust Nordsieck matrix */ if (deltaord == 1) { if (ord > 2) { size_t i, j; double hsum = h; double coeff1 = -1.0; double coeff2 = 1.0; double hrelprev = 1.0; double hrelprod = 1.0; double hrel = 0.0; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSBDF_MAX_ORD + 1); l[2] = 1.0; for (i = 1; i < ord - 1; i++) { hsum += hprev[i]; hrel = hsum / h; hrelprod *= hrel; coeff1 -= 1.0 / (i + 1); coeff2 += 1.0 / hrel; for (j = i + 2; j > 1; j--) { l[j] *= hrelprev; l[j] += l[j - 1]; } hrelprev = hrel; } /* Scale Nordsieck matrix */ { const double c = (-coeff1 - coeff2) / hrelprod; for (i = 0; i < dim; i++) { z[ord * dim + i] = c * gsl_vector_get (abscor, i); } } for (i = 2; i < ord; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * z[ord * dim + j]; } } else { /* zero new vector for order incease from 1 to 2 */ DBL_ZERO_MEMSET (&z[ord * dim], dim); } #ifdef DEBUG printf ("-- order increase detected, Nordsieck modified\n"); #endif } /* If order decreased by 1, adjust Nordsieck matrix */ if (deltaord == -1) { size_t i, j; double hsum = 0.0; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSBDF_MAX_ORD + 1); l[2] = 1.0; for (i = 1; i < ord; i++) { hsum += hprev[i - 1]; for (j = i + 2; j > 1; j--) { l[j] *= hsum / h; l[j] += l[j - 1]; } } /* Scale Nordsieck matrix */ for (i = 2; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += -l[i] * z[(ord + 1) * dim + j]; } #ifdef DEBUG printf ("-- order decrease detected, Nordsieck modified\n"); #endif } /* Scale Nordsieck vectors if step size has been changed */ if (state->ni > 0 && h != hprev[0]) { size_t i, j; const double hrel = h / hprev[0]; double coeff = hrel; for (i = 1; i < ord + 1; i++) { for (j = 0; j < dim; j++) { z[i * dim + j] *= coeff; } coeff *= hrel; } #ifdef DEBUG printf ("-- h != hprev, Nordsieck modified\n"); #endif } /* Calculate polynomial coefficients (l), error coefficient and auxiliary coefficients */ msbdf_calccoeffs (ord, state->ordwait, h, hprev, l, &errcoeff, º1coeff, &ordp1coeff, &ordp2coeff, &gamma); /* Carry out the prediction step */ { size_t i, j, k; for (i = 1; i < ord + 1; i++) for (j = ord; j > i - 1; j--) for (k = 0; k < dim; k++) { z[(j - 1) * dim + k] += z[j * dim + k]; } #ifdef DEBUG { size_t di; printf ("-- predicted y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif } /* Calculate correction step to abscor */ { int s; s = msbdf_corrector (vstate, sys, t, h, dim, z, errlev, l, errcoeff, abscor, relcor, ytmp, ytmp2, state->dfdy, state->dfdt, state->M, state->p, state->rhs, &(state->nJ), &(state->nM), state->tprev, state->failt, gamma, state->gammaprev, hprev[0]); if (s != GSL_SUCCESS) { return s; } } { /* Add accepted final correction step to Nordsieck matrix */ size_t i, j; for (i = 0; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * gsl_vector_get (abscor, j); } #ifdef DEBUG { size_t di; printf ("---- l: "); for (di = 0; di < ord + 1; di++) { printf ("%.5e ", l[di]); } printf ("\n"); printf ("-- corrected y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif /* Derivatives at output */ if (dydt_out != NULL) { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, dydt_out); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate error estimate */ for (i = 0; i < dim; i++) { yerr[i] = fabs (gsl_vector_get (abscor, i)) * errcoeff; } #ifdef DEBUG { size_t di; printf ("-- yerr: "); for (di = 0; di < dim; di++) { printf ("%.5e ", yerr[di]); } printf ("\n"); } #endif /* Save y values */ for (i = 0; i < dim; i++) { y[i] = z[0 * dim + i]; } } /* Scale abscor with errlev for later use in norm calculations in order evaluation in msbdf_eval_order */ { size_t i; for (i = 0; i < dim; i++) { gsl_vector_set (abscorscaled, i, gsl_vector_get (abscor, i) / errlev[i]); } } /* Save items needed for evaluation of order increase on next call, if needed */ if (state->ordwait == 1 && ord < MSBDF_MAX_ORD) { size_t i; state->ordp1coeffprev = ordp1coeff; for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (abscorscaled, i)); } } /* Consider and execute order change for next step if order is unchanged. */ if (state->ordwait == 0) { if (ord - ordprev[0] == 0) { msbdf_eval_order (abscorscaled, tempvec, svec, errcoeff, dim, errlev, ordm1coeff, ordp1coeff, state->ordp1coeffprev, ordp2coeff, hprev, h, z, &(state->ord)); state->ordwait = state->ord + 2; } else { /* Postpone order evaluation if order has been modified elsewhere */ state->ordwait = 2; } } /* Save information about current step in state and update counters */ { size_t i; for (i = MSBDF_MAX_ORD - 1; i > 0; i--) { hprev[i] = hprev[i - 1]; ordprev[i] = ordprev[i - 1]; } } hprev[0] = h; ordprev[0] = ord; #ifdef DEBUG { size_t di; printf ("-- hprev: "); for (di = 0; di < MSBDF_MAX_ORD; di++) { printf ("%.5e ", hprev[di]); } printf ("\n"); } #endif state->tprev = t; state->ordwait--; state->ni++; state->gammaprev = gamma; state->nJ++; state->nM++; #ifdef DEBUG printf ("-- nJ=%d, nM=%d\n", (int) state->nJ, (int) state->nM); #endif } return GSL_SUCCESS; } static int msbdf_set_driver (void *vstate, const gsl_odeiv2_driver * d) { msbdf_state_t *state = (msbdf_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int msbdf_reset (void *vstate, size_t dim) { msbdf_state_t *state = (msbdf_state_t *) vstate; size_t i; state->ni = 0; state->ord = 1; state->ordwait = 2; state->ordwaitbackup = 2; state->failord = 0; state->failt = GSL_NAN; state->tprev = GSL_NAN; state->gammaprev = 1.0; state->gammaprevbackup = 1.0; state->nJ = 0; state->nM = 0; state->failcount = 0; state->ordp1coeffprev = 0.0; DBL_ZERO_MEMSET (state->hprev, MSBDF_MAX_ORD); DBL_ZERO_MEMSET (state->hprevbackup, MSBDF_MAX_ORD); DBL_ZERO_MEMSET (state->z, (MSBDF_MAX_ORD + 1) * dim); DBL_ZERO_MEMSET (state->zbackup, (MSBDF_MAX_ORD + 1) * dim); for (i = 0; i < MSBDF_MAX_ORD; i++) { state->ordprev[i] = 1; state->ordprevbackup[i] = 1; } #ifdef DEBUG printf ("-- msbdf_reset called\n"); #endif return GSL_SUCCESS; } static unsigned int msbdf_order (void *vstate) { msbdf_state_t *state = (msbdf_state_t *) vstate; return state->ord; } static void msbdf_free (void *vstate) { msbdf_state_t *state = (msbdf_state_t *) vstate; gsl_vector_free (state->rhs); gsl_permutation_free (state->p); gsl_matrix_free (state->M); free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); gsl_vector_free (state->abscorscaled); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); } static const gsl_odeiv2_step_type msbdf_type = { "msbdf", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &msbdf_alloc, &msbdf_apply, &msbdf_set_driver, &msbdf_reset, &msbdf_order, &msbdf_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_msbdf = &msbdf_type; gsl-doc-2.3/ode-initval2/Makefile.in0000644000175000017500000010724013022372406015325 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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-initval2 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslodeiv2_la_LIBADD = am_libgslodeiv2_la_OBJECTS = control.lo cstd.lo cscal.lo evolve.lo \ step.lo rk2.lo rk2imp.lo rk4.lo rk4imp.lo rkf45.lo rk8pd.lo \ rkck.lo bsimp.lo rk1imp.lo msadams.lo msbdf.lo driver.lo libgslodeiv2_la_OBJECTS = $(am_libgslodeiv2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslodeiv2.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 AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslodeiv2_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslodeiv2_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslodeiv2.la pkginclude_HEADERS = gsl_odeiv2.h AM_CPPFLAGS = -I$(top_srcdir) libgslodeiv2_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c rk1imp.c msadams.c msbdf.c driver.c noinst_HEADERS = odeiv_util.h step_utils.c rksubs.c modnewton1.c control_utils.c TESTS = $(check_PROGRAMS) test_LDADD = libgslodeiv2.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 .log .o .obj .test .test$(EXEEXT) .trs $(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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ode-initval2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ode-initval2/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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslodeiv2.la: $(libgslodeiv2_la_OBJECTS) $(libgslodeiv2_la_DEPENDENCIES) $(EXTRA_libgslodeiv2_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslodeiv2_la_OBJECTS) $(libgslodeiv2_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsimp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msadams.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msbdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk1imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-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: gsl-doc-2.3/ode-initval2/ChangeLog0000664000175000017500000003011512616157443015042 0ustar eddedd2013-06-08 Tuomo Keskitalo * driver.c: Removed redundant if clause. Thanks to David Binderman for the report! 2013-01-27 Tuomo Keskitalo * msbdf.c: Corrected bug which enabled order to be changed by two (first by stability enhancement, then by order evaluation after a rejected step). Thanks for Frantisek Kluknavsky and Andreas Schwab for bug reports! * msbdf.c: Added more state variables explicitly to be reset in msbdf_reset. *msbdf.c: Added abscorscaled to remove division of abscor for use in msbdf_eval_order and subsequent backwards multiplication. *test.c: test_extreme_problems: Increased ringmod case tolerances from 1e-7 to 1e-12 to increase precision. Because that increases computational burden, I also decreased end time from 1e-3 to 1e-5. That decreased the acidity of the test significantly, but the test case is now more appropriate for normal "make check". Thanks for Frantisek Kluknavsky for pointing out bad design of the test case. 2012-09-10 Rhys Ulerich * test.c: Correct two out-of-order declarations. Thanks to Brian Gladman for spotting the problem. 2012-03-10 Tuomo Keskitalo * driver.c: Added function gsl_odeiv2_driver_reset_hstart to allow resetting step size, possibly change its sign, too. Check for non-zero hstart in initializations. * test.c: Modified test_driver to carry out tests with all steppers. Small printout changes. 2012-01-21 Tuomo Keskitalo * rkf45.c: Bug correction: Set gives_exact_dydt_out to 1 in rkf45_type 2012-01-14 Tuomo Keskitalo * evolve.c: Modified initial derivative evaluation in evolve_apply to reuse previously calculated values. This saves calls to the user function. Thanks for Illes Farkas for pointing out redundant function calls! 2011-06-28 Brian Gough * rk4imp.c (rk4imp_apply): use M_SQRT3 instead of sqrt(3) in array initialiser. 2011-05-02 Brian Gough * gsl_odeiv2.h: fix header guard to __GSL_ODEIV2_H__ 2011-05-01 Tuomo Keskitalo * Replaced ChangeLog with contents of ode-initval2 development log file (ChangeLog-odeiv2_development) and reformatted the log file. 2010-10-16 Tuomo Keskitalo * Modified evolve and driver so that when user function returns GSL_EBADFUNC, then ode-initval2 functions return immediately with that same return value. * Corrected bug in msadams for saving ordm1coeff to state. Thanks to Andrew Benson for pointing out this bug! 2010-10-10 Tuomo Keskitalo * driver.c: Corrected error in driver_evolve_apply, integration to negative direction should work now. * Added evolve_apply_fixed_step and driver_apply_fixed_step for users who want to use a constant step size to evolve the system. * test.c: added test cases for driver (negative evolution, apply_fixed_step). * gsl_odeiv2.h: cleaning and add apply_fixed_step functions. * doc/ode-initval.texi: Replaced derivative apostrophe with \prime (because my new system fails to make ps otherwise). Added new documentation about apply_fixed_step functions. 2010-10-09 Tuomo Keskitalo * ode-initval2 bzr development branch now at savannah: http://bzr.savannah.gnu.org/r/gsl/ode-initval2/ 2010-01-02 Tuomo Keskitalo * Changes from ode-initval2-0.9 to ode-initval2-1.0: * Removed set_control member from step object and added a set_driver member to evolve, control and step objects, so that the driver object and consequently evolve, control and step objects are all accessible from another. Currently only some steppers utilize this. They access the control_errlevel function via state->driver->c instead of state->control. This modification to the framework enables implementation of more efficient ODE solvers, which utilize communication among evolve, control and stepper objects. This also means that some steppers now require a driver object, and it is best to use those stepper methods through driver object functions. * cstd.c and cscal.c: Added a sanity check for errlev <= 0 * run indent -gnu -nut for *.c *.h * driver.c: added function odeiv2_driver_alloc_standard_new and odeiv2_driver_alloc_yp_new * driver.c: changed n and nmax in driver struct to unsigned long int * modified documentation accordingly with small nomenclature changes and made year updates to source files 2009-11-01 Tuomo Keskitalo * Merged with master and modified source to be published as a package for gsl-1.13. 2009-05-09 Tuomo Keskitalo * Agreed with Brian Gough that the modification I've made cannot be incorporated to GSL until a major version number change, due to changes in API. * Replated rk2imp with imprk2 and rk4imp with imprk4. Also renamed impeuler to rk1imp for consistency. * Deleted steppers that are deprecated considering new major release: gear1, gear2, and rk2simp. Modified test.c accordingly. 2009-05-01 Tuomo Keskitalo * Merged with master (evolve.c and test.c needed some manual work). * driver.c: Modified alloc-functions to minimal interface, added set_hmax, set_nmax and set_hmin functions. * test.c: Added test for minimum allowed step size. Applied indent -gnu -nut. * doc/ode-initval.texi: Updated documentation, added Driver section, updated examples. 2009-04-05 Tuomo Keskitalo * Several uninitialized variable corrections from Brian Gough added * modnewton1, impeuler, imprk2, imprk4: removed unneeded arguments from solve and init * msadams and msbdf modifications: * added ordprevbackup, ordwaitbackup (backups) and failcount (to detect repeated steps rejections). * added checks to make sure order is not changed by more than one order. Added sanity check to catch it. * corrected failure and rejection handling for first step * Added a heuristic stability enhancement for msbdf. This is yet to be tested in practice. * test.c: Added more benchmark test cases. The results seem sensible. * test.c: Note for benchmark_precision: msbdf performs badly in rhs_func_exp. Newton iteration starts to fail to converge at some point, and this forces very small step sizes to be used. I currently think that this is not a bug, but that msbdf is just not suitable for this problem. I think that msbdf's prediction step does not give a good initial guess for Newton iteration in this case. * I tried to increase max_iter in msbdf from 3 to 7 (value used in modnewton1), and as a result, the performance was better for this case (Newton iteration convergence was better). However, I would not increase max_iter, because the default value of 3 is the value used by the authors in the references, and because it would decrease the efficiency of msbdf (method would use more function evaluations per step, and convergence might still not be achieved). It is best to useanother stepper in this kind of a case. 2009-02-28 Tuomo Keskitalo * new stepper: msbdf. This is a variable-coefficient linear multistep backward differentiation formula (BDF) method in Nordsieck form. It appears to handle stiff cases well and it is efficient! * test.c: Ordered functions in file. Added extreme test case. * modnewton1: Convergence test now takes the desired error level via control object into account. Modified steppers that use modnewton1 accordingly. * modnewton1: Removed reuse_decomp. The variable was useless since iteration matrix is reconstructed at each stepper call. * modnewton1: Dropped max_iter from 10 to 7. Hairer and Wanner suggests a "relatively high number", but many iterations per step is costly. * steppers that use step doubling for error estimates: Introduced constant GSL_ODEIV_ERR_SAFETY in gsl_odeiv.h that is used to multiply the error estimates (yerr). This way user can modify this coefficient in one place if a change is wanted. * driver.c: This is a high level wrapper for ode-initval, which was wished for in TODO. Added test_driver to test.c to test it. Is this functionality enough? * ode-initval.texi: Added documentation for new steppers. Moved note about user error codes to system definition. * Some finetuning / code cleanup. 2009-01-21 Tuomo Keskitalo * New explicit stepper: msadams (An explicit variable-coefficient linear multistep Adams method in Nordsieck form). Functional iteration is used to solve the non-linear equation system. The algorithms described in the references (see msadams.c) have been adapted to fit GSL odeiv framework. Currently this is beta, but the stepper now passes the odeiv test suite. * control.c, cstd.c, cscal.c: Added errlev function which calculates desired error level. This is used in masadams (and can be used in imp* steppers, too) to control accuracy of functional iteration. User must call gsl_odeiv_step_set_control after allocating step and control objects to pass the information about control object to stepper. This change (or something similar) is needed to pass tolerance for the stepper routines that need it. Modified stepper routines accordingly. * evolve.c: Changed the step length scaling coefficient for stepper failure from 0.1 to 0.5, because msadams seems to cope much better with this change in stiff[0,1] test case. * gsl_odeiv.h: gsl_odeiv_control and control_type introduced earlier because gsl_odeiv_step_type now refers to it. 2008-11-01 Tuomo Keskitalo * New implicit solvers: imprk4 (replaces imprk42 in previous test package), imprk2 (replaces imprk21 in previous test package) and impeuler, which use modified Newton iteration to solve the implicit equations. I decided to dump imprk42 and imprk21 because I was unsure how to calculate the error estimates for them. I think that these new implicit methods could be used instead of rk4imp, rk2imp, gear2 and gear1, which use functional iteration (which is inefficient for stiff problems.) However, even these new solvers can not be used efficiently for truly nasty stiff problems, and better solvers are still needed. * modnewton1.c: a modified Newton solver for solution of non-linear equations of implicit solvers. Jacobian evaluation has been moved from modnewton1 to imprk2, imprk4 and impeuler. * evolve.c: modification to decrease step size if stepper fails, instead of giving up immediately. * evolve.c: A bug fix: Exit with GSL_FAILURE if step size reaches machine precision instead of continuing with old step size. * test.c: added Robertson stiff test * test.c: embedded test_oregonator to test_compare_stiff_probelms to test several stiff problems. Note: the tested integration interval is rather short due to inefficiency of solvers other than bsimp in these problems. * test.c: modified test_compare_vanderpol and test_compare_stiff_problems to check against results from first ode-solver. Changed rk4 or bsimp to first place. * test.c: modified stepfn and stepfn2 and expanded these to be tested with all explicit solvers * test.c: removed stepfn3 and added test_broken and test_stepsize_fail to check that evolve decreases step size below machine precision and exits with a failure code in the end if user functions fail continuously. * Changes in ode-initval.texi: * removed untrue sentence concerning stepping functions: "The step-size @var{h} will be set to the step-size which caused the error." * Changed gsl_odeiv_system variable name from dydt to sys for clarity * added "explicit" or "implicit" to stepper introductions for clarity * reformulated description of evolve_apply and step_apply and made changes to reflect the modifications to the code. * clarified the point on integrating over discontinuities. It is best to integrate in sequences. * removed the text suggesting the user to force a step size to integrate over the edge of a discontinuity. The applicability of this kind of a numerical tweak depends on the case, and should in my opinion not to be included in a reference book. gsl-doc-2.3/ode-initval2/step.c0000664000175000017500000000504412616157443014412 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include gsl_odeiv2_step * gsl_odeiv2_step_alloc (const gsl_odeiv2_step_type * T, size_t dim) { gsl_odeiv2_step *s = (gsl_odeiv2_step *) malloc (sizeof (gsl_odeiv2_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_odeiv2_step_name (const gsl_odeiv2_step * s) { return s->type->name; } unsigned int gsl_odeiv2_step_order (const gsl_odeiv2_step * s) { return s->type->order (s->state); } int gsl_odeiv2_step_apply (gsl_odeiv2_step * s, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv2_system * dydt) { return s->type->apply (s->state, s->dimension, t, h, y, yerr, dydt_in, dydt_out, dydt); } int gsl_odeiv2_step_reset (gsl_odeiv2_step * s) { return s->type->reset (s->state, s->dimension); } void gsl_odeiv2_step_free (gsl_odeiv2_step * s) { RETURN_IF_NULL (s); s->type->free (s->state); free (s); } int gsl_odeiv2_step_set_driver (gsl_odeiv2_step * s, const gsl_odeiv2_driver * d) { if (d != NULL) { s->type->set_driver (s->state, d); } else { GSL_ERROR_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/rksubs.c0000664000175000017500000000307712616157443014754 0ustar eddedd/* ode-initval2/rksubs.c * * Copyright (C) 2008, 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 rksubs (double y[], const double h, const double y0[], const double fY[], const double b[], const size_t stage, const size_t dim) { /* The final substitution step in Runge-Kutta equation: Calculates new values y by substituting the value of step size (h), current initial values of y (y0), function f values at Runge-Kutta points (fY), Runge-Kutta b-coefficients (b) and method stage (stage) into the equation y = y0 + h * sum j=1..stage (b_j * fY_j) dim is the number of ODEs. */ size_t i, j; for (i = 0; i < dim; i++) { y[i] = 0.0; for (j = 0; j < stage; j++) y[i] += b[j] * fY[j * dim + i]; } for (i = 0; i < dim; i++) { y[i] *= h; y[i] += y0[i]; } return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/step_utils.c0000664000175000017500000000175012616157443015632 0ustar eddedd/* ode-initval2/step_utils.c * * Copyright (C) 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 stepper_set_driver_null (void *vstate, const gsl_odeiv2_driver * d) { /* Dummy set function for those steppers that do not need pointer to driver object. */ return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/rkck.c0000664000175000017500000002071312616157443014371 0ustar eddedd/* ode-initval2/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include "odeiv_util.h" #include "step_utils.c" /* 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_odeiv2_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_odeiv2_step_type rkck_type = { "rkck", /* name */ 1, /* can use dydt_in */ 1, /* gives exact dydt_out */ &rkck_alloc, &rkck_apply, &stepper_set_driver_null, &rkck_reset, &rkck_order, &rkck_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rkck = &rkck_type; gsl-doc-2.3/ode-initval2/control.c0000664000175000017500000000553512616157443015124 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include gsl_odeiv2_control * gsl_odeiv2_control_alloc (const gsl_odeiv2_control_type * T) { gsl_odeiv2_control *c = (gsl_odeiv2_control *) malloc (sizeof (gsl_odeiv2_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_odeiv2_control_init (gsl_odeiv2_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_odeiv2_control_free (gsl_odeiv2_control * c) { RETURN_IF_NULL (c); c->type->free (c->state); free (c); } const char * gsl_odeiv2_control_name (const gsl_odeiv2_control * c) { return c->type->name; } int gsl_odeiv2_control_hadjust (gsl_odeiv2_control * c, gsl_odeiv2_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); } int gsl_odeiv2_control_errlevel (gsl_odeiv2_control * c, const double y, const double dydt, const double h, const size_t ind, double *errlev) { return c->type->errlevel (c->state, y, dydt, h, ind, errlev); } int gsl_odeiv2_control_set_driver (gsl_odeiv2_control * c, const gsl_odeiv2_driver * d) { if (d != NULL) { c->type->set_driver (c->state, d); } else { GSL_ERROR_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-doc-2.3/ode-initval2/modnewton1.c0000664000175000017500000002571612616157443015542 0ustar eddedd/* ode-initval2/modnewton1.c * * Copyright (C) 2008, 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* A modified Newton iteration method for solving non-linear equations in implicit Runge-Kutta methods. */ /* References: Ascher, U.M., Petzold, L.R., Computer methods for ordinary differential and differential-algebraic equations, SIAM, Philadelphia, 1998. ISBN 0898714125, 9780898714128 Hairer, E., Wanner, G., Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems, Springer, 1996. ISBN 3540604529, 9783540604525 */ #include #include #include #include #include #include #include #include #include "odeiv_util.h" typedef struct { /* iteration matrix I - h A (*) J */ gsl_matrix *IhAJ; /* permutation for LU-decomposition */ gsl_permutation *p; /* difference vector for kth Newton iteration */ gsl_vector *dYk; /* scaled dYk with desired error level */ gsl_vector *dScal; /* current Runge-Kutta points (absolute values) */ double *Yk; /* function values at points Yk */ double *fYk; /* right hand side of Newton iteration formula */ gsl_vector *rhs; /* stopping criterion value from previous step */ double eeta_prev; } modnewton1_state_t; static void * modnewton1_alloc (size_t dim, size_t stage) { modnewton1_state_t *state = (modnewton1_state_t *) malloc (sizeof (modnewton1_state_t)); if (state == 0) { GSL_ERROR_NULL ("failed to allocate space for modnewton1_state_t", GSL_ENOMEM); } state->IhAJ = gsl_matrix_alloc (dim * stage, dim * stage); if (state->IhAJ == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for IhAJ", GSL_ENOMEM); } state->p = gsl_permutation_alloc (dim * stage); if (state->p == 0) { gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for p", GSL_ENOMEM); } state->dYk = gsl_vector_alloc (dim * stage); if (state->dYk == 0) { gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for dYk", GSL_ENOMEM); } state->dScal = gsl_vector_alloc (dim * stage); if (state->dScal == 0) { gsl_vector_free (state->dYk); gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for dScal", GSL_ENOMEM); } state->Yk = (double *) malloc (dim * stage * sizeof (double)); if (state->Yk == 0) { gsl_vector_free (state->dScal); gsl_vector_free (state->dYk); gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for Yk", GSL_ENOMEM); } state->fYk = (double *) malloc (dim * stage * sizeof (double)); if (state->fYk == 0) { free (state->Yk); gsl_vector_free (state->dScal); gsl_vector_free (state->dYk); gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for Yk", GSL_ENOMEM); } state->rhs = gsl_vector_alloc (dim * stage); if (state->rhs == 0) { free (state->fYk); free (state->Yk); gsl_vector_free (state->dScal); gsl_vector_free (state->dYk); gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); GSL_ERROR_NULL ("failed to allocate space for rhs", GSL_ENOMEM); } state->eeta_prev = GSL_DBL_MAX; return state; } static int modnewton1_init (void *vstate, const gsl_matrix * A, const double h, const gsl_matrix * dfdy, const gsl_odeiv2_system * sys) { /* Initializes the method by forming the iteration matrix IhAJ and generating its LU-decomposition */ modnewton1_state_t *state = (modnewton1_state_t *) vstate; gsl_matrix *const IhAJ = state->IhAJ; gsl_permutation *const p = state->p; const size_t dim = sys->dimension; const size_t stage = A->size1; state->eeta_prev = GSL_DBL_MAX; /* Generate IhAJ */ { size_t i, j, k, m; for (i = 0; i < dim; i++) for (j = 0; j < dim; j++) for (k = 0; k < stage; k++) for (m = 0; m < stage; m++) { size_t x = dim * k + i; size_t y = dim * m + j; if (x != y) gsl_matrix_set (IhAJ, x, y, -h * gsl_matrix_get (A, k, m) * gsl_matrix_get (dfdy, i, j)); else gsl_matrix_set (IhAJ, x, y, 1.0 - h * gsl_matrix_get (A, k, m) * gsl_matrix_get (dfdy, i, j)); } } /* decompose */ { int signum; int s = gsl_linalg_LU_decomp (IhAJ, p, &signum); if (s != GSL_SUCCESS) return s; } return GSL_SUCCESS; } static int modnewton1_solve (void *vstate, const gsl_matrix * A, const double c[], const double t, const double h, const double y0[], const gsl_odeiv2_system * sys, double YZ[], const double errlev[]) { /* Solves the non-linear equation system resulting from implicit Runge-Kutta methods by a modified Newton iteration. The modified Newton iteration with this problem is stated in the form IhAJ * dYk = rhs in which IhAJ is the iteration matrix: IhAJ = (I - hA (*) J) in which (*) is the Kronecker matrix product (size of IhAJ = dim*stage, dim*stage), dYk is the Runge-Kutta point (Y) difference vector for kth Newton iteration: dYk = Y(k+1) - Y(k), and rhs = Y(k) - y0 - h * sum j=1..stage (a_j * f(Y(k))) This function solves dYk by LU-decomposition of IhAJ with partial pivoting. */ modnewton1_state_t *state = (modnewton1_state_t *) vstate; gsl_matrix *const IhAJ = state->IhAJ; gsl_permutation *const p = state->p; gsl_vector *const dYk = state->dYk; double *const Yk = state->Yk; double *const fYk = state->fYk; gsl_vector *const rhs = state->rhs; double *const eeta_prev = &(state->eeta_prev); gsl_vector *const dScal = state->dScal; const size_t dim = sys->dimension; const size_t stage = A->size1; int status = GSL_CONTINUE; /* Convergence status for Newton iteration */ /* Set starting values for iteration. Use starting values of Y(k) = y0. FIXME: Implement better initial guess described in Hairer and Wanner. */ { size_t j, m; gsl_vector_set_zero (dYk); for (j = 0; j < stage; j++) for (m = 0; m < dim; m++) Yk[j * dim + m] = y0[m]; } /* Loop modified Newton iterations */ { size_t iter = 0; size_t j, m, n; /* Maximum number of Newton iterations. */ const size_t max_iter = 7; double dScal_norm = 0.0; /* Newton iteration step length */ double dScal_norm_prev = 0.0; /* Previous dScal_norm */ while (status == GSL_CONTINUE && iter < max_iter) { iter++; /* Update Y(k) and evaluate function */ for (j = 0; j < stage; j++) { for (m = 0; m < dim; m++) { Yk[j * dim + m] += gsl_vector_get (dYk, j * dim + m); } { int s = GSL_ODEIV_FN_EVAL (sys, t + c[j] * h, &Yk[j * dim], &fYk[j * dim]); if (s != GSL_SUCCESS) { return s; } } } /* Calculate rhs */ for (j = 0; j < stage; j++) for (m = 0; m < dim; m++) { double sum = 0; for (n = 0; n < stage; n++) sum += gsl_matrix_get (A, j, n) * fYk[n * dim + m]; gsl_vector_set (rhs, j * dim + m, -1.0 * Yk[j * dim + m] + y0[m] + h * sum); } /* Solve dYk */ { int s = gsl_linalg_LU_solve (IhAJ, p, rhs, dYk); if (s != GSL_SUCCESS) { return s; } } /* Evaluate convergence according to method by Hairer and Wanner, section IV.8. The iteration step is normalized by desired error level before calculation of the norm, to take the tolerance on each component of y into account. */ { /* relative change in two Newton iteration steps */ double theta_k; /* transformation of theta_k */ double eeta_k = 0.0; for (j = 0; j < stage; j++) for (m = 0; m < dim; m++) { gsl_vector_set (dScal, j * dim + m, gsl_vector_get (dYk, j * dim + m) / errlev[m]); } dScal_norm_prev = dScal_norm; dScal_norm = gsl_blas_dnrm2 (dScal); theta_k = dScal_norm / dScal_norm_prev; if (iter > 1) { /* check for increase in step size, which indicates divergence */ if (theta_k >= 1.0) { return GSL_FAILURE; } eeta_k = theta_k / (1.0 - theta_k); } else { eeta_k = pow (GSL_MAX_DBL (*eeta_prev, GSL_DBL_EPSILON), 0.8); } *eeta_prev = eeta_k; if (eeta_k * dScal_norm < 1.0) { status = GSL_SUCCESS; } } } } /* No convergence reached within allowed iterations */ if (status != GSL_SUCCESS) { return GSL_FAILURE; } /* Give solution in YZ */ else { size_t j, m; for (j = 0; j < stage; j++) for (m = 0; m < dim; m++) YZ[j * dim + m] = Yk[j * dim + m] + gsl_vector_get (dYk, j * dim + m); return status; } } static void modnewton1_free (void *vstate) { modnewton1_state_t *state = (modnewton1_state_t *) vstate; gsl_vector_free (state->rhs); free (state->fYk); free (state->Yk); gsl_vector_free (state->dScal); gsl_vector_free (state->dYk); gsl_permutation_free (state->p); gsl_matrix_free (state->IhAJ); free (state); } gsl-doc-2.3/ode-initval2/rk1imp.c0000664000175000017500000002741012616157443014643 0ustar eddedd/* ode-initval2/rk1imp.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Implicit Euler a.k.a backward Euler method. */ /* Reference: Ascher, U.M., Petzold, L.R., Computer methods for ordinary differential and differential-algebraic equations, SIAM, Philadelphia, 1998. */ #include #include #include #include #include #include #include "odeiv_util.h" #include "rksubs.c" #include "modnewton1.c" /* Stage of method */ #define RK1IMP_STAGE 1 typedef struct { gsl_matrix *A; /* Runge-Kutta coefficients */ double *y_onestep; /* Result with one step */ double *y_twostep; /* Result with two half steps */ double *ytmp; /* Temporary work space */ double *y_save; /* Backup space */ double *YZ; /* Runge-Kutta points */ double *fYZ; /* Derivatives at YZ */ gsl_matrix *dfdy; /* Jacobian matrix */ double *dfdt; /* time derivative of f */ modnewton1_state_t *esol; /* nonlinear equation solver */ double *errlev; /* desired error level of y */ const gsl_odeiv2_driver *driver; /* pointer to driver object */ } rk1imp_state_t; static void * rk1imp_alloc (size_t dim) { rk1imp_state_t *state = (rk1imp_state_t *) malloc (sizeof (rk1imp_state_t)); if (state == 0) { GSL_ERROR_NULL ("failed to allocate space for rk1imp_state", GSL_ENOMEM); } state->A = gsl_matrix_alloc (RK1IMP_STAGE, RK1IMP_STAGE); if (state->A == 0) { free (state); GSL_ERROR_NULL ("failed to allocate space for A", GSL_ENOMEM); } state->y_onestep = (double *) malloc (dim * sizeof (double)); if (state->y_onestep == 0) { gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->y_twostep = (double *) malloc (dim * sizeof (double)); if (state->y_twostep == 0) { free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM); } state->ytmp = (double *) malloc (dim * sizeof (double)); if (state->ytmp == 0) { free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM); } state->y_save = (double *) malloc (dim * sizeof (double)); if (state->y_save == 0) { free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for y_save", GSL_ENOMEM); } state->YZ = (double *) malloc (dim * RK1IMP_STAGE * sizeof (double)); if (state->YZ == 0) { free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for YZ", GSL_ENOMEM); } state->fYZ = (double *) malloc (dim * RK1IMP_STAGE * sizeof (double)); if (state->fYZ == 0) { free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for fYZ", GSL_ENOMEM); } state->dfdt = (double *) malloc (dim * sizeof (double)); if (state->dfdt == 0) { free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdt", GSL_ENOMEM); } state->dfdy = gsl_matrix_alloc (dim, dim); if (state->dfdy == 0) { free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for dfdy", GSL_ENOMEM); } state->esol = modnewton1_alloc (dim, RK1IMP_STAGE); if (state->esol == 0) { gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for esol", GSL_ENOMEM); } state->errlev = (double *) malloc (dim * sizeof (double)); if (state->errlev == 0) { modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); GSL_ERROR_NULL ("failed to allocate space for errlev", GSL_ENOMEM); } state->driver = NULL; return state; } static int rk1imp_apply (void *vstate, size_t dim, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv2_system * sys) { /* Makes an implicit Euler step with size h and estimates the local error of the step by step doubling. */ rk1imp_state_t *state = (rk1imp_state_t *) vstate; double *const y_onestep = state->y_onestep; double *const y_twostep = state->y_twostep; double *const ytmp = state->ytmp; double *const y_save = state->y_save; double *const YZ = state->YZ; double *const fYZ = state->fYZ; gsl_matrix *const dfdy = state->dfdy; double *const dfdt = state->dfdt; double *const errlev = state->errlev; const modnewton1_state_t *esol = state->esol; /* Runge-Kutta coefficients */ gsl_matrix *A = state->A; const double b[] = { 1.0 }; const double c[] = { 1.0 }; gsl_matrix_set (A, 0, 0, 1.0); if (esol == NULL) { GSL_ERROR ("no non-linear equation solver speficied", GSL_EINVAL); } /* Get desired error levels via gsl_odeiv2_control object through driver object, which is a requirement for this stepper. */ if (state->driver == NULL) { return GSL_EFAULT; } else { size_t i; for (i = 0; i < dim; i++) { if (dydt_in != NULL) { gsl_odeiv2_control_errlevel (state->driver->c, y[i], dydt_in[i], h, i, &errlev[i]); } else { gsl_odeiv2_control_errlevel (state->driver->c, y[i], 0.0, h, i, &errlev[i]); } } } /* Evaluate Jacobian for modnewton1 */ { int s = GSL_ODEIV_JA_EVAL (sys, t, y, dfdy->data, dfdt); if (s != GSL_SUCCESS) { return s; } } /* Calculate a single step with size h */ { int s = modnewton1_init ((void *) esol, A, h, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } { int s = modnewton1_solve ((void *) esol, A, c, t, h, y, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { int s = GSL_ODEIV_FN_EVAL (sys, t + c[0] * h, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { int s = rksubs (y_onestep, h, y, fYZ, b, RK1IMP_STAGE, dim); if (s != GSL_SUCCESS) return s; } /* Error estimation by step doubling */ { int s = modnewton1_init ((void *) esol, A, h / 2.0, dfdy, sys); if (s != GSL_SUCCESS) { return s; } } /* 1st half step */ { int s = modnewton1_solve ((void *) esol, A, c, t, h / 2.0, y, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { int s = GSL_ODEIV_FN_EVAL (sys, t + c[0] * h / 2.0, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { int s = rksubs (ytmp, h / 2.0, y, fYZ, b, RK1IMP_STAGE, dim); if (s != GSL_SUCCESS) return s; } /* Save original y values in case of error */ DBL_MEMCPY (y_save, y, dim); /* 2nd half step */ { int s = modnewton1_solve ((void *) esol, A, c, t + h / 2.0, h / 2.0, ytmp, sys, YZ, errlev); if (s != GSL_SUCCESS) { return s; } } { int s = GSL_ODEIV_FN_EVAL (sys, t + h / 2.0 + c[0] * h / 2.0, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } { /* Note: rk1imp returns y using the results from two half steps instead of the single step since the results are freely available and more precise. */ int s = rksubs (y_twostep, h / 2.0, ytmp, fYZ, b, RK1IMP_STAGE, dim); if (s != GSL_SUCCESS) { DBL_MEMCPY (y, y_save, dim); return s; } } DBL_MEMCPY (y, y_twostep, dim); /* Error estimation */ { size_t i; for (i = 0; i < dim; i++) { yerr[i] = ODEIV_ERR_SAFETY * 0.5 * fabs (y_twostep[i] - y_onestep[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 original values */ DBL_MEMCPY (y, y_save, dim); return s; } } return GSL_SUCCESS; } static int rk1imp_set_driver (void *vstate, const gsl_odeiv2_driver * d) { rk1imp_state_t *state = (rk1imp_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int rk1imp_reset (void *vstate, size_t dim) { rk1imp_state_t *state = (rk1imp_state_t *) vstate; DBL_ZERO_MEMSET (state->y_onestep, dim); DBL_ZERO_MEMSET (state->y_twostep, dim); DBL_ZERO_MEMSET (state->ytmp, dim); DBL_ZERO_MEMSET (state->y_save, dim); DBL_ZERO_MEMSET (state->YZ, dim); DBL_ZERO_MEMSET (state->fYZ, dim); return GSL_SUCCESS; } static unsigned int rk1imp_order (void *vstate) { rk1imp_state_t *state = (rk1imp_state_t *) vstate; state = 0; /* prevent warnings about unused parameters */ return 1; } static void rk1imp_free (void *vstate) { rk1imp_state_t *state = (rk1imp_state_t *) vstate; free (state->errlev); modnewton1_free (state->esol); gsl_matrix_free (state->dfdy); free (state->dfdt); free (state->fYZ); free (state->YZ); free (state->y_save); free (state->ytmp); free (state->y_twostep); free (state->y_onestep); gsl_matrix_free (state->A); free (state); } static const gsl_odeiv2_step_type rk1imp_type = { "rk1imp", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &rk1imp_alloc, &rk1imp_apply, &rk1imp_set_driver, &rk1imp_reset, &rk1imp_order, &rk1imp_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_rk1imp = &rk1imp_type; gsl-doc-2.3/ode-initval2/test.c0000664000175000017500000016512012616157443014420 0ustar eddedd/* ode-initval/test.c * * Copyright (C) 2009, 2010 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include #include #include #include #include #include #include "odeiv_util.h" /* Maximum number of ODE equations */ #define MAXEQ 15 /* Maximum number of ODE solvers */ #define MAXNS 20 /* Track number of function and jacobian evaluations in tests with global variables */ int nfe; int nje; /**********************************************************/ /* ODE test system definitions */ /**********************************************************/ /* RHS for f=2. Solution y = 2 * t + t0 */ int rhs_linear (double t, const double y[], double f[], void *params) { extern int nfe; nfe += 1; f[0] = 2.0; return GSL_SUCCESS; } int jac_linear (double t, const double y[], double *dfdy, double dfdt[], void *params) { extern int nje; nje += 1; dfdy[0] = 0.0; dfdt[0] = 0.0; return GSL_SUCCESS; } gsl_odeiv2_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) { extern int nfe; nfe += 1; f[0] = y[0]; return GSL_SUCCESS; } int jac_exp (double t, const double y[], double *dfdy, double dfdt[], void *params) { extern int nje; nje += 1; dfdy[0] = y[0]; dfdt[0] = 0.0; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_exp = { rhs_exp, jac_exp, 1, 0 }; int rhs_sin (double t, const double y[], double f[], void *params) { extern int nfe; nfe += 1; 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) { extern int nje; nje += 1; 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_odeiv2_system rhs_func_sin = { rhs_sin, jac_sin, 2, 0 }; /* Sine/cosine with random failures */ static int rhs_xsin_reset = 0; static int jac_xsin_reset = 0; int rhs_xsin (double t, const double y[], double f[], void *params) { static int n = 0, m = 0; extern int nfe; nfe += 1; if (rhs_xsin_reset) { rhs_xsin_reset = 0; n = 0; m = 1; } n++; if (n >= m) { m = n * 1.3; return GSL_EFAILED; } 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; extern int nje; nje += 1; if (jac_xsin_reset) { jac_xsin_reset = 0; 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_odeiv2_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) { extern int nfe; nfe += 1; 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) { extern int nje; nje += 1; 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_odeiv2_system rhs_func_stiff = { rhs_stiff, jac_stiff, 2, 0 }; /* Cosine function */ int rhs_cos (double t, const double *y, double *dydt, void *params) { dydt[0] = cos (t); return GSL_SUCCESS; } int jac_cos (double t, const double y[], double *dfdy, double dfdt[], void *params) { dfdy[0] = 0.0; dfdt[0] = -sin (t); return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_cos = { rhs_cos, jac_cos, 1, 0 }; /* Broken problem for testing numerical problems in user function that leads to decrease of step size in gsl_odeiv2_evolve below machine precision. */ int rhs_broken (double t, const double y[], double f[], void *params) { if (t < 10.0) { f[0] = 1.0; } else { f[0] = GSL_NAN; return 123; } return GSL_SUCCESS; } int jac_broken (double t, const double y[], double *dfdy, double dfdt[], void *params) { if (t < 10.0) { dfdy[0] = 0.0; dfdt[0] = 0.0; } else { dfdy[0] = GSL_NAN; dfdt[0] = GSL_NAN; return 123; } return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_broken = { rhs_broken, jac_broken, 1, 0 }; /* Immediate user break (at t > 1.5) test sine system */ int rhs_sin_ub (double t, const double y[], double f[], void *params) { extern int nfe; nfe += 1; f[0] = -y[1]; f[1] = y[0]; if (t > 1.5) { return GSL_EBADFUNC; } return GSL_SUCCESS; } int jac_sin_ub (double t, const double y[], double *dfdy, double dfdt[], void *params) { extern int nje; nje += 1; dfdy[0] = 0.0; dfdy[1] = -1.0; dfdy[2] = 1.0; dfdy[3] = 0.0; dfdt[0] = 0.0; dfdt[1] = 0.0; if (t > 1.5) { return GSL_EBADFUNC; } return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_sin_ub = { rhs_sin_ub, jac_sin_ub, 2, 0 }; /* Badly scaled random function */ int rhs_br (double t, const double *y, double *dydt, void *params) { dydt[0] = (rand () - RAND_MAX / 2) * 2e100; return GSL_SUCCESS; } int jac_br (double t, const double y[], double *dfdy, double dfdt[], void *params) { dfdy[0] = (rand () - RAND_MAX / 2) * 2e100; dfdt[0] = (rand () - RAND_MAX / 2) * 2e100; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_br = { rhs_br, jac_br, 1, 0 }; /* stepfn and stepfn2 based on testcases from Frank Reininghaus */ /* Derivative change at t=0, small derivative */ int rhs_stepfn (double t, const double *y, double *dydt, void *params) { if (t >= 1.0) dydt[0] = 1; else dydt[0] = 0; return GSL_SUCCESS; } int jac_stepfn (double t, const double y[], double *dfdy, double dfdt[], void *params) { dfdy[0] = 0.0; dfdt[0] = 0.0; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_stepfn = { rhs_stepfn, jac_stepfn, 1, 0 }; /* Derivative change at t=0, large derivative */ int rhs_stepfn2 (double t, const double *y, double *dydt, void *params) { if (t >= 0.0) dydt[0] = 1e300; else dydt[0] = 0; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_stepfn2 = { rhs_stepfn2, jac_stepfn, 1, 0 }; /* Volterra-Lotka predator-prey model f0 = (a - b * y1) * y0 y0(0) = 2.725 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 = -2.0; const double d = -1.0; extern int nfe; nfe += 1; 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 = -2.0; const double d = -1.0; extern int nje; nje += 1; 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_odeiv2_system rhs_func_vl = { rhs_vl, jac_vl, 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; extern int nfe; nfe += 1; 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; extern int nje; nje += 1; 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_odeiv2_system rhs_func_vanderpol = { rhs_vanderpol, jac_vanderpol, 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) { extern int nfe; nfe += 1; f[0] = -50 * (y[0] - cos (t)); return GSL_SUCCESS; } int jac_stifftrig (double t, const double y[], double *dfdy, double dfdt[], void *params) { extern int nje; nje += 1; dfdy[0] = -50; dfdt[0] = -50 * sin (t); return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_stifftrig = { rhs_stifftrig, jac_stifftrig, 1, 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; extern int nfe; nfe += 1; 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; extern int nje; nje += 1; 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_odeiv2_system rhs_func_oregonator = { rhs_oregonator, jac_oregonator, 3, 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; extern int nfe; nfe += 1; 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; extern int nje; nje += 1; 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_odeiv2_system rhs_func_e5 = { rhs_e5, jac_e5, 4, 0 }; /* Chemical reaction system of H.H. Robertson (1966): The solution of a set of reaction rate equations. In: J. Walsh, ed.: Numer. Anal., an Introduction, Academ. Press, pp. 178-182. f0 = -a * y0 + b * y1 * y2 y0(0) = 1.0 f1 = a * y0 - b * y1 * y2 - c * y1^2 y1(0) = 0.0 f2 = c * y1^2 y2(0) = 0.0 */ int rhs_robertson (double t, const double y[], double f[], void *params) { const double a = 0.04; const double b = 1.0e4; const double c = 3.0e7; extern int nfe; nfe += 1; f[0] = -a * y[0] + b * y[1] * y[2]; f[2] = c * y[1] * y[1]; f[1] = -f[0] - f[2]; return GSL_SUCCESS; } int jac_robertson (double t, const double y[], double *dfdy, double dfdt[], void *params) { const double a = 0.04; const double b = 1.0e4; const double c = 3.0e7; extern int nje; nje += 1; dfdy[0] = -a; dfdy[1] = b * y[2]; dfdy[2] = b * y[1]; dfdy[3] = a; dfdy[4] = -b * y[2] - 2 * c * y[1]; dfdy[5] = -b * y[1]; dfdy[6] = 0.0; dfdy[7] = 2 * c * y[1]; dfdy[8] = 0.0; dfdt[0] = 0.0; dfdt[1] = 0.0; dfdt[2] = 0.0; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_robertson = { rhs_robertson, jac_robertson, 3, 0 }; /* A two-dimensional oscillating Brusselator system. f0 = a + y0^2 * y1 - (b + 1) * y0 y0(0) = 1.5 f1 = b * y0 - y0^2 * y1 y1(0) = 3.0 */ int rhs_brusselator (double t, const double y[], double f[], void *params) { const double a = 1.0; const double b = 3.0; extern int nfe; nfe += 1; f[0] = a + y[0] * y[0] * y[1] - (b + 1.0) * y[0]; f[1] = b * y[0] - y[0] * y[0] * y[1]; return GSL_SUCCESS; } int jac_brusselator (double t, const double y[], double *dfdy, double dfdt[], void *params) { const double b = 3.0; extern int nje; nje += 1; dfdy[0] = 2 * y[0] * y[1] - (b + 1.0); dfdy[1] = y[0] * y[0]; dfdy[2] = b - 2 * y[0] * y[1]; dfdy[3] = -y[0] * y[0]; dfdt[0] = 0; dfdt[1] = 0; return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_brusselator = { rhs_brusselator, jac_brusselator, 2, 0 }; /* Ring Modulator, stiff ODE of dimension 15. Reference: Walter M. Lioen, Jacques J.B. de Swart, Test Set for Initial Value Problem Solvers, Release 2.1 September 1999, http://ftp.cwi.nl/IVPtestset/software.htm */ #define NRINGMOD 15 int rhs_ringmod (double t, const double y[], double f[], void *params) { const double c = 1.6e-8; const double cs = 2e-12; const double cp = 1e-8; const double r = 25e3; const double rp = 50e0; const double lh = 4.45e0; const double ls1 = 2e-3; const double ls2 = 5e-4; const double ls3 = 5e-4; const double rg1 = 36.3; const double rg2 = 17.3; const double rg3 = 17.3; const double ri = 5e1; const double rc = 6e2; const double gamma = 40.67286402e-9; const double delta = 17.7493332; const double pi = 3.141592653589793238462643383; const double uin1 = 0.5 * sin (2e3 * pi * t); const double uin2 = 2 * sin (2e4 * pi * t); const double ud1 = +y[2] - y[4] - y[6] - uin2; const double ud2 = -y[3] + y[5] - y[6] - uin2; const double ud3 = +y[3] + y[4] + y[6] + uin2; const double ud4 = -y[2] - y[5] + y[6] + uin2; const double qud1 = gamma * (exp (delta * ud1) - 1.0); const double qud2 = gamma * (exp (delta * ud2) - 1.0); const double qud3 = gamma * (exp (delta * ud3) - 1.0); const double qud4 = gamma * (exp (delta * ud4) - 1.0); extern int nfe; nfe += 1; f[0] = (y[7] - 0.5 * y[9] + 0.5 * y[10] + y[13] - y[0] / r) / c; f[1] = (y[8] - 0.5 * y[11] + 0.5 * y[12] + y[14] - y[1] / r) / c; f[2] = (y[9] - qud1 + qud4) / cs; f[3] = (-y[10] + qud2 - qud3) / cs; f[4] = (y[11] + qud1 - qud3) / cs; f[5] = (-y[12] - qud2 + qud4) / cs; f[6] = (-y[6] / rp + qud1 + qud2 - qud3 - qud4) / cp; f[7] = -y[0] / lh; f[8] = -y[1] / lh; f[9] = (0.5 * y[0] - y[2] - rg2 * y[9]) / ls2; f[10] = (-0.5 * y[0] + y[3] - rg3 * y[10]) / ls3; f[11] = (0.5 * y[1] - y[4] - rg2 * y[11]) / ls2; f[12] = (-0.5 * y[1] + y[5] - rg3 * y[12]) / ls3; f[13] = (-y[0] + uin1 - (ri + rg1) * y[13]) / ls1; f[14] = (-y[1] - (rc + rg1) * y[14]) / ls1; return GSL_SUCCESS; } int jac_ringmod (double t, const double y[], double *dfdy, double dfdt[], void *params) { const double c = 1.6e-8; const double cs = 2e-12; const double cp = 1e-8; const double r = 25e3; const double rp = 50e0; const double lh = 4.45e0; const double ls1 = 2e-3; const double ls2 = 5e-4; const double ls3 = 5e-4; const double rg1 = 36.3; const double rg2 = 17.3; const double rg3 = 17.3; const double ri = 5e1; const double rc = 6e2; const double gamma = 40.67286402e-9; const double delta = 17.7493332; const double pi = 3.141592653589793238462643383; const double uin2 = 2 * sin (2e4 * pi * t); const double ud1 = +y[2] - y[4] - y[6] - uin2; const double ud2 = -y[3] + y[5] - y[6] - uin2; const double ud3 = +y[3] + y[4] + y[6] + uin2; const double ud4 = -y[2] - y[5] + y[6] + uin2; const double qpud1 = gamma * delta * exp (delta * ud1); const double qpud2 = gamma * delta * exp (delta * ud2); const double qpud3 = gamma * delta * exp (delta * ud3); const double qpud4 = gamma * delta * exp (delta * ud4); extern int nje; size_t i; nje += 1; for (i = 0; i < NRINGMOD * NRINGMOD; i++) { dfdy[i] = 0.0; } dfdy[0 * NRINGMOD + 0] = -1 / (c * r); dfdy[0 * NRINGMOD + 7] = 1 / c; dfdy[0 * NRINGMOD + 9] = -0.5 / c; dfdy[0 * NRINGMOD + 10] = -dfdy[0 * NRINGMOD + 9]; dfdy[0 * NRINGMOD + 13] = dfdy[0 * NRINGMOD + 7]; dfdy[1 * NRINGMOD + 1] = dfdy[0 * NRINGMOD + 0]; dfdy[1 * NRINGMOD + 8] = dfdy[0 * NRINGMOD + 7]; dfdy[1 * NRINGMOD + 11] = dfdy[0 * NRINGMOD + 9]; dfdy[1 * NRINGMOD + 12] = dfdy[0 * NRINGMOD + 10]; dfdy[1 * NRINGMOD + 14] = dfdy[0 * NRINGMOD + 13]; dfdy[2 * NRINGMOD + 2] = (-qpud1 - qpud4) / cs; dfdy[2 * NRINGMOD + 4] = qpud1 / cs; dfdy[2 * NRINGMOD + 5] = -qpud4 / cs; dfdy[2 * NRINGMOD + 6] = (qpud1 + qpud4) / cs; dfdy[2 * NRINGMOD + 9] = 1 / cs; dfdy[3 * NRINGMOD + 3] = (-qpud2 - qpud3) / cs; dfdy[3 * NRINGMOD + 4] = -qpud3 / cs; dfdy[3 * NRINGMOD + 5] = qpud2 / cs; dfdy[3 * NRINGMOD + 6] = (-qpud2 - qpud3) / cs; dfdy[3 * NRINGMOD + 10] = -1 / cs; dfdy[4 * NRINGMOD + 2] = qpud1 / cs; dfdy[4 * NRINGMOD + 3] = -qpud3 / cs; dfdy[4 * NRINGMOD + 4] = (-qpud1 - qpud3) / cs; dfdy[4 * NRINGMOD + 6] = (-qpud1 - qpud3) / cs; dfdy[4 * NRINGMOD + 11] = 1 / cs; dfdy[5 * NRINGMOD + 2] = -qpud4 / cs; dfdy[5 * NRINGMOD + 3] = qpud2 / cs; dfdy[5 * NRINGMOD + 5] = (-qpud2 - qpud4) / cs; dfdy[5 * NRINGMOD + 6] = (qpud2 + qpud4) / cs; dfdy[5 * NRINGMOD + 12] = -1 / cs; dfdy[6 * NRINGMOD + 2] = (qpud1 + qpud4) / cp; dfdy[6 * NRINGMOD + 3] = (-qpud2 - qpud3) / cp; dfdy[6 * NRINGMOD + 4] = (-qpud1 - qpud3) / cp; dfdy[6 * NRINGMOD + 5] = (qpud2 + qpud4) / cp; dfdy[6 * NRINGMOD + 6] = (-qpud1 - qpud2 - qpud3 - qpud4 - 1 / rp) / cp; dfdy[7 * NRINGMOD + 0] = -1 / lh; dfdy[8 * NRINGMOD + 1] = dfdy[7 * NRINGMOD + 0]; dfdy[9 * NRINGMOD + 0] = 0.5 / ls2; dfdy[9 * NRINGMOD + 2] = -1 / ls2; dfdy[9 * NRINGMOD + 9] = -rg2 / ls2; dfdy[10 * NRINGMOD + 0] = -0.5 / ls3; dfdy[10 * NRINGMOD + 3] = 1 / ls3; dfdy[10 * NRINGMOD + 10] = -rg3 / ls3; dfdy[11 * NRINGMOD + 1] = dfdy[9 * NRINGMOD + 0]; dfdy[11 * NRINGMOD + 4] = dfdy[9 * NRINGMOD + 2]; dfdy[11 * NRINGMOD + 11] = dfdy[9 * NRINGMOD + 9]; dfdy[12 * NRINGMOD + 1] = dfdy[10 * NRINGMOD + 0]; dfdy[12 * NRINGMOD + 5] = dfdy[10 * NRINGMOD + 3]; dfdy[12 * NRINGMOD + 12] = dfdy[10 * NRINGMOD + 10]; dfdy[13 * NRINGMOD + 0] = -1 / ls1; dfdy[13 * NRINGMOD + 13] = -(ri + rg1) / ls1; dfdy[14 * NRINGMOD + 1] = dfdy[13 * NRINGMOD + 0]; dfdy[14 * NRINGMOD + 14] = -(rc + rg1) / ls1; for (i = 0; i < NRINGMOD; i++) { dfdt[i] = 0.0; } return GSL_SUCCESS; } gsl_odeiv2_system rhs_func_ringmod = { rhs_ringmod, jac_ringmod, NRINGMOD, NULL }; /**********************************************************/ /* Functions for carrying out tests */ /**********************************************************/ void test_odeiv_stepper (const gsl_odeiv2_step_type * T, const gsl_odeiv2_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 the result with given values yfin */ double y[MAXEQ] = { 0.0 }; double yerr[MAXEQ] = { 0.0 }; double scale_abs[MAXEQ]; size_t ne = sys->dimension; size_t i; gsl_odeiv2_driver *d; for (i = 0; i < MAXEQ; i++) { scale_abs[i] = 1.0; } d = gsl_odeiv2_driver_alloc_scaled_new (sys, T, h, relerr, relerr, 1.0, 0.0, scale_abs); DBL_MEMCPY (y, ystart, MAXEQ); { int s = gsl_odeiv2_step_apply (d->s, 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_odeiv2_step_name (d->s), desc, i); } gsl_odeiv2_driver_free (d); } void test_stepper (const gsl_odeiv2_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; /* 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); /* 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); } void test_evolve_system (const gsl_odeiv2_step_type * T, const gsl_odeiv2_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_odeiv2_driver *d = gsl_odeiv2_driver_alloc_standard_new (sys, T, h, err_target, err_target, 1.0, 0.0); double *y_orig = (double *) malloc (sys->dimension * sizeof (double)); int s = 0; extern int nfe, nje; nfe = 0; nje = 0; while (t < t1) { double t_orig = t; memcpy (y_orig, y, sys->dimension * sizeof (double)); s = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, sys, &t, t1, &h, y); #ifdef DEBUG printf (" %.5e %.5e %.5e %d\n", t, y[0], y[1], gsl_odeiv2_step_order (d->s)); #endif if (s != GSL_SUCCESS) { /* check that t and y are unchanged */ gsl_test_abs (t, t_orig, 0.0, "%s t must be restored on failure", gsl_odeiv2_step_name (d->s)); for (i = 0; i < sys->dimension; i++) { gsl_test_abs (y[i], y_orig[i], 0.0, "%s y must be restored on failure", gsl_odeiv2_step_name (d->s), desc, i); } if (sys != &rhs_func_xsin) { /* apart from xsin, other functions should not return errors */ gsl_test (s, "%s evolve_apply returned %d", gsl_odeiv2_step_name (d->s), s); break; } } if (steps > 100000) { gsl_test (GSL_EFAILED, "%s evolve_apply reached maxiter", gsl_odeiv2_step_name (d->s)); break; } steps++; } gsl_test (s, "%s %s [%g,%g], %d steps (nfe %d, nje %d) completed", gsl_odeiv2_step_name (d->s), desc, t0, t1, steps, nfe, nje); /* 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 * d->e->count * err_target, "%s %s evolve(%d)", gsl_odeiv2_step_name (d->s), desc, i); } free (y_orig); gsl_odeiv2_driver_free (d); } int sys_driver (const gsl_odeiv2_step_type * T, const gsl_odeiv2_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_odeiv2_driver *d = gsl_odeiv2_driver_alloc_standard_new (sys, T, h, epsabs, epsrel, 1.0, 0.0); extern int nfe, nje; nfe = 0; nje = 0; while (t < t1) { s = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, sys, &t, t1, &h, y); #ifdef DEBUG printf ("%.5e %.5e %.5e %d\n", t, y[0], y[1], gsl_odeiv2_step_order (d->s)); #endif if (s != GSL_SUCCESS) { gsl_test (s, "sys_driver: %s evolve_apply returned %d", gsl_odeiv2_step_name (d->s), s); break; } if (steps > 1e7) { gsl_test (GSL_EMAXITER, "sys_driver: %s evolve_apply reached maxiter at t=%g", gsl_odeiv2_step_name (d->s), t); s = GSL_EMAXITER; break; } steps++; } gsl_test (s, "%s %s [%g,%g], %d steps (nfe %d, nje %d) completed", gsl_odeiv2_step_name (d->s), desc, t0, t1, steps, nfe, nje); gsl_odeiv2_driver_free (d); return s; } void test_evolve_linear (const gsl_odeiv2_step_type * T, double h, double err) { /* Test linear evolve */ 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_odeiv2_step_type * T, double h, double err) { /* Test exponential evolve */ 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_odeiv2_step_type * T, double h, double err) { /* Test sinusoidal evolve */ 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_odeiv2_step_type * T, double h, double err) { /* Test sinusoidal evolve including a failing window */ double y[2]; double yfin[2]; y[0] = 1.0; y[1] = 0.0; yfin[0] = cos (2.0); yfin[1] = sin (2.0); rhs_xsin_reset = 1; jac_xsin_reset = 1; 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_odeiv2_step_type * T, double h, double err) { /* Test classical stiff problem evolve, t=[0,1] */ 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_odeiv2_step_type * T, double h, double err) { /* Test classical stiff problem evolve, t=[0,5] */ 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]"); } void test_evolve_negative_h (const gsl_odeiv2_step_type * T, double h, double err) { /* Test evolution in negative direction */ /* Tolerance factor in testing errors */ const double factor = 10; const gsl_odeiv2_system sys = rhs_func_cos; double t = 0; double t1 = -4.0; double y = 0.0; double yfin = sin (t1); gsl_odeiv2_driver *d; /* Make initial h negative */ h = -fabs (h); d = gsl_odeiv2_driver_alloc_standard_new (&sys, T, h, err, err, 1.0, 0.0); while (t > t1) { int status = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, &sys, &t, t1, &h, &y); if (status != GSL_SUCCESS) { gsl_test (status, "%s evolve_apply returned %d for negative h", gsl_odeiv2_step_name (d->s), status); break; } } gsl_test_abs (y, yfin, factor * d->e->count * err, "%s evolution with negative h", gsl_odeiv2_step_name (d->s)); gsl_odeiv2_driver_free (d); } void test_broken (const gsl_odeiv2_step_type * T, double h, double err) { /* Check for gsl_odeiv2_evolve_apply. The user function fails at t>=10, which in this test causes step size to decrease below machine precision and return with a failure code. */ /* Tolerance factor in testing errors */ const double factor = 10; const gsl_odeiv2_system sys = rhs_func_broken; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys, T, h, err, err); double t = 0; double t1 = 100.0; double y = 0.0; const double final_max_h = GSL_DBL_EPSILON; int status; while (t < t1) { status = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, &sys, &t, t1, &h, &y); if (status != GSL_SUCCESS) { break; } } gsl_test_abs (h + final_max_h, final_max_h, factor * final_max_h, "%s test_broken: step size at break point", gsl_odeiv2_step_name (d->s)); gsl_test_abs (t, 10.0, factor * err, "%s test_broken: point of break", gsl_odeiv2_step_name (d->s)); /* GSL_FAILURE results from stepper failure, 123 from user function */ if (status != GSL_FAILURE && status != 123) { gsl_test (status, "%s test_broken: evolve return value %d", gsl_odeiv2_step_name (d->s), status); } else { gsl_test (GSL_SUCCESS, "%s test_broken: evolve return value %d", gsl_odeiv2_step_name (d->s), status); } gsl_odeiv2_driver_free (d); } void test_stepsize_fail (const gsl_odeiv2_step_type * T, double h) { /* Check for gsl_odeiv2_evolve_apply. The user function works apparently fine (returns GSL_SUCCESS) but is faulty in this case. gsl_odeiv2_evolve_apply therefore decreases the step-size below machine precision and therefore stops with GSL_FAILURE. */ /* Error tolerance */ const double epsabs = 1e-16; const double epsrel = 1e-6; /* Tolerance factor in testing errors */ const double factor = 10; const double final_max_h = GSL_DBL_EPSILON; const gsl_odeiv2_system sys = rhs_func_br; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys, T, h, epsabs, epsrel); double t = 1.0; double t1 = 1e5; double y = 0.0; int status; while (t < t1) { status = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, &sys, &t, t1, &h, &y); if (status != GSL_SUCCESS) { break; } } gsl_test_abs (h + final_max_h, final_max_h, factor * final_max_h, "%s test_stepsize_fail: step size at break point", gsl_odeiv2_step_name (d->s)); gsl_test_abs (t, 1.0, 1e-6, "%s test_stepsize_fail: point of break", gsl_odeiv2_step_name (d->s)); gsl_test_int (status, GSL_FAILURE, "%s test_stepsize_fail: evolve return value", gsl_odeiv2_step_name (d->s)); gsl_odeiv2_driver_free (d); } void test_user_break (const gsl_odeiv2_step_type * T, double h) { /* Tests for user signaled immediate break */ const double tol = 1e-8; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&rhs_func_sin_ub, T, h, tol, tol); double y[] = { 1.0, 0.0 }; double t = 0.0; const double t1 = 8.25; int s = gsl_odeiv2_driver_apply (d, &t, t1, y); gsl_test ((s - GSL_EBADFUNC), "%s test_user_break returned %d", gsl_odeiv2_step_name (d->s), s); gsl_odeiv2_driver_free (d); } void test_stepfn (const gsl_odeiv2_step_type * T) { /* Test evolve on a small derivative change at t=0 */ double epsabs = 1e-16; double epsrel = 1e-6; const gsl_odeiv2_system sys = rhs_func_stepfn; double t = 0.0; double h = 1e-6; double y = 0.0; int i = 0; int status = 0; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys, T, h, epsabs, epsrel); while (t < 2 && i < 1000000) { status = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, &sys, &t, 2, &h, &y); #ifdef DEBUG printf ("i=%d status=%d t=%g h=%g y=%g\n", i, status, t, h, y); #endif if (status != GSL_SUCCESS) break; i++; } gsl_test (status, "evolve step function, return value (stepfn/%s): %d", gsl_odeiv2_step_name (d->s), status); gsl_test_abs (t, 2, 1e-16, "evolve step function, t (stepfn/%s)", gsl_odeiv2_step_name (d->s)); gsl_test_rel (y, 1, epsrel, "evolve step function, y (stepfn/%s)", gsl_odeiv2_step_name (d->s)); gsl_odeiv2_driver_free (d); } void test_stepfn2 (const gsl_odeiv2_step_type * T) { /* Test evolve on a large derivative change at t=0 */ double epsabs = 1e-16; double epsrel = 1e-6; const gsl_odeiv2_system sys = rhs_func_stepfn2; double t = -1.0; double h = 1e-6; double y = 0.0; int i = 0; int status; const int maxiter = 100000; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_yp_new (&sys, T, h, epsabs, epsrel); while (t < 1.0 && i < maxiter) { status = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, &sys, &t, 1.0, &h, &y); #ifdef DEBUG printf ("i=%d status=%d t=%g h=%g y=%g\n", i, status, t, h, y); #endif if (status != GSL_SUCCESS) break; i++; } if (i >= maxiter) printf ("FAIL: evolve big step function, (stepfn2/%s) reached maxiter\n", gsl_odeiv2_step_name (d->s)); gsl_test_abs (t, 1.0, 1e-16, "evolve big step function, t (stepfn2/%s)", gsl_odeiv2_step_name (d->s)); gsl_test_rel (y, 1e300, epsrel, "evolve big step function, y (stepfn2/%s)", gsl_odeiv2_step_name (d->s)); gsl_odeiv2_driver_free (d); } void test_nonstiff_problems (void) { /* Compares output of non-stiff (or only moderately stiff) problems with several steppers */ const gsl_odeiv2_step_type *steppers[MAXNS]; /* Required error tolerance for each stepper. */ double err_target[MAXNS]; /* initial values for each ode-solver */ double y[MAXEQ * MAXNS]; size_t i, k, p; /* Number of problems to test */ #define CONST_NONSTIFF_NPROB 4 /* Problems, their names and number of equations */ const gsl_odeiv2_system *prob[] = { &rhs_func_vl, &rhs_func_vanderpol, &rhs_func_stifftrig, &rhs_func_brusselator }; const char *probname[] = { "volterra-lotka", "vanderpol", "stifftrig", "brusselator" }; const size_t sd[] = { 2, 2, 1, 2 }; /* Integration interval for problems */ const double start[CONST_NONSTIFF_NPROB] = { 0.0 }; const double end[] = { 9.0, 100.0, 1.5, 20.0 }; const double epsabs = 1e-8; const double epsrel = 1e-8; const double initstepsize = 1e-5; /* Steppers */ steppers[0] = gsl_odeiv2_step_rk4; err_target[0] = 1e-6; steppers[1] = gsl_odeiv2_step_rk2; err_target[1] = 1e-6; steppers[2] = gsl_odeiv2_step_rkf45; err_target[2] = 1e-6; steppers[3] = gsl_odeiv2_step_rkck; err_target[3] = 1e-6; steppers[4] = gsl_odeiv2_step_rk8pd; err_target[4] = 1e-6; steppers[5] = gsl_odeiv2_step_rk1imp; err_target[5] = 1e-3; steppers[6] = gsl_odeiv2_step_rk2imp; err_target[6] = 1e-5; steppers[7] = gsl_odeiv2_step_rk4imp; err_target[7] = 1e-6; steppers[8] = gsl_odeiv2_step_bsimp; err_target[8] = 1e-6; steppers[9] = gsl_odeiv2_step_msadams; err_target[9] = 1e-5; steppers[10] = gsl_odeiv2_step_msbdf; err_target[10] = 1e-5; steppers[11] = 0; /* Loop over problems */ for (p = 0; p < CONST_NONSTIFF_NPROB; p++) { /* Initialize */ for (i = 0; i < MAXNS * MAXEQ; i++) { y[i] = 0.0; } for (i = 0; i < MAXNS; i++) { switch (p) { case 0: y[i * sd[p]] = 2.725; y[i * sd[p] + 1] = 1.0; break; case 1: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 0.0; break; case 2: y[i * sd[p]] = 0.0; break; case 3: y[i * sd[p]] = 1.5; y[i * sd[p] + 1] = 3.0; break; default: gsl_test (GSL_EFAILED, "test_nonstiff_problems: initialization error\n"); return; } } /* Call each solver for the problem */ for (i = 0; steppers[i] != 0; i++) { int s = sys_driver (steppers[i], prob[p], start[p], end[p], initstepsize, &y[sd[p] * i], epsabs, epsrel, probname[p]); if (s != GSL_SUCCESS) { gsl_test (s, "test_nonstiff_problems %s %s", steppers[i]->name, probname[p]); } } /* Compare results */ for (i = 1; steppers[i] != 0; i++) for (k = 0; k < sd[p]; k++) { const double val1 = y[k]; const double val2 = y[sd[p] * i + k]; gsl_test_rel (val1, val2, (GSL_MAX (err_target[0], err_target[i])), "%s/%s %s [%d]", steppers[0]->name, steppers[i]->name, probname[p], k); } } } void test_stiff_problems (void) { /* Compares output of stiff problems with several steppers */ const gsl_odeiv2_step_type *steppers[MAXNS]; /* Required error tolerance for each stepper. */ double err_target[MAXNS]; /* initial values for each ode-solver */ double y[MAXEQ * MAXNS]; size_t i, k, p; /* Number of problems to test */ #define CONST_STIFF_NPROB 3 /* Problems, their names and number of equations */ const gsl_odeiv2_system *prob[] = { &rhs_func_oregonator, &rhs_func_e5, &rhs_func_robertson }; const char *probname[] = { "oregonator", "e5", "robertson" }; const size_t sd[] = { 3, 4, 3 }; /* Integration interval for problems */ const double start[CONST_STIFF_NPROB] = { 0.0 }; const double end[] = { 360.0, 1e4, 1e4 }; const double epsabs = 1e-40; const double epsrel = 1e-7; const double initstepsize = 1e-5; /* Steppers */ steppers[0] = gsl_odeiv2_step_bsimp; err_target[0] = 1e-6; steppers[1] = gsl_odeiv2_step_rk1imp; err_target[1] = 5e-3; steppers[2] = gsl_odeiv2_step_rk2imp; err_target[2] = 5e-5; steppers[3] = gsl_odeiv2_step_rk4imp; err_target[3] = 5e-5; steppers[4] = gsl_odeiv2_step_msbdf; err_target[4] = 1e-4; steppers[5] = 0; /* Loop over problems */ for (p = 0; p < CONST_STIFF_NPROB; p++) { /* Initialize */ for (i = 0; i < MAXNS * MAXEQ; i++) { y[i] = 0.0; } for (i = 0; i < MAXNS; i++) { switch (p) { case 0: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 2.0; y[i * sd[p] + 2] = 3.0; break; case 1: y[i * sd[p]] = 1.76e-3; y[i * sd[p] + 1] = 0.0; y[i * sd[p] + 2] = 0.0; y[i * sd[p] + 3] = 0.0; break; case 2: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 0.0; y[i * sd[p] + 2] = 0.0; break; default: gsl_test (GSL_EFAILED, "test_stiff_problems: initialization error\n"); return; } } /* Call each solver for the problem */ for (i = 0; steppers[i] != 0; i++) { int s = sys_driver (steppers[i], prob[p], start[p], end[p], initstepsize, &y[sd[p] * i], epsabs, epsrel, probname[p]); if (s != GSL_SUCCESS) { gsl_test (s, "test_stiff_problems %s %s", steppers[i]->name, probname[p]); } } /* Compare results */ for (i = 1; steppers[i] != 0; i++) for (k = 0; k < sd[p]; k++) { const double val1 = y[k]; const double val2 = y[sd[p] * i + k]; gsl_test_rel (val1, val2, (GSL_MAX (err_target[0], err_target[i])), "%s/%s %s [%d]", steppers[0]->name, steppers[i]->name, probname[p], k); } } } void test_extreme_problems (void) { /* Compares output of numerically particularly demanding problems with several steppers */ const gsl_odeiv2_step_type *steppers[MAXNS]; /* Required error tolerance for each stepper. */ double err_target[MAXNS]; /* initial values for each ode-solver */ double y[MAXEQ * MAXNS]; size_t i, k, p; /* Number of problems to test */ #define CONST_EXTREME_NPROB 3 /* Problems, their names and number of equations */ const gsl_odeiv2_system *prob[] = { &rhs_func_e5, &rhs_func_robertson, &rhs_func_ringmod }; const char *probname[] = { "e5_bigt", "robertson_bigt", "ringmod" }; const size_t sd[] = { 4, 3, NRINGMOD }; /* Integration interval for problems */ const double start[CONST_EXTREME_NPROB] = { 0.0 }; const double end[CONST_EXTREME_NPROB] = { 1e11, 1e11, 1e-5 }; const double epsabs[CONST_EXTREME_NPROB] = { 1e1 * GSL_DBL_MIN, 1e1 * GSL_DBL_MIN, 1e-12 }; const double epsrel[CONST_EXTREME_NPROB] = { 1e-12, 1e-12, 1e-12 }; const double initstepsize[CONST_EXTREME_NPROB] = { 1e-5, 1e-5, 1e-10 }; /* Steppers */ steppers[0] = gsl_odeiv2_step_bsimp; err_target[0] = 1e-3; steppers[1] = gsl_odeiv2_step_msbdf; err_target[1] = 1e-3; steppers[2] = 0; /* Loop over problems */ for (p = 0; p < CONST_EXTREME_NPROB; p++) { /* Initialize */ for (i = 0; i < MAXNS * MAXEQ; i++) { y[i] = 0.0; } for (i = 0; i < MAXNS; i++) { switch (p) { case 0: y[i * sd[p]] = 1.76e-3; y[i * sd[p] + 1] = 0.0; y[i * sd[p] + 2] = 0.0; y[i * sd[p] + 3] = 0.0; break; case 1: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 0.0; y[i * sd[p] + 2] = 0.0; break; case 2: { size_t j; for (j = 0; j < NRINGMOD; j++) { y[i * sd[p] + j] = 0.0; } } break; default: gsl_test (GSL_EFAILED, "test_extreme_problems: initialization error\n"); return; } } /* Call each solver for the problem */ for (i = 0; steppers[i] != 0; i++) { int s = sys_driver (steppers[i], prob[p], start[p], end[p], initstepsize[p], &y[sd[p] * i], epsabs[p], epsrel[p], probname[p]); if (s != GSL_SUCCESS) { printf ("start=%.5e, initstepsize=%.5e\n", start[p], initstepsize[p]); gsl_test (s, "test_extreme_problems %s %s", steppers[i]->name, probname[p]); } } /* Compare results */ for (i = 1; steppers[i] != 0; i++) for (k = 0; k < sd[p]; k++) { const double val1 = y[k]; const double val2 = y[sd[p] * i + k]; gsl_test_rel (val1, val2, (GSL_MAX (err_target[0], err_target[i])), "%s/%s %s [%d]", steppers[0]->name, steppers[i]->name, probname[p], k); } } } void test_driver (const gsl_odeiv2_step_type * T) { /* Tests for gsl_odeiv2_driver object */ int s; const double tol = 1e-8; const double hmax = 1e-2; double y[] = { 1.0, 0.0 }; double t = 0.0; const double tinit = 0.0; const double t1 = 8.25; const double t2 = 100; const double t3 = -2.5; const size_t minsteps = ceil (t1 / hmax); const size_t maxsteps = 20; const double hmin = 1e-10; const unsigned long int nfsteps = 100000; const double hfixed = 0.000025; gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&rhs_func_sin, T, 1e-3, tol, tol); gsl_odeiv2_driver_set_hmax (d, hmax); s = gsl_odeiv2_driver_apply (d, &t, t1, y); if (s != GSL_SUCCESS) { gsl_test (s, "%s test_driver apply returned %d", gsl_odeiv2_step_name (d->s), s); } /* Test that result is correct */ gsl_test_rel (y[0], cos (t1), d->n * tol, "%s test_driver y0", gsl_odeiv2_step_name (d->s)); gsl_test_rel (y[1], sin (t1), d->n * tol, "%s test_driver y1", gsl_odeiv2_step_name (d->s)); /* Test that maximum step length is obeyed */ if (d->n < minsteps) { gsl_test (1, "%s test_driver steps %d < minsteps %d \n", gsl_odeiv2_step_name (d->s), d->n, minsteps); } else { gsl_test (0, "%s test_driver max step length test", gsl_odeiv2_step_name (d->s)); } /* Test changing integration direction from forward to backward */ gsl_odeiv2_driver_reset_hstart (d, -1e-3); s = gsl_odeiv2_driver_apply (d, &t, tinit, y); if (s != GSL_SUCCESS) { gsl_test (s, "%s test_driver apply returned %d", gsl_odeiv2_step_name (d->s), s); } gsl_test_rel (y[0], cos (tinit), d->n * tol, "%s test_driver y0", gsl_odeiv2_step_name (d->s)); gsl_test_rel (y[1], sin (tinit), d->n * tol, "%s test_driver y1", gsl_odeiv2_step_name (d->s)); gsl_odeiv2_driver_free (d); /* Test that maximum number of steps is obeyed */ d = gsl_odeiv2_driver_alloc_y_new (&rhs_func_sin, T, 1e-3, tol, tol); gsl_odeiv2_driver_set_hmax (d, hmax); gsl_odeiv2_driver_set_nmax (d, maxsteps); s = gsl_odeiv2_driver_apply (d, &t, t2, y); if (d->n != maxsteps + 1) { gsl_test (1, "%s test_driver steps %d, expected %d", gsl_odeiv2_step_name (d->s), d->n, maxsteps + 1); } else { gsl_test (0, "%s test_driver max steps test", gsl_odeiv2_step_name (d->s)); } gsl_odeiv2_driver_free (d); /* Test that minimum step length is obeyed */ d = gsl_odeiv2_driver_alloc_y_new (&rhs_func_broken, T, 1e-3, tol, tol); gsl_odeiv2_driver_set_hmin (d, hmin); y[0] = 0.0; t = 0.0; s = gsl_odeiv2_driver_apply (d, &t, t2, y); if (s != GSL_ENOPROG) { gsl_test (1, "%s test_driver min step test returned %d", gsl_odeiv2_step_name (d->s), s); } else { gsl_test (0, "%s test_driver min step test", gsl_odeiv2_step_name (d->s)); } gsl_odeiv2_driver_free (d); /* Test negative integration direction */ d = gsl_odeiv2_driver_alloc_y_new (&rhs_func_sin, T, -1e-3, tol, tol); y[0] = 1.0; y[1] = 0.0; t = 2.5; s = gsl_odeiv2_driver_apply (d, &t, t3, y); { const double tol = 1e-3; const double test = fabs (t - t3); const double val = fabs (sin (-5.0) - y[1]); if (test > GSL_DBL_EPSILON) { gsl_test (1, "%s test_driver negative dir diff %e, expected less than %e", gsl_odeiv2_step_name (d->s), test, GSL_DBL_EPSILON); } else if (val > tol) { gsl_test (1, "%s test_driver negative dir val %e, expected less than %e", gsl_odeiv2_step_name (d->s), val, tol); } else { gsl_test (s, "%s test_driver negative direction test", gsl_odeiv2_step_name (d->s)); } } /* Test driver_apply_fixed_step */ gsl_odeiv2_driver_reset_hstart (d, 1e-3); s = gsl_odeiv2_driver_apply_fixed_step (d, &t, hfixed, nfsteps, y); if (s != GSL_SUCCESS) { gsl_test (s, "%s test_driver apply_fixed_step returned %d", gsl_odeiv2_step_name (d->s), s); } { const double tol = 1e-3; const double val = fabs (sin (-2.5) - y[1]); if (fabs (t) > nfsteps * GSL_DBL_EPSILON) { gsl_test (1, "%s test_driver apply_fixed_step t %e, expected less than %e", gsl_odeiv2_step_name (d->s), fabs (t), nfsteps * GSL_DBL_EPSILON); } else if (val > tol) { gsl_test (1, "%s test_driver apply_fixed_step val %e, expected less than %e", gsl_odeiv2_step_name (d->s), val, tol); } else { gsl_test (s, "%s test_driver apply_fixed_step test", gsl_odeiv2_step_name (d->s)); } } gsl_odeiv2_driver_free (d); } void benchmark_precision (void) { /* Tests steppers with several error tolerances and evaluates their performance and precision. */ /* Maximum number of tolerances to be tested */ #define MAXNT 12 const gsl_odeiv2_step_type *steppers[MAXNS]; /* Required error tolerance for each stepper. */ double err_target[MAXNS]; /* initial values for each ode-solver */ double y[MAXEQ * MAXNS * MAXNT]; /* precise results from e.g. analytical solution */ double yres[MAXEQ]; size_t i, j, k, p; /* Number of problems to test */ #define CONST_BENCHMARK_PRECISION_NPROB 3 /* Problems, their names and number of equations */ const gsl_odeiv2_system *prob[] = { &rhs_func_sin, &rhs_func_exp, &rhs_func_stiff }; const char *probname[] = { "rhs_func_sin", "rhs_func_exp", "rhs_func_stiff" }; const size_t sd[] = { 2, 1, 2 }; /* Integration interval for problems */ const double start[] = { 0.0, 0.0, 0.0 }; const double end[] = { 2.4, 8.4, 1.2 }; const double epsabs[] = { 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14, 0 }; const double epsrel[] = { 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14, 0 }; const double initstepsize = 1e-5; /* number of function and jacobian evaluations */ extern int nfe, nje; int nnfe[MAXNS * MAXNT] = { 0.0 }; int nnje[MAXNS * MAXNT] = { 0.0 }; /* Steppers */ steppers[0] = gsl_odeiv2_step_rk4; err_target[0] = 1e-6; steppers[1] = gsl_odeiv2_step_rk2; err_target[1] = 1e-6; steppers[2] = gsl_odeiv2_step_rkf45; err_target[2] = 1e-6; steppers[3] = gsl_odeiv2_step_rkck; err_target[3] = 1e-6; steppers[4] = gsl_odeiv2_step_rk8pd; err_target[4] = 1e-6; steppers[5] = gsl_odeiv2_step_rk1imp; err_target[5] = 1e-3; steppers[6] = gsl_odeiv2_step_rk2imp; err_target[6] = 1e-5; steppers[7] = gsl_odeiv2_step_rk4imp; err_target[7] = 1e-6; steppers[8] = gsl_odeiv2_step_bsimp; err_target[8] = 1e-6; steppers[9] = gsl_odeiv2_step_msadams; err_target[9] = 1e-5; steppers[10] = gsl_odeiv2_step_msbdf; err_target[10] = 1e-5; steppers[11] = 0; /* Loop over problems */ for (p = 0; p < CONST_BENCHMARK_PRECISION_NPROB; p++) { /* Initialize */ for (i = 0; i < MAXNS * MAXEQ * MAXNT; i++) { y[i] = 0.0; } for (i = 0; i < MAXNS * MAXNT; i++) { switch (p) { case 0: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 0.0; yres[0] = cos (2.4); yres[1] = sin (2.4); break; case 1: y[i * sd[p]] = 1.0; yres[0] = exp (8.4); break; case 2: y[i * sd[p]] = 1.0; y[i * sd[p] + 1] = 0.0; yres[0] = 2 * exp (-1.2) - exp (-1000 * 1.2); yres[1] = -exp (-1.2) + exp (-1000 * 1.2); break; default: gsl_test (GSL_EFAILED, "benchmark_precision: initialization error\n"); return; } } /* Call each solver for the problem */ for (i = 0; steppers[i] != 0; i++) for (j = 0; epsrel[j] != 0; j++) { int s = sys_driver (steppers[i], prob[p], start[p], end[p], initstepsize, &y[sd[p] * (j + i * MAXNT)], epsabs[j], epsrel[j], probname[p]); if (s != GSL_SUCCESS) { for (k = 0; k < sd[p]; k++) { y[sd[p] * (j + i * MAXNT) + k] = GSL_NAN; } } else { nnfe[j + i * MAXNT] = nfe; nnje[j + i * MAXNT] = nje; } } /* Print results */ printf ("benchmark_precision: diff = (y_true - y) / y_true with %s\n epsrel: ", probname[p]); for (i = 0; epsrel[i] != 0.0; i++) { printf ("%12.0e ", epsrel[i]); } printf ("\n"); for (i = 0; steppers[i] != 0; i++) { for (k = 0; k < sd[p]; k++) { printf ("%8s diff[%d]: ", steppers[i]->name, (int) k); for (j = 0; epsrel[j] != 0; j++) { const double diff = (yres[k] - y[sd[p] * (j + i * MAXNT) + k]) / yres[k]; printf ("%12.5e ", diff); } printf ("\n"); } } printf ("\n"); /* Print number of function/jacobian evaluations */ printf ("benchmark_precision: number of function/jacobian evaluations with %s\n epsrel: ", probname[p]); for (i = 0; epsrel[i] != 0.0; i++) { printf ("%12.0e ", epsrel[i]); } printf ("\n"); for (i = 0; steppers[i] != 0; i++) { printf ("%8s nfe/nje: ", steppers[i]->name); for (j = 0; epsrel[j] != 0; j++) { printf ("%9d %9d | ", nnfe[j + i * MAXNT], nnje[j + i * MAXNT]); } printf ("\n"); } printf ("\n"); } } void test_evolve_temp (const gsl_odeiv2_step_type * T, double h, double err) { /* Temporary test */ double y[3]; double yfin[3]; y[0] = 1.0; y[1] = 0.0; y[2] = 0.0; yfin[0] = 0; yfin[1] = 0; yfin[2] = 0; test_evolve_system (T, &rhs_func_stiff, 0.0, 1.0, h, y, yfin, err, "temp"); } /**********************************************************/ /* Main function */ /**********************************************************/ int main (void) { /* Benchmark routine to compare stepper performance */ /* benchmark_precision(); return 0; */ /* Test single problem, for debugging purposes */ /* test_evolve_temp (gsl_odeiv2_step_msadams, 1e-3, 1e-8); return 0; */ int i; struct ptype { const gsl_odeiv2_step_type *type; double h; } p[MAXNS]; struct ptype explicit_stepper[MAXNS]; p[0].type = gsl_odeiv2_step_rk4; p[0].h = 1.0e-3; p[1].type = gsl_odeiv2_step_rk2; p[1].h = 1.0e-3; p[2].type = gsl_odeiv2_step_rkf45; p[2].h = 1.0e-3; p[3].type = gsl_odeiv2_step_rkck; p[3].h = 1.0e-3; p[4].type = gsl_odeiv2_step_rk8pd; p[4].h = 1.0e-3; p[5].type = gsl_odeiv2_step_rk1imp; p[5].h = 1.0e-3; p[6].type = gsl_odeiv2_step_rk2imp; p[6].h = 1.0e-3; p[7].type = gsl_odeiv2_step_rk4imp; p[7].h = 1.0e-3; p[8].type = gsl_odeiv2_step_bsimp; p[8].h = 1.0e-3; p[9].type = gsl_odeiv2_step_msadams; p[9].h = 1.0e-3; p[10].type = gsl_odeiv2_step_msbdf; p[10].h = 1.0e-3; p[11].type = 0; gsl_ieee_env_setup (); /* Basic tests for all steppers */ for (i = 0; p[i].type != 0; i++) { test_stepper (p[i].type); test_evolve_linear (p[i].type, p[i].h, 1e-10); test_evolve_exp (p[i].type, p[i].h, 1e-5); test_evolve_sin (p[i].type, p[i].h, 1e-8); test_evolve_xsin (p[i].type, p[i].h, 1e-8); test_evolve_xsin (p[i].type, 0.1, 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_evolve_negative_h (p[i].type, p[i].h, 1e-7); test_broken (p[i].type, p[i].h, 1e-8); test_stepsize_fail (p[i].type, p[i].h); test_user_break (p[i].type, p[i].h); test_driver (p[i].type); } /* Derivative test for explicit steppers */ explicit_stepper[0].type = gsl_odeiv2_step_rk4; explicit_stepper[0].h = 1.0e-3; explicit_stepper[1].type = gsl_odeiv2_step_rk2; explicit_stepper[1].h = 1.0e-3; explicit_stepper[2].type = gsl_odeiv2_step_rkf45; explicit_stepper[2].h = 1.0e-3; explicit_stepper[3].type = gsl_odeiv2_step_rkck; explicit_stepper[3].h = 1.0e-3; explicit_stepper[4].type = gsl_odeiv2_step_rk8pd; explicit_stepper[4].h = 1.0e-3; explicit_stepper[5].type = gsl_odeiv2_step_msadams; explicit_stepper[5].h = 1.0e-3; explicit_stepper[6].type = 0; for (i = 0; explicit_stepper[i].type != 0; i++) { test_stepfn (explicit_stepper[i].type); test_stepfn2 (explicit_stepper[i].type); } /* Special tests */ test_nonstiff_problems (); test_stiff_problems (); test_extreme_problems (); exit (gsl_test_summary ()); } gsl-doc-2.3/blas/0000755000175000017500000000000013022553153011700 5ustar eddeddgsl-doc-2.3/blas/gsl_blas_types.h0000664000175000017500000000305312616157443015100 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */ gsl-doc-2.3/blas/Makefile.am0000664000175000017500000000056212616157443013753 0ustar eddeddnoinst_LTLIBRARIES = libgslblas.la pkginclude_HEADERS = gsl_blas.h gsl_blas_types.h AM_CPPFLAGS = -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 gsl-doc-2.3/blas/TODO0000664000175000017500000000041612616157443012405 0ustar eddedd# -*- org -*- #+CATEGORY: blas * 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 gsl-doc-2.3/blas/blas.c0000664000175000017500000016000212620203147012764 0ustar eddedd/* blas/blas.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2009 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #include #include #include #include /* ======================================================================== * 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); } } gsl-doc-2.3/blas/Makefile.in0000644000175000017500000005117413022372404013753 0ustar eddedd# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) 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 = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslblas_la_LIBADD = am_libgslblas_la_OBJECTS = blas.lo libgslblas_la_OBJECTS = $(am_libgslblas_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslblas_la_SOURCES) DIST_SOURCES = $(libgslblas_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_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_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_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_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslblas.la pkginclude_HEADERS = gsl_blas.h gsl_blas_types.h AM_CPPFLAGS = -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 ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu blas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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 $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslblas.la: $(libgslblas_la_OBJECTS) $(libgslblas_la_DEPENDENCIES) $(EXTRA_libgslblas_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslblas_la_OBJECTS) $(libgslblas_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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-pkgincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ 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 tags-am uninstall uninstall-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: gsl-doc-2.3/blas/ChangeLog0000664000175000017500000000467412616157443013501 0ustar eddedd2009-04-30 Brian Gough * blas.c (gsl_blas_drotm): fix incorrect length check 2005-04-05 Brian Gough * blas.c (gsl_blas_ssyrk): test conformance against size correctly allowing for transpose 2004-12-21 Brian Gough * 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 * blas.c (gsl_blas_zgemv): added missing case of CblasConjTrans to zgemv and cgemv Mon Feb 18 20:01:49 2002 Brian Gough * gsl_blas_types.h: removed unneeded header files Sat Apr 28 15:25:16 2001 Brian Gough * blas.c: cast size_t to int for calls to CBLAS Mon Mar 19 17:04:47 2001 Brian Gough * 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 * test_blas_raw.c: added tests for dtbsv Sat Sep 16 20:27:18 2000 Brian Gough * blas.c: use GSL_ERROR macro to signal errors Fri Sep 15 20:04:28 2000 Brian Gough * 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 * 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 * 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 * 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 * blas.c: make use of "trailing dimension" in matrix struct to support LDA arguments for level 2 BLAS. gsl-doc-2.3/blas/gsl_blas.h0000664000175000017500000005265612616157443013671 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #include #include #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__ */ gsl-doc-2.3/gsl_inline.h0000664000175000017500000000463712616157443013301 0ustar eddedd/* gsl_inline.h * * Copyright (C) 2008, 2009 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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_INLINE_H__ #define __GSL_INLINE_H__ /* In recent versiions of GCC, the inline keyword has two different forms: GNU and C99. In GNU mode we can use 'extern inline' to make inline functions work like macros. The function is only inlined--it is never output as a definition in an object file. In the new C99 mode 'extern inline' has a different meaning--it causes the definition of the function to be output in each object file where it is used. This will result in multiple-definition errors on linking. The 'inline' keyword on its own (without extern) has the same behavior as the original GNU 'extern inline'. The C99 style is the default with -std=c99 in GCC 4.3. This header file allows either form of inline to be used by redefining the macros INLINE_DECL and INLINE_FUN. These are used in the public header files as INLINE_DECL double gsl_foo (double x); #ifdef HAVE_INLINE INLINE_FUN double gsl_foo (double x) { return x+1.0; } ; #endif */ #ifdef HAVE_INLINE # if defined(__GNUC_STDC_INLINE__) || defined(GSL_C99_INLINE) || defined(HAVE_C99_INLINE) # define INLINE_DECL inline /* use C99 inline */ # define INLINE_FUN inline # else # define INLINE_DECL /* use GNU extern inline */ # define INLINE_FUN extern inline # endif #else # define INLINE_DECL /* */ #endif /* Range checking conditions in headers do not require any run-time tests of the global variable gsl_check_range. They are enabled or disabled in user code at compile time with GSL_RANGE_CHECK macro. See also build.h. */ #define GSL_RANGE_COND(x) (x) #endif /* __GSL_INLINE_H__ */ gsl-doc-2.3/gsl_precision.h0000664000175000017500000000336412616157443014012 0ustar eddedd/* 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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 #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__ */